神经网络--反向传播算法推导

神经网络–反向传播算法推导

文章目录

  • 神经网络--反向传播算法推导
    • 概述
    • 神经网络模型
    • 反向传导算法

概述

以监督学习为例,假设我们有训练样本集 ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)),那么神经网络算法能提供一种复杂且非线性的假设模型 h ( W , b ) ( x ) h_{(W,b)}(x) h(W,b)(x),它具有参数 W W W b b b,可以以此参数来拟合我们的数据。

为了描述神经网络,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示:

这个神经元是一个以 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3以及截距+1为输入值的运算单元,其输出为 h ( W , b ) ( x ) = f ( W T x ) = f ( ∑ i = 1 3 W i X i + b ) h_{(W,b)}(x)=f(W^Tx)=f(\overset{3}{\underset{i=1}{\sum}}W_iX_i+b) h(W,b)(x)=f(WTx)=f(i=13WiXi+b),其中函数 f : R → R f:\mathbb{R}\to\mathbb{R} f:RR被称为激活函数

我们选用 s i g m o i d sigmoid sigmoid函数为激活函数
f ( z ) = 1 1 + e − z f(z)=\frac{1}{1+e^{-z}} f(z)=1+ez1

可以看出,这个单一“神经元”的输入-输出映射关系其实就是一个逻辑回归(logistic regression)。

我们采用 s i g m o i d sigmoid sigmoid函数

其中 f ′ ( z ) = f ( z ) ( 1 − f ( z ) ) f'(z)=f(z)(1-f(z)) f(z)=f(z)(1f(z)),如果是 t a n h tanh tanh函数,则 f ′ ( z ) = 1 − ( f ( z ) ) 2 f'(z)=1-(f(z))^2 f(z)=1(f(z))2

神经网络模型

所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入。例如,下图就是一个简单的神经网络:

我们使用圆圈来表示神经网络的输入,标上“+1”的圆圈被称为偏置节点,也就是截距项。神经网络最左边的一层叫做输入层,最右的一层叫做输出层(本例中,输出层只有一个节点)。中间所有节点组成的一层叫做隐藏层,因为我们不能在训练样本集中观测到它们的值。同时可以看到,以上神经网络的例子中有3个输入单元(偏置单元不计在内),3个隐藏单元及一个输出单元

我们用 n l n_l nl来表示网络的层数,本例中 n l = 3 \textstyle n_l=3 nl=3 ,我们将第 l \textstyle l l 层记为 L l \textstyle L_l Ll ,于是 L 1 \textstyle L_1 L1 是输入层,输出层是 L n l \textstyle L_{n_l} Lnl 。本例神经网络有参数 ( W , b ) = ( W ( 1 ) , b ( 1 ) , W ( 2 ) , b ( 2 ) ) \textstyle (W,b) = (W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)}) (W,b)=(W(1),b(1),W(2),b(2)) ,其中 W i j ( l ) \textstyle W^{(l)}_{ij} Wij(l)(下面的式子中用到)是第 l \textstyle l l 层第 j \textstyle j j 单元与第 l + 1 \textstyle l+1 l+1 层第 l + 1 \textstyle l+1 l+1 单元之间的联接参数(其实就是连接线上的权重,注意标号顺序), b i ( l ) \textstyle b^{(l)}_i bi(l) 是第 l + 1 \textstyle l+1 l+1 层第 \textstyle i 单元的偏置项。因此在本例中, W ( 1 ) ∈ ℜ 3 × 3 \textstyle W^{(1)} \in \Re^{3\times 3} W(1)3×3 W ( 2 ) ∈ ℜ 1 × 3 \textstyle W^{(2)} \in \Re^{1\times 3} W(2)1×3 。注意,没有其他单元连向偏置单元(即偏置单元没有输入),因为它们总是输出 + 1 \textstyle +1 +1。同时,我们用 s l \textstyle s_l sl 表示第 l \textstyle l l 层的节点数(偏置单元不计在内)。

