【机器学习】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模板网!

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

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

相关文章

  • 【AI】《动手学-深度学习-PyTorch版》笔记(六):微积分

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

    2024年02月15日
    浏览(62)
  • 李沐 《动手学深度学习》预备知识 线性代数与微积分

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

    2024年01月20日
    浏览(67)
  • 机器学习 day27(反向传播)

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

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

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

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

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

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

    在机器学习视频反向传播章节 [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日
    浏览(49)
  • 【机器学习300问】71、神经网络中前向传播和反向传播是什么?

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

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

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

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

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

    2024年02月12日
    浏览(56)
  • 微积分基本概念

    微分 函数的微分是指对 函数的局部变化的一种线性描述 。微分可以近似地描述当函数自变量的取值作足够小的改变时,函数的值是怎样改变的。。对于函数 y = f ( x ) y = f(x) y = f ( x ) 的微分记作: d y = f ′ ( x ) d x d_y = f^{\\\'}(x)d_x d y ​ = f ′ ( x ) d x ​ 微分和导数的区别在于:

    2024年02月11日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包