基于PyTorch实现XOR逻辑门未获最优结果的技术问询
模型训练XOR类任务未达最优结果的原因及解决办法
核心问题分析
1. 标签存在无效维度
你的数据集里out1和out2列所有样本的标签全为0,没有任何变化。模型训练时,这两个输出对应的权重无法获得有效梯度更新——因为无论输入是什么,目标都是0,最终会陷入输出0.5左右的局部最优(Sigmoid函数输入为0时输出0.5,此时梯度接近0,权重不再更新)。
2. 输出层重复使用Sigmoid激活
模型输出层已经配置了nn.Sigmoid(),但测试阶段又额外调用了一次torch.nn.functional.sigmoid(output),相当于对输出做了两次Sigmoid压缩,导致输出值被过度挤压,偏离目标的0或1。
3. 优化器配置不合理
你使用的SGD优化器学习率设为0.01,这个数值对于这类简单任务来说过小,且未添加动量。这会导致模型收敛极慢,50万轮训练可能仍未到达最优解,或是陷入平缓的局部最优区域。
4. 任务目标不明确
从数据集来看,只有out3对应实际逻辑(4个输入的异或结果),out1和out2完全无效。如果后续操作确实需要3列输出,必须补充out1和out2的有效标签,否则模型无法学到这两列的任何规律。
解决办法
- 清理/补充标签数据:若
out1和out2无实际用途,直接删除这两列,将输出维度改为1;若必须保留,补充有差异的标签值,给模型提供学习依据。 - 移除重复的Sigmoid调用:模型输出层已用Sigmoid,测试时直接取模型输出即可,无需再次调用。
- 调整优化器参数:将SGD学习率提高到0.1~0.3,或添加动量(如
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9));也可换成Adam优化器,加快收敛速度。 - 简化模型结构:4输入1输出的异或任务,隐藏层设2个神经元就足够(异或问题的最小可行结构),无需用5个,减少冗余参数。
修改后的示例代码片段
# 调整模型结构(假设仅保留out3,输出维度改为1) n_in, n_h, n_out = 4, 2, 1 model = nn.Sequential( nn.Linear(n_in, n_h), nn.Sigmoid(), nn.Linear(n_h, n_out), nn.Sigmoid() ) # 换用Adam优化器,调大学习率 optimizer = torch.optim.Adam(model.parameters(), lr=0.1) # 测试时直接取模型输出 test_data = torch.tensor([1,1,1,1], dtype=torch.float32) output = model(test_data) print(output) # 应接近0
内容的提问来源于stack exchange,提问作者Darwin
相关产品推荐
相关产品推荐