我们用 a i ( l ) \textstyle a^{(l)}_i ai(l) 表示第 l \textstyle l l层第 i \textstyle i i 单元的激活值(输出值)。当 l = 1 \textstyle l=1 l=1 时,$ \textstyle a^{(1)}_i = x_i $,也就是第 i \textstyle i i 个输入值(输入值的第 \textstyle i 个特征)。对于给定参数集合 ! W , b \textstyle W,b W,b,我们的神经网络就可以按照函数 h W , b ( x ) \textstyle h_{W,b}(x) hW,b(x) 来计算输出结果。本例神经网络的计算步骤如下:
a 1 ( 2 ) = f ( W 11 ( 1 ) x 1 + W 12 ( 1 ) x 2 + W 13 ( 1 ) x 3 + b 1 ( 1 ) ) a 1 ( 2 ) = f ( W 21 ( 1 ) x 1 + W 22 ( 1 ) x 2 + W 23 ( 1 ) x 3 + b 1 ( 1 ) ) a 1 ( 2 ) = f ( W 31 ( 1 ) x 1 + W 32 ( 1 ) x 2 + W 33 ( 1 ) x 3 + b 1 ( 1 ) ) h W , b ( x ) = a 1 ( 3 ) = f ( W 11 ( 2 ) a 1 ( 2 ) + W 12 ( 2 ) a 2 ( 2 ) + W 13 ( 2 ) a 3 ( 2 ) + b 1 ( 2 ) ) a_1^{(2)}=f(W_{11}^{(1)}x_1+W_{12}^{(1)}x_2+W_{13}^{(1)}x_3+b_1^{(1)})\\ a_1^{(2)}=f(W_{21}^{(1)}x_1+W_{22}^{(1)}x_2+W_{23}^{(1)}x_3+b_1^{(1)})\\ a_1^{(2)}=f(W_{31}^{(1)}x_1+W_{32}^{(1)}x_2+W_{33}^{(1)}x_3+b_1^{(1)})\\ h_{W,b}(x)=a_1^{(3)}=f(W_{11}^{(2)}a_1^{(2)}+W_{12}^{(2)}a_2^{(2)}+W_{13}^{(2)}a_3^{(2)}+b_1^{(2)}) a1(2)=f(W11(1)x1+W12(1)x2+W13(1)x3+b1(1))a1(2)=f(W21(1)x1+W22(1)x2+W23(1)x3+b1(1))a1(2)=f(W31(1)x1+W32(1)x2+W33(1)x3+b1(1))hW,b(x)=a1(3)=f(W11(2)a1(2)+W12(2)a2(2)+W13(2)a3(2)+b1(2))

我们用 z i ( l ) \textstyle z^{(l)}_i zi(l) 表示第 l \textstyle l l 层第 i \textstyle i i 单元输入加权和(包括偏置单元),比如, z i ( 2 ) = ∑ j = 1 n W i j ( 1 ) x j + b i ( 1 ) \textstyle z_i^{(2)} = \sum_{j=1}^n W^{(1)}_{ij} x_j + b^{(1)}_i zi(2)=j=1nWij(1)xj+bi(1) ,则 a i ( l ) = f ( z i ( l ) ) \textstyle a^{(l)}_i = f(z^{(l)}_i) ai(l)=f(zi(l))

这样我们就可以得到一种更简洁的表示法。这里我们将激活函数 f ( ⋅ ) \textstyle f(\cdot) f() 扩展为用向量(分量的形式)来表示,即 f ( [ z 1 , z 2 , z 3 ] ) = [ f ( z 1 ) , f ( z 2 ) , f ( z 3 ) ] \textstyle f([z_1, z_2, z_3]) = [f(z_1), f(z_2), f(z_3)] f([z1,z2,z3])=[f(z1),f(z2),f(z3)],那么,上面的等式可以更简洁地表示为:
z ( 2 ) = W ( 1 ) x + b ( 1 ) a ( 2 ) = f ( z ( 2 ) ) z ( 3 ) = W ( 2 ) x + b ( 2 ) h W , b ( x ) = a ( 3 ) = f ( z ( 3 ) ) z^{(2)}=W^{(1)}x+b^{(1)}\\ a^{(2)}=f(z^{(2)})\\ z^{(3)}=W^{(2)}x+b^{(2)}\\ h_{W,b}(x)=a^{(3)}=f(z^{(3)}) z(2)=W(1)x+b(1)a(2)=f(z(2))z(3)=W(2)x+b(2)hW,b(x)=a(3)=f(z(3))
我们将上面的计算步骤叫作前向传播。回想一下,之前我们用 a ( 1 ) = x \textstyle a^{(1)} = x a(1)=x 表示输入层的激活值,那么给定第 l \textstyle l l的激活值 a ( l ) \textstyle a^{(l)} a(l) 后,第 l + 1 \textstyle l+1 l+1 层的激活值 a ( l + 1 ) \textstyle a^{(l+1)} a(l+1) 就可以按照下面步骤计算得到:
z ( l + 1 ) = W ( l ) a ( l ) + b ( l ) a ( l + 1 ) = f ( z ( l + 1 ) ) z^{(l+1)}=W^{(l)}a^{(l)}+b^{(l)}\\ a^{(l+1)}=f(z^{(l+1)}) z(l+1)=W(l)a(l)+b(l)a(l+1)=f(z(l+1))
将参数矩阵化,使用矩阵-向量运算方式,我们就可以利用线性代数的优势对神经网络进行快速求解。

目前为止,我们讨论了一种神经网络,我们也可以构建另一种结构的神经网络(这里结构指的是神经元之间的联接模式),也就是包含多个隐藏层的神经网络。最常见的一个例子是 n l \textstyle n_l nl 层的神经网络,第 1 \textstyle 1 1 层是输入层,第 n l \textstyle n_l nl 层是输出层,中间的每个层 l \textstyle l l 与层 l + 1 \textstyle l+1 l+1 紧密相联。这种模式下,要计算神经网络的输出结果,我们可以按照之前描述的等式,按部就班,进行前向传播,逐一计算第 L 2 \textstyle L_2 L2 层的所有激活值,然后是第 L 3 \textstyle L_3 L3 层的激活值,以此类推,直到第 L n l \textstyle L_{n_l} Lnl层。这是一个前馈神经网络的例子,因为这种联接图没有闭环或回路。

