Tensorflowを用いたロジスティック回帰で重みがnanになる
『機械学習 はじめよう 第20回』を参考にして、ロジスティック回帰をTensorflowを用いて実装しようと考えていますが、重み・バイアスがすぐにnanになってしまいます。
調べたところ、対数尤度関数のlogが怪しい、ということでlogの中身に小さい数(1e-5など)を足してみたりしましたが変わりませんでした。
Tensorflowにも不慣れですので他の部分にも不具合があるかもしれません。
何が原因と考えられますでしょうか。
ご教授いただければ幸いです。
list: logistic_tf.py
import numpy as np
import tensorflow as tf
def sigmoid(z):
return 1.0 / (1.0 + tf.exp(-z))
x_d = tf.placeholder(tf.float32, shape=(None, 2), name='x_d')
t_d = tf.placeholder(tf.float32, shape=(None, ), name='t_d')
W = tf.Variable(tf.zeros([2, 1]))
b = tf.Variable(tf.zeros([1]))
t = sigmoid(tf.matmul(x_d, W) + b)
loss = - tf.reduce_sum(t_d * tf.log(t) + (1 - t_d) * tf.log(1 - t))
optimizer = tf.train.GradientDescentOptimizer(0.1)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
# create data set
def h(x, y):
return 5 * x + 3 * y - 1
x_data = np.random.randn(100, 2).astype('float32')
t_data = np.array([1 if h(x, y) > 0 else 0 for x, y in x_data])
for step in range(200):
sess.run(train, feed_dict={x_d: x_data, t_d: t_data})
if step % 10 == 0:
print(step, sess.run(W), sess.run(b))
# W = [[5], [3]], b = [-1], expected
sess.close()
9/27追記
学習率を0.1から0.01, 0.001と下げたところ、0.01ではnanになりました。0.001ではnanは回避できましたが、期待される値とは別のところで振動してしまいました。損失関数が間違っているということでしょうか。どのように修正すべきでしょうか。
学習率0.001のときの出力
0 [[ 0.33279842]
[-0.0880626 ]] [-1.4000001]
1000 [[ 1.2017732 ]
[-0.18360852]] [-2.0046742]
2000 [[ 1.2017722 ]
[-0.18360843]] [-2.0046737]
3000 [[ 1.2017732 ]
[-0.18360852]] [-2.0046742]
4000 [[ 1.2017722 ]
[-0.18360843]] [-2.0046737]
5000 [[ 1.2017732 ]
[-0.18360852]] [-2.0046742]
6000 [[ 1.2017722 ]
[-0.18360843]] [-2.0046737]
7000 [[ 1.2017732 ]
[-0.18360852]] [-2.0046742]
8000 [[ 1.2017722 ]
[-0.18360843]] [-2.0046737]
9000 [[ 1.2017732 ]
[-0.18360852]] [-2.0046742]