【AI】rinnaの「GPT-2」と「BERT」を使って文章を自動生成する!

今回はちょっとプログラムチックなことをやりたい。どうやらrinna株式会社が日本語に特化した「GPT-2」「BERT」の事前学習モデルを開発したと発表したらしいからそれを試したいんだけど、そもそもりんなって知っているかな?LINEで友達として追加することができて話すことができる。

このりんなは人工知能なんだけど、受け答えが普通の人間のようで機械っぽさがほとんどない。女子高生感が反映された人工知能でマイクロソフト生まれだけど、2020年には独立してる。

このrinna社っていうのが結構やばくて、rinna社のAI技術によって自動生成した絵画とパターンデザインが、TVアニメの『BEASTARS』第2期のオープニングテーマ曲『怪物』シーン背景画に採用されたりしてる。

2021/1/8 rinna社のAIが描いた絵、TVアニメ『BEASTARS』第2期のOP背景画に採用

rinna株式会社がどんなことをやっているか詳しく知りたい人はホームページを見てみるといいですよ。

でこの記事では何をやっていきたいかっていうと、rinna社が発表した「GPT-2」「BERT」事前学習モデルを試したいということだ。これらのモデルを使えば、自動的に文章を作ってくれると思うからどんな文章を作れるのか知りたい。

そういえば、前にGPT-2モデルを使ってYoutubeの動画タイトルを作らせるみたいなことやったような気がする。

今回は新たに発表されたやつを使っていきたいんだけど、自分人工知能関連そんなに詳しくないんですよね。初心者がなんかやってるわっていう気持ちでどんなことができるのか参考にしていただけたらと思う。ではやっていこう。

発表されたモデル

rinna社の2021/8/25 日本語GPT-2/BERTの事前学習モデルを開発しオープンソース化を見てみると、発表されたモデルは以下の3つのようです。

  • GPT2-small
  • GPT2-xsmall
  • BERTを改良したモデルであるRoBERTa

HuggingFaceとGithubで公開されているから見ることができますね。

HuggingFaceからリンクを辿るとそのモデルを多少試すことができるよう。

文を変えてみると色々違うテキストが生成されて面白い。

日本語GPT-2の機能

今回rinna社が公開した日本語GPT-2でどんなことができるかっていうとこんな感じみたい。

今回、rinna社が公開した日本語GPT-2は、一般的な日本語テキストの特徴を有した高度な日本語文章を自動生成できます。例えば「本日はご参加ありがとうございました。誰も到達していない人工知能の高みへ、ともに」という講演後のメールを想定した文章をGPT-2に入力として続きの文章を自動生成すると、図1のように入力文章の文脈を考慮した文章が生成されます。

2021/8/25 日本語GPT-2/BERTの事前学習モデルを開発しオープンソース化

生成された文章を読んでみると凄いじゃないですか。普通に日本語の文章になっています。こういうのみると人間が文章書かなくても人工知能が読書感想文とか書いてくれそうな未来ありますよね。

そういえばアメリカかどこかで、ほぼすべてをAIが書いたブログ記事がニュースサイトの1位を獲得したっていうニュースもありましたね。未来というより現実にそういうことが起きているっていうのがなんとも言えない。

RoBERTa

もう一つRoBERTaっていうのが公開されているけど、BERTっていうのは前後の単語を予測してくれるものらしい。

 

2021/8/25 日本語GPT-2/BERTの事前学習モデルを開発しオープンソース化

なんかよくわからないけど、とりあえずすごそう。

RoBERTaを用いて、「4年に1度、[MASK]は開催される。」の[MASK]部分を予測すると、オリンピックやワールドカップといった4年に1度開催されるイベントが上位に予測されます

2021/8/25 日本語GPT-2/BERTの事前学習モデルを開発しオープンソース化

これは4年に1度、〇〇は開催される。の〇〇の部分を的確に予測してくれています、凄い。HuggingFaceのrinna/japanese-roberta-baseからも簡単に試すことができますね。

面白い。GPT-2モデルを使って文章生成、RoBERTaを使って単語の予測なんかをできることが分かった。なんか凄い感はわかったし結構満足感はあるんだけど、本題はここからだ。コードを書いて何か試してみたい。

