使用Python和PyTorch的生成式AI——深度神经网络的构建块

92 阅读53分钟

本书中我们将实现的各种生成性AI模型,都是建立在过去15年深度学习和神经网络领域的进展基础上的。虽然在实践中,我们可以在不参考历史发展情况的前提下实现这些项目,但回溯其基本组件能帮助你更深入理解这些模型为何能够奏效。在本章中,我们将深入探讨这一背景,向你展示生成性AI模型如何从零开始构建,如何将较小的单元组合成复杂的架构,这些模型中的损失函数是如何优化的,以及当前一些理论解释这些模型为何如此有效。掌握了这些背景知识后,你将能够更深入地理解本书第11章《使用VAE绘制神经网络图像》中涉及的更高级模型和话题背后的逻辑。一般来说,我们可以将神经网络模型的架构、变换和优化方法分为多个选择,涉及如何构建和训练模型,以下是本章将要涵盖的内容。

选择使用哪种神经网络架构:

  • 感知机(Perceptron)
  • 多层感知机(MLP)/前馈神经网络
  • 卷积神经网络(CNNs)
  • 循环神经网络(RNNs)
  • 长短期记忆网络(LSTMs)
  • 门控循环单元(GRUs)
  • 变换器(Transformers)

选择在网络中使用哪些激活函数:

  • 线性函数
  • Sigmoid
  • Tanh
  • 修正线性单元(ReLU)
  • 参数化修正线性单元(PReLU)
  • 指数线性单元(ELU)
  • 高斯误差线性单元(GELU)
  • Sigmoid线性单元(SiLU)
  • Swish和高斯误差线性单元(SwiGLU)
  • 位置信息编码

选择使用哪种优化算法来调整网络的参数:

  • 随机梯度下降(SGD)
  • 均方根传播(RMSProp)
  • 自适应梯度(AdaGrad)
  • 自适应矩估计(ADAM)
  • 加权ADAM(ADAMW)
  • 自适应Delta(AdaDelta)
  • 无赫西恩优化

如何初始化网络的参数:

  • 随机初始化
  • Xavier初始化
  • He初始化

正如你所理解的,这些决策的组合可能导致大量的神经网络变体,而开发这些模型的一个挑战就是确定在这些选择中的正确搜索空间。在描述神经网络历史的过程中,我们将更详细地讨论每个模型参数的影响。我们对这一领域的概述从学科的起源开始:朴素的感知机模型。

感知机:一个函数中的大脑

最简单的神经网络架构——感知机——是受到生物学研究的启发,旨在理解心理处理的基础,试图通过数学公式表示大脑的功能。在本节中,我们将讨论一些早期的研究,以及这些研究如何启发了如今的深度学习和生成性AI领域。

从组织到TLUs

AI算法的近期流行可能会给人一种误解,即这一领域是新的。许多近期的模型基于几十年前的发现,这些发现通过云计算中可用的庞大计算资源以及用于并行矩阵计算的定制硬件(如图形处理单元GPU、张量处理单元TPU和现场可编程门阵列FPGA)得到了复兴。如果我们将神经网络的研究视为包括它们的生物学启发以及计算理论,那么这个领域已有超过一百年的历史。事实上,第一个描述的神经网络出现在19世纪科学家圣地亚哥·拉蒙·卡哈尔的详细解剖图中,他根据对相互连接的神经元细胞层的实验观察,绘制了这些插图,启发了神经元学说——即大脑由单独的、物理上不同且专门化的细胞组成,而不是一个连续的网络。卡哈尔观察到的视网膜的不同层次也启发了特定的神经网络架构,例如我们将在本章后面讨论的卷积神经网络(CNN)。

image.png

对这些简单的神经元细胞在大网络中相互连接的观察,促使计算机研究人员假设,心理活动可能通过简单的逻辑运算来表示,这些运算结合在一起会产生复杂的心理现象。最初的“自动机理论”通常可以追溯到麻省理工学院(MIT)的沃伦·麦卡洛克(Warren McCulloch)和沃尔特·皮茨(Walter Pitts)于1943年发表的文章。他们描述了一个简单的模型,称为阈值逻辑单元(TLU),在该模型中,二进制输入根据阈值被转换为二进制输出:

image.png

在这里,I是输入值(通常是0到1范围内的二进制值),W是权重,范围为(0,1)或(-1,1),而 f是一个阈值函数,根据输入是否超过阈值 T来将其转换为二进制输出:

image.png

在视觉和概念上,麦卡洛克和皮茨的模型与启发它的生物神经元之间有一定的相似性(图2.2)。他们的模型将输入整合成输出信号,就像自然神经元的树突(神经元的短小“输入臂”,接收来自其他细胞的信号)通过轴突(细胞的长“尾巴”,将从树突接收到的信号传递给其他神经元)将输入合成成一个输出一样。我们可以想象,就像神经元细胞被组合成网络以产生复杂的生物电路一样,这些简单的单元可能通过连接来模拟复杂的决策过程。

image.png

有趣的是,这些模型的数学形式和生物形式之间的相似性已经通过实验进行了测试,实验中将孤立的神经元培养在培养皿中,并通过多电极阵列与模拟环境(如游戏)连接,证明当神经元被提供这样的模拟环境时,它们展现出基本的学习行为。事实上,通过使用这个简单的模型,我们已经可以开始表示几个逻辑运算。如果我们考虑一个简单的只有一个输入的神经元,我们可以看到,感知机(TLU)可以解决恒等或否定函数(见表2.1和表2.2)。

对于一个简单的恒等操作,它仅将输入作为输出,权重矩阵的对角线上将是1(或者对于单一数值输入,简单地使用标量1,如表2.1所示):

恒等操作

输入输出
11
00

表2.1:恒等操作的TLU逻辑

类似地,对于一个否定操作,权重矩阵可以是负的恒等矩阵,阈值设为0,输出的符号将与输入相反:

否定操作

输入输出
10
01

表2.2:否定操作的TLU逻辑

给定两个输入,感知机也可以表示诸如“与”(AND)和“或”(OR)之类的操作。这里,可以设置一个阈值,使得输入值的组合必须超过或等于2(以获得输出1)来执行与(AND)操作(表2.3),或等于1(如果两个输入中的任意一个为1,则输出1)来执行或(OR)操作(表2.4):

与操作(AND)

输入1输入2输出
000
100
010
111

表2.3:与操作的TLU逻辑

或操作(OR)

输入1输入2输出
000
101
011
111

表2.4:或操作的TLU逻辑

然而,感知机无法捕捉像异或(XOR)这样的模式,当且仅当其中一个位为真而不是两个都为真时,它输出1(见表2.5)。

异或操作(XOR)

输入1输入2输出
000
101
011
110

表2.5:异或操作的TLU逻辑

