python数据分析与机器学习实战

(二十三)梯度下降-python数据分析与机器学习实战(学习笔记

2018-05-23  本文已影响55人  努力奋斗的durian

文章原创,最近更新:2018-05-23

1.梯度下降原理
2.梯度下降方法对比
3.学习率对结果的影响
课程来源: python数据分析与机器学习实战-唐宇迪

1.梯度下降原理


什么叫梯度下降?
梯度下降,也就是说沿着梯度的反方向走下降的最快。什么是梯度,如果是一维度的数据,把梯度理解为导数即可。如果是多维度的数据,梯度是各个维度的偏导数。



整理u的梯度就是(yz,xz,xy+2z) ,yz,xz,xy+2z 分别为维度x方向,y方向,z方向的偏导数。
何谓梯度下降:


在某一点x,可以求出对应的y值。此时如何改变x,然后不停地迭代求出y的最小值?此时的策略就可以用梯度下降。
具体含义就是沿着当前点x的梯度负方向走一步,步长设置为α,当前点x的梯度为dx,那么新的点x新=x-α*dx 不停地迭代改变x就可以走到最低点,求出y的值,如何跳出循环呢?
两种办法,具体如下:
方法一:可以设置指定的迭代次数,比如迭代10000次默认到达了最低点.
方法二:可以求出当前x点的y值,再次求出下一次x新对应的y值,这两个值相差如果小于指定的某个阈值,比如是0.00005,那么也认为到达了最小值。
举个例子吧:
y=(x-1)2+10
min(y)? 大家一眼就看出x=1 时y最小为10
那么如何用梯度下降来求解呢?
算法步骤:
随机选择一个初始点x
设置走路的步长α=0.01(比如)
设置循环次数(跳出条件)
循环内求当前x的梯度dx=2* (x-1)
更新x的值x=x-α*dx
代码如下:


import numpy as np
import math

#y=(x-1)**2+10
x=5
i=0
a=0.01
while (i<5000):
    dx=2*(x-1)
    x=x-a*dx
    i=i+1
print(x)

输出结果如下:

runfile('C:/Users/Administrator/Desktop/12.py', wdir='C:/Users/Administrator/Desktop')
1.0000000000000053

可以看到,代码中设置5000次迭代,初始x选取5,经过5000次梯度下降更新迭代,x的值达到了1,基本到了最低点
这个就是一个梯度下降的流程与代码,大家理解一下,想一下如何能理解,α代表你走路的步长,可大可小可设置,dx代表当前点的梯度,减法负号代表梯度负方向,原来位置为x,下一位置x新=原来位置x减去当前点的梯度乘以步长α,不断更新,最后就会走到最低点。
以上就是梯度下降法基本原理,不知道大家清楚了没?
学习参考链接:今天分享一个梯度下降法的案例,带领你入门理解编程思想

2.梯度下降方法对比

计算损失函数的时候,需要综合考虑所有的样本.每个样本都参与计算.这样的话,样本的计算量就会超级大.如果计算量非常大的话,很难进行一个迭代.

优点:准确性非常高.
缺点:速度非常慢.

因为批量梯度下降速度那么慢,有没有更快的方法呢?比如一次选出一个样本,这一个叫随机梯度下降.

优点:速度超级快.
缺点:有可能是离群点数据,会使得效果不好,但不一定都朝着收敛的方向.

因为样本算整体太多了,算一个就太少了.小批量梯度下降就取一部分的数据.相当于对数据进行洗牌,每10个就拿出来,计算函数的损失值.

一般情况下,用小批量梯度下降的比较多.

3.学习率对结果的影响

在求梯度的时候,求的是偏导,梯度下降是求方向以及沿着这个方向进行更新.然而进行方向更新的时候,更新多大呢?通常把更新的幅度叫做步长.通常把步常叫做学习率.不同学习率对结果的影响.

如果学习率非常大的情况下,对结果影响非常大,会使迭代的过程中不平稳.有可能略过了最低点,而达到了一个极值点.这就是学习率过大而产生的后果.

那么学习率不能非常大,那稍微小一点点可以么?通常情况下,设置学习率稍微小一些是没多大的问题的.学习率小相当于一步步的慢慢走.这样导致的后果是迭代的速度非常慢,但是能保证前进的方向是对的.

学习率都是通过较小的学习率取而代之较大的迭代次数.这个就是比较常用的方案.用小的学习率进行学习,并且用大的迭代次数进行迭代.

那么学习率小是小到什么样的程度呢?如果小的学习率是以0.01为开始,如果还没有进行一个收敛,最好的方法是再减小,可以设置为0.001.

可以在学习率在开始大步方向走,但是接近山谷的时候,慢慢往下出溜.其实学习率是可以发生变动的.比如0-10000之间迭代可以设置学习率为0.01,然后10000-20000之间的迭代可以设置学习率为0.005,然后20000-100000的时候迭代可以设置学习率为0.001.

刚开始的时候可以设置学习率稍微大一些,逐渐随着学习率的迭代慢慢进行减小.这个就是对学习率常见的措施.

右边的学习率图进行了总结,高的学习率是非常差的,使得结果非常的不好.通常很少使用比较大的学习率.而小的学习率,看起来可以,但是迭代非常的慢.一般情况下先找个适中的,一般先找0.01来试.如果不行,再将学习率设置为更小一些.

之前有学习率小批度下降,那么小批量下降小到多大呢?通常指定成2的倍数,16,32,64,128这些数都是非常常见的.那为什么又是2的倍数呢?其实任意的一个值都是可以的,但是2的倍数看起来更舒服一些.所以一般小批量下降一般是32,64,128.批处理数量一般是能多大就选多大,只有大的数据才能满足你的容忍程度,这样才能是数据的容忍程度更高一些.一般64的批处理数量就足够了.

上一篇下一篇

猜你喜欢

热点阅读