神经网络—— 优化
神经网络—— 优化
01 梯度下降法
核心概念
-
偏导数:函数曲线上的切线斜率,即函数在某一点的变化率。对于多元函数,偏导数表示函数在坐标轴正方向上的变化率。
- 偏导数fx(x,y)f_{x}(x, y)fx(x,y):曲面被平面y=y0y=y_{0}y=y0截取后,所得曲线在点M0M_{0}M0处的切线M0TxM_{0}T_{x}M0Tx对x轴的斜率。
- 偏导数fy(x,y)f_{y}(x, y)fy(x,y):曲面被平面x=x0x=x_{0}x=x0截取后,所得曲线在点M0M_{0}M0处的切线M0TyM_{0}T_{y}M0Ty对y轴的斜率。
-
方向导数:用于研究函数沿各个不同方向的变化率,是一个标量。其数学定义为:
∂f∂l∣(x0,y0)=limΔx→0Δy→0f(x0+Δx,y0+Δy)−f(x0,y0)Δx2+Δy2\left.\frac{\partial f}{\partial l}\right|_{\left(x_{0}, y_{0}\right)}=\lim _{\substack{\Delta x \to 0 \\ \Delta y \to 0}} \frac{f\left(x_{0}+\Delta x, y_{0}+\Delta y\right)-f\left(x_{0}, y_{0}\right)}{\sqrt{\Delta x^{2}+\Delta y^{2}}}∂l∂f(x0,y0)=limΔx→0Δy→0Δx2+Δy2f(x0+Δx,y0+Δy)−f(x0,y0) -
梯度:
- 本质是矢量,其方向是方向导数取得最大值的方向,梯度的模等于最大方向导数的值。
- 单变量函数中,梯度即函数的微分,代表函数在某一给定点的切线斜率(或该点的上升最快方向)。
- 多变量函数中,梯度是一个向量,指明函数在给定点的上升最快方向。
- 存在条件:函数需具有一阶连续偏导数。
- 几何性质:梯度垂直于原函数的等值面(如x2+y2=Cx^2+y^2=Cx2+y2=C的梯度∇w=(2x,2y)\nabla w=(2x,2y)∇w=(2x,2y)垂直于该圆)。
-
单变量与多变量导数:
- 单变量函数导数:df(x)dx=limh→0f(x+h)−f(x)h\frac{d f(x)}{d x}=\lim _{h \to 0} \frac{f(x+h)-f(x)}{h}dxdf(x)=limh→0hf(x+h)−f(x)
- 多变量函数中,梯度是偏导数构成的向量。
梯度下降法的核心思想与算法
核心思想
梯度指示函数的“上升最快方向”,因此负梯度方向就是函数的“下降最快方向”。通过沿负梯度方向逐步迭代更新参数,可找到函数的局部最优值。其数学保证是:若步长足够小,沿负梯度方向移动时,函数值必然减小。
算法步骤
- 随机选择初始点x0x_{0}x0。
- 迭代更新参数直至收敛,更新公式为:
xt+1=xt−γt∇f(xt)x_{t+1}=x_{t}-\gamma _{t}\nabla f(x_{t})xt+1=xt−γt∇f(xt)
其中,γt\gamma_{t}γt为第ttt步的步长(有时也称为学习率)。 - 收敛判定条件:当梯度的模小于某一极小值ϵ\epsilonϵ(ϵ>0\epsilon>0ϵ>0)时,即∥∇f(xt)∥≤ϵ\left\|\nabla f(x_{t})\right\| ≤\epsilon∥∇f(xt)∥≤ϵ,停止迭代。
步长(学习率)的影响
以函数f(x)=x2f(x)=x^2f(x)=x2为例(初始点x(0)=−4x(0)=-4x(0)=−4),步长对迭代过程的影响如下:
-
步长为0.8时:
- 第1步更新:x(1)=−4−0.8×2×(−4)=2.4x(1)=-4 - 0.8×2×(-4)=2.4x(1)=−4−0.8×2×(−4)=2.4
- 第2步更新:x(2)=2.4−0.8×2×2.4=0.4x(2)=2.4 - 0.8×2×2.4=0.4x(2)=2.4−0.8×2×2.4=0.4(逐步向最优值0靠近)。
-
不同步长的全局影响(通过损失函数曲线观察):
- 学习率过高:损失函数波动剧烈,甚至可能不收敛(参数在最优值附近震荡或偏离)。
- 学习率过低:损失函数下降缓慢,迭代次数多,训练效率低。
- 学习率适中:损失函数平稳下降,快速趋近最优值。
高维函数的优化与牛顿法
对于高维函数f(x)f(x)f(x),优化目标是找到梯度为0的点(∇f(x)=0\nabla f(x)=0∇f(x)=0)。利用泰勒展开近似梯度:
∇f(x+h)=∇f(x)+hTHf(x)+O(∣∣h∣∣2)\nabla f(x+h)=\nabla f(x)+h^{T}H_{f}(x)+O(||h||^{2})∇f(x+h)=∇f(x)+hTHf(x)+O(∣∣h∣∣2)
其中,HfH_{f}Hf为函数fff的黑塞矩阵(二阶导数矩阵)。基于此,牛顿法的参数更新公式为:
xn+1=xn−Hf(xn)−1∇f(xn)x_{n+1}=x_{n}-H_{f}(x_{n})^{-1}\nabla f(x_{n})xn+1=xn−Hf(xn)−1∇f(xn)
牛顿法收敛速度快于普通梯度下降,但计算黑塞矩阵的逆复杂度高(尤其高维场景)。
02 批量大小优化(随机梯度下降)
批量大小的分类与定义
批量大小(batch size)指每次迭代时用于计算梯度的训练样本数量,根据批量大小可将梯度下降分为三类:
| 类型 | 批量大小 | 核心特点 |
|---|---|---|
| 随机梯度下降(SGD) | batch_size=1 | 每次随机选1个样本更新参数;更新速度快,但方向随机性大,收敛波动明显。 |
| 小批量梯度下降(MBGD) | 1<batch_size<N(N为总样本数) | 综合SGD与BGD的优点:更新速度较快,波动较小;支持矩阵运算优化,无内存瓶颈。 |
| 朴素梯度下降(BGD) | batch_size=N | 每次用全部样本计算梯度;更新方向准确、稳定,但训练时间长,不支持在线更新。 |
各方法的数学推导(以线性判别函数为例)
假设判别函数为fw(x(i))=wTx(i)f_{w}(x^{(i)})=w^{T} x^{(i)}fw(x(i))=wTx(i),损失函数为均方误差(MSE),三种方法的梯度计算与参数更新公式如下:
1. 随机梯度下降(SGD)
- 目标函数(单样本):L(i)(w)=(fw(x(i))−y(i))2L^{(i)}(w)=(f_{w}(x^{(i)})-y^{(i)})^{2}L(i)(w)=(fw(x(i))−y(i))2
- 梯度计算:∇L(i)(w)∇wj=(fw(x(i))−y(i))xj(i)\frac{\nabla L^{(i)}(w)}{\nabla w_{j}}=\left(f_{w}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}∇wj∇L(i)(w)=(fw(x(i))−y(i))xj(i)
- 参数更新:wj:=wj−η⋅(fw(x(i))−y(i))xj(i)w_{j}:=w_{j}-\eta \cdot \left(f_{w}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}wj:=wj−η⋅(fw(x(i))−y(i))xj(i)
(η\etaη为学习率,每次仅用1个样本更新)。
2. 朴素梯度下降(BGD)
- 目标函数(全样本):L(w)=1M∑i=1M(fw(x(i))−y(i))2L(w)=\frac{1}{M} \sum_{i=1}^{M}(f_{w}(x^{(i)})-y^{(i)})^{2}L(w)=M1∑i=1M(fw(x(i))−y(i))2(M=NM=NM=N)
- 梯度计算:∇L(w)∇wj=1M∑i=1M(fw(x(i))−y(i))xj(i)\frac{\nabla L(w)}{\nabla w_{j}}=\frac{1}{M} \sum_{i=1}^{M}\left(f_{w}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}∇wj∇L(w)=M1∑i=1M(fw(x(i))−y(i))xj(i)
- 参数更新:wj:=wj−η⋅1M∑i=1M(fw(x(i))−y(i))xj(i)w_{j}:=w_{j}-\eta \cdot \frac{1}{M} \sum_{i=1}^{M}\left(f_{w}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}wj:=wj−η⋅M1∑i=1M(fw(x(i))−y(i))xj(i)
(每次用全部样本计算平均梯度,更新方向稳定)。
3. 小批量梯度下降(MBGD)
- 目标函数(小批量样本):L(w)=1k∑i=1k(fw(x(i))−y(i))2L(w)=\frac{1}{k} \sum_{i=1}^{k}(f_{w}(x^{(i)})-y^{(i)})^{2}L(w)=k1∑i=1k(fw(x(i))−y(i))2(k<Nk<Nk<N)
- 梯度计算:∇L(w)∇wj=1k∑i=1k(fw(x(i))−y(i))xj(i)\frac{\nabla L(w)}{\nabla w_{j}}=\frac{1}{k} \sum_{i=1}^{k}\left(f_{w}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}∇wj∇L(w)=k1∑i=1k(fw(x(i))−y(i))xj(i)
- 参数更新:wj:=wj−η⋅1k∑i=1k(fw(x(i))−y(i))xj(i)w_{j}:=w_{j}-\eta \cdot \frac{1}{k} \sum_{i=1}^{k}\left(f_{w}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)}wj:=wj−η⋅k1∑i=1k(fw(x(i))−y(i))xj(i)
(平衡更新速度与稳定性,为当前主流方法)。
各方法的损失曲线对比
- BGD:损失曲线平滑,稳定下降,但下降速度慢(迭代次数少,每次迭代计算量大)。
- SGD:损失曲线振幅大,波动剧烈,收敛过程不稳定,但初始下降快。
- MBGD:损失曲线介于两者之间,波动较小,下降速度适中,兼顾效率与稳定性。
03 类别优化(进阶优化算法)
为解决普通SGD收敛慢、波动大的问题,研究者提出了多种进阶优化算法,核心思路包括“优化梯度方向”和“个性化梯度衰减”。
1. 动量法(Momentum)
核心思想
模拟物理中“小球下坡”的动量效应:小球在梯度方向上运动时会积累速度,同时通过“摩擦力”抑制震荡。即使梯度方向变化,动量也能使参数沿之前的趋势继续更新,加快收敛并减少波动。
数学公式
- 速度更新(积累动量):vt=αvt−1−η∇f(xt−1)v_{t}=\alpha v_{t-1}-\eta \nabla f\left(x_{t-1}\right)vt=αvt−1−η∇f(xt−1)
(α\alphaα为动量系数,通常取0.5、0.9或0.99,可随迭代逐步增大,如从0.5增至0.99)。 - 参数更新:xt=xt−1+vtx_{t}=x_{t-1}+v_{t}xt=xt−1+vt
特点
- 抑制高曲率方向的震荡(如鞍点或局部极值附近)。
- 在梯度平缓且方向一致的区域,积累速度,加快收敛。
- 无法保证找到全局最优,但能有效逃离较差的局部最优。
2. 内斯特罗夫动量法(Nesterov Momentum)
核心改进
对普通动量法的“前瞻式”优化:先沿之前积累的动量方向大步移动,再根据新位置的梯度进行修正,避免“过度冲过”最优值。
数学公式
vt=αvt−1−η∇f(xt−1+αvt−1)v_{t}=\alpha v_{t-1}-\eta \nabla f\left(x_{t-1}+\alpha v_{t-1}\right)vt=αvt−1−η∇f(xt−1+αvt−1)
xt=xt−1+vtx_{t}=x_{t-1}+v_{t}xt=xt−1+vt
特点
- 相比普通动量法,对参数更新方向的修正更及时,收敛更稳定。
- 尤其适用于梯度变化较大的场景,减少“震荡冲过”的风险。
3. 自适应梯度算法(Adagrad)
核心思想
为不同参数分配“个性化学习率”:梯度较大的参数(更新频繁),学习率自动减小;梯度较小的参数(更新缓慢),学习率自动增大,避免在平缓区域徘徊。
数学公式
- 累积梯度平方(缓存):cache+=dx2cache += dx^2cache+=dx2
- 参数更新:x+=−ηcache+ϵ⋅dxx += -\frac{\eta}{\sqrt{cache}+\epsilon} \cdot dxx+=−cache+ϵη⋅dx
(ϵ=10−7\epsilon=10^{-7}ϵ=10−7,避免分母为0)。
优缺点
- 优点:无需手动调整学习率,对稀疏数据(部分参数梯度小)友好。
- 缺点:梯度平方累积会导致分母越来越大,最终学习率趋近于0,训练后期停止更新。
4. 均方根传播算法(RMSProp)
核心改进
解决Adagrad“学习率衰减至0”的问题:用指数加权移动平均替代梯度平方的累积,减少久远梯度的影响,保留近期梯度信息。
数学公式
- 移动平均梯度平方:St=βSt−1+(1−β)∇f2(xt)S_{t}=\beta S_{t-1}+(1-\beta) \nabla f^{2}\left(x_{t}\right)St=βSt−1+(1−β)∇f2(xt)
(β=0.999\beta=0.999β=0.999,权重随时间指数衰减,近期梯度权重更大)。 - 参数更新:xt+1=xt−ηSt+ε∇f(xt)x_{t+1}=x_{t}-\frac{\eta}{\sqrt{S_{t}}+\varepsilon} \nabla f\left(x_{t}\right)xt+1=xt−St+εη∇f(xt)(ε=10−6\varepsilon=10^{-6}ε=10−6)。
特点
- 梯度平方的移动平均满足St=(1−β)∑i=0∞βi∇f2(xt−i)S_t=(1-\beta)\sum_{i=0}^{\infty}\beta^i \nabla f^2(x_{t-i})St=(1−β)∑i=0∞βi∇f2(xt−i),权重和为1,避免学习率过早衰减。
- 适用于非平稳目标(如在线学习),收敛稳定。
5. 学习率衰减
上述算法(SGD、Momentum、Adagrad、RMSProp等)均需设置初始学习率,为进一步优化收敛,可采用学习率衰减策略:
- 步长衰减:每经过一定迭代轮次(如每10轮),学习率减半(如η=η0/2\eta=\eta_0/2η=η0/2)。
- 指数衰减:学习率随轮次指数下降(如η=η0⋅e−kt\eta=\eta_0 \cdot e^{-kt}η=η0⋅e−kt,kkk为衰减系数)。
- 1/t衰减:学习率与迭代次数成反比(如η=η0/(1+kt)\eta=\eta_0/(1+kt)η=η0/(1+kt))。
04 反向传播算法
算法背景与核心意义
- 提出时间:1986年,解决了多层人工神经网络(ANN)的权重更新问题。
- 核心思想:将网络的全局误差从输出层反向传播至输入层,根据误差对各层权重进行比例修正,是目前最重要的神经网络学习算法。
- 关键依赖:基于链式法则计算误差对各权重的偏导数,依赖Sigmoid等可微激活函数实现误差传递。
算法流程
反向传播算法分为“前向传播”和“反向传播”两个阶段:
1. 前向传播(Feed-forward)
从输入层到输出层计算各节点的输出值:
- 对于某一层节点iii,输入zi=∑jwjiyj+biz_i=\sum_{j}w_{ji}y_j + b_izi=∑jwjiyj+bi(wjiw_{ji}wji为前一层节点jjj到当前节点iii的权重,bib_ibi为偏置)。
- 输出yi=f(zi)y_i=f(z_i)yi=f(zi)(fff为激活函数,如Sigmoid函数f(x)=11+e−xf(x)=\frac{1}{1+e^{-x}}f(x)=1+e−x1)。
示例(二层隐藏层网络):
- 第一层隐藏层(节点3、4):z3=w31x1+w32x2+b3z_3=w_{31}x_1 + w_{32}x_2 + b_3z3=w31x1+w32x2+b3,y3=f(z3)y_3=f(z_3)y3=f(z3);z4、y4z_4、y_4z4、y4同理。
- 第二层隐藏层(节点5):z5=w53y3+w54y4+b5z_5=w_{53}y_3 + w_{54}y_4 + b_5z5=w53y3+w54y4+b5,y5=f(z5)y_5=f(z_5)y5=f(z5)。
- 输出层(节点6):z6=w65y5+b6z_6=w_{65}y_5 + b_6z6=w65y5+b6,y6=f(z6)y_6=f(z_6)y6=f(z6)(最终输出)。
2. 反向传播(Back-propagation)
从输出层到输入层计算误差对各权重的偏导数,更新权重:
- 误差定义:采用均方误差(MSE),E=12∑j(tj−oj)2E=\frac{1}{2}\sum_{j}(t_j - o_j)^2E=21∑j(tj−oj)2(tjt_jtj为目标输出,ojo_joj为实际输出)。
- 核心工具:链式法则,即误差对权重的偏导数=误差对输出的偏导数×输出对输入的偏导数×输入对权重的偏导数。
Sigmoid函数的导数(关键推导):
f′(x)=f(x)(1−f(x))f'(x)=f(x)(1-f(x))f′(x)=f(x)(1−f(x))
(推导:f(x)=11+e−xf(x)=\frac{1}{1+e^{-x}}f(x)=1+e−x1,求导后化简可得)。
权重更新示例(以W53W_{53}W53为例)
假设网络参数与输入如下:
- 输入x1=0.35x_1=0.35x1=0.35,x2=0.9x_2=0.9x2=0.9;初始权重w31=0.1w_{31}=0.1w31=0.1,w32=0.8w_{32}=0.8w32=0.8,w53=0.3w_{53}=0.3w53=0.3;目标输出t5=0.5t_5=0.5t5=0.5,激活函数为Sigmoid。
步骤1:前向传播计算输出
- 第一层隐藏层节点3的输入:z3=0.1×0.35+0.8×0.9=0.755z_3=0.1×0.35 + 0.8×0.9=0.755z3=0.1×0.35+0.8×0.9=0.755,输出y3=f(0.755)=0.682y_3=f(0.755)=0.682y3=f(0.755)=0.682。
- 第二层隐藏层节点5的输入:z5=0.3×0.682+w54y4+b5z_5=0.3×0.682 + w_{54}y_4 + b_5z5=0.3×0.682+w54y4+b5(假设y4=0.663y_4=0.663y4=0.663),输出y5=f(z5)=0.69y_5=f(z_5)=0.69y5=f(z5)=0.69。
步骤2:反向传播计算权重偏导数
根据链式法则:
∂E∂w53=∂E∂y5⋅∂y5∂z5⋅∂z5∂w53\frac{\partial E}{\partial w_{53}}=\frac{\partial E}{\partial y_5} \cdot \frac{\partial y_5}{\partial z_5} \cdot \frac{\partial z_5}{\partial w_{53}}∂w53∂E=∂y5∂E⋅∂z5∂y5⋅∂w53∂z5
-
∂E∂y5=y5−t5=0.69−0.5=0.19\frac{\partial E}{\partial y_5}=y_5 - t_5=0.69 - 0.5=0.19∂y5∂E=y5−t5=0.69−0.5=0.19
-
∂y5∂z5=y5(1−y5)=0.69×0.31≈0.2139\frac{\partial y_5}{\partial z_5}=y_5(1 - y_5)=0.69×0.31≈0.2139∂z5∂y5=y5(1−y5)=0.69×0.31≈0.2139
-
∂z5∂w53=y3=0.682\frac{\partial z_5}{\partial w_{53}}=y_3=0.682∂w53∂z5=y3=0.682
-
最终偏导数:∂E∂w53=0.19×0.2139×0.682≈0.02711\frac{\partial E}{\partial w_{53}}=0.19×0.2139×0.682≈0.02711∂w53∂E=0.19×0.2139×0.682≈0.02711。
步骤3:更新权重
w53,new=w53,old−η⋅∂E∂w53w_{53,\text{new}} = w_{53,\text{old}} - \eta \cdot \frac{\partial E}{\partial w_{53}}w53,new=w53,old−η⋅∂w53∂E。
当假设学习率 η=1\eta=1η=1时,代入公式可计算出更新后的权重 w53,new=0.3−0.02711=0.27289w_{53,\text{new}}=0.3 - 0.02711=0.27289w53,new=0.3−0.02711=0.27289
算法特点
- 误差传递:输出层误差可直接计算,隐藏层误差通过后续层的误差反向推导(解决了“隐藏层输出未知无法计算误差”的问题)。
- 权重修正:各层权重的修正量与误差大小成正比,实现“精准优化”。
- 适用场景:多层全连接神经网络、卷积神经网络(CNN)、循环神经网络(RNN)等各类深度模型的训练。
