在我使用梯度下降法实现了一个简单线性回归问题的LS估计后,我现在尝试使用最大似然法做同样的事情。我使用了来自维基百科的这个方程。需要找到最大值。
train_X = np.random.rand(100, 1) # 所有值 [0-1)train_Y = train_XX = tf.placeholder("float", None)Y = tf.placeholder("float", None)theta_0 = tf.Variable(np.random.randn())theta_1 = tf.Variable(np.random.randn())var = tf.Variable(0.5)hypothesis = tf.add(theta_0, tf.mul(X, theta_1))lhf = 1 * (50 * np.log(2*np.pi) + 50 * tf.log(var) + (1/(2*var)) * tf.reduce_sum(tf.pow(hypothesis - Y, 2)))op = tf.train.GradientDescentOptimizer(0.01).minimize(lhf)
这个代码可以工作,但我对它仍然有一些疑问:
- 如果我将lhf函数从
1 *
改为-1 *
并最小化-lhf
(根据方程),它就不工作了。但这是为什么呢? - 在优化过程中,lhf的值上升和下降。难道它不应该只朝一个方向变化吗?
- 在优化过程中,lhf的值有时会变成NaN。我怎样才能避免这种情况?
- 在方程中,σ²是误差的方差(对吗?)。我的值完美地在一条直线上。为什么我得到的var值会超过100?
回答:
您的问题中的症状表明了一个常见的问题:学习率或步长可能对该问题来说太高了。
当学习率过高时,函数值呈锯齿形上升和下降是常见的现象,尤其是在出现NaN值时。
最简单的解决方案是降低学习率,通过将当前学习率除以10,直到学习曲线平滑且没有NaN值或上下波动行为。
由于您使用的是TensorFlow,您也可以尝试使用AdamOptimizer,因为它会在训练过程中动态调整学习率。