动量法(Momentum)

动量法(Momentum)

动量法(Momentum)是一种优化算法,旨在加速梯度下降法的收敛,尤其是在存在高曲率、嘈杂梯度或小但一致梯度的情况下。动量法通过引入动量概念,使得参数更新不仅依赖于当前的梯度,还考虑了之前梯度的累计效果,从而加速收敛并减少参数更新时的震荡。

动量法的原理

动量法的核心思想是引入一个动量项(velocity),记录之前的梯度信息,并在每次参数更新时加上这个动量项。具体来说,动量法的更新公式如下:

  1. 动量更新
    v t = β v t − 1 + ( 1 − β ) ∇ θ J ( θ ) v_t = \beta v_{t-1} + (1 - \beta) \nabla_{\theta} J(\theta) vt=βvt1+(1β)θJ(θ)
    其中:
    - v t v_t vt是第 t t t次迭代的动量项。
    - β \beta β是动量超参数,通常取值在0到1之间,控制之前梯度的影响程度。
    - ∇ θ J ( θ ) \nabla_{\theta} J(\theta) θJ(θ)是损失函数 J ( θ ) J(\theta) J(θ)对参数 θ \theta θ的梯度。

  2. 参数更新
    θ = θ − α v t \theta = \theta - \alpha v_t θ=θαvt
    其中:
    - θ \theta θ是模型参数。
    - α \alpha α是学习率,控制每次更新的步长。

具体数据示例

假设我们有一个简单的线性回归问题,训练数据集如下:

xy
12
23
34
45

我们要拟合的线性模型为 h ( θ ) = θ 0 + θ 1 x h(\theta) = \theta_0 + \theta_1 x h(θ)=θ0+θ1x

步骤1:初始化参数

假设 θ 0 = 0 \theta_0 = 0 θ0=0 θ 1 = 0 \theta_1 = 0 θ1=0,学习率 α = 0.01 \alpha = 0.01 α=0.01,动量系数 β = 0.9 \beta = 0.9 β=0.9,并且初始化动量项 v 0 = 0 v_0 = 0 v0=0

步骤2:计算梯度

损失函数 J ( θ ) J(\theta) J(θ)为均方误差(MSE):
J ( θ ) = 1 2 m ∑ i = 1 m ( h ( θ ) − y i ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h(\theta) - y_i)^2 J(θ)=2m1i=1m(h(θ)yi)2
其中, m m m是训练样本的数量。

对于第一个样本 ( x 1 , y 1 ) = ( 1 , 2 ) (x_1, y_1) = (1, 2) (x1,y1)=(1,2),模型预测值为:
h ( θ ) = θ 0 + θ 1 x 1 = 0 h(\theta) = \theta_0 + \theta_1 x_1 = 0 h(θ)=θ0+θ1x1=0

计算损失函数对参数的梯度:
∂ J ∂ θ 0 = h ( θ ) − y 1 = 0 − 2 = − 2 \frac{\partial J}{\partial \theta_0} = h(\theta) - y_1 = 0 - 2 = -2 θ0J=h(θ)y1=02=2
∂ J ∂ θ 1 = ( h ( θ ) − y 1 ) x 1 = − 2 ⋅ 1 = − 2 \frac{\partial J}{\partial \theta_1} = (h(\theta) - y_1) x_1 = -2 \cdot 1 = -2 θ1J=(h(θ)y1)x1=21=2

步骤3:更新动量项和参数
  1. 更新动量项:
    v 0 = β v − 1 + ( 1 − β ) ∇ θ J ( θ ) = 0.9 × 0 + 0.1 × ( − 2 ) = − 0.2 v_0 = \beta v_{-1} + (1 - \beta) \nabla_{\theta} J(\theta) = 0.9 \times 0 + 0.1 \times (-2) = -0.2 v0=βv1+(1β)θJ(θ)=0.9×0+0.1×(2)=0.2

  2. 更新参数:
    θ 0 = θ 0 − α v 0 = 0 − 0.01 × ( − 0.2 ) = 0.002 \theta_0 = \theta_0 - \alpha v_0 = 0 - 0.01 \times (-0.2) = 0.002 θ0=θ0αv0=00.01×(0.2)=0.002
    θ 1 = θ 1 − α v 0 = 0 − 0.01 × ( − 0.2 ) = 0.002 \theta_1 = \theta_1 - \alpha v_0 = 0 - 0.01 \times (-0.2) = 0.002 θ1=θ1αv0=00.01×(0.2)=0.002

