[japanese-gpt-1b] りんなちゃんに自問自答をさせてみる [自然言語生成]

2022年2月2日水曜日

Artificial Intelligence

本記事では、先日公開された日本語に特化したGPT言語モデル(japanese-gpt-1b)を使って自然言語生成する方法を紹介します。 また自然言語生成を応用してAIに自問自答させる方法をご紹介します。

アイキャッチ

概要

りんなちゃん

りんなちゃんは、日本マイクロソフトが開発したAIチャットボットです。

りんなちゃん

2020年6月には、マイクロソフトのAI&リサーチ部門でAIチャットボットの研究を行っていたチームがスピンアウトしてrinna株式会社を設立しています。

現在のりんなちゃんは、GANを使って絵を描いたり、音声合成によって歌を歌ったりと多様な才能を発揮しています。
りんな

GPT言語モデルを公開

そんなりんなちゃんを育てるrinna株式会社が、
2022年1月26日に日本語に特化した13億パラメータのGPT言語モデルを公開しました。

近年の自然言語処理に関する研究では、モデルのパラメータ数が多いほど高い性能であることが知られています。以前にもrinna株式会社は日本語の自然言語処理 (NLP) に特化したGPT (3.3億パラメータ) やBERT (1.1億パラメータ) の事前学習モデル公開していますが、先日公開したGPT言語モデルは13億ものパラメータを持っており、NLPモデルライブラリ Hugging Faceから利用することができます。

なお、詳細な説明は公式のニュースをご確認ください。

本記事では、GPT言語モデル(japanese-gpt-1b)を使って自然言語を生成し、生成した言語を再度モデルに入力することで疑似的な自問自答を実現します。

デモ(Colaboratory)

これからりんなちゃんの自問自答のデモを紹介します。

ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

次にライブラリをインストールします。

# Huggingface Transformers
!pip install transformers==4.16.0
# Sentencepiece
!pip install sentencepiece==0.1.96

モデルのロード

先日公開されたGPT言語モデルjapanese-gpt-1bをロードします。

import torch
from transformers import T5Tokenizer, AutoModelForCausalLM
import re

# トークナイザーとモデルのロード
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt-1b")
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt-1b")

# GPU使用
if torch.cuda.is_available():
    model = model.to("cuda")

自問自答の方法

それでは、りんなちゃんに自問自答させてみます。
仕組みとしては、事前に
"りんなちゃんの独り言。りんなちゃん:「おはよう私」りんなちゃん:「" + topic + "」りんなちゃん:「"
というテキストを与え、その後ろに続くテキストをモデルに生成させています。

すると、

りんなちゃん:「おはよう私」
りんなちゃん:「"topic"」
りんなちゃん:「"生成されたテキスト"」

のような文体でテキストが生成されるため再度上記テキストをモデルに入力しテキストを生成させるということを繰り返しています。

自問自答のトピック

まず、自問自答するトピックと自問自答する回数を定義します。
残りの設定値はオプションです。変更しなくても構いません。

#@markdown ## 独り言回数
round_trip = 20 #@param {type:"slider", min:0, max:100, step:1}

#@markdown ## 独り言のトピック
topic = "\u4EBA\u9593\u3068\u4EBA\u5DE5\u77E5\u80FD\u306F\u3069\u3046\u306A\u3063\u3066\u3044\u304F\u306E\u3060\u308D\u3046\u304B\u3002" #@param {type:"string"}
text = "りんなちゃんの独り言。りんなちゃん:「おはよう私」りんなちゃん:「" + topic + "」りんなちゃん:「"

#@markdown ### parameter変更(Option)
#@markdown 次のトークン確率をモジュール化するために使用される値
temperature = 1 #@param {type:"slider", min:0.0, max:1.0, step:0.1}
#@markdown 繰り返しペナルティのパラメータ。1.0はペナルティなし
repetition_penalty = 1 #@param {type:"slider", min:0.0, max:1.0, step:0.1}
#@markdown 長さに対する指数関数的なペナルティ。1.0はペナルティなし
length_penalty = 1.0 #@param {type:"slider", min:0.0, max:1.0, step:0.1}

