0 はじめに
以前、お猿さんにタイプライターを叩かせ続けたら「いろは歌」は完成するのか?というテーマで、無限の猿定理を検証した記事を投稿しました。今回は、毎回完全にランダムな文章を作成するのではなく、少しずつ評価をフィードバックしながらすすめたらどうなるのかを検証したものです。
1 いろはモンキーの仕組みのおさらい
前回作った「いろはモンキー」は、①いろは歌で使われている47字文字をセットし、②ここから1つずつランダムに取り出して47文字の文章を作成する、③作成された文章がいろは歌と一致していなければ破棄して文章を作り直すという作業を繰り返すことで、最終的に「いろは歌(いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす)」と同じ文字列の生成を目指すというごくシンプルなものでした。
そのため、最初の3文字(いろは)が出現するまでに運が良くても1万4000回くらいの試行が必要という結果になったわけですが、現実世界では、だいたいのものにフィードバックの仕組みがありますよね。
たとえば、最近話題のエアコンも、「室温」という出力値と「設定温度」という目標値を比較して、がんばって作動したりそれなりに作動するように調整するというフィードバック制御がなされています。
今回は、前回のように毎回イチから完全に作り直すのではなく、評価をフィードバックして少しずつ進めるようにしたらどうなるのかという実験です。
2 フィードバック機能の中身
エアコンと同じように考えると、出力値は実際に生成された文章で、目標値は、最終的にはいろは歌と同じ文字列の生成を目指すので「いろは歌」です。これらを比較して得られた適合度を計測して、変更により目標値に近づいたのか、それとも遠ざかったのかを返してあげることにしましょう。いろはモンキー4号では、具体的な処理内容を以下のように変更します。
【具体的な処理手順】
①いろは歌で使われている文字47字を文字リストにセット
②文字リストから文字をランダムに1つ選んで初期の文章用のリストに取り込む
③②の作業を47回繰り返す。
④初期の文章用リストの中身といろは歌との一致度を評価する
⑤適合度100%であれば処理を終了し、そうでなければ初期の文章リストの一文字を、文字リストからランダムに置き換えて新しい文章用リストを作る
⑥新しい文章用リストの中身といろは歌との一致度を評価する
⑦もとの文章用リストと新しい文章用リストのうち、より適合度が高いものを残す
⑧適合度が100%になるまで置き換えと評価を繰り返す
3 結果は・・・
実際にいろはモンキー4の1号を動かした結果、「いろは歌」に到達するまでに要した試行回数は以下のとおりです。
1回目 8197回目で到達
2回目 6894回目で到達
3回目13028回目で到達
4回目 8378回目で到達
5回目 7821回目で到達
なんと、前回のいろはモンキーでは「いろは」くらいまでしか到達できなかったような試行回数で「いろは歌」が完成するに至りました。フィードバックって重要ですね!
4 フィードバックの頻度について
ちなみに、1文字変更するごとにフィードバックをするのではなく、重複ありでランダムに2カ所入れ替えてからフィードバックをした場合(いろはモンキー4の2号)の結果は、以下のとおりです。
1回目 2万1133回目で到達
2回目 6万4936回目で到達
3回目 8万8719回目で到達
4回目 8万7886回目で到達
5回目 8万4323回目で到達
2倍以上の時間がかかるようになってしまいました。これは、まとめてフィードバックを行うことにより、フィードバックの精度が落ちてしまったためであると考えられます。
もう少し具体的にいうと、1カ所変更するごとにフィードバックを行う場合、間違っていた部分が正しい文字に変更されると必ず適合度が向上して目標に向けて前進できます。一方で、2カ所変更してからフィードバックする場合、「誤→正・正→誤」「正→誤・誤→正」のパターンのように「1カ所ずつフィードバックされていれば前進できていたのに、まとめてフィードバックされたために前進できない」という状況が発生するようになってしまうためであると考えられます。
なお、さらに3カ所変更するごとにフィードバックをするようにしてみたところ(いろはモンキー4-3号)、33万5928回試行してやっと「いろは歌」に到達しました。これでも「いろは歌」に到達できるので、意味がないとはいいませんが、間隔をあけすぎるとフィードバックの効果は薄れてしまうようです。
4 まとめ
結論1 フィードバックはめちゃくちゃ大事
結論2 フィードバックを効果的に行うには、その頻度が大事
例によっていろはモンキー4号Githubにあげておきました。
試してみたい方はhttps://github.com/misaki1987/iroha-monkey.gitからどうぞ。