GPT2-smallを使って何か文章を生成してみる

GPT-2ではGPT2-small, GPT2-xsmallが公開されたので、GPT2-smallを使って何かしてみる。その前に使うのに多分ないとダメそうなものをインストールしておく。

$ pip install transformers
$ pip install sentencepiece

それとPytorchがないとダメとか言われたのでPytorchも入れておく。Pytorchののサイトから自分の環境を選択してコマンドをコピペして使うといいです。

そしてコードを書いて実行してみる。

from transformers import T5Tokenizer, GPT2LMHeadModel

tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-small")
model = GPT2LMHeadModel.from_pretrained("rinna/japanese-gpt2-small")

input = tokenizer.encode("こんにちは、", return_tensors="pt")
output = model.generate(input, do_sample=True, max_length=100, num_return_sequences=1)
print(tokenizer.batch_decode(output))

するとこんな文章が生成されました。

['こんにちは、</s> 昨年8月6日、ついに「the sun」(ザ・サンシャイン)の予告編が解禁となりました。いよいよ今夜9時から公開されます! 映画には、現在制作中の映画「イントゥ・ザ・スパイダー」の予告編や、 予告解禁後も、続々と登場する最新情報などを紹介していきますので、是非ご覧いただければと思います。 さて、今回は映画「イントゥ・ザ・スパイダー」']

「こんにちは、」で始まる文章を指定してみたけど、これだけでこういった文章ができてしまうのは凄いですね。普通に読める。

RoBERTaを使って単語を予測する

次はroberta-baseを使って単語の予測をさせたい。/japanese-pretrained-modelsにサンプルコードが載っているからそれをちょっと改造してやってみる。

「〇〇すると心が落ち着く」っていう文の〇〇に当てはまりそうなものを出力してくれっていうのを試す。

import torch
from transformers import T5Tokenizer, RobertaForMaskedLM

# load tokenizer
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-roberta-base")
tokenizer.do_lower_case = True  # due to some bug of tokenizer config loading

# load model
model = RobertaForMaskedLM.from_pretrained("rinna/japanese-roberta-base")
model = model.eval()

# original text
text = "読書すると心が落ち着く"

# prepend [CLS]
text = "[CLS]" + text

# tokenize
tokens = tokenizer.tokenize(text)
print(tokens)

# mask a token
masked_idx = 2
tokens[masked_idx] = tokenizer.mask_token
print(tokens)

# convert to ids
token_ids = tokenizer.convert_tokens_to_ids(tokens)
print(token_ids)

# convert to tensor
token_tensor = torch.tensor([token_ids])

# get the top 10 predictions of the masked token
with torch.no_grad():
    outputs = model(token_tensor)
    predictions = outputs[0][0, masked_idx].topk(10)

for i, index_t in enumerate(predictions.indices):
    index = index_t.item()
    token = tokenizer.convert_ids_to_tokens([index])[0]
    print(i, token)

実行するとこんな結果が得られた。

['[CLS]', '▁', '読書', 'すると', '心', 'が', '落ち', '着く'] ['[CLS]', '▁', '[MASK]', 'すると', '心', 'が', '落ち', '着く'] [4, 9, 6, 403, 509, 12, 3593, 16837] 0 話を
1 瞑想
2 読書
3 呼吸
4 散歩
5 想像
6 そう
7 仕事を
8 感動
9 共感

なかなか良い感じのものが出てきましたね。瞑想や呼吸、散歩などなど心が落ち着きそうなものが出てきた。なんかクイズやらせているみたいな感覚。

まとめ

モデルを試してみたけど、やはり凄いですね。文章も作れるし、単語の予測もしてくれるしでなんかもう人類が文章書かなくてもいいんじゃないかと思ってしまう。この文章を書いているのは人間の自分だしちょっとなんとも言えない気持ちになるけど、人工知能が文章を当たり前のように書く未来がくるのかもしれない。

今回の記事で使ってみたものはGithubページに掲載されているから、色々見てみるといいと思います。

事前学習されたモデルに追加学習させれば、自分が実現したいことをもっと深くできそうな気がするからそういうのに使えるのは素晴らしいですよね。AIの力凄いわ。