前言
之前一直对梯度下降算法的概念比较模糊,今天突然有了一点个人感悟,遂记录下来,欢迎批评指正。
关键点
梯度下降算法常用于神经网络的训练,比如BP神经网络。
其实这时输入可以看成是固定的1,而权值是自变量(是变量!)。梯度下降的任务就是计算损失函数对权值(自变量)的梯度,然后沿着负梯度方向 以学习率为步长 调整权值(自变量)。
注1:虽然我们通常有很多样本/输入,貌似输入是变量,其实不是的,输入是固定的。并且训练网络时这些样本通常不是一次全部作为输入(当然也可以这样),而是随机选择一部分样本作为输入,重复多次(节省时间,并且所有样本都有机会得到训练):
算法1
1. while 没到终止条件 // 比如终止条件是梯度向量的二范数
2. yangben0 <--- select 一部分样本;// 可以是一个到多个
3. 在yangben0条件下计算梯度;
4. 沿着负梯度方向,以学习率为步长,调整权值(自变量);
// 如果步骤4一直循环执行就意味着在该批样本下,一直调整到损失函数最小,然后再换下一批样本;
// 不过实际好像不会这样,而是这一步只执行一次,然后就换下一批样本。
5. end while
注1:步骤2中不同的选择方式会得到不同的训练结果(权值)
注2:步骤2中如果选1个样本,理论上可以,但是容易使算法跑偏/绕路(和“兼听则明,偏听则暗”的道理一样),所以为了不使算法跑偏,一般选多个样本。
注3:Learning TensorFlow书中(P43)说一般选50-500个个体,并且小样本对目标函数带来的扰动更大一点,一定程度上利于跳出局部最优
图解
未完待续。。。
参考
[深入浅出--梯度下降法及其实现] https://www.jianshu.com/p/c7e642877b0e
网友评论