Next Token Predictionとは言語モデルのタスクのことです。具体的には、与えられた単語の列から次の単語を予想するタスク表します。
トークンの種類とそれぞれの特徴
トークンとは機械学習における文章の分割の最小単位です。例えば、 I love youという文であれば “I” “love” “you”というように分割できます。分割単位は必ずしも単語単位とは限らないため、いくつか紹介していきます。
単語トークン化
単語トークン化は文章を単語で区切る方法です。先ほどの例で挙げた、 I love youを[ “I” ,”love” ,”you”]というように単語ごとに分割する方法です。単語トークン化は意味的関係を保持した状態で処理を行えるという利点がありますが、単語の種類は膨大にあるため、語彙サイズ、つまりモデルが扱うトークンの種類が膨大になるという欠点があります。

文字トークン化
文字トークン化は文章を文字ごとに区切る方法です。 I love you を文字トークン化すると [“I”,”l”,”o”,”v”,”e”,”y”,”o”,”u”]となります。文字トークン化の利点は未知の単語に対応できる可能性があることです。単語トークン化とは異なり、文字トークン化は語彙サイズが文字単位なので、未知の単語に対しても文字列の組み合わせによって表現可能です。欠点は、文脈を理解できないこと、シーケンスが大きくなることです。シーケンスは今回の例では、単語トークン化が3つなのに対して、文字トークン化は8つになっています。

サブワードトークン化
サブワードトークン化は、文章をサブワード単位に分解する方法です。I am unbelievably happyをサブワードトークン化すると、[“I”, ” “, “am”, ” “, “un”, “believ”, “ably”, ” “, “happy”, “.”]となります。サブワードトークン化はよく使われる手法で、GPTなどの最新のモデルもこのトークン化を採用しています。サブワードトークン化は語彙サイズが適切で未知単語にも対応できます。欠点としては前処理が複雑で、サブワードトークン化することが難しいことが挙げられます。

Next Token Predictionとは
Next Token Predictionとは与えられたトークン列から次のトークンを予想するタスクのことです。これらは主に言語生成モデルの学習のために使われるタスクです。モデルは前トークンから次の単語が来る確率を語彙リストの単語に対して計算します。モデルの出力としては、語彙リストの中で最も確率が高いものが選らばれます。下記の例では最も確率の高いsingingがモデルの出力となります。

やってみよう
実際のコードについて解説します。下記はNext Token Predictionのデモコードになります。
from transformers import GPT2Tokenizer, GPT2LMHeadModel
import torch
# モデルとトークナイザーのロード
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
# テキストの入力
input_text = "The cat is sitting on the"
# トークン化
input_ids = tokenizer.encode(input_text, return_tensors='pt')
# モデルで次のトークンを予測
with torch.no_grad():
outputs = model(input_ids)
next_token_logits = outputs.logits[:, -1, :]
# 最も確率の高いトークンを取得
predicted_token_id = torch.argmax(next_token_logits, dim=-1).item()
predicted_token = tokenizer.decode(predicted_token_id)
print(f"Input: {input_text}")
print(f"Next predicted token: {predicted_token}")
コードでは、GPT2のモデルをダウンロードし、モデルに”The cat is sitting on the”という入力を与えることで、それに続くトークンを予想させています。結果としては、”floor”という出力が戻ってきました。場所を表しているため、悪くない結果であると思います。

まとめ
今回はLLMの予想タスクであるNext Token Predictionについて解説しました。自身でLLMモデルを作成したり、使いたいモデルの性能をテストする際にぜひ活用してみてください。