当前位置: 首页 > news >正文

《Pytorch深度学习实践》ch2-梯度下降算法

                                                       ------B站《刘二大人》

1.Gradient Decent

  • 局部最优,全局最优,非凸函数:

  • 梯度下降算法公式:

2.Implementation

import matplotlib.pyplot as plt# 数据集
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]# 权重
w = 1.0# 模型
def forward(x): return x * w# 损失函数
def cost(xs, ys):cost = 0for x, y in zip(xs, ys):y_pred = forward(x)cost += (y_pred - y) ** 2return cost / len(xs) # 梯度下降
def gradient(xs, ys):grad = 0for x, y in zip(xs, ys):y_pred = forward(x)grad += 2 * x * (y_pred - y)return grad / len(xs)# 训练轮数 epoch 为横坐标,损失 Cost 为纵坐标
epoch_list = []
cost_list = []print('Predict (before training)', 4, forward(4))for epoch in range(100):cost_val = cost(x_data , y_data)grad_val = gradient(x_data,y_data)w -= 0.01 * grad_val # 0.01 为学习率epoch_list.append(epoch)cost_list.append(cost_val)print('Epoch:', epoch, 'w=', w, 'cost=', cost_val)print('Predict (after training)', 4, forward(4))# 绘图
plt.plot(epoch_list, cost_list)
plt.xlabel('epoch')
plt.ylabel('cost')
plt.grid()
plt.show
  • 迭代如下: 
  • 绘制图形如下:

3.Discussion

  • 如何让曲线变得更平滑:“加权”;
  • 如果曲线最终没有趋于收敛:常见原因是 a 太大 ;

4. Stochastic Gradient Decent

  • 相比于GD,SGD(随机梯度下降):每次随机选择一个样本,优势在于有可能跨过局部最优,并且曲线也更加平滑;

  • 代码修改如下:
import matplotlib.pyplot as plt# 数据集
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]# 权重
w = 1.0# 模型
def forward(x): return x * w# 损失函数
def loss(x, y):y_pred = forward(x)return (y_pred - y) * (y_pred - y)# 梯度下降
def gradient(x, y):y_pred = forward(x)return 2 * x * (y_pred - y)# 训练轮数 epoch 为横坐标,损失 loss 为纵坐标
epoch_list = []
loss_list = []print('Predict (before training)', 4, forward(4))for epoch in range(100):for x, y in zip(x_data, y_data):loss_val = loss(x , y)grad_val = gradient(x,y)w -= 0.01 * grad_val # 0.01 为学习率epoch_list.append(epoch)loss_list.append(loss_val)print('Epoch:', epoch, 'w=', w, 'loss=', loss_val)print('Predict (after training)', 4, forward(4))# 绘图
plt.plot(epoch_list, loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.grid()
plt.show
  •  迭代如下: 

  • 绘制图形如下:

5.Comparison

  • 随机梯度算法虽然性能更好,但是时间复杂度高,于是取折中:Batch;

http://www.xdnf.cn/news/758143.html

相关文章:

  • 设计模式——状态设计模式(行为型)
  • 设计模式——代理设计模式(结构型)
  • android stdio 的布局属性
  • 鸿蒙ArkTS | Badge 信息标记组件自学指南
  • MyBatis03——SpringBoot整合MyBatis
  • Kubernetes(K8s)核心架构解析与实用命令大全
  • Go 语言 select 语句详解
  • JMeter 性能测试
  • DDR5 ECC详细原理介绍与基于协议讲解
  • 3D Gaussian splatting 05: 代码阅读-训练整体流程
  • 【计算机网络】第3章:传输层—面向连接的传输:TCP
  • Spring Boot中Excel处理完全指南:从基础到高级实践
  • telnet 基本用法
  • Java并发编程中任务调度与线程池的配置优化
  • 大规模真实场景 WiFi 感知基准数据集
  • SSL/TLS 协议详解:安全通信的基石
  • C++修炼:位图和布隆过滤器
  • 布隆筛选详解
  • Ansible自动化运维工具全面指南:从安装到实战应用
  • 【Go语言生态】
  • Vue初始化脚手架
  • 数据库,Spring Boot,数据源
  • 第13讲、Odoo 18 配置文件(odoo.conf)详细解读
  • 6.1 英语复习笔记 3
  • 如何利用大语言模型生成特定格式文风的报告类文章
  • Redis分布式锁实现指南
  • 《P3959 [NOIP 2017 提高组] 宝藏》
  • 继承与多态
  • 篇章七 数据结构——栈和队列
  • 查看make命令执行后涉及的预编译宏定义的值