美文网首页
梯度下降法学习笔记

梯度下降法学习笔记

作者: 仰望星空的小狗 | 来源:发表于2019-08-04 21:13 被阅读0次

    1 相关概念

    梯度——表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快。对于一元函数y=f(x),其梯度为\frac{\partial y}{\partial x},对于二元函数f(x,y),其梯度为(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y})
    步长——在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度
    损失函数——在单个训练样本上的,也就是就算一个样本的误差
    代价函数——在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均

    2 梯度下降法

    梯度下降法,也就是使函数按照其梯度方向的反方向(也就是下降最快的方向)改变自变量,从而是函数以最快的方向走向最低点,类似于下山,我们在不知道山的全貌的情况下,沿着坡度最陡的方向往下走比较可能最快的走到山底(但也可能是局部最低处,这跟初始点,每步走的长度等有关)。


    这里写图片描述

    梯度下降法有批梯度下降,随机梯度下降,以及小批量梯度下降

    2.1 批梯度下降BGD

    批梯度下降在求梯度时使用了所有的样本,是一种比较常用的梯度下降法。
    批梯度下降过程如下

    1. 根据数据的特征X和标签Y之间的分布情况,假设一个拟合函数y=f(x),如此处假设为y=f(x)=\theta_0+\theta_1x_1+\theta_2x_2+...++\theta_nx_n,设x_0=1,则y=f(x)=\theta_0x_0+\theta_1x_1+\theta_2x_2+...++\theta_nx_n,于是Y=X\theta。其中,X为m*n矩阵,\theta为n*1向量,Y为m*1向量,m为样本数,n为一个样本的特征数
    2. 求得代价函数为J(\mathbf\theta) = \frac{1}{2m}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y})若代价函数J(\mathbf\theta)小到满足精度要求,则结束梯度下降算法,否则继续第3步
    3. 求梯度\frac{\partial J(\theta)}{\partial \theta}=\frac{X^T(X\theta-Y)}{m}
    4. 用梯度\frac{\partial J(\theta)}{\partial \theta}来求新的\theta$$$\theta=\theta-\alpha\frac{\partial J(\theta)}{\partial \theta}$$其中,\alpha$为步长,调到第2步

    代码如下:

    # -*- coding: utf-8 -*-
    import numpy as np
    
    
    def d_J(X, Y, theta):
        # X表示样本
        # Y表示样本对应的标签
        # theta表示参数
        return np.matmul(X.T, (np.matmul(X, theta) - Y)) / np.shape(X)[0]
    
    
    def cost_J(X, Y, theta):
        # X表示样本
        # Y表示样本对应的标签
        # theta表示参数
        X_theta_red_Y = np.matmul(X, theta) - Y
        return np.matmul(X_theta_red_Y.T, X_theta_red_Y) / (2 * np.shape(X)[0])
    
    
    step_size = 0.001  # 步长
    max_iters = 10000  # 最大迭代次数
    eps = 0.0001  # 精度
    
    
    def train_gadient_descent(X, Y, theta):
        cost = 100
        cur_iters = 0
        while cost > eps and cur_iters < max_iters:
            theta = theta - step_size * d_J(X, Y, theta)
            cur_iters += 1
            cost = cost_J(X, Y, theta)
        return theta
    
    
    if __name__ == '__main__':
        # 输入的特征和标签
        X = np.array([[1 ,1, 4], [1 ,2, 5], [1 ,5, 1], [1 ,4, 2]])  # feature
        Y = np.array([[19], [26], [19], [20]])  # lebal
        # 假设的函数为 y=theta0+theta1*x1+theta2*x2
        theta = np.array([[0.1],[0.1], [0.1]])  # 初始的theta参数
        print(train_gadient_descent(X, Y, theta))
    
    

    2.2 随机梯度下降法SGD

    随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本来求梯度。对应的更新公式是:\theta_i = \theta_i - \alpha (h_\theta(x_0^{j}, x_1^{j}, ...x_n^{j}) - y_j)x_i^{j}
    批梯度下降法与随机梯度下降法之间的比较如下:

    • 训练速度——随机梯度下降法每次迭代仅用一个样本,训练速度快
    • 准确度——随机梯度下降法每次迭代仅用一个样本,并没有参考所有的样本,因而准确度较低
    • 收敛速度——随机梯度下降法的收敛速度慢
    • 全局最优/局部最优——随机梯度下降法由于走的有点随意,比较可能走出局部最优点

    2.3 小批量梯度下降法

    该方法结合了上面两种的特点,每次采用小批量的样本进行迭代计算,是一种比较中庸的方法。

    3 梯度下降法的调优方法

    • 步长的选择——步长太长,可能导致Z字形的震荡;太小,可能导致训练速度太慢。
    • 初始值的选择——初始值选的不好,可能会导致训练速度慢,走进局部最优。
    • 归一化——当样本特征取值范围差别较大时,可能导致训练速度慢。因此,需要进行归一化。如,将期望为$\overline x,标准差\sigma的样本x。对其进行归一化处理$x=\frac{x-\overline x}{\sigma}则得到的新的样本均值为0,方差为1。

    相关文章

      网友评论

          本文标题:梯度下降法学习笔记

          本文链接:https://www.haomeiwen.com/subject/crqudctx.html