Pythonで学ぶAttentionとSelf-Attention
Attentionは、各トークンが他のトークンを見て、どれが重要かを決める仕組みです。各トークンはQuery(探しているもの)、Key(提供するもの)、Value(渡す情報)を持ちます。
やさしい言葉で概念を理解する
Attentionは、各トークンが他のトークンを見て、どれが重要かを決める仕組みです。各トークンはQuery(探しているもの)、Key(提供するもの)、Value(渡す情報)を持ちます。
Query、Key、Valueを使ってscaled dot-product attentionを手計算し、GPTのようにcausal maskを加えます。
重要なポイント
- Attentionの重みはSoftmaxから得られるので、各行の合計は1です。
- √dで割ることで、長いベクトルでもスコアが大きくなりすぎるのを防ぎます。
- causal maskは、生成中にトークンが未来のトークンを見ないようにします。
- Multi-head attentionは複数のattentionを並列に実行し、位置エンコーディングは語順の情報を加えます。
どのような場面で使う?
- ニューラルネットワークやAIライブラリの内部で何が起きているかを理解する。
- 対応するチャレンジで実装する前に考え方をつかむ。
- 機械学習の講座、面接、プロジェクトに備える。
動かして理解する
ヒートマップの行をクリックすると、そのトークンがどこを見ているかがわかります。causal maskで未来のトークンを隠し、鋭さを変えてattentionを集中させましょう。
サンプルコード
main.py
import math
def softmax(row):
exps = [math.exp(v - max(row)) for v in row]
return [e / sum(exps) for e in exps]
# Three tokens, each with a query, key and value vector of size 2.
Q = [[1, 0], [0, 1], [1, 1]]
K = [[1, 0], [0, 1], [1, 1]]
V = [[10, 0], [0, 10], [5, 5]]
d = len(K[0])
def attention(causal=False):
out = []
for i, q in enumerate(Q):
# Score: how well this query matches every key, scaled by sqrt(d).
scores = [sum(a * b for a, b in zip(q, k)) / math.sqrt(d) for k in K]
if causal: # a token may only look at itself and earlier tokens
scores = [s if j <= i else -1e9 for j, s in enumerate(scores)]
weights = softmax(scores)
out.append([round(sum(w * v[c] for w, v in zip(weights, V)), 2) for c in range(2)])
return out
print("attention:", attention())
print("causal attention:", attention(causal=True))
期待される出力
attention: [[6.02, 3.98], [3.98, 6.02], [5.0, 5.0]]
causal attention: [[10.0, 0.0], [3.3, 6.7], [5.0, 5.0]]
仕組み
各Queryについて、スコアはすべてのKeyとの内積を√dで割ったものです。Softmaxがスコアを重みに変え、出力はValueの重み付き平均になります。causal maskを使うと最初のトークンは自分自身しか見えないので、出力は自分のValueである[10, 0]そのものになります。
値を変更し、PythonをインストールせずにCodeUtilityオンラインPythonコンパイラで実行できます。
練習問題
入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。
- 入力や重みを変えて、実行前に出力を予想してみましょう。
- 途中の値を出力して、計算の各ステップを追いましょう。
- 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- 正弦波による位置エンコーディング Transformer がトークンの埋め込みに加える、sin と cos による位置ベクトルを計算します。 中級
- スケールド・ドット積アテンション Transformer と大規模言語モデルの中心にあるアテンションの計算を実装します。 難しい
- 因果的(マスク付き)セルフアテンション GPT モデルが使うマスク付きアテンションを実装します。各トークンは自分と前のトークンだけを見られます。 中級
- マルチヘッド・セルフアテンション 入力をクエリ、キー、値に射影し、複数のヘッドで並列にアテンションを計算して結合します。 難しい