この場合の語彙(ボキャブラリ、Vocabulary)とは、モデル全体が使用する全ての単語(またはサブワードやトークン)の集合を指します。これは、シーケンスやシーケンスと関わる特定の単語に限定されるものではなく、Transformerモデルが理解・生成するために訓練された、全ての可能なトークンが含まれています。
より具体的に言うと、以下のような点が重要です。
1. 語彙の定義
Transformerモデルにおける「語彙(Vocabulary)」は、全てのトークンの集合です。これは通常、次のような要素を含みます:
- 単語やサブワード:BPE(Byte Pair Encoding)やWordPieceといったトークン化技術により、単語やその部分(サブワード)をトークンとして表現します。
- 特殊トークン:文の開始を示す
<sos>
、文の終わりを示す<eos>
、未確認のトークン(例えば未知の単語)を示す<unk>
、パディングを示す<pad>
などが含まれます。
モデルの訓練時に、この語彙全体が使われ、各トークンには一意なIDが割り振られています。この語彙のサイズは、数千から数万単語に及ぶことが一般的です(例えば10,000や30,000など)。
2. 確率分布と語彙との関係
Transformerのデコーダが次のトークンを生成するときには、語彙全体に対してスコア(ロジット)を計算します。このスコアは、その時点での入力シーケンスやエンコーダの出力に基づいて、次に生成される可能性のある全てのトークンについて計算されます。
- 例えば、語彙が10,000個のトークンから構成されている場合、次のトークンを予測する際に、デコーダは語彙全体に対してそれぞれのトークンが次に来る確率を表すスコアを計算します。
- このスコアは、語彙内の全てのトークンに対して計算されるため、10,000次元のベクトルとして表現されます。この各スコアが、ソフトマックス関数を適用されることで、次に来るトークンの確率分布となります。
3. 語彙とシーケンスとの違い
- 語彙:モデルが理解・生成することが可能な全ての単語(またはサブワード)の集合。語彙サイズは固定であり、トレーニング中に定義されます(例えば、10,000トークン)。
- シーケンス:モデルが入力として受け取ったり、出力として生成したりする特定のトークンの列。各シーケンス内のトークンは語彙の一部である必要があり、語彙に含まれないトークンは
<unk>
などの未知トークンとして扱われます。
たとえば、以下のようなことが言えます:
- 語彙のサイズが10,000の場合、モデルは次に来るトークンを生成する際に、語彙の中からその時点における最も適切なトークンを選択します。
- その時点での入力シーケンスは、過去に生成されたトークンの列であり、それぞれのトークンは語彙に含まれるトークンの一つです。
4. シーケンスとの関連
デコーダがトークンを選ぶとき、過去に生成したシーケンスに基づいて次のトークンの予測を行います。このシーケンスは語彙内のトークンから構成されており、次に選ぶトークンも必ず語彙内に存在するトークンでなければなりません。つまり、シーケンスの各トークンは語彙の一部であり、次に生成するトークンの選択は語彙全体に対して行われます。
まとめ
- 語彙:Transformerモデルが利用する全てのトークンの集合です。モデルがトレーニング時に学習する全ての単語、サブワード、および特殊トークンが含まれています。語彙サイズは一般的に10,000以上で、モデルが出力する次のトークンの候補は語彙内から選ばれます。
- シーケンス:モデルが生成するトークンの列で、過去に生成されたトークンが次のトークン予測に使用されます。シーケンスに含まれるトークンはすべて語彙の中から選ばれるもので、語彙の外から選ばれることはありません。
したがって、ロジットの出力の次元は語彙のサイズに対応しており、シーケンスそのものではなく、モデル全体が認識する全トークン(語彙)に対するスコアを持つということになります。このスコアを基に、デコーディング手法を用いて最も適切なトークンが選ばれ、シーケンスに追加されていくのです。
【参考】語彙の「次元」とは?
この場合の語彙の10,000次元は、確率を計算する際の分母となります。これは、次のトークンが何になるかの確率分布を計算するために使われるソフトマックス関数で、語彙全体のスコアの合計が分母になります。
ソフトマックス関数と分母
次のトークンを決める際には、Transformerデコーダが生成するロジット(各トークンに対するスコア)に対してソフトマックス関数を適用します。ソフトマックスは以下の式で確率を計算します:
\[
P(y_t = i | y_{<t}, X) = \frac{\exp(\text{logit}i)}{\sum{j=1}^{V} \exp(\text{logit}_j)}
\]
ここで:
- \( P(y_t = i) \) はトークン \( i \) が次に選ばれる確率です。
- \(\text{logit}_i\) は語彙内のトークン \(i\) に対するロジット(スコア)です。
- \(V\) は語彙のサイズ(例えば10,000)を表し、全てのトークン数を意味します。
- \(\sum_{j=1}^{V} \exp(\text{logit}_j)\) が分母にあたる部分であり、全てのトークンのスコアの指数の合計です。
分母の役割
この分母は、確率分布の正規化を行うために存在します。
- 正規化の役割:ソフトマックス関数では、全てのトークンに対する確率の合計が1になるように調整します。これは確率分布として成立させるために必要な操作です。そのため、全てのトークンの指数を合計して分母とし、それによって各トークンのスコアが全体に対する相対的な確率になるように計算します。
- 例えば、語彙が10,000のトークンから成り立っている場合、その全てのトークンのスコア(ロジット)を指数関数(\(\exp\))に変換し、それを全て合計したものが分母になります。
実際の確率の計算
例えば、ある時点でデコーダが次のトークンを予測しようとしている場合、語彙が10,000個のトークンを持つとします。その時点でデコーダが次に選ばれるべきトークンとしてのスコア(ロジット)を計算し、それを使って次のような確率が計算されます。
- 分子:特定のトークン \(i\) のスコアに対して、\(\exp(\text{logit}_i)\) を計算します。
- 分母:語彙全体のスコアを指数関数にかけたものを全て合計します(語彙全体、つまり10,000個のトークンに対して行います)。
この分母により、全てのトークンの確率の合計が1になるように正規化されます。こうして、トークンごとに次に選ばれる確率が求められ、その中からデコーディング手法に応じて最終的なトークンが選ばれます。
例:簡単な直感的な例
例えば、語彙サイズが10,000で、それぞれのトークンに対してロジットが与えられたとします。それぞれのロジットに対して\(\exp(\text{logit})\)を計算すると仮定すると、それら全ての合計(つまり10,000個分の合計)が確率分布の分母になります。そして、特定のトークンが選ばれる確率は、そのトークンの\(\exp(\text{logit})\)をこの分母で割ったものです。
このようにして、分母は語彙全体(例えば10,000個)に渡るスコアの合計となるため、「語彙の10,000次元は分母」という理解は正しいものです。そして、この確率計算が行われることで、次にどのトークンが選ばれるべきかの判断が行われます。