以下是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'
},
答案 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 = 0
和b = 0
时。甚至有一个名字 - 死神经元。
网络根本没有进展,无论你是否为1分钟训练1步都没关系。结果与随机选择没有什么不同,你可以用0.11的准确度看到它(如果你随机选择东西你会得到0.10)。