一、梯度下降
上图的w0是选择的随机参数,沿着反梯度方向更新参数,参数的更新量为损失函数对前一层权重w的偏导数与学习率的乘积。
二、梯度下降的缺陷
f(x)是在所有样本上的损失的平均,当存在n个样本时,若训练50轮,则每一次迭代都是基于所有训练样本,计算损失函数梯度。
需要在n个样本上求一次导,计算太贵。
三、随机梯度下降
随机梯度下降,是指在时间t,随机选一个样本ti来近似f(x)——所有样本的损失平均(上图的x就是权重参数我)。
虽然是随机取的可能并不是f(x)——所有样本的损失平均,但只是权重矩阵参数w的变化方向是对的。
好处就是只需要算一个样本梯度,而不是算全部的,比较快速。但每次迭代中只使用一个样本计算梯度,因此每次迭代的梯度都是有噪声的,毕竟不是所有样本的均值,所以下降(下山)会走一点弯路,但总体因为总的迭代次数很多,所以随机梯度下降法最终会收敛到最优解 ,还是划得来的
可以看到相对于梯度下降的曲线,它的曲线不是那么直。
四、随机梯度下降的缺点
我们可以其看作一个下山的过程:对于梯度下降而已,是找到了最优的下山路径,所有它的曲线比较直,而对于随机梯度下降,它因为随机选一个样本ti来近似f(x)——所有样本的损失平均,所以找的并不是最优的下山路径,但方向是对的,只是要走弯路,因此它下山的曲线比较曲折。
它的震荡属性虽然更新方向不稳定,看你永远不能真正收敛,但它也正因为震荡,可以跳出局部最优(某些情况下)。
随机梯度下降是计算单样本的梯度的,这难以利用硬件资源(cpu/gpu,多核多线程)。而单样本是无法并行占满道整个运行资源的。所以我们一般使用多样本,例如:当有一千个核时,使用一千个样本,并行度就很高了。所以我们一般使用小批量随机梯度下降(GPU是专为多任务而生的,有成百上千各核,并发能力强,只使用一个样本时计算太小,难以利用资源)
五、小批量随机梯度下降(真正使用的)
对于梯度下降:是因为在整个训练集上算梯度太贵,我们计算梯度要对整个损失函数求导,这个损失函数是对我们所有样本的平均损失,求一次梯度就要把整个样本都算一遍,计算代价太大。所以采用b个样本的平均来近似于整个样本的损失平均,b大时,近似很精确,b小时,近似不精确,但计算梯度容易
上图b为批量大小——batch_size。
batch_size最好在一个合适的区间(批量小,计算慢;批量大,计算快,计算代价大)
六、小批量随机梯度下降的优点
小批量随机结合上述两个优点,也是曲折的,所以可能跳出局部最优
七、上述三者的迭代次数
梯度下降随机梯度下降
小批量梯度下降
八、闲谈
代码中梯度为什么要清0:梯度存储在.grad里面,pytorch不会自动将梯度设0,所以就要我们手动了
选择批量大小:
选择学习率