HyperAI

Résumé Et Résolution Du Problème De La Méthode De Multiplication Matricielle PyTorch

il y a 4 ans
Information
Rollroll Yuan
特色图像


Dans l’apprentissage automatique et l’apprentissage profond, les opérations matricielles sont le moyen le plus courant et le plus efficace d’améliorer l’efficacité du calcul. Étant donné que les caractéristiques et les poids sont stockés sous forme de vecteurs, les opérations matricielles sont particulièrement importantes.Les méthodes d’apprentissage automatique importantes telles que la descente de gradient, la rétropropagation et la factorisation matricielle nécessitent toutes des opérations matricielles.


Dans l’apprentissage profond, les réseaux neuronaux stockent les poids dans des matrices et les opérations basées sur l’algèbre linéaire sur le GPU peuvent effectuer des calculs simples et rapides sur les matrices.

Les opérations matricielles à petite échelle peuvent être rapidement calculées à l'aide de boucles for. Mais une fois que vous rencontrez une énorme quantité de données,Les instructions de boucle ralentiront la vitesse de calcul.À l’heure actuelle, nous utilisons souvent la multiplication matricielle, ce qui peut grandement améliorer l’efficacité des calculs.

Méthodes courantes de multiplication de matrices, de vecteurs et de scalaires

  • torche(mm) multiplication matricielle 2D

torch.mm(mat1,ma2,out=None), où mat1(n*m), mat2(m*d), la dimension de sortie out est (n*d).
Remarque : calcule la multiplication matricielle de deux matrices 2D et ne prend pas en charge la diffusion.

  • torch.bmm() Multiplication de matrices par lots 3D

torch.bmm(bmat1,bmat2,out=None), où bmat1(b*n*m), bmat2(B*m*d), la dimension de sortie out est (B*n*d).
Remarque : les deux entrées de cette fonction doivent être des matrices tridimensionnelles avec la même première dimension (indiquant la dimension du lot). La diffusion n'est pas prise en charge.

  • torch.matmul() multiplication de matrices mixtes 

torch.matmul(input,other,out=None), cette méthode est plus compliquée et il est recommandé de se référer au document. C'est le produit matriciel de deux tenseurs. Le résultat du calcul dépend de la dimension du tenseur et prend en charge la diffusion.

  • torch.mul() Multiplication élément par élément de matrice 

torch.mul(mat1,other,out=None), où l'autre multiplicateur peut être un scalaire ou une matrice de n'importe quelle dimension, à condition que la multiplication finale soit satisfaite et que la diffusion soit prise en charge.

  • torch.mv() multiplication matrice-vecteur

torch.mv(mat, vec, out=None) multiplie la matrice mat et le vecteur vec. Si mat est un tenseur n×m et vec est un tenseur 1D à m éléments, la sortie sera un tenseur 1D à n éléments, sans support de diffusion.

  • torch.dot() multiplication de points tensoriels

torch.dot(tensor1, tensor2) calcule le produit scalaire de deux tenseurs. Les deux tenseurs sont des vecteurs 1D et ne prennent pas en charge la diffusion.

Questions brûlantes du forum

 Q : Comment multiplier des lots de vecteurs de données sans utiliser de boucle for ?
forme d'entrée : N x M x VectorSize forme de poids : M x VectorSize x VectorSize forme de sortie cible : N x M x VectorSize
N représente la taille du lot, M représente le nombre de vecteurs et VectorSize représente la taille des vecteurs.
Comme le montre la figure suivante : Solution:

N, M, V=2, 3, 5a = 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)

Adresse du message d'origine :https://discuss.pytorch.org/t/batch-matrix-vector-multiplication-without-for-loop/112841
 

Q : Lors du calcul de la multiplication matrice-vecteur par entrée vectorielle par lots, une erreur d'exécution se produit. 
Donné:

# (batch x inp)v = torch.randn(5, 15)# (inp x output)M = torch.randn(15, 20)

calculer:

# (batch x output)out = torch.Tensor(5, 20)for i, batch_v in enumerate(v):    out[i] = (batch_v * M).t()

Cependant, (i) la multiplication entraînera l'erreur suivante pour deux entrées de la même dimension : RuntimeError : taille de tenseur incohérente dans /home/enrique/code/vendor/pytorch/torch/lib/TH/generic/THTensorMath.c:623
Pourquoi cette erreur se produit-elle ? Existe-t-il un moyen d’éviter de boucler sur les vecteurs de ligne ?

  Solution:
* représente la multiplication élément par élément. Si vous utilisez Python 3, vous pouvez utiliser l'opérateur @ pour la multiplication matrice-vecteur et la multiplication matrice-matrice.

Vous pouvez également utiliser batch_v.mm(M) puisque la matrice vectorielle par lots est une multiplication matrice-matrice.
De plus, vous pouvez également utiliser des méthodes telles que bmm et baddbmm pour éliminer les opérations de boucle en Python.

Adresse du message d'origine :https://discuss.pytorch.org/t/matrix-vector-multiply-handling-batched-data/203
 Q : Comment calculer la multiplication matrice-vecteur sans utiliser d’instructions de boucle ?
Comment pouvons-nous multiplier une matrice 2×2 par trois vecteurs de taille 2 sans utiliser de boucles ?

Remarque:
1. Lors de l'utilisation d'une instruction de boucle, le code est le suivant :

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. Après avoir essayé torch.matmul (A.repeat ((2,1,1)) , b) ne fonctionne pas.

  Solution:
Cela peut être réalisé en utilisant a.matmul(bt()).
Adresse du message d'origine :https://discuss.pytorch.org/t/vectorize-matrix-vector-multiplication/88051


Ce compte officiel continuera à mettre à jour les dernières informations et compétences de développement de PyTorch, bienvenue à suivre !