机器学习优化器和SGD和SGDM实验对比(编程实现SGD和SGDM)

news2024/12/26 14:03:40

机器学习优化器和SGD和SGDM实验对比

博主最近在学习优化器,于是呢,就做了一个SGD和SGDM的实验对比,可谓是不做不知道,一做吓一跳,这两个算法最终对结果的影响还是挺大的,在实验中SGDM明星要比SGD效果好太多了,SGD很容易陷入局部最优,而且非常容易发生梯度爆炸的情况,而SGDM做的实验当中还未出现这些情况。
在这次实验中博主发现了很多很多的特点对于SGDM和SGDM,下面博主列出这次实验的收获。
(1)SGDM相比SGD当拥有同样的学习率,SGDM更不容易发生梯度爆炸,SGD对于学习率的要求很高,大了,就会梯度爆炸,小了迭代特别慢。
(2)在本次此实验中,我们可以发现,小批量梯度下降比单个样本进行梯度下降区别极为大,单个样本做梯度下降时,特别容易发生梯度爆炸,模型不易收敛。
(3)SGDM相比SGD,loss下降曲线更加平稳,也不易陷入局部最优,但是他的训练较慢,可以说是非常慢了。
(4)超参数的设置对于这两个模型的影响都是很大的,要小心处理。
(5)数据集对于模型迭代也有很大影响,注意要对数据集进行适当的处理。
(6)随着训练轮次的增多,SGDM相比SGD更有可能取得更好的效果。

下面让我们看一看代码:

#coding=gbk

import torch
from torch.autograd import Variable
from torch.utils import data
import matplotlib.pyplot as plt

X =torch.randn(100,4)
w=torch.tensor([1,2,3,4])

Y =torch.matmul(X, w.type(dtype=torch.float))  + torch.normal(0, 0.1, (100, ))+6.5
print(Y)
Y=Y.reshape((-1, 1))

#将X,Y转成200 batch大小,1维度的数据






def loss_function(w,x,y,choice,b):
    if choice==1:
        return torch.abs(torch.sum(w@x)+b-y)
    else:
      #    print("fdasf:",torch.sum(w@x),y)
       #   print(torch.pow(torch.sum(w@x)-y,2))
          return torch.pow(torch.sum(w@x)-y+b,2)
index=0


batch=32
learning_rating=0.03



def SGDM(batch,step,beta,grad_s,grad_b_s):
    if step==0:
        grad=Variable(torch.tensor([0.0]),requires_grad=True)
        grad_b=Variable(torch.tensor([0.0]),requires_grad=True)
        loss=Variable(torch.tensor([0.0]),requires_grad=True)
   
        for j in range(batch):
            try:
               #  print(w,X[index],Y[index],b,)
             #    print(loss_function(w,X[index],Y[index],b,2))
               #  print(torch.sum(w@X[index]),Y[index])
                 grad=(torch.sum(w@X[index])-Y[index]+b)*(-1)*X[index]+grad
                 grad_b=(torch.sum(w@X[index])-Y[index]+b)*(-1)+grad_b
              #   print(loss_function(w,X[index],Y[index],2,b))
                 loss=loss_function(w,X[index],Y[index],2,b)+loss
                 index=index+1
            except:
                 index=0
        
        return  grad/batch,loss/batch,grad_b/batch
    else:
        grad=Variable(torch.tensor([0.0]),requires_grad=True)
        grad_b=Variable(torch.tensor([0.0]),requires_grad=True)
        loss=Variable(torch.tensor([0.0]),requires_grad=True)
   
        for j in range(batch):
            try:
               #  print(w,X[index],Y[index],b,)
             #    print(loss_function(w,X[index],Y[index],b,2))
               #  print(torch.sum(w@X[index]),Y[index])
                 grad=(torch.sum(w@X[index])-Y[index]+b)*(-1)*X[index]+grad
                 grad_b=(torch.sum(w@X[index])-Y[index]+b)*(-1)+grad_b
            
                 loss=loss_function(w,X[index],Y[index],2,b)+loss
                 index=index+1
            except:
                 index=0
        
        return  (beta*grad_s+(1-beta)*grad)/batch,loss/batch,(beta*grad_b_s+(1-beta)*grad_b)/batch
        



def train(n):
    loss_list=[]
    setp=0
    global grad,grad_b
    grad=0
    grad_b=0
    while n:
        n=n-1
        
        grad,loss,grad_b=SGDM(batch,setp,0.99,grad,grad_b)
        setp=setp+1
       # print(grad,loss,grad_b)
        w.data=w.data+learning_rating*grad*w.data
        b.data=b.data+learning_rating*grad_b
       # print("b",b)
        #print("grad_b",grad_b)
        #print("w:",w)
        #print("loss:",loss)
        #print("b:",b)
        loss_list.append(float(loss))
      #  b.data=b.data-(lear
      #  ning_rating*b.grad.data)
     #   print("b",b)
    print("w:",w)
    print("b:",b)
    print("loss:",loss)
    return loss_list


