神經網絡中的梯度下降

誤差平面:

  • 以平方誤差的線性神經元:二次的碗狀(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 : 改變學習率:

4. fancy method from optimization literature make use of curvature information

__________________________________________________________________________________

 

動量方法(momentum method)

 

當本次梯度下降與上次速度方向相同時,會起到一個正向加速的作用。

當本次梯度下降與上次速度方向相反時,會起到一個減速的作用。

(α是動量)


動量接近1,比標準的梯度下降快得多。

 

改良版的動量:


______________________________________________________________________________________

 

 

RMSprop在使用大量冗餘數據集的大型神經網絡中學習權重。

待更。

 

______________________________________________________________________________________

khaki:卡其色

 

———————————————————————————————————————————

python實現momentum梯度下降
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()

代碼參考自簡書的monitor1397




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章