梯度下降法Gradient Descent
- 梯度下降法本身不是一个机器学习的算法,不能解决回归/分类问题
- 是一种基于搜索的最优化方法
- 作用:最小化一个损失函数
- 梯度上升法:最大化一个效用函数
超参数:初始起点 学习率
线性回归法的损失函数具有唯一最优解,不需要多次运行随机化初始点
在第6行if判断语句中,当学习率太大,会使得J(theta)很大,当两个无穷数相减时,会返回nan
损失函数过大会返回 inf
1.多元线性回归中的梯度下降法
由梯度J(theta)的最终结果可知,梯度中的和加号会使梯度中的每一个元素都非常大,所以在外面除以一个m使得梯度中的元素大小,不会因为样本多而非常大
如果梯度中的每个元素很大,虽然可以通过调节学习率使其达到想要的效果,但这样会减少学习效率
最后结果为(n+1,1)的向量
2 梯度下降中的数据归一化和向量化
多元线性回归使用正规化方程是不用归一化的
用梯度下降法的时候,要进行数据归一化,不然话梯度J(theta)中的每个梯度大小相差很大,乘以相同的默认学习率,每个不同维度的theta步长容易出现或者太长(结果不收敛)或者太短(搜索太慢)
数据归一化代码
from sklearn.preprocessing import StandardScaler
from playML.LinearRegression import LinearRegression #使用自己的playML 包
standardScaler = StandardScaler()
standardScaler.fit(X_train) #先fit得到均值方差等,供transform共用
X_train_standard = standardScaler.transform(X_train) #均值方差归一化
lin_reg3 = LinearRegression() #实例化线性回归对象
lin_reg3.fit_gd(X_train_standard, y_train) #训练集传入
#测试集均值方差归一化,transform(X_test)使用X_train fit到的均值方差
X_test_standard = standardScaler.transform(X_test)
lin_reg3.score(X_test_standard, y_test) #的到R^2 评测指标
#输出0.81298806201222351
梯度下降法比正规方程法效率高
3批量梯度下降法 Batch Gradient Descent
每次取所有样本进行梯度计算,当m样本数比较大时,比较耗时
4随机梯度下降法 Stochastic Gradient Descent
每次取一个样本i,计算所有列上的偏导数,然后更新0-n的theta值。计算速度快。
由于每次随机取一个样本,不能保证每次得到的方向一定是损失函数减小的方向,更不能保证是减小速度最快的方向。所以搜索路径的有时增大有时减小,具有不可预知性,但最后依然能够差不多的到达最小值的地方。所以当m非常大的话可能愿意损失一定的精度来换取一定的时间
SGD在具体实现时,有一个非常重要的技巧,就是在SGD中学习率的取值非常重要,这是因为如果学习率一直取一个固定值的话,很有可能sgd已经在最小值位置的附近了,但由于随机的过程不够好又跳出了最小值所在位置,所以在时间中希望学习率逐渐递减。(令 =1/i_iters 即可,随着循环次数的增加逐渐减小。但当循环次数比较少时η下降的比较快,比如循环2次时从1-2,η下降50%;循环上万次从10000到10001 η下降的很少!改进方法为
=a / (i_iters+b ),a比1更灵活可取5,b可以取50 ;此时 a b 是SGD两个超参数)
随机
随机另外一个出其不意的优点:可以跳出局部最优解
更快的运行速度
机器学习领域很多算法都使用随机的特点:随机搜索 随机森林
5 关于梯度的调试
模拟计算某一点的梯度,当自己推导梯度公式不知道对错的情况下,可用此方法来验证
这种方法时间复杂度高,每次都要将theta带入J。但是使用小样本用来做调试还是可以的。对比计算出的模拟梯度和模型计算出来的梯度
模拟梯度代码
def dJ_debug(theta, X_b, y, epsilon=0.01):
res = np.empty(len(theta))
for i in range(len(theta)):
theta_1 = theta.copy()
theta_1[i] += epsilon
theta_2 = theta.copy()
theta_2[i] -= epsilon
res[i] = (J(theta_1, X_b, y) - J(theta_2, X_b, y)) / (2 * epsilon)
return res
6小批量梯度下降法 Mini-Batch Gradient Descent