neural-network - 为什么 XOR 函数的这种变体并不总是收敛?

标签 neural-network tensorflow

我正在尝试在 TensorFlow 中实现一个简单的异或门。我的问题是我的函数并不总是收敛。

如果我没记错的话,异或空间没有局部最小值,所以我不明白为什么会发生这种情况。

--

我看到这个答案:https://stackoverflow.com/a/33750395/2131871 ,并且它总是收敛的。 我从 @mrry 的答案中获取了代码并对其进行了稍微修改,这样它就不再有两个输出节点,而是只有一个,我使用 tanh 激活函数而不是 relu 和 softmax 并调整了 cross_entropy 函数。

import math
import tensorflow as tf
import numpy as np

HIDDEN_NODES = 10

x = tf.placeholder(tf.float32, [None, 2])
W_hidden = tf.Variable(tf.truncated_normal([2, HIDDEN_NODES], stddev=1./math.sqrt(2)))
b_hidden = tf.Variable(tf.zeros([HIDDEN_NODES]))
hidden = tf.tanh(tf.matmul(x, W_hidden) + b_hidden)

W_logits = tf.Variable(tf.truncated_normal([HIDDEN_NODES, 1], stddev=1./math.sqrt(HIDDEN_NODES)))
b_logits = tf.Variable(tf.zeros([1]))
logits = tf.matmul(hidden, W_logits) + b_logits
y = tf.tanh(logits)

y_input = tf.placeholder(tf.float32, [None, 1])

cross_entropy = tf.abs(tf.sub(y_input, y))
loss = tf.reduce_mean(cross_entropy)

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

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

for d in xrange(20):
    init_op = tf.initialize_all_variables()

    sess = tf.Session()
    sess.run(init_op)

    for i in xrange(500):
      _, loss_val = sess.run([train_op, loss], feed_dict={x: xTrain, y_input: yTrain})

      if i % 10 == 0:
        print "Step:", i, "Current loss:", loss_val
        for x_input in [[0, 0], [0, 1], [1, 0], [1, 1]]:
          print x_input, sess.run(y, feed_dict={x: [x_input]})
    assert loss_val < 0.01

有人可以解释一下为什么我的解决方案有时无法收敛吗?谢谢。

最佳答案

您计算错误的方式很容易让您的网络陷入局部最小值。我怀疑这是因为当从现有解决方案转移时,异或函数的 l1 范数有太多等权差的解决方案。 (但我并不肯定 - 机器学习专家可以在这里给你更准确的答案。我只是一个系统傻瓜。)

简单修复:替换这些行:

cross_entropy = tf.abs(tf.sub(y_input, y))
loss = tf.reduce_mean(cross_entropy)

与:

loss = tf.nn.l2_loss(y_input - y)

关于neural-network - 为什么 XOR 函数的这种变体并不总是收敛?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33967634/

相关文章:

ubuntu - tensorflow 导入错误:/home/user/anaconda3/bin/. ./lib/libstdc++.so.6:找不到版本 `GLIBCXX_3.4.20'

machine-learning - 将一个输入应用于 tensorflow session 并获取输出

python - tf.contrib.rnn.DropoutWrapper的state_keep_prob和output_keep_prob参数有什么区别

neural-network - 如何在无监督学习中使用 Encog NEAT 网络?

machine-learning - 为什么 ANN 中需要 BIAS?我们应该为每一层设置单独的 BIAS 吗?

neural-network - softmax 函数解释的导数

python - 为什么激活值 (Softmax) 的预测会给出错误的结果?

optimization - Keras 中的 Adam 优化器有动量选项吗?

tensorflow - ValueError : Input 0 is incompatible with layer model: expected shape=(None, 14999, 7), 找到形状=(None, 7)

java - Tensorflow Java API 设置分类列的占位符