优化算法总结

AdaGrad(Adaptive Gradient)自适应梯度

随梯度的变化改变学习率

RMSProp

结合梯度平方的指数移动平均数来调节学习率的变化

克服AdaGrad梯度急剧减小的问题

Adam优化器

对梯度的一阶矩估计(First Moment Estimation,即梯度的均值)和二阶矩估计(Second

Moment Estimation,即梯度的未中心化的方差)进行综合考虑,计算出更新步长。

下面是对几种梯度下降算法的模拟

其中包括随机梯度下降算法SGD,小批量梯度下降算法MSGD,批量梯度下降算法BGD

都是根据损失函数计算参数梯度,更新参数;不一样的地方是他们使用使用训练集的方式

# 随机梯度下降算法SGD
x=np.random.rand(10000,5)
w=np.array([[1,2,3,4,5],[20,30,40,50,60]])
b=np.array([[10],[100]])
y=(w.dot(x.T)+b).T #100,2
lr=0.5
ww = np.random.rand(2,5)
bb = np.random.rand(2,1)
mb=master_bar(range(1000000))
mb.names=['loss']
lossy=[]
for i in mb:
    r=np.random.randint(1000)
    xi=x[r:r+1,:] #1,5
    yi=y[r:r+1,:] #1,2
    yy = ww.dot(xi.T)+bb #2,1
    loss = np.mean(np.power(yy-yi.T,2)/2)
    lossy.append(loss)
    graphs = [[np.arange(len(lossy)),lossy]]
    mb.update_graph(graphs)
    ww=  ww - lr*(yy-yi.T).dot(xi)
    bb=  bb - lr*(yy-yi.T)
    if loss < 1e-10:
        break
    #print(loss)
print(ww,bb)
print(w,b)

# 小批量梯度下降算法MSGD
x=np.random.rand(1000,5)
w=np.array([[1,2,3,4,5],[20,30,40,50,60]])
b=np.array([[10],[100]])
y=(w.dot(x.T)+b).T #100,2
lr=0.3
ww = np.random.rand(2,5)
bb = np.random.rand(2,1)
mb=master_bar(range(200*3))
mb.names=['loss']
lossy=[]
batch = 50
for i in mb:
    lossg,wwg,bbg=0,0,0
    for j in progress_bar(range(batch),parent=mb):
        r=np.random.randint(1000)
        xi=x[r:r+1,:] #1,5
        yi=y[r:r+1,:] #1,2
        yy = ww.dot(xi.T)+bb #2,10
        lossg += np.mean(np.power(yy-yi.T,2)/2)
        wwg += (yy-yi.T).dot(xi)
        bbg += (yy-yi.T)
    lossy.append(lossg/batch)
    graphs = [[np.arange(len(lossy)),lossy]]
    mb.update_graph(graphs)
    ww=  ww - lr*wwg/batch
    bb=  bb - lr*bbg/batch
    if lossg/batch < 1e-4:
        break
    #print(loss)
print(ww,bb)
print(w,b)

# 批量梯度下降算法BGD
x=np.random.rand(1000,5)
w=np.array([[1,2,3,4,5],[20,30,40,50,60]])
b=np.array([[10],[100]])
y=(w.dot(x.T)+b).T #100,2
lr=0.3
#ww = np.random.rand(2,5)
#bb = np.random.rand(2,1)
mb=master_bar(range(200*3))
mb.names=['loss']
lossy=[]
batch = 1000
for i in mb:
    lossg,wwg,bbg=0,0,0
    for j in progress_bar(range(batch),parent=mb):
        r=j
        xi=x[r:r+1,:] #1,5
        yi=y[r:r+1,:] #1,2
        yy = ww.dot(xi.T)+bb #2,10
        lossg += np.mean(np.power(yy-yi.T,2)/2)
        wwg += (yy-yi.T).dot(xi)
        bbg += (yy-yi.T)
    lossy.append(lossg/batch)
    graphs = [[np.arange(len(lossy)),lossy]]
    mb.update_graph(graphs)
    ww=  ww - lr*wwg/batch
    bb=  bb - lr*bbg/batch
    if lossg/batch < 1e-4:
        break
    #print(loss)
print(ww,bb)
print(w,b)