梯度下降—Python實現

2021-01-08 人工智慧遇見磐創

梯度下降是數據科學的基礎,無論是深度學習還是機器學習。深入了解梯度下降原理一定會對你今後的工作有所幫助。

你將真正了解這些超參數的作用以及處理使用此算法可能遇到的問題。

然而,梯度下降並不局限於一種算法。另外兩種流行的梯度下降(隨機和小批量梯度下降)建立在主要算法的基礎上,你可能會看到比普通批量梯度下降更多的算法。因此,我們也必須對這些算法有一個堅實的了解,因為它們有一些額外的超參數,當算法沒有達到期望的性能時,我們需要理解和分析這些超參數。

雖然理論對於深入理解手頭的算法至關重要,但梯度下降的實際編碼及其不同的「變體」可能是一項困難的任務。為了完成這項任務,本文的格式如下:

簡要概述每種算法的作用算法的代碼對規範不明確部分的進一步解釋我們將使用著名的波士頓住房數據集,它是預先內置在scikit learn中的。我們還將從頭開始構建一個線性模型。

首先做一些基本的導入。我不打算在這裡做EDA,因為這不是本文的真正目的。

import numpy as npimport pandas as pd import plotly.express as pxfrom sklearn.datasets import load_bostonfrom sklearn.metrics import mean_squared_error為了看到數據是什麼樣子,我將把數據轉換成一個數據幀並顯示輸出。

data = load_boston()df = pd.DataFrame(data['data'],columns=data['feature_names'])df.insert(13,'target',data['target'])df.head(5)

現在定義特徵(X)和目標(y),我們還將定義參數向量,將其命名為thetas,並將它們初始化為零。

X,y = df.drop('target',axis=1),df['target']thetas = np.zeros(X.shape[1])成本函數

回想一下,成本函數是衡量模型性能的東西,也是梯度下降的目標。我們將使用的代價函數稱為均方誤差。公式如下:

def cost_function(X,Y,B): predictions = np.dot(X,B.T) cost = (1/len(Y)) * np.sum((predictions - Y) ** 2) return cost在這裡,我們將輸入、標籤和參數作為輸入,並使用線性模型進行預測,得到成本,然後返回。如果第二行讓你困惑,回想一下線性回歸公式:

所以我們基本上是得到每個特徵和它們相應權重之間的點積。如果你仍不理解,可以看看這個視頻:https://www.youtube.com/watch?v=kHwlB_j7Hkc 。

現在讓我們測試一下成本函數,看看它是否真的有效。為了做到這一點,我們將使用scikit learn的均方誤差,得到結果,並將其與我們的算法進行比較。

mean_squared_error(np.dot(X,thetas.T),y)OUT: 592.14691169960474cost_function(X,y,thetas)OUT: 592.14691169960474我們的成本函數起作用了!

特徵縮放

特徵縮放是線性模型(線性回歸、KNN、SVM)的重要預處理技術。本質上,特徵被縮小到更小的範圍,並且特徵也在一定的範圍內。可以這樣考慮特徵縮放:

你有一座很大的建築物你希望保持建築的形狀,但希望將其調整為較小的比例特徵縮放通常用於以下場景:

如果一個算法使用歐幾裡德距離,那麼由於歐幾裡德距離對較大的量值敏感,因此需要對特徵進行縮放特徵縮放還可以用於數據標準化特徵縮放還可以提高算法的速度雖然有許多不同的特徵縮放方法,但我們將使用以下公式構建MinMaxScaler的自定義實現:

由於上述原因,我們將使用縮放。

X_norm = (X - X.min()) / (X.max() - X.min())X = X_norm這裡沒什麼特別的,我們只是把公式翻譯成代碼。現在,節目真正開始了:梯度下降!

梯度下降

具體地說,梯度下降是一種優化算法,它通過迭代遍歷數據並獲得偏導數來尋求函數的最小值(在我們的例子中是MSE)。

如果這有點複雜,試著把梯度下降想像成是一個人站在山頂上,他試著以最快的速度從山上爬下來,沿著山的負方向不斷地「走」,直到到達底部。

現在梯度下降有不同的版本,但是你會遇到最多的是:

批量梯度下降隨機梯度下降法小批量梯度下降現在我們將按順序討論、實現和分析每一項,讓我們開始吧!

批量梯度下降

