2017-03-28 14 views
9

行列分解の問題であるTensorflowで非常に単純な最適化を試みています。与えられた行列V (m X n)は、それをW (m X r)とに分解します。私はhereから行列分解のための勾配降下ベースのテンソルフローベースの実装を借りています。元の形式の行列V.約行列最適化のためのTensorflowにおける最適な変数の初期化と学習率

詳細を次のように、エントリのヒストグラムは次のようになります enter image description here

の規模にエントリもたらすために[0、1]、私は、次の前処理を行います。

f(x) = f(x)-min(V)/(max(V)-min(V)) 

正規化した後、データのヒストグラムは次のようになり、次の enter image description here

私の質問は次のとおりです。0と1と最も近いエントリ間:データの性質を考えると

  1. 1より0までの場合、WHの最適な初期化は何ですか?
  2. 異なるコスト関数に基づいて学習率を定義する方法: |A-WH|_Fおよび|(A-WH)/A|?次のように

最小の実施例は、次のようになります。このよう

import tensorflow as tf 
import numpy as np 
import pandas as pd 

V_df = pd.DataFrame([[3, 4, 5, 2], 
       [4, 4, 3, 3], 
       [5, 5, 4, 4]], dtype=np.float32).T 

、V_dfは次のようになります。今

0 1 2 
0 3.0 4.0 5.0 
1 4.0 4.0 5.0 
2 5.0 3.0 4.0 
3 2.0 3.0 4.0 

、コード定義W、H

V = tf.constant(V_df.values) 
shape = V_df.shape 
rank = 2 #latent factors 

initializer = tf.random_normal_initializer(mean=V_df.mean().mean()/5,stddev=0.1) 
#initializer = tf.random_uniform_initializer(maxval=V_df.max().max()) 

H = tf.get_variable("H", [rank, shape[1]], 
           initializer=initializer) 
W = tf.get_variable(name="W", shape=[shape[0], rank], 
           initializer=initializer) 
WH = tf.matmul(W, H) 

コストとオプティマイザの定義:

私は initializer = tf.random_uniform_initializer(maxval=V_df.max().max())のようなものを使用したとき、私は彼らの製品は、私はまた、学習率を維持することを実現V.よりもはるかに大きくなるようにしたW行列を持って、H気づい

max_iter=10000 
display_step = 50 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    for i in xrange(max_iter): 

     loss, _ = sess.run([f_norm, optimize]) 
     if i%display_step==0: 
      print loss, i 
    W_out = sess.run(W) 
    H_out = sess.run(H) 
    WH_out = sess.run(WH) 

:セッションを実行

f_norm = tf.reduce_sum(tf.pow(V - WH, 2)) 
lr = 0.01 
optimize = tf.train.AdagradOptimizer(lr).minimize(f_norm) 

lr)が.0001になるのはおそらく遅すぎたでしょう。

マトリクス分解の問題に対して、良い初期化と学習率を定義するための経験則があるかどうか疑問に思っていました。

+2

質問は非常にしかし、学習速度と初期化行列のような調整パラメータは、通常、対処されている問題に依存しており、オプティマイザのドキュメントで提供されているものよりも良い**意見**を得られません。 – rll

+0

@ rll:あなたの意見を理解していますので、この問題を編集して、この問題に関連するデータの正確な性質について詳しく説明しました(データは0と1の間で正規化されています) –

+2

私は、最適な学習率と初期化行列は、あなたのデータ/問題のステートメントが含まれており、手動チューニングが必要な場合があります。ところで、リンクしたコード例では、負でない行列分解を解いています。 'W'や' H'にもこの制約がありますか? 'W'と' H'は任意の行列ですか? – kaufmanu

答えて

1

学習率の選択は、最適な値を見つけるための2番目のアルゴリズムをデバイスに設定しない限り、試行錯誤の経験的な問題だと思います。また、利用可能なコンピューティングリソースがあれば、計算が完了するまでにどれくらい時間がかかっているかによっても実用上の問題になります。

ただし、機械の学習上の問題によっては、初期値と学習速度を設定するときに値が収束しないため注意が必要です。経験則の1つは、手動でマグニチュードを10段階ではなく3段階で変更することです(Andrew Ngによる)。0.1から1.0に移動する代わりに、0.1から0.3になります。

0に近い複数の値を特定する特定のデータについては、特定の「仮説」/モデルで最適な初期値を見つけることができます。ただし、「最適」を定義する必要があります。方法はできるだけ早く、可能な限り正確に、またはこれらの極端な点の中間点でなければなりませんか?しかし、正確な解を求める際に正確さが必ずしも問題になるわけではありませんが、停止ルールの選択と誤差を減らす基準が結果に影響を与える可能性があります)

このセットの最適なパラメータが見つかったとしても他のデータセットに同じ式を使用すると問題が発生する可能性があります。別の問題に同じパラメータを使用したい場合は、他のデータセットが同様の分布に従うことを期待する理由がない限り、一般性が失われます。

確率的な確率的なグラディエントを使用している特定のアルゴリズムについては、簡単な答え*がないようです。 TensorFlowドキュメントは、2つのソースを指す:

*「アップデートで良い行列Bを選択すると...、実質的に標準勾配法を改善することができます...多くの場合、しかし、そのような選択は明らかではなく、確率的に設定することをうまくいけば明らかです。 ..この行列をどのように選択するかは非常に明白ではありません。さらに、多くの確率的設定では、データが単純にストリームに到着するため、私たちが最小化している真の関数を知らず、優れた距離生成行列を事前計算することは不可能です」。Duchi & Singer, 2013, p. 5

関連する問題