XOR门与神经网络

Shu*_*his 5 machine-learning neural-network tensorflow

我试图用tensorflow实现一个XOR门.我成功地实现了这一点,但我不完全理解为什么它有效.我在这里这里得到了stackoverflow帖子的帮助.所以有one hot truewithout one hot true输出.这是我理解的网络,以便清楚地说明问题.神经网络可视化

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

RELU

现在,如果第一个函数有效,为什么不是第二个函数呢?从我的角度来看,RELU通过组合多个线性函数来实现非线性.所以两者都是线性函数(上面两个).如果第一个实现非线性,第二个也应该实现,不应该吗?问题是,没有使用RELU网络卡住的原因?

具有一个热输出的XOR门

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)
Run Code Online (Sandbox Code Playgroud)

您在上面看到的代码实现了具有一个热真输出的XOR门.如果我拿出来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 ]]
Run Code Online (Sandbox Code Playgroud)

网络卡住时的输出:

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]]
Run Code Online (Sandbox Code Playgroud)

jor*_*nkg 5

问题1

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

因此,当尝试对非线性问题执行线性回归时,网络会陷入困境。

问题2

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

问题3

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