妄想を書きます. 決して信じないで下さい.
述語論理のような形式言語のもともとの目的は自然言語を形式的な形に翻訳できるような形式を目指すことであった. ありきたりな例を使う. 「誰々が誰々を愛する」という動詞を述語 \(Love\) を用いる. これは二項関数で、\(Love(x, y)\) は \(x\) は \(y\) を愛している、という意味を割り当てるのである.
ここの \(x\) や \(y\) は変数であって、何かを代入して使うのである. 例えば \(x={\rm Taro}, y={\rm Hanako}\) を代入して \(Love({\rm Taro}, {\rm Hanako})\) と書いて、これは「Taro は Hanako を愛している」という意味なのだと解釈することにする.
さて \({\rm Taro}\) や \({\rm Hanako}\) が何であるかといえば、それは現実世界にいるある太郎と、ある花子なのだと思うだろうが、 形式言語においては \({\rm Taro}\) は \({\rm Taro}\) でしかない. \({\rm Hanako}\) は単に \({\rm Hanako}\) でしかない. (Lisp や Ruby の) シンボルなのだと思ってもいいし、そういう文字列だと思ってもいい.
Bag-of-words (BoW) はこれに相当する. 文の中で Taro や Hanako が出現したら、ただ Taro というトークン、 Hanako というトークンが出現しているということだけを気にする. それらについてこれ以上、一切の、深追いはしない.
それでは困ることがある. 実在しないと考えられている個体である. 例えばユニコーン (\({\rm Unicorn}\)) という動物を考える. これは空想上の動物なので実在しないはずである. 先ほどの \(Love\) という動詞では、「太郎はユニコーンを愛している」くらいはちょっとばかし単純すぎるので何も問題がないような気がする. 「誰々が何何を見た」を意味する \(See(x, y)\) を考えよう. \(See({\rm Taro}, {\rm Unicorn})\) はどうか. 「太郎は (実在しないはずの) ユニコーンを見た」という文は意味をなさない. 常に成立しないからである. 「太郎はユニコーンを見た」を \(See({\rm Taro}, {\rm Unicorn})\) と翻訳するのは文字通りナンセンスなのである.
意味を為さない? ナンセンス? とはなんぞや?? 後述
普通、このような文は「太郎はユニコーンを見たと主張している」と訳するのである. これなら意味が通る. 実際にユニコーンが存在しようがしまいが、そう主張したかどうかは太郎次第で成立も不成立もするから.
「〜と主張している」と同様に、ユニコーンの非実在に関わらずに成立したりしなかったりするような動詞は他にも考えられる. 「〜を信じている」も同様だろう. こういった動詞を内包動詞という.
さて、そういう動詞はそういうものなのだと思えば、じゃあそれでもなお、ユニコーンは \({\rm Unicorn}\) というシンボルで書けばいいと思えるだろうか. 「主張する」を \(Insist\) で書くことにする. 「太郎はユニコーンを見たと主張している」は \(Insist(Taro, See({\rm Taro}, {\rm Unicorn}))\) だと書ける. まあ、これはこれで良いことにしても良い気もするが、モンタギューは構成主義を取った.
構成主義とは何か. それは、全体は部分によって説明されることを言う.
おお、文系お得意の煙に巻く説明だ.
構成主義とは何か. \(P(x) = y\) のとき、\(Q(P(x)) = Q(y)\) である、という主張である. 先ほどの \(Insist({\rm Taro}, See({\rm Taro}, {\rm Unicorn}))\) は、 \({\rm Unicorn}\) 故に \(See(\cdots)\) が偽なので、単に 「(偽なる事柄) を主張している」という解釈しかできない. \({\rm Unicorn}\) 同様に実在しえない空想上の動物として ゴジラ (\({\rm Godzilla}\)) がある. \(Insist({\rm Taro}, See({\rm Taro}, {\rm Godzilla}))\) も同様にして、「(偽なる事柄) を主張している」という解釈になる.
ユニコーンの場合とゴジラの場合とを区別できないぞ??? ほら、困るでしょう?
モンタギューは可能世界を導入した. 個体の解釈はどの世界で解釈するかによって違って見えるのだとした. ある世界ではユニコーンは存在する、というのである. まあ、そういう世界を頭の中に作れる、という程度の意味だが. ある世界ではユニコーンが存在して、ゴジラが存在しない、といったケースを考えることで、ゴジラとユニコーンを区別できる.
ある世界 \(w\) での \(x\) の解釈を \([\![x]\!]_w\) と書く. 「ユニコーン」を \({\rm Unicorn}\) というシンボルを用いて、 \(\hat{}{\rm Unicorn}\) とする. ハットがついてるのが、モンタギューが導入した形式言語における個体の表し方である. (N.B. 中に使われているシンボルはユニコーンそのものではない.) \(\hat{} {\rm Unicorn}\) を解釈するには、解釈する世界が \(w\) であることに註意して、 \([\![{\rm Unicorn}]\!]_w\) を調べることにする.
本質的に重要なことは、世界が決まったら解釈ができることではなく、 「ユニコーン」自体は、あらゆる世界を想定していること. \(w\) を引数にとる関数自体が個体なのだと言える.
自然言語処理において今まで我々は、\({\rm Unicorn}\) という単語が出現したら、それは単に \({\rm Unicorn}\) というシンボルだとしか解釈しなかった (Bow). モンタギューは 1970年、 "English as a Formal Language" という論文の中で、先述した、内包、可能世界といった概念を導入した. 一つの単語をただのシンボルとして扱う以上の必要性を説いたものにほかならない. 即ち、Taro、Unicorn といった単語は、あらゆる世界でどういう解釈をされてきたか、を知らないと読めない単語なのだ. ある一つの文に Taro と出てきただけでは我々はそれが何かを知ることができない.
分散表現までに話を飛ばさなくても、「共起ベクトル」という発明がある. 可能世界とは、人類の歴史における人間の頭の中にあったものである. そしてそれはテキストという形で残されてきた. それら多くを今でも手に入れることができる.
共起ベクトルは、「単語の解釈」を「単語の使われ方」だと思うことにした. さらに「単語の使われ方」を「近くにどんな単語 (周辺単語) が出てきたか」だと思うことにした.
例えば、"Taro loves Hanako." という一文における Taro の使われ方は、 \(((), (loves, {\rm Hanako}))\) である. loves の使われ方は \((({\rm Taro}), ({\rm Hanako}))\) である. ここらへんの細かいところは流儀があるだろうけれど. 左右を区別するかとか順序を考慮するかとか「近く」とは一体何なのか (例えば、その単語から3トークン以内に出現する単語). たった一文では「あらゆる世界」を考慮してることにならない. それでも、ありったけ大量の文を集めてくれば「あらゆる世界」に近づけるだろう.
それでも共起ベクトルはまだ内包への抽象化が足りない. \(A\) というシンボルを表現するために、近所のシンボルを集めることをしているからである. \(A\) 自体の表現はシンボルから一歩遠ざかったが、そこには直接、シンボルが使われている. 上の例では \(loves\) を表現するのに \({\rm Taro}\) というシンボルが使われている.
今書いた共起ベクトルのことを「単語の分散表現」というのは恐らく間違っていて、 普通思い描くのは word2vec だろう. でも所詮、分散表現は共起ベクトルの延長でしかない.
CBoW (continuous Bow) や skip-gram はさらに一歩シンボルから遠ざかっているように思える. それは単純にあの計算グラフを思い描ければ分かる.
書きたいこと書き終えたので話をまとめたい.
最初に「妄想を書きます」と言ったので平気で怪しいことを断定口調で書けるようになった. これこそが自由なインターネット.