Cogito-V1-Preview-Llama-3B LSTM时间序列预测模型原理与代码实现详解
Cogito-V1-Preview-Llama-3B LSTM时间序列预测模型原理与代码实现详解1. 引言时间序列预测简单来说就是根据过去的数据猜一猜未来会发生什么。这事儿听起来挺玄乎但其实我们每天都在做。比如看看天气预报就是基于过去的气象数据来预测明天的天气看看股票走势图也是想从过去的波动里找到未来的蛛丝马迹。传统的统计方法像ARIMA在处理这类问题上已经很有年头了。但有时候数据之间的关系特别复杂不是简单的线性规律能说清楚的。这时候深度学习模型特别是长短期记忆网络就派上了大用场。你可能听说过循环神经网络它擅长处理序列数据比如文本、语音。但RNN有个“健忘症”的毛病对于很长的序列它容易忘记很早之前的信息。LSTM就是为了解决这个问题而生的它内部有个精巧的“记忆单元”能选择性地记住重要的信息忘掉不重要的就像一个自带记事本和橡皮擦的聪明大脑。今天我们就借助Cogito-V1-Preview-Llama-3B模型的讲解和代码生成能力来把LSTM这个“黑盒子”彻底拆开看看。我们会从最基础的原理讲起用大白话和图示帮你理解它到底是怎么工作的然后手把手带你用代码实现一个股票价格预测的案例。整个过程就像搭积木一样从理解每一块积木的作用到最终搭建出一个能工作的模型。2. LSTM一个会“选择性记忆”的神经网络2.1 从RNN的“健忘症”说起要理解LSTM我们先看看它的前身——循环神经网络。你可以把RNN想象成一个非常专注但记性不太好的人。他每次只处理当前的信息并且会把处理后的结果一种“记忆”传递给下一个时刻的自己。问题就出在这个“记忆”上。当序列很长时比如一段几百字的文章信息在传递过程中会不断被稀释、变形。到了后面RNN可能已经完全忘记了文章开头讲了什么。这种现象在技术上被称为“梯度消失”或“梯度爆炸”导致RNN难以学习到长距离的依赖关系。2.2 LSTM的“记忆细胞”核心设计LSTM的发明者很聪明他们给RNN加了一个叫做“细胞状态”的东西。你可以把它想象成一条传送带它贯穿整个时间线。信息可以在这条传送带上平稳地流动几乎不受干扰。LSTM的关键在于它有三个特殊的“门”来控制这条传送带遗忘门决定细胞状态中哪些旧信息应该被扔掉。它查看当前的输入和上一时刻的隐藏状态输出一个0到1之间的数给细胞状态的每个部分。0代表“完全忘记”1代表“完全保留”。输入门决定哪些新信息应该被存放到细胞状态里。它有两部分一部分是一个sigmoid层决定要更新哪些值另一部分是一个tanh层创建一个新的候选值向量这些值可能会被加入到细胞状态中。输出门基于当前的细胞状态决定最终要输出什么。首先用一个sigmoid层决定细胞状态的哪些部分将要被输出。然后让细胞状态通过tanh函数将其值压到-1和1之间再乘以sigmoid门的输出这样就得到了最终的隐藏状态输出。这三个门协同工作使得LSTM能够精细地控制信息的流动实现长期记忆。2.3 一张图看懂LSTM内部运作下面这张图清晰地展示了LSTM在一个时间步内的计算流程。跟着箭头走你就能明白数据是如何在遗忘门、输入门、细胞状态和输出门之间流转的。图示一个标准的LSTM单元结构图包含C_{t-1}上一时刻细胞状态、h_{t-1}上一时刻隐藏状态、x_t当前输入流向遗忘门f_t、输入门i_t和候选状态~C_t、输出门o_t最终得到C_t新细胞状态和h_t新隐藏状态。图中标明了sigmoid和tanh激活函数以及乘法和加法操作。简单来说h_{t-1}和x_t一起告诉三个门该怎么工作。遗忘门决定从旧记忆C_{t-1}中擦掉什么输入门决定把哪些新信息写进新记忆C_t输出门则决定从新记忆C_t中读出什么作为当前时刻的输出h_t。3. 为什么是LSTM对比看看就知道光说LSTM好可能不够直观。我们把它和另外两种常见的网络结构放在一起对比它的优势就一目了然了。特性对比前馈神经网络经典RNNLSTM数据理解独立看待每个数据点不考虑顺序。考虑数据的前后顺序有“记忆”概念。考虑顺序且有长期记忆能力。输入输出固定长度的输入产生固定长度的输出。可以处理变长序列输入输出长度灵活。可以处理变长序列输入输出长度灵活。记忆能力无记忆。处理当前输入与过去输入无关。短期记忆。对近期输入敏感长期依赖学习困难。长期记忆。通过门控机制能记住很久以前的关键信息。适用场景图像分类、房价预测等输入独立的场景。短文本情感分析、简单的时间序列预测。长文本理解、机器翻译、复杂时间序列预测如股票、天气。核心问题无法处理序列数据。梯度消失/爆炸难以学习长程依赖。结构相对复杂计算量稍大。打个比方前馈神经网络像是一个每次只回答一道独立选择题的考生。经典RNN像是一个在听故事但只能记住最后几句话的听众。LSTM则像是一个边听故事边做笔记的听众他能根据故事的重要性在笔记上划重点、做摘要即使故事很长他也能抓住核心情节。对于股票价格预测这种任务今天的价格肯定和昨天、上周甚至上个月的趋势有关。LSTM这种“做笔记”的能力让它非常适合从历史数据中捕捉那些复杂的、长期的波动模式。4. 动手实战用PyTorch实现股票价格预测理论说得再多不如动手跑一遍代码来得实在。接下来我们就用PyTorch框架搭建一个LSTM模型来预测股票价格。我们假设要预测的是股价的“收盘价”。思路是用过去N天的股价一个序列作为输入来预测下一天的收盘价。4.1 环境准备与数据概览首先确保你安装了必要的库。我们将使用yfinance来获取真实的股票数据这样我们的实验更有实感。# 导入必要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import yfinance as yf import torch import torch.nn as nn from torch.utils.data import DataLoader, TensorDataset from sklearn.preprocessing import MinMaxScaler # 设置随机种子保证结果可复现 torch.manual_seed(42) np.random.seed(42) # 获取股票数据 - 这里以苹果公司为例 ticker AAPL start_date 2015-01-01 end_date 2023-12-31 stock_data yf.download(ticker, startstart_date, endend_date) # 我们只关心‘Close’价格 prices stock_data[Close].values.reshape(-1, 1) # 看看数据长什么样 print(f数据形状: {prices.shape}) print(f前5天收盘价: {prices[:5].flatten()}) plt.figure(figsize(12, 6)) plt.plot(prices, labelf{ticker} Close Price) plt.title(Stock Price Over Time) plt.xlabel(Days) plt.ylabel(Price (USD)) plt.legend() plt.show()运行这段代码你会看到苹果公司股价从2015年到2023年的走势图。我们的任务就是让模型学会这条曲线的规律。4.2 数据预处理让模型更好学原始股价数字很大而且一直在增长这不利于模型训练。我们通常需要将数据“归一化”到一个小范围内比如0到1之间。同时要把数据组织成模型喜欢的“序列-标签”对。# 1. 归一化数据 scaler MinMaxScaler(feature_range(0, 1)) scaled_prices scaler.fit_transform(prices) # 2. 创建序列数据集 # 例如用过去60天的数据预测第61天 sequence_length 60 X, y [], [] for i in range(sequence_length, len(scaled_prices)): X.append(scaled_prices[i-sequence_length:i, 0]) # 过去60天的序列 y.append(scaled_prices[i, 0]) # 第61天的价格 X, y np.array(X), np.array(y) # 3. 划分训练集和测试集 (80%训练20%测试) split_idx int(len(X) * 0.8) X_train, X_test X[:split_idx], X[split_idx:] y_train, y_test y[:split_idx], y[split_idx:] # 4. 转换为PyTorch张量并调整形状为 [样本数, 序列长度, 特征数] X_train torch.FloatTensor(X_train).unsqueeze(-1) # 形状: [样本数, 60, 1] y_train torch.FloatTensor(y_train).unsqueeze(-1) X_test torch.FloatTensor(X_test).unsqueeze(-1) y_test torch.FloatTensor(y_test).unsqueeze(-1) print(f训练集形状: X_train {X_train.shape}, y_train {y_train.shape}) print(f测试集形状: X_test {X_test.shape}, y_test {y_test.shape})4.3 构建LSTM模型现在我们来定义模型的核心。PyTorch让这件事变得非常简单。class LSTMModel(nn.Module): def __init__(self, input_size1, hidden_layer_size50, output_size1): super().__init__() self.hidden_layer_size hidden_layer_size # 定义LSTM层 # batch_firstTrue 表示输入张量的第一个维度是batch_size self.lstm nn.LSTM(input_size, hidden_layer_size, batch_firstTrue) # 定义全连接输出层 self.linear nn.Linear(hidden_layer_size, output_size) def forward(self, input_seq): # LSTM层输出lstm_out 包含了每个时间步的隐藏状态 # hidden 和 cell 是最后一个时间步的隐藏状态和细胞状态 lstm_out, (hidden, cell) self.lstm(input_seq) # 我们通常只取最后一个时间步的隐藏状态来预测下一个值 predictions self.linear(lstm_out[:, -1, :]) # 取序列最后一个时间步的输出 return predictions # 初始化模型 model LSTMModel(input_size1, hidden_layer_size50, output_size1) print(model)关键参数解释input_size1每个时间步输入的特征数。我们只用收盘价所以是1。如果你加入成交量、开盘价等这个数就要增加。hidden_layer_size50这是LSTM层中隐藏神经元的数量。你可以把它理解为模型的“记忆容量”。数字越大模型能记住和学习的模式越复杂但也更容易过拟合训练更慢。50是一个常用的起点。output_size1我们只预测下一个时间点的收盘价所以输出是1。4.4 训练模型让模型从数据中学习定义好模型和损失函数我们用均方误差因为它对预测数值任务很友好就可以开始训练了。# 定义损失函数和优化器 loss_function nn.MSELoss() optimizer torch.optim.Adam(model.parameters(), lr0.001) # Adam优化器学习率0.001 epochs 100 train_losses [] test_losses [] # 创建DataLoader方便批量训练 train_dataset TensorDataset(X_train, y_train) train_loader DataLoader(train_dataset, batch_size32, shuffleTrue) for epoch in range(epochs): model.train() # 设置为训练模式 epoch_train_loss 0 for batch_X, batch_y in train_loader: optimizer.zero_grad() # 清空梯度 y_pred model(batch_X) # 前向传播 loss loss_function(y_pred, batch_y) # 计算损失 loss.backward() # 反向传播计算梯度 optimizer.step() # 更新权重 epoch_train_loss loss.item() avg_train_loss epoch_train_loss / len(train_loader) train_losses.append(avg_train_loss) # 在测试集上评估 model.eval() # 设置为评估模式 with torch.no_grad(): test_pred model(X_test) test_loss loss_function(test_pred, y_test).item() test_losses.append(test_loss) if (epoch1) % 20 0: print(fEpoch [{epoch1}/{epochs}], Train Loss: {avg_train_loss:.6f}, Test Loss: {test_loss:.6f}) # 绘制训练过程中的损失变化 plt.figure(figsize(10,5)) plt.plot(train_losses, labelTraining Loss) plt.plot(test_losses, labelTesting Loss) plt.title(Model Loss During Training) plt.xlabel(Epoch) plt.ylabel(Loss) plt.legend() plt.show()观察损失曲线如果训练损失和测试损失都稳步下降并趋于平稳说明模型训练得不错。如果测试损失开始上升而训练损失还在下降那可能就是过拟合了。4.5 看看预测效果如何训练完成后我们把模型在测试集上的预测结果还原回原始的价格尺度并和真实价格画在一起对比。# 切换到评估模式进行预测 model.eval() with torch.no_grad(): train_predict model(X_train) test_predict model(X_test) # 将归一化的预测值反变换回原始价格尺度 train_predict scaler.inverse_transform(train_predict.numpy()) y_train_actual scaler.inverse_transform(y_train.numpy()) test_predict scaler.inverse_transform(test_predict.numpy()) y_test_actual scaler.inverse_transform(y_test.numpy()) # 绘制对比图 plt.figure(figsize(15, 8)) # 为了正确对齐时间我们需要偏移测试集的部分 train_size len(train_predict) sequence_length test_indices np.arange(train_size, train_size len(test_predict)) plt.plot(np.arange(len(prices)), prices, labelActual Price, alpha0.7, linewidth2) plt.plot(np.arange(sequence_length, train_size), train_predict, labelTrain Predict, alpha0.9) plt.plot(test_indices, test_predict, labelTest Predict, alpha0.9, linewidth2) plt.title(Stock Price Prediction using LSTM) plt.xlabel(Days) plt.ylabel(Price (USD)) plt.legend() plt.show()这张图是检验我们模型成败的关键。理想情况下预测曲线尤其是测试集的预测曲线应该紧紧跟随真实价格的走势。如果贴合得很好说明我们的LSTM模型确实学到了历史数据中的有效模式。5. 总结走完这一趟我们从LSTM为什么能解决RNN的“健忘症”开始拆解了它内部遗忘门、输入门、输出门三个核心部件是如何像精密仪器一样控制信息流的。通过和前馈神经网络、经典RNN的对比我们能更清楚地看到LSTM在处理序列数据尤其是长序列依赖上的独特优势。后面的实战部分我们用一个完整的股票价格预测案例把理论落到了实处。从用yfinance获取真实数据到归一化、构建序列数据集再到用PyTorch定义、训练LSTM模型最后可视化预测结果每一步都是时间序列预测任务的标准流程。你可以试着调整代码中的sequence_length观察窗口、hidden_layer_size模型复杂度等参数看看预测效果会有什么变化。比如把窗口从60天改成30天或90天或者把隐藏层神经元增加到100个感受一下这些“旋钮”对模型的影响。当然这个例子还是一个相对基础的版本。真实的量化交易系统要考虑的因素多得多比如多特征输入开盘价、最高价、成交量等、更复杂的模型结构多层LSTM、注意力机制、以及严谨的回测和风险控制。但无论如何理解并掌握LSTM这个强大的工具无疑是构建更高级时序预测模型的一块坚实基石。希望这次借助Cogito-V1-Preview-Llama-3B展开的讲解和代码实践能帮你把这个工具稳稳地放进自己的工具箱里。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2434614.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!