- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道 2 层 3 个神经元的人工神经网络 (ANN) 可以解决 XOR
Input1----Neuron1\
\ / \
/ \ +------->Neuron3
/ \ /
Input2----Neuron2/
但是要缩小这个 ANN,是否可以只用 2 个神经元(Neuron1 接受 2 个输入,Neuron2 只接受 1 个输入)来解决 XOR?
Input1
\
\ Neuron1------->Neuron2
/
Input2/
The artificial neuron receives one or more inputs... https://en.wikipedia.org/wiki/Artificial_neuron
假定偏置输入“1”在两个图中始终存在。
Side notes:
Single neuron can solve xor but with additional input x1*x2 or x1+x2 https://www.quora.com/Why-cant-the-XOR-problem-be-solved-by-a-one-layer-perceptron/answer/Razvan-Popovici/log
The ANN form in second diagram may solve XOR with additional input like above to Neuron1 or Neuron2?
最佳答案
不,那是不可能的,除非(也许)您开始使用一些相当奇怪、不寻常的激活函数。
我们先忽略神经元 2,假设神经元 1 是输出节点。设 x0
表示偏置值(总是 x0 = 1
),x1
和 x2
表示输入值举个例子,让 y
表示期望的输出,让 w1, w2, w3
表示从 x's
到神经元 1 的权重。异或问题,我们有以下四个例子:
x0 = 1, x1 = 0, x2 = 0, y = 0
x0 = 1, x1 = 1, x2 = 0, y = 1
x0 = 1, x1 = 0, x2 = 1, y = 1
x0 = 1, x1 = 1, x2 = 1, y = 0
令 f(.)
表示神经元 1 的激活函数。然后,假设我们可以通过某种方式训练我们的权重来解决 XOR 问题,我们有以下四个等式:
f(w0 + x1*w1 + x2*w2) = f(w0) = 0
f(w0 + x1*w1 + x2*w2) = f(w0 + w1) = 1
f(w0 + x1*w1 + x2*w2) = f(w0 + w2) = 1
f(w0 + x1*w1 + x2*w2) = f(w0 + w1 + w2) = 0
现在,主要问题是通常使用的激活函数(ReLU、sigmoid、tanh、恒等函数...也许其他)是非递减的。这意味着如果你给它一个更大的输入,你也会得到一个更大的输出:f(a + b) >= f(a)
if b >= 0
。如果你看一下上面的四个等式,你会发现这是一个问题。比较第二个和第三个等式与第一个等式告诉我们 w1
和 w2
需要为正,因为与 f(w0) 相比,它们需要增加输出
。但是,第四个等式将无法解决,因为它会给出更大的输出,而不是 0
。
我认为(但实际上并没有尝试验证,也许我遗漏了什么)如果您使用先上升然后下降的激活函数,这是可能的。想想像 f(x) = -(x^2)
这样的东西,加上一些额外的项来将它从原点移开。我认为这种激活函数在神经网络中并不常用。我怀疑它们在训练时会表现得不太好,而且从生物学的角度来看也不合理(请记住,神经网络至少受到生物学的启发)。
现在,在您的问题中,您还添加了一个从神经元 1 到神经元 2 的额外链接,我在上面的讨论中忽略了这一点。这里的问题仍然是一样的。神经元 1 的激活水平总是高于(或至少与)第二种和第三种情况。神经元 2 通常会再次具有非递减的激活函数,因此无法改变这一点(除非你在隐藏神经元 1 和输出神经元 2 之间放置一个负权重,在这种情况下你翻转问题并预测太高的第一种情况的值(value))
编辑:请注意,这与 Aaron 的回答有关,该回答本质上也是关于非递减激活函数的问题,只是使用了更正式的语言。也给他点个赞吧!
关于algorithm - 2 个神经元的 ANN 可以解决 XOR 问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41712420/
我正在实验性地尝试创建一种具有以下标准的新型神经网络: 每个神经元必须是一个单独的对象。 每个神经元都应该有自己的线程。 网络必须部分连接且随机(在启动时)。 神经元必须异步运行以计算其输出、更新其权
如果我想动态地向我的 tensorflow 层中的一个添加新节点,我该怎么做? 例如,如果我想在模型训练一段时间后将隐藏节点的数量从 10 更改为 11。另外,假设我知道我希望进出该节点/神经元的权重
换句话来说,将神经元求和公式中sigmoid之前的偏置切换为b_j或者附加w_ij*x_i的主要原因是什么?表现? 哪种方法最好,为什么? 注意:j是实际层的神经元,i是下层的神经元。 最佳答案 注意
我是一名优秀的程序员,十分优秀!