大規模言語モデルをいろいろ試してみた
大規模言語モデル(以下LLM)への入門としていくつかモデル試してみました。参考文献は以下2点の組合せです。
前提
そもそも、LLMは上図(『IT Text自然言語処理の基礎』P.145)のとおりエンコーダとデコーダから構成されるTransformerというモデルをベースにしています。エンコーダとデコーダの組合せでエンコーダ、デコーダ、エンコーダ・デコーダの3種類に大別されるのでそれぞれ試していきたいと思います。
今回はモデルやデータセットなどを無料で利用できるHugging Face Hubの事前学習済みモデルを利用しました。
依存ライブラリ
!pip install transformers[ja,sentencepiece,torch] pandas
GPT:テキスト生成
GPTはChatGPTのベースとなっているモデルで、2022年11月ごろにOpenAIからリリースされました。Transformerのデコーダからなるモデルであり、先行する左側の文脈から単語の予測を行いテキスト生成ができます。今回はTanreiのGPTを使ってみました。
from transformers import pipeline
generator = pipeline(
"text-generation", model="Tanrei/GPTSAN-japanese"
)
outputs = generator("日本で一番高い山は")
print(outputs[0]["generated_text"])
日本で一番高い山は‖岐阜県の日本モンキー山"だそうで
「富士山」というワードは出てくるかと思ったんですが実在しない山が出てきました。
Deberta:穴埋め問題(1)
DebertaはMicrosoftが開発したモデルで、Kaggleでも頻繁に用いられています。こちらはTransformerのエンコーダからなるモデルであり、特にDisentangled Attentionと呼ばれる注意機構に特徴があります。今回は京都大学が公開しているDebertaV3を使ってみました。
import pandas as pd
fill_mask = pipeline(
"fill-mask", model="ku-nlp/deberta-v3-base-japanese"
)
masked_text = "日本の首都は[MASK]である"
outputs = fill_mask(masked_text)
display(pd.DataFrame(outputs[:3]))
score token token_str sequence
0 0.006088 58231 アンダー 日本の首都はアンダーである
1 0.004058 12764 Microsoft 日本の首都はMicrosoftである
2 0.003566 73560 ティント 日本の首都はティントである
ティントとは「染める」という意味があるそうです。3つとも意味が通じない文章となってしまいました。
T5:穴埋め問題(2)
T5はText-to-Text Transfer Transformerの頭文字からそう言われてるようです。
こちらはエンコーダ・デコーダ構成のモデルで、GPTとは異なりエンコーダによって前後の文脈情報を捉えられるのが特徴です。今回はsonoisaのt5を使ってみました。
t2t_generator = pipeline(
"text2text-generation", model="sonoisa/t5-base-japanese"
)
masked_text = "江戸幕府を開いたのは、<extra_id_0>である"
outputs = t2t_generator(masked_text, eos_token_id=32098)
print(outputs[0]["generated_text"])
徳川慶喜
うーん、不正解ですね。日本語版のLLMですが歴史は苦手なのでしょうか。
コメントなど
今回はちょっと試しただけなんですが、正答するのは意外と難しいようです。それを思うとChatGPTはすごいんだなと実感した次第です。
Discussion