誤差平面:
- 以平方誤差的線性神經元:二次的碗狀(quadratic bowl)
- 多層非線性網絡的誤差曲面複雜得多,但是隻要權重不是太大,仍然可用二次的碗狀擬合局部。
兩種學習算法:
- full gradient : 使用所有的數據計算梯度
- mini-batch : 使用小批量學習(數據集最好很大,有很多冗餘)
學習率:
- 猜測一個初始的學習率
- 寫一個簡單的程序來自動調整學習率
- 在學習快結束的時候減少學習率(步長)
- 使用驗證急,在誤差停止下降的時候減少學習率
對於輸入數據的操作
- shifting : [101,101; 100,99] ->(-100) [1,1 ; 0,-1]
- scaling : [0.1, 10; 0,1, -10] -> [1,1; 1,-1](第一維擴大十倍,第二維減少十倍)
- PCA: 去相關
四種增加mini-batch的學習速率的方法
1. 動量(momentum):標準的梯度下降是使權重改變學習率乘梯度的大小,
在動量的方法中,用梯度來加速下降。梯度改變速度,速度改變大小。
2. 對於每個參數使用不同的學習速率:根據經驗慢慢調整學習速率:梯度震盪—>減小;不變—>增加
3. rmsprop : 改變學習率:
__________________________________________________________________________________
動量方法(momentum method)
當本次梯度下降與上次速度方向相同時,會起到一個正向加速的作用。
當本次梯度下降與上次速度方向相反時,會起到一個減速的作用。
(α是動量)
動量接近1,比標準的梯度下降快得多。
改良版的動量:
______________________________________________________________________________________
RMSprop在使用大量冗餘數據集的大型神經網絡中學習權重。
待更。
______________________________________________________________________________________
khaki:卡其色
———————————————————————————————————————————
import numpy as np
import matplotlib.pyplot as plt
def func(x):
return np.square(x)
def derivate(x):
return 2*x
def GD_momentum(x_start, lr, epochs, momentum):
'''
:param x_start: x的初始位置
:param lr: learning rate
:param epochs: 迭代次數
:param momentum: 動量
'''
xs = np.zeros(epochs+1)
x = x_start
xs[0] = x
'''
for 循環中的range(x),是從0到x-1
'''
v = 0
for i in range(epochs):
v = momentum*v -lr*derivate(x)
x += v
xs[i+1] = x
return xs
def test_GD_momentum():
'''
測試函數
'''
'''
linspace 是numpy下的函數,前兩個參數表示定義域範圍,最後一個表示點的個數。默認100
'''
line_x = np.linspace(-5,5,100)
line_y = func(line_x)
lr = [0.01, 0.1, 0.5, 0.9]
momentum = [0, 0.1, 0.5, 0.9]
x_start = -5
epochs = 6
color = ['g', 'r', 'k', 'y']
row = len(lr)
col = len(momentum)
size = np.ones(epochs+1)*10
size[-1] = 70
for i in range(row):
for j in range(col):
plt.subplot(row, col, i*col+j+1)
x = GD_momentum(x_start, lr[i], epochs, momentum[j])
plt.plot(line_x, line_y, c = 'b')
plt.plot(x, func(x), c = color[i], label = 'lr={},mo={}'.format(lr[i], momentum[j]))
plt.scatter(x, func(x), c = color[i], s = size)
plt.legend(loc=0)
plt.show()
test_GD_momentum()