Up トークンベクトル 作成: 2025-05-16
更新: 2025-06-02


  • トークンベクトル
    トークンを,決まった長さ (次元) の数ベクトルに表現する。

    記号法:
    • トークベクトルの次元 (固定) を,
         D
      で表す。
    • ID が n のトークン ( T( n ) ) のトークンベクトルを
         TV( n )
      で表す。

  • トークン表
    トークンは,つぎの表現を以て,登録・管理される:
    1. トークンID
    2. トークン情報
    3. トークンベクトル

    自明のことだが,トークンID やトークン情報 (「猫」とか) がトークンベクトルの内容でないことに注意。


  • トークンベクトル行列
    トークン表のトークンベクトルの部分は,トークンベクトルがトークンIDの順番で上から下へ並んだ,見掛け上,行列である。
    この行列── NV × D 行列 ── は,トークン埋め込み行列と呼ばれる。
    「埋め込み」の語は,この行列が「埋め込み層」に実装されることから来ている。
    本テクストでは,「トークンベクトル行列」と言うことにする。

    記号法:
    トークンベクトル TV(n) は,トークンベクトル行列の n 行ベクトルである。
    そこで, 「TV(n)」は,つぎのように読める:
    1. トークンベクトル行列を,TV で表す。
    2. これの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 の区別の話ならともかく,表に「静的・動的」の区別はない。
    「動的」とは「更新が頻発」ということである。──その更新と更新の間は「静的」である。