【深度学习 | 反向传播】释放反向传播的力量: 让训练神经网络变得简单

举报
计算机魔术师 发表于 2023/08/25 10:50:44 2023/08/25
【摘要】 🤵‍♂️ 个人主页: @AI_magician📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)该文章收录专栏[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨] 反向传播算法反...

在这里插入图片描述

🤵‍♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

在这里插入图片描述

该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]

反向传播算法

反向传播算法是一种用于训练神经网络的常用优化算法。它通过计算损失函数对每个参数的梯度,然后根据这些梯度更新参数值,以使得神经网络能够逐步调整和改进其预测结果。

下面是一个详细解释反向传播算法的步骤:

  1. 前向传播:从输入开始,通过神经网络进行前向传播。每个节点都会将输入加权求和,并应用非线性激活函数(如ReLU、Sigmoid等),生成输出。

  2. 定义损失函数:选择合适的损失函数来衡量模型预测与实际标签之间的差异。例如,在分类问题中可以使用交叉熵损失或均方误差损失。

  3. 反向传播:从输出层开始,计算每个节点对于最终预测结果的贡献程度,并将该信息沿着网络进行反向传播(在最后一层输出开始,以计算损失函数)。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bzEcrRdT-1691847459841)(classical algorithm.assets/image-20230812141415318.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G1Af45cB-1691847459842)(classical algorithm.assets/image-20230812142623880.png)]
    这里我们以三个全连接神经元为例。 整体导数通过链式法则链接,公式如下:

C 0 w ( L ) = z ( L ) w ( L ) a ( L ) z ( L ) C 0 a ( L ) \frac{\partial C_{0}}{\partial w^{(L)}}=\frac{\partial z^{(L)}}{\partial w^{(L)}} \frac{\partial a^{(L)}}{\partial z^{(L)}} \frac{\partial C_{0}}{\partial a^{(L)}}

这是损失函数与最后一个神经元 W W 参数的偏导数(偏置 b i a s bias 同样),可以看到每一个神经元都存在一个输出激活值和输入的梯度 z ( L ) w ( L ) a ( L ) z ( L ) \frac{\partial z^{(L)}}{\partial w^{(L)}} \frac{\partial a^{(L)}}{\partial z^{(L)}}

C 0 = ( a ( L ) y ) 2 z ( L ) = w ( L ) a ( L 1 ) + b ( L ) a ( L ) = σ ( z ( L ) ) C 0 a ( L ) = 2 ( a ( L ) y ) a ( L ) z ( L ) = σ ( z ( L ) ) z ( L ) w ( L ) = a ( L 1 ) a ( L ) w ( L ) = σ ( z ( L ) ) a ( L 1 ) C 0 w ( L ) = 2 ( a ( L ) y ) σ ( z ( L ) ) a ( L 1 ) \begin{array}{rlrl} C_{0} & =\left(a^{(L)}-y\right)^{2} \\ z^{(L)} & =w^{(L)} a^{(L-1)}+b^{(L)} \\ a^{(L)} & =\sigma\left(z^{(L)}\right) \\ \frac{\partial C_0}{\partial a^{(L)}} & =2\left(a^{(L)}-y\right) & \\ \frac{\partial a^{(L)}}{\partial z^{(L)}} & =\sigma^{\prime}\left(z^{(L)}\right) \\ \frac{\partial z^{(L)}}{\partial w^{(L)}} & =a^{(L-1)} & \\ \frac{\partial a^{(L)}}{\partial w^{(L)}} & = \sigma^{\prime}\left(z^{(L)}\right) * a^{(L-1)}\\ \frac{\partial C_{0}}{\partial w^{(L)}} & = 2\left(a^{(L)}-y\right) * \sigma^{\prime}\left(z^{(L)}\right) * a^{(L-1)} \end{array}

其中我们可以看到Siegrid Lowel非常著名的一句话“一同激活的神经元联系在一起”(Hebb的思想,一个生物元经常触发另外一个神经元,二者关系增强),上一个神经元的激活值就是下一个神经元的导数多项式因子。再根据 a ( L 1 ) a^{(L-1)} 继续求导反向一个神经元,公式如下:

