梯度下降法,就是求函数在某一点的导数/偏导数,在该方向上,函数的变化率最大,也就是说,在优化目标函数的时候,只要按照梯度的负方向优化即可。
为了更好的理解梯度下降法,首先,求解一个一元二次函数的系数,为了方便计算,假设方程为
最终的要求,就是求出k值。
首先,我们设定误差函数为
其中,Y是实际输出,Out是通过前向计算得到的结果。
基于该公式,我们可以得到误差函数的导数
但是在实际的计算过程中,我发现了一个问题,Error的负梯度本应该是取负值,也就是说,k的更新应该按照下述公式调整
但是在实际的结算过程中,以 x = 2, y = 2进行训练,最终k的变化结果如下:
总共设置了100次的迭代次数,k值应该为1,但是显然,k的值越来越小,离收敛的请也越来越远,这是什么原因?
问题出在了误差函数上,误差函数采用的是平方和,不管是(Y - Out)或者(Out - Y )都没有影响,但是在求导数的阶段,不同的误差导数就决定了k的修正方向,方向相反的情况下,k值只会越来越偏离真实结果。
为了解决这个问题,就需要确定误差函数究竟是(Y - Out)还是(Out - Y ),实际上,将问题进行简化,要让k接近真实值,那么误差值的方向应该与Out的方向相反,这里如果将Y当成一个常数,可以看到,对k求偏导时,只有Out起作用,基于此,可以看到,误差结果(Out - Y)的梯度方向才是正方向,那么其负梯度方向应该是 - (Out - Y),则k的调整公式应为
当然,如果将(Out - Y)写成(Y - Out),那么上式就变成了我们熟悉的公式
基于该公式再进行训练,设置误差率为0.01,k的变化曲线如下:
可以看到,经过了27次迭代之后,输出结果已经很接近1了。