作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
伊凡Vasilev
验证专家 在工程

Ivan是一位热情的高级开发人员,具有创业精神. 他的主要研究方向是Java、JavaScript和机器学习.

以前在

ExB集团
分享

近年来,人工智能领域出现了复苏. 它已经传播到学术界以外的主要参与者,比如 谷歌微软,以及 脸谱网 建立了自己的研究团队,取得了一些令人印象深刻的成果 收购.

这可以部分归因于社交网络用户产生的大量原始数据, 其中很多都需要分析, 发达国家的崛起 数据科学解决方案,以及廉价的计算能力 gpgpu.

但在这些现象之外, 这种复苏在很大程度上是由人工智能的新趋势推动的, 特别是在 机器学习被称为“深度学习”. 在本教程中, 我将向你介绍深度学习背后的关键概念和算法, 从最简单的组成单元开始,构建Java中的机器学习概念.

(为了充分披露:我也是一个Java深度学习库的作者,可用 在这里,本文中的示例是使用上述库实现的. 如果你喜欢, 你可以在GitHub上给它打颗星来支持它,对此我很感激. 使用说明可在 主页.)

30秒机器学习教程

如果你不熟悉,看看这个 机器学习概论:

一般程序如下:

  1. 我们有一些算法给出了一些标记的例子, 比如10张标签为1(“狗”)的狗图片和10张标签为0(“不是狗”)的其他东西的图片——注意,我们主要坚持的是 监督, 二元分类 对于这篇文章.
  2. 该算法“学习”识别狗和狗的图像, 当输入一个新图像时, 希望产生正确的标签(1,如果它是一个狗的图像, 否则为0).

This setting is incredibly general: your data could be symptoms 和 your labels illnesses; or your data could be images of h和written characters 和 your labels the 实际 characters they represent.

感知器:早期深度学习算法

最早的监督训练算法之一是感知器算法, 一个基本的神经网络构建块.

假设我们有 n 平面上的点,标记为0和1. 给我们一个新的点,我们想要猜测它的标签(这类似于上面的“狗”和“不是狗”场景)。. 我们该怎么做呢?

一种方法可能是查看最近的邻居并返回该点的标签. 但一个稍微聪明一点的方法是选择一条线,最好地将标记数据分开,并将其用作分类器.

与线性分类器相关的输入数据描述是深度学习的基本方法.

在这种情况下,每个输入数据都将表示为一个向量 x = (x_1、x_2),我们的函数应该是这样的:“在线以下为' 0 ',在线以上为' 1 '”.

为了在数学上表示这一点,让我们的分隔符由权重向量定义 w 垂直偏移(或偏置) b. 然后,我们的函数将输入和权重与一个加权和传递函数结合起来:

加权和传递函数

这个传递函数的结果将被输入一个激活函数以产生一个标记. 在上面的例子中,我们的激活函数是一个阈值截止值(e).g.,如果大于某个值则为1):

这个传递函数的结果

训练感知器

感知器的训练包括输入多个训练样本并计算每个样本的输出. 每个样本后,权重 w 以这样的方式调整,以尽量减少 输出误差,定义为 想要的 (目标)和 实际 输出. 还有其他的误差函数,比如 均方误差,但训练的基本原则保持不变.

单个感知器的缺点

单感知器深度学习方法有一个主要缺点:它只能学习 线性可分函数. 这个缺点有多严重? 以XOR, 一个相对简单的函数, 注意它不能被线性分隔符分类(注意失败的尝试), 下图):

这种深度学习方法的缺点是一些函数不能通过线性分隔符进行分类.

为了解决这个问题, 我们需要使用多层感知器, 又称前馈神经网络:在效果上, 我们将把这些感知器组合在一起来创建一个更强大的学习机制.

深度学习的前馈神经网络

神经网络实际上就是感知器的组合, 以不同的方式连接,操作不同的激活功能.

