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

【深度学习】03-神经网络3-1梯度下降网络优化方法

每一条线是一个权重,每个神经元由一个加权和还有一个 激活函数组成。每一层可以理解是一个函数,最终形成一个复合函数,因此求梯度的时候,是一层一层的求解,所以叫做反向传播。

  

只会考虑当前数据之前的数据,之后的数据就不考虑了。

import torch
import matplotlib.pyplot as plt
ELEMENT_NUMBER = 30
# 1. 实际平均温度 def test01():
# 固定随机数种子
torch.manual_seed(0)
# 产生30天的随机温度
temperature = torch.randn(size=[ELEMENT_NUMBER,]) * 10 
print(temperature)
# 绘制平均温度
days = torch.arange(1, ELEMENT_NUMBER + 1, 1) 
plt.plot(days, temperature, color='r') 
plt.scatter(days, temperature)
plt.show()

# 2. 指数加权平均温度 def test02(beta=0.9):
torch.manual_seed(0) # 固定随机数种子
temperature = torch.randn(size=[ELEMENT_NUMBER,]) * 10 # 产生30天的随机温度
exp_weight_avg = []
for idx, temp in enumerate(temperature, 1): # 从下标1开始
    # 第一个元素的的 EWA 值等于自身 if idx == 1:
    exp_weight_avg.append(temp)
    continue
    # 第二个元素的 EWA 值等于上一个 EWA 乘以 β + 当前气温乘以 (1-β) new_temp = exp_weight_avg[idx - 2] * beta + (1 - beta) * temp exp_weight_avg.append(new_temp)
    days = torch.arange(1, ELEMENT_NUMBER + 1, 1) 
plt.plot(days, exp_weight_avg, color='r') 
plt.scatter(days, temperature)
plt.show()

什么是指数加权平均?

指数加权平均(Exponentially Weighted Moving Average, EWMA)是一种对时间序列数据进行平滑的技术,强调新数据的重要性,同时不完全忽略旧数据。它在时间序列分析中常用于减少数据中的短期波动,突出长期趋势。

指数加权平均背后的思想是,对数据的权重按指数衰减,越新的数据权重越大,越老的数据权重越小。相比简单的移动平均,指数加权平均能够更快响应新的数据变化,同时保留历史数据的信息。

背景

在数据分析或时间序列处理时,经常遇到噪声或短期波动的问题。为了避免这些问题干扰对趋势的判断,平滑技术(如移动平均)被广泛应用。传统的简单移动平均法对所有时间点的数据赋予相同的权重,而这并不总是合理的,因为新数据可能比旧数据更重要。因此,指数加权平均诞生了,它通过加权的方法,赋予新数据更大的权重,从而更准确地捕捉趋势。

作用

  1. 平滑数据:通过减少噪声和短期波动,帮助观察数据的长期趋势。

  2. 预测趋势:常用于金融市场和物理系统中的趋势预测,比如股票价格的预测。

  3. 动态信号处理:适用于信号处理、数据流分析等场景,尤其是需要快速响应新数据的场合。

  4. 机器学习优化:在优化算法中,如动量梯度下降算法(Momentum SGD),指数加权平均用来平滑梯度的变化,防止过度振荡。

计算过程

指数加权平均的核心公式为:[ S_t = \beta S_{t-1} + (1 - \beta) x_t ]

其中:

  • ( S_t ) 是第 ( t ) 时刻的指数加权平均值。

  • ( S_{t-1} ) 是上一时刻的指数加权平均值。

  • ( x_t ) 是第 ( t ) 时刻的原始数据值。

  • ( \beta ) 是平滑参数,范围在 ( [0, 1] ) 之间。它决定了新数据与旧数据的权重比重。

参数解释:
  • ( \beta) 越大,历史数据的权重越高,平滑效果越强,响应新数据的速度越慢。相当于对过去的变化保留更多信息。

  • ( \beta ) 越小,新数据的权重越高,平滑效果越弱,但能更快反映当前数据的变化。

