Optimization Method -- Gradient Descent with Momentum Gradient Descent (转)

Gradient Descent

在機器學習的過程中,常需要將 Cost Function 的值減小,通常用 Gradient Descent 來做最佳化的方法來達成。但是用 Gradient Descent 有其缺點,例如,很容易卡在 Local Minimum。

Gradient Descent 的公式如下:

關於Gradient Descent的公式解說,請參考:Optimization Method -- Gradient Descent & AdaGrad

Getting Stuck in Local Minimum

舉個例子,如果 Cost Function 為   ,有 Local Minimum   ,畫出來的圖形如下:

當執行 Gradient Descent 的時候,則會卡在 Local Minimum,如下圖:

解決卡在 Local Minimum 的方法,可加入 Momentum ,使它在 Gradient 等於零的時候,還可繼續前進。

Gradient Descent with Momentum

Momentum 的概念如下: 當一顆球從斜坡上滾到平地時,球在平地仍會持續滾動,因為球具有動量,也就是說,它的速度跟上一個時間點的速度有關。

模擬 Momentum的方式很簡單,即是把上一個時間點用 Gradient 得出的變化量也考慮進去。

Gradient Descent with Momentum 的公式如下:

其中   為   時間點,修正   值所用的變化量,而   則是   時間點的修正量,而   則是用來控制在   時間點中的   具有上個時間點的   值的比例。 好比說,在   時間點時,球的速度會跟   時間點有關。 而   ,則是   時間點算出之 Gradient   乘上 Learning Rate   後,在   中所占的比例。

舉前述例子,若起始參數為   ,畫出目標函數,藍點為起始點   的位置:

用 Gradient Descent with Momentum 來更新   的值,如下:

化減後得:

設初始化值   ,參數   ,代入   ,則:

更新圖上的藍點,如下圖:

再往下走一步,   的值如下:

更新圖上的藍點,如下圖:

在以上兩步中,可發現   的值逐漸變大。由於一開始   都是零,它會跟前一個時間點的值有關,所以看起來就好像是球從斜坡上滾下來時,慢慢加速,而在球經過 Local Minimum時,也會慢慢減速,不會直接卡在 Local Minimum 。整個過程如下圖:

動畫版:

Implementation

再來進入實作的部分
首先,開啟新的檔案 momentum.py 並貼上以下程式碼:

momentum.py
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

def func(x,y):
  return (0.3*y**3+y**2+0.3*x**3+x**2)

def func_grad(x,y):
  return (0.9*x**2+2*x, 0.9*y**2+2*y )

def plot_func(xt,yt,c='r'):
  fig = plt.figure()
  ax = fig.gca(projection='3d',
        elev=7., azim=-175)
  X, Y = np.meshgrid(np.arange(-5, 5, 0.25), np.arange(-5, 5, 0.25))
  Z = func(X,Y) 
  surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, 
    cmap=cm.coolwarm, linewidth=0.1, alpha=0.3)
  ax.set_zlim(-20, 100)
  ax.scatter(xt, yt, func(xt,yt),c=c, marker='o' )
  ax.set_title("x=%.5f, y=%.5f, f(x,y)=%.5f"%(xt,yt,func(xt,yt))) 
  plt.show()
  plt.close()

def run_grad():
  xt = 3 
  yt = 3 
  eta = 0.1
  plot_func(xt,yt,'r')
  for i in range(20):
    gxt, gyt = func_grad(xt,yt)
    xt = xt - eta * gxt
    yt = yt - eta * gyt
    if xt < -5 or yt < -5 or xt > 5 or yt > 5:
      break
    plot_func(xt,yt,'r')

def run_momentum():
  xt = 3 
  yt = 3 
  eta = 0.2
  beta = 0.9
  plot_func(xt,yt,'b')
  delta_x = 0
  delta_y = 0
  for i in range(20):
    gxt, gyt = func_grad(xt,yt)
    delta_x = beta * delta_x + (1-beta)*eta*gxt
    delta_y = beta * delta_y + (1-beta)*eta*gyt
    xt = xt - delta_x
    yt = yt - delta_y 
    if xt < -5 or yt < -5 or xt > 5 or yt > 5:
      break
    plot_func(xt,yt,'b')

其中, func(x,y) 為目標函數,func_grad(x,y) 為目標函數的 gradient ,而 plot_func(xt,yt,c='r') 可畫出目標函數的曲面, run_grad() 用來執行 Gradient Descent , run_momentum() 用來執行 Gradient Descent with Momentum 。 xt 和 yt 對應到前例的   ,而 eta 為 Learning Rate 。 for i in range(20) 表示最多會跑20個迴圈,而 if xt < -5 or yt < -5 or xt > 5 or yt > 5 表示,如果 xt 和 yt 超出邊界,則會先結束迴圈。

到 python console 執行:

>>> import momentum

執行 Gradient Descent ,指令如下:

>>> momentum.run_grad()

則程式會逐一畫出整個過程:

以此類推

執行 Gradient Descent with Momentum ,指令如下:

>>> momentum.run_momentum()

則程式會逐一畫出整個過程:

以此類推

Reference

Visualizing Optimization Algos

http://imgur.com/a/Hqolp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梯度下降优化算法概述 梯度下降是一种常用的优化方法,可以帮助我们找到使目标函数最小化或最大化的参数。随着机器学习和深度学习的发展,各种梯度下降算法也不断涌现。以下是一些常用的梯度下降优化算法的概述: 1. 批量梯度下降(Batch Gradient Descent):在每次迭代中,批量梯度下降使用所有样本的梯度来更新模型参数。适用于训练集较小、模型参数较少的情况。 2. 随机梯度下降(Stochastic Gradient Descent):在每次迭代中,随机梯度下降使用一个单独的样本来更新模型参数。适用于训练集较大、模型参数较多的情况。 3. 小批量梯度下降(Mini-batch Gradient Descent):小批量梯度下降是一种介于批量梯度下降和随机梯度下降之间的方法。它在每次迭代中使用一小部分样本的梯度来更新模型参数。适用于训练集规模较大的情况。 4. 动量(Momentum):动量算法加入了“惯性”的概念,可以加速梯度下降的收敛速度。在每次迭代中,动量算法使用上一次的梯度信息来更新模型参数。 5. 自适应梯度下降(Adaptive Gradient Descent):自适应梯度下降可以自适应地调整每个模型参数的学习率,以便更快地收敛到最优解。比如,Adagrad算法可以针对每个参数单独地调整学习率。 6. 自适应矩估计(Adaptive Moment Estimation):Adam算法是一种结合了Momentum和Adaptive Gradient Descent的算法。它可以自适应调整每个参数的学习率,并利用二阶矩来调整动量。 每种梯度下降算法都有其适用的场合,需要根据问题的性质来选择合适的算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值