機器學(xué)習(xí)--隨機梯度下降算法

對于樣本數(shù)量額非常之多的情況,Batch Gradient Descent(批量梯度下降)算法會非常耗時,因為每次迭代都要便利所有樣本,可選用Stochastic Gradient Descent 算法,需要注意外層循環(huán)Loop,因為只遍歷一次樣本,不見得會收斂。


743682-20151126140949671-555319333.png

隨機梯度算法就可以用作在線學(xué)習(xí)了,但是注意隨機梯度的結(jié)果并非完全收斂,而是在收斂結(jié)果處波動的,可能由非線性可分的樣本引起來的:

可以有如下解決辦法:

1. 動態(tài)更改學(xué)習(xí)速率a的大小,可以增大或者減小

2. 隨機選樣本進行學(xué)習(xí)

代碼:


import numpyas np

__author__ ='liyan'

X =2 * np.random.rand(100, 1)

y =4 +3 * X + np.random.randn(100, 1)

X_b = np.c_[np.ones((100, 1)), X]

# print(X_b)

n_epochs =500

t0,t1 =5,50

m =100#100個樣本

def learning_schedule(t):#學(xué)習(xí)率逐漸減少

        return t0/(t+t1)

theta = np.random.randn(2,1)

for epochin range(n_epochs):

for iin range(m):#100條數(shù)據(jù)隨機抽取一條

        random_index = np.random.randint(m)# 隨機返回0~99數(shù)

        xi = X_b[random_index:random_index+1]

        yi = y[random_index:random_index+1]

        gradients =1*xi.T.dot(xi.dot(theta)-yi)#梯度

        #1/m*xi.T.dot(xi.dot(theta)-yi)

        learning_rate = learning_schedule(epoch*m+i)#學(xué)習(xí)率逐漸減少

        theta = theta-learning_rate*gradients

print(theta)

運行代碼,計算得到的結(jié)果如下:

image

總結(jié):

  1. 概念:隨機梯度下降(sgd)
    什么是隨機梯度下降,怎么隨機的呢?
    其實就是在求梯度的時候,不再用所有的m個樣本數(shù)據(jù)來計算,而是隨機的選擇一條數(shù)據(jù)來計算梯度!

  2. 隨機梯度下降的好處是什么?缺點是什么?
    在求梯度的時候快,迭代次數(shù)有可能更多,最終可能落不到全局最優(yōu)解上

  3. Mini-Batch GD是什么?
    就是在求梯度的時候做了一個折中,不用所有的數(shù)據(jù),而是隨機選擇一部分數(shù)據(jù)來求梯度!

  4. 上面代碼里面除了隨機抽取一條數(shù)據(jù)來求解梯度,還隨著迭代次數(shù)的增多,不斷減小步長!learning_rate

  5. 為什么要不斷的調(diào)整步長?
    就是為了讓越接近最優(yōu)解的時候,調(diào)整的幅度越小,避免來回震蕩!

  6. 如果我們不人為的調(diào)小步長,會不會隨著迭代的次數(shù)增多,調(diào)整的幅度自動減小?
    調(diào)整的幅度取決于誰?卻決于學(xué)習(xí)率和梯度,梯度事實上越接近最優(yōu)解,梯度的絕對值越小

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容