Keras实现LSTM政治新闻文本分类过拟合及异常问题咨询
问题解答
序列填充后数组开头全为0的原因
这是pad_sequences函数的默认行为:该方法默认参数为padding='pre',当文本转成的词索引序列长度小于你设置的MAX_SEQUENCE_LENGTH时,会把代表填充位的0补在序列头部;如果序列长度超过MAX_SEQUENCE_LENGTH,默认会从序列头部截断,保留尾部的词。
如果希望填充/截断发生在序列尾部,手动传入参数padding='post'、truncating='post'即可。前置填充本身不会影响模型训练,如果要让模型自动忽略填充的0值,可以在Embedding层设置mask_zero=True,训练时会自动跳过0值位置的计算,避免无效填充值干扰特征学习。
首个epoch验证准确率高于训练准确率的原因
这是训练阶段的正常现象,由两个机制共同导致:
- 训练集的准确率、损失是整个epoch逐batch训练的滚动平均值:第一个epoch初始时模型权重随机初始化,预测准确率接近随机猜测水平(三分类任务约33%),随着batch迭代权重不断更新,准确率逐步上升,整个epoch的平均训练准确率自然低于epoch结束、模型完成一整轮更新后在验证集上测得的准确率。
- 训练阶段Dropout会随机失活部分神经元,相当于训练时模型始终处于“不完整”状态;而验证阶段Dropout会自动关闭,模型使用全部神经元做推理,预测表现会优于带Dropout的训练状态。
等训练进入中后期,模型开始过拟合训练集特征后,训练准确率就会快速反超验证准确率,和你当前观测到的曲线趋势完全一致。
过拟合优化方案
你当前的过拟合核心原因是有效特征不足+模型冗余,按优先级调整即可:
- 大幅提高特征维度:将
MAX_NB_WORDS从500调整到20000以上,MAX_SEQUENCE_LENGTH从100调整到256~500。当前仅保留最高频500个词的设置,会丢失绝大多数和政治倾向相关的语义信息,剩下的大多是无意义通用停用词,模型很容易记住训练集的少量噪声特征,完全没有泛化能力。 - 加回你注释掉的
SpatialDropout1D(0.2)层,放在Embedding层之后。该层会随机丢弃整个词嵌入维度,对文本场景下的过拟合抑制效果远好于普通Dropout。 - 删除LSTM层和输出层之间的
Dense(8)全连接层,多余的全连接层会大幅增加参数量,加重过拟合,LSTM输出后接Dropout直接连三分类输出层即可。 - 数据集划分时在
train_test_split中传入stratify=Y参数做分层抽样,保证训练集、验证集、测试集的标签分布一致,避免指标异常波动。 - 如果调整后仍存在过拟合,可以给LSTM层添加L2正则(参数为
kernel_regularizer=l2(1e-4)),约束权重取值范围,降低过拟合风险。
内容的提问来源于stack exchange,提问作者zephyr
相关产品推荐
相关产品推荐

