机器学习入门之机器学习:梯度下降法(调试、其它思考)
小标 2018-09-29 来源 : 阅读 1382 评论 0

摘要:本文主要向大家介绍了机器学习入门之机器学习:梯度下降法(调试、其它思考),通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。

本文主要向大家介绍了机器学习入门之机器学习:梯度下降法(调试、其它思考),通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。


一、梯度下降法的调试

 1)疑问 / 难点

如何确定梯度下降法的准确性?


损失函数的变量 theta 在某一点上对应的梯度是什么?


在更负责的模型中,求解梯度更加不易;


有时候,推导出公式后,并将其运用到程序中,但当程序运行时,有时对梯度的计算可能会出现错误,怎么才能发现这种错误?

 
 
 2)梯度下降法的调试思路

关于导数的理解,参考:高数:关于导数;


调试思路:


如果机器学习的算法涉及到求解梯度,先使调试方式求出梯度,提前得到此机器学习算法的正确结果;
用数学推导方式(根据算法模型推导出的求解梯度的公式)求出梯度的数学解,将数学解带入机器学习算法中,得出结果;
对比两种最终得到的结果是否一致,如果一样,则此数学推导公式可用,如果不一样,则此数学推导公式待改进;

 
 
 3)公式的确定

导数的推导过程
公式:


 

梯度的求解的思路,与导数类似



最终推导出的调试的公式


θ:损失函数的变量(theta)
θ1+  =  θ + ε:表示 θ 右侧的点的变量;
θ1-  =  θ - ε:表示 θ 左侧的点的变量;
θ1+  -  θ  ==  θ  -  θ1-  ==  ε

 

调试公式的特点:时间复杂度高,每求一次梯度都要花相当多的时间,因此一般此种求解梯度的方式只用于调试;

 
 4)代码实现

数学模型推导方式求梯度

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(666)
X = np.random.random(size=(1000, 10))
true_theta = np.arange(1, 12, dtype=float)

X_b = np.hstack([np.ones((len(X), 1)), X])
y = X_b.dot(true_theta) + np.random.normal(size=1000)


def J(theta, X_b, y):
    """求当前 theta 的损失函数"""
    try:
        return np.sum((y - X_b.dot(theta)) ** 2) / len(X_b)
    except:
        return float(‘inf‘)


def dJ_math(theta, X_b, y):
    """使用模型推导公式求当前 theta 对应的梯度"""
    return X_b.T.dot(X_b.dot(theta) - y) * 2. / len(y)true_theta




true_theta:有 11 个元素,因为包含截距;
true_theta = np.arange(1, 12, dtype=float):是一个一位数组,并没有转置为向量;
X_b.dot(true_theta) + np.random.normal(size = 1000):此时用 矩阵 . dot(一维数组) + 一维数组;

 

调试方式求梯度:

def dJ_debug(theta, X_b, y, epsilon=0.01):
    """使用调试方式求当前 theta 对应的梯度"""
    
    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




res:当前 theta 对应的梯度;
theta_1 = theta.copy():将 theta 向量复制给 theta_1;#  此处的 copy() 是序列的方法;
特点:由于该求解过程与函数 J() 的内部实现无关,该过程适用于所有函数的梯度求解;

 

批量梯度下降法优化

def gradient_descent(dJ, X_b, y, initial_theta, eta, n_iters=10**4, epsilon=10**-8):
    
    theta = initial_theta
    cur_iter = 0
    
    while cur_iter < n_iters:
        gradient = dJ(theta,X_b, y)
        last_theta = theta
        theta = theta - eta * gradient
        if (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):
            break
            
        cur_iter += 1
        
    return theta




dJ:代表求梯度的函数,这里作为参数,可以传入不同方法求解梯度;

 

初始化后得到结果(一):使用调试方式求解梯度

initial_theta = np.zeros(X_b.shape[1])
eta = 0.01

%time theta = gradient_descent(dJ_debug, X_b, y, initial_theta, eta)
theta
# 输出:Wall time: 4.89 s
       array([ 1.1251597 ,  2.05312521,  2.91522497,  4.11895968,  5.05002117,
        5.90494046,  6.97383745,  8.00088367,  8.86213468,  9.98608331,
       10.90529198])




initial_theta:theta 的初始化值,为一个向量,一般设置为全 0 向量;

 

初始化后得到结果(二):使用模型推导的公式求解梯度

%time theta = gradient_descent(dJ_math, X_b, y, initial_theta, eta)
theta
# 输出:Wall time: 652 ms
       array([ 1.1251597 ,  2.05312521,  2.91522497,  4.11895968,  5.05002117,
        5.90494046,  6.97383745,  8.00088367,  8.86213468,  9.98608331,
       10.90529198])



 
 

两种结果对比:


调试公式求梯度,最终可以得到结果,但运行速度较慢;
通过(dJ_debug 函数)计算过程可以看出,这种调试方法对梯度的计算,适用于一切目标函数;

 
 
二、梯度下降法的其它思考

注:计算中有看不懂的地方,要对照着公式的推导过程理解;

 1)梯度下降法类型类

批量梯度下降法(Batch Gradient Descent)


每一次都对所有样本进行计算,求出梯度
缺点:运算速度较慢;
优点:稳定,按此梯度方向,损失函数一定减小最快;

 

随机梯度下降法(Stochastic Gradient Descent)


每一次只对随机抽取的一个样本,求出其梯度,作为 theta 的优化方向;
优点:运算速度较快;
缺点:不稳定,每一次的优化方向是不确定的,甚至有可能像反方向优化;

 

小批量梯度下降法(Mini-Batch Gradient Descent)


综合了批量梯度下降法和随机梯度下降法的优点,避免了它们的确定;
思路:每次计算优化的方向(梯度),即不是查看所有样本也不只看一个样本,而是每次抽取 k 个样本,把这 k 个样本的梯度作为优化方向;
优点(一):比批量梯度下降法运算量小,速度快;
优点(二):比随机梯度下降法更稳定,获取的优化方向更能偏向批量梯度下降法中的梯度方向;
缺点:增加了一个新的超参数 k ,每一批该去多少个样本?
k 个样本的梯度求解:和批量梯度下降法的求解过程一样;

 
 2)随机的优点

跳出局部最优解:更能找到损失函数的整体最优解,而不像批量梯度下降法那样,每次选取初始值后,可能只优化得到一个局部最小值,而不是损失函数整体的最小值;
更快的运行速度
机器学习领域很多算法都要使用随机的特点:随机森林、随机搜索


机器学习领域解决的本身就是在不确定的世界中的不确定的问题,它本身可能就没有一个固定的最优解,因此随机扮演了一个重要的角色;

 
 3)梯度下降法理解回顾

不是一个机器学习算法
是一种基于搜索的最优化方法
作用:最小化一个损失函数

 

梯度上升法


作用:最大化一个效用函数;
每次参数 theta 加上变化量;

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved