为什么在Tensorflow简单神经网络示例中再添加一层图会打破它?

时间:2017-06-16 12:07:48

标签: python tensorflow neural-network activation-function

以下是this webiste.(基于MNIST),完整代码,大约0.92准确度:

W = tf.Variable(tf.zeros([784, 100]))
b = tf.Variable(tf.zeros([100]))
h0 = tf.nn.relu(tf.matmul(x, W) + b)

W2 = tf.Variable(tf.zeros([100, 10]))
b2 = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(h0, W2) + b2)

问题:为什么添加一个额外的图层,就像下面的代码一样,会让它变得更糟,以至于精确度下降到0.11左右?

{
    xtype: 'combo',
    anchor: '100%',
    reference: 'il',
    fieldLabel: 'İl',
    name: 'il',
    forceSelection: true,
    typeAhead: true,
    displayField: 'il',
    store: 'il',
    cls :'text-font',
    baseCls :'fieldcolor',
    valueField: 'il'
},
{
    xtype: 'combobox',
    anchor: '100%',
    reference: 'ilce',
    fieldLabel: 'İlce',
    name: 'ilce',
    forceSelection: true,
    typeAhead: true,
    displayField: 'ilce',
    store: 'ilce',
    filters: {
        property: 'il',
        value: 'ilid'
    },
    cls :'text-font',
    baseCls :'fieldcolor',
    valueField: 'ilce'
},

2 个答案:

答案 0 :(得分:6)

该示例未正确初始化权重,但没有隐藏层,结果证明该演示所做的有效线性softmax回归不受该选择的影响。将它们全部设置为零是安全的,但仅适用于单层网络

当你建立一个更深的网络时,这是一个灾难性的选择。你必须使用不相等的神经网络权重初始化,通常的快速方法是随机的。

试试这个:

W = tf.Variable(tf.random_uniform([784, 100], -0.01, 0.01))
b = tf.Variable(tf.zeros([100]))
h0 = tf.nn.relu(tf.matmul(x, W) + b)

W2 = tf.Variable(tf.random_uniform([100, 10], -0.01, 0.01))
b2 = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(h0, W2) + b2)

您需要这些不相同权重的原因与背向传播的工作原理有关 - 图层中权重的值决定了图层计算渐变的方式。如果所有权重都相同,那么所有梯度都是相同的。这反过来意味着所有权重更新都是相同的 - 一切都在锁步中变化,并且行为类似于隐藏层中有一个单个神经元(因为你有多个神经元都具有相同的参数),它可以有效地只选择一个类。

答案 1 :(得分:2)

尼尔很好地解释了你如何解决问题,我会补充一点解释为什么会这样。

问题不在于渐变是完全相同的,而在于它们都是0的事实。这发生在relu(Wx + b) = 0 W = 0b = 0时。甚至有一个名字 - 死神经元。

网络根本没有进展,无论你是否为1分钟训练1步都没关系。结果与随机选择没有什么不同,你可以用0.11的准确度看到它(如果你随机选择东西你会得到0.10)。