梯度下降法是求解無約束最優(yōu)化問題的一種常用的方法磷杏,方法實(shí)現(xiàn)簡(jiǎn)單。
梯度下降背后的思想是:開始時(shí)我們隨機(jī)選擇一個(gè)參數(shù)的組合(θ0,θ1,...,θn)慈格,計(jì)算代價(jià)函數(shù)遥金,然后我們尋找下一個(gè)能讓代價(jià)函數(shù)值下降最多的參數(shù)組合。我們持續(xù)這么做直到到一個(gè)局部最小值(local minimum)选泻。
Paste_Image.png
例如
1.目標(biāo)函數(shù)
Paste_Image.png
2.代價(jià)函數(shù)
Paste_Image.png
問題:如何選取
Paste_Image.png
使得代價(jià)函數(shù)
Paste_Image.png
最小
思路如下:
(1)先確定向下一步的步伐大小α,我們稱為L(zhǎng)earning rate窝撵;
(2)任意給定一個(gè)初始值θ0,θ1,...θi襟铭;
(3)確定一個(gè)向下的方向,并向下走預(yù)先規(guī)定的步伐寒砖,并更新初始值;
Paste_Image.png
(4)當(dāng)下降的高度小于某個(gè)定義的值魁兼,則停止下降璃赡;此時(shí)的θ0,θ1,...θi即為我們學(xué)習(xí)后得到的目標(biāo)函數(shù)的θ0,θ1,...θi献雅。
學(xué)習(xí)速率的影響
在使用梯度下降的時(shí)候塌计,α的選取會(huì)影響算法的使用,α的值應(yīng)該選取合適的值锌仅,不能過小墙贱,過小惨撇,學(xué)習(xí)效率比較慢府寒,過大可能無法得到目標(biāo)函數(shù)。
α的選取有如下幾種方法
1.Adagrad
Paste_Image.png
其中剖淀,α為初始的學(xué)習(xí)速率纤房,α^t為t次迭代后的學(xué)習(xí)速率。
2.或者給一固定值
α一般取0到1之間
代碼如下:
x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)]
# y[i] 樣本點(diǎn)對(duì)應(yīng)的輸出
y = [95.364, 97.217205, 75.195834, 60.105519, 49.342380]
# 迭代閥值捌刮,當(dāng)兩次迭代損失函數(shù)之差小于該閥值時(shí)停止迭代
epsilon = 0.0001
# 學(xué)習(xí)率
alpha = 0.01
diff = [0, 0]
max_itor = 1000
error1 = 0
error0 = 0
cnt = 0
m = len(x)
# 初始化參數(shù)
theta0 = 0
theta1 = 0
theta2 = 0
while True:
cnt += 1
# 參數(shù)迭代計(jì)算
for i in range(m):
# 擬合函數(shù)為 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
# 計(jì)算殘差
diff[0] = (theta0 + theta1 * x[i][1] + theta2 * x[i][2]) - y[i]
# 梯度 = diff[0] * x[i][j]
theta0 -= alpha * diff[0] * x[i][0]
theta1 -= alpha * diff[0] * x[i][1]
theta2 -= alpha * diff[0] * x[i][2]
# 計(jì)算損失函數(shù)
error1 = 0
for lp in range(len(x)):
error1 += (y[lp]-(theta0 + theta1 * x[lp][1] + theta2 * x[lp][2]))**2/2
if abs(error1-error0) < epsilon:
break
else:
error0 = error1
print (theta0, theta1, theta2, error1)
print (theta0, theta1, theta2)
print (cnt)