a ( L 1 ) z ( L 1 ) = σ ( z ( L ) ) z ( L 1 ) w ( L 1 ) = a ( L 2 ) a ( L 1 ) w ( L 1 ) = σ ( z ( L 1 ) ) a ( L 2 ) C 0 w ( L 1 ) = 2 ( a ( L ) y ) σ ( z ( L ) ) a ( L 1 ) σ ( z ( L 1 ) ) a ( L 2 ) \begin{array}{rlrl} \frac{\partial a^{(L-1)}}{\partial z^{(L-1)}} & =\sigma^{\prime}\left(z^{(L)}\right) \\ \frac{\partial z^{(L-1)}}{\partial w^{(L-1)}} & =a^{(L-2)} & \\ \frac{\partial a^{(L-1)}}{\partial w^{(L-1)}} & = \sigma^{\prime}\left(z^{(L-1)}\right) * a^{(L-2)}\\ \frac{\partial C_{0}}{\partial w^{(L-1)}} & = 2\left(a^{(L)}-y\right) * \sigma^{\prime}\left(z^{(L)}\right) * a^{(L-1)} * \sigma^{\prime}\left(z^{(L-1)}\right) * a^{(L-2)} \end{array}

此时该神经元的梯度就是上一个神经元的激活值与该神经元输入与激活输出的局部梯度相乘,一直反向传播到最开始的神经元就可以得到最早期的神经元输出。根据链式求导法则就可以求得每一个神经元的梯度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b87ffXCM-1691847459843)(classical algorithm.assets/image-20230812151645267.png)]

这是三个单个神经元的过程,我们把他推广到多个神经元全连接:(其实只不过多了很多下标,整体流程是一致的,参数是矩阵形式,损失函数同时由多个神经元共同影响累加,整体以层为单位累加求和)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXVf4tKZ-1691847459843)(classical algorithm.assets/image-20230812160056339.png)]

  1. 我们精炼成两个关键步骤:

    • 计算局部梯度:针对每个节点,计算其相对于加权输入和输出之间关系(即激活函数)的偏导数(参数)
    • 链式规则:利用链式规则(也称为复合函数求导法则),将局部梯度(激活函数梯度 σ ( z ( L ) ) \sigma^{\prime}\left(z^{(L)}\right) )乘以上游节点对该节点的贡献(输入 a ( L 1 ) a^{(L-1)} ),以计算改神经元节点的梯度。( a ( L ) w ( L ) = σ ( z ( L ) ) a ( L 1 ) \frac{\partial a^{(L)}}{\partial w^{(L)}} = \sigma^{\prime}\left(z^{(L)}\right) * a^{(L-1)}
  2. 计算参数梯度:根据反向传播过程中计算得到的梯度信息,对每个参数进行偏导数计算。这可以通过将网络中各层的局部梯度与输入值(或前一层输出)相乘来实现。

  3. 更新参数:使用优化器(如随机梯度下降)根据参数的负梯度方向和学习率大小来更新模型中的权重和偏置项。

通过迭代执行以上步骤,不断调整神经网络的参数,使其能够更好地拟合训练数据,并在测试数据上表现出良好泛化能力。到这里,你就弄懂神经网络重要的部分,反向传播

如果你希望进一步了解反向传播算法及其相关细节,推荐以下资源:

  1. 视频教程: Backpropagation in Neural Networks (https://www.youtube.com/watch?v=Ilg3gGewQ5U) 3Blue1Brown !!
  2. 博客文章: A Gentle Introduction to Backpropagation (LSTM) (https://machinelearningmastery.com/gentle-introduction-backpropagation/)
  3. 课程笔记: CS231n Convolutional Neural Networks for Visual Recognition (http://cs231n.github.io/optimization-2/)

我们可以思考以下,如果在LSTM中等特殊改进神经单元,反向传播又是如何运行的呢?

答案是一样的: 我们的输出是 细胞状态的正切激活 * 输入数据和隐藏状态拼接的激活函数, 由此根据每一个时间步链式求导每一个权重矩阵,在每一个矩阵中再次通过累加求和导数,以此类推得到梯度,通过偏导求和得到整体矩阵,参数更新)

下一章我们将会讲解梯度消失和爆炸,通过了解反向传播,我们可以更加清楚其原理
在这里插入图片描述

						  🤞到这里,如果还有什么疑问🤞
					🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
					 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。