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