竜太のテクニカルメモ

物理やへっぽこなゲーム作りについて易しく解説するよ

ユニティちゃんライセンス

このブログはユニティちゃんライセンス条項の元に提供されています

有望な人工無能の案

ども,竜太です.どーも.

今回は学習速度の速い人工無能の案をご紹介します.

会話が成り立つ原理

おしゃべりするボット,人工無能を開発するにあたり, 会話がどのようにして成り立つか考えてみたいと思います. 最も単純には会話とは次のようにして成り立ちます. アリスとボブの二人の会話はアリスをA,ボブをBとすれば 次のような文章列c_1,c_2,c_3,\dots , c_n, \dots を指します.

A:c_1

B:c_2

A:c_3

B:c_4

A:\cdots

当たり前すぎて何のことか分からないことでしょうからご説明します. 最もシンプルな会話文とはアリスの発言c_nにはボブの発言c_{n+1}しかつながらないというものです. これは簡単に言えばボブがアリスが作ったボットだとすると人間であるアリスが発言c_nをしたら, ボットのボブは必ず発言c_{n+1}をすればよいということになるわけです. これが最も簡単な会話文になります. それではこれはどのように実現したらよいのでしょうか?

最も簡単な方法

これを実現する最も簡単な方法がIF文を用いる方法です. もし人間のアリスがc_nを入力したらボットのボブはc_{n+1}を返せばよいということです. これはPythonで書くと簡単に書けて次のようになります.

if talk == C[n]:
   print(C[n+1])

これを考えうる限りすべての文例で登録しておけば,どんな文章が来ても答えが用意できることになるわけです.

自動で入力できないか

さて,この方法で沢山登録すれば十分に面白いボットが作れるのですが, 実は不完全ながらかっこよく自動学習させることもできます. 一見不可能に近いように見えますね? ですが実は案外簡単に実現できるのです. 先ほどの会話例をもう一度考えてみましょう. 仮に会話文がc_4まで終了しているときにたまたまアリスが新しい発言c_5ではなく, かつてのアリスの発言c_3をしたらどうでしょうか? かつての会話文を単にレコード的に記録さえしておけば, 次にボブが返すべき発言をそのレコードの中からc_4として選んでくれば良いことになります. 偶然,アリスがボットのボブの発言c_2を発言してしまったらどうでしょうか? その時もボットのボブは堂々とかつてのアリスの発言c_3をすればよいことになります. こうして,十分な会話文例が登録されてしまえば,後は自動でどんどん学習させることができるようになる訳です.

最初は空っぽで良い

こうして考えると,この会話ボットを作るにはやっぱり最初に大量に会話文例を登録しておく必要があるように思われることでしょう. ところが実際には最初の登録量はゼロで良いのです. なぜかというと,人間であるアリスがまず最初に

「こんにちは,私はアリスよ.仲良くしてね.」

と話したとすると,単にボットのボブは

「こんにちは,私はアリスよ.仲良くしてね.」

とオウム返しにすればよいからです. オウム返しすぎますよね? ですがこれでいいのです. 何故なら,人間の赤ちゃんだって最初はオウム返ししかできないからです. オウム返しにはどう対応したらよいでしょうか? それはできるだけ,相手が人間であると思って対応することです. 例えばこんなのはどうでしょうか?

A:「こんにちは,私はアリスよ.仲良くしてね.」

B:「こんにちは,私はアリスよ.仲良くしてね.」

A:「え!何言ってるの私がアリスよ.」

B:「え!何言ってるの私がアリスよ.」

A:「えっそうなの?じゃあ私は誰なのかしら?」

B:「えっそうなの?じゃあ私は誰なのかしら?」

A:「あなたはアリスなんでしょう?」

B:「あなたはアリスなんでしょう?」

A:「ええそうよ,私はアリスよ.」

B:「ええそうよ,私はアリスよ.」

A:\cdots

これは一見永遠にオウム返しが続くように思えます. でも大丈夫.辛抱強く待って丁寧に対応をしていれば,データベースに登録された発言が蓄積されていって, 実はちゃんと賢く(?)なってます. 少なくとも複雑にはなっています. 後は偶発的に同じ発言をアリスが入力してしまえばよいだけです. 先ほどの会話例で試してみましょう.

A:「こんにちは,私はアリスよ.仲良くしてね.」

B:「こんにちは,私はアリスよ.仲良くしてね.」

A:「え!何言ってるの私がアリスよ.」

B:「え!何言ってるの私がアリスよ.」

