反向传播算法最初是在1970年代引入的,但是直到1986年David Rumelhart,Geoffrey Hinton和Ronald Williams发表了著名论文【Learning representations by back-propagating errors Rumelhart et al., Nature, 1986】后,它的重要性才得到充分认识。
这篇论文描述了几种神经网络,其中反向传播比以前的学习方法快得多,这使得使用神经网络解决以前无法解决的问题成为可能。如今,反向传播算法已成为神经网络中学习的主力军。
我们描述了一种新的学习程序,反向传播(back-propagation),用于神经元样单元的网络。该程序反复调整网络中的连接权重,以便最小化网络实际输出向量和给定输出向量之间差异性的度量。由于权重调整,内部不作为输入或输出部分的“隐藏”单元开始表现出任务领域的重要特征,并且任务的规律性(regularities)被这些单元的相互作用下所捕捉。创建有用新特征的能力将反向传播与早期简单的诸如感知收敛(perceptron-convergence)程序的方法区分开来。
已经有很多尝试来设计自组织(self-organizing)神经网络。目的是找到一个允许任意连接的神经网络来发展适合于特定任务领域的内部结构的强有力的突触修改规则(synaptic modification rule)。任务通过对每个输入单元的状态向量给出特定的输出单元的状态向量来指定。如果输入单元直接连接到输出单元,比较容易发现迭代地调整连接的相对强度的学习规则(learning rules),以便逐步降低实际的和给定的输出向量之间的差异性。学习变得更有趣了,但当我们引入实际和给定状态不被任务指定的隐藏单元时也变得更困难了。(在感知器中,输入和输出之间存在着并不是真正隐藏单元的“feature analysers”,因为这些输入连接是手动固定的,所以这些状态已经完全被输入向量确定了:它们没有学习表示(learn representations))。学习程序(learning precedure)必须决定在什么情形下隐藏单元是激活的以帮助完成给定的输入输出行为。这意味着决定这些单元应该代表着什么。我们证明了一个通用的目的和相对简单的程序充分足以构建合适的内部表示。
学习程序的最简单形式是拥有一层底部输入单元,任意数量的中间层,以及一层顶部输出单元的层级网络。层内部或从高层向底层的连接是被禁止的,但连接可以跳过中间层。通过设置输入单元的状态,一个输入向量就呈现给网络。对底层连接应用等式(1)和(2),每层单元状态就确定了。同一层的所有单元状态平行设置,但不同层的状态顺序设置,从底层开始向上传播直到输出单元的状态确定为止。
对单元
j
j
j的总输入
x
j
x_j
xj是连接到
j
j
j的单元
y
i
y_i
yi和此连接上的权重
w
j
i
w_{ji}
wji的输出的线性函数:
x
j
=
∑
i
y
i
w
j
i
(1)
x_j=\sum_i y_iw_{ji}\tag{1}
xj=i∑yiwji(1)
通过对每个单元引入经常取值为1的额外输入,所有单元可以被赋予偏差(biases)。额外输入上的权重称为偏差(bias),并且等于相反符号的阈值(threshold)。可以像其他权重一样对待它。
一个单元有实值输出
y
j
y_j
yj,其是总输入的非线性函数:
y
j
=
1
1
+
e
−
x
j
(2)
y_j=\frac{1}{1+e^{-x_j}} \tag{2}
yj=1+e−xj1(2)
没有必要完全使用等式(1)和(2)给出的函数。任何具有有界导数的输入输出函数都能实现。然而,在应用非线性之前使用线性函数来组合输入到单元极大地简化了学习过程。
目的是找出确保由网络产生地每个输入输出向量与给定输出向量一模一样(或足够接近)的一组权重。如果存在固定有限的一组输入输出案例,具有一组特定权重的网络性能总误差可以通过比较每个案例的实际和给定输出向量来计算得到。总误差
E
E
E定义为:
E
=
1
2
∑
c
∑
j
(
y
j
,
c
−
d
j
,
c
)
2
(3)
E=\frac{1}{2}\sum_{c}\sum_{j}(y_{j,c}-d_{j,c})^2 \tag{3}
E=21c∑j∑(yj,c−dj,c)2(3)
其中,
c
c
c是案例(输入输出对)的索引,
j
j
j是输出单元的索引,
y
y
y是输出单元的实际状态而
d
d
d是其给定状态。为了通过梯度下降最小化
E
E
E,有必要计算
E
E
E相对于网络权重的偏导。这仅仅是每个输入输出案例的偏导之和。对于一个给定案例,误差相对于每个权重的偏导经过两个传递后计算得到。我们已经描述了每层单元状态由接收来自底层的单元使用等式(1)和(2)所决定的前向传递。从顶层返回底层地传播导数的反向传递是更复杂的。
对每个输出单元通过计算
∂
E
/
∂
y
\partial E/ \partial y
∂E/∂y开始反向传递。对特殊案例
c
c
c求导等式(3),并且遮掩索引
c
c
c得到:
∂
E
/
∂
y
j
=
y
j
−
d
j
(4)
\partial E / \partial y_j=y_j-d_j \tag{4}
∂E/∂yj=yj−dj(4)
我们可以应用链式规则来计算
∂
E
/
∂
x
j
\partial E / \partial x_j
∂E/∂xj:
∂
E
/
∂
x
j
=
∂
E
/
∂
y
j
⋅
d
y
j
/
d
x
j
\partial E / \partial x_j=\partial E / \partial y_j \cdot dy_j/dx_j
∂E/∂xj=∂E/∂yj⋅dyj/dxj
求导等式(2)得到
d
y
j
/
d
x
j
dy_j/dx_j
dyj/dxj的值并替代得到:
∂
E
/
∂
x
j
=
∂
E
/
∂
y
j
⋅
y
j
(
1
−
y
j
)
(5)
\partial E / \partial x_j =\partial E / \partial y_j \cdot y_j(1-y_j) \tag{5}
∂E/∂xj=∂E/∂yj⋅yj(1−yj)(5)
这意味着我们知道总输入
x
x
x对一个输出单元的变化将如何影响到误差。但这个总输入仅仅是更底层单元的状态的线性函数并且也是连接权重的线性函数,所以很容易计算通过改变这些状态和权重,误差将如何被影响到。对一个权重
w
j
i
w_{ji}
wji,从
i
i
i到
j
j
j的导数是:
∂
E
/
∂
w
j
i
=
∂
E
/
∂
x
j
⋅
∂
x
j
/
∂
w
j
i
=
∂
E
/
∂
x
j
⋅
y
i
(6)
\begin{aligned} \partial E / \partial w_{ji} &= \partial E / \partial x_j \cdot \partial x_j / \partial w_{ji} \\ &=\partial E / \partial x_j \cdot y_i \tag{6} \end{aligned}
∂E/∂wji=∂E/∂xj⋅∂xj/∂wji=∂E/∂xj⋅yi(6)
并且对第
i
t
h
i^{th}
ith个单元的输出,源于
i
i
i对
j
j
j的影响,
∂
E
/
∂
y
i
\partial E / \partial y_i
∂E/∂yi的贡献仅为:
∂
E
/
∂
x
j
⋅
∂
x
j
/
∂
y
i
=
∂
E
/
∂
x
j
⋅
w
j
i
\partial E / \partial x_j \cdot \partial x_j / \partial y_i = \partial E / \partial x_j \cdot w_{ji}
∂E/∂xj⋅∂xj/∂yi=∂E/∂xj⋅wji
所以从单元
i
i
i发出的所有连接考虑在内,我们得到:
∂
E
/
∂
y
i
=
∑
j
∂
E
/
∂
x
j
⋅
w
j
i
(7)
\partial E / \partial y_i = \sum_{j} \partial E / \partial x_j \cdot w_{ji} \tag{7}
∂E/∂yi=j∑∂E/∂xj⋅wji(7)
我们现在已经可以看到,当对最后一层的所有单元给定
∂
E
/
∂
y
\partial E / \partial y
∂E/∂y的时候,对倒数第二层的任意单元,怎样去计算
∂
E
/
∂
y
\partial E / \partial y
∂E/∂y。我们因此可以重复这一过程来对早先层连续地计算这一项,当我们做的时候对所有权重计算
∂
E
/
∂
w
\partial E / \partial w
∂E/∂w。
使用
∂
E
/
∂
w
\partial E / \partial w
∂E/∂w的一种方式是每对输入输出案例之后改变权重。这拥有着没有单独内存被要求用于导数的好处。另一个可选的方案,我们在这里报道的研究使用过的,是为了在改变权重之前在所有输入输出案例上累加
∂
E
/
∂
w
\partial E / \partial w
∂E/∂w。梯度下降的最简化版本是通过成比例于已累加
∂
E
/
∂
w
\partial E / \partial w
∂E/∂w的数量来改变每个权重。
Δ
w
=
−
ε
∂
E
/
∂
w
(8)
\Delta w =- \varepsilon \partial E / \partial w \tag{8}
Δw=−ε∂E/∂w(8)
这种方法不会和使用二阶导数的方法一样快速收敛,但是它更简单,并且在平行硬件上通过本地计算很容易被执行。它可以在不用牺牲简单性和局部性,通过使用一种当前梯度被用来修改权重空间而不是其位置(instead of its position)的点的速度的加速方法被极大地改善:
Δ
w
(
t
)
=
−
ε
∂
E
/
∂
w
(
t
)
+
α
Δ
w
(
t
−
1
)
(9)
\Delta w(t)=- \varepsilon \partial E / \partial w(t)+ \alpha \Delta w(t-1) \tag{9}
Δw(t)=−ε∂E/∂w(t)+αΔw(t−1)(9)
其中
t
t
t在全部输入输出样例集上每次扫描时增加1,并且
α
\alpha
α是决定当前梯度和对权重改变的先前梯度的相对贡献的(0,1)之间的指数衰退因子。
为打破对称性,我们从小的随机权重开始。学习过程中的变量已经被David Parker(个人交流)和Yann Le Cun独立发现。
通过仅连接输入单元和输出单元不能被完成的一个简单任务是对称性的检测。为了检测输入单元的一维数组的二元活动水平是否是关于中心点对称的。使用一个中间层是很有必要的,因为单独考虑一个独立输入单元的活动没有提供关于整个输入向量的对称或非对称性的证据,所以简单加上独立输入单元的证据是不够的。(一个更正式的中间单元的证明在引用2中给出)正如图1所示,学习过程发现一个仅使用两个中间单元的优雅解决方案。
另一个有趣的任务是存储两个家庭图谱信息(图2)。图3 展示了我们使用的网络,而图4展示了在网络被训练了104个可能的三元组中的100个之后,一些隐藏单元的“可接受领域”。
到目前为止,我们已经处理了分层的前向网络。分层网络和迭代运行的循环网络之间的等效关系如图5所示。
学习过程最明显的缺点是误差表面(error-surface)可能包含局部最小值以至于梯度下降不能保证能找到一个全局最小值。然而,很多任务经验表明,网络很少卡顿在明显比全局最小值更差劲的不符合要求的局部最小值。我们仅在有足够连接来执行任务的网络中遇到过这种不良行为。增加更多一些连接在权重空间中创造了额外的维度并且这些维度围绕创造了更低维度子空间的不符合要求的局部最小值的边界提供了路径。
当前形式的学习过程不是一个合理的大脑学习模型。然而,应用这些过程到各种任务表明(shows)了有趣的内部表示能在权重空间通过梯度下降来构建,并且这也表明(suggests)了寻找更多生物学上在神经网络进行梯度下降的的合理方式是值得的。
感谢系统发展基金会(the System Development Foundation)和海军研究办公室(the Office of Naval Research)的财政支持。
F i g . 1 \pmb{Fig.1} Fig.1Fig.1Fig.1 已学会检测输入向量的镜像对称性的网络。弧线上的数据是权重并且节点内部的数据是偏差。凭借64个可能输入向量的集合,学习过程要求1425次扫描,伴随着每次扫描后在累加梯度的基础上权重被调整。等式(9)的参数值是 ε = 0.1 , α = 0.9 \varepsilon=0.1,\alpha=0.9 ε=0.1,α=0.9。初始权重随机选择并统一分布在-0.3和0.3之间。这种解决方法的主要性质是对于一个给定的隐藏单元,关于输入向量的中点对称的权重在数值上相等而在符号上相反。所以如果一个对称性的模式被展现出来,两边隐藏单元将会从输入单元接收到0的网络输入,而且,因为隐藏单元有一个负的偏差,两边都会关闭。在这个案例中,拥有正偏差的输出单元将会打开。注意到中点两边的权重在 1 : 2 : 4 1:2:4 1:2:4的比例。这确保了每个中点上方可能出现的八个模式发送给每个隐藏单元一个唯一的激活和,所以只有中点下方的能完全平衡这个和的模式是对称的一个。对所有非对称模式,两边隐藏单元将会从输入单元接收非零激活。两边隐藏单元拥有相等但相反符号的权重模式,所以对每一个非对称性模式,一个隐藏单元会出现并抑制输出单元。
F i g . 2 \pmb{Fig.2} Fig.2Fig.2Fig.2 两个同构家谱。信息能够被表示成一组 < p e r s i o n 1 > < r e l a t i o n s h i p > < p e r s i o n 2 > <persion \quad 1><relationship><persion \quad 2> <persion1><relationship><persion2>形式的三元组,其可能的关系是{ f a t h e r {father} father, m o t h e r mother mother, h u s b a n d husband husband, w i f e wife wife, s o n son son, d a u g h t e r daughter daughter, u n c l e uncle uncle, a u n t aunt aunt, b r o t h e r brother brother, s i s t e r sister sister, n e p h e w nephew nephew, n i e c e niece niece}。如果当给定前两个的时候,网络能产生每个三元组的第三项,分层网络可以被说成“ k n o w know know”这些三元组。通过激活两个输入单元,前两项被编码(encoded),并且通过激活表示第三项的输出单元,网络必须完成这个命题(proposition)。
F i g . 3 \pmb{Fig.3} Fig.3Fig.3Fig.3 学习完后在五层网络中的活动级别。底层拥有左边的24个输入单元来表示 < p e r s i o n 1 > <persion \quad 1> <persion1>,并且右边的12个输入单元来表示 < r e l a t i o n s h i p > <relationship> <relationship>。这两组内部的白色方格展示了单元的活动级别。在第一组有一个活动单元表示 C o l i n Colin Colin,并且在第二组有一个表示 ′ h a s − a u n t ′ 'has-aunt' ′has−aunt′关系。两输入组的每一个完全连接自己组的第二层的6个单元。这些组学习编码人和关系作为活动的分布模式。第二层完全连接到12个单元的中间层,并且这些完全连接到6个单元的倒数第二层。倒数第二层的活动必须激活正确的输出单元,每一个代表一个特殊的 < p e r s o n 2 > <person \quad 2> <person2>。在这个案例中,有两个正确的答案(黑点标记),因为 C o l i n Colin Colin有两个姑姑。两边输入单元和输出单元在同一行与英格兰人民在空间上排放在一起,并且同构意大利人立即在其下面。
F i g . 4 \pmb{Fig.4} Fig.4Fig.4Fig.4 从代表人的24个输入单元的权重到学习人的分布表示的第二层的6个单元。白色矩形,刺激权重;黑色矩形,抑制权重;矩形面积编码权重的幅度。12个英格兰人的权重在每个单元的第一行。单元1主要关注英格兰和意大利之间的区别,而大多数其他单元忽略这种区别。这意味着一个英格兰人的表示与同等的意大利人的表示非常相似。网络主要利用两个家谱之间的同构性来允许网络共享结构,并且最后趋向于容易生成从一棵树到另外一棵树。单元2编码了一个人属于哪一代,单元6编码了他们起源的是属于家庭的哪一个分支。隐藏单元捕捉的特征在输入和输出编码一点也不清晰,因为这对每个人使用了独立的单元。因为隐藏特征捕捉了任务领域的下层结构,网络正确生成了没有被训练的四个三元组。我们训练网络进行1500次扫描,使用 ε = . 0005 , α = 0.5 \varepsilon=.0005,\alpha=0.5 ε=.0005,α=0.5进行前20轮扫描,并且使用 ε = . 01 , α = 0.9 \varepsilon=.01,\alpha=0.9 ε=.01,α=0.9进行剩下的扫描。为了使解释权重更容易些,我们在每个权重改变之后通过递减每个权重0.2%,引入权重衰退。经过长时间学习后,衰退通过 ∂ E / ∂ w \partial E / \partial w ∂E/∂w平衡,所以每个权重的最终幅值表明了在降低误差方面的有用性。为了避免网络需要大量权重来驱动输出为1或0。如果本应打开的输出单元活跃值超过0.8 以及本应关闭的输出单元活跃值低于0.2,误差将被视为0。
F i g . 5 \pmb{Fig.5} Fig.5Fig.5Fig.5 运行三次迭代并且相同层网络的同步迭代网络。循环网络的每一个时间步骤对应分层网络的一层。分层网络的学习过程可以映射成迭代网络的学习过程。两个复杂问题出现在执行此映射的过程中:首先,在分层网络中,在前向传递期间中间层的单元的输出水平被要求执行反向传递(见等式(5)和等式(6))。所以在一个迭代网路中,存储每一个单元的输出状态历史是很有必要的。其次,对于一个与迭代网络等同的分层网络,不同层之间的对应权重必须拥有相同的值。为了保存这个特性,我们对每组对应权重的所有权重取平均,然后通过成比例于平均梯度下降的数量来改变组内的每一个权重。有了这两个附文,这些网络可以学习执行迭代查询或者学习序列结构。