单变量随机梯度下降(SDG(Stochastic Grident Descent))
正向计算过程:
Z n × 1 = W n × f ⋅ X f × 1 + B n × 1 Z^{n \times 1}=W^{n \times f} \cdot X^{f \times 1} + B^{n \times 1} Zn×1=Wn×f⋅Xf×1+Bn×1 A n × 1 = a ( Z ) A^{n \times 1}=a(Z) An×1=a(Z)
反向计算过程:
Δ Z n × 1 = J ′ ( W , B ) = A n × 1 − Y 1 × 1 \Delta Z^{n \times 1} = J'(W,B) = A^{n \times 1} - Y^{1 \times 1} ΔZn×1=J′(W,B)=An×1−Y1×1 W n × f = W n × f − η ⋅ ( Δ Z n × 1 ⋅ X T 1 × f ) W^{n \times f} = W^{n \times f} - \eta \cdot (\Delta Z^{n \times 1} \cdot X_T^{1 \times f}) Wn×f=Wn×f−η⋅(ΔZn×1⋅XT1×f) B n × 1 = B n × 1 − η ⋅ Δ Z n × 1 B^{n \times 1} = B^{n \times 1} - \eta \cdot \Delta Z^{n \times 1} Bn×1=Bn×1−η⋅ΔZn×1
其中:
f = 特 征 值 数 , m = 样 本 数 , n = 神 经 元 数 , η = 步 长 A = 预 测 值 , Y = 标 签 值 , X = 输 入 值 , X T = X 的 转 置 f=特征值数,m=样本数,n=神经元数,\eta=步长 \ A=预测值,Y=标签值,X=输入值,X_T=X的转置 f=特征值数,m=样本数,n=神经元数,η=步长 A=预测值,Y=标签值,X=输入值,XT=X的转置
- 训练样本:每次使用一个样本数据进行一次训练,更新一次梯度,重复以上过程。
- 优点:训练开始时损失值下降很快,随机性大,找到最优解的可能性大。
- 缺点:受单个样本的影响最大,损失函数值波动大,到后期徘徊不前,在最优解附近震荡。不能并行计算。
上图,迭代时,Loss值毛刺波动非常大,受样本差异影响。
上图,梯度下降时,开始收敛较快,到后期波动较大,找不到准确的方向。
全批量梯度下降(Batch Gradient Descent)
正向计算过程:
Z n × m = W n × f ⋅ X f × m + B n × 1 Z^{n \times m}=W^{n \times f} \cdot X^{f \times m} + B^{n \times 1} Zn×m=Wn×f⋅Xf×m+Bn×1 A n × m = a ( Z ) A^{n \times m}=a(Z) An×m=a(Z)
反向计算过程:
Δ Z n × m = J ′ ( W , B ) = A n × m − Y 1 × m \Delta Z^{n \times m} = J'(W,B) = A^{n \times m} - Y^{1 \times m} ΔZn×m=J′(W,B)=An×m−Y1×m W n × f = W n × f − η ⋅ 1 m ( Δ Z n × m ⋅ X T m × f ) W^{n \times f} = W^{n \times f} - \eta \cdot \frac{1}{m} (\Delta Z^{n \times m} \cdot X_T^{m \times f}) Wn×f=Wn×f−η⋅m1(ΔZn×m⋅XTm×f) (按列相加变成nx1) B n × 1 = B n × 1 − η ⋅ 1 m ∑ ( Δ Z n × m , a x i s = 1 ) B^{n \times 1} = B^{n \times 1} - \eta \cdot \frac{1}{m} \sum (\Delta Z^{n \times m}, axis=1) \tag{按列相加变成nx1} Bn×1=Bn×1−η⋅m1∑(ΔZn×m,axis=1)(按列相加变成nx1)
其中:
f = 特 征 值 数 , m = 样 本 数 , n = 神 经 元 数 , η = 步 长 A = 预 测 值 , Y = 标 签 值 , X = 输 入 值 , X T = X 的 转 置 f=特征值数,m=样本数,n=神经元数,\eta=步长 \ A=预测值,Y=标签值,X=输入值,X_T=X的转置 f=特征值数,m=样本数,n=神经元数,η=步长 A=预测值,Y=标签值,X=输入值,XT=X的转置
- 训练样本:每次使用全部数据集进行一次训练,更新一次梯度,重复以上过程。
- 优点:受单个样本的影响最小,一次计算全体样本速度快,损失函数值没有波动,到达最优点平稳。方便并行计算。
- 缺点:数据量较大时不能实现(内存限制),训练过程变慢。初始值不同,可能导致获得局部最优解,并非全局最优解。
上图,迭代时,Loss值没有毛刺波动。
上图,梯度下降时,直接了当达到最佳点。
小批量梯度下降(Mini-Batch Gradient Descent)
正向计算过程:
Z n × k = W n × f ⋅ X f × k + B n × 1 Z^{n \times k}=W^{n \times f} \cdot X^{f \times k} + B^{n \times 1} Zn×k=Wn×f⋅Xf×k+Bn×1
A n × k = a ( Z ) A^{n \times k}=a(Z) An×k=a(Z)
反向计算过程:
Δ Z n × k = J ′ ( W , B ) = A n × k − Y 1 × k \Delta Z^{n \times k} = J'(W,B) = A^{n \times k} - Y^{1 \times k} ΔZn×k=J′(W,B)=An×k−Y1×k W n × f = W n × f − η ⋅ 1 k ( Δ Z n × k ⋅ X T k × f ) W^{n \times f} = W^{n \times f} - \eta \cdot \frac{1}{k} (\Delta Z^{n \times k} \cdot X_T^{k \times f}) Wn×f=Wn×f−η⋅k1(ΔZn×k⋅XTk×f) (按列相加变成N x 1) B n × 1 = B n × 1 − η ⋅ 1 k ∑ ( Δ Z n × k , a x i s = 1 ) B^{n \times 1} = B^{n \times 1} - \eta \cdot \frac{1}{k} \sum (\Delta Z^{n \times k}, axis=1) \tag{按列相加变成N x 1} Bn×1=Bn×1−η⋅k1∑(ΔZn×k,axis=1)(按列相加变成N x 1)
其中:
f = 特 征 值 数 , k = 批 样 本 数 , n = 神 经 元 数 , η = 步 长 A = 预 测 值 , Y = 标 签 值 , X = 输 入 值 , X T = X 的 转 置 f=特征值数,k=批样本数,n=神经元数,\eta=步长 \ A=预测值,Y=标签值,X=输入值,X_T=X的转置 f=特征值数,k=批样本数,n=神经元数,η=步长 A=预测值,Y=标签值,X=输入值,XT=X的转置
结合了前两种的优点,又避免了前两者的缺点。
- 训练样本:选择一**小部分样本进行训练,**更新一次梯度,然后再选取另外一小部分样本进行训练,再更新一次梯度/
- 优点:不受单样本噪声影响,训练速度较快。
- 缺点:batch size的数值选择很关键,会影响训练结果。
一些概念:
- Batch Size:批大小,一次训练的样本数量。
- Iteration:迭代,一次正向+一次反向。
- Epoch:所有样本被使用了一次,叫做一个Epoch。
假设一共有样本1000个,batch size=20,则一个Epoch中,需要1000/20=50次Iteration才能训练完所有样本。
上图,迭代时,Loss值毛刺波动较小。
上图,梯度下降时,在接近中心时有小波动。图太小看不清楚,可以用matplot工具放大局部来观察。和全批量的图比较,靠近中心的线比较粗,说明有微小波动,而全批量是一根单直线。
小批量的大小通常由以下几个因素决定:
- 更大的批量会计算更精确的梯度,但是回报却是小于线性的
- 极小批量通常难以充分利用多核架构。这决定了最小批量的数值,低于这个值的小批量处理不会减少计算时间
- 如果批量处理中的所有样本可以并行地处理,那么内存消耗和批量大小成正比。对于多硬件设施,这是批量大小的限制因素。
- 某些硬件上使用特点大小的数组时,运行时间会更少,尤其是GPU,通常使用2的幂数作为批量大小可以更快,如32 ~ 256,大模型时尝试用16
- 可能是由于小批量在学习过程中加入了噪声,会带来一些正则化的效果。泛化误差通常在批量大小为1时最好。因为梯度估计的高方差,小批量使用较小的学习率,以保持稳定性,但是降低学习率会使迭代次数增加
在实际工程中,我们通常使用小批量梯度下降形式。
https://github.com/microsoft/ai-edu/blob/master/B-教学案例与实践/B6-神经网络基本原理简明教程/04.4-梯度下降的三种形式.md