前馈神经网络深度学习是一种比单个感知器更复杂的方法.

首先,我们来看看前馈神经网络,它有以下属性:

  • 输入、输出和一个或多个 隐藏的 层. 上图显示了一个具有3单元输入层的网络, 4个单位的隐藏层和2个单位的输出层(单位和神经元这两个术语是可以互换的).
  • 每个单元都是一个感知器,就像上面描述的那样.
  • 输入层的单元作为隐藏层的单元的输入, 而隐藏层单元是输出层的输入.
  • 两个神经元之间的每个连接都有一个权重 w (类似于感知机权重).
  • 层的每个单位 t 通常连接到 每一个 前一层的单位 t - 1 (尽管您可以通过将它们的权重设置为0来断开它们).
  • 处理输入数据, 将输入向量“箝位”到输入层, 将向量的值设置为每个输入单元的“输出”. 在这个特殊的案例中, 网络可以处理三维输入向量(因为有3个输入单元). 例如, 如果输入向量是[7, 1, 2], 然后将最上面的输入单元的输出设置为7, 中间的单位是1, 等等....... 然后使用每个隐藏单元的加权和传递函数将这些值前向传播到隐藏单元(因此称为前向传播)。, 然后计算它们的输出(激活函数).
  • 输出层以与隐藏层相同的方式计算输出. 输出层的结果就是网络的输出.

除了线性

如果我们的每个感知器只允许使用一个线性激活函数呢? 那么,我们网络的最终输出将 仍然 是输入的线性函数, 只是根据网络中收集的大量不同权重进行了调整. 换句话说,一堆线性函数的线性复合仍然是一个线性函数. 如果我们局限于线性激活函数, 那么前馈神经网络并不比感知器更强大, 不管它有多少层.

一堆线性函数的线性复合仍然是一个线性函数, 所以大多数神经网络使用非线性激活函数.

正因为如此,大多数神经网络使用非线性激活函数,比如 物流, 双曲正切, 二进制 or 整流器. 没有它们,网络只能学习 输入的线性组合.

训练感知器

最常见的用于多层感知器监督训练的深度学习算法被称为反向传播. 基本程序:

  1. 给出一个训练样本,并通过网络向前传播.
  2. 计算输出误差,通常为均方误差:

    均方误差

    在哪里 t 目标值是和吗 y 实际的网络输出是多少. 其他误差计算也是可以接受的,但是MSE是一个很好的选择.

  3. 使用一个方法来最小化网络错误 随机梯度下降.

    梯度下降法

    梯度下降是通用的, 但在神经网络的例子中, 这是训练误差作为输入参数函数的图. 每个权重的最优值是误差达到a时的值 全球最低. 在Training阶段, 权重以小步骤更新(在每个训练样本或几个样本的小批量之后),这样它们总是试图达到全局最小值,但这不是一件容易的事, 因为你经常会得到局部极小值, 就像右边的那个. 例如,如果权重值为0.6,它需要向0改变.4.

    该图表示最简单的情况,其中误差取决于单个参数. 但是,网络错误取决于 每一个 网络权值和误差函数要复杂得多.

    值得庆幸的是, 反向传播提供了一种更新两个神经元之间相对于输出误差的权重的方法. 的 推导 本身相当复杂,但给定节点的权重更新具有以下(简单)形式:

    示例的形式

    在哪里 E 输出错误,和 w_i 输入的权重是多少 i 到神经元.

    本质上,我们的目标是在相对于权重的梯度方向上移动 i. 关键词是, 当然, 误差的导数, 这并不总是容易计算的:你如何找到一个大型网络中随机隐藏节点的随机权重的导数?

    答案是:通过反向传播. 首先在输出单元中计算误差,其中公式非常简单(基于目标值和预测值之间的差异)。, 然后以一种巧妙的方式通过网络传播回来, 允许我们在训练中有效地更新我们的重量,并(希望)达到最小.

隐藏层

