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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:15:20