为了理解为什么会这样,考虑一个有两个输入的感知机,且每个单元的权重为1。如果阈值 TTT 设为1,那么输入(0, 0)、(1, 0)和(0, 1)将得到正确的输出。那么(1, 1)会发生什么呢?由于阈值函数对所有输入之和大于1的情况返回1,因此它无法表示异或(见表2.5),因为异或需要一个第二个阈值,一旦超过某个更高的值,便计算出不同的输出。将一个或两个权重设置为负值也无济于事;问题在于,决策阈值只在一个方向上操作,无法针对较大的输入进行反向操作。

类似地,感知机也无法表示异或非(XNOR)的否定(见表2.6):

异或非操作(XNOR)

输入1输入2输出
001
100
010
111

表2.6:异或非操作的TLU逻辑

就像异或操作(表2.5)一样,感知机无法表示异或非(XNOR)操作(表2.6)。我们可以通过考虑一个权重矩阵,其中有两个1来说明这一点;对于两个输入(1, 0)或(0, 1),如果我们设置阈值为2来输出1,则可以得到正确的值。与异或操作一样,当输入为(0, 0)时,我们遇到问题,因为我们不能设置第二个阈值,在和为0时输出1。

从TLUs到调整感知机

除了表示XOR和XNOR操作的局限性外,TLU模型还存在一些其他简化,限制了其表达能力;例如,权重是固定的,并且输出只能是二进制(0或1)。显然,对于像神经元这样的系统,要“学习”它必须响应环境,并根据来自先前经验的反馈来确定不同输入的相关性。这个思想在1949年加拿大心理学家唐纳德·赫布(Donald Hebb)的著作《行为的组织》中得到了体现,他提出,邻近的神经元细胞的活动会随着时间的推移趋向同步,这一观点有时被概括为赫布定律:一同激活的神经元会共同连接。基于赫布提出的权重随时间变化的理论,康奈尔航空实验室的研究员弗兰克·罗森布拉特(Frank Rosenblatt)在1950年代提出了感知机模型。他将TLU模型中的固定权重替换为自适应权重,并添加了一个偏置项,从而得出了一个新的函数:

image.png

我们注意到,输入 III 被标记为强调它们可以是任何值,而不仅仅是二进制的0或1。将赫布的观察与TLU模型结合,感知机的权重将根据一个简单的学习规则进行更新:

  1. 从一组样本 x(1),…,x(j)x^{(1)}, \dots, x^{(j)}x(1),…,x(j) 开始。这些样本都有一个标签 yyy,其值为0或1,构成标记数据 (y,x)(1),…,(y,x)(j)(y, x)^{(1)}, \dots, (y, x)^{(j)}(y,x)(1),…,(y,x)(j)。这些样本可以是单一值,感知机具有一个输入,或者是具有长度和索引的向量,用于多值输入。

  2. 将所有权重初始化为一个小的随机值或0。

  3. 使用感知机函数计算所有示例 xxx 的估计值 y^\hat{y}y^​。

  4. 使用学习率 η\etaη 更新权重,以便在每次训练步骤中更接近输入与目标输出的匹配:

    wi←wi+η(y−y^)xiw_i \leftarrow w_i + \eta (y - \hat{y}) x_iwi​←wi​+η(y−y^​)xi​

    对于所有 JJJ 样本和 iii 特征。概念上,如果 y^=0\hat{y} = 0y^​=0 且目标是1,我们希望通过某个增量 rrr 来增加权重的值;同样,如果目标是0且估计值是1,我们希望减少权重值,以避免输入超过阈值。

  5. 重复步骤3–4,直到预测输出与实际输出之间的差异 ∣y−y^∣|y - \hat{y}|∣y−y^​∣ 低于某个期望的阈值。如果存在非零的偏置项 bbb,也可以使用类似的公式进行更新。

虽然这个算法很简单,但你可以理解,从这样的分类器中可以学习到许多模式,尽管仍然不能学习到异或(XOR)函数。然而,通过将多个感知机组合成多层,这些单元可以表示任何简单的布尔函数。事实上,麦卡洛克和皮茨早期曾推测,结合这些简单单元可以形成一个通用计算引擎,或者图灵机,能够表示标准编程语言中的任何操作。然而,之前的学习算法是独立地对每个单元进行操作的,这意味着它可以扩展到由多个感知机层组成的网络(图2.3)。

image.png

然而,麻省理工学院的计算机科学家马文·明斯基(Marvin Minsky)和西摩·帕皮特(Seymour Papert)在1969年出版的《感知机》一书中展示了,三层前馈网络需要至少在第一层的一个单元与所有输入之间建立完全(非零权重)连接,才能计算出所有可能的逻辑输出。这意味着,与生物神经元有很少的邻居连接的稀疏结构不同,这些计算模型需要非常密集的连接。

虽然神经元之间的稀疏连接——换句话说,并非每个神经元都与层之间的其他神经元连接——已经被纳入后来的架构,如卷积神经网络(CNNs),但这种密集连接仍然是许多现代模型的一个特点,特别是在完全连接层中,这些层通常构成模型中倒数第二层的隐藏层。具有大量神经元的完全连接层,能够以牺牲大量计算资源为代价,分类复杂的输入模式。除了这些模型在当时硬件上的计算效率低下外,稀疏模型无法计算所有逻辑操作的观察,被研究界更广泛地解释为感知机无法计算XOR。尽管这一观点是错误的,这一信息导致了随后的AI资金短缺,这一时期有时被称为AI寒冬。

神经网络研究的下一次革命将需要一种更有效的计算方法来更新复杂模型中所需的参数,这一技术后来被称为反向传播(Backpropagation)。

多层感知机和反向传播

尽管在《感知机》出版后,神经网络的研究资金直到1980年代才恢复,研究人员仍然认识到这些模型的价值,尤其是当它们被组合成多层网络时,每个网络由多个感知机单元组成。事实上,当输出函数的数学形式(即模型的输出)被放宽到可以采用多种形式(例如线性函数或Sigmoid函数)时,这些网络可以解决回归和分类问题,理论结果表明,三层网络可以有效地近似任何输出。然而,这些工作并没有解决计算这些模型解的实际局限性,如前面描述的感知机学习算法就是它们在应用中的一个巨大限制。一个核心问题是如何适当地估计网络中隐藏层的权重,隐藏层形成了模型内部的数据“表示”。

神经网络的重新关注是通过反向传播算法来计算这些隐藏权重的实际解决方案实现的。虽然反向传播技术在1960年代就已被发现,但直到1980年代,在几项研究强调其在学习这些模型中的权重时,它才被广泛应用于神经网络中。如你在感知机模型中所见,更新权重的学习规则是相对容易推导的,只要没有“隐藏”层。输入通过感知机转换一次以计算输出值,这意味着权重可以直接调整以得到期望的输出。

当输入和输出之间存在隐藏层时,问题变得更加复杂:我们什么时候改变内部权重以计算喂入最终输出的激活值?我们如何根据输入权重修改它们?