初始值:
  • 通常,指数加权平均的初始值可以取为第一个数据点,即 ( S_0 = x_0 ),从而保证整个序列有一个合理的初始平滑值。

示例代码讲解:
S= []
beta=.9
for idx,temp in enumerate(data):
 if idx==0:
   S.append(temp) # 初始化第一个平滑值
   continue
 # 使用公式 S_t = beta * S_{t-1} + (1 - beta) * x_t
 S.append(beta*S[idx-1]+(1-beta)*temp)

plt.plot(range(30),S) # 绘制平滑后的曲线
plt.scatter(range(len(data)),data) # 绘制原始数据点
plt.grid()
plt.show()

​​​​​​​

  • data 是你的原始时间序列数据。

  • beta = 0.9 意味着历史数据占比 90%,而新数据占比 10%。

  • 初始时,平滑值是 S.append(temp),即第一个数据点作为起始点。

  • 接下来,每一个新时刻的平滑值 ( S_t ) 都是依据上一时刻的平滑值和当前时刻的数据按加权公式计算出来的。

指数加权平均的逐步演变:
  1. 初始时刻:直接取第一个数据点作为平滑值。

  2. 后续时刻:当前的平滑值由上一时刻的平滑值和当前数据按加权比例决定。

    • 例如,假设 ( \beta = 0.9 ),每次新数据 ( x_t) 的影响是 10%,上一时刻的影响是 90%。

举例:

假设有以下数据序列:

data = [2, 4, 6, 8, 10]

如果我们使用 ( \beta = 0.9 ) 来计算指数加权平均,初始时:

  • ( S_0 = 2 )

  • ( S_1 = 0.9 \times 2 + 0.1 \times 4 = 2.2 )

  • ( S_2 = 0.9 \times 2.2 + 0.1 \times 6 = 2.58 )

  • ( S_3 = 0.9 \times 2.58 + 0.1 \times 8 = 3.122 )

如此类推,可以看到每个时刻的平滑值。

小结

指数加权平均通过赋予新数据更多权重,有效解决了传统简单移动平均中对新数据反应不敏感的问题。它广泛应用于时间序列分析、金融市场预测、信号处理和机器学习优化中。

不要使用 pytorch 中的,adam ,因为有问题。可以调用其他的包。


http://www.kler.cn/a/317216.html

相关文章:

  • 前端常用布局模板39套,纯CSS实现布局
  • WebRTC API分析
  • unity基础,点乘叉乘。
  • R语言机器学习与临床预测模型77--机器学习预测常用R语言包
  • Android 配置默认输入法
  • 科技云报到:数字化转型,从不确定性到确定性的关键路径
  • 2024年信息安全企业CRM选型与应用研究报告
  • 『功能项目』3D模型动态UI显示【76】
  • MovieLife 电影生活
  • 彻底删除国际版OneDrive for Business上的数据
  • 责任链模式实现规则校验
  • 智慧交通,智能消防系统助力高铁站安全
  • Anaconda 安装
  • Directives Vue3 自定义指令
  • 平衡二叉树(AVL树):原理、常见算法及其应用
  • cccccccccccc
  • Qt_布局管理器
  • 【漏洞复现】HIKVISION 视频编码设备接入网关 showFile.php 任意文件下载漏洞
  • tomcat 配置jenkins_home 目录
  • 动态时间【JavaScript】
  • 使用【Sa-Token】实现Http Basic 认证
  • 输电线塔目标检测数据集yolo格式该数据集包括2644张输电线塔高清图像,该数据集已经过yolo格式标注,具有完整的txt标注文件和yaml配置文件。
  • 论文阅读--Planning-oriented Autonomous Driving(二)
  • C++堆(优先队列)priority_queue
  • 删除topic提示admin token
  • The NCCoE’s Automation of the CMVP