Pythonで学ぶAIの概念

Pythonで学ぶトークン化:語彙、one-hot、バイトペアエンコーディング

ニューラルネットワークは数値しか扱えないので、テキストはまずトークンに分割され、各トークンにIDが付けられます。GPTのような言語モデルは、よく現れる単語の断片からトークンを作るバイトペアエンコーディングを使います。

やさしい言葉で概念を理解する

ニューラルネットワークは数値しか扱えないので、テキストはまずトークンに分割され、各トークンにIDが付けられます。GPTのような言語モデルは、よく現れる単語の断片からトークンを作るバイトペアエンコーディングを使います。

言語モデルと同じようにテキストを数値に変えます。語彙を作り、単語をone-hotで表し、BPEでサブワードのトークンを学習します。

重要なポイント

  • トークンはテキストの単位で、単語、単語の一部、文字などです。
  • one-hotベクトルは簡単ですが、語彙が大きいととても長くなります。
  • BPEは珍しい単語や新しい単語を既知の断片に分けて扱います。
  • その後、モデルは各トークンIDを埋め込み(embedding)と呼ばれる学習済みベクトルに変換します。

どのような場面で使う?

  • ニューラルネットワークやAIライブラリの内部で何が起きているかを理解する。
  • 対応するチャレンジで実装する前に考え方をつかむ。
  • 機械学習の講座、面接、プロジェクトに備える。

動かして理解する

好きな文を入力して語彙を作り、ステップを押すとバイトペアエンコーディングが最も多いペアを結合する様子が見られます。

サンプルコード

コードを実行 →
main.py
from collections import Counter

text = "the cat sat on the mat"

# 1. Build a vocabulary: every distinct word gets an id.
words = text.split()
vocab = {word: i for i, word in enumerate(sorted(set(words)))}
print("vocab:", vocab)
print("ids:", [vocab[w] for w in words])

# 2. One-hot encoding: a vector with a single 1 at the word's id.
def one_hot(word):
    return [1 if vocab[word] == i else 0 for i in range(len(vocab))]
print("one-hot 'cat':", one_hot("cat"))

# 3. Byte pair encoding: repeatedly merge the most frequent pair of symbols.
tokens = list("banana")
for _ in range(2):
    pairs = Counter(zip(tokens, tokens[1:]))
    best = max(pairs, key=pairs.get)
    merged, i = [], 0
    while i < len(tokens):
        if i + 1 < len(tokens) and (tokens[i], tokens[i + 1]) == best:
            merged.append(tokens[i] + tokens[i + 1])
            i += 2
        else:
            merged.append(tokens[i])
            i += 1
    tokens = merged
    print("merge", best, "->", tokens)

期待される出力

vocab: {'cat': 0, 'mat': 1, 'on': 2, 'sat': 3, 'the': 4}
ids: [4, 0, 3, 2, 4, 1]
one-hot 'cat': [1, 0, 0, 0, 0]
merge ('a', 'n') -> ['b', 'an', 'an', 'a']
merge ('b', 'an') -> ['ban', 'an', 'a']

仕組み

語彙は異なる単語それぞれをIDに対応させ、文はIDのリストになります。one-hotベクトルは単語のIDの位置だけが1です。BPEは隣り合う記号のペアを数えて最も多いものを結合し、まず('a', 'n')、次に('b', 'an')を結合します。

値を変更し、PythonをインストールせずにCodeUtilityオンラインPythonコンパイラで実行できます。

練習問題

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

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

チャレンジで練習する

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

すべてのチャレンジ