【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)
反向传播
- 反向传播
- 反向传播中的数学
- 导数与python
- 链式法则
- 简单神经网络处理流程从而理解反向传播
- 神经网络与前向传播
- 神经网络与反向传播
反向传播
反向传播(back propagation)是一种用于训练神经网络的算法,其作用是计算神经网络中每个参数对损失函数的影响,从而进行参数更新,使得神经网络的预测结果更加准确。
具体来说,反向传播算法首先通过前向传播计算神经网络的预测结果,并与实际结果进行比较,得到损失函数的值。然后,反向传播算法计算每个参数对损失函数的影响,即参数的梯度。这些梯度可以告诉我们,在当前的参数取值下,将参数向梯度的相反方向移动可以减少损失函数的值。最后,通过梯度下降等优化算法,可以更新神经网络中的参数,使得损失函数的值逐渐减小,直到达到最小值。
上述涉及到两个主要公式:
损失函数公式:
J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) J(w,b) = \frac 1 {2m} \sum _{i=0} ^{m-1} (f_{w,b}(x^{(i)})-y^{(i)}) J(w,b)=2m1i=0∑m−1(fw,b(x(i))−y(i))梯度下降公式:
{ w j = w j − α ∂ J ( w , b ) ∂ w j b = b − α ∂ J ( w , b ) ∂ b \begin{cases} w_j = w_j - \alpha \frac {\partial J(w,b)} {\partial w_j}\\ \\ b = b - \alpha \frac {\partial J(w,b)} {\partial b} \end{cases} ⎩ ⎨ ⎧wj=wj−α∂wj∂J(w,b)b=b−α∂b∂J(w,b)
其中
{ ∂ J ( w , b ) ∂ w j = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x j ( i ) ∂ J ( w , b ) ∂ b = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) \begin{cases} \frac {\partial J(w,b)} {\partial w_j} = \frac 1 m \sum _{i=0} ^{m-1} (f_{w,b}(x^{(i)})-y^{(i)})x_j^{(i)}\\ \\ \frac {\partial J(w,b)} {\partial b} = \frac 1 m \sum _{i=0} ^{m-1} (f_{w,b}(x^{(i)})-y^{(i)}) \end{cases} ⎩ ⎨ ⎧∂wj∂J(w,b)=m1∑i=0m−1(fw,b(x(i))−y(i))xj(i)∂b∂J(w,b)=m1∑i=0m−1(fw,b(x(i))−y(i))
反向传播算法的作用是实现神经网络的自动学习。通过反向传播算法,神经网络可以从大量的训练样本中学习到数据的特征,并将这些特征表示为神经网络中的参数。这些参数可以在新的数据样本中进行预测,并且可以通过监督学习中的反向传播算法进行更新,以逐渐提高神经网络的预测准确率。
小结:
反向传播,目的就是为了实现神经网络的自动学习。
在整个优化模型参数的流程中,我们首先通过正向传播,得到预测值,通过损失函数公式计算损失值,通过反向传播算法可以计算每个神经元对损失函数的贡献,然后将这些贡献反向传播回网络中的每个神经元,从而确定每个神经元的梯度。然后可以使用梯度下降算法或其他优化算法来更新神经网络的参数,以最小化损失函数。这个过程就是通过反向传播计算梯度,再使用优化算法来更新模型参数的过程。
反向传播中的数学
反向传播用到了很多数学知识,最主要比如导数的计算以及微积分中的链式法则:
导数与python
e . g . 1 e.g.1 e.g.1
求 ∂ J ( w ) ∂ w \frac {\partial J(w)} {\partial w} ∂w∂J(w), J ( w ) = w 2 J(w) = w^2 J(w)=w2
from sympy import symbols, diffJ, w = symbols('J,w')
J = w ** 2
dj_dw = diff(J,w)
print(dj_dw)
结果:
e . g . 2 e.g.2 e.g.2
求 ∂ J ( w ) ∂ w \frac {\partial J(w)} {\partial w} ∂w∂J(w), J ( w ) = 1 w J(w) = \frac 1 w J(w)=w1
from sympy import symbols, diffJ, w = symbols('J,w')
J = 1/w
dj_dw = diff(J,w)
print(dj_dw)
结果:
e . g . 3 e.g.3 e.g.3
求 ∂ J ( w ) ∂ w \frac {\partial J(w)} {\partial w} ∂w∂J(w), J ( w ) = 1 w 2 J(w) = \frac 1 {w^2} J(w)=w21
from sympy import symbols, diffJ, w = symbols('J,w')
J = 1/w**2
dj_dw = diff(J,w)
print(dj_dw)
结果:
链式法则
假设我们有一个函数 f ( x ) f(x) f(x),即 f ( x ) = h ( g ( x ) ) f(x) = h(g(x)) f(x)=h(g(x)),其中:
- g ( x ) = 2 x + 3 g(x) = 2x + 3 g(x)=2x+3
- h ( y ) = y 3 + 5 y h(y) = y^3 + 5y h(y)=y3+5y
现在我们想计算 f ( x ) f(x) f(x) 关于 x x x 的导数,即 d f d x \frac {df} {dx} dxdf。
根据链式法则,有:
d f d x = d f d g ∗ d g d x \frac {df} {dx} = \frac {df} {dg} * \frac {dg} {dx} dxdf=dgdf∗dxdg
其中, d f d g \frac {df} {dg} dgdf 表示 f f f 关于 g g g 的导数, d g d x \frac {dg} {dx} dxdg 表示 g g g 关于 x x x 的导数。
首先计算 d f d g \frac {df} {dg} dgdf。因为 f ( x ) = h ( g ( x ) ) f(x) = h(g(x)) f(x)=h(g(x)),所以:
d f d g = h ′ ( g ( x ) ) = 3 ∗ g ( x ) 2 + 5 \frac {df} {dg} = h'(g(x)) = 3*g(x)^2 + 5 dgdf=h′(g(x))=3∗g(x)2+5由 g ( x ) = 2 x + 3 g(x) = 2x+3 g(x)=2x+3
d f d g = 3 ∗ ( 2 x + 3 ) 2 + 5 \frac {df} {dg} = 3*(2x + 3)^2 + 5 dgdf=3∗(2x+3)2+5然后计算 d g d x \frac {dg} {dx} dxdg。因为 g ( x ) = 2 x + 3 g(x) = 2x + 3 g(x)=2x+3,所以
d g d x = 2 \frac {dg} {dx} = 2 dxdg=2根据链式法则,有:
d f d x = d f d g ∗ d g d x = ( 3 ( 2 x + 3 ) 2 + 5 ) ∗ 2 = 6 ( 2 x + 3 ) 2 + 10 \frac {df}{dx} = \frac {df}{dg} * \frac {dg} {dx} = (3(2x + 3)^2 + 5) * 2 = 6(2x+3)^2+10 dxdf=dgdf∗dxdg=(3(2x+3)2+5)∗2=6(2x+3)2+10
因此, f ( x ) f(x) f(x) 关于 x x x 的导数为 6 ( 2 x + 3 ) 2 + 10 6(2x+3)^2+10 6(2x+3)2+10。
简单神经网络处理流程从而理解反向传播
神经网络与前向传播
一个简单的神经网路如上图,假定我们使用 ReLU 作为激活函数,
我们可以使用前向传播推出损失函数值
假设最初参数设定为:
- w [ 1 ] = 2 , b [ 1 ] = 0 w^{[1]}=2, b^{[1]} = 0 w[1]=2,b[1]=0
- w [ 2 ] = 3 , b [ 2 ] = 1 w^{[2]}=3, b^{[2]}=1 w[2]=3,b[2]=1
假定初始输入层值设定为:
- x = 1 x = 1 x=1
- y = 5 y = 5 y=5
根据神经网络计算公式,有:
a [ 1 ] = g ( w [ 1 ] x + b [ 1 ] ) = g ( 2 ∗ 1 + 0 ) = 2 a^{[1]} = g(w^{[1]}x + b^{[1]})=g(2*1 + 0)=2 a[1]=g(w[1]x+b[1])=g(2∗1+0)=2 a [ 2 ] = g ( w [ 2 ] a [ 1 ] + b [ 2 ] ) = g ( 3 ∗ 2 + 1 ) = 7 a^{[2]} = g(w^{[2]}a^{[1]} + b^{[2]})=g(3*2+1)=7 a[2]=g(w[2]a[1]+b[2])=g(3∗2+1)=7
由实际值 y = 5 y = 5 y=5 与预测值 a [ 2 ] = 7 a^{[2]}=7 a[2]=7,得损失函数:
J ( w , b ) = 1 2 ( a [ 2 ] − y ) 2 = 1 2 ( 7 − 5 ) 2 = 2 J(w,b) = \frac 1 2 (a^{[2]}-y)^2=\frac 1 2 (7-5)^2=2 J(w,b)=21(a[2]−y)2=21(7−5)2=2
我们可以将上述前向传播过程分解为如下步骤流程
到这里,稍微停顿一下,思考在神经网络中,我们的下一步要做什么?
反向传播,更新参数,从而使得预测值 a [ 2 ] = 7 a^{[2]}=7 a[2]=7 更加趋近于实际值 y = 5 y=5 y=5
神经网络与反向传播
神经网络
反向传播
梯度下降
链式法则
上述已经完成了前向传播的部分,我们剩下将使用反向传播方法,计算每个参数的梯度,然后使用梯度下降的方法更新参数。
其实到这里,我相信读者都记得这两个公式:
计算梯度的公式:
{ ∂ J ( w , b ) ∂ w j = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x j ( i ) ∂ J ( w , b ) ∂ b = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) \begin{cases} \frac {\partial {J(w,b)}} {\partial {w_j}} = \frac 1 m \sum _{i=0} ^{m-1} (f_{w,b}(x^{(i)})-y^{(i)})x_j^{(i)}\\ \\ \frac {\partial {J(w,b)}} {\partial {b}} = \frac 1 m \sum _{i=0} ^{m-1} (f_{w,b}(x^{(i)})-y^{(i)}) \end{cases} ⎩ ⎨ ⎧∂wj∂J(w,b)=m1∑i=0m−1(fw,b(x(i))−y(i))xj(i)∂b∂J(w,b)=m1∑i=0m−1(fw,b(x(i))−y(i))更新参数公式:
{ w j = w j − α ∂ J ( w , b ) ∂ w j b = b − α ∂ J ( w , b ) ∂ b \begin{cases} w_j = w_j - \alpha \frac {\partial {J(w,b)}} {\partial w_j}\\ \\ b = b - \alpha \frac {\partial {J(w,b)}} {\partial b} \end{cases} ⎩ ⎨ ⎧wj=wj−α∂wj∂J(w,b)b=b−α∂b∂J(w,b)
读者也都知道:
- 梯度下降目的是为了最小化损失函数;
- 在每个迭代步骤中,我们首先计算损失函数关于每个参数的梯度,然后根据梯度的方向和大小,调整参数的值,以使损失函数的值减少。这个过程会不断迭代,直到达到预定的停止条件;
- 反向传播更新神经网络参数;
- 链式法则是什么;
但是就是总感觉差点什么?画图来说:
其实就是少了一句非常重要的话:
- 梯度下降更新参数,只直接更新输出层参数,而隐藏层的参数,我们通过链式法则 “间接” 更新
在本案例中,我们存在一个隐藏层(且隐藏层中也只包含一个神经网络),一个输出层(输出层中只包含一个神经网络),即:
对于输出层参数 w [ 2 ] , b [ 2 ] w^{[2]}, b^{[2]} w[2],b[2] 的更新,我们通过梯度下降直接更新:
- 计算梯度:
{ ∂ J ∂ w [ 2 ] = ( 7 − 5 ) ∗ 7 = 14 ∂ J ∂ b [ 2 ] = 7 − 5 = 2 \begin{cases} \frac {\partial {J}} {\partial {w^{[2]}}} = (7-5)*7=14\\ \\ \frac {\partial {J}} {\partial {b^{[2]}}} = 7-5=2 \end{cases} ⎩ ⎨ ⎧∂w[2]∂J=(7−5)∗7=14∂b[2]∂J=7−5=2 - 更新参数:
{ w [ 2 ] = w [ 2 ] − α ∂ J ( w , b ) ∂ w [ 2 ] = 3 − 14 ∗ α b [ 2 ] = b [ 2 ] − α ∂ J ( w , b ) ∂ b [ 2 ] = 1 − 2 ∗ α \begin{cases} w^{[2]} = w^{[2]} - \alpha \frac {\partial {J(w,b)}} {\partial w^{[2]}} = 3-14*\alpha\\ \\ b^{[2]} = b^{[2]} - \alpha \frac {\partial {J(w,b)}} {\partial b^{[2]}} = 1-2*\alpha \end{cases} ⎩ ⎨ ⎧w[2]=w[2]−α∂w[2]∂J(w,b)=3−14∗αb[2]=b[2]−α∂b[2]∂J(w,b)=1−2∗α
上述步骤就是通过梯度下降法,更新输出层参数 w [ 2 ] w^{[2]} w[2] 与 b [ 2 ] b^{[2]} b[2] 的步骤;
而对于隐藏层的参数 w [ 1 ] , b [ 1 ] w^{[1]}, b^{[1]} w[1],b[1] 的更新,我们需要通过链式法则传递间接计算梯度,然后更新:
间接计算梯度:
{ ∂ J ∂ w [ 1 ] = ∂ J ∂ a [ 2 ] ∂ a [ 2 ] ∂ a [ 1 ] ∂ a [ 1 ] ∂ w [ 1 ] ∂ J ∂ b [ 1 ] = ∂ J ∂ a [ 2 ] ∂ a [ 2 ] ∂ a [ 1 ] ∂ a [ 1 ] ∂ b [ 1 ] \begin{cases} \frac {\partial {J}} {\partial {w^{[1]}}} = \frac {\partial J} {\partial a^{[2]}} \frac {\partial a^{[2]}} {\partial a^{[1]}} \frac {\partial a^{[1]}} {\partial w^{[1]}}\\ \\ \frac {\partial {J}} {\partial {b^{[1]}}} = \frac {\partial J} {\partial a^{[2]}} \frac {\partial a^{[2]}} {\partial a^{[1]}} \frac {\partial a^{[1]}} {\partial b^{[1]}} \end{cases} ⎩ ⎨ ⎧∂w[1]∂J=∂a[2]∂J∂a[1]∂a[2]∂w[1]∂a[1]∂b[1]∂J=∂a[2]∂J∂a[1]∂a[2]∂b[1]∂a[1]由:
J = 1 2 ( a [ 2 ] − y ) 2 J = \frac 1 2 (a^{[2]}-y)^2\\ J=21(a[2]−y)2 a [ 2 ] = g ( w [ 2 ] a [ 1 ] + b [ 2 ] ) a^{[2]} = g(w^{[2]}a^{[1]}+b^{[2]})\\ a[2]=g(w[2]a[1]+b[2]) g ( z ) = m a x ( 0 , z ) ( R e L U ) g(z) = max(0,z)(ReLU)\\ g(z)=max(0,z)(ReLU) a [ 1 ] = g ( w [ 1 ] x + b [ 1 ] ) a^{[1]} = g(w^{[1]}x+b^{[1]}) a[1]=g(w[1]x+b[1])所以:
∂ J ∂ a [ 2 ] = a [ 2 ] − y \frac {\partial J} {\partial a^{[2]}} = a^{[2]}-y ∂a[2]∂J=a[2]−y ∂ a [ 2 ] ∂ a [ 1 ] = w [ 2 ] \frac {\partial a^{[2]}} {\partial a^{[1]}} = w^{[2]} ∂a[1]∂a[2]=w[2] ∂ a [ 1 ] ∂ w [ 1 ] = x \frac {\partial a^{[1]}} {\partial w^{[1]}} = x ∂w[1]∂a[1]=x ∂ a [ 1 ] ∂ b [ 1 ] = 1 \frac {\partial a^{[1]}} {\partial b^{[1]}} = 1 ∂b[1]∂a[1]=1即:
∂ J ∂ w [ 1 ] = ∂ J ∂ a [ 2 ] ∂ a [ 2 ] ∂ a [ 1 ] ∂ a [ 1 ] ∂ w [ 1 ] = ( a [ 2 ] − y ) ∗ w [ 2 ] ∗ x = ( 7 − 5 ) ∗ 3 ∗ 1 = 6 \frac {\partial {J}} {\partial {w^{[1]}}} = \frac {\partial J} {\partial a^{[2]}} \frac {\partial a^{[2]}} {\partial a^{[1]}} \frac {\partial a^{[1]}} {\partial w^{[1]}} = (a^{[2]}-y)*w^{[2]}*x = (7-5)*3*1=6 ∂w[1]∂J=∂a[2]∂J∂a[1]∂a[2]∂w[1]∂a[1]=(a[2]−y)∗w[2]∗x=(7−5)∗3∗1=6 ∂ J ∂ b [ 1 ] = ∂ J ∂ a [ 2 ] ∂ a [ 2 ] ∂ a [ 1 ] ∂ a [ 1 ] ∂ b [ 1 ] = ( a [ 2 ] − y ) ∗ w [ 2 ] ∗ 1 = ( 7 − 5 ) ∗ 3 ∗ 1 = 6 \frac {\partial {J}} {\partial {b^{[1]}}} = \frac {\partial J} {\partial a^{[2]}} \frac {\partial a^{[2]}} {\partial a^{[1]}} \frac {\partial a^{[1]}} {\partial b^{[1]}} = (a^{[2]}-y)*w^{[2]}*1 = (7-5)*3*1=6 ∂b[1]∂J=∂a[2]∂J∂a[1]∂a[2]∂b[1]∂a[1]=(a[2]−y)∗w[2]∗1=(7−5)∗3∗1=6修改参数值:
{ w [ 1 ] = w [ 1 ] − α ∂ J ( w , b ) ∂ w [ 1 ] = 2 − 6 ∗ α b [ 1 ] = b [ 1 ] − α ∂ J ( w , b ) ∂ b [ 2 ] = 0 − 6 ∗ α \begin{cases} w^{[1]} = w^{[1]} - \alpha \frac {\partial {J(w,b)}} {\partial w^{[1]}} = 2-6*\alpha\\ \\ b^{[1]} = b^{[1]} - \alpha \frac {\partial {J(w,b)}} {\partial b^{[2]}} = 0-6*\alpha \end{cases} ⎩ ⎨ ⎧w[1]=w[1]−α∂w[1]∂J(w,b)=2−6∗αb[1]=b[1]−α∂b[2]∂J(w,b)=0−6∗α
上述过程就是通过链式法则,结合梯度下降法来更新参数 w [ 1 ] w^{[1]} w[1] 与 参数 b [ 1 ] b^{[1]} b[1] 的值;
【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)相关推荐
- 卷积神经网络CNN的前向和后向传播(一)
卷积神经网络CNN的前向和后向传播 卷积运算与相关的区别 卷积运算的正向和反向传播 原文 Forward And Backpropagation in Convolutional Neural Net ...
- 第七周【任务2】长短期记忆网络LSTM的前向、后向传播
LSTM 通过刻意的设计来避免长期依赖问题."记住"长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力! 之前的所有RNN都具有一种重复神经网络模块的链 ...
- pytorch扩展——如何自定义前向和后向传播
python 端扩展 pytorch 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/ ...
- 【深度学习】——DNN后向传播、CNN后向传播文章汇总
深度神经网络(DNN)模型与前向传播算法 深度神经网络(DNN)反向传播算法(BP) 卷积神经网络CNN的前向和后向传播(一) 卷积神经网络CNN的前向和后向传播(二) 有batch normaliz ...
- 前向传播、反向传播(后向传播)、梯度下降、导数、链式法则
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 2.4 神经网络最优化过程 2.4.1 最优化(Optimiz ...
- 机器学习概念 — 监督学习、无监督学习、半监督学习、强化学习、欠拟合、过拟合、后向传播、损失和优化函数、计算图、正向传播、反向传播
1. 监督学习和无监督学习 监督学习 ( Supervised Learning ) 和无监督学习 ( Unsupervised Learning ) 是在机器学习中经常被提及的两个重要的学习方法. ...
- 微积分——求导数的链式法则
链式法则(Chain Rule)是微积分最强大的法则之一.这个法则处理的是复合函数(Composite Functions)的导数问题. 复合函数: 以另一种方式将两个函数组合起来的函数.正式定义: ...
- 李宏毅机器学习笔记4:Brief Introduction of Deep Learning、Backpropagation(后向传播算法)...
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- 【数据挖掘】神经网络 后向传播算法( 向后传播误差 | 输出层误差公式 | 隐藏层误差公式 | 单元连接权值更新公式 | 单元偏置更新公式 | 反向传播 | 损失函数 | 误差平方和 | 交叉熵 )
文章目录 I . 向后传播误差 简介 II . 输出层误差计算公式 III . 隐藏层层误差计算公式 IV . 使用误差更新 连接权值 V . 使用误差更新 单元偏置 VI . 反向传播 过程 VII ...
最新文章
- RACER: Rapid and accurate correction of errors in reads 快速、准确地修正读数中的错误
- [原创]K8域控植入脚本生成器(内网渗透/RPC不可用解决方案)
- 【机器学习】4 款超级棒的模型可解释性工具包,总有一款适合你!
- win7计算机个性化设置,笔记本电脑windows7系统如何用好电脑个性化设置
- 探索 Java 隐藏的开销
- codevs1040 统计单词个数
- Django REST framework 源码解析
- python中print(chr(65))_Python语句print(chr(97))的运行结果是( )。_学小易找答案
- 数据切片和切块 钻取 旋转
- 一文看尽苹果WWDC大会:今年有亮点,但都不“硬”
- 拓端tecdat|R语言回归中的Hosmer-Lemeshow拟合优度检验
- swf游戏保存进度_flash格式如何保存为swf格式动画?flash格式小游戏保存成swf格式方法 - 软件教程 - 格子啦...
- 建立正确的目标收益率
- 电子计算机断层扫描简称,计算机断层扫描技术(简称PET)
- (八)苏世民:我的经验和教训:决策(567)
- 如何在WPF中使用虚拟键盘
- win11怎么升级_win11系统升级更新注意事项
- Git- Fast Forward和no fast forward
- target找不到*.xml和*.properties文件 报错:FileNotFoundException
- Tcp连接时三次握手的问题和思考