1. ホーム
  2. python

[解決済み] tf.multiply vs tf.matmul による内積の計算

2022-02-28 08:42:06

質問

形状が [3,4] の行列(ベクトル)X があり、各対のベクトル (X[1].X[1]) と (X[1].X[2]) の間の内積を計算したい...など。

コサインの類似性のコードを見ました。

tf.reduce_sum(tf.multyply(X, X),axis=1)

で、ベクトル行列のベクトル間の内積を計算します。しかし、この結果は、(X[i], X[i]) の間の内積を計算するだけです。

私はすべての2つのベクトル間の内積を計算するtf.matmul(X、X、transpose_b=True)を使用しましたが、私はまだtf.multiplyがこれをしなかった理由私は私のコードに問題があると思います混乱しています。

というコードです。

data=[[1.0,2.0,4.0,5.0],[0.0,6.0,7.0,8.0],[8.0,1.0,1.0,1.0]]
X=tf.constant(data)
matResult=tf.matmul(X, X, transpose_b=True)

multiplyResult=tf.reduce_sum(tf.multiply(X,X),axis=1)
with tf.Session() as sess:
   print('matResult')
   print(sess.run([matResult]))
   print()
   print('multiplyResult')
   print(sess.run([multiplyResult]))

と出力されます。

matResult
[array([[  46.,   80.,   19.],
       [  80.,  149.,   21.],
       [  19.,   21.,   67.]], dtype=float32)]

multiplyResult
 [array([  46.,  149.,   67.], dtype=float32)]

何かアドバイスがありましたらお願いします。

どのように解決するのですか?

tf.multiply(X, Y) または * 演算子は 要素ごとの乗算 というように

[[1 2]    [[1 3]      [[1 6]
 [3 4]] .  [2 1]]  =   [6 4]]

ところが tf.matmul が行います。 行列の乗算 というように

[[1 0]    [[1 3]      [[1 3]
 [0 1]] .  [2 1]]  =   [2 1]]

を使って tf.matmul(X, X, transpose_b=True) を計算することを意味します。 X . X^T ここで ^T は行列の転置を表し . は行列の乗算です。

tf.reduce_sum(_, axis=1) は、第1軸(0から数え始める)に沿って合計を取り、これは行の合計を意味します。

tf.reduce_sum([[a, b], [c, d]], axis=1) = [a+b, c+d]

ということになります。

tf.reduce_sum(tf.multiply(X, X), axis=1) = [X[1].X[1], ..., X[n].X[n]]

ということで、各行の規範だけが必要な場合は、この方法を使用します。一方

tf.matmul(X, X, transpose_b=True) = [
                                      [ X[1].X[1], X[1].X[2], ..., X[1].X[n] ], 
                                      [ X[2].X[1], ..., X[2].X[n] ],
                                       ...
                                      [ X[n].X[1], ..., X[n].X[n] ]
                                   ]

ということで、すべての行のペアの間の類似性を求める場合は、これが必要です。