我正在尝试使用类似于此的神经网络模拟XOR门:
现在我明白每个神经元都有一定数量的权重和偏差。我正在使用sigmoid function来确定神经元是否应该在每个状态下发射(因为它使用了sigmoid而不是阶梯函数,我使用松散意义上的射击,因为它实际上吐出了实际值)。 / p>
我成功运行了Feed for forwarding部分的模拟,现在我想使用backpropagation算法来更新权重并训练模型。问题是,对于x1
和x2
的每个值,都有一个单独的结果(总共4种不同的组合),并且在不同的输入对下,单独的误差距离(所需输出和实际值之间的差异)可以计算结果,然后最终实现不同的权重更新集。这意味着我们将通过使用反向传播为每个单独的输入对获得4组不同的权重更新。
我们应该如何决定正确的体重更新?
假设我们重复单个输入对的反向传播,直到我们收敛,但如果我们选择另一对输入,我们会收敛到不同的权重集怎么办?
答案 0 :(得分:2)
现在我明白每个神经元都有一定的重量。我正在使用sigmoid函数来确定每个状态下是否应该触发神经元。
你并没有真正“决定”这一点,典型的MLP不会“开火”,它们会输出实际价值。实际上有神经网络(如RBM),但这是一个完全不同的模型。
这意味着我们将通过使用反向传播为每个输入对获得4组不同的权重更新。
这实际上是功能。让我们从开始。您尝试最小化整个训练集(在您的情况下 - 4个样本)中的一些损失函数,其形式为:
L(theta) = SUM_i l(f(x_i), y_i)
其中l
是一些损失函数,f(x_i)是您当前的预测值和y_i真值。你通过梯度下降来做到这一点,因此你试图计算L的梯度并反对它
grad L(theta) = grad SUM_i l(f(x_i), y_i) = SUM_i grad l(f(x_i), y_i)
对于单个训练对grad l(f(x_i) y_i)
,您现在称之为“单个更新”的是(x_i, y_i)
。通常你不会使用它,但是你会在整个数据集中求和(或取平均值)更新,因为这是你真正的渐变。但实际上,这可能是计算上不可行的(训练集通常非常大),而且,经验证明训练中更多的“噪音”通常更好。因此出现了另一种学习技术,称为随机梯度下降,简而言之,它表明在一些轻量级假设(如加性损失函数等)下,您实际上可以独立地进行“小更新”,并且你仍然会收敛到当地的极小!换句话说 - 您可以按随机顺序“逐点”进行更新,您仍然可以学习。它总是一样的解决方案吗?不。但是对于计算整个梯度也是如此 - 非凸函数的优化几乎总是不确定的(你发现一些本地解决方案,而不是全局解决方案)。