A:「えっそうなの?じゃあ私は誰なのかしら?」

B:「えっそうなの?じゃあ私は誰なのかしら?」

A:「あなたはアリスなんでしょう?」

B:「あなたはアリスなんでしょう?」

A:「ええそうよ,私はアリスよ.」

B:「ええそうよ,私はアリスよ.」

A:「え!何言ってるの私がアリスよ.」

B:「えっそうなの?じゃあ私は誰なのかしら?」

少し無理やりですが,どうでしょうか? アリスがうっかりかつてのアリスの発言「え!何言ってるの私がアリスよ.」を言ってしまった場合, アリス自身がかつて丁寧に対応していればきちんとボットのボブは「えっそうなの?じゃあ私は誰なのかしら?」と発言してくれて これで会話は1段階分成立したことになるのです. こうして最初は学習データが空っぽの状態から始めて学習させることができるのです.

自動学習型人工無能のプログラム例

下はpythonで書いた人工無能のコードの例です. pythonのバージョンは3.11.0です.

Data = []

while 1:
    f = False
    talk = input()
    Data = Data + [talk]
    for i in range(len(Data)):
        if talk == Data[i] and i < len(Data)-1:
            print(Data[i+1])
            f = True
    if f == False:
        print(Data[len(Data)-1])

これは上で説明したことをそのまま直に実行するプログラムです. このプログラムでは簡単にコードを書くためにデータベースを不揮発的な媒体,例えばテキストファイルであるcsvファイルに保存していないため, 一回プログラムの実行を止めてしまうと学習データがすべて消えてしまいます. 今までの労力が全部パーになってしまうのが悩ましいですが,この部分は技術的すぎる説明で,会話ボットの原理とは異なるため, ここでは割愛します.

問題点と改良案1

実はこのボットにはまだまだ問題点が多数存在します. 一例を挙げると全く新しいことを発言している限りは決してオウム返し以外しないということです. これでは序盤,大変退屈になってしまいます. そこで全く新しいことをアリスが発言したら過去のアリスとボブの発言の中からランダムでどれかの発言を 表示させるという案が考えられます. この案の欠点は,会話がでたらめになってしまいやすいという欠点です. そこで,会話がでたらめになるのは,新しい発言が発生した直後に限られると想定して, 新しい発言直後のランダムに選らばれた発言はその質問文と回答文をセットにしないということが考えられます. ランダムに選ぶとその直後はでたらめな会話になってしまいますが,そのあとでアリスが丁寧に対応すればその部分は使える返事になるからです.

改良案2

もっと優れた案もあります. アリスがもし仮に全く新しい発言として,

A:「ブラックコーヒーは好きですか?」

と聞いてきたらボットのボブは「ブラックコーヒーは好きですか?」の質問文から「か?」をとってしまって

B:「ブラックコーヒーは好きです」

と文章を変形させることです. あるいは,

A:「明日雨が降ったら傘が必要です.」

とアリスが入力したら,

B:「もし,明日雨が降ったら傘が必要です.」

などのように,「もし」をつけ足したりします.

こうすると,会話が一見成立したように見えます. これはアメリカの初期の会話ボットのエルザからとって『エルザ効果』と呼ばれています. 大切な原理です.

改良案3

形態素解析エンジンは必要になってしまいますが,

すもももももももものうち

という文がアリスによって入力されたら これを形態素解析して,分かち書きし,

「すもも も もも も もも の うち」

とします. あとはマルコフ連鎖モデルを用いて例えば

「もも も すもも も すもも」

などの文章を作ることができます. これも一つのテクニックです.

GPT-3を使用した人工無能の改良案

GPT-3は2015年12月にイーロン・マスクなど有力な実業家・投資家が参加したことで注目を集めたOpenAIが開発している言語モデルの最新版のことです。 約45TBの大規模なテキストデータのコーパスを約1750億個のパラメータを使用して学習するため、高い精度である単語の次にくる単語の予測を可能にし、あたかも人間が書いたような文章を自動で生成します。 www.webzoit.net この技術はQ&Aにも使うことができるため,私たちのボットにも使うことができるのです. 詳しくは上のリンクなどできちんと勉強してください.

ここまで読んでくださって有難うございます. 何か間違い等ございましたら,ご報告いただけると幸いです^^


物理学ランキング


宇宙開発ランキング


量子力学ランキング

にほんブログ村 科学ブログ 科学情報へ
にほんブログ村

にほんブログ村 科学ブログ 最先端科学・最新科学へ