トークンIDから役に立つ数へ
トークンの埋め込みとは、1つのトークンを表す数の並びです。位置の符号化は、トークンがどこにあるかを示す信号を足すことです。この2つを合わせたものが、どのトランスフォーマーでも入力になります。
トークンIDは、ただの名札です。2という番号は、1より「多い」わけではありません。モデルには、かけたり足したりできる数が要ります。
このレッスンのゴール
メモ
トークンIDと位置から、トランスフォーマーの入力ベクトルを作ることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ベクトル | 数の並び | [1, 0, 2] |
| 埋め込み表 | トークンごとに1行の数を持つ表 | |
| 埋め込み | 1つのトークンに当たる表の行 | |
| 位置 | 文の中でトークンがある場所、0から数える | |
| 位置の信号 | 1つの位置を表すベクトル | |
| 入力ベクトル | 埋め込みに位置の信号を足したもの |
学生が入力するセルは、このプレビューでは空白です。
埋め込み表はIDを数に変える
埋め込み表には、語彙のトークンごとに1行があります。トークンを埋め込むには、トークンIDと同じ番号の行を取り出します。その行が、トークンの埋め込みです。
この例の表は4トークンで、1行に3つの数があります。数は最初はでたらめで、学習の中で変わります。似た使われ方のトークンほど、似た行になります。
例: 小さな埋め込み表
| トークン | ID | 行の数 |
|---|---|---|
| 猫 | 0 | 1, 0, 2 |
| の | 1 | 0, 1, 0 |
| 先生 | 2 | 2, 1, 1 |
| 犬 | 3 | 2, 1, -1 |
学生が入力するセルは、このプレビューでは空白です。
行を取り出して位置を足す
# トークンIDごとに1行の数: 猫、の、先生、犬。
table = [[1, 0, 2], [0, 1, 0], [2, 1, 1], [2, 1, -1]]
# 文の中の位置ごとに1行: 1番目、2番目、3番目。
positions = [[1, 1, 0], [0, 1, 1], [1, 0, 1]]
ids = [0, 1, 2] # 猫 の 先生
for place in range(len(ids)):
row = table[ids[place]]
signal = positions[place]
vector = []
for j in range(3):
vector.append(row[j] + signal[j])
print("ID", ids[place], "行", row, "+ 位置", signal, "=", vector)
# ids を [2, 1, 0](先生 の 猫)に変えて、実行してください。
# どのトークンのベクトルが変わり、どれが変わりませんか。
本物の表はどのくらい大きいか
docker exec jupyter python3 -c "print(50000 * 512)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
順番は大事だが、表では表せない
「猫の先生」と「先生の猫」は、同じ3つのトークンでできています。でも意味はまったく違います。行を取り出すだけでは、どこにあっても同じ行になります。
次のレッスンの注意は、トークンのベクトルを混ぜる手順です。注意だけでは、トークンを順番のない袋として扱います。何も手を加えなければ、モデルはこの2つの文を見分けられません。
例: 順番が違っても行は同じ
| 文 | 1番目 | 2番目 | 3番目 |
|---|---|---|---|
| 猫 の 先生 | 猫: 1, 0, 2 | の: 0, 1, 0 | 先生: 2, 1, 1 |
| 先生 の 猫 | 先生: 2, 1, 1 | の: 0, 1, 0 | 猫: 1, 0, 2 |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
トークンが順番に届くので、モデルは語の順番を知っていると考えがちです。注意はトークンを袋として扱います。モデルが順番を知る手がかりは、最初の層の前に、各トークンへ足す位置の信号です。
各トークンに位置の信号を足す
もう1つの表には、位置ごとに1行があります。1番目、2番目、3番目です。トークンの位置の行を、その埋め込みに数ごとに足します。結果が入力ベクトルです。
これで、1番目の「猫」と3番目の「猫」は、違う入力ベクトルになります。位置の表を学習で覚えるモデルもあれば、学習の要らない決まった波の形を使うモデルもあります。
例: 位置の信号を足す
| 場所 | 位置の信号 | 「猫 の 先生」 | 「先生 の 猫」 |
|---|---|---|---|
| 1番目 | 1, 1, 0 | 猫: 1+1, 0+1, 2+0 = 2, 1, 2 | 先生: 3, 2, 1 |
| 2番目 | 0, 1, 1 | の: 0, 2, 1 | の: 0, 2, 1 |
| 3番目 | 1, 0, 1 | 先生: 3, 1, 2 | 猫: 1+1, 0+0, 2+1 = 2, 0, 3 |
学生が入力するセルは、このプレビューでは空白です。
NumPy で2つの文を埋め込む
docker exec jupyter python3 -c "import numpy as np; E = np.array([[1, 0, 2], [0, 1, 0], [2, 1, 1], [2, 1, -1]]); P = np.array([[1, 1, 0], [0, 1, 1], [1, 0, 1]]); print((E[[0, 1, 2]] + P).tolist()); print((E[[2, 1, 0]] + P).tolist())"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。