最常见的算法——梯度下降
当一个模型没有显示解的时候,该怎么办呢?
- 首先挑选一个参数的随机初始值,可以随便在什么地方都没关系,然后记为 w 0 \pmb{w_{0}} w0
- 在接下来的时刻里面,我们不断的去更新 w 0 \pmb{w_{0}} w0,使得它接近我们的最优解
具体来说:
- 挑选一个初始值 w 0 \pmb{w_{0}} w0
- 重复迭代参数 t = 1 , 2 , 3 t = 1,2,3 t=1,2,3 w t = w t − 1 − η ∂ ℓ ∂ w t − 1 \pmb{w}_{t}=\pmb{w}_{t-1}-\eta \frac{\partial \ell}{\partial \pmb{w}_{t-1}} wt=wt−1−η∂wt−1∂ℓ η \eta η是一个标量(学习率,步长的超参数), ∂ ℓ ∂ w t − 1 \frac{\partial \ell}{\partial \pmb{w}_{t-1}} ∂wt−1∂ℓ是损失函数关于 w t − 1 \pmb{w_{t-1}} wt−1处的梯度。
梯度是使得函数的值增加最快的方向,那么负梯度就是使得这个函数的值减少最快的方向。
学习率是指每次我沿着这个负梯度的方向走多远
直观的从图上来看,这个类似一个地理中的等高线,在同一条等高线上的函数值是相同的。 − η ∂ ℓ ∂ w t − 1 -\eta \frac{\partial \ell}{\partial \pmb{w}_{t-1}} −η∂wt−1∂ℓ表示的是由 w 0 \pmb{w_{0}} w0到 w 1 \pmb{w_{1}} w1的这条向量(或者是由 w 1 \pmb{w_{1}} w1到 w 2 \pmb{w_{2}} w2的这条向量)。把 w 0 \pmb{w_{0}} w0和这个向量一加,就会到 w 1 \pmb{w_{1}} w1的位置。
学习率是指的步长,是我们人为选定的超参数。不能选的太小,也不能选的太大。
- 选的太小:每一次走的步长很有限,我们到达一个点需要走很多步,这不是一个很好的事情。计算梯度是一件很贵的事情,是整个模型训练中最贵的部分,所以我们要尽可能的少去计算梯度。
- 选的太大:一下子步子迈得太大,会使得我们一直在震荡,并没有在严格下降。
更常见的算法——小批量随机梯度下降
-
在整个训练集上算梯度太贵了
一个深度神经网络模型可能需要数分钟至数小时 -
我们可以随机采样 b b b个样本 i 1 , i 2 , . . . , i b i_{1},i_{2},...,i_{b} i1,i2,...,ib来近似损失(用 b b b个样本的平均损失来近似所有 n n n个样本的平均损失)
1 b ∑ i ∈ I b ℓ ( x i , y i , w ) \frac{1}{b}\sum_{i\in I_{b}}\ell(\pmb{x}_{i},y_{i},\pmb{w}) b1i∈Ib∑ℓ(xi,yi,w)
b b b是批量大小,另一个重要的超参数。
当 b b b很大的时候,近似很精确,当 b b b很小的时候,近似不那么精确,但是计算它的梯度很容易,梯度计算的复杂度与样本的个数线性相关。 -
批量不能太小:每次计算量太小,不适合并行来最大化利用计算资源(深度学习模型会用GPU来计算,但批量太小不能有效利用GPU并行计算)
-
批量不能太大:内存消耗增加,浪费计算,例如如果所有的样本都是相同的
总结
- 梯度下降通过不断沿着反梯度方向更新参数求解
- 小批量随机梯度下降是深度学习默认的求解算法
- 两个重要的超参数是批量大小和学习率