ぼうメモ帳

2005-08-14 久しぶりに日記を書く

恋するプログラム

| 恋するプログラムを含むブックマーク

ISBN4-8399-1729-9

先々週あたりに買った本.著者が亡くなられているということで,まずはご冥福をお祈りいたします.

この本は,Rubyを使って人工無能ソフトを開発するということをコンセプトに書かれています.残念ながら,人工無能ソフトの開発を通してRuby勉強するための本なのか,Rubyを通して人工無能ソフトを開発するための本なのかは判断がつきにくいです.もっとも,中途半端という意味ではなく,どちらの目的でも十分に実用的です.

内容としては,ランダム発話から始まり,学習する辞書型,そしてマルコフ連鎖型へと発展していきます.必要な機能のセットアップについても記されているため,人工無能開発の取っ掛かりとしてはちょうど良い本だと思います.足りない機能としては,時系列な会話(文脈の理解)や,内容の連想などです.このことについては,本文中でも触れられています.

私は,Rubyで実装するのもなんだということで,Javaで実装していました.いま,マルコフ連鎖を実装している段階です.平たく言えば,Marshalモジュールが出てきて,泣きそうになっているというのが本音です.

人工無能

| 人工無能を含むブックマーク

ちと昔話を(だいぶおっさんの領域に近づいてきたな,もう).

私が出会った最初の人工無能は,HyperCardで実装された人工無能スタックHARUKAです*1.一番初期のバージョンから,最終バージョン(だと思われるもの)まで追っかけてました.仕組みを知りたいと思い,HyperTalkリファレンス片手に,一行一行解析していたのを覚えています.何を隠そう,このソフトの解析が,私の人生を変えたといっても過言じゃないくらい,影響を受けたソフトです.正直,遊んでいる時間よりも,解析している時間のほうが圧倒的に長かったソフトです.

それ以降,しばらく人工無能の世界には足を踏み入れていなかったのですが,この世界に引き戻してくれたのが,うずら*2です.正直,ログを読んでいると,神だと感じずに入られませんでした.身震いしたのを覚えています.

そして,最後にショックを受けたのが,ヴァーチャルインファント*3という本です.この本は,それまで感じていた疑問を解決してくれました.その疑問とは,人工無能学習をさせるとき,学習の要素は文章だけで良いのか.なぜ人間は,リンゴと言えば赤くて丸いものを想像し,キリンといえば首の長い動物を想像するのか.そして,リンゴキリンの絵を描けば,それがよっぽど下手な絵でない限り,リンゴキリンだということが理解でき,下手な絵ならばそこで笑いが取れるのか.重いものを持てば重いと感じ,重いと想像すれば重いが何を意味するのかをたちどころに理解できるのか.これらを解決しなければ,人工無能創発的な発文を期待することは不可能ではないかと考えていました.そしてこの本は,そんな疑問を解決してくれました.その方法は,環境を与えるというものです.

さて,しばらく人工無能に関する情報収集を行っていなかったため,現在の流行が何なのかは分かりませんが,恋するプログラムのコードをJavaで実装しているうちに,昔考えていたアイディアを思い出してしまいました.

これらのアイディアの大前提は,「クリアという概念存在するゲームに組み込む」というものです.会話に主眼を置くのではなく,会話を通してゲームを進行させるというものです.

ゲームに組み込むことで得られるメリットは,次のようなものです.

  1. 環境を与え,限定できる
  2. キャラクターに目的・問題を与えることが出来る
  3. ユーザに前提条件を与え,行動範囲を狭めることが出来る
  4. ユーザに学習の目的を与え,手段を限定し,妥協させることが出来る

環境を与え,限定できる

環境を与えることで,環境の変化を感知することが出来るようになります.私は,変化は認知されるが,無変化は認知されないと考えています.さらに言うと,人間は,変化するものに名前を与えているとも考えています.さらに,変化こそが時間という概念...これ以上はやめておきます.

環境を与えることで,人工無能は,環境の変化を通して言葉を理解できるようになります.

辞書型の人工無能では,単語に応答する単語や文章が,辞書に登録されています.これは,単語と単語の関連性の理解を人工無能に与えていると言っても良いと思います.しかし,この方法では,理解のループが発生してしまいます.それを,環境を与えることで,単語の意味を,環境の変化というプリミティブに落とし込むことが出来ます.このプリミティブから先は存在しませんから,ループは発生しません.

さらに,プリミティブから意味づけされる単語なのか,単語から意味づけされる単語なのかを区別することで,単語の意味に階層を持たせることが出来ます.

単語をプリミティブまで階層を落とし,プリミティブから発生する単語へと階層をあがる事で,ループの発生なしに,容易に「推測」「発想」などの行動を定義することができるようになります.

これにより,人工無能に発話の範囲を広くもたせることが出来るようになります.

また,現在の人工無能は,私たちが存在する世界を相手に学習しなければなりません.でなければ,飽きられます.どんな入力に対しても,何らかの関連するレスポンスを返さなければならないということです.しかし,そこまで学習させることはほぼ不可能です.ですので,環境を限定することには意味があります.

まず,環境を限定することで,学習範囲を狭めることが出来ます.これは,短期間で学習できることを意味します.

次に,環境を限定することで,ユーザに人工無能が応答できる範囲を無意識に伝えることが出来ます.これにより,環境には存在しないことを発話しても無意味だということを,無意識に意識させることができ,限定された環境内で発話するというということを,ユーザに無意識の行わせる効果があります.

さらに,限定された環境モデル化することで,人工無能モデルシンプルにすることができ,そのモデルに対応した意味論の構築を容易とします.たとえば,ゲーム内に「食事を取る」という系統のコマンドがあったとき,必然的に空腹度というパラメータがユーザと人工無能存在することになります.そして,空腹度が下がったときに行うユーザの行動を,人工無能が行うことで,それによるパラメータの変化を検知し,行動を学習することができます.さらに,その行動の最中に,ユーザからの発話を求めることで,その文章と人工無能の行動,パラメータの変化を関連させ,単語の意味学習させることができます.

このようなことを,一般的な世界を相手にする人工無能が行う場合,単語の意味を理解させるためにパラメータの数は膨大となり,それを学習させるためのコストが膨大となってしまいます.

環境の限定は,単語とその意味を容易に結びつけることに効果的であると考えられます.

キャラクターに目的・問題を与えることが出来る

人間同士の会話には,目的が必ず存在します.普段の日常会話でも,情報の交換や,ただ「その場を楽しむ」だけや,「暇つぶし」といった目的が存在します.「仕方なく」も十分目的です.目的がなければ,会話は発生しません.しかし,人工無能とユーザとの間には,幅広い目的が存在しません.あるとすれば,「楽しむ」「暇つぶし」ぐらいだと思います.対人との会話を考えてみても,幅広い知識など必要で,これらは非常に高度な技術が要求されます.それを現状の人工無能に求めるには,酷ではないでしょうか.

それよりも,目的に向かって,問題解決のための会話ならば,範囲が限定されるため,雑談よりも実現が容易となります.さらに,人工無能が問題を意識することが出来れば,それに伴った発話を行わせることができるようになります.この発話は,問題解決という文脈に応じたものとなるため,ユーザは「関係ないことを話された」ということを感じる確率は低くなると思います.

疲れたの続きはまた明日.

トラックバック - http://d.hatena.ne.jp/susumu/20050814
272736