1. 程式人生 > >機器學習筆記——梯度下降(Gradient D)

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

梯度下降演算法(Gradient Descent)

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

  • 不是一個機器學習演算法
  • 是一種基於搜尋的最優化方法
  • 作用:最小化一個損失函式
  • 梯度上升法:最大化一個效用函式

1 梯度下降法

1.1 什麼梯度下降法?

圖中任意一點的斜率我們可以用dJdθ\frac{dJ}{d\theta}來表示,而斜率的正負更可以表示增大或減小的放下,若斜率為正則沿xx 正方向增大,若斜率為負則沿 xx

正方向減小,當我們設定一個步長 η\eta ,以及一個起始點 (J,θ)(J,\theta) ,每次向 JJ 減小的方向移動一個步長,則有: J(θη)J(θ)ηdJdθ J(\theta-\eta) \approx J(\theta) -\eta\frac{dJ}{d\theta} 這樣通過搜尋的方法就可以找到一個最小的 JJ ,而對於某些函式來說並不是都存在一個唯一的極值點,例如下圖中的情況: 函式 ff 存在一個區域性最優解和一個全域性最優解,按照梯度下降演算法,如果我們的起始點選在了最右邊的紅點處的話那麼這樣尋找到得只是一個區域性最優解。為了解決這個問題,我們通常的做法是多次執行,隨機化初始點。因此我們可以知道梯度下降演算法中的初始點也是一個超引數。

1.2 關於引數 η\eta

  • η\eta 稱為學習率(Learning Rate)
  • η\eta 的取值影響獲得最優解的速度
  • η\eta 取值不合適甚至得不到最優解
  • η\eta 是梯度下降演算法的一個超引數

1.3 程式碼實現梯度下降演算法

import numpy as np
import matplotlib.pyplot as plt
plot_x = np.linspace(-1,6,141)
# print(plot_x)
plot_y = (plot_x - 2.5) ** 2 -1

plt.plot(plot_x,plot_y)
# plt.show()

def
dJ(theta): return 2 * (theta - 2.5) def J(theta): return (theta - 2.5) ** 2 -1 theta = 0.0 eta = 0.1 epsilon = 1e-8 theta_history = [theta] while True: gradieent = dJ(theta) last_theta = theta theta = theta - eta * gradieent theta_history.append(theta) if(abs(J(theta) -J(last_theta)) < epsilon): break plt.plot(np.array(theta_history), J(np.array(theta_history)), color = 'r', marker = '+') plt.show() print(theta) print(J(theta)) #**************************執行結果*************************************** # 2.499891109642585 # -0.99999998814289

圖1.3-1 顯然我們實現的梯度下降演算法已經達到了我們想要的效果,下面我們對上面的程式碼進行封裝,再看看不同的 θ\theta 取值對演算法效果的影響:

import numpy as np
import matplotlib.pyplot as plt
plot_x = np.linspace(-1,6,141)

def dJ(theta):
    return 2 * (theta - 2.5)

def J(theta):
    return (theta - 2.5) ** 2 -1

def gradient_descent(initial_theta, eta, epsilon=1e-8):
    theta = initial_theta
    theta_history.append(initial_theta)
    while True:
        gradieent = dJ(theta)
        last_theta = theta
        theta = theta - eta * gradieent
        theta_history.append(theta)

        if (abs(J(theta) - J(last_theta)) < epsilon):
            break

def plot_theta_history():
    plt.plot(plot_x, J(plot_x))
    plt.plot(np.array(theta_history), J(np.array(theta_history)), color='r', marker='+')
    plt.show()

eta = 0.01
theta_history = []
gradient_descent(0.0, eta)
plot_theta_history()
#***************************************執行結果************************
#            如下圖

相比我們將 θ\theta 設定為0.1,此時的 θ=0.01\theta = 0.01 顯然此時已經近乎擬合了曲線。如果我們把 θ\theta 的取值設定的更大一點呢?

eta = 0.8
theta_history = []
gradient_descent(0.0, eta)
plot_theta_history()

雖然此時我們的梯度下降演算法並沒有很好的擬合我們的曲線,但是依然有效,依舊找到了最優解,因此我們知道,θ\theta 的值只要不超過某個限定的值就是有效的。 下面我們試著將 θ\theta 的值設定為1.1 此時編譯器直接報錯

OverflowError: (34, 'Result too large')

