神经网络中的梯度下降

误差平面:

  • 以平方误差的线性神经元:二次的碗状(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




猜你喜欢

转载自blog.csdn.net/ll523587181/article/details/78874406