2016-03-16 9 views
5

私は、単一変数線形勾配降下の単純な実装から始めましたが、それを多変量確率勾配降下アルゴリズムに拡張することを知らないのですか?テンソルフローで多変量線形確率勾配降下アルゴリズムを実装する方法は?

シングル変数線形回帰

import tensorflow as tf 
import numpy as np 

# create random data 
x_data = np.random.rand(100).astype(np.float32) 
y_data = x_data * 0.5 

# Find values for W that compute y_data = W * x_data 
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) 
y = W * x_data 

# Minimize the mean squared errors. 
loss = tf.reduce_mean(tf.square(y - y_data)) 
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. 
for step in xrange(2001): 
    sess.run(train) 
    if step % 200 == 0: 
     print(step, sess.run(W)) 

答えて

7

あなたの質問に2つの部分があります。高次元空間にこの問題を変更する方法

  • を。
  • バッチ勾配から確率的勾配降下に変更する方法。

より高い次元設定を得るには、線形問題y = <x, w>を定義することができます。次に、変数Wの次元をwの1に一致するように変更し、乗算W*x_dataをスカラープロダクトtf.matmul(x_data, W)に置き換えて、コードを正しく実行する必要があります。

学習方法を確率勾配降下に変更するには、tf.placeholderを使用してコスト関数の入力を抽象化する必要があります。
各ステップで入力を保持するXy_を定義すると、同じコスト関数を構築できます。次に、データの適切なミニバッチを供給して、あなたのステップを呼び出す必要があります。

このような動作を実装する方法の例を示します。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を参照してください。これは、問題の設定とあなたが探している統計プロパティに応じて簡単に変更できます。

+0

各ステップでデータをランダムにシャッフルする必要はありませんでしたか? –

+0

ウィキペディアの記事によると、反復バージョンでは、各ポイントでトレーニングを実行する必要がありますが、トレーニングでは更新のためのデータポイントは1つまたは1つだけです –

+0

で行ったことはありませんn_batch = N // 100 + (N%100!= 0) –

関連する問題