概要¶
Vaswani, et al. (2017). Attention is all you need. で提案されたDeep Learningの新しいアーキテクチャ。
提案されものはEncoder-Decoder型。
GPTシリーズはDecoderのみでもっとシンプル

処理の流れ¶
Attention¶
Attentionでは、入力の埋込に対して文脈の情報を追加したベクトルを再構築していく。
このベクトルは、各トークンの埋め込みから計算されたバリューベクトルたちに対して、どのトークンのバリューに注意を払うべきかの重みを用いて重み付け和にしたものである。
重みはキーとクエリから計算された類似度のスコアをsoftmaxにかけて合計1がになるように正規化したもの
inputs¶
単語埋め込み(word embedding)が入力となる。この分散表現も他のパラメータと同時に学習される
Positional Encoding¶
例えば翻訳を行うとき、入力と出力の系列のどのトークンがどの位置で入力されたのかを示す情報を付与する必要がある。
特に、Attentionは順番の変化に頑健(とを入れ替えても、とが元のそれと入れ替えた状態になり、入出力を集合とみなせば等価である)であるが、言語処理では系列性を評価したいため、位置情報を含める。
具体的には三角関数により位置をエンコーディングする
特徴要素の位置が偶数()のときは、奇数()のときはを使う。は埋め込みの次元数である
Positional Embedding¶
GPTではこちらを利用
Scaled Dot-Product Attention¶
入力埋込に文脈の情報を付与していく。
Q, K, Vはいずれも入力から変換されたもの。はトークンの最大長、は埋め込み次元数
重みは学習して推定していく。self-attentionだとsource = targetなので入力のベクトルを再現するように重みを推定するっぽい?
import numpy as np
n, d = 5, 3
np.random.seed(0)
Q = np.random.normal(size=(n, d))
K = np.random.normal(size=(n, d))
def softmax(x):
return np.exp(x) / np.exp(x).sum()
S = (Q @ K.T) / d # Sはn*n行列
A = np.apply_along_axis(softmax, 0, S).round(3)
Aarray([[0.173, 0.105, 0.163, 0.301, 0.24 ],
[0.432, 0.384, 0.447, 0.206, 0.189],
[0.129, 0.284, 0.152, 0.209, 0.112],
[0.127, 0.065, 0.1 , 0.123, 0.289],
[0.139, 0.162, 0.138, 0.16 , 0.17 ]])V = np.random.normal(size=(n, d))
A @ Varray([[-0.48113832, 0.37745091, -0.75004649],
[-0.52850805, 0.71992637, -0.88546848],
[-0.60983733, 0.13207693, -0.48285972],
[-0.5163397 , 0.58045241, -0.46327048],
[-0.46800559, 0.32599458, -0.46536853]])参考¶
単純化のためQ, Kの行列からベクトルをとってきて示すことにする。qとkの内積
内積は類似度に使われる(cf. コサイン類似度)
\renewcommand{\b} when command \b does not yet exist; use \newcommand
\renewcommand{\b}[1]{\boldsymbol{#1}}
\text{softmax}
\left(
\frac{\b{q} \cdot \b{k}}
{\sqrt{d}}
\right)これは
クエリ\b{q}とキー\b{k}の内積(=類似度)を計算する
次元数によって正規化する(内積は次元数が多いほど値も大きくなるので)
softmaxによって確率値へと値の範囲を整える
という処理になる。いわば確率ベクトルを返すようなものになる。
例えば番目のトークンだけこの出力値が1だとして、ほかが0だとすると、の番目のベクトルだけが出力となる
\renewcommand{\b} when command \b does not yet exist; use \newcommand
\renewcommand{\b}[1]{\boldsymbol{#1}}
\b{v}_i = (v_1, \cdots, v_d)
\\
\b{V} =
\begin{pmatrix}
\b{v}_1\\
\b{v}_2\\
\vdots\\
\b{v}_n
\end{pmatrix}
\\
\b{p} = (p_1, \cdots, p_n) =
\text{softmax}
\left(
\frac{\b{q} \cdot \b{k}}
{\sqrt{d}}
\right)とする
Undefined control sequence: \b at position 15: \begin{align}
\̲b̲{p} \b{V}
&= (…
\begin{align}
\b{p} \b{V}
&= (p_1, \cdots, p_n)
\begin{pmatrix}
v_{11} & \cdots & v_{1d}\\
\vdots & \ddots & \vdots\\
v_{n1} & \cdots & v_{nd}\\
\end{pmatrix}
\\
&=
\begin{pmatrix}
p_1 v_{11} + \cdots + p_n v_{n1},\
\cdots, \
p_1 v_{1d} + \cdots + p_n v_{nd}
\end{pmatrix}
\\
&= p_1 (v_{11}, \cdots, v_{1d}) + \cdots + p_n (v_{n1}, \cdots, v_{nd})
\\
&= \sum_i^n p_i \b{v}_i
\end{align}Multi-head attention¶
元のベクトルを等分割して複数のattentionに通す。
multiにするメリットは
並列計算可能になる
ソフトマックスはexpが入っていて極端な値になりやすい → 単一のattentionではなく複数使うことで、複数の観点から評価する(アンサンブル的な?
