使用单个隐藏节点的感知器和多层感知器解决XOR问题

最近我在尝试使用Torch7。

今天,我实现了Perceptron和Multilayer Perceptron(MLP)来解决XOR问题。

和预计的一样,MLP在XOR上效果不错,而Perceptron则不行。

但我很好奇,如果隐藏节点的数量是1会怎么样。

我以为MLP的结果可能和Perceptron一样,因为它只有一个隐藏节点。

但有趣的是,MLP比Perceptron要好。

更详细地说,Perceptron的误差为0.25(如预期所示),而具有1个隐藏节点的MLP的误差约为0.16。

我认为一个隐藏节点就像问题空间中的一条线。

因此,如果只有一个隐藏节点,它可能和Perceptron一样。

但这个结果告诉我我错了。

现在,我想知道,为什么具有1个隐藏节点的MLP比Perceptron更好。

请告诉我为什么会出现这个结果。

非常感谢。

以下是Perceptron代码:

-- perceptron

require 'nn'

-- 数据
data = torch.Tensor({ {0, 0}, {0, 1}, {1, 0}, {1, 1} })
-- 目标
target = torch.Tensor({ 0, 1, 1, 0 })

-- 模型
perceptron = nn.Linear(2, 1)
-- 损失函数
criterion = nn.MSECriterion()

-- 训练
for i = 1, 10000 do
   -- 将梯度归零
   perceptron:zeroGradParameters()
   -- 计算输出
   output = perceptron:forward(data)
   -- 计算损失
   loss = criterion:forward(output, target)
   -- 对输出进行梯度计算
   dldo = criterion:backward(output, target)
   -- 对参数进行梯度计算
   perceptron:backward(data,dldo)
   -- 使用学习速率0.1的梯度下降
   perceptron:updateParameters(0.1)
   print(loss)
end

以下是具有1个隐藏节点的MLP代码:

-- multilayer perceptron

require 'nn'

-- 数据
data = torch.Tensor({ {0, 0}, {0, 1}, {1, 0}, {1, 1} })
-- 目标
target = torch.Tensor({ 0, 1, 1, 0 })

-- 模型
multilayer = nn.Sequential()
inputs = 2; outputs = 1; HUs = 1;
multilayer:add(nn.Linear(inputs, HUs))
multilayer:add(nn.Tanh())
multilayer:add(nn.Linear(HUs, outputs))
-- 损失函数
criterion = nn.MSECriterion()

-- 训练
for i = 1, 10000 do
   -- 将梯度归零
   multilayer:zeroGradParameters()
   -- 计算输出
   output = multilayer:forward(data)
   -- 计算损失
   loss = criterion:forward(output, target)
   -- 对输出进行梯度计算
   dldo = criterion:backward(output, target)
   -- 对参数进行梯度计算
   multilayer:backward(data,dldo)
   -- 使用学习速率0.1的梯度下降
   multilayer:updateParameters(0.1)
   print(loss)
end
点赞