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

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

文章目录

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

概述

以监督学习为例,假设我们有训练样本集 ( 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) 的值,进而求解我们的神经网络。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL与Redis缓存一致性的实现与挑战

缓存是提高应用性能的重要手段之一,而 MySQL 和 Redis 是两种常用的数据存储和缓存技术。在许多应用中,常常将 Redis 用作缓存层,以加速对数据的访问。然而,在使用 MySQL 和 Redis 组合时,保持缓存与数据库之间的一致性…

【MATLAB源码-第54期】基于白鲸优化算法(WOA)和遗传算法(GA)的栅格地图路径规划最短路径和适应度曲线对比。

操作环境: MATLAB 2022a 1、算法描述 1.白鲸优化算法(WOA): 白鲸优化算法是一种受白鲸捕食行为启发的优化算法。该算法模拟了白鲸群体捕食的策略和行为,用以寻找问题的最优解。其基本思想主要包括以下几点&#xff…

FMEA赋能可穿戴设备:打造安全可靠的未来科技新宠!

在科技日新月异的今天,可穿戴设备已成为我们生活中不可或缺的一部分。它们以其便携性、智能化和个性化的特点,深受消费者喜爱。然而,随着可穿戴设备市场的快速扩张,其安全性和可靠性问题也日益凸显。为了确保产品质量,…

QT常量中有换行符解决方法--使用中文显示乱码或者编译报错

QT6.3常量中有换行符 int ret2QMessageBox::information(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit(("确认启动设备吗?")),QMessageBox::Yes,QMessageBox::No); 确保显示正常,建议每次使用时,中文的前后加一个空…

从零开始写 Docker(十一)---实现 mydocker exec 进入容器内部

本文为从零开始写 Docker 系列第十一篇,实现类似 docker exec 的功能,使得我们能够进入到指定容器内部。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识: 核心原理&…

在线音乐网站的设计与实现

在线音乐网站的设计与实现 摘 要 在社会和互联网的快速发展中,音乐在人们生活中也产生着很大的作用。音乐可以使我们紧张的神经得到放松,有助于开启我们的智慧,可以辅助治疗,达到药物无法达到的效果,所以利用现代科学…

优秀Burp插件 提取JS、HTML中URL插件

Burp Js Url Finder 攻防演练过程中,我们通常会用浏览器访问一些资产,但很多接口/敏感信息隐匿在html、JS文件中,通过该Burp插件我们可以: 1、发现通过某接口可以进行未授权/越权获取到所有的账号密码 2、发现通过某接口可以枚举用…

STM32的GPIO端口的八种模式解析

目录 STM32的GPIO端口的八种模式解析 一、上拉输入模式 二、下拉输入模式 三、浮空输入模式 四、模拟输入模式 五、推挽输出模式 六、开漏输出模式 七、复用推挽输出模式 八、复用开漏输出模式 STM32的GPIO端口的八种模式解析 在学习STM32的过程中,GPIO端口…

【YUV】YUV图像全面详解(一)——格式详解

文章目录 一、前言二、YUV 介绍三、YUV 优点四、YUV 采样格式五、YUV 存储格式六、具体分类详解 一、前言 视频采集芯片输出的码流一般都是 YUV 格式数据流,后续视频处理也是对 YUV 数据流进行编码和解析。所以,了解 YUV 数据流对做视频领域的人而言&am…

【web开发网页制作】html+css家乡长沙旅游网页制作(4页面附源码)

家乡长沙网页制作 涉及知识写在前面一、网页主题二、网页效果Page1、主页Page2、历史长沙Page3、著名人物Page4、留言区 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码HtmlCSS 五、源码获取5.1 获取方式 作者寄语 涉及知识 家乡长沙网页制作&#x…

学习Rust的第5天:控制流

Control flow, as the name suggests controls the flow of the program, based on a condition. 控制流,顾名思义,根据条件控制程序的流。 If expression If表达式 An if expression is used when you want to execute a block of code if a condition …

如何试用 Ollama 运行本地模型 Mac M2

首先下载 Ollama https://github.com/ollama/ollama/tree/main安装完成之后,启动 ollma 对应的模型,这里用的是 qwen:7b ollama run qwen:7b命令与模型直接交互 我的机器配置是M2 Pro/ 32G,运行 7b 模型毫无压力,而且推理时是用…

C语言案例——输出以下图案(两个对称的星型三角形)

目录 图片代码 图片 代码 #include<stdio.h> int main() {int i,j,k;//先输出上半部图案for(i0;i<3;i){for(j0;j<2-i;j)printf(" ");for(k0;k<2*i;k)printf("*");printf("\n");}//再输出下半部分图案for(i0;i<2;i){for(j0;j&…

《R语言与农业数据统计分析及建模》学习——R基础包的函数

1、R的基础包 基础包是R语言的核心组成部分&#xff0c;构建了R语言的基本功能框架。是R语言默认的安装包&#xff0c;不需要额外安装&#xff0c;使用时无需加载。 2、常用函数及其功能 &#xff08;1&#xff09;数据处理函数&#xff1a;unique()、sort()、subset() # 获…

LRTimelapse for Mac:专业延时摄影视频制作利器

LRTimelapse for Mac是一款专为Mac用户设计的延时摄影视频制作软件&#xff0c;它以其出色的性能和丰富的功能&#xff0c;成为摄影爱好者和专业摄影师的得力助手。 LRTimelapse for Mac v6.5.4中文激活版下载 这款软件提供了直观易用的界面&#xff0c;用户可以轻松上手&#…

OpenHarmony、HarmonyOS和Harmony NEXT 《我们不一样》

1. OpenHarmony 定义与地位&#xff1a;OpenHarmony是鸿蒙系统的底层内核系统&#xff0c;集成了Linux内核和LiteOS&#xff0c;为各种设备提供统一的操作系统解决方案。 开源与商用&#xff1a;OpenHarmony是一个开源项目&#xff0c;允许开发者自由访问和使用其源代码&#…

# Nacos 服务发现-Spring Cloud Alibaba 综合架构实战(五) -实现 gateway 网关。

Nacos 服务发现-Spring Cloud Alibaba 综合架构实战&#xff08;五&#xff09; -实现 gateway 网关。 1、什么是网关&#xff1f; 原来的单体架构&#xff0c;所有的服务都是本地的&#xff0c;UI 可以直接调用&#xff0c;现在按功能拆分成独立的服务&#xff0c;跑在独立的…

Kafka、RabbitMQ、Pulsar、RocketMQ基本原理和选型

Kafka、RabbitMQ、Pulsar、RocketMQ基本原理和选型 1. 消息队列1.1 消息队列使用场景1.2. 消息队列模式1.2.1 点对点模式&#xff0c;不可重复消费1.2.2 发布/订阅模式 2. 选型参考2.1. Kafka2.1.1 基本术语2.1.2. 系统框架2.1.3. Consumer Group2.1.4. 存储结构2.1.5. Rebalan…

【深度学习】执行wandb sync同步命令报错wandb: Network error (SSLError), entering retry loop

执行wandb sync同步命令报错wandb: Network error (SSLError), entering retry loop 在代码中设置wandb offline的命令 os.environ["WANDB_API_KEY"] "API keys" os.environ["WANDB_MODE"] "offline"日志文件生成后&#xff0c;使…

十大排序——7.希尔排序

下面我们来看一下希尔排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 希尔排序是插入排序的一种优化&#xff0c;可以理解为是一种分组的插入排序。 希尔排序的要点&#xff1a; 简单来说&#xff0c;就是分组实现插入&#xff0c;每组元素的间隙称为gap&#xff0c;…