読者です 読者をやめる 読者になる 読者になる

にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

YoRHa No.2 Type Bを作りたかった

はじめに

 ドーモ。国家深層学習術師デス。(多数のミームが重なり合い、汚染が観測できるはずです)

 この前、Domain Transfer Network(DTN)というものがFacebook機械学習関連の研究所から発表され、直接的な対応関係がなくても、対応したドメインに変化させることができるということが実証されました。

 実を言うと私には、いくつか夢があり、一つ結婚すること、二つJKになること、三つ目は生殖以外の方法で知能を錬金することです。

 物質的な改造によるJK化は無理だと諦めているのですが、DTNで自分のビジュアルをJKに変換し、AR/VRに投影することで実現可能なのではって考えています。AR/VRに投影することでは物質として本質が変化することはありませんが、認知レベルでは詐称可能です。クオリア(その人の認識の非常に深いところ)を攻略するにはAR/VRで十分であると感じています。

 JKになるべくタイに行かなくてよかった。オレはディープラーニングでJKになってやる。

 DTNもしばらくいじっていたんですが、うまく収束させるのが難しく、また今度ゆっくりやっていきたいと思います。
 
 蛇足がひどかったですが、三つ目の夢である、人工生命の生成に関して、Facebookが非常に興味深い研究を行っています。文脈を考慮できるチャットボットのような存在を研究しています。

意識の在り処

Wikipedia中国語の部屋を読んでもらえばわかるかと思うのですが、何らか同じように感じ、同じような感覚質を所有し、自分が考える心が宿っているかなどは、プロトコルが成立して、会話などが成り立っていればあたかも心を持った存在であると、詐称し続けることが可能になります[1]

f:id:catindog:20170221124151j:plain

図1.結構真理に近い人

これは哲学的ゾンビの問題にも波及する大いなる命題です。あなたの好きなあの子は、本当に自分と同じく思考し、感じる人間ですか?あなたの脳が見続けている夢ではありませんか?[2]

 哲学的ゾンビか、真に意識を持った存在かは、観測側から証明不能なので、意識をもったような存在の生成は機械で代替可能であると考えています。

 Googleの研究所ではSeq2Seqを用いた応答ボットは、チャットでのヘルプデスクの会話ログを学習させたことで最も人間らしいと判断されたのでした。そこで課題とされたのは、文脈に応じた会話ができない問題でした。以下は例ですが、文脈が簡単に破綻してしまいます。

質問> あなたの職業はなんですか?
機械> 医者です
質問> さぞ儲けていらっしゃるのでしょうね
機械> わたしは投資機関で働いていますが、投機に失敗してしまい赤字です

 医者と言ったのに直後の文脈で理論的な破綻が起きています。このようなことがSeq2Seqでは簡単に起きやすいです。
AttentionやConditional Vector(出力の方向性を指示するベクトル)を入れることで解決できることでもあります。(要は前の文脈を内在した表現を入力に受け付けることになるから)
 
 このように機械学習で生成したモデルは、人間から見るといささか不自然に見え、意識が宿っていないように見えます。

 ですが、この文脈に応じた会話ができないという、言語を理解していないように見える側面を、攻略しようとしているのがFacebookの研究の本質的なところなのかなと感じています。

bAbiデータ・セットについて

 Facebookが作成した会話を記したダイアログで、bAbi(ベビーと多分発音する)という名が記すとおり、知能などをテストする指標としてなるべく作成されました。

 既存のLSTMなどでも比較的うまく動くものも多いですが、既存の手法では、うまくいかないものを、どのようなネットワークしたら意味を取れるような動作をするのかという点を競い合っています。

 Facebookが公開したネットワークはMemNNとよばれ、文脈を記憶するような作用があります。文脈を覚えることで、もっともらしい箇所を参照して質問に対して適切な解を導いたりします。

 データ・セットには様々な指標が入っており、以下のような構成になっています。

