あなたの質問に2つの部分があります。高次元空間にこの問題を変更する方法
- を。
- バッチ勾配から確率的勾配降下に変更する方法。
より高い次元設定を得るには、線形問題y = <x, w>
を定義することができます。次に、変数W
の次元をw
の1に一致するように変更し、乗算W*x_data
をスカラープロダクトtf.matmul(x_data, W)
に置き換えて、コードを正しく実行する必要があります。
学習方法を確率勾配降下に変更するには、tf.placeholder
を使用してコスト関数の入力を抽象化する必要があります。
各ステップで入力を保持するX
とy_
を定義すると、同じコスト関数を構築できます。次に、データの適切なミニバッチを供給して、あなたのステップを呼び出す必要があります。
このような動作を実装する方法の例を示します。W
がすぐにw
に収束することを示す必要があります。
import tensorflow as tf
import numpy as np
# Define dimensions
d = 10 # Size of the parameter space
N = 1000 # Number of data sample
# create random data
w = .5*np.ones(d)
x_data = np.random.random((N, d)).astype(np.float32)
y_data = x_data.dot(w).reshape((-1, 1))
# Define placeholders to feed mini_batches
X = tf.placeholder(tf.float32, shape=[None, d], name='X')
y_ = tf.placeholder(tf.float32, shape=[None, 1], name='y')
# Find values for W that compute y_data = <x, W>
W = tf.Variable(tf.random_uniform([d, 1], -1.0, 1.0))
y = tf.matmul(X, W, name='y_pred')
# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y_ - y))
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# Before starting, initialize the variables
init = tf.initialize_all_variables()
# Launch the graph.
sess = tf.Session()
sess.run(init)
# Fit the line.
mini_batch_size = 100
n_batch = N // mini_batch_size + (N % mini_batch_size != 0)
for step in range(2001):
i_batch = (step % n_batch)*mini_batch_size
batch = x_data[i_batch:i_batch+mini_batch_size], y_data[i_batch:i_batch+mini_batch_size]
sess.run(train, feed_dict={X: batch[0], y_: batch[1]})
if step % 200 == 0:
print(step, sess.run(W))
両側注:
以下の実装は、各ステップでのようなミニバッチ勾配降下と呼ばれ、勾配はサイズmini_batch_size
の我々のデータのサブセットを使用して計算されます。これは確率的勾配降下からの変形であり、通常は各ステップでの勾配の推定を安定させるために使用されます。確率的な勾配降下は、mini_batch_size = 1
を設定することによって得ることができる。
データセットは、理論的考察に近い実装を得るために、各エポックごとにシャッフルすることができます。いくつかの最近の研究では、過大なフィッティングを防ぐため、データセットを1回だけ通過させることも検討しています。より数学的で詳細な説明については、Bottou12を参照してください。これは、問題の設定とあなたが探している統計プロパティに応じて簡単に変更できます。
各ステップでデータをランダムにシャッフルする必要はありませんでしたか? –
ウィキペディアの記事によると、反復バージョンでは、各ポイントでトレーニングを実行する必要がありますが、トレーニングでは更新のためのデータポイントは1つまたは1つだけです –
で行ったことはありませんn_batch = N // 100 + (N%100!= 0) –