確率分布を回復しようとしています (確率密度ではなく、[0,1] の範囲の関数で、x での観測の成功確率を f(x) でエンコードします)。10 個のニューロンとソフトマックスを持つ隠れ層を使用します。これが私のコードです:
import tensorflow as tf
import numpy as np
import random
import math
#Make binary observations encoded as one-hot vectors.
def makeObservations(probabilities):
observations = np.zeros((len(probabilities),2), dtype='float32')
for i in range(0, len(probabilities)):
if random.random() <= probabilities[i]:
observations[i,0] = 1
observations[i,1] = 0
else:
observations[i,0] = 0
observations[i,1] = 1
return observations
xTrain = np.linspace(0, 4*math.pi, 2001).reshape(1,-1)
distribution = map(lambda x: math.sin(x)**2, xTrain[0])
yTrain = makeObservations(distribution)
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
x = tf.placeholder("float", [1,None])
hiddenDim = 10
b = bias_variable([hiddenDim,1])
W = weight_variable([hiddenDim, 1])
b2 = bias_variable([2,1])
W2 = weight_variable([2, hiddenDim])
hidden = tf.nn.sigmoid(tf.matmul(W, x) + b)
y = tf.transpose(tf.matmul(W2, hidden) + b2)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, yTrain))
step = tf.Variable(0, trainable=False)
rate = tf.train.exponential_decay(0.2, step, 1, 0.9999)
optimizer = tf.train.AdamOptimizer(rate)
train = optimizer.minimize(loss, global_step=step)
predict_op = tf.argmax(y, 1)
sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
for i in range(50001):
sess.run(train, feed_dict={x: xTrain})
if i%200 == 0:
#proportion of correct predictions
print i, np.mean(np.argmax(yTrain, axis=1) ==
sess.run(predict_op, feed_dict={x: xTrain}))
import matplotlib.pyplot as plt
ys = tf.nn.softmax(y).eval({x:xTrain}, sess)
plt.plot(xTrain[0],ys[:,0])
plt.plot(xTrain[0],distribution)
plt.plot(xTrain[0], yTrain[:,0], 'ro')
plt.show()
質問:
tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, yTrain))
クロスエントロピーを最小限に抑えてソフトマックスを手動で実行することと適用することの違いは何ですか?
モデルが分布の最後の期間にスナップしないのは一般的です。私はそれを一度だけ成功させました。トレーニングをさらに実行することで修正される可能性がありますが、最後の ~20k の実行で結果が安定することが多いため、そのようには見えません。最適化アルゴリズムをより適切に選択するか、隠れ層を増やすか、隠れ層の次元を増やすことで改善される可能性が最も高いでしょうか? (編集によって部分的に回答されました)
x=0 に近い異常は典型的なものです。それらの原因は何ですか?
編集:フィット感が大幅に向上しました
hiddenDim = 15
(...)
optimizer = tf.train.AdagradOptimizer(0.5)
アクティベーションをシグモイドから tanh に変更します。
その他の質問:
隠れ次元が高いほど、極小値から抜け出すのが容易になるのは一般的ですか?
隠れ層の最適な次元と入力の次元の間のおおよその典型的な関係は何dim(hidden) = f(dim(input))
ですか? 線形か、線形より弱いか、線形より強いか?