1	Basic factoid QA with single supporting fact	WhereIsActor
2	Factoid QA with two supporting facts	WhereIsObject
3	Factoid QA with three supporting facts	WhereWasObject
4	Two argument relations: subject vs. object	IsDir
5	Three argument relations	WhoWhatGave
6	Yes/No questions	IsActorThere
7	Counting	Counting
8	Lists/Sets	Listing
...

 1のサンプルについて具体例を記しておくと、このようなものになります。

INPUT: メアリーはトイレに移動しました。
INPUT: ヨハネは廊下に行った。
Query: メアリーはどこですか? 
Anser: バスルーム
(これは非常に短い応答だが、実際にはもっと複雑)

 文脈に応じた回答が求められるデータセットでは単純にSeq2Seqのような前の特徴量との対応関係を自動で構築する以上のことを求められていることがわかるかと思います。
 
 英語の限定されたモデルでやっても面白くないと思ったので、邦訳した簡単なデータセットを下部のgithubのURLの場所においておきます。(別途パース用のスクリプトを動作させる必要があります)
 

MemNNについて

MemNNはFacebookの研究所で考案されたネットワークで以下の4つの諸要素から構成されています。

I: (input feature map) convert incoming data to the internal feature representation. 
G: (generalization) update memories given new input.
O: produce new output (in feature representation space) given the memories.
R: (response) convert output O into a response seen by the outside world. 

IGORとは、映画フランケンシュタインの教授の助手であり、このあからさまな名称はやはり人工生命の文脈が背後にあること意図しているものであると思われます。

説明資料の図をそのまま記す。
f:id:catindog:20170221124801p:plain

図2
実際にはこのような読み書きするモデルではなくて、何回かモデルを再帰的に合成・変換することで目的の機能を達成している(ように見えます)。
 Matching functionというものがあって、質問と状況説明ペアのベクトルを合成して、参照できるようにしてあります。
 答えが直接的な表現でないこともあり、2nd hopと呼ばれる二回目のMatching functionもあります

Match(Q:Where is the footbal?, A:John picked up the football)
2nd hop-> Match( [Q:Where is the footbal?, A:John picked up the football], A:John is in the playground)
ネットワークの説明

 この図が分かりやすかった。
f:id:catindog:20170221124731p:plain

図3
 Episodic Memoryとは、InputとQueryを合成させたもので、更にもう一回、Episodic MemoryとQueryを合成してAnswerを作り出します。

 下記の図のように実装ているのですが、図や文章だけでは私もよくわからなかったので、コードと合わせて参照することをおすすめします。
f:id:catindog:20170221125352p:plain

図4.モデルの図解

Kerasでのモデル
    # この入力は状況説明文
    input_encoder_m = Sequential()
    input_encoder_m.add(Embedding(input_dim=vocab_size, output_dim=64, input_length=story_maxlen))
    input_encoder_m.add(Dropout(0.3))
    # この入力は質問文 
    question_encoder = Sequential()
    question_encoder.add(Embedding(input_dim=vocab_size, output_dim=64, input_length=query_maxlen))
    question_encoder.add(Dropout(0.3))
    # 積で合成
    match = Sequential()
    match.add(Merge([input_encoder_m, question_encoder], mode='dot', dot_axes=[2, 2]))
    match.add(Activation('softmax'))
    # この入力は状況説明文
    input_encoder_c = Sequential()
    input_encoder_c.add(Embedding(input_dim=vocab_size, output_dim=query_maxlen, input_length=story_maxlen))
    input_encoder_c.add(Dropout(0.3))
 
   response = Sequential()
    response.add(Merge([match, input_encoder_c], mode='sum'))
 
    response.add(Permute((2, 1)))  # output: (samples, query_maxlen, story_maxlen)
    # Σで合成
    answer = Sequential()
    answer.add(Merge([response, question_encoder], mode='concat', concat_axis=-1))
    answer.add(LSTM(32))
    answer.add(Dropout(0.3))
    answer.add(Dense(vocab_size))
    answer.add(Activation('softmax'))

    answer.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

具体例

 Kerasのsampleコードにもあるのですが、何故か学習のスクリプトだけ用意してあって、どのように実行するのかプログラムが書いてありませんが、自分で実装するのもそう難しいことではありませんでした。
 一応、githubでcloneすればそのまま使える感じにしておきます。(Python3とKerasが必要です)

