python - TensorFlow GradientDescentOptimizer 未达到预期成本

标签 python machine-learning tensorflow

我正在复习 Andrew Ng 的 ML 类(class)中所做的 Material ,并尝试在 TensorFlow 中实现它。我能够使用 scipy 的 optimize 函数获得 0.213 的成本,但使用 TensorFlow,它停留在 0.622,与初始损失 0.693 相差不远 使用一组初始权重为零。

我查看了该帖子here并向我的损失函数添加了 tf.maximum 调用以防止出现 NaN。我不相信这是正确的方法,但我确信有更好的方法。我还尝试使用 tf.clip_by_value 代替,但这给出了相同的非优化成本。

iterations = 1500

with tf.Session() as sess:
    X = tf.placeholder(tf.float32)
    y = tf.placeholder(tf.float32)
    theta = tf.Variable(tf.zeros([3,1]), dtype=tf.float32)
    training_rows = tf.placeholder(tf.float32)
    z = tf.matmul(X, theta)
    h_x = 1.0 / (1.0 + tf.exp(-z)) 
    lhs = tf.matmul(tf.transpose(-y), tf.log(tf.maximum(1e-5, h_x)))
    rhs = tf.matmul(tf.transpose((1 - y)), tf.log(tf.maximum(1e-5, 1 - h_x)))
    loss = tf.reduce_sum(lhs - rhs) / training_rows
    alpha = 0.001
    optimizer = tf.train.GradientDescentOptimizer(alpha)
    train = optimizer.minimize(loss)

    # Run the session
    X_val, y_val = get_data()
    rows = X_val.shape[0]
    kwargs = {X: X_val, y: y_val, training_rows: rows}
    sess.run(tf.global_variables_initializer())
    sess.run(tf.assign(theta, np.array([0,0,0]).reshape(3,1)))
    print("Original cost before optimization is: {}".format(sess.run(loss, kwargs)))
    print("Optimizing loss function")
    costs = []
    for i in range(iterations):
        optimal_theta, result = sess.run([theta, train], {X: X_val, y: y_val, training_rows: rows})
        cost = sess.run(loss, kwargs)
        costs.append(cost)
    optimal_theta,loss = sess.run([theta, loss], {X: X_val, y: y_val, training_rows: rows})
    print("Optimal value for theta is: {} with a loss of: {}".format(optimal_theta, loss))
    plt.plot(costs)
    plt.show()

我还注意到,任何大于 0.001 的学习率都会导致优化器随着损失而疯狂地来回跳动。这正常吗?最后,当我尝试将迭代次数增加到 25,000 次时,我意识到成本降至 0.53。我预计它会在更少的迭代中收敛。

最佳答案

为了解决这个问题,我学到了很多东西。到目前为止,我还没有意识到损失函数的这一部分可能存在问题:

loss = -y log(h(x)) + (1 - y) (log(1 - h(x)))

如果 sigmoid 函数 h(x) 结果为 1(如果 z,即 X * theta 很大,则可能会发生这种情况),那么我们将评估 log(1 - 1) = log (0),这是无限的。

为了解决这个问题,我必须使用特征缩放来规范化 X 的值。这确保了 X * theta 更小,并且类似地 z,sigmoid 函数不会得出 1。当 z 变大时,e ^-z 趋向于零。因此,使用特征缩放可确保 z 中的值相对较小,并且 e^-z 将具有可以在分母计算中添加到 1 的实际值:

z = 1 / (1 + e^-(X*theta))

作为引用,特征缩放仅意味着减去平均值并除以范围。

(arr - mean) / (max - min)

关于python - TensorFlow GradientDescentOptimizer 未达到预期成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46803880/

相关文章:

Python:分部分读取文本文件

python - 展平层的输入必须是张量

python - 如何在 Windows 上重新训练图像

tensorflow - 在聊天机器人中处理上下文

python - SOAP suds 和可怕的模式未找到类型错误

python - Hadoop Spark 1.4.1 - 对多个 CSV 文件进行排序并将排序后的结果保存在 1 个输出文件中

python - 寻找一点 python 机器学习建议

machine-learning - sklearn : Categorical Imputer?

python - python中多类数据的真阳性率和假阳性率(TPR,FPR)

c++ - 指定输入/输出节点以在加载了 C++ API 的模型上运行 TensorFlow 1.0+ 中的推理