行列分解の問題であるTensorflowで非常に単純な最適化を試みています。与えられた行列V (m X n)
は、それをW (m X r)
とに分解します。私はhereから行列分解のための勾配降下ベースのテンソルフローベースの実装を借りています。元の形式の行列V.約行列最適化のためのTensorflowにおける最適な変数の初期化と学習率
詳細を次のように、エントリのヒストグラムは次のようになります
の規模にエントリもたらすために[0、1]、私は、次の前処理を行います。
f(x) = f(x)-min(V)/(max(V)-min(V))
私の質問は次のとおりです。0と1と最も近いエントリ間:データの性質を考えると
- 1より0までの場合、
W
とH
の最適な初期化は何ですか? - 異なるコスト関数に基づいて学習率を定義する方法:
|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になるのはおそらく遅すぎたでしょう。
マトリクス分解の問題に対して、良い初期化と学習率を定義するための経験則があるかどうか疑問に思っていました。
質問は非常にしかし、学習速度と初期化行列のような調整パラメータは、通常、対処されている問題に依存しており、オプティマイザのドキュメントで提供されているものよりも良い**意見**を得られません。 – rll
@ rll:あなたの意見を理解していますので、この問題を編集して、この問題に関連するデータの正確な性質について詳しく説明しました(データは0と1の間で正規化されています) –
私は、最適な学習率と初期化行列は、あなたのデータ/問題のステートメントが含まれており、手動チューニングが必要な場合があります。ところで、リンクしたコード例では、負でない行列分解を解いています。 'W'や' H'にもこの制約がありますか? 'W'と' H'は任意の行列ですか? – kaufmanu