梯度下降是最小化风险函数/损失函数的一种经典常见的方法,下面总结下三种梯度下降算法异同。
1、 批量梯度下降算法(Batch gradient descent)
以线性回归为例,损失函数为
BGD算法核心思想为每次迭代用所有的训练样本来更新Theta,这对于训练样本数m很大的情况是很耗时的。
BGD算法表示为
或者表示为
其中X(m*n)为训练样本矩阵,α为学习速率,m为样本数,y(m*1)为样本结果标签向量,Theta(n*1)为参数向量
其中损失函数 J 对Theta的导数为
foriter =1:num_iterstheta=theta-alpha/m*X'*(X*theta-y);end
1
2
3
4
5
迭代num_iters次的BGD如上述代码所示
BGD大体执行过程
2、随机梯度下降算法(Stochastic Gradient Descent)
SGD在大规模训练集上会更高效
SGD的损失函数也与BGD有所不同
SGD算法在于每次只去拟合一个训练样本,这使得在梯度下降过程中不需去用所有训练样本来更新Theta。BGD每次迭代都会朝着最优解逼近,而SGD由于噪音比BGD多,多以SGD并不是每次迭代都朝着最优解逼近,但大体方向是朝着最优解,SGD大约要遍历1-10次数据次来获取最优解。
SGD算法大体分两步
SGD算法大体执行过程
其中学习速率α一般设置为常数,但我们也可以将α随迭代次数而减小,这样更有利于我们函数收敛向最优解
小批量梯度下降算法(Mini-batch Gradient Descent)
MBGD有时候甚至比SGD更高效。
MBGD不像BGD每次用m(所有训练样本数)个examples去训练,也不像SGD每次用一个example。MBGD使用中间值b个examples
经典的b取值大约在2-100
例如 b=10,m=1000
此处MBGD每次只用10个examples来训练。
参考自Andrew NG 在coursera的machine learning week10