もうモデル選びには迷わない!? 言語モデルを簡単に比較する手法について

# 1. モデル選択に悩んでいる方々へ

「事前学習済みモデルをファインチューニングして自然言語処理タスクを解きたいが、アーキテクチャやサイズが異なるモデルが色々ありすぎて、どのモデルを使ったらいいか分からない」
上記のような悩みを持っている人も多いのではないでしょうか？
この記事では、言語モデルの違いを可視化できるツールを利用して、いくつかの日本語対応モデルを比較したので、みなさんのモデル選択の助けになればと思います。
また、可視化ツールの見方や比較方法の詳細についても載せています。

# 2. それで、結局どのモデルが良いの？

早速、モデルの比較結果を見てもらいたいと思います。
今回比較したモデルは、HuggingFaceに上がっている日本語対応モデルになります。

| 比較対象 | モデル1 | モデル2 | 比較結果 |
| --- | --- | --- | --- |
| GPT-2のモデルサイズの比較 | [rinna/japanese-gpt2-medium](https://huggingface.co/rinna/japanese-gpt2-medium) | [rinna/japanese-gpt2-xsmall](https://huggingface.co/rinna/japanese-gpt2-xsmall) | 英語や慣用句を含んだ文章を扱うなら、japanese-gpt2-mediumにした方が良さそう |
| BERTのモデルサイズの比較 | [cl-tohoku/bert-large-japanese](https://huggingface.co/cl-tohoku/bert-large-japanese) | [cl-tohoku/bert-base-japanese-v2](https://huggingface.co/cl-tohoku/bert-base-japanese-v2) | 性能差はあまり見られないので、処理量やメモリ消費量が少ない、bert-base-japanese-v2の方が良さそう |
| BERTの学習手法の比較 | [cl-tohoku/bert-base-japanese-whole-word-masking](https://huggingface.co/cl-tohoku/bert-base-japanese-whole-word-masking) | [cl-tohoku/bert-base-japanese](https://huggingface.co/cl-tohoku/bert-base-japanese) | bert-base-japaneseの方が、慣用句を間違えにくい |
| 多言語BERTのモデルサイズ（蒸留）の比較 | [bert-base-multilingual-cased](https://huggingface.co/bert-base-multilingual-cased) | [distilbert-base-multilingual-cased](https://huggingface.co/distilbert-base-multilingual-cased) | distlbert-base-multilingual-casedの方では、予測に他の言語が混ざってしまう可能性が高そう |

# 3. どうやってモデルを比較したのか
上記の比較結果を出すために、 [LMDiff](https://arxiv.org/abs/2111.01582) というツールを利用しました。
トークナイザーが一致している二つの言語モデル（gpt系やbert系）と、テキストのデータセットをこのツールに入力することで、簡単に比較を行うことができます。

このツールには二種類の分析手法があります。
一つ目が、データセットレベルでの分析手法です。複数の文章を対象にモデルを比較することで、特に予測結果の差が大きかった文を確認することができます。
二つ目が、文レベルでの分析手法です。一つの文を対象にモデルを比較することで、特に予測結果の差が大きかったトークンを確認することができます。
以下の章で、分析手法の詳細について説明します。

## データセットレベルでの分析
一つ目は、複数の文章から構成されるデータセットを元に、二つのモデルの性能を比較する手法です。
文章中の各文に対する、二つのモデルの予測結果の差をグラフ化し、差が大きかった文をピックアップしてくれます。
使い方として、まずデータセットと評価指標を選択し、サーチボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/9ee882bf-b414-82b5-b4fb-b4cfb4c0eed6.png)

サーチボタンを押すと、以下のような分析結果が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/420463d5-5f5b-1d61-b2af-a4f59910fd64.png)

左側のグラフでは、横軸が二つのモデルによる評価指標の差を、縦軸がデータの数を表しています。今回の例では、0を基準としてグラフが左側に偏っているので、モデル1の方が優れた予測をしたデータが多かったことが分かります。
グラフの右側には、予測結果の差が大きかった順に文を表示してくれます。文の末尾に書かれている数値の絶対値が大きいほど、二つのモデルの予測結果の差が大きかったことを表しています。

## 文レベルでの分析
二つ目は、データセットの分析によってピックアップされた文に対して、さらにトークン単位の分析を行う手法です。
トークン毎に、そのトークンが予測される確率とランクを確認することができます。
使い方としては、ピックアップされた文章を押すか、適当な文章を入力してアナライズボタンを押します。以下の例では、「他のレビューと比べると完全に不良品に当たった感じです。」という文章を分析しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/95a45db1-48d9-454b-0798-6bf26aeb498d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/7eb003a9-f918-2f4d-1368-21af9033d314.png)

分析したい文章を入力すると、以下のような分析結果が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/74bf4a65-7727-2f9d-48ac-27814d2290a7.png)

上のグラフでは、横軸が入力された文章のトークンの位置を、縦軸がトークンが予測された確率、又は予測されたランクを表しています。また、赤い線がモデル1の予測結果を、青い線がモデル2の予測結果を表しています。確率のグラフでは、トークンの予測確率が高ければ高いほど性能が良いとされ、ランクのグラフでは、トークンが予測されるランクが1位に近ければ近いほど良いとされます。確率のグラフを見ると、赤い線の方が青い線より全体的に上にあるので、この文に対してはモデル1の方が性能が良いと言えそうです。

また、上のグラフ以外に、下の図のような分析結果も出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/42f43637-fe20-5f34-181c-d6a47facda96.png)

