我这几天在玩Torch7。
今天,我实现了感知器和多层感知器(MLP)来解决 XOR。
正如预期的那样,MLP 在 XOR 上运行良好,而感知器则不然。
但是我很好奇如果隐藏节点的数量是1,结果会是什么。
我预计 MLP 的结果可能与 Perceptorn 相同,因为它只有 1 个隐藏节点。
但有趣的是,MLP 比 Percentron 更好。
更多细节,感知器得到 0.25 误差(如预期),但具有 1 个隐藏节点的 MLP 得到大约 0.16 误差。
我认为一个隐藏节点充当问题空间中的一条线。
所以,如果只有一个隐藏节点,它可能与感知器相同。
但是这个结果告诉我我错了。
现在,我想知道为什么具有 1 个隐藏节点的 MLP 比 Perceptron 更好。
请告诉我为什么会出现这样的结果。
非常感谢。
以下是感知器代码:
-- perceptron
require 'nn'
-- data
data = torch.Tensor({ {0, 0}, {0, 1}, {1, 0}, {1, 1} })
-- target
target = torch.Tensor({ 0, 1, 1, 0 })
-- model
perceptron = nn.Linear(2, 1)
-- loss function
criterion = nn.MSECriterion()
-- training
for i = 1, 10000 do
-- set gradients to zero
perceptron:zeroGradParameters()
-- compute output
output = perceptron:forward(data)
-- compute loss
loss = criterion:forward(output, target)
-- compute gradients w.r.t. output
dldo = criterion:backward(output, target)
-- compute gradients w.r.t. parameters
perceptron:backward(data,dldo)
-- gradient descent with learningRate = 0.1
perceptron:updateParameters(0.1)
print(loss)
end
以下是具有 1 个隐藏节点的 MLP 代码:
-- multilayer perceptron
require 'nn'
-- data
data = torch.Tensor({ {0, 0}, {0, 1}, {1, 0}, {1, 1} })
-- target
target = torch.Tensor({ 0, 1, 1, 0 })
-- model
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))
-- loss function
criterion = nn.MSECriterion()
-- training
for i = 1, 10000 do
-- set gradients to zero
multilayer:zeroGradParameters()
-- compute output
output = multilayer:forward(data)
-- compute loss
loss = criterion:forward(output, target)
-- compute gradients w.r.t. output
dldo = criterion:backward(output, target)
-- compute gradients w.r.t. parameters
multilayer:backward(data,dldo)
-- gradient descent with learningRate = 0.1
multilayer:updateParameters(0.1)
print(loss)
end
这种错误差异可能是由于学习率的差异造成的。您使用的纪元数量足够高,足以找到完美的精度。您应该采取以下措施来解决此问题:在这两种情况下不断降低学习率。将其转至大约 1e-4。