第二次迭代

假设下一次随机选择的样本是 ( x 2 , y 2 ) = ( 2 , 3 ) (x_2, y_2) = (2, 3) (x2,y2)=(2,3)

  1. 计算新的预测值:
    h ( θ ) = θ 0 + θ 1 x 2 = 0.002 + 0.002 × 2 = 0.006 h(\theta) = \theta_0 + \theta_1 x_2 = 0.002 + 0.002 \times 2 = 0.006 h(θ)=θ0+θ1x2=0.002+0.002×2=0.006

  2. 计算新的梯度:
    ∂ J ∂ θ 0 = h ( θ ) − y 2 = 0.006 − 3 = − 2.994 \frac{\partial J}{\partial \theta_0} = h(\theta) - y_2 = 0.006 - 3 = -2.994 θ0J=h(θ)y2=0.0063=2.994
    ∂ J ∂ θ 1 = ( h ( θ ) − y 2 ) x 2 = − 2.994 × 2 = − 5.988 \frac{\partial J}{\partial \theta_1} = (h(\theta) - y_2) x_2 = -2.994 \times 2 = -5.988 θ1J=(h(θ)y2)x2=2.994×2=5.988

  3. 更新动量项:
    v 1 = β v 0 + ( 1 − β ) ∇ θ J ( θ ) = 0.9 × ( − 0.2 ) + 0.1 × ( − 2.994 ) = − 0.4794 v_1 = \beta v_0 + (1 - \beta) \nabla_{\theta} J(\theta) = 0.9 \times (-0.2) + 0.1 \times (-2.994) = -0.4794 v1=βv0+(1β)θJ(θ)=0.9×(0.2)+0.1×(2.994)=0.4794

  4. 更新参数:
    θ 0 = θ 0 − α v 1 = 0.002 − 0.01 × ( − 0.4794 ) = 0.006794 \theta_0 = \theta_0 - \alpha v_1 = 0.002 - 0.01 \times (-0.4794) = 0.006794 θ0=θ0αv1=0.0020.01×(0.4794)=0.006794
    θ 1 = θ 1 − α v 1 = 0.002 − 0.01 × ( − 0.4794 ) = 0.006794 \theta_1 = \theta_1 - \alpha v_1 = 0.002 - 0.01 \times (-0.4794) = 0.006794 θ1=θ1αv1=0.0020.01×(0.4794)=0.006794

第三次迭代