神经网络也可以有多个输出单元。比如,下面的神经网络有两层隐藏层: L 2 \textstyle L_2 L2 L 3 \textstyle L_3 L3 ,输出层 L 4 \textstyle L_4 L4 有两个输出单元。

要求解这样的神经网络,需要样本集 ( x ( i ) , y ( i ) ) \textstyle (x^{(i)}, y^{(i)}) (x(i),y(i)) ,其中 y ( i ) ∈ ℜ 2 \textstyle y^{(i)} \in \Re^2 y(i)2 。如果你想预测的输出是多个的,那这种神经网络很适用。(比如,在医疗诊断应用中,患者的体征指标就可以作为向量的输入值,而不同的输出值 \textstyle y_i 可以表示不同的疾病存在与否。)

反向传导算法

假设我们有一个固定样本集 { ( x ( 1 ) , y ( 1 ) ) , … , ( x ( m ) , y ( m ) ) } \textstyle \{ (x^{(1)}, y^{(1)}), \ldots, (x^{(m)}, y^{(m)}) \} {(x(1),y(1)),,(x(m),y(m))},它包含 m \textstyle m m 个样例。我们可以用批量梯度下降法来求解神经网络。具体来讲,对于单个样例 ( x , y ) \textstyle (x,y) (x,y)),其代价函数为:
J ( W , b ; x , y ) = 1 2 ∥ h W , b ( x ) − y ∥ 2 . \begin{align}J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.\end{align} J(W,b;x,y)=21hW,b(x)y2.
这是一个(二分之一的)方差代价函数。给定一个包含 m \textstyle m m 个样例的数据集,我们可以定义整体代价函数为:
J ( W , b ) = [ 1 m ∑ i = 1 m J ( W , b ; x ( i ) , y ( i ) ) ] + λ 2 ∑ l = 1 n l − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( W j i ( l ) ) 2 = [ 1 m ∑ i = 1 m ( 1 2 ∥ h W , b ( x ( i ) ) − y ( i ) ∥ 2 ) ] + λ 2 ∑ l = 1 n l − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( W j i ( l ) ) 2 \begin{align}J(W,b)&= \left[ \frac{1}{m} \sum_{i=1}^m J(W,b;x^{(i)},y^{(i)}) \right] + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2 \\&= \left[ \frac{1}{m} \sum_{i=1}^m \left( \frac{1}{2} \left\| h_{W,b}(x^{(i)}) - y^{(i)} \right\|^2 \right) \right] + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2\end{align} J(W,b)=[m1i=1mJ(W,b;x(i),y(i))]+2λl=1nl1i=1slj=1sl+1(Wji(l))2=[m1i=1m(21 hW,b(x(i))y(i) 2)]+2λl=1nl1i=1slj=1sl+1(Wji(l))2
以上关于 J ( W , b ) \textstyle J(W,b) J(W,b)定义中的第一项是一个均方差项。第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合。

[注:通常权重衰减的计算并不使用偏置项 b i ( l ) \textstyle b^{(l)}_i bi(l),比如我们在 J ( W , b ) \textstyle J(W, b) J(W,b) 的定义中就没有使用。一般来说,将偏置项包含在权重衰减项中只会对最终的神经网络产生很小的影响。在贝叶斯规则化方法中,我们将高斯先验概率引入到参数中计算MAP(极大后验)估计(而不是极大似然估计)。]

权重衰减参数 λ \textstyle \lambda λ 用于控制公式中两项的相对重要性。在此重申一下这两个复杂函数的含义: J ( W , b ; x , y ) \textstyle J(W,b;x,y) J(W,b;x,y) 是针对单个样例计算得到的方差代价函数; J ( W , b ) \textstyle J(W,b) J(W,b) 是整体样本代价函数,它包含权重衰减项。

以上的代价函数经常被用于分类和回归问题。在分类问题中,我们用 y = 0 \textstyle y = 0 y=0 1 \textstyle 1 1,来代表两种类型的标签(回想一下,这是因为 sigmoid激活函数的值域为 ! [ 0 , 1 ] \textstyle [0,1] [0,1];如果我们使用双曲正切型激活函数,那么应该选用 − 1 \textstyle -1 1 + 1 \textstyle +1 +1 作为标签)。对于回归问题,我们首先要变换输出值域(也就是 y y y),以保证其范围为 [ 0 , 1 ] \textstyle [0,1] [0,1] (同样地,如果我们使用双曲正切型激活函数,要使输出值域为 [ − 1 , 1 ] \textstyle [-1,1] [1,1])。

