神经网络Java异或学习?

Neural Network Java XOR learning?

我正在尝试用
在 Java 中编写一个神经网络 2 个输入神经元,1 个包含 3 个神经元和 1 个输出神经元的隐藏层,
这应该能够解决异或功能。我了解神经元(感知器)的工作原理以及它们的学习方式,但我不了解神经网络如何处理输出,或者神经元之间如何 "communicate"。
例如:

我有这个神经网络:(忽略值)



和这个数据集:
输入 = {{1, 0},{1, 1},{0, 1},{0, 0}}
理想 = {1, 0, 1, 0}

我用哪些值来训练每个特定的神经元?或者让神经网络学习?

"training" 神经网络的目标是找到正确的权重来正确预测给定输入的输出是什么。训练神经网络有两个基本过程。

前向传播: 在此过程中,我们在每一层获取权重和输入并计算输出,然后应用激活函数。例如,在您给出的神经网络中,隐藏层中第二个节点的计算将是:

1 * 0.4 + 1 * 0.9 = 1.3

然后我们在节点值 1.3 上应用激活函数。我猜这个神经网络使用的是 sigmoid 激活函数,它只不过是一个简单的指数函数。 https://en.wikipedia.org/wiki/Sigmoid_function

我们对隐藏层中的每个节点都这样做,这成为我们下一层的输入,我们的输出层。在对输出节点值应用激活函数后,这就是我们解释为神经网络的输出。它可能会偏离它应该的样子,因为初始权重是随机的,这会给我们一个随机的答案。但这会引导我们进入下一个过程,这将帮助我们找到合适的权重:

反向传播: 这部分需要大量的数学知识,如果你不熟悉微积分,一开始可能很难理解。但反向传播背后的总体思路是使用一种称为梯度下降的方法,通过将权重推向正确的方向来减少 "make" 我们的权重错误。详细解释梯度下降本身就需要很长的答案。因此,我将为您提供一些很好的资源来帮助您理解它:

http://eli.thegreenplace.net/2016/understanding-gradient-descent/

总而言之,这两个过程就是 "training" 神经网络的意思。目标是使用训练数据找到正确的权重,以便我们在面对以前从未见过的数据时做出正确的预测。

WelchLabs 制作了一个关于神经网络及其工作原理的非常好的视频系列。你绝对应该观看整个系列,它会解释一切,包括梯度下降:

https://www.youtube.com/watch?v=bxe2T-V8XRs