🤵♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱🏍
🙋♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]
反向传播算法
反向传播算法是一种用于训练神经网络的常用优化算法。它通过计算损失函数对每个参数的梯度,然后根据这些梯度更新参数值,以使得神经网络能够逐步调整和改进其预测结果。
下面是一个详细解释反向传播算法的步骤:
-
前向传播:从输入开始,通过神经网络进行前向传播。每个节点都会将输入加权求和,并应用非线性激活函数(如ReLU、Sigmoid等),生成输出。
-
定义损失函数:选择合适的损失函数来衡量模型预测与实际标签之间的差异。例如,在分类问题中可以使用交叉熵损失或均方误差损失。
-
反向传播:从输出层开始,计算每个节点对于最终预测结果的贡献程度,并将该信息沿着网络进行反向传播(在最后一层输出开始,以计算损失函数)。
这里我们以三个全连接神经元为例。 整体导数通过链式法则链接,公式如下:
∂ 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(L)∂C0=∂w(L)∂z(L)∂z(L)∂a(L)∂a(L)∂C0
这是损失函数与最后一个神经元 W W W参数的偏导数(偏置 b i a s bias bias同样样),其中我们可以看到“一同激活的神经元联系在一起”,上一个神经元的激活值就是下一个神经元的导数。
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 ) ∂ 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 C_{0}}{\partial w^{(L)}} & = 2\left(a^{(L)}-y\right) * \sigma^{\prime}\left(z^{(L)}\right) * a^{(L-1)} \end{array} C0z(L)a(L)∂a(L)∂C0∂z(L)∂a(L)∂w(L)∂z(L)∂w(L)∂C0=(a(L)−y)2=w(L)a(L−1)+b(L)=σ(z(L))=2(a(L)−y)=σ′(z(L))=a(L−1)=2(a(L)−y)∗σ′(z(L))∗a(L−1)
再反向一个神经元,公式如下:
∂ a ( L − 1 ) ∂ z ( L − 1 ) = σ ′ ( z ( L ) ) ∂ z ( L − 1 ) ∂ w ( L − 1 ) = a ( L − 2 ) ∂ C 0 ∂ w ( L ) = σ ′ ( z ( L ) ) ∗ 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 C_{0}}{\partial w^{(L)}} & = \sigma^{\prime}\left(z^{(L)}\right) * a^{(L-2)} \end{array} ∂z(L−1)∂a(L−1)∂w(L−1)∂z(L−1)∂w(L)∂C0=σ′(z(L))=a(L−2)=σ′(z(L))∗a(L−2)
此时该神经元的梯度就是上一个神经元的激活值与该神经元输入与激活输出的局部梯度相乘,一直反向传播到最开始的神经元就可以得到最早期的神经元输出。这是三个单个神经元的过程,我们把他推广到多个神经元全连接:(其实只不过多了很多下标,整体流程是一致的,参数是矩阵形式,损失函数同时由多个神经元共同影响累加,整体以层为单位累加求和)
我们精炼成两个关键步骤:
- 计算局部梯度:针对每个节点,计算其相对于加权输入和输出之间关系(即激活函数)的偏导数(参数)。
- 链式规则:利用链式规则(也称为复合函数求导法则),将局部梯度(激活函数梯度)乘以上游节点对该节点的贡献(加权输入梯度),以计算上游节点的梯度。(参数 w w w与激活输出的梯度)
-
计算参数梯度:根据反向传播过程中计算得到的梯度信息,对每个参数进行偏导数计算。这可以通过将网络中各层的局部梯度与输入值(或前一层输出)相乘来实现。
-
更新参数:使用优化器(如随机梯度下降)根据参数的负梯度方向和学习率大小来更新模型中的权重和偏置项。
通过迭代执行以上步骤,不断调整神经网络的参数,使其能够更好地拟合训练数据,并在测试数据上表现出良好泛化能力。到这里,你就弄懂神经网络重要的部分,反向传播,以下图片有两种数学公式形式表示损失函数的导数,一个三个导函数的累积,一个是MSE的求导
如果你希望进一步了解反向传播算法及其相关细节,推荐以下资源:
- 视频教程: Backpropagation in Neural Networks (https://www.youtube.com/watch?v=Ilg3gGewQ5U) 3Blue1Brown !!
- 博客文章: A Gentle Introduction to Backpropagation (LSTM) (https://machinelearningmastery.com/gentle-introduction-backpropagation/)
- 课程笔记: CS231n Convolutional Neural Networks for Visual Recognition (http://cs231n.github.io/optimization-2/)
我们可以思考以下,如果在LSTM中等特殊改进神经单元,反向传播又是如何运行的呢?
答案是一样的: 我们的输出是 细胞状态的正切激活 * 输入数据和隐藏状态拼接的激活函数, 由此根据每一个时间步链式求导每一个权重矩阵,在每一个矩阵中再次通过累加求和导数,以此类推得到梯度,通过偏导求和得到整体矩阵,参数更新)
下一章我们将会讲解梯度消失和爆炸,通过了解反向传播,我们可以更加清楚其原理
🤞到这里,如果还有什么疑问🤞🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