我们的目标是针对参数 W \textstyle W W b \textstyle b b 来求其函数 J ( W , b ) \textstyle J(W,b) J(W,b) 的最小值。为了求解神经网络,我们需要将每一个参数 W i j ( l ) \textstyle W^{(l)}_{ij} Wij(l) b i ( l ) \textstyle b^{(l)}_i bi(l) 初始化为一个很小的、接近零的随机值(比如说,使用正态分布 N o r m a l ( 0 , ϵ 2 ) \textstyle {Normal}(0,\epsilon^2) Normal(0,ϵ2) 生成的随机值,其中 ϵ \textstyle \epsilon ϵ 设置为 0.01 \textstyle 0.01 0.01 ),之后对目标函数使用诸如批量梯度下降法的最优化算法。因为 J ( W , b ) \textstyle J(W, b) J(W,b) 是一个非凸函数,梯度下降法很可能会收敛到局部最优解;但是在实际应用中,梯度下降法通常能得到令人满意的结果。最后,需要再次强调的是,要将参数进行随机初始化,而不是全部置为 0 \textstyle 0 0。如果所有参数都用相同的值作为初始值,那么所有隐藏层单元最终会得到与输入值有关的、相同的函数(也就是说,对于所有 i \textstyle i i W i j ( 1 ) \textstyle W^{(1)}_{ij} Wij(1)都会取相同的值,那么对于任何输入 x \textstyle x x 都会有: a 1 ( 2 ) = a 2 ( 2 ) = a 3 ( 2 ) = … \textstyle a^{(2)}_1 = a^{(2)}_2 = a^{(2)}_3 = \ldots a1(2)=a2(2)=a3(2)= )。随机初始化的目的是使对称失效

梯度下降法中每一次迭代都按照如下公式对参数 W \textstyle W W b \textstyle b b 进行更新:
W i j ( l ) = W i j ( l ) − α ∂ ∂ W i j ( l ) J ( W , b ) b i ( l ) = b i ( l ) − α ∂ ∂ b i ( l ) J ( W , b ) \begin{align}W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) \\b_{i}^{(l)} &= b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(W,b)\end{align} Wij(l)bi(l)=Wij(l)αWij(l)J(W,b)=bi(l)αbi(l)J(W,b)
其中 α \textstyle \alpha α 是学习速率。其中关键步骤是计算偏导数。我们现在来讲一下反向传播算法,它是计算偏导数的一种有效方法。

我们首先来讲一下如何使用反向传播算法来计算 ∂ ∂ W i j ( l ) J ( W , b ; x , y ) \textstyle \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) Wij(l)J(W,b;x,y) ∂ ∂ b i ( l ) J ( W , b ; x , y ) \textstyle \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) bi(l)J(W,b;x,y),这两项是单个样例 ( x , y ) \textstyle (x,y) (x,y) 的代价函数 J ( W , b ; x , y ) \textstyle J(W,b;x,y) J(W,b;x,y) 的偏导数。一旦我们求出该偏导数,就可以推导出整体代价函数 J ( W , b ) \textstyle J(W,b) J(W,b)的偏导数:

∂ ∂ W i j ( l ) J ( W , b ) = [ 1 m ∑ i = 1 m ∂ ∂ W i j ( l ) J ( W , b ; x ( i ) , y ( i ) ) ] + λ W i j ( l ) ∂ ∂ b i ( l ) J ( W , b ) = 1 m ∑ i = 1 m ∂ ∂ b i ( l ) J ( W , b ; x ( i ) , y ( i ) ) \begin{align}\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) &=\left[ \frac{1}{m} \sum_{i=1}^m \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x^{(i)}, y^{(i)}) \right] + \lambda W_{ij}^{(l)} \\\frac{\partial}{\partial b_{i}^{(l)}} J(W,b) &=\frac{1}{m}\sum_{i=1}^m \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x^{(i)}, y^{(i)})\end{align} Wij(l)J(W,b)bi(l)J(W,b)=[m1i=1mWij(l)J(W,b;x(i),y(i))]+λWij(l)=m1i=1mbi(l)J(W,b;x(i),y(i))

以上两行公式稍有不同,第一行比第二行多出一项,是因为权重衰减是作用于 W \textstyle W W 而不是 b \textstyle b b

反向传播算法的思路如下:给定一个样例 ( x , y ) \textstyle (x,y) (x,y),我们首先进行“前向传导”运算,计算出网络中所有的激活值,包括 h W , b ( x ) \textstyle h_{W,b}(x) hW,b(x) 的输出值。之后,针对第 l \textstyle l l 层的每一个节点 i \textstyle i i,我们计算出其“残差” δ i ( l ) \textstyle \delta^{(l)}_i δi(l),该残差表明了该节点对最终输出值的残差产生了多少影响。对于最终的输出节点,我们可以直接算出网络产生的激活值与实际值之间的差距,我们将这个差距定义为 δ i ( n l ) \textstyle \delta^{(n_l)}_i δi(nl) (第 n l \textstyle n_l nl 层表示输出层)。对于隐藏单元我们如何处理呢?我们将基于节点(第 l + 1 \textstyle l+1 l+1 层节点)残差的加权平均值计算 δ i ( l ) \textstyle \delta^{(l)}_i δi(l),这些节点以 a i ( l ) \textstyle a^{(l)}_i ai(l) 作为输入。下面将给出反向传导算法的细节:

  1. 进行前馈传导计算,利用前向传导公式,得到 L 2 , L 3 , … \textstyle L_2, L_3, \ldots L2,L3, 直到输出层 L n l \textstyle L_{n_l} Lnl 的激活值。

  2. 对于第 n l n_l nl(输出层)的每个输出单元 i i i我们根据以下公式计算残差:

    δ i ( n l ) = ∂ ∂ z i n l J ( W , b ; x , y ) = ∂ ∂ z i n l 1 2 ∥ y − h W , b ( x ) ∥ 2 = ∂ ∂ z i n l 1 2 ∑ j = 1 S n l ( y j − a j ( n l ) ) 2 = ∂ ∂ z i n l 1 2 ∑ j = 1 S n l ( y j − f ( z j ( n l ) ) ) 2 = − ( y i − f ( z i ( n l ) ) ) ⋅ f ′ ( z i ( n l ) ) = − ( y i − a i ( n l ) ) ⋅ f ′ ( z i ( n l ) ) \begin{align}\delta^{(n_l)}_i &= \frac{\partial}{\partial z^{n_l}_i}J(W,b;x,y) = \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 \\ &= \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \sum_{j=1}^{S_{n_l}} (y_j-a_j^{(n_l)})^2 = \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \sum_{j=1}^{S_{n_l}} (y_j-f(z_j^{(n_l)}))^2 \\ &= - (y_i - f(z_i^{(n_l)})) \cdot f'(z^{(n_l)}_i) = - (y_i - a^{(n_l)}_i) \cdot f'(z^{(n_l)}_i)\end{align} δi(nl)=zinlJ(W,b;x,y)=zinl21yhW,b(x)2=zinl21j=1Snl(yjaj(nl))2=zinl21j=1Snl(yjf(zj(nl)))2=(yif(zi(nl)))f(zi(nl))=(yiai(nl))f(zi(nl))

  3. l = n l − 1 , n l − 2 , n l − 3 , … , 2 \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2 l=nl1,nl2,nl3,,2 的各个层,第 l \textstyle l l层的第 i \textstyle i i 个节点的残差计算方法如下:

