如何在混合量子LSTM模型中添加dropout层解决过拟合问题
核心问题原因
你的操作无效有两个核心原因:
- PyTorch中
nn.LSTM的dropout参数仅在堆叠LSTM层数≥2时生效,你当前layer_dim=1为单隐藏层,该参数不产生任何作用。 - dropout参数代表神经元被随机置零的概率,取值范围为01,你设置`dropout=1`意味着所有隐藏神经元输出全部被置零,完全丢失特征信息,自然不会有优化效果,常规使用的取值区间为0.20.5。
正确添加dropout的实现方案
方案1:新增独立Dropout层(适配单隐藏层LSTM)
你可以在输入层进入LSTM之前、LSTM输出与全连接层之间两个位置添加独立的nn.Dropout层,修改后的模型代码如下:
import torch.nn as nn import torch import qiskit import numpy as np import torch as T class LSTMModel(nn.Module): def __init__(self, input_dim, hidden_dim, layer_dim, output_dim, dropout_prob=0.3): super(LSTMModel, self).__init__() self.hidden_dim = hidden_dim self.layer_dim = layer_dim # 输入层Dropout:对原始输入特征做随机置零 self.input_dropout = nn.Dropout(dropout_prob) # 移除无效的LSTM层内dropout设置 self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, batch_first=True) # LSTM输出后的Dropout:对时序特征做随机置零 self.lstm_dropout = nn.Dropout(dropout_prob) self.fc = nn.Linear(hidden_dim, output_dim) self.hybrid = Hybrid(qiskit.Aer.get_backend('qasm_simulator'), 100, np.pi / 2) def forward(self, x): # 输入先经过dropout x = self.input_dropout(x) h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_() c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_() x, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach())) # 取最后一个时间步输出后经过dropout x = self.lstm_dropout(x[:, -1, :]) x = self.fc(x) x = self.hybrid(x) return T.cat((x, 1 - x), -1)
方案2:堆叠多层LSTM使用层间dropout
如果算力允许,可以把layer_dim调整为≥2,此时就可以直接使用LSTM自带的dropout参数实现层间的随机失活,配合输出层的dropout效果更好:
# 参数调整示例 layer_dim = 2 dropout_prob = 0.3 # 对应LSTM初始化修改为 self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, dropout=dropout_prob, batch_first=True)
额外辅助降低过拟合的方法
- 训练时加入L2正则化:在优化器中设置
weight_decay参数,比如optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-5) - 加入早停(Early Stopping)机制:当验证集准确率连续N个epoch不上升时直接停止训练,避免模型学习噪声
- 降低隐藏层维度:你当前
hidden_dim=100对于输入维度16的任务来说可能过大,可以尝试下调到32~64区间减少参数量 - 扩充训练数据集,或加入数据增强操作
内容的提问来源于stack exchange,提问作者user14924
相关产品推荐
相关产品推荐

