【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)

这篇具有很好参考价值的文章主要介绍了【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

反向传播

反向传播(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=0m1(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αwjJ(w,b)b=bαbJ(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} wjJ(w,b)=m1i=0m1(fw,b(x(i))y(i))xj(i)bJ(w,b)=m1i=0m1(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} wJ(w) J ( w ) = w 2 J(w) = w^2 J(w)=w2

from sympy import symbols, diff

J, w = symbols('J,w')
J = w ** 2
dj_dw = diff(J,w)
print(dj_dw)

结果:

【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)


e . g . 2 e.g.2 e.g.2

∂ J ( w ) ∂ w \frac {\partial J(w)} {\partial w} wJ(w) J ( w ) = 1 w J(w) = \frac 1 w J(w)=w1

from sympy import symbols, diff

J, w = symbols('J,w')
J = 1/w
dj_dw = diff(J,w)
print(dj_dw)

结果:

【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)


e . g . 3 e.g.3 e.g.3

∂ J ( w ) ∂ w \frac {\partial J(w)} {\partial w} wJ(w) J ( w ) = 1 w 2 J(w) = \frac 1 {w^2} J(w)=w21

from sympy import symbols, diff

J, w = symbols('J,w')
J = 1/w**2
dj_dw = diff(J,w)
print(dj_dw)

结果:

【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)


链式法则

假设我们有一个函数 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=dgdfdxdg

其中, 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))=3g(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=dgdfdxdg=(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


简单神经网络处理流程从而理解反向传播

神经网络与前向传播

【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)

一个简单的神经网路如上图,假定我们使用 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(21+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(32+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(75)2=2

我们可以将上述前向传播过程分解为如下步骤流程

【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)
到这里,稍微停顿一下,思考在神经网络中,我们的下一步要做什么?

反向传播,更新参数,从而使得预测值 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} wjJ(w,b)=m1i=0m1(fw,b(x(i))y(i))xj(i)bJ(w,b)=m1i=0m1(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αwjJ(w,b)b=bαbJ(w,b)

读者也都知道:

  • 梯度下降目的是为了最小化损失函数;
  • 在每个迭代步骤中,我们首先计算损失函数关于每个参数的梯度,然后根据梯度的方向和大小,调整参数的值,以使损失函数的值减少。这个过程会不断迭代,直到达到预定的停止条件;
  • 反向传播更新神经网络参数;
  • 链式法则是什么;

但是就是总感觉差点什么?画图来说:

【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)

其实就是少了一句非常重要的话:

  • 梯度下降更新参数,只直接更新输出层参数,而隐藏层的参数,我们通过链式法则 “间接” 更新

在本案例中,我们存在一个隐藏层(且隐藏层中也只包含一个神经网络),一个输出层(输出层中只包含一个神经网络),即:

对于输出层参数 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=(75)7=14b[2]J=75=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)=314αb[2]=b[2]αb[2]J(w,b)=12α

上述步骤就是通过梯度下降法,更新输出层参数 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]Ja[1]a[2]w[1]a[1]b[1]J=a[2]Ja[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]Ja[1]a[2]w[1]a[1]=(a[2]y)w[2]x=(75)31=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]Ja[1]a[2]b[1]a[1]=(a[2]y)w[2]1=(75)31=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)=26αb[1]=b[1]αb[2]J(w,b)=06α

上述过程就是通过链式法则,结合梯度下降法来更新参数 w [ 1 ] w^{[1]} w[1] 与 参数 b [ 1 ] b^{[1]} b[1] 的值;文章来源地址https://www.toymoban.com/news/detail-440257.html

