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

news2025/6/8 3:56:30

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

文章目录

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

概述

以监督学习为例,假设我们有训练样本集 ( 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.coloradmin.cn/o/1592724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

滚雪球学Java(75):Java零基础,轻松学会文件读写技巧

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

mp3怎样才能转换成wav格式?音频互相转换的方法

一,什么是WAV WAV,全称为波形音频文件(Waveform Audio File Format),是一种由微软公司和IBM公司联合开发的音频文件格式。自1991年问世以来,WAV格式因其无损的音频质量和广泛的兼容性,成为了多…

【Godot4.2】CanvasItem绘图函数全解析 - 7.自定义节点TextBoard

概述 之前发布的几篇文章几乎阐述了CanvasItem绘图函数最基础的内容。 本篇结合draw_style_box()和TextParagraph类,自定义了一个可以自适应宽高显示多行文本,且带有一个样式盒作为背景的文字板节点TextBoard。 系列目录 0.概述1.绘制简单图形2.设定绘…

kali工具----域名IP及路由跟踪

域名IP及路由跟踪 测试网络范围内的IP地址或域名也是渗透测试的一个重要部分。通过测试网络范围内的IP地址或域名,确定是否有人入侵自己的网络中并损害系统。不少单位选择仅对局部IP基础架构进行渗透测试,但从现在的安全形势来看,只有对整个I…

RHCE--dns正反向解析小实验

一、准备工作 1.关闭防火墙 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld 2.安装软件 [rootserver ~]# yum install bind -y 二、正向解析 服务端IP客户端IP网址192.168.203.128192.168.203.130www.openlab.com 服务端配置静态ip [root…

人工智能|机器学习——基于机器学习的信用卡办卡意愿模型预测项目

一、背景介绍 在金融领域,了解客户的信用卡办卡意愿对于银行和金融机构至关重要。借助机器学习技术,我们可以根据客户的历史数据和行为模式预测其是否有办理信用卡的倾向。本项目通过Python中的机器学习库,构建了两个常用的分类模型&#xff…

Mistral AI突围:开源大模型Mixtral 8x22B颠覆行业格局

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Spark-Scala语言实战(16)

在之前的文章中,我们学习了三道任务,运用之前学到的方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战&#x…

开发板仿真网站(wokwi)初次上手指南(Arduino UNO项目)

在本篇文章中将详细介绍在开发板仿真网站(wokwi)上实现Arduino UNO控制LED灯亮灭。 将学习到如何连接部件、编写代码并在线模拟Arduino项目! 开发板仿真网站(wokwi)简介 可参考《一个免费的在线的开发板仿真网站&#…

IEDA 启动项目时出现 java: java.lang.OutOfMemoryError: GC overhead limit exceeded 异常

问题 通过Idea启动项目时,出现java: java.lang.OutOfMemoryError: GC overhead limit exceeded 内存溢出问题; 解决方案 错误是发生在编译阶段,而不是运行阶段: 【1】idea编译Java项目使用的虚拟机和idea软件自身使用的虚拟机是…

【Linux】应用层协议:HTTP

URL 在之前的文章中我们实现了一个网络版本的计算器,在那个计算器中揉合了协议定制以及序列化反序列化的内容,我们当时也自己定制了一套协议标准,比如请求和响应的格式应该是什么?如何读到一个完整的报文?支持的运算符…

无人机巡检技术革命性变革光伏电站运维管理

在中国广袤的大地上,光伏电站如雨后春笋般崛起,晶体硅组件板在阳光下熠熠生辉,为人们带来了源源不断的绿色能源。然而,随着光伏产业的迅猛发展,电站运维管理面临着前所未有的挑战。而无人机巡检技术的引入,…

MySQL进阶-合

目录 1.使用环境 2.条件判断 2.1.case when 2.2.if 3.窗口函数 3.1.排序函数 3.2.聚合函数 3.3.partiton by ​​​​​​​3.4.order by 4.排序窗口函数 5.聚合窗口函数 1.使用环境 数据库:MySQL 8.0.30 客户端:Navicat 15.0.12 MySQL进阶…

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

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

桥接模式:解耦抽象与实现的设计艺术

在软件设计中,桥接模式是一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们可以独立地变化。这种模式通过提供更加灵活的代码结构帮助软件开发人员处理不断变化的需求,特别是在涉及多平台应用开发时。本文将详细介绍桥接…

Unet++(pytorch实现)

Unet网络 Dense connection Unet继承了Unet的结构,同时又借鉴了DenseNet的稠密连接方式(图1中各种分支)。 作者通过各层之间的稠密连接,互相连接起来,就像Denset那样,前前后后每一个模块互相作用&#xf…

Ubuntu20.04版本命令行设置挂载磁盘,并设置开机自动挂载

最近部署应用 系统是Ubuntu20.4版本的Linux系统,加了数据盘,需要格式化后挂载,记录下: Linux 数据盘挂载(采用 parted 分区工具)-格式化为 ext4 1. 初始化 Linux 数据盘 挂载数据盘后或者随实例创建时一并创建的数据盘&#xff…

GAMS104 现代游戏引擎 2

渲染的难点可以分为一下三部分:如何计算入射光线、如何考虑材质以及如何实现全局光照。 渲染的难点之一在于阴影,或者说是光的可见性。如何做出合适的阴影效果远比想象中要难得多,在实践中往往需要通过大量的技巧才能实现符合人认知的阴影效…

Java 设计模式系列:模板方法模式

简介 模板方法模式是一种行为型设计模式,它定义一个操作中的算法骨架,将一些步骤推迟到子类中。模板方法模式使得子类可以不改变一个算法的结构,即可重定义该算法的某些特定步骤。 在模板方法模式中,抽象类中定义了一系列基本操…

【Web】DASCTF 2023 0X401七月暑期挑战赛题解

目录 EzFlask MyPicDisk ez_cms ez_py 让俺看看401web题 EzFlask 进来直接给了源码 import uuidfrom flask import Flask, request, session from secret import black_list import jsonapp Flask(__name__) app.secret_key str(uuid.uuid4())def check(data):for i i…