δ i ( n l ) = ( ∑ j = 1 s l + 1 W j i ( l ) δ j ( l + 1 ) ) f ′ ( z i ( l ) ) \delta_i^{(n_l)}=(\overset{s_{l+1}}{\underset{j=1}{\sum}}W_{ji}^{(l)}\delta_j^{(l+1)})f'(z_i^{(l)}) δi(nl)=(j=1sl+1Wji(l)δj(l+1))f(zi(l))

δ i ( n l − 1 ) = ∂ ∂ z i n l − 1 J ( W , b ; x , y ) = ∂ ∂ z i n l − 1 1 2 ∥ y − h W , b ( x ) ∥ 2 = ∂ ∂ z i n l − 1 1 2 ∑ j = 1 S n l ( y j − a j ( n l ) ) 2 = 1 2 ∑ j = 1 S n l ∂ ∂ z i n l − 1 ( y j − a j ( n l ) ) 2 = 1 2 ∑ j = 1 S n l ∂ ∂ z i n l − 1 ( y j − f ( z j ( n l ) ) ) 2 = ∑ j = 1 S n l − ( y j − f ( z j ( n l ) ) ) ⋅ ∂ ∂ z i ( n l − 1 ) f ( z j ( n l ) ) = ∑ j = 1 S n l − ( y j − f ( z j ( n l ) ) ) ⋅ f ′ ( z j ( n l ) ) ⋅ ∂ z j ( n l ) ∂ z i ( n l − 1 ) = ∑ j = 1 S n l δ j ( n l ) ⋅ ∂ z j ( n l ) ∂ z i n l − 1 = ∑ j = 1 S n l ( δ j ( n l ) ⋅ ∂ ∂ z i n l − 1 ∑ k = 1 S n l − 1 f ( z k n l − 1 ) ⋅ W j k n l − 1 ) = ∑ j = 1 S n l δ j ( n l ) ⋅ W j i n l − 1 ⋅ f ′ ( z i n l − 1 ) = ( ∑ j = 1 S n l W j i n l − 1 δ j ( n l ) ) f ′ ( z i n l − 1 ) \begin{align}\delta^{(n_l-1)}_i &=\frac{\partial}{\partial z^{n_l-1}_i}J(W,b;x,y) = \frac{\partial}{\partial z^{n_l-1}_i}\frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 = \frac{\partial}{\partial z^{n_l-1}_i}\frac{1}{2} \sum_{j=1}^{S_{n_l}}(y_j-a_j^{(n_l)})^2 \\&= \frac{1}{2} \sum_{j=1}^{S_{n_l}}\frac{\partial}{\partial z^{n_l-1}_i}(y_j-a_j^{(n_l)})^2 = \frac{1}{2} \sum_{j=1}^{S_{n_l}}\frac{\partial}{\partial z^{n_l-1}_i}(y_j-f(z_j^{(n_l)}))^2 \\&= \sum_{j=1}^{S_{n_l}}-(y_j-f(z_j^{(n_l)})) \cdot \frac{\partial}{\partial z_i^{(n_l-1)}}f(z_j^{(n_l)}) = \sum_{j=1}^{S_{n_l}}-(y_j-f(z_j^{(n_l)})) \cdot f'(z_j^{(n_l)}) \cdot \frac{\partial z_j^{(n_l)}}{\partial z_i^{(n_l-1)}} \\&= \sum_{j=1}^{S_{n_l}} \delta_j^{(n_l)} \cdot \frac{\partial z_j^{(n_l)}}{\partial z_i^{n_l-1}} = \sum_{j=1}^{S_{n_l}} \left(\delta_j^{(n_l)} \cdot \frac{\partial}{\partial z_i^{n_l-1}}\sum_{k=1}^{S_{n_l-1}}f(z_k^{n_l-1}) \cdot W_{jk}^{n_l-1}\right) \\&= \sum_{j=1}^{S_{n_l}} \delta_j^{(n_l)} \cdot W_{ji}^{n_l-1} \cdot f'(z_i^{n_l-1}) = \left(\sum_{j=1}^{S_{n_l}}W_{ji}^{n_l-1}\delta_j^{(n_l)}\right)f'(z_i^{n_l-1})\end{align} δi(nl1)=zinl1J(W,b;x,y)=zinl121yhW,b(x)2=zinl121j=1Snl(yjaj(nl))2=21j=1Snlzinl1(yjaj(nl))2=21j=1Snlzinl1(yjf(zj(nl)))2=j=1Snl(yjf(zj(nl)))zi(nl1)f(zj(nl))=j=1Snl(yjf(zj(nl)))f(zj(nl))zi(nl1)zj(nl)=j=1Snlδj(nl)zinl1zj(nl)=j=1Snl δj(nl)zinl1k=1Snl1f(zknl1)Wjknl1 =j=1Snlδj(nl)Wjinl1f(zinl1)= j=1SnlWjinl1δj(nl) f(zinl1)