一番上の評価指標を選択することで、Tokensに現れる下線と Token Statisticsをインタラクティブに変更することができます。Tokensに現れる下線は、そのトークンの予測結果の差が大きかったことを表しています。赤い色が濃いほどモデル1の方が良い予測結果であることを示しており、青ければモデル2の方が良い予測を出せていたことを示しています。
また文の中のトークンを押したりホバーすることで、そのトークンの詳細な予測結果をSelected Tokensのように確認することができます。正解のトークンがどれくらいの確率で予測されたかや、正解のトークンの予測確率が全トークンの中で何番目に高かったかを表すランクなどの情報を知ることができます。
Token Statisticsでは、横軸がトークンの予測結果がどちらのモデルに偏っているかを、縦軸がトークン数を表しています。今回の例では、右側の赤い棒グラフの方が左の青い棒グラフより長いので、モデル1の方が良い予測結果を出せていると言えそうです。

# 4. 実際の分析結果
今回の分析には、[Amazonのレビューのデータセット](https://huggingface.co/datasets/amazon_reviews_multi)を利用しています。

## GPT-2のモデルサイズの比較
| モデル1 | モデル2 | 比較結果 |
| --- | --- | --- |
| rinna/japanese-gpt2-medium | rinna/japanese-gpt2-xsmall | 英語や慣用句を含んだ文章を扱うなら、japanese-gpt2-mediumにした方が良さそう |

データセット分析のAverage Probability Diffにおいて、目立った差がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/4dc47f20-1025-3deb-b330-f29c46c1527a.png)

予測ランクの差がモデル1の方に偏っていたため、いくつかの文をトークン単位で分析しました。
今回は例として、「Debian GNU/Linux 4.9.0-6-amd64で使用。」という文を分析した結果を示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/9351d9f2-fa31-fd94-a048-e50178c16aa6.png)

分析した結果、「gnu/linux」という定型句の予測に関して、モデル1は高い確率で予測できているにも関わらず、モデル2では予測確率がほぼ0でした。この結果から、モデル1に比べてモデル2が対応している英語の定型句数は少なそうと判断しました。

**この傾向が見られた他の文章**
（太文字の場所に、比較結果の傾向が現れました）