def SGD(batch):
    grad=Variable(torch.tensor([0.0]),requires_grad=True)
    grad_b=Variable(torch.tensor([0.0]),requires_grad=True)
    loss=Variable(torch.tensor([0.0]),requires_grad=True)

   
    for j in range(batch):
        try:
           #  print(w,X[index],Y[index],b,)
         #    print(loss_function(w,X[index],Y[index],b,2))
           #  print(torch.sum(w@X[index]),Y[index])
             grad=(torch.sum(w@X[index])-Y[index]+b)*(-1)*X[index]+grad
             grad_b=(torch.sum(w@X[index])-Y[index]+b)*(-1)+grad_b
            
             loss=loss_function(w,X[index],Y[index],2,b)+loss
             index=index+1
        except:
             index=0
        
    return  grad/batch,loss/batch,grad_b/batch

def train_s(n):
    loss_list=[]
    while n:
        if n//100==0:
            print(n)
        n=n-1
       
        grad,loss,grad_b=SGD(batch)
      
       # print(grad,loss,grad_b)
        w.data=w.data+learning_rating*grad*w.data
        b.data=b.data+learning_rating*grad_b
       # print("b",b)
        #print("w:",w)
        #print("loss:",loss)
        #print("b:",b)
      #  b.data=b.data-(learning_rating*b.grad.data)
     #   print("b",b)
        loss_list.append(float(loss))
    print("w:",w)
    print("b:",b)
    print("loss:",loss)
    return loss_list
  


w=torch.tensor([1,1.0,1,1])

b=torch.tensor([1.0])
w=Variable(w,requires_grad=True)

b=Variable(b,requires_grad=True)

epoch=10000
epoch_list=list(range(1,epoch+1))

loss_list=train(epoch)

plt.plot(epoch_list,loss_list,label='SGDM')



#SGD
w=torch.tensor([1,1.0,1,1])

b=torch.tensor([1.0])
w=Variable(w,requires_grad=True)

b=Variable(b,requires_grad=True)
print(w)



epoch_list=list(range(1,epoch+1))

loss_list=train_s(epoch)

plt.plot(epoch_list,loss_list,label='SGD')
plt.legend()
plt.show()






下面是一张跑出的实验图,事实上,我做了很多很多的实验,这是一件十分有趣的事情,在实验中,你可以看到这些优化器的特点,这很有趣,当然前提是这个优化器是你自己完全编程写的。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/705188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HHU云计算期末复习(下)Hadoop、虚拟化技术、openstack

文章目录 第五章 Hadoop分布式文件系统HDFS分离元数据和数据:NameNode和DataNode流水线复制 第七章 虚拟化技术7.1 虚拟化技术简介7.2 虚拟机迁移7.3 网络虚拟化 第八章 openstack8.1 计算服务NovaRabbitMQ 8.2 Swift 第九章 云计算数据中心9.1 云数据中心特征9.2 网…

Android firebase google登录配置流程和app内测发布流程

googlePlay使用OAuth2.0保护账号安全,且与firebase相关。如果配置错误,会出现error code比如: 10: auth,如clientId不对; 7: 网络或墙的问题; 12500:签名问题。 正确配置流程 Relea…

【Redis】不卡壳的 Redis 学习之路:事务

本文是Redis系列第三篇,前两篇欢迎移步 【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型,各个文章总有些小不同,我们这里讨论的是Redis 7.0,为确保准确&#x…

2.Apache Hive

Apache Hive概述 Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hivev查询语言(HQL)&#xf…

SpringBoot3之GraalVM之Windows详细安装及使用教程

配置Maven环境变量 我直接使用的是IDEA plugins文件夹下的maven 新建MAVEN_HOME环境变量 Path环境变量追加 %MAVEN_HOME%\bin安装Visual Studio Community 因为GraalVM需要调用操作系统的底层工具,而Windows底层工具是VisualStudio,所以我们要先下载…

2022年12月份青少年软件编程Python等级考试试卷六级真题(含答案)

一、单选题(共25题,共50分) 1.数据文件“abc.txt”中包含若干个英文单词,如图所示: 读取文件“abc.txt”中数据的Python程序段如下: file abc.txt word_b [] for word in open(file):if word[0:1] a and len(word)>4:wo…

Flink报错大全

