LSTM 是一种特殊的循环神经网络(RNN),旨在解决 RNN 的梯度消失与梯度爆炸问题。它通过引入“门控机制”,能够在时间序列中记住长时间的依赖关系,同时避免对无关信息的记忆。
LSTM 单元的核心在于一个“细胞状态” (),它能够通过线性传递保留重要信息。此外,LSTM 包括三个门控单元:遗忘门、输入门和输出门,用于控制信息的流动。
1. 遗忘门(Forget Gate)
决定细胞状态中哪些信息需要被遗忘:
其中:
2. 输入门(Input Gate)
决定当前输入对细胞状态的更新:
细胞状态更新为:
3. 输出门(Output Gate)
决定细胞状态对隐藏状态的输出:
隐藏状态更新为:
LSTM 单元将时间序列信息通过多步迭代逐步传递,从而捕获序列的长期依赖。
CNN 的核心是卷积操作,用于提取输入数据的局部特征。在一维卷积中,卷积核沿时间轴滑动,对局部时间片段进行加权和。
卷积操作的公式为:
其中:
为了引入非线性,卷积层的输出通常经过激活函数,如 ReLU:
池化操作用于下采样特征图,减少计算复杂度,同时保留主要信息。常用池化方法有最大池化和平均池化。
最大池化公式:
其中 是池化窗口的大小。
LSTM 与 CNN 联合模型在多变量时间序列预测中的特殊注意项。
在多变量时间序列预测中,联合模型需要处理不同变量之间的相互关系,同时捕获时间序列的短期模式和长期依赖。
CNN 部分:
LSTM 部分:
联合方式:
滑动窗口大小:决定 CNN 的输入序列长度,影响模型对短期和长期模式的捕获。
卷积核大小:较小的卷积核捕获细粒度模式,较大的卷积核捕获粗粒度模式。
优化器与学习率:Adam 是较常用的优化器,但需根据模型表现动态调整学习率。
批量训练:将时间序列划分为小批量训练,防止内存溢出。
损失函数:
对于回归任务,使用均方误差(MSE):
对于分类任务,使用交叉熵损失。
回归指标:
均方根误差(RMSE):
平均绝对误差(MAE):
分类指标:准确率(Accuracy)、F1-score 等。
通过 LSTM 与 CNN 联合模型,可以充分利用 CNN 提取的局部时间特征和 LSTM 的时间依赖建模能力,从而实现对复杂时间序列的高精度预测。
LSTM与CNN联合模型在多变量时间序列预测。
数据集设计:
假设虚拟数据集包含以下特征:
温度
(Temperature)湿度
(Humidity)风速
(Wind Speed) 目标是预测未来1小时的温度
。生成1000条时间序列,分为训练集(80%)和测试集(20%)。
import numpy as np
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
# 数据生成
np.random.seed(42)
time_steps = 1000
temperature = np.sin(np.linspace(0, 100, time_steps)) + np.random.normal(scale=0.1, size=time_steps)
humidity = np.cos(np.linspace(0, 100, time_steps)) + np.random.normal(scale=0.1, size=time_steps)
wind_speed = np.random.normal(scale=0.5, size=time_steps)
data = np.vstack([temperature, humidity, wind_speed]).T
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
# 数据分割
def create_dataset(data, window_size):
X, y = [], []
for i in range(len(data) - window_size):
X.append(data[i:i + window_size, :])
y.append(data[i + window_size, 0]) # 预测温度
return np.array(X), np.array(y)
window_size = 10
X, y = create_dataset(data_scaled, window_size)
X_train, X_test = X[:800], X[800:]
y_train, y_test = y[:800], y[800:]
# 转换为Tensor
X_train, y_train = torch.tensor(X_train, dtype=torch.float32), torch.tensor(y_train, dtype=torch.float32)
X_test, y_test = torch.tensor(X_test, dtype=torch.float32), torch.tensor(y_test, dtype=torch.float32)
# 模型定义
class CNN_LSTM(nn.Module):
def __init__(self):
super(CNN_LSTM, self).__init__()
self.cnn = nn.Conv1d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
self.lstm = nn.LSTM(input_size=16, hidden_size=32, batch_first=True)
self.fc = nn.Linear(32, 1)
def forward(self, x):
x = x.permute(0, 2, 1) # 转换为CNN的输入格式 (batch, channels, time)
x = self.cnn(x)
x = x.permute(0, 2, 1) # 转换为LSTM的输入格式
x, _ = self.lstm(x)
x = self.fc(x[:, -1, :]) # 只取最后时间步的输出
return x
# 模型实例化
model = CNN_LSTM()
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 模型训练
num_epochs = 50
train_loss_history = []
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
output = model(X_train)
loss = criterion(output.squeeze(), y_train)
loss.backward()
optimizer.step()
train_loss_history.append(loss.item())
if (epoch + 1) % 10 == 0:
print(f"Epoch {epoch + 1}, Loss: {loss.item():.4f}")
# 测试集预测
model.eval()
with torch.no_grad():
predictions = model(X_test).squeeze()
# 结果可视化
plt.figure(figsize=(14, 6))
# 图1: 训练损失
plt.subplot(2, 2, 1)
plt.plot(train_loss_history, label='Training Loss', color='blue')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Training Loss Over Epochs')
plt.legend()
# 图2: 真实值与预测值对比
plt.subplot(2, 2, 2)
plt.plot(y_test, label='True Values', color='green')
plt.plot(predictions, label='Predictions', color='red')
plt.xlabel('Time Steps')
plt.ylabel('Temperature')
plt.title('True vs Predicted Temperatures')
plt.legend()
# 图3: 预测误差
plt.subplot(2, 2, 3)
errors = predictions - y_test
plt.hist(errors.numpy(), bins=20, color='purple')
plt.xlabel('Prediction Error')
plt.ylabel('Frequency')
plt.title('Prediction Error Distribution')
# 图4: 滑动窗口效果
plt.subplot(2, 2, 4)
plt.plot(data_scaled[:50, 0], label='Temperature (Scaled)', color='cyan')
plt.axvline(x=window_size, linestyle='--', color='grey', label='Prediction Start')
plt.xlabel('Time Steps')
plt.ylabel('Scaled Temperature')
plt.title('Sliding Window Representation')
plt.legend()
plt.tight_layout()
plt.show()
1. 模型架构:增加CNN层的数量以提取更多细粒度特征。尝试双向LSTM以增强时间信息。
2. 调参流程:
3. 特征工程:
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
保证100%免费
】