随笔 - 1762  文章 - 0  评论 - 109  阅读 - 431万

adam优化算法

1.SGD的难处:

考虑z=1/20*x2+y2图像,

 

等高线图和负梯度方向:

假设从(-7,2)这一点开始进行梯度更新(下降)

learningrate=0.9;

x-=0.9*(1/10)*x   (1)

y-=0.9*2*y          (2)

把(-7,2)这一点带入(1)和(2)式中,得到一个新的(x,y),继续带入,可以得到一个x的列表和y的列表,这个列表代表了梯度下降的路线。

假设走40步,梯度下降的路线如图所示:

复制代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
x_sgd=[-7.0]
y_sgd=[2.0]
x=-7.0
y=-2.0
N=40
lr=0.9
for i in range(N):
    x-=x/10*lr
    y-=2*y*lr
    x_sgd.append(x)
    y_sgd.append(y)
def f(x,y):
    return np.power(x,2)/20+np.power(y,2)
x=np.arange(-10,10,0.01)
y=np.arange(-3,3,0.01)
x,y=np.meshgrid(x,y)
plt.plot(x_sgd,y_sgd,color='red',marker='o',linestyle='solid')
plt.contour(x,y,f(x,y),cmap=plt.cm.coolwarm)
plt.show()
复制代码

 或者:

复制代码
clc;
clear;
close all;


[xx,yy]=meshgrid(-10:0.1:10,-3:0.1:3);
zz=xx.^2/20 + yy.^2;
%zz=(1/20)*xx.^2 + yy.^2;
figure(6);surfc(xx,yy,zz);
figure(7);h=contour(xx,yy,zz, 50);
%clabel(h);
%[dx, dy]=gradient(zz,.2,2);
[dx, dy]=gradient(zz,.1,.1);
hold on;
%quiver(-dx, -dy);


lr=0.9;
a=[];
b=[];
x=-7;
y=2;
for i=1:40
    a=[a,x];
    b=[b,y];
    x=x-lr*(1/10)*x;
    y=y-lr*2*y;
    if i>40
        break
    end       
end
figure(6);hold on;plot(a,b,'r.-');
figure(7);hold on;plot(a,b,'r.-');
复制代码

 

 所以SGD的困难在于:梯度下降的方向不是朝着坑的最低点移动,而是“之”字形向最低点移动,或者称之为“蛇形移动”。

解决之法:Momentum

(1)

 (2)

B代表MiniBatch,指参数在一个小批量中更新。

是(待更新)的模型参数,当=0的时候,式子(2)是:

 ,就变成了一般的SGD梯度下降。

 把式子(1)变形一下:

(3)

(3)

这是个很优美的形式。

(3)式的另一个观察视角:

 (4)

对于(4)式:

 y(20)是对过去的时刻的值,做一个指数加权平均,越是离的近的时刻的值,起的作用越大,越是过去久远的时刻的值,起的作用越小。

 

 

 这对我们有什么帮助呢?观察下图,注意到大部分的梯度更新呈锯齿状。我们也注意到,每一步的梯度更新方向可以被进一步分解为 w1 和 w2 分量。如果我们单独的将这些向量求和,沿 w1 方向的的分量将抵消,沿 w2 方向的分量将得到加强。

 

 

2.adagrad algrithm(adaptive gradiant algrithm)
自适应梯度下降算法,这种算法随着时间的增加,学习率会逐渐降低,就是说越靠近最小值的时候,步子越是小心。

 

圆圈里面一个点代表按照元素相乘,如=(4,9),=(16,81),代表对过往梯度和的累加。

 

 

posted on   一杯明月  阅读(1368)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2018-11-06 python根据圆的参数方程求圆上任意一点的坐标
2018-11-06 python绘制圆和椭圆
2018-11-06 python终止程序的执行
2018-11-06 python利用easygui打开文件对话框
2018-11-06 python的try...except
2018-11-06 python利用os.path操作文件名
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示