东莞网站建设技术支持,wordpress分享插件国内,淘客推广怎么做,陕西咸阳建设银行网站循环神经网络实战#xff1a;GRU 对比 LSTM 的中文情感分析#xff08;三#xff09; 文章目录循环神经网络实战#xff1a;GRU 对比 LSTM 的中文情感分析#xff08;三#xff09;前言数据准备#xff08;与 LSTM 相同#xff09;模型搭建#xff08;GRU#xff09;…循环神经网络实战GRU 对比 LSTM 的中文情感分析三 文章目录循环神经网络实战GRU 对比 LSTM 的中文情感分析三前言数据准备与 LSTM 相同模型搭建GRU训练与测试可视化 Loss 曲线测试与预测GRU vs LSTM 对比总结前言
在前两篇文章中我们已经学习了 RNN/LSTM/GRU 的理论基础并完成了一个基于 LSTM 的中文情感分析实战项目。 那么问题来了GRU 和 LSTM 到底哪个更好
本篇我们将使用同样的任务中文情感分析用 GRU 模型替换 LSTM并进行训练和测试最后对比两者的 速度和效果。 数据准备与 LSTM 相同
这里我们依然使用示例的 中文评论数据完整项目请使用 ChnSentiCorp 数据集。
import jieba
from torchtext.vocab import build_vocab_from_iterator
from torch.nn.utils.rnn import pad_sequence
import torchtexts [这部电影真的很好看, 剧情太差劲了浪费时间, 演员表演很自然值得推荐]
labels [1, 0, 1]tokenized_texts [list(jieba.cut(t)) for t in texts]def yield_tokens(data):for tokens in data:yield tokensvocab build_vocab_from_iterator(yield_tokens(tokenized_texts), specials[pad])
vocab.set_default_index(vocab[pad])text_ids [torch.tensor(vocab(t)) for t in tokenized_texts]
padded pad_sequence(text_ids, batch_firstTrue, padding_valuevocab[pad])模型搭建GRU
在 LSTM 中我们有输入门、遗忘门和输出门而 GRU 更加简洁只保留了 更新门update gate和重置门reset gate没有单独的细胞状态。
因此GRU 参数更少训练更快。
PyTorch 代码如下
import torch.nn as nnclass SentimentGRU(nn.Module):def __init__(self, vocab_size, embed_dim, hidden_dim, num_layers, num_classes1):super(SentimentGRU, self).__init__()self.embedding nn.Embedding(vocab_size, embed_dim, padding_idx0)self.gru nn.GRU(embed_dim, hidden_dim, num_layers, batch_firstTrue)self.fc nn.Linear(hidden_dim, num_classes)self.sigmoid nn.Sigmoid()def forward(self, x):embedded self.embedding(x)out, _ self.gru(embedded)out self.fc(out[:, -1, :]) # 取最后时刻的隐藏状态return self.sigmoid(out)训练与测试
定义损失函数和优化器
import torch.optim as optimmodel SentimentGRU(vocab_sizelen(vocab), embed_dim128, hidden_dim256, num_layers2)
criterion nn.BCELoss()
optimizer optim.Adam(model.parameters(), lr0.001)labels_tensor torch.tensor(labels, dtypetorch.float)
losses []训练循环记录 loss
for epoch in range(10):optimizer.zero_grad()outputs model(padded).squeeze()loss criterion(outputs, labels_tensor)loss.backward()optimizer.step()losses.append(loss.item())print(fEpoch {epoch1}, Loss: {loss.item():.4f})可视化 Loss 曲线
import matplotlib.pyplot as pltplt.plot(losses, labelTraining Loss (GRU))
plt.xlabel(Epoch)
plt.ylabel(Loss)
plt.legend()
plt.show()测试与预测
和 LSTM 一样直接输入新评论
def predict(text):tokens list(jieba.cut(text))ids torch.tensor(vocab(tokens)).unsqueeze(0)output model(ids)return 积极 if output.item() 0.5 else 消极print(predict(故事很精彩))
print(predict(导演水平太差))GRU vs LSTM 对比
我们来对比两个模型
模型参数量训练速度效果准确率适用场景LSTM较多较慢稳定适合长期依赖NLP 长文本、机器翻译GRU较少较快接近甚至优于 LSTM短文本分类、时间序列预测
实验结论
在小数据集短文本下GRU 的表现通常和 LSTM 不相上下但训练更快。在大规模数据集上LSTM 更稳定尤其在长依赖问题上优势明显。如果你追求 效率 → GRU 更好 如果你追求 精度和长期记忆能力 → LSTM 更稳妥。 总结 本文在 中文情感分析任务 中使用了 GRU 模型并与 LSTM 进行了对比。 实验表明GRU 训练速度更快效果接近 LSTM在短文本任务中性价比更高。 实际应用中可以根据 任务规模与需求 来选择 小数据集/短文本 → GRU长文本/复杂依赖 → LSTM追求最强性能 → Transformer (BERT, GPT 等)