backpropagation.
相关......
- 计算机科学>
backpropagation.,短为“错误的反向传播,”是用于监督学习算法<一个href="//www.parkandroid.com/wiki/artificial-neural-network/" class="wiki_link" title="人工神经网络"t一个rget="_blank">人工神经网络一个>使用<一个href="//www.parkandroid.com/wiki/gradient-descent/" class="wiki_link" title="梯度下降法"t一个rget="_blank">梯度下降法一个>.给定人工神经网络和一个<一个href="//www.parkandroid.com/wiki/artificial-neural-network/" class="wiki_link" title="误差函数"t一个rget="_blank">误差函数一个>,该方法计算关于神经网络的权重的误差函数的梯度。它是对多层前馈神经网络的Perceptrons的三角洲规则的概括。
名称的“向后”的一部分从该梯度的计算进行向后通过网络,与权重的最终层的梯度被首先计算和权重的第一层的梯度来计算最后的事实造成的。从一个层中的梯度的局部计算被重复使用在梯度为先前层的计算。这种倒流的误差信息允许在每一层与分别计算各层的梯度的简单方法的梯度的高效计算。
由于深度神经网络在图像识别和语音识别方面的广泛应用,反向传播的流行程度最近又重新抬头。它被认为是一种高效的算法,现代的实现利用专门的gpu来进一步提高性能。
历史
反向传播是在20世纪70年代发明的一种通用优化方法,用于执行复杂嵌套函数的自动微分。然而,直到1986年Rumelhart、Hinton和Williams发表了一篇题为“通过反向传播错误学习表示”的论文,该算法的重要性才得到机器学习社区的普遍认可。
长期以来,研究人员一直对寻找一种训练多层人工神经网络的方法感兴趣,这种方法可以自动发现良好的“内部表征”,即使学习更容易、更准确的特征。特征可以被认为是激活特定节点(即使其输出接近1的正值)的老套输入。由于节点的激活依赖于其传入的权值和偏差,研究人员表示,如果一个节点的权重和偏差导致该节点在该特征出现在其输入中时激活该特征,那么该节点已经学会了该特征。
到了80年代,手工工程特征已成为许多领域的事实标准,尤其是在计算机视觉,因为专家设有实验(如线,圆边,在计算机视觉斑点)知道做学习简单。然而,手工工程成功的功能需要大量的知识和实践。更重要的是,因为它不是自动的,它通常是非常缓慢的。
反向传播是最早能够证明人工神经网络能够学习良好的内部表示的方法之一,即它们的隐藏层能够学习非平凡特征。研究使用反向传播训练的多层前馈网络的专家实际上发现,许多节点学习的特征与人类专家设计的和研究哺乳动物大脑生物神经网络的神经科学家发现的相似(例如,某些节点学习检测边缘,而其他节点计算Gabor滤波器)。更重要的是,由于算法的效率以及领域专家不再需要发现适当的功能,允许反向传播人工神经网络应用到更广泛的领域问题,以前禁止由于时间和成本的限制。
正式定义
反向传播类似于计算多层前馈网络的delta规则。因此,像增量规则一样,反向传播需要三个条件:
1)
数据集 由输入 - 输出双( x我 ,y我 ), 在哪里x 我 是输入和y 我 输入输入的所需输出x 我 .大小输入输出对的集合N 来标示X ={(x1 ,y1 ),...,(xN ,yN )}.2)一个
.在反向传播中,主要感兴趣的参数是前馈神经网络 ,正如本文中正式定义的<一个href="//www.parkandroid.com/wiki/feedforward-neural-networks/" class="wiki_link" title="前馈神经网络"t一个rget="_blank">前馈神经网络一个>,其参数被集体表示θ. w 我jk,节点之间的权重j 在层里l k和节点我 在层里l k-1, 和b 我k,节点的偏置我 在层里l k.有在同一个层节点之间没有连接和层被完全连接。3)一个
误差函数 ,E (X,θ.),它定义了所需输出之间的误差y 我 和所计算的输出y 我 ^上输入的神经网络的x 我 对于一组输入输出对( x我 ,y我 )∈X和参数的特定值θ. .
用梯度下降法训练神经网络需要计算误差函数的梯度
θ.t+1=θ.t-α.∂θ.∂E(X,θ.t),
在哪里
目标是什么?
如前一节所述,训练多层前馈神经网络中的一个主要问题在决定如何学习良好的内部表示,即隐藏层节点的权重和偏差应该是什么。与Perceptron不同,该Δtemtra规则用于近似于定义的目标输出,隐藏的层节点没有目标输出,因为它们被用作计算中的中间步骤。
由于隐藏层节点没有目标输出,所以不能简单地定义特定于该节点的错误函数。相反,该节点的任何错误函数将依赖于前一层(因为前一层决定该节点的输入)和后一层的参数值 正式定义 下面的公式是针对一个输出的神经网络,但是通过一致应用链式法则和幂法则,该算法可以应用于任意数量输出的神经网络。因此,对于下面的所有示例,输入-输出对都是这样的形式 记住前馈神经网络的一般配方,
w我jk:节点的重量
传入节点
b我k:偏置节点
一个我k:乘积和加上节点偏压(活化)
o我k:输出节点
rk:层节点数
g:隐藏层节点的激活函数
在经典的反向传播的误差函数是均方误差
E(X,θ.)=2N1我=1σ.N(y我^-y我)2,
在哪里
派生的梯度
反向传播算法的推导相当简单。它是由微分学中链式法则和乘积法则的应用得出的。这些规则的应用依赖于激活函数的微分,这是不使用粗阶跃函数的原因之一(是不连续的,因此不可微)。
预赛
在本节的其余部分,函数的衍生物
为了进一步简化数学,偏差
w0我k=b我k.
要知道这与原始公式是等价的,请注意
一个我k=b我k+j=1σ.rk-1wj我kojk-1=j=0σ.rk-1wj我kojk-1,
左边是原配方,右边是新配方。
使用上面,反向传播的尝试相对于神经网络的权重最小化以下误差函数的符号:
E(X,θ.)=2N1我=1σ.N(y我^-y我)2
通过计算,对于每一个重
∂w我jk∂E(X,θ.)=N1d=1σ.N∂w我jk∂(21(yd^-yd)2)=N1d=1σ.N∂w我jk∂Ed.
因此,推导的目的,BP算法将涉及本身仅具有一个输入 - 输出对。一旦这被导出,在所有的输入 - 输出对的一般形式
E=21(y^-y)2,
其中,下标
误差函数导数
BackPropagation算法的推导通过将链规则应用于误差函数部分导数来开始
∂w我jk∂E=∂一个jk∂E∂w我jk∂一个jk,
在哪里
第一项通常被称为
δ.jk≡∂一个jk∂E.
第二项可由式求出
∂w我jk∂一个jk=∂w我jk∂(l=0σ.rk-1wljkolk-1)=o我k-1.
因此,误差函数的部分导数
∂w我jk∂E=δ.jko我k-1.
因此,权重的偏导数是误差项的积
的是要注意重要的是,上述的偏导数都被没有任何考虑一个特定的误差函数或激活函数的计算。然而,由于误差项
所述误差的计算
输出层
从最后一层开始,反向传播尝试定义值
E=21(y^-y)2=21(go(一个1米)-y)2,
在哪里
因此,应用部分导数和使用链规则给出
δ.1米=(g0(一个1米)-y)go”(一个1米)=(y^-y)go”(一个1米).
将其放在一起,误差函数的部分导数
∂w我1米∂E=δ.1米o我米-1=(y^-y)go”(一个1米)o我米-1.
隐藏层
现在的问题是如何计算比输出层以外的层的偏导数。幸运的是,对于多元函数的链式法则就派上用场了一次。观察的误差项下列公式
δ.jk=∂一个jk∂E=l=1σ.rk+1∂一个lk+1∂E∂一个jk∂一个lk+1,
在哪里
代入错误项
δ.jk=l=1σ.rk+1δ.lk+1∂一个jk∂一个lk+1.
记住的定义
一个lk+1=j=1σ.rkwjlk+1g(一个jk),
在哪里
∂一个jk∂一个lk+1=wjlk+1g”(一个jk).
将其代入上面的方程,得到误差项的最终方程
δ.jk=l=1σ.rk+1δ.lk+1wjlk+1g”(一个jk)=g”(一个jk)l=1σ.rk+1wjlk+1δ.lk+1.
将其放在一起,误差函数的部分导数
∂w我jk∂E=δ.jko我k-1=g”(一个jk)o我k-1l=1σ.rk+1wjlk+1δ.lk+1. 反向传播作为反向计算 此等式是BackProjagation获取其名称的位置。即,错误 这种倒退的错误的传播是非常相似的,计算神经网络的输出正向计算。因此,计算输出通常被称为 此外,因为用于向后相位的计算依赖于激活
反向传播算法
使用标题为标题的正式定义的部分中定义的术语和在标题为渐变的部分中导出的方程式,BackProjagation算法取决于以下五个方程:
对于部分的衍生物,
∂w我jk∂Ed=δ.jko我k-1.
对于最终图层的错误术语,
δ.1米=go”(一个1米)(yd^-yd).
对于隐藏的图层错误术语,
δ.jk=g”(一个jk)l=1σ.rk+1wjlk+1δ.lk+1.
用于组合每个输入输出对的部分衍生工具,
∂w我jk∂E(X,θ.)=N1d=1σ.N∂w我jk∂(21(yd^-yd)2)=N1d=1σ.N∂w我jk∂Ed.
更新权重,
δ.w我jk=-α.∂w我jk∂E(X,θ.).
一般的算法
反向传播算法进行在下面的步骤,假定合适的学习速率
1)
计算正相位 对于每个输入输出对( xd ,yd)并存储结果y d^,一个 jk, 和o jk为每个节点j 在层里k 通过从图层进行0 ,输入层,到图层米 ,输出层。2)
计算落后阶段 对于每个输入输出对( xd ,yd)并存储结果∂ w我jk∂Ed对于每种重量w 我jk连接节点我 在层里k -1节点j 在层里k 通过从图层进行米 ,输出层,到图层1 中,输入层。a)评估最后一层的误差项
δ. 1米通过使用第二方程。b)反向传播隐藏层的错误项 k,从最终隐藏层向后工作δ. jk =米-1,通过反复使用第三个方程。c)求个别误差的偏导数 E d关于w 我jk通过使用第一个等式。3)
结合各个梯度 对于每个输入输出对∂ w我jk∂Ed得到总的梯度∂ w我jk∂E(X,θ.)对于整个输入输出对X ={(x1 ,y1),...,(xN ,yN)}通过使用第四个方程(单个梯度的简单平均值)。4)
和总渐变更新权重 根据学习速率α. ∂ w我jk∂E(X,θ.)通过使用第五方程(负梯度的方向移动)。
Sigmoidal神经网络中的BackProjagation
经典的BP算法是专为回归问题与S形激活单位。而反向传播可应用于分类问题以及网络与非S形激活函数,S形函数具有方便的数学性质,当与适当的输出激活函数相结合,大大简化了算法的理解。因此,在经典制剂,隐藏节点的激活函数是S形 由于其方便的衍生物,BackPropagation实际上是历史使用术语中的主要动机因素:
g”(x)=∂x∂σ.(x)=σ.(x)(1-σ.(x)). 因此,在计算S形函数的导数需要无非记住输出 此外,输出激活函数的导数也很简单:
go”(x)=∂x∂go(x)=∂x∂x=1. 因此,使用这两个激活函数删除需要记住激活值的需要 因此,对于具有S形隐藏单元和身份输出单元的前馈神经网络,误差项方程如下:
对于最终图层的错误术语,
δ.1米=yd^-yd. 对于隐藏的图层错误术语,
δ.jk=ojk(1-ojk)l=1σ.rk+1wjlk+1δ.lk+1. 代码示例 下面的代码示例为S形神经网络作为在前面的小节中描述。它有一个隐含层和输出层一个输出节点。该代码是写在Python3,并就执行矩阵数学大量使用NumPy的库。因为梯度为个别的输入 - 输出对的计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 5051 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
进口numpy的作为NP.#定义函数defsigmoid.(x,衍生物=假):如果(衍生物==.真的):返回sigmoid.(x,衍生物=假)*(1-sigmoid.(x,衍生物=假))其他的:返回1/(1+NP..exp.(-x))#选择可重复结果的随机种子NP..随机.种子(1)#学习率α=.1#隐藏层中的节点数num_hidden.=3.#输入X=NP..大批([[0,0,1],[0,1,1],[1,0,0],[1,1,0],[1,0,1],[1,1,1],])#输出t是x的转置,使它成为列向量y=NP..大批([[0,1,0,1,1,0]]).T#随机用平均值0和范围初始化权重[-1,1]在权矩阵的第1维中+1表示偏置权Hidden_weights.=2*NP..随机.随机((X.形状[1]+1,num_hidden.))-1output_weights=2*NP..随机.随机((num_hidden.+1,y.形状[1]))-1#梯度下降的迭代次数num_念堂=10000#为梯度下降每次迭代为我在范围(num_念堂):#发展阶段#np.hstack((np.ones(...),X)增加了1的固定输入偏置重量input_layer_outputs=NP..hstack((NP..那些((X.形状[0],