到了这里,关于【机器学习】P18 反向传播(导数、微积分、链式法则、前向传播、后向传播流程、神经网络)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 李沐 《动手学深度学习》预备知识 线性代数与微积分

    李沐《动手学深度学习》预备知识 张量操作与数据处理 教材:李沐《动手学深度学习》 标量(scalar) 仅包含一个数值被称为标量,标量由只有一个元素的张量表示。 向量 向量可以被视为标量值组成的列表,向量由一维张量表示。一般来说,张量可以具有任意长度,取决于

    2024年01月20日
    浏览(19)
  • 【AI】《动手学-深度学习-PyTorch版》笔记(六):微积分

    f ′ ( x ) = lim ⁡ h → 0 f (

    2024年02月15日
    浏览(40)
  • 机器学习 day27(反向传播)

    机器学习 day27(反向传播)

    1. 导数 函数在某点的导数为该点处的斜率,用height / width表示,可以看作若当w增加ε,J(w,b)增加k倍的ε,则k为该点的导数 2. 反向传播 tensorflow中的计算图,由有向边和节点组成。从左向右为正向传播,神经网络模型使用正向传播来输出结果 从右向左为反向传播,tensorflow使用

    2024年02月16日
    浏览(10)
  • 机器学习17:训练神经网络-反向传播算法

    反向传播算法对于快速训练大型神经网络至关重要。本文将介绍算法的工作原理。 目录 1.简单的神经网络 2.激活函数 3.错误函数 4.正向传播 4.1 更新隐藏层 5.反向传播 5.1 求导数

    2024年02月12日
    浏览(9)
  • 机器学习之前向传播(Forward Propagation)和反向传播(Back propagation)

    前向传播(Forward Propagation)和反向传播(Back propagation)是深度学习中神经网络训练的两个关键步骤。 前向传播(Forward Propagation) : 定义 :前向传播是指从神经网络的输入层到输出层的过程,通过输入数据和当前的模型参数,计算网络的输出。 步骤 :在前向传播中,数据

    2024年02月10日
    浏览(6)
  • 关于吴恩达机器学习中反向传播的理解

    在机器学习视频反向传播章节 [1] 中: 我们用 (delta) 来表示误差,则: (boldsymboldelta^{left(4right)}=boldsymbol a^{left(4right)}−boldsymbol y) 。我们利用这个误差值来计算前一层的误差: (boldsymboldelta^{left(3right)}=left(boldsymbolTheta^{left(3right)}right)^Tboldsymboldelta^{left(4rig

    2024年02月01日
    浏览(12)
  • 【机器学习300问】71、神经网络中前向传播和反向传播是什么?

    【机器学习300问】71、神经网络中前向传播和反向传播是什么?

            我之前写了一篇有关计算图如何帮助人们理解反向传播的文章,那为什么我还要写这篇文章呢?是因为我又学习了一个新的方法来可视化前向传播和反向传播,我想把两种方法总结在一起,方便我自己后续的复习。对了顺便附上往期文章的链接方便回顾: 【机器

    2024年04月17日
    浏览(7)
  • 图形学基础--深入浅出的微积分书籍 《普林斯顿微积分读本》和《托马斯微积分》

    图形学基础--深入浅出的微积分书籍 《普林斯顿微积分读本》和《托马斯微积分》

           话说程序员有三大浪漫,图形学,编译原理,操作系统,说到这里,可能搞深度学习的要跳出来反驳. 这三大浪漫正确与否其实并不重要,重要的是这种说法侧面反映了学习图形学的难度. 图形学之所以有难度,是因为它有一定的数学门槛. 一提到数学,大家脑海中肯

    2024年02月13日
    浏览(6)
  • Matlab(数值微积分)

    Matlab(数值微积分)

    目录 1.多项式微分与积分 1.1 微分 1.2 多项式微分 1.3 如何正确的使用Matlab? 1.3.1 Matlab表达多项式 1.3.2  polyval() 多项式求值  1.3.3 polyder()多项式微分 1.4 多项式积分 1.4.1 如何正确表达 1.4.2 polyint() 多项式积分 2.数值的微分与积分 2.1 数值微分  2.2 diff() 计算差值   2.3 误差的准确

    2024年02月09日
    浏览(8)
  • 高等数学:微积分(下)

    导数说完了就可以说微分了。还是看图中过A点的切线,其与竖直虚线相交于C点。其中CD段的距离可以表示为 C D = k ⋅ Δ x CD = k cdot Delta x\\\\ C D = k ⋅ Δ x 这里的系数k是一个不为零的常数。原因很简单,假设这条切线与x轴的夹角为 θ theta θ (图中没有画出),那么根据三角函

    2024年02月12日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包