隐藏层是特别有趣的. 由 普遍近似定理, 一个具有有限数量神经元的单个隐藏层网络可以被训练成近似任意随机函数. 换句话说,一个隐藏层就足够强大到可以学习 任何 函数. 也就是说,我们通常在实践中使用多个隐藏层(例如.e.(更深的网).

隐藏层是网络存储训练数据的内部抽象表示的地方.

隐藏层是网络存储训练数据的内部抽象表示的地方, 类似于人类大脑(大大简化的类比)对现实世界的内部表征. 在本教程中,我们将介绍使用隐藏层的不同方法.

网络示例

你可以看到一个简单的(4-2-3层)前馈神经网络 虹膜 Java实现的数据集 在这里 通过 testMLPSigmoidBP 方法. 该数据集包含三种鸢尾花植物,具有萼片长度、花瓣长度等特征. 该网络每班提供50个样本. 这些特征被固定在输入单元上, 而每个输出单元对应于数据集的一个类:“1/0/0”表示该植物属于Setosa类, “0/1/0”表示Versicolour, “0/0/1”表示弗吉尼亚). 分类误差为2/150 (i.e.,它错误地分类了150个样本中的2个).

大型网络的问题

在这种情况下,神经网络可以有多个隐藏层, 更高的层在前一层的基础上“构建”新的抽象. 正如我们之前提到的,在实践中,你可以用更大的网络学得更好.

然而,增加隐藏层的数量会导致两个已知的问题:

  1. 消失的梯度:随着我们添加越来越多的隐藏层, 反向传播在向较低层传递信息时变得越来越不有用. 实际上, 当信息被传递回来时, 梯度开始消失,相对于网络的权重变得很小.
  2. 过度拟合:也许是机器学习的核心问题. 简而言之,过拟合描述了训练数据拟合的现象 很接近,也许是假设 复杂的. 在这种情况下, 你的学习器最终会很好地拟合训练数据, 但会发挥很大作用, 在实际例子中就差多了.

让我们看看一些深度学习算法来解决这些问题.

Autoencoders

大多数介绍性机器学习课程倾向于停止于前馈神经网络. 但可能的网络空间要丰富得多——所以让我们继续.

自编码器通常是一个前馈神经网络,其目的是 学习数据集的压缩、分布式表示(编码).

自动编码器是一种神经深度学习网络,旨在学习数据集的特定表示.

从概念上讲,神经网络被训练来“重建”输入,即i.e.,输入数据和目标数据是相同的. 换句话说:你试图输出与输入相同的东西,但以某种方式压缩. 这是一种令人困惑的方法,所以让我们看一个例子.

压缩输入:灰度图像

假设训练数据由28x28个灰度图像组成,每个像素的值被固定到一个输入层神经元(i.e.,输入层将有784个神经元). 然后, 输出层将具有与输入层相同数量的单元(784),并且每个输出单元的目标值将是图像的一个像素的灰度值.

这种架构背后的直觉是,网络不会学习训练数据与其标签之间的“映射”, 而是会学习 内部结构 以及数据本身的特征. (正因为如此,隐藏层也被称为 特征检测器.)通常, 隐藏单元的数量小于输入/输出层, 是什么迫使网络只学习最重要的特征并实现降维.

我们希望在中间有几个小节点,以便在概念层面上学习数据, 生成紧凑表示.

实际上, 我们希望中间的几个小节点能够在概念层面上真正了解数据, 生成一个紧凑的表示,以某种方式捕获我们输入的核心特征.

流感病

为了进一步演示自动编码器,让我们再看一个应用程序.

在这种情况下,我们将使用由流感症状组成的简单数据集(归功于此) 博客 为了这个想法). 如果您感兴趣,可以找到这个示例的代码 testAEBackpropagation 方法.

