PyTorch 行列乗算方法の概要と質問と回答

機械学習と深層学習では、行列演算はコンピューティング効率を向上させる最も一般的で効果的な方法です。特徴と重みはベクトルに格納されるため、行列演算が特に重要です。勾配降下法、逆伝播、行列因数分解などの重要な機械学習手法はすべて行列演算に基づく必要があります。
ディープ ラーニングでは、ニューラル ネットワークが行列に重みを保存し、GPU 上の線形代数ベースの演算により行列に対して単純かつ高速な計算を実行できます。

小規模な行列演算は、for ループを使用して迅速に実行できます。しかし、一度膨大な量のデータに遭遇すると、ループ ステートメントを使用すると、計算速度が遅くなります。このとき、行列の乗算をよく使用します。これにより、演算の効率が大幅に向上します。
一般的な行列、ベクトル、およびスカラー乗算方法
- トーチ(mm) 2次元行列乗算
torch.mm(mat1,ma2,out=None)、ここで mat1(n*m)、mat2(m*d)、出力 out の次元は (n*d) です。
注: 2 つの 2 次元行列の行列乗算を計算します。ブロードキャストはサポートされていません。
- torch.bmm() バッチを使用した 3 次元行列の乗算
torch.bmm(bmat1,bmat2,out=None)、bmat1(b*n*m)、bmat2(B*m*d)、出力 out の次元は (B*n*d) です。
注: この関数の 2 つの入力は、最初の次元が同じ 3 次元行列である必要があります (バッチ次元がサポートされていないことを示します)。
- torch.matmul() 混合行列の乗算
torch.matmul(input,other,out=None) のメソッドは比較的複雑なので、ドキュメントを参照することをお勧めします。 計算結果はテンソルの次元に依存し、ブロードキャストをサポートします。
- torch.mul() 行列の要素ごとの乗算
torch.mul(mat1,other,out=None)。最終的な乗算が満たされ、ブロードキャストがサポートされている限り、他の乗数はスカラーまたは任意の次元の行列にすることができます。
- torch.mv() 行列とベクトルの乗算
torch.mv(mat, vec, out=None) は、行列 mat とベクトル vec を乗算します。 mat が n×m テンソルで、vec が m 要素の 1 次元テンソルである場合、n 要素の 1 次元テンソルが出力され、ブロードキャストはサポートされません。
- torch.dot() テンソル点乗算
torch.dot(tensor1, tensor2) は、2 つのテンソルのドット積を計算します。どちらのテンソルも 1 次元ベクトルであり、ブロードキャストをサポートしません。
フォーラムのよくある質問
Q: for ループを使用せずにバッチ データ ベクトルを乗算するにはどうすればよいですか?
入力シェイプ: N x M x VectorSize ウェイト シェイプ: M x VectorSize x VectorSize ターゲット出力シェイプ: N x M x VectorSize
N はバッチ サイズを表し、M はベクトルの数を表し、VectorSize はベクトルのサイズを表します。
以下に示すように: 解決:
N, M, V=2, 3, 5
a = torch.randn(N, M, V)
b = torch.randn(M, V, V)
a_expand = a.unsqueeze(-2)
b_expand = b.expand(N, -1, -1, -1)
c = torch.matmul(a_expand, b_expand).squeeze(-2)
元の投稿アドレス:https://discuss.pytorch.org/t/batch-matrix-vector-multiplication-without-for-loop/112841
Q: バッチ ベクトル入力を乗算した行列ベクトルを計算すると、RuntimeError が発生します。
与えられる:
# (batch x inp)
v = torch.randn(5, 15)
# (inp x output)
M = torch.randn(15, 20)
計算します:
# (batch x output)
out = torch.Tensor(5, 20)
for i, batch_v in enumerate(v):
out[i] = (batch_v * M).t()
ただし、(i) 同じ次元を持つ 2 つの入力に対して乗算が発生します: RuntimeError: inconsistent tensor size at /home/enrique/code/vendor/pytorch/torch/lib/TH/generic/THTensorMath.c:623
このエラーはなぜ発生するのでしょうか?行ベクトルのループを回避する方法はありますか?
解決:
* は要素ごとの乗算を表します。Python3 を使用している場合は、行列とベクトルの乗算と行列と行列の乗算に使用できる @ 演算子を使用できます。
バッチ化されたベクトル行列は行列と行列の乗算であるため、batch_v.mm(M) を使用することもできます。
さらに、bmm、badbmm、およびその他のメソッドを使用して、Python でのループ操作を排除することもできます。
元の投稿アドレス:https://discuss.pytorch.org/t/matrix-vector-multiply-handling-batched-data/203
Q: ループ ステートメントを使用せずに行列とベクトルの乗算を計算するにはどうすればよいですか?
サイズ 2 の 3 つのベクトルを掛けた 2×2 行列を求めます。ループを使用せずにこれを実現するにはどうすればよいでしょうか?
述べる:
1. ループ ステートメントを使用する場合、コードは次のようになります。
A=torch.tensor([[1.,2.],[3.,4.]])
b=torch.tensor([[3.,4.], [5.,6], [7.,8.]])
res = []
for i in range(b.shape[0]):
res.append(torch.matmul(A, b[i]))
2. torch.matmul (A.repeat ((2,1,1)), b) を試しても機能しません。
解決:
これは、a.matmul (bt ()) によって実現できます。
元の投稿アドレス:https://discuss.pytorch.org/t/vectorize-matrix-vector-multiplication/88051
この公開アカウントでは、PyTorch の最新情報と開発スキルを更新し続けます。ぜひご注目ください。