Pytorch深度学习笔记(四)梯度向下算法

news2024/11/22 19:03:37

课程推荐:03.梯度下降算法_哔哩哔哩_bilibili

优化问题:求误差值函数最小的权重w

 (1)梯度向下算法思想

在绝大多数的情况下,损失函数是很复杂的(比如逻辑回归),根本无法得到参数估计值的表达式。因此需要一种对大多数函数都适用的方法。这就引出了“梯度算法”。首先,梯度下降(Gradient Descent, GD),不是一个机器学习算法,而是一种基于搜索的最优化方法。梯度下降法通过导数告诉我们此时此刻某参数应该朝什么方向,以怎样的速度运动,能安全高效降低损失值,朝最小损失值靠拢

(2)模型公式

更新\omega公式:

                                                                    

注意:  \omega=\omega-\alpha\frac{\partial cost}{\partial \omega }

                                                  

\frac{\partial cost}{\partial \omega }=\frac{\partial cost}{\partial \omega }为误差值函数的导数,也称梯度。\alpha为学习率 ,学习率为随机参数,尽量取较小的值。\omega为权重 。

(3)代码实现

import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

# w初值猜测
w = 1.0

# 预测值函数
def forward(x):
    return x * w

# 求平均误差值
def cost(xs,ys):
    cost = 0
    for x, y in zip(xs, ys):
        # 求预测值
        y_pred = forward(x)
        # 求总误差值
        cost += (y_pred - y) ** 2
        return cost / len(xs)

# 平均导数值函数,也称梯度值函数
def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
        # 求梯度值
    return grad / len(xs)

epoch_list = []
cost_list = []

print("训练之前的预测值", 4, forward(4))
# 100轮的训练
for epoch in range(100):
    cost_val = cost(x_data, y_data)
    grad_val = gradient(x_data, y_data)
    # 更新w。0.01为学习率,Epoch为训练一次过程
    w -= 0.01 * grad_val
    print('Epoch=', epoch, 'w=', w, 'cost=', cost_val)
    # epoch,cost列表
    epoch_list.append(epoch)
    cost_list.append(cost_val)
print("训练之前的预测值", 4, forward(4))

plt.plot(epoch_list,cost_list)
plt.ylabel('cost')
plt.xlabel('epoch')
plt.show()

(4) 优化算法:指数加权均值

指数加权均值(exponentially weighted averges)也叫指数加权移动平均,通过它可以来计算局部的平均值,来描述数值的变化趋势。可以使损失曲线变得更加平滑

 算法公式: c_{i}'=\beta c_{i}+\left ( 1-\beta \right )c_{i-1}'

c_{i}为优化前的损失值,c_{i}'优化后的损失值,\beta为某个权重。

(5)随机梯度下降

随机梯度下降:每一次更新只采用一个样本来计算梯度,并根据梯度对进行更新。因此可知,对于凸优化问题,每一次更新不能保证是朝着全局最优点前进,但是总体的方法仍然是朝着全局最优的方向前进。相对于批量梯度下降,这种方法单次更新时间更快、存储要求小,且非常适合于增量式更新(假设新的样本源源不断的加入)。对于非凸最优化问题,这种方法通常能够更快的收敛到一个局部最优解。

 随机梯度下降: \omega=\omega\alpha\frac{\partial loss}{\partial \omega },更新w的公式每次减去的值由整体样本的梯度变为随机一个样本的梯度。

 代码实现:

import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

# w初值猜测
w = 1.0

# 预测值函数
def forward(x):
    return x * w

# 求误差值
def loss(x,y):
    y_pred = forward(x)
    loss = (y_pred - y) ** 2
    return loss

# 随机梯度值函数
def gradient(x, y):
    # 求梯度值
    return 2 * x * (x * w - y)

epoch_list = []
loss_list = []

print("训练之前的预测值", 4, forward(4))
# 100轮的训练
for epoch in range(100):
    for x,y in zip(x_data,y_data):
        # (1)获取梯度
        grad = gradient(x, y)
        # (2)更新权重w
        w = w - 0.01*grad
        print("\tgrad", x, y, grad)
        # (3)获取误差值
        l = loss(x, y)
        # loss,epoch列表
        loss_list.append(l)
        epoch_list.append(epoch)
    print("progress:", epoch,"w=", w, l)

print("训练之前的预测值", 4, forward(4))