反向传播技术的洞察是,我们可以使用微积分中的链式法则,高效地计算网络中每个参数相对于损失函数的导数,并结合学习规则,这提供了一种可扩展的方法来训练多层网络。

让我们通过一个例子来说明反向传播:考虑一个如图2.3所示的网络。假设最终层的输出是使用Sigmoid函数计算的,该函数产生一个介于0和1之间的值:

image.png

此外,值 z,即最终神经元的输入总和,是隐藏单元的Sigmoid输入的加权总和:

image.png

我们还需要一个衡量网络在任务中表现好坏的概念。一个直接的误差函数是平方损失:

image.png

这里,y^\hat{y}y^​ 是估计值(来自模型的输出),而 yyy 是真实值,所有输入示例 JJJ 和网络输出 KKK 的和(其中 K=1K = 1K=1,因为只有一个输出值)。反向传播从“前向传播”开始,在前向传播中,我们计算所有内层和外层输出的值,以获得 y^\hat{y}y^​ 的估计值。然后,我们进行反向步骤,计算梯度以更新权重。

我们的总体目标是计算每个神经元的权重 www 和偏置项 bbb 的偏导数,进而计算更新 www 和 bbb。为了实现这个目标,我们从计算最终神经元输入的更新规则开始;我们希望计算误差 EEE 相对于每个输入的偏导数(在这个例子中,有五个输入,对应于五个隐藏层神经元),使用链式法则:

image.png

我们可以通过对损失函数进行微分来得到值 ∂E∂x\frac{\partial E}{\partial x}∂x∂E​:

image.png

对于单个示例,这只是输入值和输出值之间的差异。对于 y^\hat{y}y^​,我们需要对Sigmoid函数求偏导数:

image.png

将所有内容结合起来,我们得到:

image.png

如果我们想计算 x 的某个特定参数的梯度,例如权重 w 或偏置项 b,我们还需要一步:

image.png

我们已经知道第一项,并且 x 只通过来自下层的输入 y 依赖于 w,因为它是一个线性函数(即,yyy 是前一层神经元的输出),因此我们得到:

image.png

image.png

如果我们想计算隐藏层中某个神经元的这个导数,我们同样对该输入 yiy_iyi​ 求偏导数,结果就是:

image.png

因此,总的来说,我们可以对所有输入到这个隐藏层的单元求和:

image.png

我们可以递归地重复这个过程,对于更深层的任何单元,计算所需的更新规则,因为现在我们知道如何计算每一层中 yyy 或 www 的梯度。这使得更新权重的过程更加高效,因为一旦我们通过反向传播计算了梯度,就可以通过层间的连续梯度组合来得到网络任何深度所需的梯度。

现在我们已经得到了每个 yyy(或其他我们想计算的神经元参数)的梯度,我们如何制定一个“学习规则”来更新权重呢?在他们的论文中,Hinton 等人指出,我们可以在每个样本批次计算梯度后应用一次更新,但他们建议改为在对所有样本取平均后应用更新。梯度表示的是误差函数相对于参数变化的最大方向;因此,为了更新,我们希望将权重推向相反的方向,其中 Δw\Delta wΔw 是更新值,ϵ\epsilonϵ 是一个小的步长值(学习率):

image.png

然后,在训练的每个时刻 t,我们使用计算得到的梯度来更新权重:

image.png

扩展这种方法,Hinton 等人提出了当前梯度与先前更新的指数加权更新:

image.png

在这里,α\alphaα 是一个衰减参数,用于权衡先前更新的贡献,范围从0到1。按照这个过程,我们会用一些小的随机值初始化网络中的权重,选择一个步长 ϵ\epsilonϵ,然后通过前向和后向传播以及参数更新进行迭代,直到损失函数达到某个期望值。

现在我们已经描述了反向传播背后的正式数学推导,让我们看看它在像PyTorch这样的软件包中是如何实现的。

反向传播的实际应用

虽然通过这个推导来理解深度神经网络的更新规则的来源是有用的,但对于大型网络和复杂架构来说,这种方法很快就会变得不切实际。因此,幸运的是,PyTorch会自动处理这些梯度的计算。在模型初始化期间,每个梯度被计算为张量和图中操作之间的中间节点;例如,参见图2.4:

image.png

前面图的顶部显示了一个函数 www,它是从一个Sigmoid函数的输出计算得出的——这是我们将在本章稍后讨论的一种神经元函数——而这个输出又是通过将权重向量与输入 xxx 相乘得到的。在图的底部,你可以看到PyTorch已经扩展了这个图,以计算所有反向传播所需的中间梯度,作为整体控制流程的一部分。

在存储这些中间值后,图中所示的将它们结合成完整梯度的任务(通过递归操作)交给了Autograd包来完成。在后台,PyTorch使用一种叫做反向模式自动微分(reverse-mode automatic differentiation)的方法来计算梯度;它固定依赖变量(输出 yyy),并递归地计算所需的梯度,直到网络的起始位置。

例如,让我们考虑一个如下形式的神经网络:

image.png

如果我们想计算输出 yyy 相对于输入 xxx 的导数,我们需要反复替换最外层的表达式。这个替换利用了微积分中的“链式法则”,该法则描述了如何通过内外函数的导数乘积来计算嵌套函数的导数:

image.png

因此,为了计算所需的梯度,我们只需要从上到下遍历图,在计算每个中间梯度时将其存储。这些值会被存储在一个记录中,称为“磁带”,这个名字来源于早期计算机中信息存储在磁带上的做法,然后这些值被用于重新播放以进行计算。另一种方法是使用前向模式自动微分,从下到上计算。这需要两个遍历而不是一个(对于每个分支输入最终值),但概念上更简单,且不需要反向模式的存储内存。然而,更重要的是,反向模式模仿了我之前描述的反向传播的推导过程。

“磁带”(也称为Wengert磁带,得名于其开发者之一)实际上是一个数据结构,你可以在PyTorch核心API中访问它。作为一个例子,可以导入核心库:

import torch

然后,可以使用 grad() 方法访问磁带,通过该方法你可以计算图中间值的梯度:

python
复制
# 启用张量 'x' 的梯度追踪
x = torch.ones(2, 2, requires_grad=True)
# 定义 y 和 z
y = x + 2
z = 3 * y**2
# 计算 z 的均值
out = z.mean()
# 保留中间变量 'y' 的梯度
y.retain_grad()
# 反向传播计算梯度,保留图
out.backward(retain_graph=True)
# 打印 z 相对于 y 的梯度
print("Gradient dz/dy:")
print(y.grad)

默认情况下,一旦调用 backward(),使用的内存资源会被释放;然而,你也可以使用 retain_graph=True 参数来存储这些结果:

