🤗

大規模言語モデルをいろいろ試してみた

2024/05/14に公開

大規模言語モデル(以下LLM)への入門としていくつかモデル試してみました。参考文献は以下2点の組合せです。
https://www.ohmsha.co.jp/book/9784274229008
https://gihyo.jp/book/2023/978-4-297-13633-8

前提

そもそも、LLMは上図(『IT Text自然言語処理の基礎』P.145)のとおりエンコーダとデコーダから構成されるTransformerというモデルをベースにしています。エンコーダとデコーダの組合せでエンコーダ、デコーダ、エンコーダ・デコーダの3種類に大別されるのでそれぞれ試していきたいと思います。

今回はモデルやデータセットなどを無料で利用できるHugging Face Hubの事前学習済みモデルを利用しました。
https://huggingface.co/

依存ライブラリ

!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