1. 程式人生 > >講透機器學習中的梯度下降

講透機器學習中的梯度下降

本文始發於個人公眾號:TechFlow,原創不易,求個關注


在之前的文章當中,我們一起推導了線性迴歸的公式,今天我們繼續來學習上次沒有結束的內容。

上次我們推導完了公式的時候,曾經說過由於有許多的問題,比如最主要的複雜度問題。隨著樣本和特徵數量的增大,通過公式求解的時間會急劇增大,並且如果特徵為空,還會出現公式無法計算的情況。所以和直接公式求解相比,實際當中更傾向於使用另外一種方法來代替,它就是今天這篇文章的主角——梯度下降法。

梯度下降法可以說是機器學習和深度學習當中最重要的方法,可以說是沒有之一。尤其是在深度學習當中,幾乎清一色所有的神經網路都是使用梯度下降法來訓練的。那麼,梯度下降法究竟是一種什麼樣的方法呢,讓我們先從梯度的定義開始。


梯度的定義


我們先來看看維基百科當中的定義:梯度(gradient)是一種關於多元導數的概括。平常的一元(單變數)函式的導數是標量值函式,而多元函式的梯度是向量值函式。多元可微函式\({\displaystyle f}\)在點\({\displaystyle P}\)上的梯度,是以\({\displaystyle f}\)在\({\displaystyle P}\)上的偏導數為分量的向量。

這句話很精煉,但是不一定容易理解,我們一點一點來看。我們之前高中學過導數,但是高中時候計算的求導往往針對的是一元函式。也就是說只有一個變數x,求導的結果是一個具體的值,它是一個標量。而多元函式在某個點求導的結果是一個向量,n元函式的求導的結果分量就是n,導數的每個分量是對應的變數在該點的偏導數。這個偏導陣列成的向量,就是這個函式在該點的梯度。

那麼,根據上面的定義,我們可以明確兩點,首先梯度是一個向量,它既有方向,也有大小。


梯度的解釋


維基百科當中還列舉了兩個關於梯度的例子,幫助我們更好的理解。

第一個例子是最經典的山坡模型,假設我們當下站在一個凹凸不平的山坡上,我們想要以最快的速度下山,那麼我們應該該從什麼方向出發呢?很簡單,我們應該計算一下腳下點的梯度,梯度的方向告訴我們下山最快的方向,梯度的大小代表這點的坡度。

第二個例子是房間溫度模型,假設我們對房間建立座標系,那麼房間裡的每一個點都可以表示成\({\displaystyle (x,y,z)}\),該點的溫度是\(\phi(x,y,z)\)。如果假設房間的溫度不隨時間變化,那麼房間裡每個點的梯度表示溫度變熱最快的方向,梯度的大小代表溫度變化的速率。

通過這兩個例子,應該很容易理解梯度的方向和大小這兩個概念。


舉例


假設f是一個定義在三維空間裡的函式,那麼,f在某一點的梯度,可以寫成:

\[\nabla f=(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z})=\frac{\partial f}{\partial x}i+\frac{\partial f}{\partial y}j + \frac{\partial f}{\partial z}k\]

這裡的\(i, j, k\)都是標準單位向量,表示座標軸\(x, y, z\)的方向。

我們舉個例子:

\[f=3x^2+4y-sinz\]

套入剛才的梯度公式,可以得到:

\[\nabla f = 6x\cdot i + 4\cdot j - \cos z\cdot k\]

如果我們知道\(x, y, z\)的座標,代入其中,就可以知道對應的梯度了。


梯度下降法


理解了梯度的概念之後,再來看梯度下降法其實就是一張圖的事。請看下面這張圖。

這裡的黑色的曲線表示我們損失函式的函式曲線,我們要做的,就是找到這個最佳的引數x,使得損失函式的值最小。損失函式的值達到最小,也就說明了模型的效果達到了極限,這也就是我們預期的。

我們一開始的時候顯然是不知道最佳的x是多少的(廢話,知道了還求啥),所以我們假設一開始的時候在一個隨機的位置。就假設是圖中的\(x_1\)的位置。接著我們對\(x_1\)求梯度。我們之前說了,梯度就是該點下降最陡峭的方向,梯度的大小就是它的陡峭程度。我們既然知道了梯度的方向之後,其實就很簡單了,我們要做的就是朝著梯度下降,也就是最陡峭的方向向前走一小步。

我們假設,\(x_1\)處的梯度是\(s_1\),那麼我們根據\(s_1\)通過迭代的方法優化損失函式。說起來有些空洞,我寫出來就明白了。

\[ \begin{aligned} x_2 &= x_1 + \eta \cdot s_1 \\ x_3 &= x_2 + \eta \cdot s_2 \\ \vdots \\ x_n &= x_{n-1} + \eta \cdot s_{n-1} \end{aligned} \]