import torch
# 初始化 x 并启用梯度追踪
x = torch.tensor(3.0, requires_grad=True)
# 执行操作
y = x * x  # y = x^2
z = y * y  # z = y^2 = (x^2)^2
# 计算梯度
z.backward(retain_graph=True)  # 计算 z 相对于 x 的梯度
# 访问 dz/dx
dz_dx = x.grad.item()  # z 相对于 x 的梯度
# 清除 x.grad 中的现有梯度,以避免累积
x.grad.zero_()
# 要计算 dy/dx,必须对 y 调用 backward
y.backward()  # 计算 y 相对于 x 的梯度
dy_dx = x.grad.item()  # y 相对于 x 的梯度
print(f'dz/dx = {dz_dx}')
print(f'dy/dx = {dy_dx}')

现在你已经看到 PyTorch 如何在实践中计算梯度来评估反向传播,让我们回到反向传播技术如何在实际实现中的挑战下发展起来的细节。

反向传播的不足之处

尽管反向传播过程提供了一种有原则的方式来更新网络中的内部权重,但它也存在几个不足之处,这些问题使得深度网络在实践中难以使用。一个问题是梯度消失(vanishing gradients)。在我们推导反向传播公式的过程中,你会看到网络中更深层次的权重的梯度是由来自更高层次的连续偏导数的乘积构成的。在我们的示例中,我们使用了sigmoid函数;如果我们绘制出sigmoid函数及其一阶导数的图像,我们可以看到一个潜在的问题:

image.png

当sigmoid函数的值朝着极端值(0或1,分别表示“关闭”或“开启”)增加或减少时,梯度的值趋近于零。这意味着,来自隐藏激活函数的这些梯度的乘积——即对权重 www 和偏置项 bbb 的更新——将变得越来越小,导致权重在每次迭代之间几乎没有变化,并且在反向传播过程中,隐藏层神经元的参数变化非常缓慢。显然,这里有一个问题是sigmoid函数饱和;因此,选择另一个非线性函数可能会绕过这个问题(这确实是其中一个解决方案,并且提出了ReLU,我们将在后面介绍)。

另一个问题则更为微妙,涉及网络如何利用其自由参数。正如你在第1章《生成性AI简介:从模型中绘制数据》中所看到的,变量的后验概率可以作为似然函数和先验分布的乘积来计算。

我们可以将深度神经网络视为这种概率的图形表示:神经元的输出,取决于它的参数,是所有输入值及其分布(即先验)的乘积。当这些值变得紧密耦合时,问题就出现了。作为一个例子,考虑头痛的竞争假设:

image.png

如果一个病人患有癌症,证据非常充分,以至于他们是否患有感冒并不提供额外的价值;从本质上讲,两个先验假设的价值因为一个假设的影响而变得紧密耦合。这使得计算不同参数的相对贡献变得不可行,尤其是在深度网络中。2006年的一项研究展示了如何抵消这种效应,并且是深度神经网络中可解推理的首次演示,这是一个突破,依赖于生成模型,该模型生成了手绘数字的图像。

除了这些问题,神经网络在1990年代和2000年代初期更广泛应用的其他挑战包括,支持向量机、梯度和随机梯度提升模型、随机森林,甚至像LASSO和弹性网这样的惩罚回归方法,这些方法在分类和回归任务中都能派上用场。

理论上,深度神经网络具有比这些模型更强大的表达能力,因为它们通过连续的层构建输入数据的层次表示,而不像回归权重或决策树等单一变换所提供的“浅层”表示。然而,在实践中,训练深度网络的挑战使得这些“浅层”方法在实际应用中更具吸引力。与此同时,较大的网络需要调节成千上万甚至数百万个参数,这需要大规模的矩阵计算,而在云计算供应商提供的廉价计算资源——特别是适用于快速矩阵计算的GPU和TPU——爆炸性增长之前,这些实验是不可行的。

现在我们已经涵盖了训练简单网络架构的基础知识,让我们转向更复杂的模型,这些模型将构成本书其余部分中许多生成模型的构建块:卷积神经网络(CNNs)和序列模型(RNNs、LSTMs及其他)。

网络的多样性:卷积和递归

直到现在,我们主要通过引用前馈网络讨论神经网络的基础,其中每个输入都与每一层中的每个输出相连接。虽然这些前馈网络对于说明深度网络如何训练是有用的,但它们只是现代应用中使用的更广泛架构中的一种,包括生成模型。因此,在讲解一些使大规模网络训练变得可行的技术之前,让我们先回顾一下这些替代的深度模型。

用于视觉的网络:卷积架构

正如本章开始时所提到的,深度神经网络模型的灵感之一来自生物神经系统。当研究人员尝试设计能够模仿视觉系统功能的计算机视觉系统时,他们转向了视网膜的架构,这一架构由神经生物学家David Hubel和Torsten Weisel在1960年代的生理学研究中揭示。如前所述,生理学家圣地亚哥·拉蒙·卡哈尔提供了视觉证据,表明神经结构如视网膜是以垂直网络的方式排列的:

image.png

Hubel 和 Weisel 研究了猫的视网膜系统,展示了它们如何通过排列在柱状结构中的单个细胞的活动来感知形状。每一列细胞都设计用来检测输入图像中边缘的特定方向;复杂形状的图像是由这些更简单的图像拼接而成的。

早期的卷积神经网络(CNNs)

这种柱状结构的想法启发了早期关于卷积神经网络(CNN)架构的研究。与前馈网络中学习单个单元之间的权重不同,这种架构(图2.9)在一组神经元中使用共享权重,这些神经元专门用于检测图像中的特定边缘。网络的初始层(记为 H1)由12组每组64个神经元组成。在这12组中的每一组,64个神经元代表输入图像的8x8版本,该图像经过“缩小”;为了获得该8x8图像中每个像素的值,需要将一个8x8的权重矩阵与输入16x16图像中的一个5x5的图像块相乘。通过将5x5的权重矩阵在上下左右各滑动3个像素,可以覆盖整个输入图像。

请注意,将这个5x5的权重矩阵与输入图像的一个块相乘只是我们可以做的多种变换之一;我们也可以简单地对5x5区域内的像素进行平均或取最大值,这种操作称为最大池化(max pooling)或平均池化(average pooling)。

将这些操作结合在一起,H1层中的这12组神经元形成了12个8x8的网格,表示图像某部分中特定边缘的存在或缺失——这个8x8的网格实际上是图像的一个降采样版本,其中每一组神经元通过这种降采样操作从图像中提取不同的特征(图2.9)。这种权重共享是直观的,因为权重所代表的卷积核被指定为检测图像中出现的特定颜色和/或形状,而不管它出现在图像的哪个位置。降采样的效果之一是一定程度的位置信息不变性;我们只知道边缘出现在图像的某个区域内,但由于降采样带来的分辨率降低,我们无法知道它的确切位置。由于它们是通过将一个5x5矩阵(卷积核)与图像的一部分相乘来计算的,这种操作也用于图像模糊和其他变换,这些5x5的输入特征被称为卷积核,并赋予网络其名称。

image.png