数据集是这样分解的:

  • 有六个二进制输入特征.
  • 前三个是这种疾病的症状. 例如, 1 0 0 0 0 0 说明这个病人有高烧,而 0 1 0 0 0 0 表明咳嗽, 1 1 0 0 0 0 表明咳嗽 高温等.
  • 的 final three features are “counter” symptoms; when a patient has one of these, 他或她生病的可能性更小. 例如, 0 0 0 1 0 0 说明这个病人打了流感疫苗. 这两组功能的组合是可能的: 0 1 0 1 0 0 表示接种疫苗的病人咳嗽,等等.

我们会认为病人生病,当他或她有 至少两个 如果他或她至少具有后三个特征中的两个,那么他或她是健康的(与有利于健康患者的关系打破)。, e.g.:

  • 111000, 101000, 110000, 011000, 011100 =生病
  • 000111, 001110, 000101, 000011, 000110 =健康

我们将训练一个有六个输入和六个输出单元的自编码器(使用反向传播),但是 只有两个隐藏单位.

经过几百次迭代, 我们观察到,当每个“病态”样本被呈现给机器学习网络时, 两个隐藏单元中的一个(每个“病态”样本的相同单元)总是表现出比另一个更高的激活值. 相反,当呈现“健康”样本时,另一个隐藏单元具有更高的激活.

回到机器学习

实际上,我们的两个隐藏单元 学会了 流感症状数据集的紧凑表示. 为了了解这与学习的关系,我们回到过拟合的问题. 通过训练我们的网络来学习数据的紧凑表示, 我们倾向于更简单的表示,而不是过度拟合训练数据的高度复杂的假设.

在某种程度上, 通过支持这些更简单的表示, 我们试图以更真实的方式了解数据.

受限玻尔兹曼机

下一个合乎逻辑的步骤是看一个 受限玻尔兹曼机 (元) 生成式随机神经网络,可以学习其输入集的概率分布.

在机器学习中,受限波兹曼机器由可见单元和隐藏单元组成.