$ git clone https://github.com/GINK03/keras-babi-memnn.git
$ cd keras-babi-memnn
データセットをシリアライズしてMemNNが読める形に変換します
$ python3 kizunekotom.py

またネットワーク構成をみると、まだユニット数を増やしたり、いろいろな条件を付け加える余地がある感じでしたので、任意の新規提案が色々載せられる段階であると思います。

学習タスク(デフォルトepoch200、ネットワークはModel.pyを参照のこと)
$ python3 babi_memnn.py --train
Using TensorFlow backend.
Vocab size: 45 unique words
Story max length: 86 words
Query max length: 7 words
Number of training stories: 9995
Number of test stories: 993
-
(...だいたい30分くらいで200epochの学習完了)
ボキャブラリ数40くらいで、Validation精度が93%程度(英語では95%超えてたけど、翻訳が怪しいのでしょうがない)
予想タスク
$ python3 babi_memnn.py --pred
サンドラは庭に行った。ジョンは台所に行きました。メアリーはトイレに行った。メアリーは寝室に行った。メアリーはオフィスに旅をした。ダニエルはトイレに行った。
Q:メアリーはどこですか?
ANS:オフィス

github

Python3とgithubがインストールされていれば、git cloneして、下記のコマンドを叩くだけで使用可能だと思われます。
https://github.com/GINK03/keras-babi-memnn

$ python3 babi_memnn.py --train

bAbiデータ・セットの次にあるもの

 チャットボットを超えた何らかの意識を有しているように見えるネットワークがくる、と思います。ただMemNNも相当アドホックなものな感じなので、しばらく何がベストなのか探索的な研究は続くと思います。
 短い期間でえらい勢いでスコアが伸びてるので、期待して良さそうですね[5]

おまけ:「機械学習」と「AI・人工知能」というワードの意味は異なる?

 ちょっとだけ言っておこうと思うことがありまして、Google検索でニュース記事のライターの方とか、専門誌のライターの方が検索して引っかかってくれることを少々期待しています。
 「機械学習」と「AI」と「人工知能」の使い分けはどうされていますか?私が所属している機関では、営業向けの人はAIということが多く、現場の人は機械学習ということが多いです。
 機械学習は非常に工学と科学の双方を用いて、理論や仮説にもとづいてモデルを構築し、エンピリカルに成果を出すものなのかなって思います。それで、エンジニアは偉い人にこれこれこういうことをやっていると説明するんですが、偉い人の知識体系には、私がやっている体験の実感がないためか、AIと翻訳することがあってズレを感じる次第です。
 
 理解が違えば、用法も違うので意味が異なってきてしまいます。単純な言い換えにはならないんじゃないかと思っていたのですが、定量的にこれで行けるんじゃないかと思った方法があるので、ご紹介します。

1.意味が近しいや同じってどういうことか → 意味をベクトル空間に射影することができれば、近しいベクトル同士が意味が似ているといえる
2.ベクトル空間に射影するには → fastTextやword2vecなどのword enbeddingが意味が近いものが同じようなベクトルになることが幾つかの論文で示されている
3.しかし、人間には200次元ものベクトルの近さをイメージできない → PCAなどの次元圧縮方法で可視レベルに落とし込める

 こんな仮説(プロセス?)が成立できました。
 Newsサイトの記事2月1~15日までの記事を集めると500MByteを超えるデータになりました。テキストとしては十分大きいです。
 fastTextを今回用いembeddingしました。sub word分割が強力に働きすぎるということだったので、最小のcharのngramを5文字と限定するチューニングのみ行いました。
 sklearnのPCAで2dimに圧縮して、プロットするとこのような図が得られました。
 
 右上の方の「機械学習」と「AI」と「人工知能」を確認してください。「AI」と「人工知能」は非常に近いので言い換え可能そうですが、「機械学習」はちょっと距離がありますよね。単純に機械学習の言い換えとしてのAIはきついんじゃないですかね。
 こういうことがあるということだけ知ってもらいたいと思いました。
f:id:catindog:20170221141442p:plain