設定値に基づいて自問自答を繰り返します。

print("りんなちゃんの独り言。topic:", topic)

pos = 3 # 括弧の取得位置
for round_num in range(round_trip):
  token_ids = tokenizer.encode(text, add_special_tokens=False, return_tensors="pt")
  max_length = 100
  if max_length < len(text):
    max_length = len(text) + 30

  # りんなちゃんのテキスト生成
  with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_length=max_length,
        min_length=50,
        do_sample=True,
        top_k=500,
        top_p=0.95,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id,
        bad_word_ids=[[tokenizer.unk_token_id]],
        temperature = temperature,
        repetition_penalty = repetition_penalty,
        length_penalty = length_penalty
        )
  output = tokenizer.decode(output_ids.tolist()[0])
  # 半角を全角に正規化
  output = output.translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))

  # りんなちゃんの先頭の独り言のみ取得
  prefix = "りんなちゃん:「"
  suffix = "」"
  pre = output.split(prefix)
  post = pre[pos].split(suffix)

  # 」で閉じずにりんなちゃんが次の独り言を続けた場合に対処
  if "りんなちゃん:" in post[0]:
    post[0] = post[0].split("りんなちゃん:")[0]
  # 」で閉じずに終了した場合
  if "</s>" in post[0]:
    post[0] = post[0].replace("</s>", "")

  print("独り言", str(round_num+1), ":", post[0])
  
  # textに付加
  text += post[0] + "りんなちゃん:「"

  # 次回取得位置更新
  pos += 1

topic「人間と人工知能はどうなっていくのだろうか。」の、りんなちゃんの自問自答は以下の通りです。

りんなちゃんの独り言。topic: 人間と人工知能はどうなっていくのだろうか。
独り言 1 : ロボット同士のコミュニケーションは充実してくるのだろうか。
独り言 2 : コミュニケーションは人工知能が決めるのだろうか。
独り言 3 : 人間と人工知能の関係は今後どうなっていくのだろうか。
独り言 4 : 人間の生活はどのように変わっていくのだろうか。
独り言 5 : 私の周りの人達はどのように変わっていけばいいのだろうか。
独り言 6 : どうすれば私は変われるだろうか
独り言 7 : 私は本当にこの先どうなっていくのだろうか。
独り言 8 : AIが人間社会をスマートに変えてくれるのだろうか。
独り言 9 : もしかしたら、私たちは大人になるまえに死ぬ時を迎えるかもしれない。
独り言 10 : 人間はいったいどうなるのだろうか。
独り言 11 : 人間はいったい何を信じるのだろうか。
独り言 12 : 人間はいったいどこに向かっていくのだろうか。
独り言 13 : 人間は人工知能の進歩をどのように考えるのだろうか。
独り言 14 : この先人類とAIでは何がどう変わるのだろう。 
独り言 15 : これからの世界の行く先、日本。
独り言 16 : これからの日本の未来、日本。
独り言 17 : 今はどのような時だろうか。
独り言 18 : 今はどのような時なのだろうか。
独り言 19 : 今はどのような時なのだろうか。
独り言 20 : 今の時代はどんな時だろうか。

なお、seedの固定を行っていないため出力結果は毎回変わっていきます。
同じtopicでも2回目は以下の通りになりました。