此時因為我們選取的 η\eta 值過大,是的我們無法求得最優解,我我們修改一下程式碼,用matplot畫出直觀的圖示來看看究竟發生了什麼。 首先我們將gradient_descent函式中新增一個n_iterations變數來控制迴圈次數,再改變while迴圈的條件

ef gradient_descent(initial_theta,eta, n_iterations = 1e4,  epsilon=1e-8):
    theta = initial_theta
    theta_history.append(initial_theta)
    i_iter = 0
    while i_iter < n_iterations:
        gradieent = dJ(theta)
        last_theta = theta
        theta = theta - eta * gradieent
        theta_history.append(theta)

        if (abs(J(theta) - J(last_theta)) < epsilon):
            break
        i_iter += 1

我們讓while迴圈執行10次檢視結果

eta = 1.1
theta_history = []
gradient_descent(0.0,  eta,n_iterations=10)
plot_theta_history()

從結果中我們可以明顯看到,θ\theta 取值過大,J(θ)J(\theta) 的值也隨之越來越大,而且我們這裡只迴圈了10次,在之前我們的while迴圈直接等於true,一直在死迴圈,所以才會報OverflowError: (34, 'Result too large')的錯誤!

2 多元線性迴歸中的梯度下降演算法

在引數只有一個的情況下,我們知道斜率對應於JJ 增大的方向,而在多個引數的情況下梯度 J\nabla J 表示 JJ增大最快的方向 在之前的多元線性迴歸演算法中我們的目標函式為 i=1m(y(i)y^(i))2 \sum_{i=1}^m{(y^{(i)}-\hat{y}^{(i)})^2} y^(i)=θ0+θ0x1(i)+θ0x2(i)++θ0xn(i) \hat{y}^{(i)}=\theta_0+\theta_0x_1^{(i)}+\theta_0x_2^{(i)}+\cdots+\theta_0x_n^{(i)} 所以也就是求 i=1m(y(i)θ0θ0x1(i)θ0x2(i)θ0xn(i))2 \sum_{i=1}^m{(y^{(i)}-\theta_0-\theta_0x_1^{(i)}-\theta_0x_2^{(i)}-\cdots-\theta_0x_n^{(i)})^2} 儘可能小。 下面我們來求這一函式的梯度: J=(Jθ0Jθ1Jθ2Jθn)=(i=1m2(y(i)Xb(i)θ)(1)i=1m2(y(i)Xb(i)θ)(X1(i))i=1m2(y(i)Xb(i)θ)(X2(i))i=1m2(y(i)Xb(i)θ)(Xn(i))) \nabla J= \begin{pmatrix} \frac{\partial J}{\partial \theta_0} \\ \frac{\partial J}{\partial \theta_1} \\ \frac{\partial J}{\partial \theta_2} \\ \vdots \\ \frac{\partial J}{\partial \theta_n} \end{pmatrix}= \begin{pmatrix} \sum_{i=1}^m2(y^{(i)}-X_b^{(i)}\theta)·(-1) \\ \sum_{i=1}^m2(y^{(i)}-X_b^{(i)}\theta)·(-X_1^{(i)}) \\ \sum_{i=1}^m2(y^{(i)}-X_b^{(i)}\theta)·(-X_2^{(i)}) \\ \vdots \\ \sum_{i=1}^m2(y^{(i)}-X_b^{(i)}\theta)·(-X_n^{(i)}) \end{pmatrix}

相關推薦

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

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

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

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

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

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

【吳恩達機器學習筆記】005 梯度下降Gradient Descent

一、引入        在前幾節課我們講到,我們希望能夠找到曲線擬合效果最好的線條,這樣的線條的誤差最小,所以就轉化成了下面這幅圖所表達的內容。        我們有一些函式,這些函式會有n個引數,我們希望能得到這個函式的最小值,為了方便計算,我們從最簡單的入手,讓引數的個數

機器學習 優化演算法利器之梯度下降Gradient Descend

理解:機器學習各種演算法的求解最終出來的幾乎都是求解最優模型引數的優化問題。 前言        在優化問題領域有些很多優秀思想和演算法,從約束條件分類 分為無約束條件的優化和有約束條件的優化問題,有約束條

機器學習1:梯度下降Gradient Descent

分別求解損失函式L(w,b)對w和b的偏導數,對於w,當偏導數絕對值較大時,w取值移動較大,反之較小,通過不斷迭代,在偏導數絕對值接近於0時,移動值也趨近於0,相應的最小值被找到。 η選取一個常數引數,前面的負號表示偏導數為負數時(即梯度下降時),w向增大的地方移動。 對於非單調函式,

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

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

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

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