從上面這個公式可以看出來,這是一個迭代公式。也就是說我們通過不停地迭代,來優化引數。理論上來說,這樣的迭代是沒有窮盡的,我們需要手動終止迭代。什麼時候可以停止呢?我們可以判斷每一次迭代的梯度,當梯度已經小到逼近於0的時候,就說明模型的訓練已經收斂了,這個時候可以停止訓練了。

這裡的\(\eta\)是一個固定的引數,稱為學習率,它表示梯度對於迭代的影響程度。學習率越大,說明梯度對於引數變化的影響越大。如果學習率越小,自然每一次迭代引數的變化也就越小,說明到收斂需要的迭代次數也就越多,也可以單純理解成,收斂需要的時間也就越長。

那麼是不是學習率越大越好呢?顯然也不是的。因為如果學習率過大,很有可能會導致在迭代的過程當中錯過最優點。就好像油門踩猛了,一下子就過頭了,於是可能會出現永遠也無法收斂的情況。比如我們可以參考下面這張圖:

從這張圖上可以看到,變數一直在最值附近震盪,永遠也達不成收斂狀態。

如果學習率設定得小一些是不是就沒事了?也不是,如果設定的學習率過小,除了會導致迭代的次數非常龐大以至於訓練花費的時間過久之外,還有可能由於小數的部分過大,導致超出了浮點數精度的範圍,以至於出現非法值Nan這種情況出現。同樣,我們可以參考一下下圖:

這張圖畫的是學習率過小,導致一直在迭代,遲遲不能收斂的情況。

從上面這兩張圖,我們可以看得出來,在機器學習領域學習率的設定非常重要。一個好的引數不僅可以縮短模型訓練的時間,也可以使模型的效果更好。但是設定學習率業內雖然有種種方法,但是不同的問題場景,不同的模型的學習率設定方法都略有差別,也正因此,很多人才會調侃自己是調參工程師。

我們來看一下一個合適的學習率的迭代曲線是什麼樣的。

到這裡還沒有結束,好的學習率並不能解決所有的問題。在有些問題有些模型當中,很有可能最優解本身就是無法達到的,即使用非常科學的方法,設定非常好的引數。我們再來看一張圖:

這張圖有不止一個極值點,如果我們一開始的時候,引數落在了區間的左側,那麼很快模型就會收斂到一個極值,但是它並不是全域性最優解,只是一個區域性最優解。這時候無論我們如何設定學習率,都不可能找到右側的那個全域性最優解。同樣,如果我們一開始引數落在了區間右側,那裡的曲線非常平坦,使得每次迭代的梯度都非常小,非常接近0.那麼雖然最終可以到達全域性最優解,但是需要經過漫長的迭代過程。

所以,模型訓練、梯度下降雖然方法簡單,但是真實的使用場景也是非常複雜的。我們不可以掉以輕心,不過好在,對於線性迴歸的最小二乘法來說,損失函式是一個凸函式,意味著它一定有全域性最優解,並且只有一個。隨著我們的迭代,一定可以達到收斂。


程式碼實戰


Talk is cheap, show me the code.

光說不練假把式,既然我們已經學習到了梯度下降的精髓,也該親身用程式碼體驗一下了。我們還是用之前線性迴歸的問題。如果有遺忘的同學可以點選下方的連結回顧一下之前的內容:

一文講透線性迴歸模型

還是和之前一樣,我們先生成一批點:

import numpy as np
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

這是根據函式\(y = 3x + 4\)隨機出來的,我們接下來就要通過梯度下降的方法來做線性迴歸。首先,我們來推導一下梯度公式:

在使用梯度下降演算法的時候,我們其實計算當前\(\theta\)下的梯度。這個量反應的是當我們的\(\theta\)發生變化的時候,整個的損失函式MSE(mean square error 均方差)會變化多少。而梯度,可以通過對變數求偏導得到。寫成:\(\frac {\partial}{\partial \theta_j}MSE(\theta)\)。

我們單獨計算\(\theta_j\)的損失函式偏導,寫成:\(\frac {\partial}{\partial \theta_j}MSE(\theta)\),帶入之前的損失函式公式,計算化簡可以得到:

\[\frac {\partial}{\partial \theta_j}MSE(\theta)=\frac {1}{m}\sum_{i=1}^m(\theta^T \cdot x_i-y_i)x_j\]

這只是\(\theta_j\)的偏導數,我們可以把向量\(\theta\)中每一個變數的偏導數合在一起計算。標記為:

\[\nabla_\theta MSE(\theta)=\begin{pmatrix} \frac {\partial}{\partial \theta_0}MSE(\theta) \\ \frac {\partial}{\partial \theta_1}MSE(\theta) \\ \vdots\\ \frac {\partial}{\partial \theta_n}MSE(\theta) \\ \end{pmatrix}=\frac {1}{m}X^T\cdot(X \cdot\theta-y)\]

