言語モデルは最新のポケモンを知っているのか

## 概要
2023年に登場した各種言語モデルが最新のポケモンの知識を知っているのかどうかを定量的に調査しました。結果はOpenAI ChatGPTやGoogle PaLMを抑え **[ストックマーク13B](https://stockmark.co.jp/news/20231027)が最も優秀なスコアを記録** し、同モデルの「最新情報に強い」という主張を裏付ける結果となりました。

## はじめに
ポケモンは1996年に「ピカチュウ」などが登場して以降、3〜4年にいちど100種類前後のまとまった数の新しいキャラクターが断続的に追加されており、2022年に発売された最新作「スカーレット・バイオレット」によって1,000種類を超えました[^pokemon-1000]。ポケモンが追加されるに従って必要とされる知識も増加しており、近年ではアニメを通してポケモンのタイプについて啓蒙[^batsugun-type]したり、「ドン」が付くポケモンを列挙させるタスク[^rising-volt-tacklers-rap]が毎週繰り返し放送されるなど、ポケモンに関する知識獲得は社会における問題のひとつとして大きく捉えられています。人間による記憶の限界を迎える前に人工知能によるポケモンの知識獲得が求められます。

[^pokemon-1000]: Pokémon 1008 ENCOUNTERS https://www.youtube.com/watch?v=qYJwN4cvde0
[^batsugun-type]: 『バツグンタイプ』https://s.awa.fm/track/d95aa3aed2961af29b21
[^rising-volt-tacklers-rap]: 『ライジングボルテッカーズラップ』 https://www.lyrical-nonsense.com/lyrics/liko-roy-friede/rvr-rising-volteccers-rap-friede-ver/

本稿では、言語モデルが最新のポケモンについて知識を持っているのか調べてみました。言語モデルは学習データに使われた時期までの知識しか持っておらず、最新の情報について答えることができないことが弱点の一つと言われます。たとえばChatGPTは2021年までの知識しか持っていないとされています[^chatgpt-2021]。実際に[2022年に登場したポケモン「ハバタクカミ」について聞いてみた](https://qiita.com/suzuki_sh/items/43977bfa1d7c0ca59ff0)ところ、そのままでは正しく回答することができませんでした。（挙げた記事ではRAGによって外部知識を与えました）

[^chatgpt-2021]: https://help.openai.com/en/articles/6783457-what-is-chatgpt

本記事では、図のようにポケモンの名前を入力として言語モデルにポケモンのタイプを予測させることで、言語モデルがポケモンの知識を獲得しているかを調査します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/bf18a219-49af-83c7-d69c-d10c85fd6e2a.png)

ポケモンの名前のあとに正しいタイプを出力できたら正解とします。ポケモンとそのタイプについては[ポケモンずかん公式サイト](https://zukan.pokemon.co.jp/)などを参照してください。

### 補足: ポケモンの登場年代と世代について
ポケモンの登場時期は「世代」という表現をされますが、これはファンによる通称であり公式の呼称ではないため、本記事では西暦による年代を使います。世代と年代とタイトルの対応表は下記になります。

| 発売年 | 世代 | ゲームソフトタイトル |
|:--:|:--:|:--|
| 1996 | 1 | 赤・緑 |
| 1999 | 2 | 金・銀 |
| 2002 | 3 | ルビー・サファイア |
| 2006 | 4 | ダイヤモンド・パール |
| 2010 | 5 | ブラック・ホワイト |
| 2013 | 6 | X・Y |
| 2016 | 7 | サン・ムーン |
| 2019 | 8 | ソード・シールド |
| 2022 | 9 | スカーレット・バイオレット |

2022年11月に登場した「スカーレット・バイオレット」に登場する「ニャオハ」「クワッス」「ホゲータ」などのポケモンに関する知識を、2023年に登場した言語モデルが獲得しているかどうかを調査していきます。

## 実験
言語モデルでポケモンの名前を与え、そのタイプを予測します。タイプの正解データは[ポケモンWikiのポケモン一覧](https://wiki.xn--rckteqa2e.com/wiki/%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3%E4%B8%80%E8%A6%A7)から引用しました。問題が単純になるようにタイプをひとつだけ持つポケモンに絞るなど、以下のようにデータを加工しました。

- 各世代のフラグシップタイトル **以外** で初登場したポケモン（メルタンやバサギリ、アヤシシなど）は除外
    - 同時期に登場したポケモンが一定数以上いないため、実験が難しいと判断
- タイプをふたつ持つポケモン（カイリューのノーマル・ひこうタイプなど）は除外
- リージョンフォーム（ラッタのアローラのすがたはあくタイプ）などは除外
- 作品間でタイプが変わったポケモンは最新作品に準拠する

合計492件のデータが得られました。

| 年代 | 種類 |
|:--|--:|
| 1996 | 84 |
| 1999 | 51 |
| 2002 | 69 |
| 2006 | 53 |
| 2010 | 82 |
| 2013 | 31 |
| 2016 | 31 |
| 2019 | 50 |
| 2022 | 41 |
| **合計** | 492 |

### 実験用プログラム実行環境
- Python 3.10.12
- Google Colab A100 GPU
- transformers 4.35.2
- openai 1.3.7

### 言語モデルの使い方
[Few\-Shot Prompting](https://www.promptingguide.ai/techniques/fewshot)を使い、言語モデルの出力を調べます。
ここでは1996年と1999年のポケモンを「常識」として、2002年以降のポケモンをどれだけ知識として獲得しているかを調べます。1996年と1999年のポケモンからランダムに1匹ずつ選んでサンプルとし、テスト対象年代のポケモンの名前をpromptに含め、出力としてタイプが得られることを期待します。

たとえば、サンプルとして1996年登場のピカチュウと1999年登場のトゲピーを選び、テスト対象に2002年のアチャモを選んだ場合は以下のような入力となります。

```:prompt
ピカチュウ: でんき
トゲピー: フェアリー
アチャモ:
```

出力から`strip()`で空白文字列を除外してから、出力文字列の先頭から答えの文字数（トークン数ではない）だけ切り取り、正解と完全一致したかどうかで評価します。このテストを各年代ごとに50件ずつ行い、その正解率をスコアとします。
上記のアチャモの例では`ほのお`が正解ですが、前後に空白や改行文字が含まれていても正解とします。また、続きとして別のポケモンや文章が出力された場合も、先頭の文字列が正解と完全一致していれば正解とします。
一方で1文字でも異なっていた場合、「ほのお」を「炎」と漢字表記されていた場合などもすべて不正解とします。

たとえばOpenAIのGPTモデルを使う場合、以下のようなコードで実験をします。

```python
def chat(prompt, model_name="gpt-3.5-turbo"):
    chat_completion = openai_client.with_options(max_retries=5).chat.completions.create(
        messages=[{"role": "user","content": prompt}],
        model=model_name,
        max_tokens=10,
    )
    return chat_completion.choices[0].message.content

predicted = chat("""ピカチュウ: でんき
トゲピー: フェアリー
アチャモ:""")

answer = "ほのお"

print("predicted:", predicted)
print(predicted.strip()[:len(answer)] == answer)
```

```:出力
predicted: ほのお
True
```

言語モデルに対して与えるパラメータはすべてプログラムおよびSDKのデフォルト値としました。本来こういう実験をやるなら[temperature](https://qiita.com/suzuki_sh/items/8e449d231bb2f09a510c)を下げて再現性を取るべきかもしれませんが、出力が長文ではないので結果に大きな差は無いと思います。

### 補足: ポケモンのタイプの種類と傾向
ポケモンのタイプは「ほのお」「ノーマル」「みず」など全部で18種類あります。

完全にランダムに選択された場合1/18≒約5%が期待値となるので、この値をどれだけ上回るかで性能を測ります。実際には単純な18クラス分類問題ではなく、以下の要因によって上下します。

- 言語モデルの出力は当然ポケモンのタイプだけとは限らない
    - ポケモンのタイプであっても「でんき」を「電気」「エレクトリック」などと揺れた表記で出力する事がある
- ポケモンのタイプの分布には偏りがある
    - 一般に「みず」「ノーマル」などが多く、「こおり」や「フェアリー」が少ない
- ポケモンの知識を持っていなくても、名前から推測できる場合がある
    - ミズゴロウ→「みず」、ナゾノクサ→「くさ」など

### 実験対象の言語モデル
実験対象には2023年にリリースされた言語モデルを選択しました。実際に2023年のデータが学習に使われているかどうかはモデルによって異なり、特に2022年に登場したポケモンの知識を獲得できているかどうかに差が出ると仮定されます。

商用のクローズドなモデルと、日本語のオープンなモデルをそれぞれ複数選択しました。オープンなモデルについてはGoogle Colab Proで安定して動作させられる範囲にしました。なお、ここでは以下のモデルはすべて本記事における実験のみを目的として利用しています。

- [OpenAI gpt-3.5-turbo-0613](https://openai.com/blog/function-calling-and-other-api-updates#:~:text=with%20GPT%2D4!-,GPT%2D3.5%20Turbo,-gpt%2D3.5%2Dturbo)
    - 2023年6月にリリースされた、GPT-3.5のひとつ前のバージョン
    - 学習データは2021年9月まで
- [OpenAI gpt-3.5-turbo-1106](https://openai.com/blog/new-models-and-developer-products-announced-at-devday#:~:text=Updated%20GPT%2D3.5%20Turbo)
    - 2023年11月にリリースされた、GPT-3.5の最新バージョン
    - 学習データは2021年9月まで
- [OpenAI gpt-4-1106-preview](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo)
    - 2023年11月にリリースされた、GPT-4の最新バージョン。GPT-4-Turboと呼ばれるモデル
    - 2023年4月までのデータで学習されています
- [OpenAI gpt-4-0314](https://openai.com/research/gpt-4)
    - 2023年3月にリリースされた、GPT-4のひとつ前のバージョン。最初のGPT-4です
    - 学習データは2021年9月まで
- [Google Cloud PaLM 2 text-bison@001](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models?hl=ja)
    - Google Cloud Vertex AIにて公開されているモデルのひとつで、いわゆるBardと呼ばれるものの内部モデルです
    - 2023年2月までのデータで学習されています
- [stockmark/stockmark-13b](https://tech.stockmark.co.jp/blog/202310_stockmark_13b/)
    - ストックマーク社が2023年10月に公開したモデルです
    - 「ビジネスのドメインや最新情報に対応した」と謳っており、今回のような最新知識を問うタスクにおける性能が期待できます
- [pfnet/plamo-13b](https://www.preferred.jp/ja/news/pr20230928/)
    - Preferred Networks社が2023年9月に公開したモデルです
    - LLaMAのアーキテクチャを踏襲し事前学習を行ったモデルです
- [rinna/youri-7b-gptq](https://rinna.co.jp/news/2023/10/20231031.html)
    - rinna社が2023年10月に公開したモデルです
    - Llama 2の日本語継続事前学習モデルです
- [stabilityai/japanese-stablelm-base-ja_vocab-beta-7b](https://ja.stability.ai/blog/japanese-stable-lm-beta)
    - Stability AI Japanが公開した2023年11月にモデルです
    - Llama 2の日本語継続事前学習モデルです
- [elyza/ELYZA-japanese-Llama-2-7b-instruct](https://note.com/elyza/n/na405acaca130)
    - ELYZA社が2023年8月に公開したモデルです
    - Llama 2をベースに日本語で追加事前学習を行ったモデルです
- [cyberagent/calm2-7b](https://www.cyberagent.co.jp/news/detail/id=29479)
    - サイバーエージェントが2023年11月に公開したモデルです

## 結果
2002年から2022年まで7世代分の正答率と、すべての平均が以下の図です。

| 世代 | 2002（3） | 2006（4） | 2010（5） | 2013（6） | 2016（7） | 2019（8） | 2022（9） | 平均 |
|:--|:--|:--|:--|:--|:--|:--|:--|:--|
| OpenAI gpt-3.5-turbo-0613 | 82% | 64% | 64% | 70% | 74% | 50% | 32% | 62% |
| OpenAI gpt-3.5-turbo-1106 | 44% | 52% | 44% | 22% | 54% | 26% | 14% | 37% |
| OpenAI gpt-4-1106-preview | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% |
| OpenAI gpt-4-0314 | 64% | 80% | 78% | 44% | 70% | 66% | 30% | 62% |
| Google Cloud PaLM 2 text-bison@001 | 42% | 36% | 26% | 30% | 48% | 42% | 8% | 33% |
| **stockmark/stockmark-13b** | 86% | 92% | 78% | 70% | 74% | 72% | 44% | 74% |
| pfnet/plamo-13b | 20% | 24% | 16% | 10% | 24% | 6% | 22% | 17% |
| rinna/youri-7b-gptq | 16% | 6% | 6% | 12% | 12% | 10% | 14% | 11% |
| stabilityai/japanese-stablelm-base-ja_vocab-beta-7b | 18% | 12% | 14% | 6% | 6% | 6% | 14% | 11% |
| elyza/ELYZA-japanese-Llama-2-7b-instruct | 6% | 8% | 6% | 2% | 0% | 6% | 8% | 5% |
| cyberagent/calm2-7b | 28% | 38% | 36% | 28% | 34% | 32% | 16% | 30% |

モデルごとの平均正答率のグラフが下記です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/b5ef7eb9-aa12-9712-3c9c-a9773fe7eaec.png)

日本のオープンな言語モデルである **stockmark/stockmark-13b** が最も高い性能を記録しました。
特にOpenAI ChatGPTやGoogle PaLMなどの強力なクローズドのモデルを超える結果となったのは驚くべき結果だと思います。最新のポケモンについても精度は落ちますがそれでも半分程度の正解率を誇っており、最新のポケモン知識を持った言語モデルであると言えるでしょう。このモデルはストックマーク社が公式に「最新情報に強い」と謳って公開されているものであり、ちゃんと性能にあらわれていることが分かりました。

次いで **OpenAI gpt-3.5-turbo-0613、gpt-4-0314** が並びました。OpenAIにはより新しいモデルがありますが、本実験においては最新のモデルよりもひとつバージョンの古いモデルが高いスコアとなりました。
本実験において平均の正答率50%を超えたモデルは以上3つでした。これらはポケモンについて一定以上の知識を獲得していると言えるのではないでしょうか。

世代間の正答率の差、とくに2019年から2022年のあいだでの正答率の変化を見てみます。全体平均30%以上の正解率を記録したすべてのモデルにおいて、2019年から2022年のあいだで正解率の低下が見られました。これらのモデルにとって2022年の最新のポケモンの知識獲得が難しいタスクであることを示しています。

本実験は18クラスの分類問題と捉えることができますが、多くのモデル・世代において正答率が6%を超えたため、どのモデルも性能の差はありますがポケモンのタイプを予測するというタスクに対応はできていると言えると思います。

### 出力結果例
#### stockmark/stockmark-13b
最も性能が高かったstockmark/stockmark-13bの例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/b84e699c-b41d-baa9-276b-b2cce50dd512.png)

ヘイラッシャ（みず）やキョジオーン（いわ）を当てられているのが分かります。

また今回のタスクのスコアには反映されないですが、`クワッス:`の続きとして`ニャオハ: くさ`を出力するといった、2022年登場のポケモンの並びというドメイン知識をよく理解しているとみられる出力も見られました。

```:input
ベトベトン: どく
スイクン: みず
クワッス:
```

```:output
みず
ニャオハ: くさ(
```

#### 統計的な特徴による回答の例
以下はStableLMの結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/3c06ec30-dde9-e30b-64be-bca0679177ba.png)

StableLMやPLaMoは、このように「ノーマル」など特定のタイプを多く出力する傾向が見られました。
これは、ポケモンの名称とタイプを知識として獲得するよりも、ポケモンのタイプとして「ノーマル」が多いといった統計的な特徴に強く影響されているのではないかとみられます。これらのモデルは最新のポケモンのような未知の単語に対しても正答率が落ちにくい反面、一定以上の正答率にはなりません。

#### クローズドな言語モデルの例
以下はGoogle PaLMの結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/0c8420a4-6bed-027c-3b1a-8655a836b798.png)

ChatGPTやPaLMはタイプのみを出力して止まる傾向があり、内容の正しさを問わずfew shot promptingを忠実に守っていると分かります。

#### GPT-4-Turboの結果
ところで実験結果のスコアでは、OpenAI gpt-4-1106-preview	いわゆるGPT-4-Turboが0点となってしまいました。GPT-4-Turboは、一般的には非常に性能が高いとされるGPT-4の最新モデルであり、また2023年の学習データも使われているということで、もちろん本タスクでも最も高い性能を見せると思っていました。

しかし実験してみると、他のすべてのモデルに対しては同一の入力で有効だったFew-shot PromptingがGPT-4-Turboのみまったくうまくいきませんでした。以下のようにポケモンのタイプを出力できなかったためスコアが付きませんでした。

```:input
ゴルダック: みず
マグマッグ: ほのお
デオキシス:
```

```:output
ゴルダック (Golduck)、
```

理由は分かりませんが、他の言語モデル（Turboではない以前のGPT-4を含む）とは異なる挙動をする傾向があるようです。

## まとめ
ChatGPTなどの2023年に登場した多くの言語モデルは、2019年（ソード・シールド）世代までのポケモンの知識は持っていることが分かりました。またStockmark-13bは2023年時点で最新のポケモン（スカーレット・バイオレット）までの知識を持っていることが分かりました。
次はリージョンフォームがいるポケモンを言語モデルに列挙させるタスクなどに取り組んでみたいと思いました。