假设下一次随机选择的样本是 ( x 3 , y 3 ) = ( 3 , 4 ) (x_3, y_3) = (3, 4) (x3,y3)=(3,4)

  1. 计算新的预测值:
    h ( θ ) = θ 0 + θ 1 x 3 = 0.006794 + 0.006794 × 3 = 0.027176 h(\theta) = \theta_0 + \theta_1 x_3 = 0.006794 + 0.006794 \times 3 = 0.027176 h(θ)=θ0+θ1x3=0.006794+0.006794×3=0.027176

  2. 计算新的梯度:
    ∂ J ∂ θ 0 = h ( θ ) − y 3 = 0.027176 − 4 = − 3.972824 \frac{\partial J}{\partial \theta_0} = h(\theta) - y_3 = 0.027176 - 4 = -3.972824 θ0J=h(θ)y3=0.0271764=3.972824
    ∂ J ∂ θ 1 = ( h ( θ ) − y 3 ) x 3 = − 3.972824 × 3 = − 11.918472 \frac{\partial J}{\partial \theta_1} = (h(\theta) - y_3) x_3 = -3.972824 \times 3 = -11.918472 θ1J=(h(θ)y3)x3=3.972824×3=11.918472

  3. 更新动量项:
    v 2 = β v 1 + ( 1 − β ) ∇ θ J ( θ ) = 0.9 × ( − 0.4794 ) + 0.1 × ( − 3.972824 ) = − 0.8292424 v_2 = \beta v_1 + (1 - \beta) \nabla_{\theta} J(\theta) = 0.9 \times (-0.4794) + 0.1 \times (-3.972824) = -0.8292424 v2=βv1+(1β)θJ(θ)=0.9×(0.4794)+0.1×(3.972824)=0.8292424

  4. 更新参数:
    θ 0 = θ 0 − α v 2 = 0.006794 − 0.01 × ( − 0.8292424 ) = 0.015086424 \theta_0 = \theta_0 - \alpha v_2 = 0.006794 - 0.01 \times (-0.8292424) = 0.015086424 θ0=θ0αv2=0.0067940.01×(0.8292424)=0.015086424
    θ 1 = θ 1 − α v 2 = 0.006794 − 0.01 × ( − 0.8292424 ) = 0.015086424 \theta_1 = \theta_1 - \alpha v_2 = 0.006794 - 0.01 \times (-0.8292424) = 0.015086424 θ1=θ1αv2=0.0067940.01×(0.8292424)=0.015086424

总结

动量法通过引入动量项,使得参数更新不仅依赖于当前的梯度,还考虑了之前梯度的累积效果,从而加速收敛并减少参数更新时的震荡。通过具体数据示例,可以清楚地看到动量法如何在每次迭代中逐步更新动量项和参数,使模型逐步逼近最优解。

### Q-Learning与动量法结合 在强化学习领域,Q-learning是一种用于估计采取某个动作后的预期奖励的方法。通过引入动量法,可以改进参数更新过程中的稳定性以及收敛速度。 #### 动量法的作用机制 动量方法旨在加速梯度下降算法,在具有高曲率、小但一致的梯度方向上尤其有用。该技术利用过去几次迭代中累积的速度来调整当前的学习步长[^3]。具体来说,动量项帮助减少振荡并加快沿着最小化路径前进的步伐。 对于标准的Q-learning更新规则: \[ Q(s_t,a_t) \leftarrow Q(s_t,a_t)+\alpha[r_{t+1}+\gamma max_a Q(s_{t+1},a)-Q(s_t,a_t)] \] 可以通过加入动量因子\( v \),将其转换为带有动量的版本: ```python v = β * v + α * (r + γ * np.max(Q[next_state]) - Q[state, action]) Q[state, action] += v ``` 这里 \(β\) 是动量系数,通常设置为接近1的一个较小值;\(α\) 表示学习速率;\(γ\) 则代表折扣因子。这种修改使得每次权重更新不仅取决于即时误差信号,还依赖于之前积累的变化趋势。 #### 实现细节 为了实现带动量的Q-learning,除了初始化Q表外还需要额外维护一个相同维度的速度矩阵`V`用来存储历史变化信息。每当执行一次状态转移时,先计算新的增量再应用到对应的Q值位置上去。 ```python import numpy as np def q_learning_with_momentum(env, num_episodes=500, alpha=0.1, gamma=0.99, beta=0.9): n_states = env.observation_space.n n_actions = env.action_space.n # 初始化Q表格和动量向量 Q = np.zeros((n_states, n_actions)) V = np.zeros_like(Q) for episode in range(num_episodes): state = env.reset() while True: action = choose_action(state, Q) next_state, reward, done, _ = env.step(action) delta = reward + gamma * np.max(Q[next_state]) - Q[state][action] V[state][action] = beta * V[state][action] + alpha * delta Q[state][action] += V[state][action] if done: break state = next_state ``` 此代码片段展示了如何将动量应用于传统的Q-learning框架内,从而可能获得更好的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值