rbm由隐藏层、可见层和偏置层组成. 不像前馈网络, 可见层和隐藏层之间的连接是无向的(值可以在可见到隐藏和隐藏到可见的方向上传播)和完全连接的(给定层的每个单元连接到下一层的每个单元-如果我们允许任何层中的任何单元连接到任何其他层, 那么我们就有了玻尔兹曼(而不是 限制了玻耳兹曼机).

标准RBM具有二进制隐藏和可见单位:即在a下,单位激活为0或1 伯努利分布,但也有其他的变种 非线性.

虽然研究人员已经知道rbm有一段时间了, 最近引入的对比散度无监督训练算法重新引起了人们的兴趣.

对比差异

单步对比散度算法(CD-1)的工作原理如下:

  1. 正相:
    • 输入样本 v 被夹在输入层上.
    • v 是否以与前馈网络类似的方式传播到隐藏层. 隐藏层激活的结果为 h.
  2. 负相:
    • 传播 h 带着结果回到可见层 v’ (可见层和隐藏层之间的连接是无方向的,因此可以在两个方向上移动).
    • 传播新 v’ 带着激活结果回到隐藏层 h’.
  3. 重量更新:

    重量更新

    在哪里 a 学习率是和吗 v, v’, h, h’, w 是向量.

该算法背后的直觉是,正相位(h 鉴于 v)反映了网络的内部表征 现实世界中 data. 与此同时, 否定阶段表示尝试基于此内部表示重新创建数据(v’ 鉴于 h). 主要目标是 生成的数据 尽可能靠近 现实世界中 这反映在权重更新公式中.

换句话说, 网络对如何表示输入数据有一些感知, 因此,它试图根据这种感知再现数据. 如果它的复制不够接近现实,它会做出调整并再次尝试.

回到流感

为了演示对比差异,我们将使用与前面相同的症状数据集. 测试网络是一个包含6个可见单元和2个隐藏单元的RBM. 我们将使用对比发散和症状来训练网络 v 夹紧到可见层. 在测试过程中, the symptoms are again presented to the visible layer; 然后, 数据被传播到隐藏层. 隐藏的单位代表生病/健康状态, 与自动编码器非常相似的架构(将数据从可见层传播到隐藏层).

经过几百次迭代, 我们可以观察到与自动编码器相同的结果:当出现任何“病态”样本时,其中一个隐藏单元具有更高的激活值, 而另一个则总是对“健康”样本更活跃.

您可以看到实际的示例 testContrastiveDivergence 方法.

深层网络

We’ve now demonstrated that the 隐藏的 层 of autoencoders 和 遏制 act as effective 特征检测器s; but it’s rare that we can use these features directly. 事实上,上面的数据集是一个例外而不是规则. 相反,我们需要找到一些方法来间接地使用这些检测到的特征.

幸运的是, 它被发现了 这些结构可以 堆放 形成 深的 网络. 这些网络可以被贪婪地训练,一次一层,以帮助克服 消失的梯度过度拟合 与经典反向传播相关的问题.

由此产生的结构通常非常强大,产生令人印象深刻的结果. 举个例子,谷歌著名的 “猫”论文 其中他们使用一种特殊的深度自动编码器来“学习”人类和猫的面部检测 无标号 data.

让我们仔细看看.

堆叠Autoencoders

顾名思义,这个网络由多个堆叠的自编码器组成.

堆叠式自编码器有一系列输入, 输出, 以及有助于机器学习成果的隐藏层.

自动编码器的隐藏层 t 作为自动编码器的输入层 t + 1. 第一个自编码器的输入层是整个网络的输入层. 贪婪的分层训练过程是这样的:

  1. 训练第一个自动编码器(t=1, 或者上图中的红色连接, 但是有一个额外的输出层)单独使用反向传播方法与所有可用的训练数据.
  2. 训练第二个自动编码器 t=2 (绿色连接). 由于输入层为 t=2 隐藏层是什么 t=1 我们不再对的输出层感兴趣 t=1 然后把它从网络中移除. 的输入层夹持一个输入样本开始训练 t=1的输出层 t=2. 的权重(输入-隐藏和隐藏-输出) t=2 是否使用反向传播进行更新. t=2 使用所有的训练样本,类似于 t=1.
  3. 对所有图层重复上述步骤.e., 移除先前自动编码器的输出层, 用另一个自动编码器替换它, 用反向传播进行训练).
  4. 步骤1-3称为 训练的 让权重适当初始化. 但是,输入数据和输出标签之间没有映射. 例如, 如果网络被训练来识别手写数字的图像,它仍然不可能从最后一个特征检测器(i.e.(最后一个自动编码器的隐藏层)转换为图像的数字类型. 在这种情况下, 最常见的解决方案是在最后一层(蓝色连接)上添加一个或多个完全连接的层。. 整个网络现在可以看作是一个多层感知器,并使用反向传播(这一步也称为反向传播)进行训练 微调).

堆叠式自动编码器, 然后, 是否都是为了提供一种有效的预训练方法来初始化网络的权重, 留给你一个情结, 多层感知器准备训练(或 调整).

深度置信网络

与自动编码器一样,我们也可以堆叠玻尔兹曼机来创建一个称为 深度信念网络(dbn).

深度信念网络由一堆玻尔兹曼机组成.

在本例中,是RBM的隐藏层 t 作为RBM的可见层 t+1. 第一个RBM的输入层是整个网络的输入层, 贪婪的分层预训练是这样的:

  1. Training第一个RBM t=1 使用与所有训练样本的对比散度.
  2. 训练第二个RBM t=2. 自可见层为 t=2 隐藏层是什么 t=1,训练开始于将输入样本箝位到的可见层 t=1的隐藏层向前传播 t=1. 这些数据然后用于启动对比发散训练 t=2.
  3. 对所有图层重复上述步骤.
  4. 类似于堆叠式自动编码器, 预训练后,可以通过将一个或多个全连接层连接到最终的RBM隐藏层来扩展网络. 这就形成了一个多层感知器 协调好了 使用反向传播.

