【Transformers】エラーValueError: Asking to pad but the tokenizer does not have a padding token. Please select a token to use as `pad_token`・・・・解決方法

はるか
はるか
トークナイザーにpadding tokenがない…。
ふゅか
ふゅか
だから、padding tokenを使うとエラーになっちゃうの。

1. エラーの内容

2. エラーの発生したコード

2.1. モデルの読み込み

モデルとしてllama3を使用します。トークナイザーを読み込みます。モデルは今回の問題と直接的に関係ないので、読み込みません。

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

model_id = "meta-llama/Meta-Llama-3-8B"

tokenizer = AutoTokenizer.from_pretrained(model_id)

2.2. 問題のあるコード

次に、以下のコードでエラーが発生しました。

prompt="Octave is "

# 入力に対して attention_mask を生成
inputs = tokenizer(prompt, return_tensors="pt", padding=True)
input_ids = inputs["input_ids"]
attention_mask = inputs["attention_mask"]

ここでは、ユーザーからの入力である「Octave is」をトークナイズし、attention_mask(注意マスク)を作成しようとしています。しかし、このコードを実行すると、ValueErrorが発生しました。

ValueError: Asking to pad but the tokenizer does not have a padding token. Please select a token to use as `pad_token` `(tokenizer.pad_token = tokenizer.eos_token e.g.)` or add a new pad token via `tokenizer.add_special_tokens({‘pad_token’: ‘[PAD]’})`.

日本語で説明すると、このエラーは次のような内容です。

トークナイザーに「padding token(埋め込み用のトークン)」が設定されていないため、padding=Trueを指定するとエラーが発生しています。このエラーを解消するには、トークナイザーにpad_tokenを指定する必要があります。

つまり、エラーを解消するためには、トークナイザーにpadding tokenを設定する必要があります。

3. 解決策

エラーを解決するために、以下の2つの方法があります。

はるか
はるか
エラーが出ないようにするには、padding tokenを設定するだけでいいのか。例えば、eos_tokenをpadding tokenにする。
ふゅか
ふゅか
でも、もしeos_tokenとして使いたくないなら、新しいトークンを追加する方法もあるわよ。

3.1. 解決策1:eos_tokenをpad_tokenに設定する

1つ目の方法は、既にトークナイザーに定義されている終端トークン(eos_token)をpadding tokenとして利用する方法です。この方法では、以下のコードを追加するだけで、エラーを回避できます。

tokenizer.pad_token = tokenizer.eos_token

3.2. 解決策2: 新しいpadding tokenを追加する

もう一つの方法として、新しいトークンをpadding tokenとして追加する方法もあります。例えば、”[PAD]”という特別なトークンを追加する場合は、以下のようにコードを記述します。

tokenizer.add_special_tokens({'pad_token': '[PAD]'})

どちらの方法を選んでも、トークナイザーに埋め込みトークンが設定されるため、padding=Trueの指定でエラーが発生しなくなります。

はるか
はるか
[PAD]は、確かbertで使われてた。

4. 関連した記事

5. Transformers・大規模言語モデルに関連する書籍

PR