クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

トークンの埋め込みと位置の符号化

このレッスンのあとで: トークンIDと位置から、トランスフォーマーの入力ベクトルを作ることができる。

55分のレッスンコマンド2件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

トークンIDから役に立つ数へ

トークンの埋め込みとは、1つのトークンを表す数の並びです。位置の符号化は、トークンがどこにあるかを示す信号を足すことです。この2つを合わせたものが、どのトランスフォーマーでも入力になります。

トークンIDは、ただの名札です。2という番号は、1より「多い」わけではありません。モデルには、かけたり足したりできる数が要ります。

このレッスンのゴール

メモ

トークンIDと位置から、トランスフォーマーの入力ベクトルを作ることができる。

キーワード

ことばいみれい
ベクトル数の並び[1, 0, 2]
埋め込み表トークンごとに1行の数を持つ表
埋め込み1つのトークンに当たる表の行
位置文の中でトークンがある場所、0から数える
位置の信号1つの位置を表すベクトル
入力ベクトル埋め込みに位置の信号を足したもの

学生が入力するセルは、このプレビューでは空白です。

埋め込み表はIDを数に変える

埋め込み表には、語彙のトークンごとに1行があります。トークンを埋め込むには、トークンIDと同じ番号の行を取り出します。その行が、トークンの埋め込みです。

この例の表は4トークンで、1行に3つの数があります。数は最初はでたらめで、学習の中で変わります。似た使われ方のトークンほど、似た行になります。

例: 小さな埋め込み表

トークンID行の数
猫01, 0, 2
の10, 1, 0
先生22, 1, 1
犬32, 1, -1

学生が入力するセルは、このプレビューでは空白です。

行を取り出して位置を足す

コード: python
# トークン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())"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。