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

隨機梯度算法就可以用作在線學(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é)果如下:
總結(jié):
概念:隨機梯度下降(sgd)
什么是隨機梯度下降,怎么隨機的呢?
其實就是在求梯度的時候,不再用所有的m個樣本數(shù)據(jù)來計算,而是隨機的選擇一條數(shù)據(jù)來計算梯度!隨機梯度下降的好處是什么?缺點是什么?
在求梯度的時候快,迭代次數(shù)有可能更多,最終可能落不到全局最優(yōu)解上Mini-Batch GD是什么?
就是在求梯度的時候做了一個折中,不用所有的數(shù)據(jù),而是隨機選擇一部分數(shù)據(jù)來求梯度!上面代碼里面除了隨機抽取一條數(shù)據(jù)來求解梯度,還隨著迭代次數(shù)的增多,不斷減小步長!learning_rate
為什么要不斷的調(diào)整步長?
就是為了讓越接近最優(yōu)解的時候,調(diào)整的幅度越小,避免來回震蕩!如果我們不人為的調(diào)小步長,會不會隨著迭代的次數(shù)增多,調(diào)整的幅度自動減小?
調(diào)整的幅度取決于誰?卻決于學(xué)習(xí)率和梯度,梯度事實上越接近最優(yōu)解,梯度的絕對值越小