1.flink版本由1.13.6提升到1.15.2 maven jar依赖问题 官方因为1.15.2弃用了2.11版本的scala,jar的命名也发生改变,部分默认的2.12版本的scala不用再特声明 1.15.2版本maven依赖 <repositories><repository><id>aliyunmaven</id><name>阿里云…

构建交互式颜色选择器:介绍Gradio的ColorPicker模块和方法

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

环二肽试剂:Cyclo(-Hyp-Gly),环二肽含有一个六元环结构,结构稳定

编辑作者|陕西新研博美生物科技有限公司​ 英文名称&#xff1a;Cyclo(-Hyp-Gly) 规格标准&#xff1a;1g、5g、10g CAS&#xff1a;N/A 分子式&#xff1a;C7H10N2O3 分子量&#xff1a;170.17Cyclo(-Hyp-Gly)结构式&#xff1a; 反应机理&#xff1a; Cyclo(-Hyp-Gly)环二肽…

【vscode设置默认浏览器为google,配置默认浏览器没有google,VS Code 报Windows找不到文件‘chrome‘】

问题描述 VS Code 报Windows 找不到‘chrome’ 项目启动ctar鼠标左键快捷打开并没有使用默认浏览器 并且自己去浏览器配置并提供完整的选项 解决方案&#xff1a; 网上有很多其他的答案不过对我都没有 最后解决是在google里配置 不是默认浏览器会有个按钮 点一下就跳转到系统…

设计模式第19讲——命令模式(Command)

目录 一、什么是命令模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 抽象命令&#xff08;Command&#xff09;——Command 5.2 接收者&#xff08;Receiver&#xff09;——Chef 5.3 具体命令&#xff08;Co…

第十六章、Spring AOP开发中的一个坑

坑&#xff1a;在同⼀个业务类中&#xff0c;进⾏业务⽅法间的相互调⽤&#xff0c;只有最外层的⽅法,才是加⼊了额外 功能的(内部的⽅法&#xff0c;通过普通的⽅式调⽤&#xff0c;都调⽤的是原始⽅法)。如果想让内层的⽅法也 调⽤代理对象的⽅法&#xff0c;就要实现Appicat…

如何在SQL Server中实现Ungroup操作

概要 我们经常在SQL Server中使用group by语句配合聚合函数&#xff0c;对已有的数据进行分组统计。本文主要介绍一种分组的逆向操作&#xff0c;通过一个递归公式&#xff0c;实现ungroup操作。 代码和实现 我们看一个例子&#xff0c;输入数据如下&#xff0c;我们有一张产…

【需求实现】Tensorflow2的曲线拟合(二):进度条简化

文章目录 导读普通的输出方式上下求索TensorBoard是个不错的切入点与Callback参数对应的Callback方法官方的内置Callback官方进度条简单的猜测与简单的验证拼图凑齐了&#xff01; 导读 在训练模型的过程中往往会有日志一堆一堆的困扰。我并不想知道&#xff0c;因为最后我会在…

C# Excel表列名称

168 Excel表列名称 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1&#xff1a; 输入&#xff1a;columnNumber 1 输出&#xff1a;“A”…

Unity与Android交互(4)——接入SDK

【前言】 unity接入Android SDK有两种方式&#xff0c;一种是把Unity的工程导出google project的形式进行接入&#xff0c;另一种是通过把Android的工程做成Plugins的形式进行接入。我们接入SDK基本都是将SDK作为插件的形式接入的。 对我们接入SDK的人来说&#xff0c;SDK也是…

一文了解PoseiSwap的质押系统

PoseiSwap 正在向订单簿 DEX 领域深度的布局&#xff0c;并有望成为订单簿 DEX 领域的早期开创者。

jmeter发送请求的request body乱码问题解决

JMeter的Put请求&#xff0c;响应结果中文出现乱码的解决方法 原文地址&#xff1a; http://www.taodudu.cc/news/show-808374.html?actiononClick

【云原生丶Kubernetes】从应用部署的发展看Kubernetes的前世今生

在了解Kubernetes之前&#xff0c;我们十分有必要先了解一下应用程序部署的发展历程&#xff0c;下面让我们一起来看看&#xff01; 应用部署的发展历程 我们先来看看应用程序部署的3个阶段&#xff1a;从物理机部署到虚拟机部署&#xff0c;再到容器化部署&#xff0c;他们之…

Jenkins服务器连接JMeter分布式中的test-master

Jenkins想要连接test-master就要通过代理 将下载好的agent.jar传输到test-master机器上的/usr/local&#xff08;实际上任何目录都可以&#xff09;下 然后我们在/usr/local目录下输入&#xff1a; &#xff08;这个是在Jenkins页面自己生成的命令&#xff09; java -jar ag…