- **scansnap** **organizer**で充分。
- 今後**Lenovo**や**Motorola**の製品を買うことはありません。

他にも傾向がありそうだったので、「待てど暮らせど商品が届きません。」という文を分析した結果を示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/067270e7-f0ee-9703-b39b-45d38ff38f79.png)

分析した結果、「待てど暮らせど」という慣用句の「暮らせど」の部分の予測に関して、モデル1は高い確率で予測できているにも関わらず、モデル2では予測確率が低めでした。この結果から、モデル1に比べてモデル2が対応している定型句・慣用句数は少なそうと判断しました。

**この傾向が見られた他の文章**
（太文字の場所に、比較結果の傾向が現れました）

- **安物買いのなんとやら**だね。
- 分かりづらい**ったらありゃしない**。
- 安かったので**物は試し**と購入しました。
- 残念**(';ω;｀)**。

## BERTのモデルサイズの比較
| モデル1 | モデル2 | 比較結果 |
| --- | --- | --- |
| cl-tohoku/bert-large-japanese | cl-tohoku/bert-base-japanese-v2 | 性能差はあまり見られないので、処理量やメモリ消費量が少ない、bert-base-japanese-v2の方が良さそう |

今回の分析は100個の文を含むデータセットで行ったのですが、データセットが小さかったせいか、目立った差が見られませんでした。

## BERTの学習手法の比較
| モデル1 | モデル2 | 比較結果 |
| --- | --- | --- |
| cl-tohoku/bert-base-japanese-whole-word-masking | cl-tohoku/bert-base-japanese | bert-base-japaneseの方が、慣用句を間違えにくい |

データセット分析のAverage Rank Diffにおいて、目立った差がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/d7da22f0-88c5-8f8d-1518-848c3617fe7e.png)

予測ランクの差がモデル2の方に偏っていたため、いくつかの文をトークン単位で分析しました。
今回は例として、「購入したがWIFIが認識せず四苦八苦しています。」という文を分析した結果を示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/28faa918-0c2a-7042-2e2e-6b28fbfb218a.png)

分析した結果、「四苦八苦」という慣用句の「八苦」の部分の予測に関して、モデル2は高い確率で予測できているにも関わらず、モデル1では予測確率がほとんど0でした。この結果から、モデル2に比べてモデル1は慣用句を間違える可能性が高そうでした。

**この傾向が見られた他の文章**
（太文字の場所に、比較結果の傾向が現れました）

- **不良品**?
- **泣き寝入り**です。
- **ガッカリ**です。

## 多言語BERTのモデルサイズの比較（蒸留）

| モデル1 | モデル2 | 比較結果 |
| --- | --- | --- |
| bert-base-multilingual-cased | distilbert-base-multilingual-cased | distlbert-base-multilingual-casedの方では、予測に他の言語が混ざってしまう可能性が高そう |

データセット分析のAverage Probability Diffにおいて、目立った差がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/01250671-e73c-167d-e60f-c4b5545c78a4.png)

予測確率の差がモデル1の方に偏っていたため、いくつかの文をトークン単位で分析しました。
今回は例として、「ドライバーがおかしいのではないでしょうか?」という文を分析した結果を示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/34397251-57b0-6be0-888b-a42a82660d2e.png)

分析した結果、日本語の文であるにもかかわらず、モデル2の予測では別の言語が高い確率で予測されていました。例えば、index7の「##ので」を予測するところでは、ハングル文字が最も高い確率で予測されています。このような傾向が、他の文章でも見られたため、モデル2の予測には他の言語が混ざってしまう可能性が高そうと判断しました。

**この傾向が見られた他の文章**
（太文字の場所に、比較結果の傾向が現れました）

- 他の**レビ**ューと比べる**と**完全に不良品に当たった感じです。
- 残念ですが**、**破棄することになり**そ**うです。
- メーカー様も再度テ**ストを**重ねて出荷してください。

# 5. 分析結果の考察

