You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

情感分析任务中LSTM模型训练准确率卡在0.5左右无法提升如何解决

问题原因与解决方案

核心问题定位

  • 全连接层缺少非线性激活:LSTM结构中Dense(10)未配置激活函数,默认使用线性变换,多层线性层叠加等价于单层线性变换,模型没有非线性拟合能力,无法学习二分类边界,因此准确率始终维持在随机猜测的0.5水平。
  • 序列填充策略适配错误:你使用padding='post'在序列尾部补0,LSTM按顺序处理序列时,尾部大量无效0值会覆盖前面的有效语义信息,导致特征提取失效。同时Embedding层未开启mask_zero=True,模型会将填充的0值作为有效特征处理,进一步干扰学习过程。
  • 训练配置与正则化缺失:LSTM收敛速度慢于CNN,仅训练10轮不足以完成收敛;同时缺少Dropout正则化层,模型学习过程容易出现震荡,Adam默认学习率也可能偏高导致无法收敛。

修复代码说明

仅需要修改LSTM代码中的填充逻辑、模型结构、编译与训练配置即可,修改片段如下:

# 序列填充改为pre,在序列头部补0
Xtrain = pad_sequences(encoded_docs, maxlen=max_length, padding='pre')
# 测试集填充逻辑同步修改
Xtest = pad_sequences(encoded_docs, maxlen=max_length, padding='pre')

# 定义模型
model = Sequential()
# 新增mask_zero=True,让模型自动忽略填充的0值
model.add(Embedding(vocab_size, 100, input_length=max_length, mask_zero=True))
# LSTM层加入Dropout减少震荡和过拟合
model.add(LSTM(units=100, dropout=0.2, recurrent_dropout=0.2))
# 补全relu激活函数,增加非线性拟合能力
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
print(model.summary())

# 编译网络,调低学习率避免震荡
opt = Adam(learning_rate=1e-4)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])

# 增加训练轮次保证收敛,加入验证集监控训练过程
history=model.fit(Xtrain, ytrain, epochs=25, verbose=2, validation_split=0.1)

其余数据加载、评估、绘图逻辑保持原有代码不变即可。修改后运行模型,训练准确率会逐步上升,正常测试准确率可以达到85%以上。

额外优化建议

  • 如果收敛效果仍不理想,可以将LSTM的单元数调整为64或128测试适配效果
  • 可以尝试使用双向LSTM(Bidirectional(LSTM(...)))提取双向文本语义特征,进一步提升准确率
  • 训练轮次可以根据验证集准确率灵活调整,避免过拟合

内容的提问来源于stack exchange,提问作者Zen Hui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:39:02