• Momentum(动量)方法的python实现


    Momentum方法可以说是对SGD的进一步优化,细节可以参考这里

    这里用python对其进行简单实现,如下:

    # coding=utf-8
    """
    基于小批量梯度下降来实现的Momentum(动量)
    参考:https://blog.csdn.net/bvl10101111/article/details/72615621
    作用:
        在学习率较小的时候,适当的momentum能够起到一个加速收敛速度的作用;
        在学习率较大的时候,适当的momentum能够起到一个减小收敛时震荡幅度的作用.
    @author: Reynold
    @date: 2018-08-21
    """
    import numpy as np
    import random
    
    # 构造训练数据
    x = np.arange(0., 10., 0.2)
    m = len(x)
    x0 = np.full(m, 1.0)
    input_data = np.vstack([x0, x]).T  # 将偏置b作为权向量的第一个分量
    target_data = 3 * x + 8 + np.random.randn(m)
    
    # 两种终止条件
    max_iter = 10000
    epsilon = 1e-5
    
    # 初始化权值
    np.random.seed(0)
    w = np.random.randn(2)
    v = np.zeros(2)  # 更新的速度参数
    
    alpha = 0.001  # 步长
    diff = 0.
    error = np.zeros(2)
    count = 0  # 循环次数
    
    eps = 0.9  # 衰减力度,可以用来调节,该值越大那么之前的梯度对现在方向的影响也越大
    
    while count < max_iter:
        count += 1
    
        sum_m = np.zeros(2)
        index = random.sample(range(m), int(np.ceil(m * 0.2)))
        sample_data = input_data[index]
        sample_target = target_data[index]
    
        for i in range(len(sample_data)):
            dif = (np.dot(w, input_data[i]) - target_data[i]) * input_data[i]
            sum_m = sum_m + dif
        v = eps * v - alpha * sum_m  # 在这里进行速度更新
        w = w + v  # 使用动量来更新参数
    
        if np.linalg.norm(w - error) < epsilon:
            break
        else:
            error = w
    print 'loop count = %d' % count, '	w:[%f, %f]' % (w[0], w[1])

    同样的收敛条件,速度确实比MBGD要快,用的次数更少

    结果:

    loop count = 432     w:[8.285241, 3.150939]
  • 相关阅读:
    [BZOJ4199][NOI2015]品酒大会
    [BZOJ4198][Noi2015]荷马史诗
    [BZOJ4197][Noi2015]寿司晚宴
    [BZOJ4196][NOI2015]软件包管理器
    2016-11-15NOIP模拟赛
    2016.6.30模拟赛
    BZOJ3672: [Noi2014]购票
    UOJ#191. 【集训队互测2016】Unknown
    第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解
    bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解
  • 原文地址:https://www.cnblogs.com/leixingzhi7/p/9510554.html
Copyright © 2020-2023  润新知