一旦我们获得了这12个8x8的降采样图像版本,下一层(H2)也有12组神经元;在这里,卷积核是5x5x8——它们遍历H1的8x8图像图层,跨越12组中的8组。我们需要16个神经元来处理这些5x5x8的卷积核,因为一个5x5的网格可以在8x8的网格上上下滑动四次,以覆盖8x8网格中的所有像素。

就像视觉皮层中的更深层细胞一样,网络中的更深层通过跨越多个列来整合信息,从不同的边缘检测器中获取信息。

最后,网络的第三个隐藏层(H3)包含30个隐藏单元与H2中的12x16单元之间的全连接,就像传统的前馈网络一样;最终的10个输出单元将输入图像分类为10个手绘数字之一。

通过权重共享,这个网络中自由参数的总数得到了减少,尽管在绝对值上仍然很大。虽然反向传播成功地用于这个任务,但它需要精心设计的网络,且仅适用于一组限制的图像和结果——对于现实世界应用(如从成百上千个可能类别中检测物体),需要采用其他方法。

AlexNet和其他卷积神经网络的创新

2012年,一篇文章使用名为AlexNet的模型,成功地将1.3百万张图像分类为1000个类别,从而在ImageNet上取得了最先进的结果。该模型展示了一些使得训练这类模型成为可能的后期创新。正如我之前提到的,创新之一是使用ReLU代替sigmoid或双曲正切(tanh)函数。ReLU是如下形式的函数:

image.png

与sigmoid函数或tanh不同,在这些函数中,导数在函数饱和时收敛到0,而ReLU函数具有常数梯度,并且在0处具有不连续性(图2.10)。这意味着梯度不会饱和,导致网络的更深层训练得更慢,从而导致优化变得不可行。

image.png

虽然ReLU函数由于梯度不消失和低计算要求(因为它们只是简单的阈值线性变换)而具有优势,但ReLU函数的缺点是,当输入低于0时,它们可能会“关闭”,从而导致梯度为0。这个缺陷在后来的研究中得到了改进,通过引入一个低于0的“泄漏”来解决这个问题。

image.png

进一步的改进是使这个阈值具有适应性,加入一个斜率 α\alphaα,即参数化泄漏ReLU(PReLU)。

image.png

最近的研究促成了GELU、ELU和SiLU单元的开发,它们将ReLU的元素与更大的灵活性相结合(arxiv.org/abs/1606.08…, arxiv.org/pdf/1702.03…)。

AlexNet使用的另一个技巧是丢弃法(dropout)。丢弃法的思想来自于集成方法,我们通过平均多个模型的预测来获得更稳健的结果。显然,对于深度神经网络来说,这种方法是不可行的;因此,一种折中的做法是以0.5的概率将一部分神经元的值随机设置为0。这些值会在每次前向传播和反向传播时重置,从而允许网络有效地采样不同的架构,因为在该次传播中被“丢弃”的神经元不会参与输出。这减少了我们在每次反向传播过程中更新的模型参数数量的50%,从而起到正则化的作用,减少了过拟合。

image.png

AlexNet中使用的另一个增强技术是局部响应归一化(LRN)。尽管ReLU不像其他单元那样饱和,但该模型的作者仍然发现,限制输出范围是有价值的。例如,在一个单独的卷积核中,他们使用相邻卷积核的值对输入进行归一化,这意味着整体响应会被重新缩放。

image.png

这里,aaa 是图像中给定 x,yx, yx,y 位置的未归一化输出,jjj 上的求和是对相邻卷积核进行求和,kkk 和其他是超参数。这种重新缩放类似于后来的创新,广泛应用于卷积神经网络和其他神经网络架构中的批量归一化(batch normalization)。批量归一化同样对网络中的“原始”激活值进行变换:

image.png

这里,XXX 是未归一化的输出,γ\gammaγ 和 β\betaβ 是缩放和偏移参数。这种变换广泛应用于许多神经网络架构中,以加速训练,尽管它为何有效的确切原因仍然是一个争论的话题。

现在你已经了解了一些使得训练大型CNN成为可能的方法性进展,接下来让我们检查一下AlexNet的结构,看看我们将在后续章节的生成模型中实现的CNN中使用的其他架构组件。

AlexNet架构

虽然图2.12中显示的AlexNet架构看起来可能令人畏惧,但一旦我们将这个大型模型分解成单独的处理步骤,就不那么难以理解了。让我们从输入图像开始,追踪每张图像如何通过神经网络每一层执行的一系列变换来计算输出分类。

image.png

AlexNet的输入图像大小为224x224x3(RGB通道)。第一层由96个单元组成,卷积核为1x11x3;输出经过响应归一化(如前所述)并进行了最大池化(max pooling)。最大池化是一种操作,它在一个 n×nn \times nn×n 网格上取最大值,用于注册输入中是否出现了某种模式;这再次是一种位置信息不变性的形式。

第二层也是一组卷积核,大小为5x5x8,分为256组。第三层到第五层是额外的卷积层,没有归一化,接着是两层全连接层,最后输出大小为1,000,表示ImageNet中的可能图像类别。AlexNet的作者使用了多个GPU来训练该模型,这种加速对输出至关重要。

image.png

通过观察在训练过程中学习到的初始11x11x3卷积层的特征(图2.13),我们可以看到可识别的边缘和颜色。尽管AlexNet的作者没有展示网络中较高层的神经元如何合成这些基本特征,但另一项研究提供了一个插图,在该研究中,研究人员训练了一个大型CNN来对YouTube视频中的图像进行分类,得到了网络上层的一个神经元,看起来像是一个猫的检测器(图2.14)。

image.png

这段概述应该让你了解为什么CNN架构是这样设计的,以及哪些发展使得它们随着时间的推移成为图像分类器或基于图像的生成模型的可行基础。现在我们将转向第二类更为专业化的架构——RNN——这些架构用于开发时间序列或基于序列的模型。

顺序数据的网络

除了图像数据,自然语言文本也是神经网络研究中一个常见的研究主题。然而,与我们迄今为止研究的数据集不同,语言具有一种对其意义至关重要的独特顺序。因此,要准确捕捉语言或时间相关数据中的模式,必须使用为此目的设计的网络。

RNN和LSTM

让我们假设我们正在尝试预测一个句子中的下一个词,给定到目前为止的所有词。一个试图预测下一个词的神经网络需要考虑的不仅仅是当前的词,还需要考虑一个可变数量的先前输入。如果我们仅使用一个简单的前馈多层感知机(MLP),网络本质上会将整个句子或每个词处理为一个向量。这会引入一个问题,即要么必须将变长输入填充到一个固定长度,这样就无法保留任何关联性(即,句子中哪些词比其他词在生成下一个预测时更为相关),要么每次仅使用最后一个词作为输入,这样就丧失了剩余句子的上下文和它所提供的所有信息。这类问题激发了“基础”RNN的出现,它不仅将当前输入纳入考虑,还将前一步的隐藏状态纳入神经元输出的计算中:

