- トークンベクトル
トークンを,決まった長さ (次元) の数ベクトルに表現する。
記号法:
- トークベクトルの次元 (固定) を,
D
で表す。
- ID が n のトークン ( T( n ) ) のトークンベクトルを
TV( n )
で表す。
- トークン表
トークンは,つぎの表現を以て,登録・管理される:
- トークンID
- トークン情報
- トークンベクトル
自明のことだが,トークンID やトークン情報 (「猫」とか) がトークンベクトルの内容でないことに注意。
- トークンベクトル行列
トークン表のトークンベクトルの部分は,トークンベクトルがトークンIDの順番で上から下へ並んだ,見掛け上,行列である。
この行列── NV × D 行列 ── は,トークン埋め込み行列と呼ばれる。
「埋め込み」の語は,この行列が「埋め込み層」に実装されることから来ている。
本テクストでは,「トークンベクトル行列」と言うことにする。
記号法:
トークンベクトル TV(n) は,トークンベクトル行列の n 行ベクトルである。
そこで, 「TV(n)」は,つぎのように読める:
- トークンベクトル行列を,TV で表す。
- これのn行ベクトル TV_n を,特に TV( n ) で表す。
表記「TV( n )」は,つぎのように n の表現が長くなるときに,便利である:
「 |
テクストS の i 番目のトークンの ID を ID_i で表すと,このトークンのトークンベクトルは, TV(ID_i) ( ← T_(ID_i) )。」
|
- トークンベクトル行列の実装
これは技術論になり,本テクスト『Transformer』の能くするところではない。
断片的なことばを集めるにとどめる:
- トークIDをインデックスとする lookup table。
──登録トークン数が,表の行数ということになる。
- torch.nn.Embedding などで定義される
embedding = nn.Embedding(vocab_size, d_model)
# トークン数 × ベクトル次元
例えば「50000語の語彙それぞれに, 768次元のベクトルを割り当てるテーブル」の作成は:
embedding = nn.Embedding(num_embeddings=50000, embedding_dim=768)
- 実体は, 「可変なパラメータ付きテンソル」。
- トークンIDからその行を引き出すという操作は,高速なテンソルインデクシングで実装される。
- トークンベクトルの初期設定
トークンベクトルは,学習で変わっていくものである。
これの登録では,初期値を設定することになる。
初期値は,基本ランダムだが,"小さな乱数" にする:
- 平均0, 分散の小さいガウス分布(正規分布)や一様分布。
これの意味は,「トークンは全て,初期状態では対等に扱われる」(「対称性の打破」)。
- トークンベクトルの検索
「学習」の内容は,
学習材テクストの入力に対し,
テクストをトークンに分割し,
トークの並びの順に,対応するトークンベクトルを順序づけ,
彼らにルールプレイをさせる。
である。
そして,「トークの並びの順に,対応するトークンベクトルを順序づける」ところで,「トークンベクトルの検索」になる。
検索の内容を問うことは,技術論になる。
ここではその断片を集めるにとどめる。
- トークンID(整数)は,one-hot ベクトルに表されている。
このとき,ID が n のトークンベクトルは,n の one-hot ベクトルにトークンベクトル行列 T をかけることで取り出せる。
( one-hot ベクトルを行ベクトルにして,T を右からかける。)
これを,トークンベクトルの検索方法にしている。
数式的には「線形変換 T」をしているわけである。
- 実装上は「ルックアップ」(整数を直接 index に使う) として,高速に処理される。
- 検索の概略コード
python
"cat"
→ token_to_id["cat"] = 845
→ embedding_matrix[845] = TV(845)
- 表のリアルとバーチャル
表は,コンピュータのメモリの中の値として存在する。
この値は,メモリ番号で管理される。
プログラムで表の内容を呼び出すことは,メモリ番号を指すポインタ変数を使って,特定のメモリ番号の値を読み込むことである。
表の内容を更新することは,<読み込み>を<上書き>に変えることである。
Python であろうと C であろうと,コンピュータのアーキテクチャが変わらない限り,表の値の読み書きの方法は,この1つである。
特に,表のイメージの「行と列」や「テンソル空間の点」は,幻想 (virtuality) である。
また,ROM・RAM の区別の話ならともかく,表に「静的・動的」の区別はない。
「動的」とは「更新が頻発」ということである。──その更新と更新の間は「静的」である。
|