这个过程类似于堆叠式自动编码器, 而是将自编码器替换为rbm,反向传播替换为对比发散算法.

(注:有关构建和训练堆叠自编码器或深度信念网络的更多信息, 请查看示例代码 在这里.)

卷积网络

作为最终的深度学习架构, 让我们来看看卷积网络, 一种特别有趣和特殊的前馈网络,非常适合于图像识别.

卷积网络是一类特殊的深度学习前馈网络.
图像通过 DeepLearning.网

在我们看卷积网络的实际结构之前,我们首先定义一个图像 过滤器,或具有相关权重的方形区域. 过滤器应用于整个输入图像,您通常会应用多个过滤器. 例如,您可以对给定的输入图像应用四个6x6过滤器. 然后, 坐标为1的输出像素,1是左上角为1的6x6正方形输入像素的加权和,1和过滤器的权重(也是6x6的正方形). 输出像素2,1是输入左上角为2,1的正方形的结果,以此类推.

在此基础上,这些网络由以下属性定义:

  • 卷积的层 应用若干 过滤器 输入. 例如,图像的第一个卷积层可以有四个6x6滤波器. 在图像上应用一个过滤器的结果被调用 特征映射 (FM),特征映射的数量等于滤波器的数量. 如果前一层也是卷积的, 过滤器应用于它的所有fm具有不同的权重, 所以每个输入调频连接到每个输出调频. 整个图像共享权重背后的直觉是,无论其位置如何,特征都将被检测到, 而过滤器的多样性允许每个过滤器检测不同的特征集.
  • 二次抽样层 减少输入的大小. 例如, 如果输入由一个32x32的图像组成,并且层的子采样区域为2x2, 输出值将是一个16x16的图像, 这意味着输入图像的4个像素(每个2x2正方形)被组合成一个输出像素. 子样本的方法有很多种,但最常用的是最大池化, 平均分担, 随机池.
  • 最后一个子采样(或卷积)层通常连接到一个或多个全连接层, 最后一个表示目标数据.
  • 训练使用修改后的反向传播执行,该反向传播考虑了子采样层,并基于该滤波器应用的所有值更新卷积滤波器权重.

你可以看到几个卷积网络训练的例子(反向传播) MNIST 数据集(手写字母灰度图像) 在这里,特别是在 testLeNet * 我推荐的方法 testLeNetTiny2 因为它在相对较短的时间内达到了2%左右的低错误率。. 还有一个很好的类似网络的JavaScript可视化 在这里.

实现

现在我们已经介绍了最常见的神经网络变体, 我想我应该写一些关于在实现这些深度学习结构过程中所面临的挑战.

一般来说,我的目标是创造一个 深度学习库 过去是(现在仍然是)建立一个基于神经网络的框架,满足以下标准:

  • 能够表示各种模型(我们上面看到的神经网络的所有变体)的通用架构, 例如).
  • 能够使用不同的训练算法(反向传播,对比发散等).).
  • 不错的表现.

为了满足这些需求,我采用了分层(或模块化)的方法来设计软件.

结构

让我们从基础开始:

  • NeuralNetworkImpl 是所有神经网络模型的基类吗.
  • 每个网络包含一组 .
  • 每一层都有一个列表 连接,其中连接是两层之间的链接,使得网络是一个有向无环图.

这种结构足够灵活,可以用于经典的前馈网络,也可以用于 遏制 更复杂的架构,比如 ImageNet.

它还允许一个层成为多个网络的一部分. 例如,a中的层 深度信念网络 在相应的rbm中也有层吗.

除了, 这种体系结构允许在预训练阶段将DBN视为堆叠的rbm列表,在微调阶段将DBN视为前馈网络, 哪一种既直观又编程方便.

数据传播

