本文以二维线性拟合为例,介绍批量梯度下降法、随机梯度下降法、小批量梯度下降法三种方法,求解拟合的线性模型参数。
需要拟合的数据集是 $(X_1, y_1), (X_2, y_2)..., (X_n, y_n)$,其中$X^i=(x_1^i, x_2^i)$,表示2个特征,$y^i$是对应的回归值。
拟合得到的函数是 $h_{ heta_1, heta_2}(X)$,尽可能使${h_{{ heta _1},{ heta _2}}}(X) approx y$。
损失函数是$J( heta_1, heta_2) = sumlimits_{i = 1}^n {{{({h_{ heta_1, heta_2} }({x_i}) - {y_i})}^2}}$。
损失函数是我们的性能评价指标,损失函数越小,代表我们得到函数$h_{ heta_1, heta_2}(X)$越能够拟合该数据集。
由于负梯度(函数的导数即为梯度)的方向是局部下降最快的地方,所以为了最小化损失函数,我们沿着损失函数的负梯度方向来调整参数。
1 批量梯度下降法(Batch Gradient Descent)
批量梯度下降法每次更新参数$ heta$都要计算所有的样本数,求全局最优,所以训练开销很大,算法描述如下:
1. 初始化$ heta_1, heta_2$,设置学习率$alpha$和终止条件$varepsilon$
2. 计算$ heta_1, heta_2$的梯度(偏导数),判断是否都小于终止条件$varepsilon$,若小于输出参数$ heta_1, heta_2$,若不小于,重复第三步。
3. 更新$ heta_1, heta_2$
$ heta_1 = heta_1 - alpha(frac{partial }{{partial { heta _1}}}J({ heta _1},{ heta _2}))$
$ = { heta _1} - alpha sumlimits_{i = 0}^n {({h_{{ heta _1},{ heta _2}}}({x_1}^i,{x_2}^i) - {y^i}){x_1}^i} $
$ heta_2 = heta_2 - alpha(frac{partial }{{partial { heta _2}}}J({ heta _1},{ heta _2}))$
$ = { heta _2} - alpha sumlimits_{i = 0}^n {({h_{{ heta _1},{ heta _2}}}({x_1}^i,{x_2}^i) - {y^i}){x_2}^i} $
批量梯度法稳定地下降,速度较慢。
2 随机梯度下降法(Stochastic Gradient Descent)
随机梯度下降法原理上与批量梯度下降法类似,不同的是更新参数$ heta$时,不是计算所有的样本数,而是随机计算一个样本。
加快了每次迭代的计算速度,但是收敛不稳定,更新公式如下:
${ heta _1} = { heta _1} - alpha ({h_{{ heta _1},{ heta _2}}}({x_1}^i,{x_2}^i) - {y^i}){x_1^i}$
随机梯度法快速下降,但同时也有更大幅度的波动。
3 小批量梯度下降法(Mini-batch Gradient Descent)
小批量梯度下降法是批量梯度下降法和随机梯度下降法的一种平衡,对于$n$个样本,每次随机用$m$个样本,进行批量梯度更新。
是对速度和稳定性进行了折中,更新公式如下:
${ heta _1} = { heta _1} - alpha sumlimits_{i = 0}^x {({h_{{ heta _1},{ heta _2}}}({x_1}^i,{x_2}^i) - {y^i}){x_1}^i} $
小批量梯度法较快速下降,有小幅波动。
参考:
1. http://sofasofa.io/tutorials/python_gradient_descent/index.php