image.png

一种可视化这种结构的方法是想象每一层递归地传递到序列中的下一个时间步。实际上,如果我们“展开”序列的每一部分,我们最终得到一个非常深的神经网络,其中每一层共享相同的权重。

image.png

训练深度前馈网络所面临的困难同样适用于RNN;使用传统激活函数时,梯度往往会在长距离上消失(或者如果梯度大于1则会爆炸)。

然而,与前馈网络不同,RNN不是通过传统的反向传播来训练的,而是通过一种称为时间反向传播(Backpropagation through Time, BPTT)的变种进行训练:网络如前所述被展开,反向传播用于对每个时间点的误差进行平均(因为“输出”——隐藏状态——在每一步都会发生)。此外,在RNN的情况下,我们会遇到网络记忆非常短的问题;它只包含来自当前单元之前最近单元的信息,并且难以维持长距离的上下文。对于诸如翻译等应用来说,这显然是一个问题,因为句子末尾的单词的解释可能依赖于靠近开头的词语,而不仅仅是直接前面的词语。

LSTM网络的出现是为了让RNN能够在长序列中保持上下文或状态;它通过允许初始层中的梯度被“存储”在二级记忆中,并在调整后续层权重时使用——而不会发生爆炸或消失——来解决梯度爆炸/消失问题。

image.png

图2.16展示了这一过程:在一个基础的RNN中,我们仅保持来自前一步隐藏单元激活的短期记忆 hhh。除了这部分短期记忆,LSTM架构引入了一个额外的层 ccc,即“长期”记忆,它可以在多个时间步上持续存在。该设计在某些方面类似于电容器,它可以利用 ccc 层存储或保持“电荷”,并在达到某个阈值后释放这些电荷。为了计算这些更新,LSTM单元由多个相关的神经元或门组成,这些神经元共同作用,以变换每个时间步的输入。

给定输入向量 xxx 和前一个时间步 t−1t-1t−1 的隐藏状态 hhh,在每个时间步,LSTM首先计算一个从0到1的值,表示每个 ccc 元素的“遗忘”程度,即每个元素在向量中的信息有多少被“遗忘”:

image.png

我们进行第二个类似的计算,以确定要从输入值中保留什么:

image.png

现在我们知道哪些元素的 ccc 被更新;我们可以按如下方式计算这个更新:

image.png

这里,⊙\odot⊙ 是Hadamard积(逐元素乘法)。本质上,这个方程告诉我们如何使用tanh变换计算更新,通过输入门对其进行过滤,并通过忘记门将其与前一个时间步的长期记忆结合,从而可能过滤掉旧的值。

为了计算每个时间步的输出,我们计算另一个输出门:

image.png

为了计算每个步骤的最终输出(作为短期记忆传递到下一个步骤的隐藏层),我们有:

image.png

许多这种基本设计的变种已被提出;例如,“窥视孔”LSTM用 c′c'c′ 替代了 ccc(因此每个操作可以“窥视”长期记忆单元),而GRU通过移除输出门简化了整体设计。所有这些设计的共同点是,它们避免了在训练RNN时遇到的梯度消失(或爆炸)问题,因为长期记忆充当了缓冲区,保持梯度并在多个时间步长上传播神经元激活。

变换器(Transformers)

虽然我们将在第4章中更详细地讨论这个主题,但需要注意的是,许多当前应用中,卷积和递归单元已经被变换器(transformers)取代,这种架构首次在2017年被描述(arxiv.org/abs/1706.03…)。某种程度上,变换器结合了递归网络和卷积网络的优点。

像卷积网络一样,变换器计算序列或矩阵中元素之间的相对相似度;然而,与卷积网络不同,变换器执行的是对所有元素之间的计算,而不仅仅是局部计算。像LSTM一样,它们通过位置编码元素、全对全的配对相似度(也称为自注意力),以及类似于LSTM中的记忆单元的传递连接来保留上下文窗口。然而,与LSTM不同的是,变换器可以并行计算,从而实现更高效的训练。

图2.17概述了这种显著操作的工作原理;序列中的每个元素都被标记并表示为三组向量:查询(Q)、键(K)和值(V)。通过将所有的Q和K相乘,并通过V进行重新缩放,我们得到一个紧凑的表示,表示序列中每个元素与其他元素的相关性。我们可以通过使用不同的学习权重集,利用多头注意力并行执行此操作,从而捕捉不同类型的相对重要性。

image.png

构建更好的优化器

到目前为止,我们已经讨论了几个示例,其中更好的神经网络架构实现了突破;然而,和(甚至可能比)这些架构同样重要的是优化过程,它用于最小化这些问题中的误差函数,通过选择那些能够产生最低误差的参数来“学习”网络的参数。参考我们对反向传播的讨论,这个问题有两个组成部分:

  1. 如何初始化权重:在许多历史应用中,我们看到作者使用某个范围内的随机权重,并希望通过使用反向传播,至少能从这个随机起点得到一个局部最小的损失函数。网络中的激活函数是否已饱和或为0(增加了在训练模型时梯度不具信息量的可能性)并未被考虑。
  2. 如何找到局部最小损失:在基础的反向传播中,我们使用固定学习率和一阶导数更新的梯度下降法来遍历权重矩阵的潜在解空间;然而,有充分的理由相信,可能存在更高效的方法来找到局部最小值。

事实上,这两个问题已经证明是深度学习研究进展的关键考虑因素。

从梯度下降到ADAM

正如我们在反向传播的讨论中看到的,最初在1986年提出的训练神经网络的版本是在计算梯度并更新权重之前,先对整个数据集的损失进行平均。显然,这种方法相当慢,并且使得模型分布变得困难,因为我们无法拆分输入数据和模型副本;如果使用它们,每个副本都需要访问整个数据集。

相比之下,SGD在处理n个样本后计算梯度更新,其中n可以从1到N(数据集的大小)不等。实际上,我们通常进行小批量梯度下降,其中n相对较小,并且我们在每个训练周期后将数据随机分配到n个批次中(即一次通过数据)。

然而,SGD可能会很慢,这促使研究人员提出加速寻找最小值的替代方法。正如最初的反向传播算法所示,一种思路是使用一种指数加权的动量形式,它记住了先前的步骤并继续朝着有希望的方向前进。已经提出了不同的变体,如Nesterov动量,它通过增加一个项来加速这一过程。

image.png

image.png

与最初的反向传播算法中使用的动量项相比,将当前的动量项加到梯度中有助于保持动量分量与梯度变化的对齐。

另一种优化方法,称为AdaGrad,它通过运行该参数梯度的平方和(GGG)来调整每次更新的学习率;因此,频繁更新的元素会被下采样,而那些不常更新的元素则会被推动以更大的幅度进行更新。为了类比人类学习,新任务被赋予更多的关注,而日常常规信息对人工“大脑”的行为没有太大影响。

image.png