下一个模块负责通过网络传播数据,这个过程分为两步:

  1. 确定层的顺序. 例如, 得到多层感知器的结果, 数据被“固定”到输入层(因此, 这是要计算的第一层),并一直传播到输出层. 为了在反向传播过程中更新权值, 输出误差必须以宽度优先的顺序传播到每一层, 从输出层开始. 的各种实现实现了这一点 LayerOrderStrategy, 哪一个利用了网络的图结构, 采用不同的图遍历方法. 一些例子包括 广度优先策略针对一个特定的层. 顺序实际上是由层之间的连接决定的, 所以这些策略返回一个有序的连接列表.
  2. 计算激活值. 每一层都有一个关联的 ConnectionCalculator 它接受连接列表(来自前一步)和输入值(来自其他层)并计算结果激活. 例如,在一个简单的s型前馈网络中,隐藏层 ConnectionCalculator 获取输入层和偏置层的值(它们是, 分别, 的输入数据和数组 1s)和单元之间的权重(在完全连接层的情况下), 权值实际上存储在a中 FullyConnected 连接作为 矩阵),计算加权和,并将结果提供给sigmoid函数. 连接计算器实现了各种传输(e).g.,加权和,卷积)和激活(e.g.逻辑逻辑和双曲正切用于多层感知器,二进制用于RBM)函数. 它们中的大多数都可以在GPU上执行 Aparapi 并可用于小批量Training.

GPU计算与Aparapi

正如我之前提到的, 神经网络近年来重新兴起的原因之一是它们的训练方法非常有利于并行性, 允许您使用GPGPU显着加快训练速度. 在本例中,我选择使用 Aparapi 库添加GPU支持.

Aparapi对连接计算器施加了一些重要的限制:

  • 只允许基本数据类型的一维数组(和变量).
  • 只有Aparapi的成员方法 内核 类本身都允许从GPU可执行代码中调用.

因此,大多数数据(权重、输入和输出数组)都存储在 矩阵 实例,它在内部使用一维浮点数组. 所有Aparapi连接计算器都使用其中一种 AparapiWeightedSum (对于完全连接层和加权和输入函数), AparapiSubsampling2D (用于子采样层),或 AparapiConv2D (对于卷积层). 其中一些限制可以通过引入 异构系统架构. Aparapi还允许在CPU和GPU上运行相同的代码.

Training

Training 模块实现了各种训练算法. 它依赖于前两个模块. 例如, BackPropagation教练 (所有的教练都在使用 教练 基类)在前馈阶段使用前馈层计算器,并使用一个特殊的宽度优先层计算器来传播误差和更新权重.

我最近的工作是关于Java 8的支持和其他一些改进,将很快合并到 .

结论

本Java深度学习教程的目的是向您简要介绍深度学习算法领域, 从最基本的组成单元(感知器)开始,并通过各种有效和流行的架构进行进展, 就像受限玻尔兹曼机一样.

的 ideas behind neural 网络 have been around for a long time; but today, 如果你没有听说过深度网络或其他关于深度学习的说法,你就不可能踏入机器学习社区. 炒作不应被误认为是正当理由, 但随着GPGPU计算的进步,以及杰弗里·辛顿等研究人员取得的令人印象深刻的进展, Yoshua Bengio, Yann LeCun和Andrew Ng, 这一领域无疑显示出很大的前景. 没有比现在更好的时间来熟悉和参与.

附录:参考资料

如果你有兴趣了解更多,我发现以下资源在我的工作中非常有用:

聘请Toptal这方面的专家.
现在雇佣
伊凡Vasilev

伊凡Vasilev

验证专家 在工程

保加利亚索非亚

2012年11月15日成为会员

作者简介

Ivan是一位热情的高级开发人员,具有创业精神. 他的主要研究方向是Java、JavaScript和机器学习.

作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

以前在

ExB集团

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

Toptal开发者

加入总冠军® 社区.