终于把 LSTM 算法搞懂了!

LSTM (长短期记忆网络) 是一种特殊的循环神经网络算法 (RNN),旨在解决传统 RNN 在处理长序列数据时面临的梯度消失和梯度爆炸问题,从而更好地捕捉序列中的长期依赖关系。

神经网络学习资料+AI学习路线可以上图扫码获取

资料包:一、 人工智能学习路线及大纲

二、计算机视觉OpenCV【视频+书籍】

三、AI基础+ 深度学习 + 机器学习 +NLP+ 机器视觉 教程

四、李飞飞+吴恩达+李宏毅合集

五、自动驾驶+知识图谱等资料

六、人工智能电子书合集【西瓜书、花书等】

七、各阶段AI论文攻略合集【论文带读/代码指导/本硕博/SCI/EI/中文核心】

 

传统 RNN 的一个主要缺点是它们很难学习到相距较远的信息之间的依赖。例如,在一个很长的句子中,一个词的含义可能依赖于句首的某个词。随着时间步的增加,反向传播过程中梯度会指数级地衰减或增长,导致网络无法有效地学习到这些长期依赖。

LSTM 通过引入“门控” 机制来克服这些问题,这些门控单元能够学习到何时允许信息通过、何时遗忘信息,以及何时输出信息。这使得 LSTM 能够有效地记住在较长时间跨度内的信息,从而在语音识别、机器翻译、文本生成等领域取得了巨大的成功。

LSTM 的核心原理

LSTM 的核心在于其特殊的记忆单元(或称为细胞状态,Cell State)以及三个门控单元:遗忘门、输入门和输出门。

  1. 细胞状态(Cell State)

    贯穿整个序列传递,类似于传送带,信息可以沿着它线性传播,减少梯度消失。

  2. 遗忘门(Forget Gate)

    控制哪些信息应该被遗忘。

  3. 输入门(Input Gate)

    控制当前输入的新信息有多少被写入细胞状态中。

  4. 输出门(Output Gate)

    控制细胞状态中哪些信息被输出。

数学公式

下面我们详细给出 LSTM 算法在每个时间步 t 的计算公式。

1.遗忘门

遗忘门决定哪些信息需要从细胞状态中丢弃。

2.输入门

输入门决定哪些新的信息写入细胞状态中。

首先,计算输入门的激活值

3.更新细胞状态

根据遗忘门和输入门的计算结果,更新当前时刻的细胞状态。

4.输出门

输出门决定细胞状态的哪部分将作为隐藏状态输出。

首先,计算输出门的激活值

其中

  •  控制输出比例。

  •  是当前时刻的隐藏状态,也是网络的输出。

LSTM 的优点

  • 解决长期依赖问题:LSTM通过门控机制(遗忘门、输入门、输出门)和记忆单元设计,可以在较长时间跨度内保留和传递信息,有效捕捉长期依赖。

  • 灵活门控机制:能选择性保留或遗忘信息。

  • 广泛应用:在自然语言处理、时间序列预测、语音识别等领域表现优异。

案例分享

下面是一个使用 Python 实现的基于 LSTM 算法进行苹果公司股票价格预测的示例代码。

import yfinance as yf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 1. 下载数据:苹果公司过去5年每日收盘价
ticker = 'AAPL'
data = yf.download(ticker, start='2015-01-01', end='2025-06-01')
close_prices = data['Close'].values.reshape(-1, 1)

# 2. 数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_prices = scaler.fit_transform(close_prices)

# 3. 创建序列数据(X:过去60天的价格,Y:第61天价格)
def create_dataset(dataset, time_step=60):
    X, Y = [], []
    for i in range(len(dataset) - time_step):
        X.append(dataset[i:i + time_step, 0])
        Y.append(dataset[i + time_step, 0])
    return np.array(X), np.array(Y)

time_step = 60
X, Y = create_dataset(scaled_prices, time_step)

# 4. 数据形状调整为LSTM输入格式 [样本数, 时间步长, 特征数]
X = X.reshape(X.shape[0], X.shape[1], 1)

# 5. 划分训练集和测试集(80%训练,20%测试)
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
Y_train, Y_test = Y[:train_size], Y[train_size:]

# 6. 构建LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1)))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')

# 7. 训练模型
model.fit(X_train, Y_train, epochs=20, batch_size=32, verbose=1)

# 8. 预测
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# 9. 反归一化
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)
Y_train_actual = scaler.inverse_transform(Y_train.reshape(-1, 1))
Y_test_actual = scaler.inverse_transform(Y_test.reshape(-1, 1))

# 10. 绘图对比真实价格和预测价格
plt.figure(figsize=(12,6))
plt.plot(data.index[time_step:train_size+time_step], Y_train_actual, label='Train Actual')
plt.plot(data.index[time_step:train_size+time_step], train_predict, label='Train Predict')
plt.plot(data.index[train_size+time_step:], Y_test_actual, label='Test Actual')
plt.plot(data.index[train_size+time_step:], test_predict, label='Test Predict')
plt.xlabel('Date')
plt.ylabel('Apple Stock Price')
plt.title('Apple Stock Price Prediction with LSTM')
plt.legend()
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值