機器學習筆記——線性迴歸Linear Regression

線性迴歸演算法 1 簡單線性迴歸(Simple Liner Regression) 解決迴歸問題 思想簡答,容易實現 許多強大的非線性模型的基礎 結果具有很好的可解釋性 蘊含機器學習中的很多重要思想 1.1 什麼是線性迴歸演算法?

機器學習筆記——logistic迴歸logistic regression

logistic迴歸 logistic迴歸實際上並不是一種迴歸演算法,而是一種分類演算法,意思就是輸出值是離散值(01或者更多類),而它叫這個名字完全是歷史原因。我們可以從下圖看出對於分類問題,如果我們採用傳統的迴歸演算法並不能獲得很好的效果 假設稱述 由於輸出的值是0和1,因此我

機器學習筆記——推薦系統recommender system

推薦系統 我們在平時最常見的就是某個網站給你推薦廣告,豆瓣給你推薦電影,網易雲給你推薦你喜歡的歌,這種系統我們統一稱作推薦系統 基於內容的推薦 我們舉一個電影打分的例子 我們可以為某一部電影選定特徵,不同人對不同的特徵有不同的偏愛特性,藉此我們可以預測某個人對某部特定電影的打分

機器學習筆記——異常檢測anomaly detection

異常檢測 當我們需要讓一個系統從許多未標註的資料中學習到某些正常的特徵,從而能夠診斷出非正常的資料,我們把這個過程叫做異常檢測 我們要做的就是對於給定的一組特徵值,我們輸出一個概率,如果這個概率值小於某個臨界值,代表資料異常 演算法 我們可以採用高斯函式來擬合這個概率值,

機器學習筆記——降維dimensionality reduction

降維 目的 我們對資料進行降維的目的有兩個:一個是資料壓縮,對於資料壓縮我們可以大大地節省儲存空間 第二就是使得資料可以視覺化,我們將多維資料壓縮成二維可以供我們更好地觀察資料的特徵 主成分分析(PAC) 主成分分析法可以將n維的資料降為k維,實際上我們是選取了一個k

機器學習筆記——神經網路neural networks

神經網路 非線性假設 對於非線性假設而言,當特徵足夠多的時候,如果我們仍採用多項式進行線性擬合,那麼我們將獲得數量非常龐大的高次項,這使得計算變得非常複雜。出於這個原因,我們受到人腦的啟發,提出了神經網路 我們可以將logistic單元表示成神經元的形式,中間的神經元代表假設函式h

一、降維——機器學習筆記——降維特徵提取

目錄 2、示例  一、為什麼要降維 維數災難:在給定精度下,準確地對某些變數的函式進行估計,所需樣本量會隨著樣本維數的增加而呈指數形式增長。 降維的意義:克服維數災難,獲取本質特徵,節省儲存空間,去除無用噪聲,實現資料視覺化

機器學習筆記--梯度提升Gradient boosting)

1 提升的概念 提升是機器學習技術,可以用於迴歸和分類問題,它每一步產生一個弱預測模型(如決策樹),並加權累加到總模型中

Machine LearningStanford| 斯坦福大學機器學習筆記--第二週1.多元線性迴歸及多元線性迴歸的梯度下降

一.Multivariate Linear regression(多元線性迴歸) 現在起將開始介紹一種新的更為有效的線性迴歸形式。這種形式適用於多個變數或者多特徵量的情況。 在之前學習過的線性迴歸中

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

得到 向導 bubuko gpo 思路 pos 方向導數 ... image 梯度下降算法能夠幫助我們快速得到代價函數的最小值 算法思路: 以某一參數為起始點 尋找下一個參數使得代價函數的值減小,直到得到局部最小值 梯度下降算法: 重復下式直至收斂,其中α為學習速

機器學習梯度下降gradient descent

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

機器學習梯度消失vanishing gradient梯度爆炸exploding gradient問題

1)梯度不穩定問題: 什麼是梯度不穩定問題:深度神經網路中的梯度不穩定性,前面層中的梯度或會消失,或會爆炸。 原因:前面層上的梯度是來自於後面層上梯度的乘乘積。當存在過多的層次時,就出現了內在本質上的不穩定場景,如梯度消失和梯度爆炸。 (2)梯度消失(vanishing gradient