我們不難看出,在這個公式當中,我們涉及了全量的訓練樣本X。因此這種方法被稱為批量梯度下降。因此,當我們的訓練樣本非常大的時候,會使得我們的演算法非常緩慢。但是使用梯度下降演算法,和特徵的數量成正比,當特徵數量很大的時候,梯度下降要比方程直接求解快得多。

需要注意一點,我們推導得到的梯度是向上的方向。我們要下降,所以需要加一個負號,最後再乘上學習率,得到的公式如下:

\[\theta^{next step}=\theta-\eta\nabla_\theta MSE(\theta)\]

根據公式,寫出程式碼就不復雜了:

eta = 0.1 # 學習率
n_iterations = 1000 # 迭代次數
m = 100

theta = np.random.randn(2,1) # 隨機初始值
X = np.c_[np.ones(100).T, X]
for iteration in range(n_iterations):
    gradients = 1/m * X.T.dot(X.dot(theta) - y) # 根據梯度公式迭代
    theta = theta - eta * gradients

我們呼叫一下這段程式碼,來檢視一下結果:

和我們設定的引數非常接近,效果算是很不錯了。如果我們調整學習率和迭代次數,最後的效果可能會更好。

觀察一下程式碼可以發現,我們在實現梯度下降的時候,用到了全部的樣本。顯然,隨著樣本的數量增大,梯度下降會變得非常慢。為了解決這個問題,專家們後續推出了許多優化的方法。不過由於篇幅的限制,我們會在下一篇文章當中和大家分享,感興趣的同學可以小小地期待一下。

梯度下降非常重要,可以說是機器學習領域至關重要的基礎之一,希望大家都能學會。

今天的文章就到這裡,如果覺得有所收穫,請順手點個關注或者轉發吧,你們的支援是我最大的動力。

相關推薦

機器學習梯度下降

本文始發於個人公眾號:TechFlow,原創不易,求個關注 在之前的文章當中,我們一起推導了線性迴歸的公式,今天我們繼續來學習上次沒有結束的內容。 上次我們推導完了公式的時候,曾經說過由於有許多的問題,比如最主要的複雜度問題。隨著樣本和特徵數量的增大,通過公式求解的時間會急劇增大,並且如果特徵為空,還會出現

機器學習梯度下降法和牛頓法的比較

在機器學習的優化問題中,梯度下降法和牛頓法是常用的兩種凸函式求極值的方法,他們都是為了求得目標函式的近似解。在邏輯斯蒂迴歸模型的引數求解中,一般用改良的梯度下降法,也可以用牛頓法。由於兩種方法有些相似,我特地拿來簡單地對比一下。下面的內容需要讀者之前熟悉兩種演算

機器學習梯度下降法原理及用其解決線性迴歸問題的C語言實現

本文講梯度下降(Gradient Descent)前先看看利用梯度下降法進行監督學習(例如分類、迴歸等)的一般步驟: 1, 定義損失函式(Loss Function) 2, 資訊流forward propagation,直到輸出端 3, 誤差訊號back propagation。採用“鏈式法則”,求損失函式關

機器學習梯度下降

梯度 學習 模型 最快 參數 nbsp 函數 bsp 每一個 在吳恩達的機器學習課程中,講了一個模型,如何求得一個參數令錯誤函數值的最小,這裏運用梯度下降法來求得參數。 首先任意選取一個θ 令這個θ變化,怎麽變化呢,怎麽讓函數值變化的快,變化的小怎麽變化,那麽函數值怎麽才能

機器學習梯度下降gradient descent

視屏地址:https://www.bilibili.com/video/av10590361/?p=6  引數優化方法:梯度下降法  learning rate  learning rate : 選擇rate大小 1、自動調learning ra

機器學習筆記——梯度下降(Gradient Descent)

梯度下降演算法(Gradient Descent) 在所有的機器學習演算法中,並不是每一個演算法都能像之前的線性迴歸演算法一樣直接通過數學推導就可以得到一個具體的計算公式,而再更多的時候我們是通過基於搜尋的方式來求得最優解的,這也是梯度下降法所存在的意義。 不是一個機器學習演

吳恩達機器學習筆記——梯度下降

1:假設函式的引數更新要做到同時更新,即先將求得的引數放在統一的temp中,然後同時賦值給對應的引數w0,w1,w2,w3..... 2:特徵縮放和收斂速度問題 倘若,特徵向量中一些特徵值相差太大,就會導致代價函式特徵引數的函式曲線很密集,以至於需要多次迭代才能達到最小值。 學習率:決定

機器學習之--梯度下降演算法