将上式中的 n l − 1 \textstyle n_l-1 nl1 n l \textstyle n_l nl的关系替换为 l \textstyle l l l + 1 \textstyle l+1 l+1的关系,就可以得到:
δ i ( l ) = ( ∑ j = 1 s l + 1 W j i ( l ) δ j ( l + 1 ) ) f ′ ( z i ( l ) ) \delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i) δi(l)=(j=1sl+1Wji(l)δj(l+1))f(zi(l))
以上逐次从后向前求导的过程即为“反向传导”的本意所在。

​4.计算我们需要的偏导数,计算方法如下 :
∂ ∂ W i j ( l ) J ( W , b ; x , y ) = a j ( l ) δ i ( l + 1 ) ∂ ∂ b i ( l ) J ( W , b ; x , y ) = δ i ( l + 1 ) . \begin{align}\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) &= a^{(l)}_j \delta_i^{(l+1)} \\\frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) &= \delta_i^{(l+1)}.\end{align}\\ Wij(l)J(W,b;x,y)bi(l)J(W,b;x,y)=aj(l)δi(l+1)=δi(l+1).
KaTeX parse error: {align} can be used only in display mode.?
∂ ∂ W i j ( l ) J ( W ) = ∂ ∂ Z i j ( l ) J ( W ) = ∂ J ( W ) ∂ Z i ( l + 1 ) × ∂ Z i ( l + 1 ) ∂ Z i j ( l ) ( 问题拆解 ) Z i ( l + 1 ) = ∑ i n W i j l × a j ( l ) ( 神经元求和 ) ∂ Z i ( l + 1 ) ∂ Z i j ( l ) = ∂ ∑ i n W i j ( l ) × a j ( l ) ∂ W i j ( l ) = a j ( l ) ( 输出对权值的偏导数 ) δ i l + 1 = ∂ J ( W ) ∂ i a l Z i ( l + 1 ) ( 神经元的错误变化率为 ) ∂ ∂ W i ( l ) J ( W ) = δ i l + 1 × a j ( l ) ( 最终 ) \begin{align} \frac{\partial}{\partial W_{ij}^{(l)}} J(W)&=\frac{\partial }{\partial Z_{ij}^{(l)}}J(W)=\frac{\partial J(W)}{\partial Z_{i}^{(l+1)}}\times\frac{\partial Z_{i}^{(l+1)}}{\partial Z_{ij}^{(l)}} &(问题拆解)\\ Z_i^{(l+1)} &= \overset{n}{\underset{i}{\sum}}W_{ij}^{l}\times a_j^{(l)}&(神经元求和)\\ \frac{\partial Z_{i}^{(l+1)}}{\partial Z_{ij}^{(l)}}&=\frac{\partial \overset{n}{\underset{i}{\sum}}W_{ij}^{(l)}\times a_j^{(l)}}{\partial W_{ij}^{(l)}}=a_j^{(l)}&(输出对权值的偏导数)\\ \delta_i^{l+1}&=\frac{\partial J(W)}{\partial ialZ_i^{(l+1)}}&(神经元的错误变化率为)\\ \frac{\partial}{\partial W_i^{(l)}} J(W) &= \delta_i^{l+1}\times a_j^{(l)}&(最终) \end{align} Wij(l)J(W)Zi(l+1)Zij(l)Zi(l+1)δil+1Wi(l)J(W)=Zij(l)J(W)=Zi(l+1)J(W)×Zij(l)Zi(l+1)=inWijl×aj(l)=Wij(l)inWij(l)×aj(l)=aj(l)=ialZi(l+1)J(W)=δil+1×aj(l)(问题拆解)(神经元求和)(输出对权值的偏导数)(神经元的错误变化率为)(最终)
最后,我们用矩阵-向量表示法重写以上算法。我们使用“ ∙ \textstyle \bullet ” 表示向量乘积运算符(在Matlab或Octave里用“.*”表示,也称作阿达马乘积)。若 a = b ∙ c \textstyle a = b \bullet c a=bc,则 a i = b i c i \textstyle a_i = b_ic_i ai=bici。在上一个教程中我们扩展了 f ( ⋅ ) \textstyle f(\cdot) f() 的定义,使其包含向量运算,这里我们也对偏导数 f ′ ( ⋅ ) \textstyle f'(\cdot) f() 也做了同样的处理(于是又有 f ′ ( [ z 1 , z 2 , z 3 ] ) = [ f ′ ( z 1 ) , f ′ ( z 2 ) , f ′ ( z 3 ) ] \textstyle f'([z_1, z_2, z_3]) = [f'(z_1), f'(z_2), f'(z_3)] f([z1,z2,z3])=[f(z1),f(z2),f(z3)] )。

么,反向传播算法可表示为以下几个步骤:

  1. 进行前馈传导计算,利用前向传导公式,得到 L 2 , L 3 , … \textstyle L_2, L_3, \ldots L2,L3,直到输出层 L n l \textstyle L_{n_l} Lnl 的激活值。

  2. 对输出层(第 n l n_l nl层),计算:
    δ ( n l ) = − ( y − a ( n l ) ) ∙ f ′ ( z ( n l ) ) \begin{align}\delta^{(n_l)}= - (y - a^{(n_l)}) \bullet f'(z^{(n_l)})\end{align} δ(nl)=(ya(nl))f(z(nl))

  3. 对于$ \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2$的各层,计算:
    δ ( l ) = ( ( W ( l ) ) T δ ( l + 1 ) ) ∙ f ′ ( z ( l ) ) \begin{align}\delta^{(l)} = \left((W^{(l)})^T \delta^{(l+1)}\right) \bullet f'(z^{(l)})\end{align} δ(l)=((W(l))Tδ(l+1))f(z(l))

  4. 计算最终需要的偏导数值:
    ∇ W ( l ) J ( W , b ; x , y ) = δ ( l + 1 ) ( a ( l ) ) T , ∇ b ( l ) J ( W , b ; x , y ) = δ ( l + 1 ) . \begin{align}\nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\\nabla_{b^{(l)}} J(W,b;x,y) &= \delta^{(l+1)}.\end{align} W(l)J(W,b;x,y)b(l)J(W,b;x,y)=δ(l+1)(a(l))T,=δ(l+1).

**实现中应注意:**在以上的第2步和第3步中,我们需要为每一个 i \textstyle i i 值计算其 f ′ ( z i ( l ) ) \textstyle f'(z^{(l)}_i) f(zi(l))。假设 f ( z ) \textstyle f(z) f(z) 是sigmoid函数,并且我们已经在前向传导运算中得到了 a i ( l ) \textstyle a^{(l)}_i ai(l)。那么,使用我们早先推导出的 ! f ′ ( z ) \textstyle f'(z) f(z)表达式,就可以计算得到 f ′ ( z i ( l ) ) = a i ( l ) ( 1 − a i ( l ) ) \textstyle f'(z^{(l)}_i) = a^{(l)}_i (1- a^{(l)}_i) f(zi(l))=ai(l)(1ai(l))

最后,我们将对梯度下降算法做个全面总结。在下面的伪代码中, Δ W ( l ) \textstyle \Delta W^{(l)} ΔW(l) 是一个与矩阵 W ( l ) \textstyle W^{(l)} W(l) 维度相同的矩阵, Δ b ( l ) \textstyle \Delta b^{(l)} Δb(l) 是一个与 b ( l ) \textstyle b^{(l)} b(l) 维度相同的向量。注意这里“ Δ W ( l ) \textstyle \Delta W^{(l)} ΔW(l)”是一个矩阵,而不是“ Δ \textstyle \Delta Δ W ( l ) \textstyle W^{(l)} W(l) 相乘”。下面,我们实现批量梯度下降法中的一次迭代:

  1. 对于所有 l \textstyle l l,令 Δ W ( l ) : = 0 \textstyle \Delta W^{(l)} := 0 ΔW(l):=0 , Δ b ( l ) : = 0 \textstyle \Delta b^{(l)} := 0 Δb(l):=0 (设置为全零矩阵或全零向量)

  2. 对于 i = 1 i=1 i=1 m m m

    1. 使用反向传播算法计算 ∇ W ( l ) J ( W , b ; x , y ) \textstyle \nabla_{W^{(l)}} J(W,b;x,y) W(l)J(W,b;x,y) ∇ b ( l ) J ( W , b ; x , y ) \textstyle \nabla_{b^{(l)}} J(W,b;x,y) b(l)J(W,b;x,y)
    2. 计算 Δ W ( l ) : = Δ W ( l ) + ∇ W ( l ) J ( W , b ; x , y ) \textstyle \Delta W^{(l)} := \Delta W^{(l)} + \nabla_{W^{(l)}} J(W,b;x,y) ΔW(l):=ΔW(l)+W(l)J(W,b;x,y)
    3. 计算 Δ b ( l ) : = Δ b ( l ) + ∇ b ( l ) J ( W , b ; x , y ) \textstyle \Delta b^{(l)} := \Delta b^{(l)} + \nabla_{b^{(l)}} J(W,b;x,y) Δb(l):=Δb(l)+b(l)J(W,b;x,y)
  3. 更新权重参数

W ( l ) = W ( l ) − α [ ( 1 m Δ W ( l ) ) + λ W ( l ) ] b ( l ) = b ( l ) − α [ 1 m Δ b ( l ) ] \begin{align}W^{(l)} &= W^{(l)} - \alpha \left[ \left(\frac{1}{m} \Delta W^{(l)} \right) + \lambda W^{(l)}\right] \\b^{(l)} &= b^{(l)} - \alpha \left[\frac{1}{m} \Delta b^{(l)}\right]\end{align} W(l)b(l)=W(l)α[(m1ΔW(l))+λW(l)]=b(l)α[m1Δb(l)]

现在,我们可以重复梯度下降法的迭代步骤来减小代价函数 J ( W , b ) \textstyle J(W,b) J(W,b) 的值,进而求解我们的神经网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/616352.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

route路由命令、ip route命令、default默认路由(0.0.0.0 )

文章目录 3. route语法3.1 查看路由表3.1 参数解释 3.2 添加路由记录3.2.1 添加到达单个目标主机的路由3.2.2 添加到达目标网络的路由3.2.3 添加默认路由 3.3 删除路由记录 4. ip route4.1 查看路由4.1.1 不带条件4.1.2 带条件 4.2 添加路由4.3 删除路由4.4 清空路由表&#xf…

elasticsearch7安全配置--最低安全等级,用户名密码

上一篇博客在centos7上安装了elasticsearch7 接下来对elasticsearch进行安全方面的配置 minimal security 最低安全等级,用户名密码 首先开启xpack vim config/elasticsearch.yml xpack.security.enabled: true由于我是单机配置的,还加了如下配置 d…

JavaScript:事件循环机制(同步、异步)(单、多线程)

事件循环机制: 多进程和多线程 1. 进程:程序的一次执行, 它占有一片独有的内存空间 2. 线程: CPU的基本调度单位, 是程序执行的一个完整流程 3. 进程与线程 * 一个进程中一般至少有一个运行的线程: 主线程 * 一个进程中也可以同时运行多个线程, 我们…

ADC的认识

ADC介绍 Q:ADC是什么? A:全称:Analog-to-Digital Converter,指模拟/数字转换器 ADC的性能指标 量程:能测量的电压范围分辨率:ADC能辨别的最小模拟量,通常以输出二进制数的位数表示&#xf…

有限差分法求解一维、二维波动方程

差分格式方法是数值计算方法中微分以及偏微分导数的一种离散化方法。具体来说,它使用相邻两个或者多个数值点的差分来取代偏微分方程中的导数或偏导数。选择差分格式是离散化偏微分方程的第一步,通过这种离散化,我们可以将连续空间区域上的问…

面试通关秘籍:一面到终面的秘密

在当今竞争激烈的职场中,面试已经成为求职者和企业之间互相了解和选择的重要环节。面试过程常常被划分为多个阶段,包括一面(初次面试)、二面(二次面试)、三面(深入面试)以及终面&…

入门:多层感知器Multiple-Layer Perceiver, MLP

本文将简单介绍多层感知器(MLP)的基本概念、原理和应用。MLP是一种前馈人工神经网络,由多层节点组成,每层节点通过权重和偏置与下一层节点相连。MLP在许多领域都有广泛的应用,如分类、回归、自然语言处理等。 本文将分…

Windows不常见问题集

● 解决CACLS 禁止修改计算机名 管理员权限运行cmd:cacls %SystemRoot%\System32\netid.dll /grant administrators:f ● Excel 2010 AltTab組合鍵設置 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer,在該路徑建32字元DWO…

Spring Boot | Spring Boot 整合 “Servlet三大组件“ ( Servlet / Filter / Listene )

目录: Spring Boot 整合 "Servlet三大组件" :1. 使用 "组件注册" 的方式 "整合Servlet三大组件" ( 实际操作为 : 创建自定义的"三大组件"对象 结合刚创建"的自定义组件对象"来 将 XxxRegistrationBean对象 通过…

STM32H7的Cache学习和应用

STM32H7的Cache学习和应用 啥是Cache?Cache的配置配置 Non-cacheable配置 Write through,read allocate,no write allocate配置 Write back,read allocate,no write allocate配置 Write back,read allocate…

电脑端微信截图文字识别功能效率更高了

近期发现微信中的截图文字识别比QQ中的截图文字识别效率高更高,效果更好。 使用方法: 安装电脑端微信客户端:https://weixin.qq.com/(如果没有下载,可以安装一下) 默认截图组合快捷键是:ALTA (使用下来感觉不是很顺手…

【JavaSE进阶】00-基础语法(13-14章) 01-面向对象 02-数组 03-常用类 04-异常处理

13 第十三章 方法覆盖和多态(Polymorphism)★★★★★ 13.1 章节目标与知识框架 13.1.1 章节目标 理解在什么情况下我们需要进行方法覆盖?掌握在满足什么条件的时候构成方法覆盖?什么是多态,代码怎么写?向上转型和向下转型都是…