## GPT-2のモデルサイズの比較
GPT-2の分析結果から、言語モデルのサイズと言語モデルが覚えている単語量に相関があるかもしれないと考えました。
今回扱ったGPT-2のトークナイザーはSentencePieceであるため、言語モデルへの入力は単語を分割したサブワードになります。そのため言語モデルの方で、分割された単語が一単語であることを学習しなければならないと考えられ、モデルサイズが大きい方が多くの単語を覚えることができると考えました。
また、GPT-2の分析をするにあたり、データセットの文章数が100の場合と6万の場合を試して、データセットのサイズが分析に与える影響を調べてみました。その結果、文章数が100の場合は英単語の傾向のみが分析でき、文章数が6万の場合は英単語の傾向と日本語の慣用句の傾向を分析することができました。この結果から、Amazonのレビューのデータセットでモデルの比較を行うのに、文章数が100では十分な分析ができないことが分かりました。もちろんデータセットは大きければ大きいほど、多くの文に対する分析ができますが、LMDiffの実装上、一般的なGPUでは大きなデータセットを載せることができないという制約があったりします。

※今回扱ったGPT-2を試す場合は、コードを少し修正する必要があります。

## BERTの学習手法の比較
BERTの学習手法の比較結果から、whole word maskingを利用すると、利用しなかった時よりも、広い文脈を見る必要のあるダウンストリームタスクでは性能が上がる一方、慣用句の学習に悪影響を及ぼしてしまうかもしれないと考えました。
そもそもwhole word maskingとは、言語モデルの事前学習時に、サブワード単位ではなく単語単位にmaskを行うという学習手法のことです。
サブワード単位のマスクを行う手法を利用すると、「四苦八苦」という単語を学習する際に、「四苦 [MASK]」とマスクを行い、「四苦」を目印に「八苦」を復元するように学習します。この学習手法の強みはサブワードという狭い文脈に注目することができることですが、弱みは広い文脈を捉える必要があるタスクには向いていないことです。
一方、単語単位のマスクを行う手法を利用すると、「四苦八苦」という単語を学習する際に、「[MASK]」とマスクを行い、「四苦」という目印なしに、「四苦八苦」という単語全体を復元するように学習します。この学習手法の強みは広い文脈を見るよう学習されることですが、弱みとして慣用句の予測には不利に働いていそうです。
LMdiffでは、サブワード単位のマスキング手法を用いて予測性能を評価しているので、whole word maskingを用いて学習したモデルには不利な結果が出ているものと思われます。
そのため、今回の分析から単純にどちらがいいとは言えず、ダウンストリームタスクが慣用句を重視するタスクなのか（例：誤字脱字のチェックタスク）、広い文脈をみる能力を重視するタスク（例：文書分類タスク）なのかで事前学習モデルを選ぶのが良さそうです。

# 6. 感想とオチ
今回はLMDiffを利用して、言語モデルの比較を行いました。このツールを使うことで、モデルの定性的な比較を簡単に行うことができたので、みなさんも独自のモデルに試してみてください。
今回はできませんでしたが、現実の問題を解決するためには、以下のような使い方が出来れば良いと考えています。

- ファインチューニングの前と後の違いを比較することで、新しく得られた傾向と失われた傾向を知りたい
- モデルを軽量化した前と後での、傾向の変化を知りたい
- 学習データを追加する前と後での、傾向の変化を知りたい
- 系列ラベリングにおいて、固有表現の区切り方にどのような傾向があるのかを知り、適切なアノテーション方法を知りたい

ブラックボックスなモデルの中身を、少しでも理解できるようになると良いですね。
最後になりましたが、本記事は日鉄ソリューションズ（NSSOL）様でのインターンシップで執筆したものです。たくさんのアドバイスをありがとうございました！

## オチ
GPT-2もジョジョネタを履修していました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939639/0d5567c1-7802-a7ea-182d-abcc7e91ce64.png)