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コンパイラで実行できます。
練習問題
入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。
- 入力や重みを変えて、実行前に出力を予想してみましょう。
- 途中の値を出力して、計算の各ステップを追いましょう。
- 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- 単語トークナイザと語彙 テキストを小文字の単語に分割し、頻度順の語彙を作ります。あらゆる言語モデルの最初のステップです。 簡単
- ワンホットエンコーディング カテゴリを、1つだけ 1 を持つベクトルに変換します。分類器や埋め込みの入力形式です。 簡単
- バイトペアエンコーディング(BPE)のマージ GPT のトークナイザと同じように、最も頻出する隣接記号のペアを繰り返しマージしてサブワードを学習します。 中級