反向传播算法卡在训练和功能上

时间:2017-03-05 22:46:49

标签: python machine-learning tensorflow neural-network

以下是使用tensorflow的单个神经元的AND函数的实现:

def tf_sigmoid(x):
    return 1 / (1 + tf.exp(-x))

data = [
    (0, 0),
    (0, 1),
    (1, 0),
    (1, 1),
]

labels = [
    0,
    0,
    0,
    1,
]

n_steps = 1000
learning_rate = .1

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

w = tf.get_variable('W', shape=[2], initializer=tf.random_normal_initializer(), dtype=tf.float32)
b = tf.get_variable('b', shape=[], initializer=tf.random_normal_initializer(), dtype=tf.float32)

h = tf.reduce_sum(x * w) + b
output = tf_sigmoid(h)

error = tf.abs(output - y)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(error)
sess.run(tf.initialize_all_variables())


for step in range(n_steps):
    for i in np.random.permutation(range(len(data))):
        sess.run(optimizer, feed_dict={x: data[i], y: labels[i]})

有时它完美无缺,但在某些参数上它会卡住并且不想学习。例如,使用这些初始参数:

w = tf.Variable(initial_value=[-0.31199348, -0.46391705], dtype=tf.float32)
b = tf.Variable(initial_value=-1.94877, dtype=tf.float32)

它几乎不会改善成本函数。我做错了什么,也许我应该以某种方式调整参数的初始化?

1 个答案:

答案 0 :(得分:2)

您是否错过了mean(error)

您的问题是sigmoid,cost函数和优化器的特定组合。

不要心疼,AFAIK这个确切的问题使整个领域停滞了几年。

当你离中间很远时,Sigmoid是平的,你用相对较大的数字初始化它,试试/ 1000。

所以你的abs-error(或平方误差)也是平坦的,而GradientDescent优化器采取与斜率成比例的步骤。

其中任何一个都应该解决它:

使用cross-entropy表示错误 - 它是凸的。

使用更好的优化工具,例如Adam ,谁的步长不太依赖于斜率。更多关于坡度的一致性。

奖励:不要滚动自己的sigmoid,使用tf.nn.sigmoid,你会减少NaN的数量。

玩得开心!