Tensorflowによる連続値推定。

Tensorflowの最終的な出力が、分類ではなく何らかの連続値であってほしい場合がある。世間ではDeep Learning = 画像分類みたいなイメージが定着しているためか、サンプルを探してもそのようなものばかりであるが、連続値推定も可能である。例えば素粒子実験において、ある粒子の情報を入力してそのエネルギーを推定させたりできる。

方法は難しくない。通常、最終的な出力はsigmoid関数やsoftmax関数などの活性化関数を通し、交差エントロピー関数を最小化するようにフィッティングさせるが、活性化関数は結果を0か1に選り分けてしまうのでよろしくない。したがって、活性化関数を通さなければよい。そして交差エントロピー関数ではなくよくある最小二乗法のように、真の値に対する誤差のRMSを最小化させれば良い。

極めてシンプルな例を書くと、次のような感じだ。

x = tf.placeholder(tf.float32, shape = (None, n_in))
t = tf.placeholder(tf.float32, shape = (None, n_out))

w = tf.Variable(tf.random.truncated_normal([n_in, n_hidden]))
b = tf.Variable(tf.random.truncated_normal([n_hidden]))
h = tf.nn.sigmoid(tf.matmul(x, w) + b)

v = tf.Variable(tf.random.truncated_normal([n_hidden, 1]))
c = tf.Variable(tf.random.truncated_normal([1]))
y = tf.matmul(h, v) + c

loss = tf.reduce_mean(tf.square(t - y))
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

真の値tに対して、推定値yのずれの二乗値を最小化させているだけである。もちろんRMSが望ましくない場合もあるだろうから、ユーザーが望むようにlossの式の形を変えること。