SHAREVOX core を動かしてみる

Try to run SHAREVOX core


2022/10/19
藤田昭人


前回 「楽しげなことを、コツコツと…」と語りましたが…

苦しくなると 「72時間連続コーディング」 とか無意味なパワープレーを 繰り出していたのも今は昔、 最近では MacBook に1時間程度向かうたびに 休憩を入れるようになっています。 休憩と言ってもテレビで YouTube を見るだけなんですけどね。 画面からの距離を長めに取ると 目が少し休まる気がするのです。 リモートワークが定着して良かった良かった。

お気に入りは「YOASOBI 切り抜き」ですね。 間にCMが挿入される回数が少ないので 流しっぱなしにしてます。 YOASOBI というと ボカロPとボーカリストの 「小説を音楽にするユニット」 なんだそうですが、 ふたりはトークも上手なんですねぇ*1。 おかげでポケモンの最近のキャラクターを 知りましたました😀

この映像、 彼らのオールナイトニッポンのDJを短く切って 映像を付けているようです。 オールナイトニッポンと言えば、 僕は「笑福亭鶴光」だとか「あのねのね」だとか、 あるいは「ビートたけし」が リアルタイムの世代なんですが、 彼らのワイルドなトークだけではなく、 AYASE氏とIKURA嬢のマイルドなトークでも 違和感なく聴けるのが不思議なところ。 やはりDJ特有の会話のリズム感が 魅力なんでしょうかねぇ?

さてさて…


SHAREVOX core というライブラリ

音声合成といえば有料サービスが花盛りですが…

本稿では、 前回チラッと触れた SHAREVOX core の動かし方を紹介してみようかと思います。

このライブラリには、 その核になる音声合成に関わる 機械学習のコードが ギュッと詰まっています。 もうひとつの特徴は 機械学習の実行環境を選ばないことです。 実は「機械学習というとGPUを搭載してない コンピュータでは動かない」と思い込んでたのですが、 このライブラリをリンクしたテストプログラムは 手持ちの Intel MacBook Pro でも あっさり動いてしまいました。

このライブラリ 「タダで音声合成をしたい人」 には朗報なんではないでしょうか?

という事で、 やや無謀にも 手持ちの Intel Mac Book Pro を使って ライブラリのバイナリ配布を動かしてみます。 やはり「論より RUN」でしょう😀


ライブラリのソースとバイナリのファイルをダウンロードする

Github においてある SHAREVOX core の ソース には README.md が用意されており、 ライブラリのダウンロード、展開、ビルドの手順が紹介されています。 が、ここでは僕が MacBook Pro (Retina, 15-inch, Mid 2014)/macOS Big Sur verion 11.7 で実行した手順を紹介します。

まずはライブラリのソースとバイナリのファイルをダウンロードするところから。 任意の作業ディレクトリに移動してください。

今回は SHAREVOX Core 0.1.2 を使用しました。次のファイルをダウンロードします。

次に ONNX Runtime v1.10.0 のライブラリをダウンロードします。

さらに Open JTalk の辞書セット(UTF-8)をダウンロードします。

作業ディレクトリの下に archive サブディレクトリを作成し、 以上の4つのファイルをダウンロードして、 各々を展開しました。


SHAREVOX core のサンプルプログラムをビルドする。

元の作業ディレクトリに戻って…
まずは SHAREVOX core のソースツリーを展開します。

先ほどダウンロードしてきたソースの ZIP ファイルを移動、

$ mv archive/sharevox_core-0.1.2 .
$ cd sharevox_core-0.1.2/

あるいはコピーします。

$ cp -r  archive/sharevox_core-0.1.2 .
$ cd sharevox_core-0.1.2/

以降、このソースツリーを作業のベースに、SHAREVOX core の C++ サンプルコード の手順に従って そのほかのバイナリ・ファイルを所定のディレクトリにコピーしていきます*2

【注】ターミナルソフトで UNIX コマンドを使ってください。

前述のダウンロード・展開したバイナリファイルを example/cpp/unix にコピーします。

  • sharevox_core のバイナリ・ライブラリ
$ cp  ../archive/sharevox_core-osx-universal2-cpu-0.1.2/libcore.dylib example/cpp/unix/
  • ONNX Runtime の共有ライブラリ
