自学内容网 自学内容网

LSTM--详解

LSTM

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊的递归神经网络(RNN),最早由Hochreiter和Schmidhuber于1997年提出,旨在解决标准RNN在处理长序列时容易出现的梯度消失和梯度爆炸问题。LSTM通过引入“记忆单元”(Memory Cell)来保持长期依赖信息,并通过控制门结构来管理信息的流动和状态的更新。

LSTM的关键思想是,除了递归地更新隐藏状态外,LSTM通过引入输入门遗忘门输出门这三种门机制,来决定信息在各个时间步的流入、保留和输出,从而能够有效捕捉时间序列中的长依赖性特征。

LSTM的基本结构

LSTM的核心单元可以分为以下几个主要部分:

  1. 遗忘门(Forget Gate): 决定应该遗忘多少前一时间步的记忆。输入当前输入和上一时间步的隐藏状态,通过一个Sigmoid函数产生0到1之间的值,决定哪些信息需要丢弃。

  2. 输入门(Input Gate): 决定当前时间步新的信息存入多少到记忆单元。分为两部分:第一部分通过Sigmoid函数确定哪些值更新,第二部分通过Tanh函数产生候选记忆。

  3. 记忆单元(Cell State)更新: 结合遗忘门和输入门,更新当前的记忆单元。

  4. 输出门(Output Gate): 最终决定输出的隐藏状态,这部分基于当前的记忆单元和输入门的结果。

LSTM的经典代码

基本的LSTM网络结构

下面是使用Python和Keras框架实现LSTM的经典代码。

# 导入必要的库
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.optimizers import Adam
​
# 创建示例数据
# 假设输入的序列是三维数组:[样本数量, 时间步, 特征维度]
data = np.random.random((1000, 10, 50))  # 1000个样本,每个样本有10个时间步,每个时间步50维输入
labels = np.random.randint(2, size=(1000, 1))  # 二分类标签
​
# 构建LSTM模型
model = Sequential()
model.add(LSTM(64, input_shape=(10, 50)))  # 64个LSTM单元
model.add(Dense(1, activation='sigmoid'))  # 输出层,使用sigmoid函数
​
# 编译模型
model.compile(loss='binary_crossentropy',
              optimizer=Adam(),
              metrics=['accuracy'])
​
# 训练模型
model.fit(data, labels, epochs=10, batch_size=32)

LSTM文本生成的示例代码

以下是一个使用LSTM进行文本生成的简单示例。这里将使用Keras构建一个文本生成模型。

import numpy as np
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import LSTM, Embedding, Dense, Dropout
from keras.utils import to_categorical
​
# 示例文本数据
data = """
Long short-term memory (LSTM) is an artificial recurrent neural network (RNN) architecture 
used in the field of deep learning. Unlike standard feedforward neural networks, LSTM has feedback connections. 
It can not only process single data points (such as images), but also entire sequences of data (such as speech or video).
"""
​
# 文本预处理
tokenizer = Tokenizer()
tokenizer.fit_on_texts([data])
sequences = tokenizer.texts_to_sequences([data])[0]
vocab_size = len(tokenizer.word_index) + 1
​
# 创建输入输出序列
sequence_length = 5
X = []
y = []
for i in range(sequence_length, len(sequences)):
    X.append(sequences[i-sequence_length:i])
    y.append(sequences[i])
​
X = np.array(X)
y = to_categorical(y, num_classes=vocab_size)
​
# 构建模型
model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=50, input_length=sequence_length))
model.add(LSTM(100))
model.add(Dense(vocab_size, activation='softmax'))
​
# 编译模型
model.compile(loss='categorical_crossentropy', optimizer='adam')
​
# 训练模型
model.fit(X, y, epochs=100, verbose=2)
​
# 文本生成函数
def generate_text(seed_text, next_words, max_sequence_len):
    for _ in range(next_words):
        token_list = tokenizer.texts_to_sequences([seed_text])[0]
        token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
        predicted = model.predict(token_list, verbose=0)
        predicted_word_index = np.argmax(predicted, axis=-1)
        output_word = ""
        for word, index in tokenizer.word_index.items():
            if index == predicted_word_index:
                output_word = word
                break
        seed_text += " " + output_word
    return seed_text
​
# 测试生成文本
seed_text = "LSTM networks are"
generated_text = generate_text(seed_text, next_words=10, max_sequence_len=sequence_length)
print(generated_text)

代码解释:

  1. 文本预处理

    • 首先对文本进行token化,将其转换为数值序列,表示每个单词。

    • 然后根据输入长度,将序列划分为输入 XXX 和输出 yyy 对。

  2. 模型结构

    • 使用一个Embedding层将输入序列中的单词映射到向量空间。

    • 接着通过LSTM层处理这些嵌入向量,最终通过全连接层预测下一个单词。

  3. 文本生成

    • 使用训练好的模型,给定一个种子文本,模型根据上下文预测后续单词。

总结

LSTM作为递归神经网络的一种,专门用于处理长依赖序列问题,因其在许多任务中(如自然语言处理、时间序列预测等)表现优异,成为了深度学习领域的重要模型之一。


原文地址:https://blog.csdn.net/GDHBFTGGG/article/details/142735308

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!