梯度下降法快速教程 | 第二章:衝量(momentum)的原理與Python實現

邀請關注微信公眾號:人工智慧LeadAI(ID:atleadai)

歡迎訪問我們的官方主頁:www.leadai.org

01前言

梯度下降法(Gradient Descent)是機器學習中最常用的優化方法之一,常用來求解目標函數的極值。

其基本原理非常簡單:沿著目標函數梯度下降的方向搜索極小值(也可以沿著梯度上升的方向搜索極大值)。

但是如何調整搜索的步長(也叫學習率,Learning Rate)、如何加快收斂速度以及如何防止搜索時發生震蕩卻是一門值得深究的學問。

在上篇文章《梯度下降法快速教程 | 第一章:Python簡易實現以及對學習率的探討》中我們簡單分析了學習率大小對搜索過程的影響,發現:

  • 學習率較小時,收斂到極值的速度較慢。
  • 學習率較大時,容易在搜索過程中發生震蕩。

因此本篇文章中將簡單講解「衝量」的原理以及如何用「衝量」來解決上述兩個問題。

全部源代碼可在本人的GitHub:monitor1379中下載。

02衝量:momentum

「衝量」這個概念源自於物理中的力學,表示力對時間的積累效應。

在普通的梯度下降法x += v中,每次x的更新量v為v = - dx * lr,其中dx為目標函數func(x)對x的一階導數。

當使用衝量時,則把每次x的更新量v考慮為本次的梯度下降量- dx * lr與上次x的更新量v乘上一個介於[0, 1]的因子momentum的和,即v = - dx * lr + v * momemtum。

從公式上可看出:

  • 當本次梯度下降- dx * lr的方向與上次更新量v的方向相同時,上次的更新量能夠對本次的搜索起到一個正向加速的作用。
  • 當本次梯度下降- dx * lr的方向與上次更新量v的方向相反時,上次的更新量能夠對本次的搜索起到一個減速的作用。

使用衝量的梯度下降法的Python代碼如下:

import numpy as npimport matplotlib.pyplot as plt# 目標函數:y=x^2def func(x):n return np.square(x)# 目標函數一階導數:dy/dx=2*xdef dfunc(x):n return 2 * xdef GD_momentum(x_start, df, epochs, lr, momentum):n """n 帶有衝量的梯度下降法。n :param x_start: x的起始點n :param df: 目標函數的一階導函數n :param epochs: 迭代周期n :param lr: 學習率n :param momentum: 衝量n :return: x在每次迭代後的位置(包括起始點),長度為epochs+1n """n xs = np.zeros(epochs+1)n x = x_startn xs[0] = xn v = 0n for i in range(epochs):n dx = df(x) # v表示x要改變的幅度n v = - dx * lr + momentum * vn x += vn xs[i+1] = x return xsn

為了查看momentum大小對不同學習率的影響,此處設置學習率為lr = [0.01, 0.1, 0.6, 0.9],衝量依次為momentum = [0.0, 0.1, 0.5, 0.9],起始位置為x_start = -5,迭代周期為6。測試以及繪圖代碼如下:

def demo2_GD_momentum(): nline_x = np.linspace(-5, 5, 100) nline_y = func(line_x) nplt.figure(Gradient Desent: Learning Rate, Momentum) nx_start = -5 nepochs = 6 nlr = [0.01, 0.1, 0.6, 0.9] nmomentum = [0.0, 0.1, 0.5, 0.9] ncolor = [k, r, g, y] nrow = len(lr) ncol = len(momentum) nsize = np.ones(epochs+1) * 10 nsize[-1] = 70 nfor i in range(row): nfor j in range(col): nx = GD_momentum(x_start, dfunc, epochs, lr=lr[i], momentum=momentum[j]) plt.subplot(row, col, i * col + j + 1) nplt.plot(line_x, line_y, c=b) n plt.plot(x, func(x), c=color[i], label=lr={}, mo={}.format(lr[i], momentum[j])) n plt.scatter(x, func(x), c=color[i], s=size) n plt.legend(loc=0)nplt.show()n

運行結果如下圖所示,每一行的圖的學習率lr一樣,每一列的momentum一樣,最左列為不使用momentum時的收斂情況:

demo2_GD_momentum運行結果

簡單分析一下運行結果:

  • 從第一行可看出:在學習率較小的時候,適當的momentum能夠起到一個加速收斂速度的作用。
  • 從第四行可看出:在學習率較大的時候,適當的momentum能夠起到一個減小收斂時震蕩幅度的作用。

從上述兩點來看,momentum確實能夠解決在篇頭提到的兩個問題。

然而在第二行與第三行的最後一列圖片中也發現了一個問題,當momentum較大時,原本能夠正確收斂的時候卻因為剎不住車跑過頭了。那麼怎麼繼續解決這個新出現的問題呢?下一篇文章《梯度下降法快速教程 | 第三章:學習率衰減因子(decay)的原理與Python實現》將介紹如何使用學習率衰減因子decay來讓學習率隨著迭代周期不斷變小,讓梯度下降法收斂時的「震蕩」與「跑偏」進一步減少的方法。

原文鏈接:jianshu.com/p/58b3fe300

查閱更為簡潔方便的分類文章以及最新的課程、產品信息,請移步至全新呈現的:leadai.org

關注人工智慧LeadAI公眾號,查看更多專業文章

weixin.qq.com/r/ZDnC2j- (二維碼自動識別)

大家都在看

LSTM模型在問答系統中的應用

基於TensorFlow的神經網路解決用戶流失概覽問題

最全常見演算法工程師面試題目整理(一)

最全常見演算法工程師面試題目整理(二)

TensorFlow從1到2 | 第三章 深度學習革命的開端:卷積神經網路

裝飾器 | Python高級編程

今天不如來複習下Python基礎


推薦閱讀:

尋找全局最小值和防止過擬合之間是不是矛盾的?
梯度下降法快速教程 | 第三章:學習率衰減因子(decay)的原理與Python實現
一文看懂常用的梯度下降演算法
機器學習筆記8 —— 邏輯回歸模型的代價函數和梯度下降演算法

TAG:梯度下降 | Python |