为了找到更好的模型,需要找到代价函数的最小值。梯度下降是找到代价函数最小值的一种算法。
一、梯度下降算法
以线性回归为例,模型:f(x)=wx+b
平方误差代价函数:
梯度下降:
其中:
学习率α:0-1的正数,控制梯度下降的步幅,代价函数的导数控制下降的方向,并和学习率一起控制下降的步幅。
导数:代价函数J在(w,b)点的切线斜率
二、运行梯度下降
选取一个w和b,然后在每一步中执行:
- tmp_w=当前w值-学习率*(J对w求导)
- tmp_b=当前b值-学习率*(J对b求导)
- 计算出的tmp_w更新到下一步的w值
- 计算出的tmp_b更新到下一步的b值
- 每一次更新w和b,使其更接近J最小值,一直到算法收敛,得到J的局部最小值
划重点:w和b必须同步更新。
错误做法:计算出tmp_w后直接更新w,然后再计算temp_b,这会导致新w和旧b计算出temp_b,结果是不正确的
三、直观理解梯度下降
为什么梯度下降能找到J的最小值
以线性回归为例,模型:f(x)=wx
平方误差代价函数:
梯度下降:
当选择一个w,w在最小值的右侧时,导数为正,学习率α是0-1的正数,因此每次梯度下降后,w必然减小。直至到达最小值时,导数为0,每次梯度下降后,w不变
当选择一个w,w在最小值的左侧时,导数为负,学习率α是0-1的正数,因此每次梯度下降后,w必然变大。直至到达最小值时,导数为0,每次梯度下降后,w不变
局部最小值
下图的某代价函数的三维图,可以视作山峰山谷。选取一个点(w,b),选择一个方向进行梯度下降,梯度下降的每一次更新,就迈向一个更低点,一直到达某个山谷,即局部最小值。
下图是平分误差代价函数,像这种像碗状的代价函数称为凸函数Convex function。凸函数只有一个最小值
四、学习率和导数
学习率α的选择
如果学习率α太小,梯度下降能找到J的最小值,但是速度会很慢,如下图所示。
如果学习率α太大,梯度下降会越过最小值,导致无法找到最小值,无法收敛,甚至发散,如下图所示。
导数的变化规律
接近局部最小值时,导数越来越小,梯度下降的更新步长越来越小。直到,到达局部最小值时,导数变成0,w=w-α*0,w不变。
批量梯度下降Batch gradient descent
平方误差代价函数的梯度下降,每次更新参数时都会计算训练集的所有数据,这属于批量梯度下降
有一些梯度下降,每次更新参数仅计算训练集的最小集数据,不属于批量梯度下降
五、线性回归的梯度下降
以线性回归为例,模型:f(x)=wx+b
平方误差代价函数:
梯度下降:
可把J(w,b)代入到梯度下降算法,即:
其中,求导以后多了一个系数2,,这就是平方误差代价函数会额外除以2的原因,这样会更加简洁。
推导完成后,就可以用这个梯度算法来找到J的最小值
学习来源:B站吴恩达机器学习:4.1-4.6节