这种方法的缺点是,随着我们继续训练神经网络,平方和 GGG 会无限增加,最终将学习率缩小到非常小的值。为了修正这个缺点,提出了两种变体方法,RMSProp(常应用于RNN)和AdaDelta,它们在计算 GGG 时施加了固定宽度的 nnn 步窗口。

ADAM 可以看作是将动量和AdaDelta结合的尝试;动量计算用于保持过去梯度更新的历史,而在AdaDelta中使用的固定更新窗口内衰减的平方梯度和则应用于缩放结果梯度。ADAM的改进版本,ADAMW(来自SGD的权重衰减方案),用于在每个时间步更新参数(arxiv.org/pdf/1711.05…)。 这里提到的方法都具有一阶特性:它们只涉及损失函数相对于输入的导数。虽然计算简单,但这可能会在神经网络参数的复杂解空间中带来实际的挑战。如图2.18所示,如果我们将权重参数的地形可视化为一个山谷,那么一阶方法将在曲率变化迅速的区域(上图)中移动得过快,从而超过最小值,或者在曲率较低的最小值“山谷”中变化过慢。理想的算法不仅应该考虑曲率,还应该考虑曲率变化的速率,这样优化器可以在曲率变化非常慢时采取较大的步长,反之亦然(下图)。

image.png

由于这些方法利用了导数的变化速率(即二阶导数),它们被称为二阶方法,并在优化神经网络模型中取得了一些成功。

然而,每次更新所需的计算量大于一阶方法,并且由于大多数二阶方法涉及大矩阵求逆(因此需要较大的内存),必须进行近似以使这些方法能够扩展。然而,实际上优化网络的突破之一不仅仅来自优化算法,而是如何初始化模型中的权重。

Xavier初始化

如前所述,在早期的研究中,通常会将神经网络的权重初始化为某个范围内的随机值。

如果你曾经在PyTorch中使用过一个层,你会注意到,层权重的默认初始化是从截断的正态分布或均匀分布中抽取的。那么,这个选择来自哪里呢?正如我之前描述的,使用sigmoid或双曲正切激活函数的深度网络面临的一个挑战是,它们往往会饱和,因为这些函数的值在输入非常大或非常负时会受到限制。我们可以将初始化网络的挑战解释为保持权重在一个范围内,以避免它们使神经元的输出饱和。另一种理解方式是,假设神经元的输入和输出值具有相似的方差;信号在通过神经元时不会被大幅放大或缩小。

实际上,对于一个线性神经元,y=w⋅x+by = w \cdot x + by=w⋅x+b,我们可以计算输入和输出的方差:

image.png

b 是常数,因此我们得到:

image.png

由于权重矩阵中有 NNN 个元素,并且我们希望 Var(y)\text{Var}(y)Var(y) 等于 Var(x)\text{Var}(x)Var(x),这就给出了:

image.png

因此,对于一个权重矩阵 www,我们可以使用方差为 1/N1/N1/N 的截断正态分布或均匀分布(其中 NNN 是输入和输出单元的平均数量,即权重的数量)。此外,变体方法也已应用于ReLU单元:这些方法被原作者命名为Xavier初始化或He初始化。

我们已经回顾了PyTorch中常用的优化器,并讨论了它们如何改进基本的SGD形式。我们还讨论了聪明的权重初始化方案是如何与这些优化器一起工作,以便我们能够训练越来越复杂的模型。

总结

在本章中,我们介绍了深度学习的基本词汇——如何从早期对感知机和MLP的研究中,简单的学习规则被放弃,转而使用反向传播。我们还看了像基于视觉皮层的CNN和专门用于序列建模的递归网络等专业神经网络架构。最后,我们考察了最初为反向传播提出的梯度下降算法的变种,这些变种具有如动量等优势,并描述了权重初始化方案,这些方案将网络的参数置于更容易导航到局部最小值的范围内。

在了解了这些背景之后,我们已经准备好开始进入生成模型的项目,首先是使用深度置信网络生成MNIST数字,在第11章《使用VAE的神经网络》中展开。

参考文献

López-Muñoz, F., Boya, J., 和 Alamo, C. (2006). 神经元理论,神经科学的基石,在圣地亚哥·拉蒙·卡哈尔获得诺贝尔奖的百年纪念。Brain Research Bulletin, 70(4–6): 391–405. pubmed.ncbi.nlm.nih.gov/17027775/

Ramón y Cajal, S. (1888). 《鸟类神经中枢的结构》。

McCulloch, W.S. 和 Pitts, W. (1943). 神经活动中固有思想的逻辑演算。Bulletin of Mathematical Biophysics, 5, 115–133. doi.org/10.1007/BF0…

Rashwan, M., Ez, R., 和 Abd El reheem, G. (2017). 阿拉伯语语音识别的计算智能算法。Journal of Al-Azhar University Engineering Sector, 12, 886-893. 10.21608/auej.2017.19198. jaes.journals.ekb.eg/article_191…

人工神经元. Wikipedia. 检索自2021年4月26日, en.wikipedia.org/wiki/Artifi…

Shackleton-Jones, N. (2019年5月3日). 《人们如何学习:设计有效提高表现的教育与培训》。Kogan Page. 伦敦,英国

Hebb, D. O. (1949). 《行为的组织:一种神经心理学理论》。纽约:Wiley & Sons

Rosenblatt, F. (1957). 《感知机——一种感知和识别的自动机》。报告85-460-1. 康奈尔航空实验室。

Minsky, M. 和 Papert, S. (1972)(修订版,第1版1969年)《感知机:计算几何学导论》,MIT出版社,剑桥,马萨诸塞州

Hassan, H., Negm, A., Zahran, M., 和 Saavedra, O. (2015). 使用高分辨率卫星影像在浅水湖泊中进行水深估计的人工神经网络评估:以El Burullus湖为例。International Water Technology Journal, 5.

Pollack, J. B. (1989). 《无害意图:扩展版感知机的回顾》。Journal of Mathematical Psychology, 33(3): 358–365.

Crevier, D. (1993). 《人工智能:人工智能的动荡探索》,纽约,NY:BasicBooks.

Cybenko, G. (1989). 使用sigmoidal函数的叠加进行逼近。Math. Control Signal Systems, 2, 303–314. doi.org/10.1007/BF0…

Goodfellow, I., Bengio, Y., 和 Courville, A. (2016). 6.5 反向传播和其他微分算法。Deep Learning. MIT Press. 第200–220页

Rumelhart, D., Hinton, G., 和 Williams, R. (1986). 通过反向传播错误学习表示。Nature, 323, 533–536. doi.org/10.1038/323…

PyTorch自动求导引擎概述:pytorch.org/blog/overvi…

Berland (2007). ReverseaccumulationAD.png. Wikipedia. 可通过 commons.wikimedia.org/wiki/File:R… 获得

自动微分. Wikipedia. en.wikipedia.org/wiki/Automa…

