{ "

Multi-Headed Attention (MHA)

\n

_^_0_^_

\n

This is a tutorial/implementation of multi-headed attention from paper Attention Is All You Need in PyTorch. The implementation is inspired from Annotated Transformer.

\n

Here is the training code that uses a basic transformer with MHA for NLP auto-regression.

\n

Here is an experiment implementation that trains a simple transformer.

\n": "

\u0db6\u0dc4\u0dd4 \u0dc1\u0dd3\u0dbb\u0dca\u0dc2 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba (MHA)

\n

_^_0_^_

\n

\u0db8\u0dd9\u0dba \u0d9a\u0da9\u0daf\u0dcf\u0dc3\u0dd2 \u0dc0\u0dbd\u0dd2\u0db1\u0dca \u0db6\u0dc4\u0dd4-\u0dc1\u0dd3\u0dbb\u0dca\u0dc2 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0dba\u0ddc\u0db8\u0dd4 \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0dda \u0db1\u0dd2\u0db6\u0db1\u0dca\u0db0\u0db1\u0dba\u0d9a\u0dca/\u0d9a\u0dca\u0dbb\u0dd2\u0dba\u0dcf\u0dad\u0dca\u0db8\u0d9a \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0d9a\u0dd2 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba PyTorch \u0dc4\u0dd2 \u0d94\u0db6\u0da7 \u0d85\u0dc0\u0dc1\u0dca\u0dba \u0dc3\u0dd2\u0dba\u0dbd\u0dca\u0dbd \u0dc0\u0dda. \u0d9a\u0dca\u0dbb\u0dd2\u0dba\u0dcf\u0dad\u0dca\u0db8\u0d9a \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 \u0d86\u0db1\u0dd4\u0db7\u0dcf\u0dc0 \u0dbd\u0dad\u0dca \u0da7\u0dca\u0dbb\u0dcf\u0db1\u0dca\u0dc3\u0dca\u0dc6\u0ddd\u0db8\u0dbb\u0dca \u0dc0\u0dd9\u0dad\u0dd2\u0db1\u0dca \u0daf\u0dda\u0dc0\u0dcf\u0db1\u0dd4\u0db7\u0dcf\u0dc0\u0dba\u0dd9\u0db1\u0dca \u0dba.

\n

NLP \u0dc3\u0dca\u0dc0\u0dba\u0d82\u0d9a\u0dca\u0dbb\u0dd3\u0dba-\u0db4\u0dca\u0dbb\u0dad\u0dd2\u0d9c\u0dcf\u0db8\u0dd3 \u0dc3\u0db3\u0dc4\u0dcf MHA \u0dc3\u0db8\u0d9f \u0db8\u0dd6\u0dbd\u0dd2\u0d9a \u0da7\u0dca\u0dbb\u0dcf\u0db1\u0dca\u0dc3\u0dca\u0dc6\u0ddd\u0db8\u0dbb\u0dba\u0d9a\u0dca \u0db7\u0dcf\u0dc0\u0dd2\u0dad\u0dcf \u0d9a\u0dbb\u0db1 \u0db4\u0dd4\u0dc4\u0dd4\u0dab\u0dd4 \u0d9a\u0dda\u0dad\u0dba \u0db8\u0dd9\u0db1\u0dca\u0db1.

\n

\u0dc3\u0dbb\u0dbd \u0da7\u0dca\u0dbb\u0dcf\u0db1\u0dca\u0dc3\u0dca\u0dc6\u0ddd\u0db8\u0dbb\u0dba\u0d9a\u0dca \u0db4\u0dd4\u0dc4\u0dd4\u0dab\u0dd4 \u0d9a\u0dbb\u0db1 \u0d85\u0dad\u0dca\u0dc4\u0daf\u0dcf \u0db6\u0dd0\u0dbd\u0dd3\u0db8\u0dda \u0d9a\u0dca\u0dbb\u0dd2\u0dba\u0dcf\u0dad\u0dca\u0db8\u0d9a \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0d9a\u0dca \u0db8\u0dd9\u0db1\u0dca\u0db1.

\n", "

Calculate scores between queries and keys

\n

This method can be overridden for other variations like relative attention.

\n": "

\u0dc0\u0dd2\u0db8\u0dc3\u0dd4\u0db8\u0dca\u0dc3\u0dc4 \u0dba\u0dad\u0dd4\u0dbb\u0dd4 \u0d85\u0dad\u0dbb \u0dbd\u0d9a\u0dd4\u0dab\u0dd4 \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dbb\u0db1\u0dca\u0db1

\n

\u0dc3\u0dcf\u0db4\u0dda\u0d9a\u0dca\u0dc2\u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0dc0\u0dd0\u0db1\u0dd2 \u0dc0\u0dd9\u0db1\u0dad\u0dca \u0dc0\u0dd9\u0db1\u0dc3\u0dca\u0d9a\u0db8\u0dca \u0dc3\u0db3\u0dc4\u0dcf \u0db8\u0dd9\u0db8 \u0d9a\u0dca\u0dbb\u0db8\u0dba \u0d89\u0d9a\u0dca\u0db8\u0dc0\u0dcf \u0dba\u0dcf \u0dc4\u0dd0\u0d9a\u0dd2\u0dba.

\n", "

\n

Multi-Head Attention Module

\n

This computes scaled multi-headed attention for given _^_0_^_, _^_1_^_ and _^_2_^_ vectors.

\n

_^_3_^_

\n

In simple terms, it finds keys that matches the query, and gets the values of those keys.

\n

It uses dot-product of query and key as the indicator of how matching they are. Before taking the _^_4_^_ the dot-products are scaled by _^_5_^_. This is done to avoid large dot-product values causing softmax to give very small gradients when _^_6_^_ is large.

\n

Softmax is calculated along the axis of of the sequence (or time).

\n": "

\n

\u0db6\u0dc4\u0dd4-\u0db4\u0dca\u0dbb\u0db0\u0dcf\u0db1\u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0db8\u0ddc\u0da9\u0dd2\u0dba\u0dd4\u0dbd\u0dba

\n

\u0db8\u0dd9\u0dba\u0dbd\u0db6\u0dcf \u0daf\u0dd3 _^_0_^_\u0d87\u0dad\u0dd2 _^_1_^_ \u0dc3\u0dc4 _^_2_^_ \u0daf\u0ddb\u0dc1\u0dd2\u0d9a \u0dc3\u0db3\u0dc4\u0dcf \u0db6\u0dc4\u0dd4-\u0dc1\u0dd3\u0dbb\u0dca\u0dc2 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0db4\u0dbb\u0dd2\u0db8\u0dcf\u0dab\u0dba \u0d9a\u0dbb\u0dba\u0dd2.

\n

_^_3_^_

\n

\u0dc3\u0dbb\u0dc5\u0dc0\u0d9a\u0dd2\u0dc0\u0dc4\u0ddc\u0dad\u0dca, \u0d91\u0dba \u0dc0\u0dd2\u0db8\u0dc3\u0dd4\u0db8\u0da7 \u0d9c\u0dd0\u0dbd\u0db4\u0dd9\u0db1 \u0dba\u0dad\u0dd4\u0dbb\u0dd4 \u0dc3\u0ddc\u0dba\u0dcf \u0d9c\u0db1\u0dca\u0db1\u0dcf \u0d85\u0dad\u0dbb \u0d91\u0db8 \u0dba\u0dad\u0dd4\u0dbb\u0dd4 \u0dc0\u0dbd \u0d85\u0d9c\u0dba\u0db1\u0dca \u0dbd\u0db6\u0dcf \u0d9c\u0db1\u0dd3.

\n

\u0d91\u0dba\u0d94\u0dc0\u0dd4\u0db1\u0dca \u0d9a\u0dd9\u0dad\u0dbb\u0db8\u0dca \u0d9c\u0dd0\u0dbd\u0db4\u0dd9\u0db1 \u0daf\u0dbb\u0dca\u0dc1\u0d9a\u0dba\u0d9a\u0dca \u0dbd\u0dd9\u0dc3 \u0dc0\u0dd2\u0db8\u0dc3\u0dd4\u0db8 \u0dc4\u0dcf \u0db4\u0dca\u0dbb\u0db0\u0dcf\u0db1 \u0dad\u0dd2\u0dad\u0dca-\u0db1\u0dd2\u0dc2\u0dca\u0db4\u0dcf\u0daf\u0db1 \u0db7\u0dcf\u0dc0\u0dd2\u0dad\u0dcf \u0d9a\u0dbb\u0dba\u0dd2. _^_4_^_ \u0dad\u0dd2\u0dad\u0dca-\u0db1\u0dd2\u0dc2\u0dca\u0db4\u0dcf\u0daf\u0db1 \u0d9c\u0dd0\u0db1\u0dd3\u0db8\u0da7 \u0db4\u0dd9\u0dbb \u0db4\u0dbb\u0dd2\u0db8\u0dcf\u0dab\u0dba \u0d9a\u0dbb\u0db1\u0dd4 \u0dbd\u0dd0\u0db6\u0dda _^_5_^_. \u0db8\u0dd9\u0dba \u0dc3\u0dd2\u0daf\u0dd4 \u0d9a\u0dbb\u0db1\u0dd4 \u0dbd\u0db6\u0db1\u0dca\u0db1\u0dda \u0dc0\u0dd2\u0dc1\u0dcf\u0dbd \u0dad\u0dd2\u0dad\u0dca \u0db1\u0dd2\u0dc2\u0dca\u0db4\u0dcf\u0daf\u0db1 \u0d85\u0d9c\u0dba\u0db1\u0dca \u0dc0\u0dc5\u0d9a\u0dca\u0dc0\u0dcf \u0d9c\u0dd0\u0db1\u0dd3\u0db8 \u0dc3\u0db3\u0dc4\u0dcf \u0dc0\u0db1 \u0d85\u0dad\u0dbb \u0d91\u0db8\u0d9f\u0dd2\u0db1\u0dca \u0dc3\u0ddc\u0dc6\u0dca\u0da7\u0dca\u0db8\u0dd0\u0d9a\u0dca\u0dc3\u0dca \u0dc0\u0dd2\u0dc1\u0dcf\u0dbd _^_6_^_ \u0dc0\u0db1 \u0dc0\u0dd2\u0da7 \u0d89\u0dad\u0dcf \u0d9a\u0dd4\u0da9\u0dcf \u0d85\u0db1\u0dd4\u0d9a\u0dca\u0dbb\u0db8\u0dd2\u0d9a \u0db4\u0dca\u0dbb\u0db8\u0dcf\u0dab\u0dba\u0d9a\u0dca \u0dbd\u0db6\u0dcf \u0daf\u0dda.

\n

Softmax\u0d85\u0db1\u0dd4\u0d9a\u0dca\u0dbb\u0db8\u0dba (\u0dc4\u0ddd \u0d9a\u0dcf\u0dbd\u0dba) \u0d85\u0d9a\u0dca\u0dc2\u0dba \u0d94\u0dc3\u0dca\u0dc3\u0dda \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dbb\u0db1\u0dd4 \u0dbd\u0dd0\u0db6\u0dda.

\n", "

\n

Prepare for multi-head attention

\n

This module does a linear transformation and splits the vector into given number of heads for multi-head attention. This is used to transform key, query, and value vectors.

\n": "

\n

\u0db6\u0dc4\u0dd4-\u0dc4\u0dd2\u0dc3\u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0dc3\u0db3\u0dc4\u0dcf \u0dc3\u0dd6\u0daf\u0dcf\u0db1\u0db8\u0dca \u0dc0\u0db1\u0dca\u0db1

\n

\u0db8\u0dd9\u0db8\u0db8\u0ddc\u0da9\u0dd2\u0dba\u0dd4\u0dbd\u0dba \u0dbb\u0dda\u0d9b\u0dd3\u0dba \u0db4\u0dbb\u0dd2\u0dc0\u0dbb\u0dca\u0dad\u0db1\u0dba\u0d9a\u0dca \u0dc3\u0dd2\u0daf\u0dd4 \u0d9a\u0dbb\u0db1 \u0d85\u0dad\u0dbb \u0db6\u0dc4\u0dd4 \u0dc4\u0dd2\u0dc3 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0dc3\u0db3\u0dc4\u0dcf \u0daf\u0ddb\u0dc1\u0dd2\u0d9a\u0dba \u0dbd\u0db6\u0dcf \u0daf\u0dd3 \u0d87\u0dad\u0dd2 \u0dc4\u0dd2\u0dc3\u0dca \u0d9c\u0dab\u0db1\u0da7 \u0db6\u0dd9\u0daf\u0dda. \u0dba\u0dad\u0dd4\u0dbb, \u0dc0\u0dd2\u0db8\u0dc3\u0dd4\u0db8\u0dc3\u0dc4 \u0d85\u0d9c\u0dba\u0daf\u0ddb\u0dc1\u0dd2\u0d9a \u0db4\u0dbb\u0dd2\u0dc0\u0dbb\u0dca\u0dad\u0db1\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0da7 \u0db8\u0dd9\u0dba \u0db7\u0dcf\u0dc0\u0dd2\u0dad\u0dcf \u0d9a\u0dbb\u0dba\u0dd2.

\n", "

_^_0_^_ has shape _^_1_^_, where first dimension is the query dimension. If the query dimension is equal to _^_2_^_ it will be broadcasted.

\n": "

_^_0_^_ \u0dc4\u0dd0\u0da9\u0dba \u0d87\u0dad _^_1_^_, \u0d91\u0dc4\u0dd2\u0daf\u0dd3 \u0db4\u0dc5\u0db8\u0dd4 \u0db8\u0dcf\u0db1\u0dba \u0dc0\u0dd2\u0db8\u0dc3\u0dd4\u0db8\u0dca \u0db8\u0dcf\u0db1\u0dba\u0d9a\u0dca \u0dc0\u0dda. \u0dc0\u0dd2\u0db8\u0dc3\u0dd4\u0db8 \u0db8\u0dcf\u0db1\u0dba\u0d9a\u0dca \u0dc3\u0db8\u0dcf\u0db1 \u0dc0\u0dda \u0db1\u0db8\u0dca _^_2_^_ \u0d91\u0dba \u0dc0\u0dd2\u0d9a\u0dcf\u0dc1\u0db1\u0dba \u0d9a\u0dbb\u0db1\u0dd4 \u0d87\u0dad.

\n", "

_^_0_^_, _^_1_^_ and _^_2_^_ are the tensors that store collection of query, key and value vectors. They have shape _^_3_^_.

\n

_^_4_^_ has shape _^_5_^_ and _^_6_^_ indicates whether for batch _^_7_^_, query at position _^_8_^_ has access to key-value at position _^_9_^_.

\n": "

_^_0_^_, _^_1_^_ \u0dc3\u0dc4 _^_2_^_ \u0dc0\u0dd2\u0db8\u0dc3\u0dd4\u0db8, \u0dba\u0dad\u0dd4\u0dbb\u0dc3\u0dc4 \u0d85\u0d9c\u0dba\u0daf\u0ddb\u0dc1\u0dd2\u0d9a \u0d91\u0d9a\u0dad\u0dd4 \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 \u0d9c\u0db6\u0da9\u0dcf \u0d9a\u0dbb\u0db1 \u0d86\u0dad\u0db1\u0dca\u0dba \u0dc0\u0dda. \u0d92\u0dc0\u0dcf\u0dba\u0dda \u0dc4\u0dd0\u0da9\u0dba \u0d87\u0dad _^_3_^_.

\n

_^_4_^_ \u0dc4\u0dd0\u0da9\u0dba \u0d87\u0dad\u0dd2 _^_5_^_ \u0d85\u0dad\u0dbb \u0d9a\u0dab\u0dca\u0da9\u0dcf\u0dba\u0db8 \u0dc3\u0db3\u0dc4\u0dcf _^_7_^_, \u0dc3\u0dca\u0dae\u0dcf\u0db1\u0dba\u0dda \u0dc0\u0dd2\u0db8\u0dc3\u0dd4\u0db8\u0da7 \u0db4\u0dca\u0dbb\u0dc0\u0dda\u0dc1\u0dba _^_8_^_ \u0dad\u0dd2\u0db6\u0dda\u0daf \u0dba\u0db1\u0dca\u0db1 _^_6_^_ \u0daf\u0d9a\u0dca\u0dc0\u0dba\u0dd2 \u0dc3\u0dca\u0dae\u0dcf\u0db1\u0dba\u0dda \u0db4\u0dca\u0dbb\u0db0\u0dcf\u0db1-\u0d85\u0d9c\u0dba _^_9_^_.

\n", "

_^_0_^_ attention along the key sequence dimension _^_1_^_

\n": "

_^_0_^_ \u0db4\u0dca\u0dbb\u0db0\u0dcf\u0db1 \u0d85\u0db1\u0dd4\u0d9a\u0dca\u0dbb\u0db8\u0dba \u0db8\u0dcf\u0db1\u0dba\u0d9a\u0dca \u0d94\u0dc3\u0dca\u0dc3\u0dda \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba _^_1_^_

\n", "

_^_0_^_, _^_1_^_ and _^_2_^_ have shape _^_3_^_

\n": "

_^_0_^_, _^_1_^_ _^_2_^_ \u0dc3\u0dc4 \u0dc4\u0dd0\u0da9\u0dba _^_3_^_

\n", "

Apply dropout

\n": "

\u0d85\u0dad\u0dc4\u0dd0\u0dbb\u0daf\u0dd0\u0db8\u0dd3\u0db8 \u0dba\u0ddc\u0daf\u0db1\u0dca\u0db1

\n", "

Apply mask

\n": "

\u0dc0\u0dd9\u0dc3\u0dca\u0dba\u0ddc\u0daf\u0db1\u0dca\u0db1

\n", "

Calculate _^_0_^_ or _^_1_^_

\n": "

\u0d9c\u0dab\u0db1\u0dba\u0d9a\u0dbb\u0db1\u0dca\u0db1 _^_0_^_ \u0dc4\u0ddd _^_1_^_

\n", "

Compute attention scores _^_0_^_. This gives a tensor of shape _^_1_^_.

\n": "

\u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba\u0dbd\u0d9a\u0dd4\u0dab\u0dd4 \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dbb\u0db1\u0dca\u0db1 _^_0_^_. \u0db8\u0dd9\u0dba \u0dc4\u0dd0\u0da9\u0dba\u0dda \u0d86\u0dad\u0dad\u0dd2\u0d9a\u0dba\u0d9a\u0dca \u0dbd\u0db6\u0dcf \u0daf\u0dd9\u0dba\u0dd2 _^_1_^_.

\n", "

Concatenate multiple heads

\n": "

\u0db6\u0dc4\u0dd4\u0dc4\u0dd2\u0dc3\u0dca \u0dc3\u0d82\u0dba\u0dd4\u0d9a\u0dca\u0dad \u0d9a\u0dbb\u0db1\u0dca\u0db1

\n", "

Dropout

\n": "

\u0dc4\u0dd0\u0dbd\u0dd3\u0db8

\n", "

Input has shape _^_0_^_ or _^_1_^_. We apply the linear transformation to the last dimension and split that into the heads.

\n": "

\u0d86\u0daf\u0dcf\u0db1\u0dba\u0da7\u0dc4\u0dd0\u0da9\u0dba _^_0_^_ \u0dc4\u0ddd _^_1_^_\u0d87\u0dad. \u0d85\u0db4\u0dd2 \u0dbb\u0dda\u0d9b\u0dd3\u0dba \u0db4\u0dbb\u0dd2\u0dc0\u0dbb\u0dca\u0dad\u0db1\u0dba \u0d85\u0dc0\u0dc3\u0dcf\u0db1 \u0db8\u0dcf\u0db1\u0dba\u0da7 \u0d85\u0daf\u0dcf\u0dc5 \u0dc0\u0db1 \u0d85\u0dad\u0dbb \u0d91\u0dba \u0dc4\u0dd2\u0dc3\u0dca \u0db6\u0dc0\u0da7 \u0db6\u0dd9\u0daf\u0dd3 \u0dba\u0dba\u0dd2.

\n", "

Linear layer for linear transform

\n": "

\u0dbb\u0dda\u0d9b\u0dd3\u0dba\u0db4\u0dbb\u0dd2\u0dab\u0dcf\u0db8\u0db1\u0dba \u0dc3\u0db3\u0dc4\u0dcf \u0dbb\u0dda\u0d9b\u0dd3\u0dba \u0dc3\u0dca\u0dae\u0dbb\u0dba

\n", "

Linear transform

\n": "

\u0dbb\u0dda\u0d9b\u0dd3\u0dba\u0db4\u0dbb\u0dd2\u0dab\u0dcf\u0db8\u0db1\u0dba

\n", "

Multiply by values _^_0_^_

\n": "

\u0d85\u0d9c\u0dba\u0db1\u0dca\u0d85\u0db1\u0dd4\u0dc0 \u0d9c\u0dd4\u0dab \u0d9a\u0dbb\u0db1\u0dca\u0db1 _^_0_^_

\n", "

Number of dimensions in vectors in each head

\n": "

\u0d91\u0d9a\u0dca\u0d91\u0d9a\u0dca \u0dc4\u0dd2\u0dc3\u0dd9\u0dc4\u0dd2 \u0daf\u0ddb\u0dc1\u0dd2\u0d9a\u0dc0\u0dbd \u0db8\u0dcf\u0db1\u0dba\u0db1\u0dca \u0d9c\u0dab\u0db1

\n", "

Number of features per head

\n": "

\u0dc4\u0dd2\u0dc3\u0d9a\u0da7\u0dc0\u0dd2\u0dc1\u0dda\u0dc2\u0dcf\u0d82\u0d9c \u0d9c\u0dab\u0db1

\n", "

Number of heads

\n": "

\u0dc4\u0dd2\u0dc3\u0dca\u0d9c\u0dab\u0db1

\n", "

Output has shape _^_0_^_ or _^_1_^_

\n": "

\u0db1\u0dd2\u0db8\u0dd0\u0dc0\u0dd4\u0db8\u0dda\u0dc4\u0dd0\u0da9\u0dba _^_0_^_ \u0dc4\u0ddd _^_1_^_

\n", "

Output layer

\n": "

\u0db4\u0dca\u0dbb\u0dad\u0dd2\u0daf\u0dcf\u0db1\u0dc3\u0dca\u0dae\u0dbb\u0dba

\n", "

Prepare _^_0_^_, _^_1_^_ and _^_2_^_ for attention computation. These will then have shape _^_3_^_.

\n": "

\u0dc3\u0dd6\u0daf\u0dcf\u0db1\u0db8\u0dca\u0dc0\u0db1\u0dca\u0db1 _^_0_^_, _^_1_^_ \u0dc3\u0dc4 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 _^_2_^_ \u0dc3\u0db3\u0dc4\u0dcf. \u0db8\u0dda\u0dc0\u0dcf\u0da7 \u0db4\u0dc3\u0dd4\u0dc0 \u0dc4\u0dd0\u0da9\u0dba \u0d87\u0dad _^_3_^_.

\n", "

Same mask applied to all heads.

\n": "

\u0dc3\u0dd2\u0dba\u0dbd\u0dd4\u0db8\u0dc4\u0dd2\u0dc3\u0dca \u0dc3\u0db3\u0dc4\u0dcf \u0d91\u0d9a\u0db8 \u0d86\u0dc0\u0dbb\u0dab \u0dba\u0ddc\u0daf\u0db1\u0dd4 \u0dbd\u0dd0\u0db6\u0dda.

\n", "

Save attentions for any other calculations

\n": "

\u0dc0\u0dd9\u0db1\u0dad\u0dca\u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0dca \u0dc3\u0db3\u0dc4\u0dcf \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0dc3\u0dd4\u0dbb\u0d9a\u0dd2\u0db1\u0dca\u0db1

\n", "

Save attentions if debugging

\n": "

\u0db1\u0dd2\u0daf\u0ddc\u0dc3\u0dca\u0d9a\u0dbb\u0dab\u0dba\u0db1\u0db8\u0dca \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0dc3\u0dd4\u0dbb\u0d9a\u0dd2\u0db1\u0dca\u0db1

\n", "

Scale scores _^_0_^_

\n": "

\u0db4\u0dbb\u0dd2\u0db8\u0dcf\u0dab\u0dbd\u0d9a\u0dd4\u0dab\u0dd4 _^_0_^_

\n", "

Scaling factor before the softmax

\n": "

\u0dc3\u0ddc\u0dc6\u0dca\u0da7\u0dca\u0db8\u0dd0\u0d9a\u0dca\u0dc3\u0dca\u0dc0\u0dbd\u0da7 \u0db4\u0dd9\u0dbb \u0db4\u0dbb\u0dd2\u0db8\u0dcf\u0dab \u0dc3\u0dcf\u0db0\u0d9a\u0dba

\n", "

Softmax for attention along the time dimension of _^_0_^_

\n": "

\u0d9a\u0dcf\u0dbd\u0db8\u0dcf\u0db1\u0dba \u0d94\u0dc3\u0dca\u0dc3\u0dda \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0dba\u0ddc\u0db8\u0dd4 \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 \u0dc3\u0db3\u0dc4\u0dcf \u0dc3\u0ddc\u0dc6\u0dca\u0da7\u0dca\u0db8\u0dd0\u0d9a\u0dca\u0dc3\u0dca _^_0_^_

\n", "

Split last dimension into heads

\n": "

\u0d85\u0dc0\u0dc3\u0dcf\u0db1\u0db8\u0dcf\u0db1\u0dba \u0dc4\u0dd2\u0dc3\u0dca \u0db6\u0dc0\u0da7 \u0db6\u0dd9\u0daf\u0db1\u0dca\u0db1

\n", "

These transform the _^_0_^_, _^_1_^_ and _^_2_^_ vectors for multi-headed attention.

\n": "

\u0db8\u0dda\u0dc0\u0dcf\u0db6\u0dc4\u0dd4-\u0dc1\u0dd3\u0dbb\u0dca\u0dc2 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0dc3\u0db3\u0dc4\u0dcf _^_1_^_ \u0dc3\u0dc4 _^_2_^_ \u0daf\u0ddb\u0dc1\u0dd2\u0d9a \u0db4\u0dbb\u0dd2\u0dc0\u0dbb\u0dca\u0dad\u0db1\u0dba \u0d9a\u0dbb\u0dba\u0dd2. _^_0_^_

\n", "

We store attentions so that it can be used for logging, or other computations if needed

\n": "

\u0d85\u0dc0\u0dc1\u0dca\u0dba\u0db1\u0db8\u0dca \u0dbd\u0ddc\u0d9c\u0dca \u0dc0\u0dd3\u0db8 \u0dc4\u0ddd \u0dc0\u0dd9\u0db1\u0dad\u0dca \u0d9c\u0dab\u0db1\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0dca \u0dc3\u0db3\u0dc4\u0dcf \u0db7\u0dcf\u0dc0\u0dd2\u0dad\u0dcf \u0d9a\u0dc5 \u0dc4\u0dd0\u0d9a\u0dd2 \u0dc0\u0db1 \u0db4\u0dbb\u0dd2\u0daf\u0dd2 \u0d85\u0db4\u0dd2 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0d9c\u0db6\u0da9\u0dcf \u0d9a\u0dbb\u0db8\u0dd4

\n", "

resulting mask has shape _^_0_^_

\n": "

\u0d91\u0dc4\u0dd2\u0db4\u0dca\u0dbb\u0dad\u0dd2 ing \u0dbd\u0dba\u0d9a\u0dca \u0dbd\u0dd9\u0dc3 \u0dc0\u0dd9\u0dc3\u0dca _^_0_^_

\n", "\n": "\n", "Multi-Headed Attention (MHA)": "\u0db6\u0dc4\u0dd4 \u0dc1\u0dd3\u0dbb\u0dca\u0dc2 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba (MHA)", "This implements the Multi-Headed Attention used in transformers using PyTorch with explanations.": "\u0db8\u0dd9\u0dba \u0db4\u0dd0\u0dc4\u0dd0\u0daf\u0dd2\u0dbd\u0dd2 \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0dca \u0dc3\u0db8\u0d9f PyTorch \u0db7\u0dcf\u0dc0\u0dd2\u0dad\u0dcf \u0d9a\u0dbb\u0db1 \u0da7\u0dca\u0dbb\u0dcf\u0db1\u0dca\u0dc3\u0dca\u0dc6\u0ddd\u0db8\u0dbb\u0dca\u0dc0\u0dbd \u0db7\u0dcf\u0dc0\u0dd2\u0dad\u0dcf \u0d9a\u0dbb\u0db1 \u0db6\u0dc4\u0dd4-\u0dc1\u0dd3\u0dbb\u0dca\u0dc2 \u0d85\u0dc0\u0db0\u0dcf\u0db1\u0dba \u0d9a\u0dca\u0dbb\u0dd2\u0dba\u0dcf\u0dad\u0dca\u0db8\u0d9a \u0d9a\u0dbb\u0dba\u0dd2." }