2

確率分布を回復しようとしています (確率密度ではなく、[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()

以下に 2 つの典型的な結果を示します。 ここに画像の説明を入力 ここに画像の説明を入力

質問:

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))ですか? 線形か、線形より弱いか、線形より強いか?

4

1 に答える 1

1

左はオーバーフィット、右はアンダーフィットです。

ランダム バイアスが小さいため、隠れユニットはすべて の近くでほぼゼロのアクティベーションを取得しx=0、x 値の非対称性と広い範囲のために、ほとんどの隠れユニットは の周りで飽和しx = 10ます。

勾配は飽和した単位を通過できないため、それらはすべて使い果たされて、ゼロに近い、感じることができる値にオーバーフィットします。

データを中心に置くと役立つと思いx=0ます。weight-initialization-variance を減らしたり、bias-initialization-variance を増やしたり (または同等に、データの範囲を のように小さな領域に減らしたり[-1,1]) してみてください。

RBF を使用し、それらをすべてゼロ近くで初期化すると、同じ問題が発生します。線形シグモイド ユニットでは、2 番目のレイヤーは線形シグモイドのペアを使用して RBF を作成します。

于 2015-11-17T02:00:06.147 に答える