Wengert, R.E. (1964). 一个简单的自动导数评估程序。Comm. ACM. 7(8): 463–464.

Bartholomew-Biggs, M., Brown, S., Christianson, B., 和 Dixon, L. (2000). 算法的自动微分。Journal of Computational and Applied Mathematics, 124(1–2): 171–190.

PyTorch作者 (2018). automatic_differentiation.ipynb. 可通过 colab.research.google.com/github/PyTo… 获得

PyTorch作者. 梯度和自动微分介绍。PyTorch. 可通过 www.PyTorch.org/guide/autod… 获得

Thomas (2018). 梯度消失问题和ReLU——PyTorch调查。Adventures in Machine Learning. 可通过 adventuresinmachinelearning.com/vanishing-g… 获得

Hinton, Osindero 和 Yee-Whye (2005). 《深度信念网络的快速学习算法》。多伦多大学,计算机科学。可通过 www.cs.toronto.edu/~fritz/absp… 获得

Cortes, C. 和 Vapnik, V. (1995). 支持向量网络。Mach Learn, 20, 273–297. doi.org/10.1007/BF0…

Friedman, J. H. (1999年2月). 《贪婪函数逼近:一种梯度提升机》(PDF)

Breiman, L. (2001). 随机森林。Machine Learning, 45, 5–32. doi.org/10.1023/A:1…

Tibshirani, R. (1996). 通过lasso进行回归收缩和选择。Journal of the Royal Statistical Society. Series B (methodological), Wiley, 58(1): 267–88.

Zou, H. 和 Hastie, T. (2005). 通过弹性网进行正则化和变量选择。Journal of the Royal Statistical Society, Series B: 301–320

Hubel, D. H. 和 Wiesel, T. N. (1962). 猫的视觉皮层中的接受域、双眼相互作用和功能结构。J Physiol, 1962, 160: 106-154. doi.org/10.1113/jph…

charlesfrye.github.io/Foundationa…

Wolfe, Kluender 和 Levy (2009). 《感觉与知觉》。Sunderland: Sinauer Associates Inc..

LeCun, Yann, 等. (1989). 反向传播应用于手写邮政编码识别。Neural Computation, 1.4: 541-551.

使用深度卷积神经网络进行ImageNet分类: www.nvidia.cn/content/tes…

Nair, V. 和 Hinton, G E. (2010). ReLU改善限制玻尔兹曼机。Proceedings of the 27th International Conference on Machine Learning, Haifa, Israel, 2010.

Agarap, A F. (2019). 使用梯度噪声加法避免梯度消失问题。medium. medium.com/data-scienc…

Maas, A L., Hannun, A Y., 和 Ng, A Y. (2013). Rectifier非线性改善神经网络声学模型。Proceedings of the 30th International Conference on Machine Learning, Atlanta, Georgia, USA.

He, K., Zhang, X., Ren, S., 和 Sun, J. (2015). 深入探索ReLU:在ImageNet分类中超越人类水平的表现。arXiv:1502.01852. arxiv.org/abs/1502.01…

Hinton, G E., Srivastava, N., Krizhevsky, A., Sutskever, I., 和 Salakhutdinov, R R. (2012). 通过防止特征检测器的共适应改善神经网络。arXiv:1207.0580. arxiv.org/abs/1207.05…

Krizhevsky, A., Sutskever, I., 和 Hinton, G. E. (2012). 使用深度卷积神经网络进行ImageNet分类。作为《神经信息处理系统进展》的第25卷的一部分(NIPS 2012)。papers.nips.cc/paper/2012/…

Ioffe, S. 和 Szegedy, C. (2015). 批量归一化:通过减少内部协变量偏移加速深度网络训练。arXiv:1502.03167. arxiv.org/abs/1502.03…

Santurkar, S., Tsipras, D., Ilyas, A., 和 Madry, A. (2019). 批量归一化如何帮助优化?arXiv:1805.11604. arxiv.org/abs/1805.11…

Dean, J. 和 Ng, A. Y. (2012). 使用大规模大脑仿真进行机器学习和人工智能。The Keyword | Google. blog.google/technology/…

LeCun, Y., Bengio, Y., 和 Hinton, G. (2015) 深度学习。Nature, 521, 436–444. www.nature.com/articles/na…

Olah (2015). 理解LSTM网络。colah’s blog. 可通过 colah.github.io/posts/2015-… 获得

Mozer, M. C. (1995). 用于时间模式识别的集中反向传播算法。在Chauvin, Y.; Rumelhart, D.(编)。《反向传播:理论、架构与应用》。ResearchGate. Hillsdale, NJ: Lawrence Erlbaum Associates. 第137–169页

Greff, K., Srivastava, R K., Koutník, J., Steunebrink, B R., 和 Schmidhuber, J. (2017). LSTM: A Search Space Odyssey. arXiv:1503.04069v2. arxiv.org/abs/1503.04…

Gers, F. A. 和 Schmidhuber, E. (2001). LSTM递归网络学习简单的无上下文和有上下文语言。IEEE Trans Neural Netw, 12(6): 1333-40. doi: 10.1109/72.963769. PMID: 18249962.

Cho, K., van Merrienboer, B., Gulcehre, C., Bahdanau, D., Bougares, F., Schwenk, H., 和 Bengio, Y. (2014). 使用RNN编码器-解码器学习短语表示进行统计机器翻译。arXiv:1406.1078. arxiv.org/abs/1406.10…

Sutskever, I., Martens, J., Dahl, G., 和 Hinton, G. (2013). 初始化和动量在深度学习中的重要性。Proceedings of the 30th International Conference on Machine Learning, in PMLR 28(3):1139-1147.

Duchi, J., Hazan, E., 和 Singer, Y. (2011). 用于在线学习和随机优化的自适应子梯度方法。Journal of Machine Learning Research, 12: 2121-2159.

Hinton, Srivastava 和 Swersky. Neural Networks for Machine Learning, Lecture 6a. 可通过 www.cs.toronto.edu/~tijmen/csc… 获得

Zeiler, M. D. (2012). ADADELTA:一种自适应学习率方法。arXiv:1212.5701. arxiv.org/abs/1212.57…

Kingma, D. P. 和 Ba, J. (2017). ADAM:一种随机优化方法。arXiv:1412.6980. arxiv.org/abs/1412.69…

Martens, J. (2010). 通过海森矩阵无优化的深度学习。ICML. Vol. 27. 2010.

Glorot, X. 和 Bengio, Y. (2010). 理解训练深度前馈神经网络的困难。Proceedings of the 13th International Conference on Artificial Intelligence and Statistics.

He, K., Zhang, X., Ren, S., 和 Sun, J. (2015). 深入研究ReLU:在ImageNet分类中超越人类水平的表现。arXiv:1502.01852. arxiv.org/abs/1502.01…

Kagan, 等. (2022). 体外神经元在模拟游戏世界中学习并展现意识。Neuron, 110(23), P3952-3969.E8.