【深度学习】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)是一种对时间序列数据进行平滑的技术,强调新数据的重要性,同时不完全忽略旧数据。它在时间序列分析中常用于减少数据中的短期波动,突出长期趋势。
指数加权平均背后的思想是,对数据的权重按指数衰减,越新的数据权重越大,越老的数据权重越小。相比简单的移动平均,指数加权平均能够更快响应新的数据变化,同时保留历史数据的信息。
背景
在数据分析或时间序列处理时,经常遇到噪声或短期波动的问题。为了避免这些问题干扰对趋势的判断,平滑技术(如移动平均)被广泛应用。传统的简单移动平均法对所有时间点的数据赋予相同的权重,而这并不总是合理的,因为新数据可能比旧数据更重要。因此,指数加权平均诞生了,它通过加权的方法,赋予新数据更大的权重,从而更准确地捕捉趋势。
作用
-
平滑数据:通过减少噪声和短期波动,帮助观察数据的长期趋势。
-
预测趋势:常用于金融市场和物理系统中的趋势预测,比如股票价格的预测。
-
动态信号处理:适用于信号处理、数据流分析等场景,尤其是需要快速响应新数据的场合。
-
机器学习优化:在优化算法中,如动量梯度下降算法(Momentum SGD),指数加权平均用来平滑梯度的变化,防止过度振荡。
计算过程
指数加权平均的核心公式为:
其中:
-
( ) 是第 ( t ) 时刻的指数加权平均值。
-
( ) 是上一时刻的指数加权平均值。
-
( ) 是第 ( t ) 时刻的原始数据值。
-
( ) 是平滑参数,范围在 ( [0, 1] ) 之间。它决定了新数据与旧数据的权重比重。
参数解释:
-
( ) 越大,历史数据的权重越高,平滑效果越强,响应新数据的速度越慢。相当于对过去的变化保留更多信息。
-
( ) 越小,新数据的权重越高,平滑效果越弱,但能更快反映当前数据的变化。
初始值:
-
通常,指数加权平均的初始值可以取为第一个数据点,即 ( ),从而保证整个序列有一个合理的初始平滑值。
示例代码讲解:
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)
,即第一个数据点作为起始点。 -
接下来,每一个新时刻的平滑值 ( ) 都是依据上一时刻的平滑值和当前时刻的数据按加权公式计算出来的。
指数加权平均的逐步演变:
-
初始时刻:直接取第一个数据点作为平滑值。
-
后续时刻:当前的平滑值由上一时刻的平滑值和当前数据按加权比例决定。
-
例如,假设 ( ),每次新数据 ( ) 的影响是 10%,上一时刻的影响是 90%。
-
举例:
假设有以下数据序列:
data = [2, 4, 6, 8, 10]
如果我们使用 ( ) 来计算指数加权平均,初始时:
如此类推,可以看到每个时刻的平滑值。
小结
指数加权平均通过赋予新数据更多权重,有效解决了传统简单移动平均中对新数据反应不敏感的问题。它广泛应用于时间序列分析、金融市场预测、信号处理和机器学习优化中。
不要使用 pytorch 中的,adam ,因为有问题。可以调用其他的包。