梯度下降法(6)

梯度下降法Gradient Descent

  1. 梯度下降法本身不是一个机器学习的算法,不能解决回归/分类问题
  2. 是一种基于搜索的最优化方法
  3. 作用:最小化一个损失函数
  4. 梯度上升法:最大化一个效用函数

超参数:初始起点  学习率

      

线性回归法的损失函数具有唯一最优解,不需要多次运行随机化初始点

       

在第6行if判断语句中,当学习率太大,会使得J(theta)很大,当两个无穷数相减时,会返回nan

损失函数过大会返回 inf

 

1.多元线性回归中的梯度下降法

由梯度J(theta)的最终结果可知,梯度中的和加号会使梯度中的每一个元素都非常大,所以在外面除以一个m使得梯度中的元素大小,不会因为样本多而非常大

如果梯度中的每个元素很大,虽然可以通过调节学习率使其达到想要的效果,但这样会减少学习效率

最后结果为(n+1,1)的向量

2 梯度下降中的数据归一化和向量化

多元线性回归使用正规化方程是不用归一化的

用梯度下降法的时候,要进行数据归一化,不然话梯度\triangledownJ(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已经在最小值位置的附近了,但由于随机的过程不够好又跳出了最小值所在位置,所以在时间中希望学习率逐渐递减。(令 \eta=1/i_iters 即可,随着循环次数的增加逐渐减小。但当循环次数比较少时η下降的比较快,比如循环2次时从1-2,η下降50%;循环上万次从10000到10001 η下降的很少!改进方法为\eta=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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值