赞
踩
小屌丝:鱼哥, 你说什么是LSTM
小鱼:LSTM… LSTM …
小屌丝:鱼哥, LSTM是啥?
小鱼:LSTM是… 不好意思说啊
小屌丝:这,有啥不好意思说的?
小鱼:你自己用输入法敲一下不就知道了。
小屌丝:…
小鱼:是啥啊, 让我看看?
小鱼:咋了,还不让我看,一定是…
小屌丝: 乱了乱了, 不是这样的。
小鱼:你看着你屏幕敲出的,还不承认
小屌丝:… 乱了乱了, 我说的LSTM算法模型,
小鱼:… 哦,这个啊,你都知道是算法模型,还问我啥?
小屌丝:这不是触碰到我的知识盲区了嘛,所以特来请教。
小鱼: 最后两个字是重点,待会可以考试哦
小屌丝:给我讲的明明白白的,我就告诉你刚刚输入法输出的是啥。
小鱼:嘿嘿~~
长短期记忆网络(Long Short-Term Memory,简称LSTM)是一种特殊的循环神经网络(RNN),旨在解决传统RNN在处理长序列时出现的梯度消失和爆炸问题。
LSTM通过引入门控机制,有效地捕获序列中的长期依赖关系,因此在自然语言处理、语音识别、时间序列预测等领域有着广泛的应用。
LSTM的核心思想是通过三个门(输入门、遗忘门和输出门)来控制信息的流动。这些门通过sigmoid函数将输入映射到0到1之间的值,从而决定信息的保留或丢弃。
LSTM的单元内部还包括一个细胞状态(cell state),用于保存长期记忆。通过这三个门和细胞状态的共同作用,LSTM能够在处理长序列时保持稳定的性能。
LSTM的算法公式如下:
其中,
LSTM算法模型的基本流程:
数据预处理:首先,需要对输入数据进行预处理,包括标准化、归一化等操作,以便模型能够更好地学习数据的特征。
创建模型:在Keras等深度学习框架中,LSTM模型通常通过Sequential类来创建。然后,按照所需的顺序添加LSTM层和其他必要的层,如Dense层(全连接层)用于输出预测。
定义网络结构:在LSTM中,每个时间步的输入都会经过三个主要的“门”结构:遗忘门、输入门和输出门。这些门结构通过特定的计算公式和控制机制,来决定哪些信息应该被保留,哪些应该被遗忘。
模型训练:使用预处理后的数据对模型进行训练。在训练过程中,模型会学习如何调整其参数以最小化预测误差。这通常通过反向传播算法和梯度下降优化器来实现。
模型评估:在训练完成后,使用验证集或测试集对模型进行评估,以检查其性能。评估指标可能包括准确率、损失函数值等。
模型应用:一旦模型经过训练和评估,并达到预期的性能要求,就可以将其应用于实际任务中,如时间序列预测、自然语言处理等。
# -*- coding:utf-8 -*- # @Time : 2024-03-16 # @Author : Carl_DJ ''' 实现功能: PyTorch 和 torchtext 库来加载 IMDB 电影评论数据集,并训练一个 LSTM 模型来预测评论的情感(正面或负面) ''' import torch import torch.nn as nn import torch.optim as optim from torchtext.legacy import data, datasets # 定义字段处理器 TEXT = data.Field(tokenize='spacy', tokenizer_language='en_core_web_sm') LABEL = data.LabelField(dtype=torch.float) # 定义数据集和迭代器 train_data, test_data = datasets.IMDB.splits(TEXT, LABEL) train_iterator, test_iterator = data.BucketIterator.splits( (train_data, test_data), batch_size=64, device=torch.device('cuda' if torch.cuda.is_available() else 'cpu') ) # 定义 LSTM 模型 class LSTMClassifier(nn.Module): def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, n_layers, drop_prob=0.5): super().__init__() self.embedding = nn.Embedding(input_dim, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim, n_layers, dropout=drop_prob, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) self.drop = nn.Dropout(drop_prob) def forward(self, text): embedded = self.embedding(text) lstm_out, _ = self.lstm(embedded) lstm_out = self.drop(lstm_out) return self.fc(lstm_out[:, -1, :]) # 超参数 INPUT_DIM = len(TEXT.vocab) EMBEDDING_DIM = 100 HIDDEN_DIM = 32 OUTPUT_DIM = 1 N_LAYERS = 2 DROP_PROB = 0.5 # 实例化模型、损失函数和优化器 model = LSTMClassifier(INPUT_DIM, EMBEDDING_DIM, HIDDEN_DIM, OUTPUT_DIM, N_LAYERS, DROP_PROB) criterion = nn.BCEWithLogitsLoss() optimizer = optim.Adam(model.parameters()) # 将模型移动到 GPU(如果可用) model = model.to(device) criterion = criterion.to(device) # 训练模型 N_EPOCHS = 5 for epoch in range(N_EPOCHS): for batch in train_iterator: optimizer.zero_grad() predictions = model(batch.text).squeeze(1) loss = criterion(predictions, batch.label.float()) loss.backward() optimizer.step() print(f'Epoch: {epoch+1:02}, Loss: {loss.item():.6f}') # 测试模型 model.eval() with torch.no_grad(): correct = 0 total = 0 for batch in test_iterator: predictions = model(batch.text).squeeze(1) > 0.5 correct += (predictions == batch.label).sum().item() total += batch.batch_size print(f'Accuracy: {100 * correct / total:.2f}%')
解析
LSTM 作为一种强大的循环神经网络变体,通过引入门控机制和细胞状态,有效地解决了传统 RNN 在处理长序列时遇到的梯度消失和爆炸问题。
这使得 LSTM 在处理具有长期依赖关系的序列数据时表现出色,广泛应用于自然语言处理、语音识别、时间序列预测等领域。
我是小鱼:
关注小鱼,学习机器学习领域的知识。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。