【问题标题】:XOR gate with a neural network带有神经网络的 XOR 门
【发布时间】:2023-03-24 15:41:02
【问题描述】:

我试图用 tensorflow 实现 XOR 门。我成功地实现了这一点,但我不完全理解它为什么会起作用。我从 here 和 here 的 stackoverflow 帖子中获得了帮助。所以两者都有one hot true 和without one hot true 输出。这是我所理解的网络,为了把事情弄清楚。

我的问题 #1: 注意RELU 函数和Sigmoid 函数。为什么我们需要它(特别是 RELU 函数)?你可能会说是为了实现非线性。我了解RELU 如何实现非线性。我从here 得到了答案。现在,据我了解,使用RELU 和不使用RELU 之间的区别是这样的(见图)。[我测试了tf.nn.relu 功能。输出是这样的]

现在,如果第一个功能有效,为什么第二个功能无效?从我的角度来看,RELU 通过组合多个线性函数来实现非线性。所以两者都是线性函数(上两个)。如果第一个实现非线性,那么第二个也应该实现,不是吗?问题是,不使用RELU为什么会卡住?

具有一个热真输出的异或门

hidden1_neuron = 10

def Network(x, weights, bias):
    layer1 = tf.nn.relu(tf.matmul(x, weights['h1']) + bias['h1'])
    layer_final = tf.matmul(layer1, weights['out']) + bias['out']
    return layer_final

weight = {
    'h1' : tf.Variable(tf.random_normal([2, hidden1_neuron])),
    'out': tf.Variable(tf.random_normal([hidden1_neuron, 2]))
}
bias = {
    'h1' : tf.Variable(tf.random_normal([hidden1_neuron])),
    'out': tf.Variable(tf.random_normal([2]))
}

x = tf.placeholder(tf.float32, [None, 2])
y = tf.placeholder(tf.float32, [None, 2])

net = Network(x, weight, bias)

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(net, y)
loss = tf.reduce_mean(cross_entropy)

train_op = tf.train.AdamOptimizer(0.2).minimize(loss)

init_op = tf.initialize_all_variables()

xTrain = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
yTrain = np.array([[1, 0], [0, 1], [0, 1], [1, 0]])

with tf.Session() as sess:
    sess.run(init_op)
    for i in range(5000):
        train_data = sess.run(train_op, feed_dict={x: xTrain, y: yTrain})
        loss_val = sess.run(loss, feed_dict={x: xTrain, y: yTrain})
        if(not(i%500)):
            print(loss_val)

    result = sess.run(net, feed_dict={x:xTrain})
    print(result)

您在上面看到的代码实现了具有一个热真输出的异或门。如果我取出tf.nn.relu,网络就会卡住。为什么?

我的问题 #2: 我如何了解网络是否会卡在某个局部最小值 [或某个值] 上?是来自成本函数(或损失函数)的图吗?比如说,对于上面设计的网络,我使用交叉熵作为损失函数。我找不到交叉熵函数的绘图。 (如果你能提供这个,这将非常有帮助。)

我的问题 #3: 注意代码中有一行hidden1_neuron = 10。这意味着我已经设置了隐藏层10中的神经元数量。将神经元数量减少到5 会使网络卡住。那么隐藏层的神经元数量应该是多少呢?

网络正常工作时的输出:

2.42076
0.000456363
0.000149548
7.40216e-05
4.34194e-05
2.78939e-05
1.8924e-05
1.33214e-05
9.62602e-06
7.06308e-06
[[ 7.5128479  -7.58900356]
 [-5.65254211  5.28509617]
 [-6.96340656  6.62380219]
 [ 7.26610374 -5.9665451 ]]

网络卡顿时的输出:

1.45679
0.346579
0.346575
0.346575
0.346574
0.346574
0.346574
0.346574
0.346574
0.346574
[[ 15.70696926 -18.21559143]
 [ -7.1562047    9.75774956]
 [ -0.03214722  -0.03214724]
 [ -0.03214722  -0.03214724]]

【问题讨论】:

标签: machine-learning neural-network tensorflow


【解决方案1】:

问题 1

ReLU 和 Sigmoid 函数都是非线性的。相反,绘制在 ReLU 函数右侧的函数是线性的。应用多个线性激活函数仍然会使网络线性化。

因此,当尝试对非线性问题执行线性回归时,网络会卡住。

问题 2

是的,您必须注意错误率的进展。在较大的问题实例中,您通常会注意测试集上误差函数的开发。这是通过在一段时间的训练后测量网络的准确性来完成的。

问题 3

XOR 问题至少需要 2 个输入、2 个隐藏和 1 个输出节点,即:需要 5 个节点才能用简单的神经网络正确建模 XOR 问题。

【讨论】:

  • 了解第一个。对于第二个,我可以预测神经网络可能会卡在局部最小值上吗?例如,如果您看到 rastrigin 函数,您可以看到它有许多局部最小值。交叉熵也可以这样说吗?我找不到情节。对于第三个,我使用 5 个隐藏层神经元。所以 2 个输入,5 个隐藏,2 个输出(作为一个热真),所以 9 个神经元或节点不起作用?这是为什么呢?
  • 不,您无法预见自己是否正在接近局部最优值,但您很可能会陷入其中之一。有一些技术可以(尝试)避免局部最小值,例如添加动量和使用 dropout。 #3 XOR 问题是一个难以学习的神经网络问题,不清楚为什么您的特定网络难以在 2-5-2 拓扑中高效执行。
  • 我的意思是当你设计一个神经网络时,是否有可能理解隐藏层中的神经元数量应该是多少?或者您假设一个较大的值,然后减少以查看影响。有点像反复试验?顺便说一句,当我在没有一个热真输出的情况下(使用 sigmoid)实现异或门时,它可以学习 2 个输入、2 个隐藏、1 个输出。
  • 猜测/估计给定问题所需的神经元和层数在某种程度上被认为是一门艺术,但不幸的是,答案是否定的。
猜你喜欢
  • 2016-11-28
  • 1970-01-01
  • 2023-03-23
  • 2014-05-09
  • 2015-07-21
  • 2012-03-28
  • 2015-02-04
  • 2019-03-15
  • 2016-05-13
相关资源
最近更新 更多