$ cp -r ../archive/onnxruntime-osx-universal2-1.10.0/lib/*.dylib example/cpp/unix/
$ cp -r ../archive/open_jtalk_dic_utf_8-1.11 example/cpp/unix/

以上のコピーを終えると、 example/cpp/unix/ には 以下のファイル・フォルダが存在することになります。

$ ls example/cpp/unix/ | cat
CMakeLists.txt
README.md
libcore.dylib
libonnxruntime.1.10.0.dylib
libonnxruntime.dylib
open_jtalk_dic_utf_8-1.11
simple_tts.cpp
$ 

C++サンプルプログラムのディレクトリに移動して、 CMake(3.16 以上)を使ったビルドを行います。

  • "cmake -S . -B build" と "cmake --build build" を実行する
$ cd example/cpp/unix/
$ cmake -S . -B build
-- The C compiler identification is AppleClang 13.0.0.13000029
-- The CXX compiler identification is AppleClang 13.0.0.13000029
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- CORE_LIB: /Users/fujita/xtr/BookBot/BookBot3/02_sharevox_core/sharevox_core-0.1.2-A/example/cpp/unix/libcore.dylib
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/fujita/xtr/BookBot/BookBot3/02_sharevox_core/sharevox_core-0.1.2-A/example/cpp/unix/build
$ cmake --build build
[ 50%] Building CXX object CMakeFiles/simple_tts.dir/simple_tts.cpp.o
[100%] Linking CXX executable simple_tts
[100%] Built target simple_tts
$ 

これで build/simple_tts がビルドできました。 実行してみましょう*3

$ ls build/simple_tts
$ build/simple_tts これはテストです
coreの初期化中...
openjtalk辞書の読み込み中...
音声生成中...
音声ファイル保存中...
音声ファイル保存完了 (audio.wav)
$ 

引数で渡した日本語のフレーズを 発話した WAV ファイルが生成されます。 Mac Book には GPU が搭載されていないので 「coreの初期化中...」 は少し待たされます。

WAV ファイルが生成されたら 発話させてみましょう。

$ afplay audio.wav
$ 

男性の声で「これはテストです」と 読み上げてくれたでしょうか?


サンプルプログラムでつきよみちゃんに発話させてみる

調べてみると simple_tts は 学習済みの言語モデルを使って 引数で渡されるテキストを読み上げているようです。 そこで言語モデルを差し替えると 声色が変わるのか試してみました。

実は SHAREVOX Core 0.1.0 には SHAREVOX のリリースに付属する言語モデルのセットも収録されてます。

これをダウンロード、展開すると model というフォルダが現れますので、 SHAREVOX Core 0.1.2 の model と差し替えてみます。

元の sharevox_core-0.1.2 ディレクトリに戻って…

$ mv model model-0.1.2
$ mv ../archive/model .
$ 

これで言語モデルの差し替えができました。

さらに simple_tts.cpp の変数 speaker_id を 0 から 4 に変更します。

$ cd example/cpp/unix
$ (エディタで simple_tts.cpp を修正)
$ diff -u simple_tts.cpp.orig simple_tts.cpp
--- simple_tts.cpp.orig 2022-10-19 10:39:11.000000000 +0900
+++ simple_tts.cpp  2022-10-19 10:39:29.000000000 +0900
@@ -34,7 +34,7 @@

   std::cout << "音声生成中..." << std::endl;

-  int64_t speaker_id = 0;
+  int64_t speaker_id = 4;
   int output_binary_size = 0;
   uint8_t *output_wav = nullptr;

$ 

修正が終わったら simple_tts をリビルドしましょう。

$ cd build/
$ make
Consolidate compiler generated dependencies of target simple_tts
[ 50%] Building CXX object CMakeFiles/simple_tts.dir/simple_tts.cpp.o
[100%] Linking CXX executable simple_tts
[100%] Built target simple_tts
$ cd ..
$ 

先ほどと同じように WAV ファイルを生成し、 発話させてみましょう。

$ build/simple_tts これはテストです
coreの初期化中...
openjtalk辞書の読み込み中...
音声生成中...
音声ファイル保存中...
音声ファイル保存完了 (audio.wav)
$ afplay audio.wav
$

いかがでしょう? 女性の声色に変わりましたね。 これがつくよみちゃん( speaker_id = 4 )の声です。 少々早口のような気もしますが…

それではお約束の…

#つくよみちゃんを利用してフォロワー増やしたい

以上

*1:YOASOBI については 他にももう少し語りたいのですが、 それはまた後日。

*2:実は Python サンプルコードにもトライしましたが、 うまく実行できませんでした。
ケアレスミスのようなので、 後日リトライしてみるつもりです。

*3:build/simple_tts の初回実行時には次のダイアログが表示されます。

これはリンクした libcore.dylib の証明書がないため表示されます。 その際には、 アップルメニューから「システム環境設定」を選択して 「セキュリティとプライバシー」 をクリックし、 以下のダイアログの「一般」パネルで「このまま許可」選んでください。

このダイアログは libonnxruntime.1.10.0.dylib でも表示されます。 なので、 build/simple_tts を実行するためには 都合2回「このまま許可」を選択することになります。

音声チャットボットの取り組み、あれこれ

Voice chatbot initiatives this and that


2022/10/08
藤田昭人


実に1年ぶり(?)のブログ記事の公開であります*1

本当はもっと早く復帰したかったのですが…

実は椎間板ヘルニアのおかげで、 ほぼ3ヵ月間完全に活動停止に追い込まれてました。 執刀医のコロナ感染とかの不運もあって、結果的に 発症から手術に至るまでに2ヶ月半待ちました。 実際、3ヵ月間も運動を大きく制限されていると、 身体のあちらこちらに支障出てくる訳でして、 今は脚力と体力の回復に勤しんでいる訳です。 もちろん還暦過ぎの老体なので、リハビリは 「腰の様子確かめながらコツコツと」 って感じですかね。


音声チャットボットによるAI体験

という訳で…

今年の僕の夏はとんだ大ブレーキの ロスト・サマーだったのですが、 不運ばかりではなかったのでした。 ちょうど昨年の今頃始めた 音声チャットボットの試みが 作った僕自身の予想を超えて 注目を集めてくれたからです。

実は、数年前から 京都ノートルダム女子大学の 「インターネット社会論」の授業に ゲストスピーカーとして参加させてもらっていて、 AI技術に関するQ&Aをしてきました。 で、毎年出るのが 「このままAI技術が進歩すると 人間にできる仕事は無くなりませんか?」 という質問。 毎年それなりに準備していくのですが、 僕の答えには どうにも納得してもらえてる感じがしないのです。

そこで「コレならどうだ‼️」と 昨年捻り出したのが、 学生の皆さんにチャットボットのルールを 作ってもらう実習授業でした。 学生の皆さんのスマホで簡単に動かせて、 もちろんボットから音声で話しかけてくれて… 授業の内容を説明し始めると長くなるので、 気になる方は次の論文をどうぞ。

conference.ciec.or.jp

一般教養の授業なので、 学生の皆さんの日常に如何に迫れるか? が大きな課題でした。


授業を書き残しておこう

この昨年末に実施した実習授業は 学生のみなさんにも好評だったので、 その場は毎年授業に呼んでくれる 吉田智子さんと喜んだのですが、 そこは大学でのこと。年が明けたら 「実習授業について書き残しておこう」 ってことになりました。

先に紹介したのは、 僕が実習授業のために書き下ろした ウェブ・アプリケーション の概要に関する論文です。 で、吉田さんが書いたのは次の論文。

conference.ciec.or.jp

彼女は情報教育の専門家なので、この時は 「情報工学の僕とはだいぶん趣きが違う」 としか思ってなかったのですが…

そこは大学でのこと。 論文が書けたのなら どこかのカンファレンスに投稿することになる訳で、 その準備をしている6月ごろに 僕の椎間板ヘルニアが発症してしまって… そのあとのこと、 ポスターセッションの原稿の用意とかは、 全部吉田さんがやってくれました*2

論文は8月初旬のカンファレンスで 発表されたらしいのですが (僕はヘルニアでのたうち回ってたので 正直なところわからない) 、なんと優秀賞をもらったそうです。

2022PCカンファレンス受賞者喜びの声 (1) 論文賞 | Special | CIEC

京都ノートルダム女子大学のニュースはこちら。

web.archive.org

いや、この写真は8月末に撮影したのだけど、 コルセットを巻いて、痛みを堪えて、 なんとか作り笑いをしたつもりだったのだけど、 全然笑えてない😁

といった顛末があったので…

論文発表に関わるイベントが全て終わるまでは、 この取り組みをブログで報告できなかったのでした。 しかし、1年もかかるとは思ってなかったなぁ。


今年はどうする?

昨年は実習授業の前日まで 実習教材のコーディングをしているといった ドタバタの有り様だったので 当日の授業は僕が担当をしたのですが、今年は (まだ僕が長時間のコーディングに耐えない状態なので) 昨年の教材をそのまま使って実習授業をすることになってます。

ただ 「読み聞かせる童話は『シンデレラ』から差し替えたい」 という話は(春ごろ、ヘルニア発症前に)相談してました。 というのも『シンデレラ』は次のページの翻訳を使っていたのですが…

www.grimmstories.com

これ、オリジナルの直訳バージョン、 いわゆる「本当は恐ろしいグリム童話」でして、 物語の中にはグロテスクなシーンがたびたび登場します。 で、学生の皆さんが書いたルールを見てると どうしてもそこがひっかかるらしく、 「どう思いますか?」とか「グロいよね?」といった 質問やコメントが増えてしまう…といった傾向がありました。 「これはちょっとどうにかしたい」 というのが僕の意見で、 腰の状態が予想外に早くに改善して、 長時間のコーディングに耐える状態になった時の 努力目標になってます。

で「もし他の童話に差し替えるとしたら?」 という相談もしてたのですが、 吉田さんから出たのは ワイルドの『幸福の王子』。 この童話については 著名な翻訳家の結城浩さんの日本語版が公開されてます。

www.hyuki.com

この翻訳であれば『シンデレラ』のような 童話の本筋以外に関心が集中するような トラブルは出ないように思うのですが… 新たに見つけた課題は、この童話は 「王子とツバメの会話」 が軸となる会話劇であることです。 セリフとセリフの間の説明が少なく、 童話の字面を追っただけでは 誰が語ったセリフなのか? (幼児には)わかりにくい。 (人間の)図書館司書が読み聞かせる時には 声色を変えるのだろうなぁ…と思わせる童話です。

いやぁ 「できの良い音声合成機能さえあれば 簡単に実現できる」 って思っていた 「童話の読み聞かせ」ですが、 実際に読み聞かせをする際に 人間はいろんな事をするんですねぇ。 奥が深いなぁ😀


いくつかの声色を切り替えるには?

ヘルニアの発症当初は (痛くて10〜20分間程度しか椅子に座ってられなくて) ベットに横たわりスマホググるしかやれることがなかったので、 音声合成でいくつかの声色を使い分ける方法を探しまくってました。

当初考えていたのは Web Speech API の SpeechSynthesis のパラメータを変更すること。 この方法だと 確かに声色が変わってることは認識できるのですが、 物語の登場人物のキャラクターまでを 想像するのは難しい感じがしました。

例えば『幸福の王子』の場合、 王子は王子らしい声色で、 ツバメはツバメがイメージできる声色で 読み上げて欲しいところです。 もちろんナレーションの声色とも 識別できなければなりません*3


VOICEVOX と SHAREVOX

何か、うまい手はないものかと さらに探しまくっていたところ、 YouTube で見かけた 「フリーの音声合成ソフト紹介」 的映像をキッカケに 見つけたのが VOICEVOX でした。

voicevox.hiroshiba.jp

Githubソースコードもおいてあります。

github.com

使い方の解説も見つけたので…

voicevox.hiroshiba.jp

1時間ぐらい椅子に座ってられるようになったら ちょっと試してみようと考えたのですが…

突如、SHAREVOX が公開されました。

www.sharevox.app

Github にソースも置いてある。

github.com

…となると、コード比較をしたくなるのが 職業プログラマの性なのですが、 チョロっと見た限りでは SHAREVOX の方が よく整備されているように見えます。

腰の痛みがなく、体調が良ければ、 もう少しガツガツ行きたいところなんだけどなぁ…

止む無く公開されているソースコードスマホ片手にツラツラと眺めてました。特に sharevox_core は、機械学習による音声合成エンジンの Open JTalkニューラルネットワークモデルの交換フォーマットの onnxruntime のラッパーになっているらしく 大変興味深いものです。 今後、ブログ記事が数回は書けそうです。

還暦も過ぎたので、そろそろ 「楽しげなことをコツコツと…」 に路線を変更しなくちゃね😀


最後に・・・

…とまぁ、 ブログを1年間もサボっていた言い訳を 長々と語ってきましたが、 これを復帰の前口上にさせてください。

それと最後にもうひとつだけ!!

京都検定の問題と模範解答を読み上げる 音声チャットボットについてです。

www.kyotokentei.ne.jp

実は昨年の実習授業の知見から、 スマホ+音声チャットボット+学習支援 は面白いテーマだなぁ…と思ってまして、 今年の4月ごろには試験問題と模範解答を 読み上げる音声チャットボットを作るつもりでいました。

でも、試験問題と模範解答の著作権って どうなってるのかわからなくて 「実験で作るだけなのにお金を取られるのはヤダなぁ…」 などと考えていたところ、京都検定を思い出しました。

この検定は京都商工会議所が運営しているのですが、 ツテを頼って聞いてもらったところ 「公平性を期すため、いずれの事業者ともタイアップしない」 との方針なんだとか*4

なので、比較的時間に余裕のある夏の間にシステムを開発して、 2022年の検定試験がある12月の1ヶ月前ぐらいに 公開する計画を立ててました。

残念なことに、 予期せぬロストサマーのために 夏の3ヶ月を棒に振ったので 計画は放棄寸前になっていたのですが…

SHAREVOX のリリースコードの中に 「つくよみちゃん」の音声があったので、 今は「2022年の検定試験には間に合わなくても、 彼女に問題を読み上げてもらいたい」と考え始めています。

tyc.rei-yumesaki.net

ということで、この文章にもハッシュタグを追加しておきます。

#つくよみちゃんを利用してフォロワー増やしたい

以上

*1:はてブmarkdown 記法をすっかり忘れてしまってる。

*2:ちゃんとお礼を言ってなかったから、 この場を借りて 「吉田さん、本当にありがとう」

*3:これ、文字通り 「人間の認知とは何か?」 というお題です。 理詰めで考えると堂々巡りになりそうな。 「ツバメがイメージできる声色」 と書くのは簡単だけど、 実際のツバメは言葉は喋らないですからね。 学習のしようがありません。

*4:つまり昔の大学入試問題と同じ扱いで今も運営しているそうです。

京都では毎年12月に1級、2級、3級の試験がありますが、 試験後は京都新聞に問題と模範回答が掲載されます。

地元では講習会を企画する企業や スマホアプリを開発しているITベンチャーも存在しますが、 みんな京都新聞の掲載情報を見て 勝手にやってるみたいです。

カシオ FX-502P のシミュレーション(1)

Casio FX-502P simulation (1)


2021/10/07
藤田昭人


たいへんご無沙汰してました。

実は8月から生活パターンが激変しまして、 体力的辛さから毎日を過ごすのに 一杯いっぱいの日々を送ってました。 必然的にブログは放ったらかしに…
2ヵ月経てようやく慣れて来たので、 もろもろ溜まっている宿題も 少しずつ返していくつもりです。


カシオ FX-502P って覚えておられますか?

唐突感MAXですが… *1

カシオ FX-502P は1978年に発売された 往年のプログラム電卓です。 僕と同世代の方々なら覚えて いらっしゃるかもしれませんね。 1970年代の日本の熾烈な 電卓戦争を勝ちに抜いた2社、 シャープとカシオは、この時期 アメリカ市場を視野に入れてか、 アメリカのテキサス・インスツルメンツヒューレット・パッカードが製品化していた プログラム電卓をリリースし始めます。

ポケコン」と銘打って 簡易BASICを搭載したシャープに対し、 次の写真でもわかるように (おそらくHPの製品を模倣した?) アセンブリ言語を各ボタンに割り付けて、 電卓なのに数字キーがかすむくらいにやたらボタンの多い むっちゃ硬派なプログラム電卓を出荷したカシオ。

f:id:Akito_Fujita:20211003144915j:plain
FX-501P

製品の外見からも両社のアプローチが 対極的だった事を今もよく覚えています *2。 僕も、この硬派なルックスにやられて 当時としては大枚の1万数千円を叩いて 買ってしまったクチです😁

実は、これが僕が初めて自腹で買った 「プログラミングできるマシン」 だったのですが、結局のところ 当時のコンピュータ月刊誌に よく掲載されていたゲームなどを打ち込んで 遊ぶ以外の使い方はしていませんでした😁 *3


FX-502P のレジスタ構造

懐かしいゲーム本が見つかったところで FX-502P のゲームを実行してみたいと考えたものの、 かつて使っていた実機も付属のマニュアルも 最早手元には残っていなかったので、 FX-502P のシュミレータを作ること考えました。

残念なことにカシオのサイトでは FX-[567]02P は「無かった」ことになってまして、 散々ググってみたのですが、 結局日本語のマニュアルは見つかりませんでした。 ですが、英語のマニュアルは残ってるんですねぇ *4。 それも元は日本文だったものを 直訳しただけの素っ気ないマニュアルが。正直 「日本の製品なのに日本語のマニュアルが 残ってないのはどういうこと?」 って思ってしまいましたが…

マニュアルに記載されている FX-502P のレジスタ構造を次に転載します。

f:id:Akito_Fujita:20211005000124p:plain
FX-502P のレジスタ構造

ついでに FX-602P のレジスタ構造も…

f:id:Akito_Fujita:20211005000234p:plain
FX-602P のレジスタ構造

図に登場するメモリ・レジスタは 一般的な電卓にもある機能、 Minで書き込み、M+やM-で計算、 MRで計算結果を呼び出す…あの機能です。 FX-502P のメモリ・レジスタは 0〜9とFの11本が2セット (FX-501Pは1セットだけ) 用意されています*5

FX-502Pのプログラムでは メモリ・レジスタは変数の領域と考えます。 つまりFX-502P は最大で 11個の変数が使えます。


FX-502P のオペコード

もちろん学生の頃にも FX-502Pのマニュアルは 読んだはずなのですが… その後、OSカーネルプログラマとして経験を積んだ今、 改めてマニュアルを眺めてみると、 FX-502Pが 独自仕様の8ビットマイコン であったことがよく理解できました。

Wikipedia によれば…

FX-502Pシリーズは 7セグメント表示のみであるため、 それぞれのプログラムステップは、 0 - 9とC、E、F、Pを組み合わせた 2桁のコードで表示される。

とのこと。元は電卓ですから (キーに割り付けられている キーコード(の一部)が オペコードと等価な) 独自の命令セット が定義されているようです*6。 またまた FX-502P の情報は なかなか見つけられなかったのですが、 しつこく探してみると次のページを見つけました。

www.arithmomuseum.com

このページにあるオペコード表を しっかり追ってみると、 先の「0 - 9とC、E、F、Pを 組み合わせた 2桁のコード」 という記述の意味が概ねわかります。 (正直 "P" という文字が 割り振られた理由までは わかりかねますが、 単純に "D" と読み替えれば よくある8ビットのオペコードと 代わりありません)

8ビットマイコンのオペコードとしてみた場合、 FX-502P の命令セットは 上位4ビットが "C" 以上の領域に 押し込められたスパースで、 Z80 のような1〜4バイトの 可変バイト長の命令セットです。 なんだか歪な印象を持ちますが、 これも電卓のキー配置の物理的限界 (6つのキー列が5段+ 5つのキー列が4段=50キー) に起因しているのでしょう。 FX-502Pを使ったことのある方は ご存知のように、INV キー (invert、裏面って意味でしょうね) を使って全体では99個のキーを 物理的に確保してます。 もちろんエレガントな配置は言えませんが、 その反面、キー毎に命令が 割り当てられていて プログラムが入力が効率的 (GOTOであってもワンプッシュ) というメリットがあります。


バイトコードエンジンを書いてみる

レジスタ構造と命令セット (オペコード)がわかったところで、 FX-502P のバイトコードエンジンを (C言語で)書いてみました。 ソースコードは次に置いてあります。

github.com

このエンジンはオペコードのテーブルに 各命令のハンドラを貼り付けただけの 比較的単純な作りです。 今のところ Wikipedia の FX-502P のページにある 次のサンプルコードが実行できます (つまりサンプルコードで使ってる命令しか ハンドラを書いてないって意味ですからね)。

f:id:Akito_Fujita:20211006101616p:plain
サンプルコード

このプログラムはXレジスタにセットしている 数値の階乗計算をします。 参考までに等価なコードを(無理矢理) Cで書くと次のようになります。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
  int m0;
  int x = 5;

  m0 = x;                       // Min 0
  x = 1;                        // 1
  printf("x: %d\n", x);
  for (; m0 > 0; m0--) {        // INV DSZ GOTO 0
    x *= m0;                    // *
    printf("x: %d\n", x);
  }
  printf("x = %d\n", x);        // =

  exit(0);
}

要点は INV DSZ (Decrement and Skip on Zero)命令で 続く GOTO 0 との組み合わせて、 C言語の for ループを実現しています。 なお、ループカウンターとして 暗黙的に M0 レジスタを使って いるので注意が必要です (これがFX-502Pの仕様なんですよ)。


さいごに

という訳で…

バイトコードエンジンの枠組だけはできました。 プログラムの挙動を確認するために、 トレース機能を付けたところデバックは随分楽になり、 学生の頃に感じた「頭がこんがらがる」印象は 無くなりました (その後、40年間あまりプログラマを 生業にして来たので、 ロジックを追っかけることに慣れた という意味合いもありますが)。

これ、納期が定まっていれば、 一気に畳みかけてひと通り動くところまで 持っていくのでしょうが…

他にも BookBot など 優先度の高い課題を 抱えているので、 今手元にある英文マニュアルで 紹介されている他の例題を皮切りに 今後も FX-502P のプログラムを見つけては ハンドラを追加・修正する作業を マイペースで進めていきたいと思っています。

最後に…

かつて FX-502P がカシオの 電卓ラインナップに登っていた頃、 パブリックドメインのプログラムのリストを 多数収録した プログラミング・ライブラリが書籍として 出回っていたようなのですが、 今となっては古過ぎて古書としても 入手ができないようです。 もし、お手持ちの方がいらっしゃれば、 プログラムリストの写真等を 送ってもらえると嬉しいです。

ともあれ…

僕的に FX-502P は日本が誇るべき 技術資産なんじゃないかと思うのですが、 今回関連情報の収集をしてみて 「日本語で解説したマニュアルやプログラムリストが 残っていない現状は由々しき事態」かと 考えるようになった次第です (カシオはあまり関心がないようです)。 今回紹介したバイトコードエンジンが ひと通り動くようになったら、 日本語でのドキュメントを書きたいなと 考えているところです。

以上


*1:今はコレしかネタがないとも言います😁

*2:そのFX-502P についてググってみると、 その後継機種である FX-602P に関する 英語のページが頻繁に登場します。

f:id:Akito_Fujita:20211003145423p:plain
FX-602P

FX-502P が7セグメントの液晶表示 であったのに対し、FX-602P は ディスプレイがドットマトリクスに変更され ASCII テキストが表示できるようになっていました。 今回調べてみたところ カシオのプログラム電卓は 海外各国にも輸出されていたようで、 海外ではASCIIが使える FX-602Pの方が好まれたのでしょう。

FX-602P を紹介する次のホームページは 同機を支持する熱烈なメッセージから始まります。

fx-602p.krischik.com

Welcome to the FX-602P homepage - where the best programmable calculator ever (from the company who do not which to be named) found it's new home. True, many calculators do have more functions but when it comes to a small form factor, light weight usability and programmability without a manual by your side then the FX-602P is king.

FX-602Pのホームページへようこそ! 史上最強のプログラム電卓 (会社の名前は伏せておきますが) の新しいホームページを用意しました。 確かに、多くの電卓が より多くの機能を持っています。 が、しかし、小型で軽量な使い勝手と、 マニュアルなしでプログラムできるという点で、 FX-602Pは王者です。

カシオの海外法人の対応が 素っ気なかったのか 皮肉混じりではありますが、 製品には最大限の賛辞が送られてます。 「HPの電卓よりも?」 と感じられる方もいらっしゃるでしょう。 このホームページを読んでいくと、 「入力したプログラムを保存できない TIは間抜けな仕様だし、 バカ高い外部メモリカートリッジにしか プログラムを保存できないHP」 にも恨み言を並べてます。

そもそも1978年といえば、 1ドルが270〜240円だった訳で、 FX-502Pは「機能はほぼ等価なのにバカ安い」 プログラム電卓だったといえるでしょう (今に置き換えれば iPhone クローンの Xiaomi(シャオミ) の スマホみたいな感じでしょうか?)。

このあたり、当時の 「またまたアメリカの後追い」 と捉えていた僕ら日本人の シニカルな印象との違いに 今となっては苦笑してしまいます。

*3:その後すっかり忘れてしまっていた FX-502P。 思い出したのは、長年開かずの段ボール箱を開いたところ、 中から次の本が出てきたからでした。

f:id:Akito_Fujita:20211003222520p:plain

学生の頃、 物理の授業中に散々遊んだ 「ポケット・インベーダー」 を思い出してしまいまして…

*4:おそらく海外で人気のあったであろう FX-602Pのマニュアル は綺麗にスキャンされた PDF が見つかりました。 さらに、しぶとくFX-502Pのマニュアルを探したところ "CASIO FX-502P CALCULATOR MANUAL" も見つかりました。でもスキャンが雑で文字が判別しづらい。

*5:ちなみにこの2つの図を見比べると FX-602P は FX-502P の上位互換のように見えます。 FX-602P のメモリ・レジスタは 0〜9とFの11本が8セット 内蔵されていたようです。

*6:後継機種の FX-602P については 脚注で紹介した FX-602P ホームページで 次のように丁寧に説明されてます。

Token Codes - FX-602P

前述のようにASCIIテキストを表示できるように 機能拡張されたため、FX-502Pを踏襲しつつも 命令セットの体系は大きく改変されてるようです。

ローブナー賞コンテストの実際

Turing Test Contest in Practice


2021/07/20
藤田昭人


前回 の記事は 前々回 よりもさらに多くの方々に読んでいただけたようで…ありがとうございます。

本稿ではチューリングテスト・コンテストの 実例として、 前回も少しふれたローブナー賞について もう少し掘り下げて紹介したいと思います。


Loebner Prize 2009

実は個人的な関心から ローブナー賞についてはいろいろ調べて来たのですが、 コンテストの実際の様子を語るなら Loebner Prize 2009 がもっとも都合が良さげかと思います。

というのも、その理由のひとつは 古くからあるチャットボット専門サイトの chatbots.org が制作したコンテストのダイジェストビデオが 残ってるからです。 全編で10分程度の短い映像ですし、 英語で滔々と語るシーンも皆無なので 日本人の僕たちにも比較的見やすい(😁) ビデオです*1

www.youtube.com

この映像を見る前に 思い出しておいて欲しいのは チューリングテストに関するルール、 テストを実行するための役回りについてです。

テストの主役はもちろん チャットボット(Chatbots) です。Loebner Prize 2009では 次の3つのチャットボットが ファイナルステージに勝ち上がりました。

チャットボット 開発者 所属
Do Much More David Levy Intelligent Toys Ltd.
Cleverbot Rollo Carpenter Icongno Ltd. and Existor Ltd.
Chip Vivant Mohan Embar  

しかし僕的に引っかかるのは 「ファイナルというからには 予選もあったのか?」 という疑問でして、 「ローブナー賞の予選」 なるものの情報を 探しまくったのですが… 見つかりませんでした。 これ、どう理解すれば良いのかなぁ?

前回 もチラッとふれましたが、 チューリングテストでは 「機械のフリをする人間」の コンフェデレイト(Confederate) も参加します。 Loebner Prize 2009では 次の4人のコンフェデレイトが 暗躍しました(笑)。

コンフェデレイト 所属
Brian Christian Knopf Doubleday Purblishing
Dave Marks Sandia National Labs
Olga Martirosian Meraka Institute
Doug Peters Nuance Communications Inc.

なお コンフェデレイトについては 後ほど詳しく紹介します。

最後に「もっとも人間に近い対話者を判定する」 ジャッジ(Judge) です。前回は「10人」と説明しましたが Loebner Prize 2009では ジャッジは次の4人だけだったようです。

ジャッジ 所属
Prof Alan Garnham University of Sussex
Prof John Carroll University of Sussex
Prof Shalom Lappin King's College London
Mr Jon Bentley The Gadget Show

たった4人のジャッジとなると 「30%以上が人間と判定する」 というチューリングテストの条件は 1人で満たされず、実際には2人以上、 つまり50%以上という条件になってしまいますねぇ。

ちなみに4人のうち3人までは教授なんですが、 残る4番目のジョン・ベントレーは イギリスのテレビ番組(5チャンネル) The Gadget Show のキャスターだそうです。 この番組は一般向けにテクノロジーを紹介する 番組なんだそうですが、番組のテイストは YouTube のアーカイブ からご覧ください。実は 「ひょっとしたら Loebner Prize 2009 を 紹介する回があるかも?」 と思ったもので調べてみたのですが… 見つけられませんでした。

さて…

チューリングテストが 「ジャッジの30%以上が 同一のコンピュータを 『もっとも人間らしい』と 評価した場合」 をクリアの条件としていることは 前回 紹介しましたが、 ローブナー賞ではそれ以外に 2つの賞が設けられています。

1つはその年でもっとも優秀な チャットボットに与えられる The Most Human Computer (もっとも人間らしいコンピュータ) で、Loebner Prize 2009で 選ばれたのは Do Much More でした*2

もう1つはその年でもっとも優秀な コンフェデレイトに与えられる The Most Human Human (もっとも人間らしい人間) で、Loebner Prize 2009で 選ばれたのは ブライアン・クリスチャン でした。


ブライアン・クリスチャンのレポート

僕が Loebner Prize 2009 に注目すべきと考える もうひとつの理由は、 このコンテストに コンフェデレイトとして参加した ブライアン・クリスチャン が、その経験を元に執筆した書籍 "The Most Human Human" (邦題『機械より人間らしくなれるか』) を出版しているからです*3

やはり、 コンテストの当時者による打ち明け話は、 いろんな意味で大いに参考になります。

本稿では書籍のプレビュー版に位置付けられそうな クリスチャンが月刊誌 Atlantic に寄稿した記事 "Mind vs. Machine" をサマライズします。

www.theatlantic.com

そもそも クリスチャンがローブナー賞に参加した動機は、 前年の2008年の結果に 「人類の尊厳が脅かされかねない」 と感じたからのようです。

however, at the 2008 contest, the top-scoring computer program missed that mark by just a single vote. When I read the news, I realized instantly that the 2009 test in Brighton could be the decisive one. I’d never attended the event, but I felt I had to go -- and not just as a spectator, but aspart of the human defense. A steely voice had risen up inside me, seemingly out of nowhere: Not on my watch. I determined to become a confederate.

しかし、2008年のコンテストでは、トップスコアを獲得したコンピュータプログラムが、わずか1票の差でその座を逃してしまったのです。 このニュースを読んだとき、私は即座に「2009年のブライトンでのテストが決定的なものになるかもしれない」と思いました。 これまで一度も参加したことはありませんでしたが、単なる観客としてではなく、人類を守るために参加しなければならないと思いました。 心の中でどこからともなく厳しい声が聞こえてきました。 私はコンフェデレイトになることを決意しました。

1996年〜1997年、IBMの ディープ・ブルー の挑戦を受けてたった ガルリ・カスパロフ を敬愛する彼は、自らをカスパロフになぞらえて 「人類の尊厳を守る」 との、いささかロマンチックな考えに突き動かされていたと言います*4

コンフェデレイトとして Loebner Prize 2009 に参加することが許されて以降、 クリスチャンはチャットボットの挑戦を退けるための綿密な準備を始めますが、 この記事ではその準備作業の中の幾つかを披露しています。 チューリングテストの哲学的・心理学的な考察の後、 チャットボットの基礎である ジョセフ・ワイゼンバウムELIZAリチャード・ウォレスA.L.I.C.E. の紹介から始まる一連のレクチャが展開しますが、 ここでは僕が気になったトピックを2、3上げておきます。


●ジャッジの2種類のタイプ:「おしゃべり」と「尋問者」

クリスチャンによれば、 ジャッジは「おしゃべり」と「尋問者」の2種類のタイプに分類できるそうです。

I had learned from reading past Loebner Prize transcripts that judges come in two types: the small-talkers and the interrogators. The latter go straight in with word problems, spatial-reasoning questions, deliberate misspellings. ・・・ The downside to the give-’em-the-third-degree approach is that it doesn’t leave much room to express yourself, personality-wise.

The small-talk approach has the advantage of making it easier to get a sense of who a person is -- if you are indeed talking to a person. And this style of conversation comes more naturally to layperson judges. ・・・ The downside is that these conversations are, in some sense, uniform -- familiar in a way that allows a programmer to anticipate a number of the questions.

私はローブナー賞の過去の記録を読んで、ジャッジには「おしゃべり」と「尋問者」の2つのタイプがあることを知りました。 後者は、単語の問題、空間的推論の問題、意図的なミススペルを真っ向から指摘してきます。 ・・・ 「厳しく詰問する」アプローチの欠点は、自己表現の余地があまり残されていないことです。

(前者の)「おしゃべり」方式には、実際に人と話している場合に、その人が誰であるかを簡単に把握できるという利点があります。 このような会話スタイルは素人の審査員にはより自然に生まれます。 ・・・ 欠点は、これらの会話はある意味で画一的であり、 プログラマーが多くの質問を予想できる慣れ親しんだものであるということです。

過去、ローブナー賞では「おしゃべり」タイプが暗黙的に推奨されてきたそうですが、 このタイプの欠点に挙げられている「ある意味で画一的」とは挨拶などの 定型的な会話、例えばジャッジが「今日は暑いねぇ」と話しかけてきた時、 チャットボットの開発者は「そうですね、暑いですね」 といった無難な返事を容易に想像できることを指摘しています。 こういった会話で人間らしさを演出するのは難しいとクリスチャンは考察しています。


●「ライブタイピング」への対応

ローブナー賞では、何かキーを叩く度に相手のターミナルにその反応が表示される 「ライブタイピング」機能が採用されていました。 そこで意図的に、間を取ったり、削除キーを連打して入力を消したり、 あるいはタイプミスを挿入したりして、人間らしいケアレスミスをシミュレートする テクニックを用いるチャットボットが初期の頃から存在しました。

クリスチャンは「ライブタイピング」の機能を使って 人間らしさを演出するために次のような戦略を考え出しました。

I would treat the Turing Test’s strange and unfamiliar textual medium more like spoken English, and less like the written language. I would attempt to disrupt the turn-taking “wait and parse” pattern that computers understand, and create a single, flowing duet of verbal behavior, emphasizing timing.

私は、チューリングテストの奇妙で馴染みのないテキスト媒体を、 書き言葉のようにではなく、 話し言葉のように扱うことにしました。 コンピュータが理解する話者交替の「待って、解析する」パターンを破壊し、 タイミングを重視した、ひとつの流れるような言葉のキャッチボールによる二重奏を作り出すのです。

つまり「相手の反応を待たずにどんどん発言をしていく」という戦略で、 クリスチャンは「チャットボットには真似できない」と考えていたようですが、 非同期プログラミングが一般化した今日では この戦略をチャットボットも採用できるのではないか?と僕は思います。


●コンフェデレイトの策略

クリスチャンは「どんどん発言していく」戦略に「ライブタイピング」機能の活用に加えて 更に新たな意義を見出していたようです。

The humans in a Turing Test are strangers, limited to a medium that is slow and has no vocal tonality, and without much time. A five-second Turing Test would be an easy win for the machines: the judges, barely able to even say “hello,” simply wouldn’t be able to get enough data from their respondents to make any kind of judgment. A five-hour test would be an easy win for the humans. The Loebner Prize organizers have tried different time limits since the contest’s inception, but in recent years they’ve mostly adhered to Turing’s original prescription of five minutes: around the point when conversation starts to get interesting.

A big part of what I needed to do as a confederate was simply to make as much engagement happen in those minutes as I physically and mentally could. Rather than adopt the terseness of a deponent, I offered the prolixity of a writer. In other words, I talked a lot.

チューリング・テストに参加する人間は、 見知らぬ人であり、ゆっくりとした声色のないメディアに限定されており、時間もありません。 5秒のチューリングテストは、機械にとっては楽勝です。 「こんにちは」と言うことすらできないジャッジは、 何らかの判断を下すのに十分なデータを回答者から得ることができないからです。 5時間のテストは、人間にとっては簡単に勝てるでしょう。 ローブナー賞の主催者は、コンテストが始まって以来、さまざまな制限時間を試してきましたが、 「会話が面白くなってきた頃」というチューリングの言葉を守って、 近年では、チューリングの最初の処方箋である5分にほぼ固執しています。

コンフェデレイトとして私がやるべきことの大部分は、 この数分間に肉体的にも精神的にも可能な限り多くのイベントを起こすことでした。 証言者のように淡々とするのではなく、作家のように諄々と話す。 言い換えれば、私はたくさん話しました。

つまり「ジャッジに対してできるだけ多くの情報を与える」ことで 「ジャッジが対話相手の人物像を想像することを助ける」と考察しています。 クリスチャンはこのアプローチに従ったジャッジに対する自身の応答に自信を持っていたようですが、 隣にいたダグ・ピータースの次の会話を覗いた時に打ちのめされたと語っています。

Judge: Hey Bro, I’m from TO.
Confederate: cool
Confederate: leafs suck
Confederate: ;-)
Judge: I am just back from a sabbatical in the CS Dept. at U of T.
Confederate: nice!
Judge: I remember when they were a great team.
Judge: That carbon date me, eh?
Confederate: well, the habs were a great team once, too …
Confederate: *sigh*
Judge: YEH, THEY SUCK TOO.
Confederate: (I’m from Montreal, if you didn’t guess)

Judge: よぉ兄弟、私はTOから来たんだ
Confederate: クール
Confederate: リーフス最低
Confederate: ;-)
Judge: 僕はT大学のCS学部でのサバティカルから戻ってきたところだ
Confederate: いいね!
Judge: 素晴らしいチームだったことを覚えてるよ
Judge: 僕には大昔のことだけどね(笑)
Confederate: まあ、ハブスもかつては素晴らしいチームだったけど...
Confederate: *ため息*
Judge: ええ、奴らも最低だ。
Confederate: (想像していなかっただろうけど、僕はモントリオールから来たんだよ)

訳注: ここではカナダのホッケーチームのトロント・メープルリーフス(leafs)と
モントリオール・カナディアンズ(habs)の話をしている。
両チームは伝統的なライバル関係にある。

ジャッジが共感できる話題を見つけた場合、 コンフェデレイトはより人間らしい対応ができると クリスチャンは考えていたようですが、 これもある面では「定型的な会話」になるんじゃないか?と僕は思いました。 例えば、相手が阪神タイガースのファンだとわかった場合 「バース、掛布、岡田」と発言すれば 会話相手は更に饒舌になるように思いますから。

ともあれ…

クリスチャンのコンフェデレイトに関する考察は非常に興味深い内容で、 チャットボットの開発者も1度コンフェデレイトを経験すると 解決すべき課題が具体的にイメージできるようになると思いました。


ローブナー賞とは?

クリスチャンの記事に時折挟み込まれるローブナー賞の様子は、 微笑ましいものです。例えば…

Ridiculous Canadians and their ice hockey, I’m thinking. Then I’m thinking how ridiculous it is that I’m even allowing myself to get this worked up about some silly award. Then I’m thinking how ridiculous it is to fly 5,000 miles just to have a few minutes’ worth of IM conversations. Then I’m thinking how maybe it’ll be great to be the runner-up; I can compete again in 2010, in Los Angeles, with the home-field cultural advantage, and finally prove --

“And the results here show also the identification of the humans,” Jackson announces, “and from the ranking list we can see that ‘Confederate 1,’ which is Brian Christian, was the most human.”

And he hands me the certificate for the Most Human Human award.

「愚かなカナダ人と彼らのアイスホッケー…」と私は考えていました。 そして、バカげた賞のことでこんなにも自分に言い聞かせているなんて、 なんて馬鹿げているんだろうと思ってしまいました。 それから、たった数分のインスタント・メッセージでの会話のために 5000マイルもの距離を飛んで来ることがどれほど馬鹿げているかを考えていました。 さらに、準優勝というのは素晴らしいことかもしれないとも考えました。 2010年にロサンゼルスで、ホームフィールドの文化的優位性を生かして再び出場し、 最終的には次のように証明することができて…

「そしてここでの結果は、人間の識別も示しています」とジャクソンは発表します。 「そしてランキングリストから、ブライアン・クリスチャンである ‘Confederate 1’ が最も人間的であったことがわかります」

そして、彼は "Most Human Human" の賞状を手渡してくれました。

実は、クリスチャンが記述している この感動的なシーンは前述のビデオにも登場します。 が、彼が言うほどには感動的ではない、 いや、もっと率直に語ると「非常にそっけないシーン」に見えます。 きっと、これは彼の心象風景だったのでしょう。

「オタクのオタクによるオタクのためのコンテスト」

これがローブナー賞の真実のように僕には思えます。 そしてビデオでは、このコンテストの創設者である ヒュー・ローブナー への感謝が繰り返し語られます。 一部では「売名行為」と揶揄されているローブナーですが、 さまざまな批判や妨害に耐え、 時には私財を注ぎ込んでまで、 この毎年開催されるコンテストを 長らく維持・運営してきた彼への深い感謝が感じられます。 米国人である彼が始めたにも関わらず、 ローブナー賞は英国人のためのコンテストです。 それが日本人である我々には見えにくい ローブナー賞のもうひとつの顔なのかも知れません。

ビデオやクリスチャンのレポートから感じるコンテストへの情熱は、以前読んだ スティーブン・レヴィ の名著 『ハッカーズ』 に登場する ホームブリュー・コンピュータ・クラブ を彷彿させるものです。 オールドファンの方々はご記憶のことと思いますが、 Apple を設立した「もう一人のスティーブ」こと スティーブ・ウォズニアック が毎回クラブに持ち込んでいた マイクロプロセッサによるホームコンピュータ(のボード)こそが 後の Apple の最初のベストセラーである Apple II となります。また開発したBASICインタープリターを 使ってビジネスを始めた ビル・ゲイツ を最初に酷評したのも、このクラブでした。

僕は、 こういった純粋で無垢で情熱的な衝動を (かつての)ローブナー賞にも感じてしまうのです。


ローブナー賞の現在

もっとも、このローブナー賞の「古き良き時代」は Loebner Prize 2009 の時点で終わりに向けて走り出していたように見えます。 クリスチャンは The Most Human Human の受賞には喜びつつも、 その際に感じた戸惑いについて次のように語っています。

I DIDN’T KNOW how to feel, exactly. It seemed strange to treat the award as meaningless or trivial, but did winning really represent something about me as a person? More than anything, I felt that together, my fellow confederates and I had avenged the mistakes of 2008 in dramatic fashion. That year, the 12 judges decided five times that computer programs were more human than confederates. In three of those instances, the judge was fooled by a program named Elbot, which was the handiwork of a company called Artificial Solutions, one of many new businesses leveraging chatbot technology. One more deception, and Elbot would have tricked 33percent of that year’s dozen judges -- surpassing Turing’s 30 percent mark, and making history. After Elbot’s victory at the Loebner Prize and the publicity that followed, the company seemingly decided to prioritize the Elbot software’s more commercial applications; at any rate, it had not entered the ’09 contest as the returning champion.

正直なところ、どのように感じればいいのかわかりませんでした。 この賞を無意味なもの、つまらないものとして扱うのはおかしいと思いましたが、 「受賞は私という人間の何かを表しているのか?」(と考えてしましました。) 何よりも、コンフェデレイトの仲間たちと一緒に、2008年の失敗を劇的な形で取り返せたと感じました。 前年、12人の審査員は、コンピュータプログラムの方がコンフェデレイトよりも人間らしいという判断を5回下しました。 そのうち3回は、Elbot というプログラムに騙されました。 このプログラムは、チャットボット技術を活用した数多くの新興企業のひとつである Artificial Solutions 社が開発したものです。 もし、もう一回騙せていたら、Elbot はチューリングの30%を超え、歴史に名を残すことになったのです。 Elbot がローブナー賞を受賞し、世間の注目を集めた後、同社は Elbot の開発を優先したようです。 いずれにしても、2009年のコンテストには、返り咲きのチャンピオンとして参加していません。

つまり、クリスチャンにコンフェデレイトとしての参加を 決意させたチャットボットと彼が対決することはなかったのです。

これはまた、ローブナー賞でのビジネス指向の台頭を示す出来事でもありました。 ローブナー賞で The Most Human Computer を獲得したチャットボットの多くは、 その後、何らかの形でビジネス化へと踏み出していきました。 これはかつてのホームブリュー・コンピュータ・クラブでも起こった現象です。

ヒュー・ローブナーは アラン・チューリング・イヤー (2012)の前年を最後にローブナー賞の運営からは退き、 Turing Centenary Advisory Committee(TCAC: チューリング100周年記念諮問委員会) のメンバーとなりました。そして2016年12月に亡くなりました。

2014年以降、ローブナー賞は ブレッチリーパークAISB (世界最古の人工知能学会) が運営を引き継いでいます。 2019年にはルールが変更され、 ジャッジもコンフェデレイトも廃止されました。 代わりに、チャットボットは一般の人々によって審査されています。

以上

*1:ローブナー賞コンテストの様子を収めた もうひとつの映像は次の Loebner Prize 2007 のビデオです。

www.youtube.com

噂のヒュー・ローブナーの自宅で 開催されたコンテストだったことが 映像からも窺い知れます。

*2:Loebner Prize 2009での Do Much More の 会話ログは次で公開されています。

2009 Loebner Prize Competition Transcripts

案外、たわいもない会話のような…😀

*3:ブライアン・クリスチャンの書籍は 次のリンクで辿れます。

www.penguinrandomhouse.com

ちなみにこの書籍がベストセラーになったため、 クリスチャンは一躍ノンフィクション作家の 仲間入りを果たしました。

なお日本語訳は草思社のサイトで確認できます。

www.soshisha.com

ちなみに文庫版 も刊行されています。 一般教養としてのAIを ギュッとまとめられているので、 おすすめの一冊です。

*4:哲学の学位を持ち、詩作による美術修士も取得しているクリスチャンには、 それが自然なことに思えたのでしょう😀

チューリングテストのアナロジー

Turing Test Analogy


2021/07/12
藤田昭人


前回 は久方ぶりに読み物的記事を書いたのですが、 予想外に多くの方々に読んでいただけたようで…ありがとうございます。図らずも 「チューリングテストは案外認知度が高い」 と再確認できた次第。ですが、僕的には 正直言うと勢いだけで書いた記事だったので、 読み返してみるとあまりに散漫な内容だったなぁと 反省しているところです。

そこで…

前稿の後半部分の 「チューリングテストの今日的な意義」 にフォーカスして、 幾つかのテーマを書きたいと考えています。 本稿ではまず 「男性のフリをする女性」と 「女性のフリをする男性」 の話から。


「男性 vs 女性」の模倣ゲーム

前回、この話は 「チューリングの論文の冒頭で語られている」 と説明しましたが、そのくだりを 新山 祐介さんが翻訳された "Computing Machinery and Intelligence"(計算する機械と知性) から引用します。

次のような問いについて考えてみよう:

「機械は考えることができるだろうか?」

まず始めに「機械」とか「考える」という用語の 意味を定義しないと いけない。 この定義は、なるべくその言葉の ふつうの使いかたを 反映するように 作られてしまうかもしれない。 しかしこういった態度は危険だ。 もし「機械」や「考える」という 単語の意味がそれらの一般的な用法を 調べて明らかになるのなら、 つぎのような結論になってしまうのは 避けられないからだ。 つまり、 「機械は考えることができるか」 という問いの意味とそれに対する答えは、 ギャラップ社の世論調査のような 統計的調査によって求められるべきだ、 ということになる。 そんなのはバカらしい。 ここで私はこんな定義をするかわりに、 この問いを別の、 これとかなり似てはいるがそれほど曖昧でない 言葉で言いかえてみよう。

ここまでは論文の本来のテーマ 「知能機械」について語られてます。 が、その後、論文は突拍子も無い方向に展開します。

この問いの新しい形式は私たちが 「模倣ゲーム」 と呼ぶゲームによって表わされる。 これは男性 (A) と女性 (B)、 および性別は問わない一人の質問者 (C) の 3人によって行われる。 まず質問者はほかの 2人とは別の部屋に入る。 質問者にとってのこのゲームの目的は、 この 2人のうちどちらが男性で どちらが女性かを言い当てることだ。 質問者は彼らを X と Y という名前で 呼び、 ゲームの終わりに 「X が A で、 Y が B」あるいは 「X が B で、 Y が A」のどちらなのか 当てるのである。 質問者は A と B に次のような質問をすることが 許されている:

C: X さんの髪の長さを教えてもらえますか?

ここで、実は X が A であるとしよう。 すると A は答えなければならない。 このゲームでの A の目的は、 C が間違った判断をするようしむけることである。 彼の答は、たとえば次のようなものになる:

「私の髪はみじかくて、 長いところでも 9インチぐらいです」

声の高さで質問者に悟られてしまわないように、 答は紙に書くのがよい。 タイプライターによってタイプすればさらによい。 理想的な環境は 2つの部屋のテレタイプでつないで 通信させることだ。 あるいは質問と回答を、 仲介者を通してくりかえすようにしてもよい。 このゲームでの B の目的は、 質問者を助けることだ。 彼女のもっともよい 戦略は、 おそらく本当のことを正直に答えることだろう。 彼女は「女のほうは私です、 彼の言うことを聞いてはいけません!」 などとつけ加えることもできるが、 これは何の役にも立たない。 なぜなら 男の方も同じようなことが言えるからだ。

このように「チューリングテスト」の事を チューリング自身は「模倣ゲーム」 と呼んでいました。 チューリングの伝記映画 のタイトルにもなりましたので 耳馴染みのある方もいらっしゃるでしょう。 でも、この「模倣」の意味を正しく 理解している方は案外少なかったかも。 これが 「男性のフリをする女性」と 「女性のフリをする男性」が 繰り広げる騙し合いのゲームだったことを チューリングは論文の冒頭で語っています。

ところが…

ではここでひとつ問いを立ててみよう。 「このゲームで機械が A の役をうけもったら 何が起こるだろうか?」 こうすると、 ちょうど男性と女性によって このゲームが行われているときと同じくらい、 質問者は判断を 誤るだろうか? この問いは私たちの最初の問い 「機械は考えることができるか」 を置き換えるものになる。

…と、またまた唐突に 「人間 vs 機械」 の話に戻ります。

論文ではその後「男性 vs 女性」の話は登場しません。 話題はストアド方式によるデジタルコンピュータの仕組みへと移ります。 それ故、冒頭の話はコンピュータが一般的ではなかった当時 「人間 vs 機械」 の問題を読者にリアルに認識してもらうための アナロジーと理解されてきました*1


現在の技術を使ったチューリングテスト

チューリングの論文が発表されてから 70年あまり経過した今日、 論文ではチューリングが説明に苦労したコンピュータは 一般的なデバイスとして広く普及してますし、 デジタルコミュニケーションも格段に進歩して 音声付き映像によるテレコミュニケーションも 日常的なツールとして利用されています。

調べてみると「人間 vs アンドロイド」による 総合的チューリング・テスト という提案があるそうで、 今ではそのようなテストが 実現可能であることに疑いを持つ人も あまりいないのではないかと思います。

では「男性 vs 女性」のテストの方はどうでしょうか?

是非はともかく 「男性のフリをする女性」と 「女性のフリをする男性」 というテーマの方もロボットやAI以上に 格段に進歩した言える(言わざる得ない) 現状があるように思います。 次は前回も登場した「ジェンダーレスボーイ」 井出上漠くんの映像です*2

www.youtube.com

この映像は5分間程度で チューリングテストでの 1回のセッションに概ね一致します。仮に あなたがこの映像の背景を全く知らないまま、 この5分間の映像を最後まで見たとします。

あなたは「彼」だと思いますか?
それとも「彼女」だと思いますか?

モルモット扱いをして 漠くんには申し訳ないのですが…

現在のデジタルコミュニケーションの技術を使って チューリングテストを行うと こんな感じになるのではないか? と僕は考えてます。 チューリングテストでは JUDGE(審査員)が一人当たり5分間会話しますが、 JUDGEがこのようにSNSのDMを使って質問をし、 質問に答えてる様子を映像を見ながら 「男性 or 女性」(あるいは「人間 or 機械) を審査するという形式なら、 SNSを使って比較的簡単に チューリングテストの環境を構築できそうです。

この映像では「どうしてそんなに声が高いの?」という フォロワーからの質問に漠くんは一生懸命答えてますが、 チューリングテスト的観点でよく見ると、 身振り手振りを交えながら質問に答えてる、 特に手を忙しなく動かしていることが確認できます。 それが話者の人間らしさ(女性らしさ)の 演出に大きく寄与しているように思えますが、 そう言った細かな仕草なども考慮するとなると、 もしこういった形式で「人間 vs 機械」のチューリングテスト、 つまり前述の「総合的チューリング・テスト」を実施した場合、 クリアできるアンドロイドが登場するには まだまだ時間が必要な気がしますね。


チューリングテストの今日的な解釈

漠くんの映像を手がかりに、 チューリングテストに 現在のデジタルコミュニケーション技術を活用すると 対話のリアリティが格段に向上することを 擬似的に確認してもらった訳ですが、 これはチューリングテストのもう一つの 隠されたテストを顕在化させるように思います。 すなわち…

あなたはこのような存在を人間社会が受け入れることができると思いますか?

…と問いかけられているように思えてくる訳です。 おそらく今後アンドロイドの性能がさらに向上し、 振る舞いにドンドン人間らしさを 帯びてくるにしたがって、 この即答できそうにない質問を 強く問い詰められているように 感じるのではないかと僕は想像しています。

言うならば「機械は思考できるか?」が チューリングテストの表の問いならば 「思考する機械を人間は受け入れられるか?」 は裏の問いになる訳で、各々の問いは チューリングテストの必要条件と十分条件に 相当するのではないかと思います。

もちろん必要条件が成立しなければ 十分条件には意味はないのですが、 必要条件が成立したと言う伝聞も相まって 現実の出来事として遭遇する予感があるので 十分条件が気になり出した… 例えば 前回 もふれましたが、SNSが広く普及している今日、 知らず知らずのうちに チャットボットと会話しているといった状況は 誰にでも起こり得ることです。

このような 「チューリングテストのような日常」 を意識するようになると、誰もが 十分条件について考えざる得ない のではないでしょうか? 現在の我々の日常を鑑みると チューリングテストの意味や理解について 修正を迫られているように僕は考えています。


クリアの条件

最後にチューリングテストのクリアの条件について…

本稿の冒頭で引用した 1950年にチューリングが発表した論文は、 チューリングテストの手順を詳細に語る文献 としてよく知られていますが、 チューリング自身が想定した 「テストへの反論」 に対する丁寧な考察は書かれているものの、 チューリング自身が考える 「クリアの条件」 には言及がありません。

ですが…

チューリングテストのコンテスト界隈では 「論文の発表後、 チューリング自身が クリアの条件について語った」 と言われています。 例えば前述の 「総合的チューリング・テスト」 を提案している ジョス・デ・ムルチューリング自身が言及したとされる チューリングテストのクリアの条件について 次のように説明してます。

このテストにパスするために, 知性的機械 -- それはコンピューター・プログラムによって動かされている -- は, 少なくとも 30% の質問者を,5 分間自身が人間であると騙すことができなければならない。 チューリングは,こ のテストを機械がパスできるためには 50 年かかるだろうと予測した。 すなわち,2000 年である。 この予測はそれほど外れていなかった。 2014 年に,最初のコンピューター・プログラムがテス トをパスした。

このチューリングの言及は、 1952年にBBCのラジオ番組(?)として放送された 学識経験者同士の対談番組での発言に由来しているようですが*3、世のチューリングテストに基づく 多くのコンテストでは このクリア条件に基づいて ルールが定められているようです。

例えば、最古のチューリングテストに 基づくコンテストであるローブナー賞では、 4台のコンピュータ (人間のフリをする機械、チャットボット)と 4人のコンフェデレイト (機械のフリをする人間、共犯者)からなる 都合8名の覆面対話者に対し、 10名のジャッジ(審査員)が 1名あたり5分間会話をし、 その後5分間でジャッジは各人ごと 対話者のランキングを修正します。 全てのジャッシが全ての覆面対話者と会話しますので 全体では80分あまりの時間を要します。

このようにして作成された 10人分の対話者ランキングに基づいて 対話者の審査を行う訳ですが、 ジャッジの30%以上、 つまり3名以上が同一のコンピュータを 「もっとも人間らしい」 と評価した場合、 このコンピュータはチューリングテストを クリアしたと認定されます。

ジャッジの主観的な評価に基づいているので、 ローブナー賞の審査には 是非の議論がついて回って来ました。 しかし「質問者の30%以上」と言ったのは チューリング自身と言われていますので、 その責任をローブナー賞に求めるのは 無理があるのかも知れません。

なお「テストをクリアするのに 50年間を要する」とは、正確には 「2000年ごろにはクリアできるだろう」 とのチューリングの発言に基づき、 論文が発表された1950年から 計算されたようです。

ちなみに「2014年にパスした」とは 前回 紹介した2014年のレディング大学が 独自に企画したチューリングテストの実験のことです。 この実験でもローブナー賞と 概ね同様のルールが採用されたと思われます。

したがって…

チューリングテストの必要条件が 成立するまでに64年間を要したことになります。 では、十分条件が成立するまでには どれくらいの時間を要するのでしょうか? 前述のように「質問者の30%以上」に対する 懐疑論が存在するので、 ローブナー賞などのコンテストでの実績に 基づく予想は難しそうなのですが…

十分条件を「思考する機械が 社会的認知を得て市民権を獲得する」と理解すると、 チューリングは予想外のヒントを 提供してくれてるかも知れません。

すなわち…

彼が当時違法とされた 同性愛で逮捕されたのは1952年、 同性愛の違法性が否定され 彼の名誉が回復されたのは2014年ですから、 彼の事例では社会的認知が覆るのに 要する時間は62年間ということになります。 もっともこの事例は、 チューリングが残した業績を高く評価し、 彼の名誉回復のために 尽力した方々が多数存在したからで、 おそらく「ベストケースの場合」との 但し書き付くのでしょうが…

少なくとも…

どうやら本稿で書いた諸々が全て陳腐化するまでに 100年待たされることはなさそうです😁

以上

*1:おそらくチューリングの論文の 主な読者である理工学の学生や研究者は 「人間 vs 機械」 の話題に関心はあっても (文学部の学生に比べて) 「男性 vs 女性」 の話題には無関心、 あるいは避けているのが一般的でしょうから、 「男性 vs 女性」 の話は記憶から抜け落ちてしまうのだろう… などと僕は自分勝手に想像しています😀

*2:この映像はおそらくインスタグラムかYouTubeの 彼のフォロワーに対する ライブ配信を録画したものでしょう。 この種の彼の映像はYouTubeで幾つも見つけることができます。

*3:いずれ事実関係を詳しく調べてみたいと考えてますが…

僕が想像するに、この発言はテレビ番組あたりで 無茶振り質問を食らった大学の先生が、 苦し紛れに返答する「直感的には…」から始まる 発言だったのではないかと思っています。

それが「30%」や「5分間」「50年」などの 数字に対する明確なエビデンスが示されてない理由で、 それ故、論文等の文献には残されてないのではないかと 想像しています。

チューリングテストについて改めて思うこと

A new thought about the Turing Test


2021/07/01
藤田昭人


唐突ですが…

久しぶりに読み物を書きたくなって 本稿を書いてます。

テーマは「チューリングテスト」です。

エッセイなどというオシャレな文章ではありませんが、
ちょっとした暇つぶしにはなるかとは思います😁


2014年のチューリングテストへの批判記事

本稿を書きたくなったのは、次の記事を見かけた事がきっかけでした。

www.itmedia.co.jp

3年前の2018年07月26日に公開された記事だったのですが、 タイトルの「4年前の『AIがチューリングテスト合格』騒動は何だったのか?」が 妙に挑発的に感じられたので覗いてみたところ…

この記事が問題にしているのは、 2014年6月8日に英国レディング大学で実施されたチューリングテストの実験でした。 「チャットボット Eugene Goostman がチューリングテストをクリアした」 との報道には僕にも記憶があります。 しかし、この記事は「チューリングテスト合格は本当?」と テストの正当性に疑惑を提示する文言が並んでます*1

確かに、このレディング大学のイベントに限らず、 チューリングテストに基づくコンテストには その正当性に疑義を突きつけられる事例もあるのですが…

2014年といえば アラン・チューリング法 が成立し、英国王室よりアラン・チューリングを始めとする 過去の同性愛を理由に逮捕・投獄された方々への恩赦が正式に発表された年です。 チューリング生誕100周年を祝った2012年の アラン・チューリング・イヤー に続き、英国がチューリングの名誉回復に祝ってお祭り騒ぎに沸いてる年に 開かれたチューリング関連のイベントに対し 後出しのように疑義を提示するというのは何とも無粋な感じですよね?*2

記事では、レディング大学のイベントを一通り腐した後、 アラン・チューリング自身が語った論文 "Computing Machinery and Intelligence" を持ち出してきます*3。 記事の著者としては「原典に当たれば、自ずと答えが見えるだろう」という思惑だったのでしょう。 が、残念なことに彼の思惑は大きく空振りだったようです。 著者が残したこの記事の結論は次のような1文でした。

私が感じたのは「思考する行為」と「思考しているフリの行為」の違いは何かという問題提起です。

この、尻切れトンボのような幕切れに僕は大笑いしてしまいました。
著者に申し訳ないですが、どうにも苦し紛れの一言のように僕には感じられて…
どうやらこの記事の著者は「チューリングテスト」を甘くみていたようですね*4

まぁ、その場は記事を笑い飛ばして終わったのですが(失礼)

数日後、この記事のある部分からちょっと想起されることがありました。 それが次のくだりです。

人間の頭の中はのぞけません。 その人の思想、信条を無理にでも知ろうとする行為は、自由に反します。法に触れる可能性もあるでしょう。 「思考しているフリ」をして「思考している!」と主張されれば、一体どうやってそれを証明できるでしょうか。

思考だけではなく、愛も、憎しみも、敬意も、軽蔑も、実際に目に見えないものをどうやって証明するのか。 同じように「そうではないこと」をどうやって証明するのか。非常に難しいと言えます。

「お前は私を愛していない」とレッテル張りされれば最後、どう反証しても目に見えませんから言葉で説明する他ありません。 その言葉を信じられなければどうしようもありません。

このくだりを改めて読んで想起されたのは「第2次AIブームの終焉」でした。 そこで、この文章だけを拝借して、僕なりの記事を書いてみたくなったという訳です*5


第2次AIブームの終焉

「第2次AIブームの終焉」と書くと非常にわかりづらいのですが、 僕を含めた現在50歳以上の情報系の面々には、 これは特に拘りのある問題ではないかと思います。端的に述べると 「いったい、いつから機械学習はAIの研究分野になったんだ!!」 ということです。

第2次AIブームが終わったのは概ね1990年前後だったと記憶してますが、 それまでAIは「思考のメカニズムを解き明かす」研究分野だと説明されていました。 当時、機械学習は既に存在していましたが、 それは単に「人間の振る舞いを模倣するだけ」と説明され 「AIではない」と指導教官や先輩に 嗜められる学生や若手エンジニアが多かったのです。 なので現在のAIブームが起こった時、 その中身が機械学習だと聞いて 「それってAIじゃないのでは?」 と反論する方々も多かったのではないでしょうか?

こういう思いを抱えているのは僕らだけではないようです。 例えば、今日のモダンなチャットボットの実装基盤のひとつである A.L.I.C.E. の開発者 リチャード・ウォレス はインタビューに次のように答えています。

At first, he said, he had tried to follow some of the more grandiose theories of traditional A.I., but he found them sterile. "You read a book with a title like 'Consciousness Explained,'" he said, "and you expect to find some kind of instruction manual, something that you can use to build a consciousness. But of course it's nothing of the kind." (Daniel Dennett wrote "Consciousness Explained.")

最初は、伝統的なAIの壮大な理論のいくつかに従おうとしたが、それは不毛だと思ったという。 彼が言うには「もし "Consciousness Explained" のようなタイトルの本を読んだとしたら、 ある種の手順書や意識を構築するために使用できる何かを期待するでしょう。 しかし、もちろんそのようなものは何もありません」 ということだ。 ("Consciousness Explained"『意識の説明』はダニエル・デネットの著作)

Artificial stupidity, Part 2 から引用

つまり、前述の記事のくだりは、第2次AIブームまでの 「思考のメカニズムを解き明かす」AI研究の 限界を指摘する素朴だけど痛烈な批判だと僕には思えます。

そこで、第2次AIブームの終焉の始まりを明確に示す出来事を調べてみたのですが…

それまでのAI研究に引導を渡したのは当時の DARPA/ISTO のディレクタだった ジェイコブ・T・シュワルツ だったそうです。

mathshistory.st-andrews.ac.uk

DARPA のディレクタと言えば ARPANET の構築や Internet の実現に辣腕を振るった ボブ・カーン が有名ですが、 シュワルツはその2代あとのディレクタです。 彼が引導を渡した経緯について調べてみたところ、 「AIの歴史」を語った歴史的名著 "Machines Who Think: A Personal Inquiry Into the History and Prospects of Artificial Intelligence" に次のような記述があることを見つけました。

Schwartz believed that DARPA was using a swimming model — setting a goal, and paddling toward it regardless of currents or storms. DARPA should instead be using a surfer model — waiting for the big wave, which would allow its relatively modest funds to surf gracefully and successfully toward that same goal. As a consequence, he eviscerated Strategic Computing, a swimmer model in his view (though Kahn’s original vision certainly seemed to be premised on catching the wave that was beginning to swell). Schwartz thought that in the long run, AI was possible and promising, but its wave had yet to rise, so a number of sites working on AI and robotics found their funding cut suddenly and brutally. Schwartz’s own interests lay in new architectures, which he favored as the swelling wave, and so he funded the revival of connectionism and machine intelligence, based on new findings in neural modeling.

シュワルツは、DARPA がスイマー・モデルを使っていると考えていた。 つまり、目標を設定して、流れや嵐に関係なく、その目標に向かってパドリングしているのだ。 しかし、DARPA はサーファー・モデルを使うべきだ。 大きな波を待っていれば、比較的少ない資金でも同じ目標に向かって優雅に成功することができる。 その結果、シュワルツは Strategic Computing を廃止した。 彼の考えでは、Strategic Computing はスイマー・モデルだった(ただし、カーンの当初の構想は、うねり始めた波を捕まえることを前提にしていたようだ)。 シュワルツは、長い目で見ればAIは可能で有望だが、その波はまだ高まっていないと考えていた。 そのため、AIやロボット工学に取り組んでいる多くのサイトでは、突然、残酷にも資金が削減された。 シュワルツは、自分の興味が新しいアーキテクチャにあり、それが波のように押し寄せてくることを好ましく思っていたので、ニューラル・モデルの新しい知見をもとにコネクショニズムや機械知能を復活させるための資金を提供した。

ここで登場する Strategic Computing とは第2次AIブームの際、DARPA がAI研究のために設立した組織です。 シュワルツはこの組織が助成する研究チームを切り替えることで、 旧来のAI研究に引導を渡したようです。またここで語られている 「ニューラル・モデルの新しい知見に基づくコネクショニズムや機械知能」 にはその後、今日の機械学習などへと発展する研究プロジェクトが含まれていました。

結局、我々の世代が習ったAI研究が「徒労とまでは言わないが、 いつなったら完成するのか全く見通せない代物」だったということは、 その後の歴史が示すとおりです。 前述のリチャード・ウォレスは、 別のインタビューでAIについて次のように語っています。

"The smarter people are, the more complex they think the human brain is," he says. "It's like anthropocentrism, but on an intellectual level. 'I have a great brain, therefore everybody else does -- and a computer must, too.'" Wallace says with a laugh. "And unfortunately most people don't."

「頭の良い人ほど人間の脳は複雑だと思っています」と彼は言う。 「人間中心主義に似ていますが、それは知的レベルの問題です」。 「僕は頭がいいから、ほかのみんなもそうする。コンピュータもそうしなければならない」とウォレスは笑う。 「残念ながらほとんどの人はそうではありません」

"Approximating Life" , July 7, 2002, Section 6 から引用

しかし、真の天才であるアラン・チューリングは、 彼の周囲にいる秀才たちが「問題を複雑に考えすぎて失敗する」ことに 気づいていたかも知れません。 そう考えると「チューリングテスト」の 「知能があると判定する基準」 を属人性のある曖昧な形に留めたことに、 不思議と納得できるような気がするのです。


チューリングテストの今日的な解釈

次はおそらくアラン・チューリングが全く想像できなかったであろう話、
今日のSNSにまつわる話です。

例えば、Twitter。僕も Twitter を日々利用しているのですが、 タイムラインを眺めているとモデルや女優と見紛うような美人の呟きが流れて来ることがあります。 もちろん面識のない女性です。そこでプロフィールを見てみるとごく普通の一般人のように見えます。 その時、僕が考えるのは…

  • 最新のコスメを駆使した「作られた可愛い」の人だろうか?
  • いや、最新アプリを使いこなした「画像合成美人」だろうか?
  • いやいや、どこから顔写真を盗んできたネカマかもしれない?
  • ひょっとして、これチャットボット何じゃないの?

…とまぁ、その美しさをシンプルに讃える訳ではなくて、 猜疑心をどこまでも肥大していってしまうことを告白します😀

今どきのSNSとチューリングテストの関係を端的に示す事例をもうひとつ…

最近TVCMでも見かけるようになった「ジェンダー・レス」ボーイの井手上漠くん(ちゃん付けした方が良いのかな?) 今どきの若者の彼は SNSも積極的に活用していて、例えば インスタグラムのアカウント も公開してます。 で、芸能人になったこともあってか フォローしておくと律儀に毎日のように 写真や動画をアップしていることがわかります。 これまた、タイムラインに唐突に現れるのですが… その写真を目にした瞬間 「この美人、誰?女性?男性?」 と一瞬混乱状態に陥ることも告白しておきます😀

「それとチューリングテストに何の関係があるんだ?」と突っ込まれそうですが…

チューリングテストの論文を思い出してください。 この論文は「人間 vs 機械」の比較テストについて 述べているのですが、 その冒頭で読者の理解を促すため 「男性 vs 女性」の事例について言及しています。 テレタイプ越しに「男性のフリをする女性」と 「女性のフリをする男性」が登場する話です。 不意に井手上漠くんの写真を突きつけられると、 ひとしきり混乱した後、 僕はいつもこのチューリングの語りを 思い出してしまうのです。 「彼なのだろうか?彼女なのだろうか?」と…

僕の、というか現在の多くの人々のこの日常は、 1950年に知能機械の可能性を探るためにチューリングが考え出したテストの舞台装置が、 今日の僕たちの日常になってしまっていることを意味しています。 さらにもっと言ってしまうと、 こういったデジタルコミュニケーションが推奨されるコロナ禍の今、 このようなコミュニケーションがさらに加速させるような圧力があります。

もちろん、 社会のこのような変化への是非について 皆さん色々な意見があると思いますが、 僕にとって重要なことは 今日の状況が僕たちのチューリングテストへの 理解や解釈を一変させてしまう…それが容易に想像できる状況に 今、僕らはいるという事実に、 僕はちょっと驚いてしまうのです。

それから気がかりなことがもうひとつ…

改めて考えると、僕たちは日常的に「フリ」をします。 「嘘をつく」だとか「他者を欺く」といった悪意あることはそんなに頻繁ではないでしょうが、 「見なかったフリをする」だとか「気づかなったフリをする」ことは案外多い。 また気まずい状況を笑に変えるためのジョークでは「誰かのフリをする」こともあります。 「優しい嘘」なんて言葉があるくらいですしね*6

SNSはこういった人間の「フリ」をする癖を助長させます。 例えば、Twitter では別にアカウントを取得して 別のキャラクターを演じたりすることがありますが、 これも日常的で些細な「フリ」の延長上にある行動だと思います。 ですが問題は、 こうやって生まれた「フリ」の発言も含む SNSのビッグデータ機械学習に使われることです。 学習する際に「正直」な発言と「フリ」の発言は 容易には区別できません。

もちろんSNS各社はトレンド分析などで、 このようなデータを使っているでしょうし、 そこから得られたデータの正しさに関する傾向も 常時把握しているのでしょうが…

彼らのデータの正確性を向上させるための基本戦略は「収集データを増やす」ことだけのように思います。 もし、僕にSNS各社のエンジニアに 質問できる機会があれば 是非この質問をブツけてみたいのですが、 きっと答えは 「正確性を向上するためいろんな補正をしています」 だとか 「それは社外秘なのでお答えできません」 だとか…

またまた「問題を複雑に考えすぎて失敗する」のような匂いがしてきませんか?

この問題を抜本的に解決する方策の1つに 「全部フリで発言された」と解釈することで、 これは多くのチューリングテストに基づく コンテストで用いられている方法のように思います。 つまり、チャットボットが 「人間のフリ」をするのに対し、 人間は「チャットボットのフリ」をする。 それで、どちらが(あるいはどれが) 一番、ジャッジを騙せたか?を競うのが 一般的なチューリングテストに基づくコンテストなんです*7。 もちろん、これが解決策になり得るのは 知能レベルを競うだけで (一般に素直に発言するよりも、フリをする方が知能が必要です)、 周囲はゲーム感覚で見てることができる チューリングテストに基づくコンテストの 場合だけであることは 言うまでもないのですが…

ともあれ…

SNSにより「フリをするコミュニケーション」 がコモディティ化している今日、 そのコミュニケーションにより 発言者の知能を評価するチューリングテストには 新たな役割が課せられるかも知れないなぁ… などと僕は考えています。


「思考する機械」の実像とは?

最後に、SNSのお陰で(あるいはせいで)僕らの身近なところに チューリングテストの世界が存在するようになった現在について考えたいと思います。

例えば、Twitter には相当数のチャットボットが存在します。 名前に bot と付いた明示したチャットボットもありますが、 そうではない存在を隠して「思考するフリをする」チャットボットも 多数紛れ込んでいるのではないかと僕は何年も前から想像してきました。 最初にそのように疑った時には何か薄気味悪い感じがしたかも知れません。 でも今はその時に感じた事も思い出せないくらい慣れっこになっています。 何故なら人間もチャットボットと同じぐらい「フリ」をするから。

この「思考するフリをする機械」はSNSだけの話ではないようです。 例えば、将棋AIを対戦したことのあるプロの棋士によると 「将棋AIと対戦しているとAIに意思や感情があるように錯覚することがある」 と言います。「指手で会話する」という感覚は僕には全く理解できないのですが、 仮にチャットボットでも「思考するフリ」をどんどん高度化していくと、 対話相手の人間にはそこに人格が存在するかのように 感じられるようになるのかも知れません。

これは漫画『攻殻機動隊』に登場する 「ゴースト」みたいなものなんじゃないかな?と思ったりします。 この作品の英語タイトルが "Ghost in the Shell" というぐらいなので、 「ゴースト」はこの作品シリーズで一貫するコンセプトだと思うのですが、 作品をご存知ない方のために少し紹介しておくと、主人公の 草薙素子は身体のほとんど 義体化 (機械化)してしまっているサイボーグであるにもかかわらず、 人間だった時の自我や意思(のようなもの)が残っていること感じ、 その理由を追い求めている…といった話です*8

この「ゴースト」というコンセプトは「チューリングテスト」を 非常にわかりやすくしてくれるのではないか?と僕が考えています。 例えば、僕自身が自分の自我をどのように感じ取っているのか?といったことを考えてみます。 もっとも自我を客観的に意識できる時といえば、 友人の誰かから意見を求められて答えたときに その友人から「それ、君らしいコメントだね」との返事が返ってくる。 それを聞いて「僕はそういう風な人間なんだ」と再確認することができます。 つまり人間は誰もが自分の自我を直接客観的に感じることはできない訳で、 その思考パターンなどを感じる他者からのリアクションを得て 自分の自我の形を間接的に把握してるのだ…と思ったりします。

この考えに立つと「チューリングテスト」は 非常に良くできたテストであるような気がしてなりません。 「ひょっとしたらチューリングは他にも何か書き残してるかも?」 と思うくらいです。

それが Turing Bot を作ろうと考えたもうひとつの理由かも知れません😀

僕的にはオチがつきました。 おあとが宜しいようで…

*1:記事の中で登場するレディング大学のプレスリリースは次で閲覧できます。

www.reading.ac.uk

ちなみに、記事中でも指摘されている 「It's not a "supercomputer," it's a chatbot.」には対応済みで、 ちゃんと chatbot に直されていました。

*2:その記事をあげつらっている僕も大人気ないですけどね😀

*3:この論文の原文は以下で読めます。

academic.oup.com

ですが非常に良くできた日本語訳も公開されています。

www.unixuser.org

日本語がネイティブの方にはこちらがお勧めです。

*4:実はこのブログでも「チューリングテスト」については かなりしつこく書いています。

次の記事は、かの Springer が出版している丸々一冊「チューリングテスト」の論文集で、 コンピュータサイエンティストだけでなく、心理学者、社会学者、歴史学者、果ては哲学者まで、 「チューリングテスト」で知られる錚々たるメンバーが寄稿しています。 僕は気になる記事だけ拾い読みした状態ですが、 それでも「チューリングテスト」が 難解な試験であることには納得しました。

akito-fujita.hatenablog.com

それから「チューリングテスト」に基づく 最古のコンテストであるローブナー賞については 2度書いてます。

akito-fujita.hatenablog.com

akito-fujita.hatenablog.com

ローブナー賞もなかなか興味深い裏事情があるようで…

ご参考まで。

*5:おかげで進めていた実装は棚上げになってしまいました。 待っておられる方はすいません。

*6:なので、件の記事で著者が 「人をだますのに集中したことに納得がいきません」 と強弁してることに笑っちゃいました。

僕たち自身は普段から嘘を連発にしてるのに、 チャットボットにはそれを許さないってこと?

…と思えたもんで😀

*7:件の記事の著者には、これ、納得してもらえるでしょうかねぇ?

*8:この作品の最初の 原作漫画 には欄外に大量の注釈があるのですが、 その中には「チューリング」との表記も見つけられます。

きっとこの作品もまた「チューリングテスト」にインスパイアされた作品なのでしょう。

Turing Bot(2)Wikipediaページからの埋め込み抽出

Embedded extraction from Wikipedia pages


2021/06/23
藤田昭人


前回wikipedia-tokens.txtwikipedia-papers.txt の 生成を試みましたが、本稿では残る wikipedia-embeddings.txt の生成を試みます。


もうひとつの難物、Word2Vec学習済みデータ

wiki-xml-to-txt.py の2つの入力データはいずれも、 2GBを超えるビッグデータです。 先の記事では、 Python でも手に余るほど巨大な Wikipedia のバックアップデータを取り込むためのCプログラム wikiPageSelector を作成しましたが、 Word2Vecの学習済みデータから wikipedia-embeddings.txt を作成する場合も同じアプローチを選択せざるえませんでした。

ターゲットである GoogleNews-vectors-negative300.bin は総データサイズは約3.4GB。

$ ls -l
total 7123392
-rw-r--r--@ 1 fujita  staff  3644258522  6  1 00:08 GoogleNews-vectors-negative300.bin
$ 

中身を調べてみると、 1単語を表現する300次元のベクトルで 300万の単語を収蔵したファイルになります。 Word2Vecの学習済みデータもまた巨大にであることは 以前紹介した しましたが、扱えるファイルサイズの上限が2Gの JavaScript では手の出しようがありません。


Cプログラム make_embeddings

…ということで埋め込みを抽出するための C言語を使ったプログラム make_embeddings を作成しました*1ソースコードは下記に置きましたので、 参考にしてください。

github.com

Word2Vecの紹介記事 で説明したように学習済みWord2Vecデータはバイナリ形式でファイルに出力します。 wiki-xml-to-txt.py ではこのバイナリ形式を読むために(たぶんあまり一般的ではない)コードが実装されていたので、 そのコードは追わずに、前述の紹介記事で使用した distance コマンドのソースの一部を流用することにしました*2

$  ./make_embeddings wikipedia-tokens.txt GoogleNews-vectors-negative300.bin > wikipedia-embeddings.txt
$ head -2 wikipedia-embeddings.txt
25889 300
0 -0.004532 -0.022022 0.049640 -0.037960 -0.028227 0.030660 0.127507 -0.078840 0.008273 -0.048180 -0.031633 -0.075433 0.037230 0.069107 -0.114854 0.031025 0.088087 0.108040 -0.124587 -0.020927 -0.100254 0.024090 0.059617 0.013870 0.055967 -0.067160 -0.054507 -0.029443 -0.103174 0.041123 -0.061320 0.023117 0.028105 0.016425 0.036987 -0.015817 0.021413 0.025672 -0.077380 -0.000806 -0.014296 -0.046963 0.039663 -0.098793 -0.103174 -0.038690 -0.057670 -0.047450 -0.007057 0.075433 0.086627 -0.011558 0.075920 -0.053047 0.027375 0.071540 -0.054507 0.006935 0.054993 -0.049397 -0.091980 0.022508 -0.047207 0.007756 -0.014235 0.066673 0.021048 0.000121 -0.067160 0.090033 -0.042827 -0.029930 0.065213 0.055237 -0.079327 0.019223 0.027983 0.139187 0.071053 0.023603 0.083707 0.041123 0.069593 0.065213 -0.027740 -0.073000 -0.079327 0.154760 -0.011437 -0.022265 0.167414 -0.014113 0.046233 0.009794 -0.027618 -0.073000 0.008517 0.103660 -0.032120 -0.073487 -0.056453 -0.037230 -0.010585 0.061077 0.072027 0.034553 -0.023847 -0.089060 -0.073000 0.024577 0.017763 -0.059617 0.001589 0.010220 -0.068133 -0.120207 -0.004775 0.015817 0.029200 0.042340 -0.107067 0.115827 -0.029565 0.063753 -0.057427 -0.100254 0.043800 -0.027497 0.015026 0.013201 0.006722 -0.066187 -0.016060 -0.039907 -0.007361 -0.061077 0.026888 0.075433 0.045017 0.033580 -0.017277 -0.014478 0.002661 -0.036013 0.004380 0.063753 -0.011437 -0.119720 0.014539 0.026280 0.033580 0.133347 -0.059617 0.114854 0.032363 0.011802 -0.020562 0.000631 -0.016790 0.021778 0.020683 0.041123 0.036743 0.023360 0.029078 -0.005019 0.001452 -0.025185 0.148920 -0.028105 0.016547 0.047207 0.041610 -0.058887 -0.011619 -0.010828 0.106094 0.039907 -0.024820 0.099280 0.027740 -0.026037 0.019710 0.030173 0.062293 0.006753 -0.034553 0.073487 0.018737 0.074460 -0.033580 -0.078353 -0.092953 0.060833 -0.052803 -0.003285 0.090033 0.055237 -0.085653 -0.005019 0.044287 -0.085653 0.032120 -0.025672 -0.033093 0.041610 0.029930 0.019953 -0.024333 0.001795 -0.013140 -0.009186 0.007057 0.005749 0.022630 -0.031390 0.050127 0.037230 -0.006175 0.014600 0.101714 -0.061807 -0.064240 -0.030295 0.094900 -0.077867 -0.002403 0.115340 0.009247 0.033337 0.001384 0.023603 -0.054020 -0.073973 0.028105 -0.035040 0.009308 -0.047207 0.020318 -0.021170 0.029808 0.018980 -0.068620 0.016912 0.079813 0.049153 -0.019710 -0.064240 0.094900 -0.013992 -0.052560 0.005232 0.041367 -0.015817 0.090033 -0.057183 0.030782 0.001080 -0.017642 -0.099767 -0.039663 -0.049397 0.014783 0.021535 0.050127 0.151840 0.134320 -0.045260 -0.044287 0.096847 0.117287 -0.103660 0.016060 0.009368 -0.069107 -0.012958 0.007848 -0.014296 0.039177 -0.057427 -0.090520 0.082247 -0.057670 -0.058400 0.085167 0.062780 -0.006235 -0.016425 0.026037 0.013566 -0.096360 0.014904 -0.046477 0.026767 -0.058643 0.034797 0.052803 0.072027 0.090033 -0.043313
$ 

処理内容を簡単に説明しておくと…

  • 第1引数で指定した wikipedia-tokens.txt から全てのトークンとIDを取り込む
    • 単語総数は25889
  • 第2引数で指定した学習済みWord2Vecデータ(GoogleNews-vectors-negative300.bin)を走査し、トークンが一致するエントリーを見つける
  • 見つかったエントリについてトークンをIDに置き換え、ベクトルと共に表示
    • ベクトルの各数値の桁数はfloatの書式%fのデフォルトを使っているので%8.6fで表示される(好みに合わせて調整を)

今回の出力はオリジナルの仕様に則ったテキストファイルにしました。 というのも、よく考えたらこのファイルは改造版 fastWMD コマンドで読み込むから。 前回紹介した JSON フォーマットの出力ファイルもテキストファイルに直します。


まとめ

以上、本稿では wikipedia-embeddings.txt の生成を試みました。

これで Turing Bot のための WMD 実装の外堀は埋まった格好ですが、
改めて Word Mover's Distance の処理を俯瞰しておくと、 以下の4項目になります。

  1. 対象文章をトークン化する(前回
  2. トークン毎に埋め込み(分散表現)を抽出(今回)
    • 既存の学習済みWord2Vecデータを抽出
  3. トークン毎の埋め込み(分散表現)を合成し対象文章の埋め込み(分散表現)を生成する
  4. 比較する2つの文章の埋め込み(分散表現)で最適輸送問題を解き最小距離を算出する

これまで1、2、4については触れてきましたが、 実は3については全く触れていませんでした。 fastWMD の実装では Tools::getTripletsDocuments で実装されているようですが、次回は 改造版 fastWMD コマンドの作業を進めながら 3についても解説する予定です。

以上

*1:PythonJavaScript などのスクリプト言語で プログラミングを始めた若い方々にはピンと来ないかもしれませんが、 マシンの物理メモリを目一杯搭載しても16MBだった 30年前にプログラミングを始めた我々の世代にとって、 ストリームを扱うプログラミングこそが一般的でした。

当時はパイプが使える Unix の上で Cでプログラミングするのが大変便利だったのですが、 30年経過した今でもCがリーサルウェポンになる世界に住んでいるとは なんだか感慨深いです。

*2:プログラマの立場からコメントすると、 distanceソースコードはかなりまどろっこしいです😀