plt.plot(epoch_list,loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

注意:局部最优与鞍点问题,鞍点:梯度为0的点 

非凸函数

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

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

相关文章

从输入url到页面展现(三)通过DNS将域名解析为IP地址以及dns-prefetch的好处

前言 上一节我们用直白的话讲了一下浏览器解析url,而浏览器并不具备发送网络消息的能力,所以委托操作系统发送,而这里的第一步,就是去找到对应web服务器的ip地址,并且对互联网和小子网有了一个认识。 这一节呢说一下我…

换个角度使用Redis去解决跨域存取Session问题

系列文章目录 Redis缓存穿透、击穿、雪崩问题及解决方法 Spring Cache的使用–快速上手篇 分页查询–Java项目实战篇 全局异常处理–Java实战项目篇 该系列文章持续更新,更多的文章请点击我的主页查看哦! 文章目录 系列文章目录前言一、遇到的情况二、解…

golang 云效私有模块依赖拉取配置

相关文档 阿里官方文档 go 环境变量配置 export GOPRIVATEcodeup.aliyun.com 凭证设置 非常找重要,https密码配置克隆账户和克隆密码后续会用到 在 可以在 netrc 文件中指定凭据 Linux\MacOS 文件应该存放在执行账户的根目录下,即:~/.netrc sudo v…

SAS 9.3软件安装包下载及安装教程 办公软件

SAS 9.3软件简介: SAS 9.3是目前行业软件中的一款专业的数据统计分析软件,其核心功能包括高级分析、商业智能、客户智能、数据管理、风险管理和欺诈与安全智能六大模块,通过sas软件提供创新的分析、商业智能和数据管理软件与服务&#xff0c…

3Dsmax丨3dsmax2016软件下载安装教程 含全版本软件详细安装流程

大家好~随着计算机技术的发展,3D建模在各个行业中被广泛应用。以游戏行业为例,通过3D建模模型制作、灯光制作、材质渲染、细节润色、渲染合成等能够制作出游戏原神、王者荣耀、和平精英、英雄联盟、明日之后、光遇、哈利波特、剑网3、我的世界、第五人格…

SQL——关于bjpowernode.sql的33道经典例题之1-17

目录 1 查询每个部门最高薪水的人员名称 2 查询哪些人的薪水在部门平均薪水之上 3 查询每个部门的平均薪水等级 3.1 每个部门的平均薪水的等级 3.2 每个部门的平均的薪水等级 4 查询最高薪水(不用max函数) 5 查询平均薪水最高的部门的部门编号 …

如何使用 GPT-4 为博客目录页打造炫酷前端效果

前不久我用 cmd markdown 写了篇文章《项目 TO 的自我修养》,文章的目录如下: 当我把它发布到线上后,目录却只展示出了二级标题: 这哪行!我猜这个可能就是加个配置啥的就能修复。于是马上就问 GPT-4 怎么办&#xff1f…

25.SSM-SpringMVC延续--拦截器与异常处理思想

目录 一、拦截器。 (1)拦截器的作用。 (2)拦截器与过滤器的区别。 (3)拦截器的方法。 (4)拦截器的快速入门。 (5)多拦截器。 (5.1&#xf…

哈工大软件构造-设计模式笔记

文章目录 UML简单知识1.单例模式2.工厂方法模式3.迭代器模式4.策略模式5.建造者模式6.模板方法模式7.代理模式8.责任链模式9.抽象工厂模式10.适配器模式11.观…

计算机操作系统复习记录(总结 —— 快速入门和快速复习)

1. 操作系统 概念:是控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其它软件接口和环境,它是计算机系统中最基本的系统软件。 功能和目标: (1&…

数据库同步 Elasticsearch 后数据不一致,怎么办?

1、实战线上问题 Q1:Logstash 同步 postgreSQL 到 Elasticsearch 数据不一致。 在使用 Logstash 从 pg 库中将一张表导入到 ES 中时,发现 ES 中的数据量和 PG 库中的这张表的数据量存在较大差距。如何快速比对哪些数据没有插入?导入过程中&am…

六:内存回收

内存回收: 应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。 当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存&…

系统安全及应用

目录 一、账号安全控制 1)系统账号清理 2)密码安全控制 chage命令 示例 3)命令历史限制 4)终端自动注销 总结 账号安全 密码安全 二、系统引导和登录控制 1)使用su命令切换用户 用途及用…

【学习笔记】字节数据和字节字符串(b“ “)那些事

文章目录 0 前言1 先来看看C语言中怎么处理这种字节数据1.1 使用总结 2 再来看看Python当中是怎么处理字节数据的 0 前言 最近在尝试用PyQt做一个上位机,遇到很多关于字节字符串的问题,这里简单总结几个关键点。 1 先来看看C语言中怎么处理这种字节数据…

RK3568平台开发系列讲解(Linux系统篇)共享内存的创建和映射过程

🚀返回专栏总目录 文章目录 一、共享内存的创建和映射过程流程梳理二、如何创建共享内存?三、如何将共享内存映射到虚拟地址空间?沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起学习下共享内存的创建和映射过程。 一、共享内存的创建和映射过程流程梳…

推荐5款重度电脑用户也未必知道的小众软件

作为一个重度电脑用户,你可能会经常使用一些软件来完成各种任务和娱乐。但是你知道有哪些好用的WIN10软件吗?今天我就为你介绍一下我推荐的五款WIN10软件,它们分别是: 1.反恶意软件——Malwarebytes Malwarebytes是一款专业的反…

AOP与SpringBoot使用AOP实例

AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实就是面向特定方法编程。 动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过…

浅谈thrift协议+举例通用mockserver如何实现

目录 简单来说: 举个例子: 简单来说: 1)是一个跨平台跨语言的通信协议,定义和创建跨语言服务,是一个高性能、轻量级RPC框架。 2)开发者无需关注不同语言/相同语言服务间如何通信,…

基于html+css的图片展示15

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

什么是Python?

目录 Python简介 Python发展史 Python优点与缺点 Python现如今的应用领域 总结 Python简介 Python是一种高级、解释型、面向对象的动态编程语言,由Guido van Rossum在1989年创建,首次发布于1991年。 Python设计的哲学是优雅、清晰、简单&#xff0c…