机器学习公开课笔记(5):神经网络(Neural Network)——学习
这一章可能是Andrew Ng讲得最不清楚的一章,为什么这么说呢?这一章主要讲后向传播(Backpropagration, BP)算法,Ng花了一大半的时间在讲如何计算误差项,如何计算的矩阵,以及如何用Matlab去实现后向传播,然而最关键的问题——为什么要这么计算?前面计算的这些量到底代表着什么,Ng基本没有讲解,也没有给出数学的推导的例子。所以这次内容我不打算照着公开课的内容去写,在查阅了许多资料后,我想先从一个简单的神经网络的梯度推导入手,理解后向传播算法的基本工作原理以及每个符号代表的实际意义,然后再按照课程的给出BP计算的具体步骤,这样更有助于理解。
简单神经网络的后向传播(Backpropagration, BP)算法
1. 回顾之前的前向传播(ForwardPropagration, FP)算法
FP算法还是很简单的,说白了就是根据前一层神经元的值,先加权然后取sigmoid函数得到后一层神经元的值,写成数学的形式就是:
2. 回顾神经网络的代价函数(不含regularization项)
3. 一个简单神经网络的BP推导过程
BP算法解决了什么问题?我们已经有了代价函数,接下来我们需要利用梯度下降算法(或者其他高级优化算法)对进行优化从而得到训练参数,然而关键问题是,优化算法需要传递两个重要的参数,一个代价函数,另一个是代价函数的梯度,BP算法其实就是解决如何计算梯度的问题。
下面我们从一个简单的例子入手考虑如何从数学上计算代价函数的梯度,考虑如下简单的神经网络(为方便起见,途中已经给出了前向传播(FP)的计算过程),该神经网络有三层神经元,对应的有两个权重矩阵和,为计算梯度我们只需要计算两个偏导数即可:和。
首先我们先计算第2个权重矩阵的偏导数,即。首先我们需要在和之间建立联系,很容易可以看到的值取决于,而, 又是由取sigmoid得到,最后,所以他们之间的联系可以如下表示:
按照求导的链式法则,我们可以先求对的导数,然后乘以对的导数,即
由不难计算,令,上式可以重写为
接下来仅需要计算即可,由上一章的内容我们已经知道, ,忽略前面的(这里我们只对一个example推导,最后累加即可)
至此我们已经得到对的偏导数,即
接下来我们需要求对的偏导数,对的依赖关系如下:
根据链式求导法则有
我们分别计算等式右边的三项可得:
带入后得
令, 上式可以重写为
把上面的结果放在一起,我们得到对两个权重矩阵的偏导数为:
观察上面的四个等式,我们发现
- 偏导数可以由当前层神经元向量与下一层的误差向量相乘得到
- 当前层的误差向量可以由下一层的误差向量与权重矩阵的乘积得到
所以可以从后往前逐层计算误差向量(这就是后向传播的来源),然后通过简单的乘法运算得到代价函数对每一层权重矩阵的偏导数。到这里算是终于明白为什么要计算误差向量,以及为什么误差向量之间有递归关系了。尽管这里的神经网络十分简单,推导过程也不是十分严谨,但是通过这个简单的例子,基本能够理解后向传播算法的工作原理了。
严谨的后向传播算法(计算梯度)
假设我们有个训练example,层神经网络,并且此处考虑正则项,即
初始化:设置 (理解为对第层的权重矩阵的偏导累加值)
For i = 1 : m
- 设置
- 通过前向传播算法(FP)计算对各层的预测值,其中
- 计算最后一层的误差向量 ,利用后向传播算法(BP)从后至前逐层计算误差向量 , 计算公式为
- 更新
end // for
计算梯度:
BP实际运用中的技巧
1. 将参数展开成向量
对于四层三个权重矩阵参数将其展开成一个参数向量,Matlab code如下:
1 | thetaVec = [Theta1(:); Theta2(:); Theta3(:)]; |
2. 梯度检查
为了保证梯度计算的正确性,可以用数值解进行检查,根据导数的定义
Matlab Code 如下
1 2 3 4 5 6 7 | for i = 1 : n thetaPlus = theta; thetaPlus( i ) = thetaPlus( i ) + EPS; thetaMinus = theta; thetaMinus( i ) = thetaMinus( i ) - EPS; gradApprox( i ) = (J(thetaPlus) - J(thetaMinus)) / (2 * EPS); end |
最后检查 gradApprox 是否约等于之前计算的梯度值即可。需要注意的是:因为近似的梯度计算代价很大,在梯度检查后记得关闭梯度检查的代码。
3. 随机初始化
初始权重矩阵的初始化应该打破对称性 (symmetry breaking),避免使用全零矩阵进行初始化。可以采用随机数进行初始化,即
如何训练一个神经网络
- 随机初始化权重矩阵
- 利用前向传播算法(FP)计算模型预测值
- 计算代价函数
- 利用后向传播算法(BP)计算代价函数的梯度
- 利用数值算法进行梯度检查(gradient checking),确保正确后关闭梯度检查
- 利用梯度下降(或者其他优化算法)求得最优参数
附:一个简短的后向传播教学视频
参考文献
[1] Andrew Ng Coursera 公开课第五周
[2] Derivation of Backpropagation. http://web.cs.swarthmore.edu/~meeden/cs81/s10/BackPropDeriv.pdf
[3] Wikipedia: Backpropagation. https://en.wikipedia.org/wiki/Backpropagation
[4] How the backpropagation algorithm works. http://neuralnetworksanddeeplearning.com/chap2.html
[5] 神经网络和反向传播算法推导. http://www.mamicode.com/info-detail-671452.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南