貌似機器學習最繞不過去的演算法,是梯度下降演算法。這裡專門捋一下。 1. 什麼是梯度 有知乎大神已經解釋的很不錯,這裡轉載並稍作修改,加上自己的看法。先給出連結,畢竟轉載要說明出處嘛。為什麼梯度反方向是函式值區域性下降最快的方向? 因為高等數學都忘光了,先從導數/偏倒數/方向

機器學習梯度下降法詳解

一、導數 導數 就是曲線的斜率,是曲線變化快慢的一個反應。 二階導數 是斜率變化的反應,表現曲線的 凹凸性 y

機器學習3- 梯度下降(Gradient Descent)

1、梯度下降用於求解無約束優化問題,對於凸問題可以有效求解最優解 2、梯度下降演算法很簡單就不一一列,其迭代公式: 3、梯度下降分類(BGD,SGD,MBGD) 3.1 批量梯度下降法(Batch Gradient Descent)     批量梯度下降法,是梯度

影象與機器學習-1-梯度下降法與ubuntu

現值研一,進入了飛行器控制實驗室,在我迷茫不知學什麼的時候,這時候劉洋師兄帶著影象識別與跟蹤這個課題來到了我們面前,師兄傾其所有交給我們學習的方法和步驟與資料,第一節課,師兄給我們講解了影象識別與跟蹤以及機器學習或深度學習的應用和前景以及基本框架和概念。可以說帶領我進入了影象與機器學習的第一步。

有關機器學習梯度下降演算法

梯度下降演算法是一個一階最優化演算法,通常也稱為最速下降演算法。 要使用梯度下降演算法尋找區域性最小值,必須向函式上當前點對應梯度的反方向進行迭代搜尋。相反地向函式正方向迭代搜尋,則會接近函式的區域性最大值,這個過程被稱為梯度上升法。 梯度下降演算法基於以下的觀

機器學習筆記——梯度下降(Gradient D)

梯度下降演算法(Gradient Descent) 在所有的機器學習演算法中,並不是每一個演算法都能像之前的線性迴歸演算法一樣直接通過數學推導就可以得到一個具體的計算公式,而再更多的時候我們是通過基於搜尋的方式來求得最優解的,這也是梯度下降法所存在的意義。 不

從零開始機器學習002-梯度下降演算法

老師的課程 1.從零開始進行機器學習 2.機器學習數學基礎(根據學生需求不斷更新) 3.機器學習Python基礎 4.最適合程式設計師的方式學習TensorFlow 上節課講完線性迴歸的數學推導,我們這節課說下如何用機器學習的思想把最合適的權重引數求解出來呢?這

機器學習(7)--梯度下降法(GradientDescent)的簡單實現

曾經在  機器學習(1)--神經網路初探  詳細介紹了神經網路基本的演算法,在該文中有一句weights[i] += 0.2 * layer.T.dot(delta) #0.2學習效率,應該是一個小於0.5的數,同時在  tensorflow例項(2)--機器學習初試

機器學習梯度下降演算法Gradient Descent

      梯度下降演算法: 機器學習實現關鍵在於對引數的磨合,其中最關鍵的兩個數:代價函式J(θ),代價函式對θ的求導∂J/∂θj。 如果知道這兩個數,就能對引數進行磨合了:其中 α   為每步調整的幅度。 其中代價函式公式J(θ): 代價函式對θ的求導∂J/∂θj:

機器學習梯度下降演算法分析與簡述

梯度下降演算法分析與簡述 梯度下降(gradient descent)是一種最優化演算法,基於爬山法的搜尋策略,其原理簡單易懂,廣泛應用於機器學習和各種神經網路模型中。在吳恩達的神經網路課程中,梯度下降演算法是最先拿來教學的基礎演算法。 梯度下降演算法的

機器學習案例——梯度下降與邏輯迴歸簡單例項

梯度下降例項     下圖是f(x) = x2+3x+4 的函式影象,這是初中的一元二次函式,它的導數為g(x) = f’(x) = 2x+3。我們很明確的知道,當x = -1.5時,函式取得最小值。     下面就通過梯度下降法來計算函式取最小值時x的

機器學習梯度下降演算法及梯度優化演算法

用於評估機器學習模型的就是損失函式,我們訓練的目的基本上都是最小化損失,這個最小化的方式就要用優化演算法了,機器學習中最常用的就是梯度下降演算法。 導數、方向導數和梯度 要了解梯度下降演算法是什麼首要知道梯度是什麼,導數和方向導數又是瞭解梯度的前提。

機器學習梯度下降和牛頓法

一、問題描述 考慮將基本梯度下降和牛頓法應用到表中的資料上。 (a)用這兩種演算法對二維資料給出 和 的判別。對梯度下降法取 。畫出以迭代次數為準則函式的曲線。 (b)估計這兩種方法的數學運算量。 (c)畫出收斂時間-學習率曲線。求出無法收斂的最小學習率。 二、