Pythonで学ぶAIの概念

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コンパイラで実行できます。

練習問題

入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。

  1. 入力や重みを変えて、実行前に出力を予想してみましょう。
  2. 途中の値を出力して、計算の各ステップを追いましょう。
  3. 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
Python IDEで実行 →

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