批量梯度下降可能是你遇到的第一種梯度下降類型。在這篇文章中並不是很理論化(可以參考以前的文章:https://medium.com/@vagifaliyev/gradient-descent-clearly-explained-in-python-part-1-the-troubling-theory-49a7fa2c4c06 ),但實際上它計算的是整個(批處理)數據集上係數的偏導數。你可能已經猜到這樣做很慢了。

我們的數據集很小,所以可以像這樣實現批量梯度下降:

def batch_gradient_descent(X,Y,theta,alpha,iters): cost_history = [0] * iters # 初始化歷史損失列表 for i in range(iters): prediction = np.dot(X,theta.T) theta = theta - (alpha/len(Y)) * np.dot(prediction - Y,X) cost_history[i] = cost_function(X,Y,theta) return theta,cost_history要說明一些術語:

alpha:這是指學習率。

iters:迭代運行的數量。

太好了,現在讓我們看看結果吧!

batch_theta,batch_history=batch_gradient_descent(X,y,theta,0.05,500)不是很快,但也不是很慢。我們用新的和改進的參數來可視化成本:

cost_function(X,y,batch_theta)OUT: 27.537447130784262哇,從592到27!這只是梯度下降的力量的一瞥!讓我們對迭代次數的成本函數進行可視化:

fig = px.line(batch_history,x=range(5000),y=batch_history,labels={'x':'no. of iterations','y':'cost function'})fig.show()

好的,看看這個圖表,在大約100次迭代之後達到了一個大的下降,之後一直在逐漸減少。批量梯度下降到此結束。

優點

有效且曲線平滑最準確,最有可能達到全局最低值缺點

對於大型數據集可能會很慢計算成本高隨機梯度下降法

這裡不是計算整個訓練集的偏導數,而是只計算一個隨機樣本(隨機意義上的隨機)。

這是很好的,因為計算只需要在一個訓練示例上進行,而不是在整個訓練集上進行,這使得計算速度更快,而且對於大型數據集來說非常理想。

然而由於其隨機性,隨機梯度下降並不像批量梯度下降那樣具有平滑的曲線,雖然它可以返回良好的參數,但不能保證達到全局最小值。

學習率調整

解決隨機梯度下降問題的一種方法是學習率調整。

基本上,這會逐漸降低學習率。因此,學習率一開始很大(這有助於避免局部極小值),當學習率接近全局最小值時,學習率逐漸降低。但是你必須小心:

如果學習速率降低得太快,那麼算法可能會陷入局部極小,或者在達到最小值的一半時停滯不前;如果學習速率降低太慢,可能會在很長一段時間內跳轉到最小值附近,仍然無法得到最佳參數。現在,我們將使用簡易的學習率調整策略實現隨機梯度下降:

t0,t1 = 5,50 # 學習率超參數def learning_schedule(t): return t0/(t+t1) def stochastic_gradient_descent(X,y,thetas,n_epochs=30): c_hist = [0] * n_epochs # 歷史成本 for epoch in range(n_epochs): for i in range(len(y)): random_index = np.random.randint(len(Y)) xi = X[random_index:random_index+1] yi = y[random_index:random_index+1] prediction = xi.dot(thetas) gradient = 2 * xi.T.dot(prediction-yi) eta = learning_schedule(epoch * len(Y) + i) thetas = thetas - eta * gradient c_hist[epoch] = cost_function(xi,yi,thetas) return thetas,c_hist現在運行函數:

sdg_thetas,sgd_cost_hist = stochastic_gradient_descent(X,Y,theta)這樣就行了!現在讓我們看看結果:

cost_function(X,y,sdg_thetas)OUT:29.833230764634493從592到29,但是請注意:我們只進行了30次迭代。批量梯度下降,500次迭代後得到27次!這只是對隨機梯度下降的非凡力量的一瞥。

我們用一個圖再次將其可視化:

由於這是一個小數據集,批量梯度下降就足夠了,但這只是顯示了隨機梯度下降的力量。

優點:

與批量梯度下降相比更快更好地處理更大的數據集缺點:

在某個最小值上很難跳出並不總是有一個清晰的圖,可以在一個最小值附近反彈,但永遠不會達到最佳的最小值小批量梯度下降

好了,快到了,還有一個要通過!現在,在小批量梯度下降中,我們不再計算整個訓練集或隨機樣本的偏導數,而是在整個訓練集的小子集上計算。

這給了我們比批量梯度下降更快的速度,因為它不像隨機梯度下降那樣隨機,所以我們更接近於最小值。然而,它很容易陷入局部極小值。

同樣,為了解決陷入局部最小值的問題,我們將在實現中使用簡易的學習率調整。

np.random.seed(42) # 所以我們得到相同的結果t0, t1 = 200, 1000def learning_schedule(t): return t0 / (t + t1) def mini_batch_gradient_descent(X,y,thetas,n_iters=100,batch_size=20): t = 0 c_hist = [0] * n_iters for epoch in range(n_iters): shuffled_indices = np.random.permutation(len(y)) X_shuffled = X_scaled[shuffled_indices] y_shuffled = y[shuffled_indices] for i in range(0,len(Y),batch_size): t+=1 xi = X_shuffled[i:i+batch_size] yi = y_shuffled[i:i+batch_size] gradient = 2/batch_size * xi.T.dot(xi.dot(thetas) - yi) eta = learning_schedule(t) thetas = thetas - eta * gradient c_hist[epoch] = cost_function(xi,yi,thetas) return thetas,c_hist運行並獲得結果:

mini_batch_gd_thetas,mini_batch_gd_cost = mini_batch_gradient_descent(X,y,theta)以及新參數下的成本函數:

cost_function(X,Y,mini_batch_gd_thetas)OUT: 27.509689139167012真的很棒。我們運行了1/5的迭代,得到了一個更好的分數!

再畫出函數:

感謝閱讀!

相關焦點

  • 從頭開始:用Python實現帶隨機梯度下降的Logistic回歸
    它容易實現、易於理解,並在各類問題上有不錯的效果,即使該方法的原假設與數據有違背時。在本教程中,你將了解如何在 Python 中實現隨機梯度下降的 logistic 回歸算法。學完本教程後,你將了解:如何使用 logistic 回歸模型進行預測。
  • 機器學習:隨機梯度下降和批量梯度下降算法介紹
    機器學習:隨機梯度下降和批量梯度下降算法介紹 佚名 發表於 2017-11-28 04:00:28 隨機梯度下降(Stochastic gradient descent)
  • 機器學習之多元線性回歸模型梯度下降公式與代碼實現(篇二)
    上一篇我們介紹了線性回歸的概述和最小二乘的介紹,對簡單的一元線性方程模型手推了公式和python代碼的實現。,我們確定用梯度下降法來計算多元線性模型,當然還有更多計算方式。梯度下降法又稱最速下降法,是求解無約束最優化問題的一種最常用的方法,在對損失函數最小化時經常使用。梯度下降法是一種迭代算法。選取適當的初值x(0),不斷迭代,更新x的值,進行目標函數的極小化,直到收斂。
  • 吳恩達深度學習(20)-激活函數的導數和神經網絡的梯度下降
    3)Rectified Linear Unit (ReLU)g(z)=max(0,z)註:通常在z= 0的時候給定其導數1,0;當然z=0的情況很少4)Leaky linear unit (Leaky ReLU)與ReLU類似註:通常在z=0的時候給定其導數1,0.01;當然z=0的情況很少神經網絡的梯度下降
  • Batch、Mini-batch和隨機梯度下降的區別和Python示例
    在研究機器學習和深度學習時出現的主要問題之一是梯度下降的幾種類型。在梯度下降的三種類型(Batch梯度下降、Mini-batch梯度下降和隨機梯度下降)中,我應該使用哪一種呢?在這篇文章中,我們將了解這些概念之間的區別,並從梯度下降的代碼實現來闡明這些方法。
  • 吳恩達深度學習筆記(13)-多樣本梯度下降和向量化處理多批次數據
    m 個樣本的梯度下降(Gradient Descent on m Examples)在之前的筆記中,已經講述了如何計算導數,以及應用梯度下降在邏輯回歸的一個訓練樣本上。現在我們想要把它應用在m個訓練樣本上。首先,讓我們時刻記住有關於損失函數就J(w,b) 的定義。
  • 梯度下降背後的數學原理幾何?
    雷鋒網 AI 科技評論按:對於諸位「機器學習兒」而言,梯度下降這個概念一定不陌生,然而從直觀上來看,梯度下降的複雜性無疑也會讓人「敬而遠之」。本文作者 Suraj Bansal 通過對梯度下降背後的數學原理進行拆解,並配之以簡單的現實案例,以輕鬆而有趣的口吻帶大家深入了解梯度下降這一在機器學習領域至關重要的方法。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    因篇幅有限,以下展示的只是課程裡部分內容如對python課程有更多疑問 請諮詢客服 1零基礎入門全能班 01 –python簡介 02 第一個程序 03-python執行方式和pycharm設置 04-程序的注釋和算術運算符 05 程序執行原理 06變量的使用以及類型 07
  • 梯度下降算法詳解
    並且隨著特徵數目的增多(列如100000),梯度下降的效率將遠高於去解析標準方程的逆矩陣。神經網絡中的後向傳播算法其實就是在進行梯度下降,GDBT(梯度提升樹)每增加一個弱學習器(CART回歸樹),近似於進行一次梯度下降,因為每一棵回歸樹的目的都是去擬合此時損失函數的負梯度,這也可以說明為什麼GDBT往往沒XGBoost的效率高,因為它沒辦法擬合真正的負梯度,而Xgboost 的每增加的一個弱學習器是使得損失函數下降最快的解析解。
  • 機器學習 101:一文帶你讀懂梯度下降
    另外,想要培養對複雜項目的直覺,理解基本的概念也是十分關鍵的。  為了理解梯度下降的核心,讓我們來看一個運行的例子。這項任務是這個領域的一項老任務——使用一些歷史數據作為先驗知識來預測房價。 我們的目標是討論梯度下降。所以我們讓這個例子簡單一點,以便我們可以專注於重要的部分。
  • 技術| 深度解讀最流行的優化算法:梯度下降
    批量梯度下降法(Batch Gradient Descent) Vanilla 梯度下降法(譯者註:Vanilla 是早期機器學習算法相關的名詞,也是如今一個機器學習 python 程序庫的名字,在該處指的是後者,參見:https://github.com/vinhkhuc/VanillaML
  • 10個梯度下降優化算法+備忘單
    在一個線性回歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)通過梯度下降,優化算法可以在如下三個主要方面起作用:1、修改學習率成分,α, 或2、修改梯度成分
  • 線性回歸和梯度下降的初學者教程
    這就是為什麼我們需要使用梯度下降。梯度下降是一種找到最佳擬合線的工具。在深入研究梯度下降之前,先看看另一種計算最佳擬合線的方法。最佳擬合線的統計計算方法:直線可以用公式表示:y=mx+b。回歸線斜率m的公式為:m = r * (SD of y / SD of x)。
  • 吳恩達深度學習筆記(12)-計算圖計算梯度下降
    邏輯回歸中的梯度下降(Logistic Regression Gradient Descent)本節我們討論怎樣通過計算偏導數來實現邏輯回歸的梯度下降算法。它的關鍵點是幾個重要公式,其作用是用來實現邏輯回歸中梯度下降算法。但是在本節中,將使用計算圖對梯度下降算法進行計算。
  • 【算法系列】凸優化的應用——Python求解優化問題(附代碼)
    推薦閱讀   Sklearn包含的常用算法  隨機森林算法入門(python)  下降方法:坐標下降、梯度下降、次梯度下降>  機器學習算法Python實現--邏輯回歸  機器學習算法Python實現--線性回歸分析  【機器學習算法系列】機器學習中梯度下降法和牛頓法的比較  【機器學習算法系列】如何用Apriori尋找到繁雜數據之間的隱藏關係  後臺回復「代碼
  • 詳解梯度下降算法 正確訓練模型利刃!
    梯度下降可以被認為是攀登到山谷的底部,而不是爬上山丘。這是因為它是使給定函數最小化的最小化算法。  下面的等式描述了梯度下降的作用:「b」描述了我們登山者的下一個位置,而「a」代表了他的當前位置。減號表示梯度下降的最小化部分。中間的「gamma」是一個等待因素,梯度項(Δf(a))僅僅是最陡下降的方向。
  • 最清晰的講解各種梯度下降法原理與Dropout
    第四、Momentum梯度下降法SGD、BSGD兩種改進方法都存在不同程度的震蕩,如何避免震蕩?或者說震蕩是怎麼產生的?震蕩,從可視圖表現來看,就是頻繁更改方向,所以,如果能夠把之前下降的方向考量進來,那麼將會減少振蕩。上邊第二個圖是帶動量的梯度下降法。
  • 一文讀懂線性回歸和梯度下降
    這又牽扯到一個概念:梯度下降(Radient Descent)最小均方算法(Least mean square,LMS算法)(對的朋友,你沒有看錯,不是梯度下降,是LMS算法。我們又兩種方式將只有一個樣本的數學表達轉化為樣本為多個的情況:梯度下降(gradient descent)和正則方程(The normal equations)。這裡我們重點講梯度下降。
  • 一分鐘看完梯度下降法
    今天,我想講一下梯度下降法(Gradient Descent),基於線性回歸損失函數的梯度下降法。
  • 使用Python從頭開始實現深度學習庫
    為此,可能需要將核心實現單元隱藏在幾個抽象層後面,這使得難以理解深度學習庫所基於的基本底層原理。因此,本文的目的是提供有關深度學習庫構建塊的見解。我們首先了解一些深度學習的背景知識,以了解功能要求,然後使用NumPy在python中使用一個簡單而完整的庫,該庫能夠端到端訓練神經網絡模型(非常簡單的類型)。在此過程中,我們將學習深度學習框架的各個組成部分。該庫不到100行代碼,因此應該很容易遵循。