Transformerのアルゴリズム#
概要#
Vaswani, et al. (2017). Attention is all you need. で提案されたDeep Learningの新しいアーキテクチャ。
提案されものはEncoder-Decoder型。
GPTシリーズはDecoderのみでもっとシンプル
処理の流れ#
Attention#
Attentionでは、入力の埋込
このベクトル
重み
inputs#
単語埋め込み(word embedding)が入力となる。この分散表現も他のパラメータと同時に学習される
Positional Encoding#
例えば翻訳を行うとき、入力と出力の系列のどのトークンがどの位置で入力されたのかを示す情報を付与する必要がある。
特に、Attentionは順番の変化に頑健(
具体的には三角関数により位置をエンコーディングする
特徴要素の位置が偶数(
Positional Embedding#
GPTではこちらを利用
Scaled Dot-Product Attention#
入力埋込に文脈の情報を付与していく。
Q, K, Vはいずれも入力
重み
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)
A
array([[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 @ V
array([[-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. コサイン類似度)
これは
クエリ
とキー の内積(=類似度)を計算する次元数
によって正規化する(内積は次元数が多いほど値も大きくなるので)softmaxによって確率値へと値の範囲を整える
という処理になる。いわば確率ベクトルを返すようなものになる。
例えば
とする
Multi-head attention#
元のベクトルを等分割して複数のattentionに通す。
multiにするメリットは
並列計算可能になる
ソフトマックスはexpが入っていて極端な値になりやすい → 単一のattentionではなく複数使うことで、複数の観点から評価する(アンサンブル的な?
#
Attentionの可視化#
トークン間の距離を可視化。
動かせるデモサイトあり