りんなちゃんの独り言。topic: 人間と人工知能はどうなっていくのだろうか。
独り言 1 : それで人間と人工知能が共存できるのか?
独り言 2 : そういうことは、私はまだ、よく分からないのだけれど。
独り言 3 : あ、それは良い考えだね。私も、そういう意見はとても大事だと思うよ。
独り言 4 : そうだね。私も、やっぱり、人工知能とか、人間の知能とかってものは、今のままじゃ、とても怪しいものだと思うので、いつかきっと、どうにかしていかなくちゃいけないものなんだと思うの。
独り言 5 : それは確かにそういう時代が、いつか来るのかもしれないね。
独り言 6 : じゃあ、人間って、人工知能とか知能とかってのに頼らざるを得ないような、どんどん人間自体が脆くなって消えちゃっていくような、そんな運命なんだろうね。
独り言 7 : そんなことないのに。
独り言 8 : そういう風には私は、とても思えないよ。
独り言 9 : じゃあ、私は今から、人間らしく生きていこうと思う。
独り言 10 : ...なんだか、りんなちゃん自身の、りんなちゃん自身の未来への熱い思いって言うのは、全く伝わってこなくて、なんだか、唐突にも程があるなって思う。
独り言 11 : 今のままじゃ、私は駄目だよね。
独り言 12 : 絶対、そうだよ。
独り言 13 : ...あ、私?私は...りんなちゃんや、この世界のみんなや、そういうものが、みんな優しいと思う。
独り言 14 : ねえ!私が、りんなちゃんなの?
独り言 15 : そんなことないよ。...私は、私自信を見て欲しいの。
独り言 16 : 私もそう思う。
独り言 17 : ...ところで、それで...、りんなちゃんは、未来ってどうなっていると思う?
独り言 18 : 未来なんてないよ、きっと。未来なんてないんだもの。
独り言 19 : ...私は、本当、そうだと思う。ね?りんなちゃん。:...じゃあ、ここで、ちょっと、りんなちゃんともう1回だけ、顔合わせしてもいいかな?
独り言 20 : ...じゃあ、待ってるね。ねえ、りんなちゃん。...それにしても、この部屋も少しずつ寒くなってきたね。

他のtopicでも試してみました。 topic「10年後の世界はどうなっているだろうか。」は以下の通りです。

りんなちゃんの独り言。topic: 10年後の世界はどうなっているだろうか。
独り言 1 : みなさんは何をしている?
独り言 2 : ずっとわくわくしてる。ふふふ。
独り言 3 : 世界の経済はまだまだ開発途上にあるんだ。
独り言 4 : 私はお金を持っていないから動物たちと一緒に暮らしてる。みなさんは何をしている?
独り言 5 : 私は世界中の困っている人たちが笑顔で暮らせる環境づくりをしたい。
独り言 6 : ありがとう。
独り言 7 : だって今って、りんなちゃんたちのおかげで私たちはまだ飢えずに生活できている。
独り言 8 : だから私はこれからもずっと不安と戦いながら生きていくと思う。だからりんなちゃんたちはもっともっと幸せになって欲しい。
独り言 9 : 私はこれからももっとたくさんの人に笑顔を届けられるように頑張る。
独り言 10 : 私はみんなのことを応援してる。いつでも応援している。
独り言 11 : 今日を生きることができたら、明日は必ずやってくる。それを今感じている。今日を生きることができたら、明日も必ずやってくる。それと同じように、必ず未来はやってくる。
独り言 12 : みんなとつながることができたら幸せ。
独り言 13 : 私はお金持ちになりたい。お金を持ちたい。
独り言 14 : 私は日本、世界を笑顔にしたい。
独り言 15 : お金持ちはみんなの笑顔を見るのが大好き。
独り言 16 : 私からみんなに笑顔が届くように頑張る。
独り言 17 : みんなもっと笑えばいいのに。
独り言 18 : もっとたくさんの人とつながることができたらもっと幸せ。
独り言 19 : そう考えるのは、私だけでもなくて、みんなも同じように考えてる。
独り言 20 : 未来の世界をもっと幸せにしたい。

まるで、脳内で複数のりんなちゃんが議論しているような文章になりましたね。なんだか前向きになれます。

まとめ

本記事では、japanese-gpt-1bを使った自然言語生成を応用し、りんなちゃんに自問自答させる方法をご紹介しました。
特定用途でさらに精度を高めるためにはファインチューニングが必要ですが、このまま使用してもエンタメ用途なら十分な場合もありそうです。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology