word2vecを使うと、たとえば王様-男+女 = 王女様
のように、単語の意味の足し算ができます。
import gensim.downloader
vectors = gensim.downloader.load('word2vec-google-news-300')
vectors.most_similar(vectors['king'] - vectors['man'] + vectors['woman'], topn=5)
このプログラムの結果は下記のようになります。1
[('king', 0.8449392318725586),
('queen', 0.7300517559051514),
('monarch', 0.645466148853302),
('princess', 0.6156251430511475),
('crown_prince', 0.5818676352500916)]
しかし。私は義務教育レベルの数学は理解しているつもりですが、「単語の意味の足し算」と言われても何のことなのか、これは何をどういう演算をしているのか、よく分かりませんでした。「足し算」というのは「数」に代表されるような数学的定義を持つ集合に対して定義される演算であって、「単語」に対する足し算や引き算というのが一体何なのか理解できませんでした2。なので、自分なりに調べてみました。
本稿は、調べた結果を自分が理解しやすいと思った順番にまとめていきます。研究の歴史をまとめる目的の記事ではないので、実際の言語学や言語処理研究の歴史が本稿の順番で進んでいったものかどうかや、学術上の定義に厳密に従っているかの保証は無いです。
単語の意味とは
さて、意味について考える前に、まずそもそも 「意味」 とは何でしょうか。
「意味」と言っても
- 単語の意味
- 文の意味
- 複数の文からなる文脈の意味
...など複数の対象が考えられますが、本稿では 単語の意味 に限って述べていきます。
辞書が示す意味
「このコーヒーは冷たい」
この"冷たい"の意味とは何でしょうか。
単語の意味を知りたいとき、まず辞書で引いてみるのが自然だと思います。
「冷たい」を辞書で引いてみます。
温度が低く感じられる
とありました。
では"温度"の意味は何でしょうか?
これも辞書で引いてみます。
物体のあたたかさ・冷たさを示す尺度
"冷たさ"と言われてしまい、先ほどの"冷たい"に戻ってきてしまいました。3
このように辞書が示す意味とは意味のすべてではなくて、実際には「日本語をある程度知っている人に向けた、同義語や類義語による説明」であることが多いです。辞書に書いてあることが、必ずしも単語の意味すべてを本質的に説明しているわけではありません。
辞書に書いてあることだけが単語の意味ではないとしたら、「意味」とは一体何なのでしょうか。
言語学的意味論
言語について意味をどのように捉えるか?というのは、言語学における 意味論(semantics) として研究されていて、そのなかには様々な領域があります。
-
成分分析(componential analysis)
- たとえば
男=<+人間><+男性>
,娘=<+人間><-男性><+一世代下><+直系>
のように、原始的な意味成分のプラスマイナスで語を表す - 「母」が
<-男性><+親>
なのか<+女性><+一世代上>
なのか、原始的な意味成分の定義がブレる - 「せっかく」のような抽象的な語の表現がむずかしい
- たとえば
-
意義素論(sememe)
- たとえば、「自転車」「チャリンコ」「ロードバイク」を以下のように説明する4
- 文法的特徴: 名詞であり、主語や目的語になる
- 語義的特徴: ペダルを漕いで進む二輪の乗り物
- 含蓄的特徴: 「チャリンコ」はくだけた文体で用いられる、など
- たとえば、「自転車」「チャリンコ」「ロードバイク」を以下のように説明する4
-
語の意味関係(sense relations)
- 同義・反義のような、語の意味を他の語との関係性で説明する
- 「話す」「喋る」は同義関係
- 「冷たい」「温かい」は反義関係
- 「コーヒー」「アイスコーヒー」は包摂関係
- 「アイスコーヒー」「ホットコーヒー」は非両立関係
- 同義・反義のような、語の意味を他の語との関係性で説明する
他にも言語学的意味論には色々あるようです。詳しく解説はしませんが、「意味とは何か?」は色々と研究されていて一言に説明できるような物ではない、ということのようです。
さて本稿で考えたいのはword2vecについてです。word2vecはどのような意味論に基づいているのでしょうか。
単語を統計的に捉える
国語の問題です。
「このコーヒーは○○」
○○に入る語は何か、次のうちから選んでください。
- よそよそしい
- 寒い
- 青い
- 冷たい
多くの方が、直感で「冷たい」が正しいという事が分かると思います。
なぜ、「冷たい」が正しいのでしょうか。
「このコーヒーは"寒い"」
これは、コーヒーに対して「温度が低い」という状態は、語義的には合っています。
ですが「寒い」は気温を表す語であり、コーヒーのような液体を修飾しません。
「このコーヒーは"青い"」
「コーヒー」は色を持つ液体であり、「青い」は液体を修飾し得る単語です。これは語義的にも文法的にも正しいです。
ですが、普通コーヒーは青くありません。5つまり「コーヒー」と「青い」は共起しない、「コーヒーは青い」という文は統計的にみて尤もらしくないため、誤りとなります。
「このコーヒーは"冷たい"」
一般的に「冷たい」という単語は、文脈中の句「コーヒーは」と同時に出現(共起)します。この回答は「コーヒー」と「冷たい」の間にある統計的特徴を満たしていると言えます。また語義的にも文法的にも正しいです。
結果、「冷たい」が正解になります。
つまりこの国語の問題は、単語を統計的に見た時の特徴を理解しているか?を問う問題なのでした。
分布仮説に基づく意味論
単語を統計的に捉える取り組みを一般化して考えるうえで重要なのが 分布仮説(distributional hypothesis) です。
You shall know a word by the company it keeps (Firth, J. R. 1957:11) 6
「単語の意味とは、単語の周囲に現れる単語によって定まるものである」たとえば「似た文脈で使用される語は、似た意味を持つ」とする仮説です。そして、この分布仮説に基づく統計的な意味論の体系があります。7
なお、ここでの 文脈(Context) とは、ある語の周辺の語のことです。
数学的な定義を与えると、文章 $S=(w_1, w_2, ..., w_n)$が与えられた時に、語 $w_i\in S$ の周辺前後 $c$ 語ずつとった $C_i=(w_{i-c},...,w_{i-1},w_{i+1},...,w_{i+c})$ を文脈、 $c$ を ウィンドウサイズ とよびます。ある語 $w_i$ の文脈 $C_i$ に $w_j$ が含まれる時、 $w_i,w_j$ は 共起 していると言います。
この分布仮説に基づく意味論において、
- 「このコーヒーは"冷たい"」
- 「このコーヒーは"冷めている"」
- 「このコーヒーは"冷えている"」
- 「このコーヒーは"温度が低い"」
「冷たい」は、これらと同じ文脈で使用されている(同じ共起語をもつ)ので、似た意味である、という事になります。
分布仮説によって、語の意味を統計的に扱えるようになります。たとえば辞書で定義された意味は、扱う全ての語についての説明を辞書として用意する必要があり、日常的に扱われる数万語以上の語のすべての意味を用意するのは簡単なことではありません。一方で、分布仮説にもとづいて統計的に扱われる意味は、大量のテキストデータさえあればそれを統計的に処理することで語の意味が表現できる強みがあります。
共起語の収集
分布仮説に基づいて統計的に意味をとらえる上で、共起語を集めることが必要になります。これはword2vecに限った話でもないですが、word2vecにおいて機械学習の教師データとなるのもあり、ここで触れておきます。
今までもたとえば「コーヒー」と「冷たい」は共起するものである、という事を自明として話を進めてきましたが、こういった語がどの語と共起するか、という情報を大規模なテキストデータ( コーパス )から大量に集めます。
「このコーヒーは冷たい」という文があったとします。まずは 形態素解析 をして「この コーヒー は 冷たい」のように文を単語毎に区切る 分かち書き をします。そして、この=0
,コーヒー=1
,は=2
,冷たい=3
のように単語毎にユニークのIDを振ってTokenizeします。IDが要素に対応しているベクトルを考えます。この=(1,0,0,0)
,コーヒー=(0,1,0,0)
のような感じです。
ウィンドウサイズ1の場合、単語の前後1語ずつを共起語とするので、たとえば「コーヒー」と共起するのは「この」「は」なので、(0,1,0,0)
と共起するのは(1,0,1,0)
です。
この処理を「このコーヒーは冷たい」という1文のみで行いましたが、実際には大量のテキストからなるコーパスに対して同じ処理を行い、たくさんのトークンに対して共起する語が何なのかカウントしたデータを作っていきます。こうして、大量のテキストデータとそれを処理するプログラムとコンピュータリソースさえあれば、共起語を集めることができ、分布仮説に基づく意味論につなげていくことができるようになります。語の意味をひとつひとつ手作業で定義していく事に比べると、これがコンピュータと相性が良いため自然言語処理技術によって活発に使われるようになったということは、説明するまでもないと思います。
ところで。先の例では「コーヒー」と共起するのは「この」と「は」だとしてしまいました。いままで「コーヒー」と「冷たい」が共起することは自明として話をしてきましたが、この例における定義では共起していない事になってしまいます。
どの語が共起するとしたほうが良いのかは、解きたいタスクによります。実際にはウィンドウサイズを変更したり、形態素解析で特定の結果を除外・加工したり、分かち書きの粒度を調整するなどして、必要な語が共起するように最適化することが必要になります。
分布仮説の弱点
分布仮説は単語の意味をとらえる上で万能ではなく、反例というか弱点があります。多義語と対義語です。
「冷たい」は、ひとつの単語が複数の意味を持つ 多義語 です。
- 「あの人は冷たい」
これは「コーヒーが冷たい」のような温度の低さの話ではないですが、統計的には区別されません。
また、「冷たい」には 対義語 があります。
- 「このコーヒーは冷たい」
- 「このコーヒーは熱い」
上記において「冷たい」「熱い」の周辺文脈は完全に一致しています。意味としては反対なのですが、統計的には似ているものとして扱われてしまいます。
このように分布仮説は万能ではないようですが、大規模なデータから統計的に語の意味を取り扱えるという強みがあります。以降では、分布仮説に基づいて語を表現していきます。
カウントベースの単語ベクトル表現
「似た文脈で使用される語は、似た意味を持つ」を満たしたくて、
「似た文脈で使用される語は、似たベクトルを持つ」ようにベクトルを作りたいです。
「コーヒー」と「カップ」という2つの単語について、それぞれ文脈によく登場する単語を考えてみます。
語 | 文脈によく登場する語 |
---|---|
コーヒー | 冷たい、熱い、飲む、入れる... |
カップ | 大きい、小さい、使い捨て、陶器... |
ここに登場する語から、「冷たい」「飲む」「大きい」「使い捨て」の4つを取って、これらを 語彙(Vocabulary) として、よく登場する語なら1、そうでないなら0を表現してみます。
語 | 冷たい | 飲む | 大きい | 使い捨て |
---|---|---|---|---|
コーヒー | 1 | 1 | 0 | 0 |
カップ | 0 | 0 | 1 | 1 |
これは、コーヒー=(1,1,0,0)、カップ=(0,0,1,1)という4次元のベクトルになると言えます。このようにしてベクトルを得る手法を カウントベース手法(count-based method) と呼びます。この語の統計的特徴から得られたベクトルの性質を調べていきます。
加法構成性
word2vecは、単語同士の足し算が定義されていました。先ほど得た「コーヒー」と「カップ」のベクトルについて、足し算を考えてみます。
単語 | 冷たい | 飲む | 大きい | 使い捨て |
---|---|---|---|---|
コーヒー | 1 | 1 | 0 | 0 |
カップ | 0 | 0 | 1 | 1 |
コーヒー + カップ8 | 1 | 1 | 1 | 1 |
「コーヒー」と「カップ」のベクトルの和は、また別の語「コーヒーカップ」のベクトルとして得たいものに類似している、ように感じます。このように、ある語のベクトルの和によって意味の合成の近似が得られるという性質を 加法構成性(additive compositionality) と言います。
加法構成性が成り立つには色々と条件があり、どんなベクトル表現でも常に成り立つわけではありません。実際に先ほど得たベクトルを加算して「コーヒーカップ」のベクトルを見てみると、「コーヒーカップ」のベクトル表現として「コーヒー」と「カップ」の和を用いてもそこまで違和感が無いのではないでしょうか。
同様にして引き算も「コーヒーカップ」から「カップ」を引いたら「コーヒー」に近くなる、として表現されます。
これが、単語をベクトルに変換して足し算・引き算をする、という事です。単語の足し算・引き算は、単語の持つ統計的特徴の和や差を表している、と言えます。
この加法構成性を数学的に表現すると、語$s$のベクトル表現を$\mathbf{w}(s)$とし、$s$の隣に$t$が出現しない確率を$\pi_{s\backslash t}$とすると、一定条件のもとで以下が成り立つ、と言えるようです。(詳細は参考文献[2]参照)
$$
||\mathbf{w}(st)-\frac{1}{2}( \mathbf{w}(s) + \mathbf{w}(t) )||^2
\leq \frac{1}{2}(\pi^2_{t\backslash s} + \pi^2_{s\backslash t} + \pi_{t\backslash s}\pi_{s\backslash t})
$$
左辺が小さい値になるということは、$\mathbf{w}(s)+\mathbf{w}(t)$と$\mathbf{w}(st)$が似ているということ、つまり$st$のベクトル表現は$s,t$のベクトル表現の和で表せる、ということです。左辺がどれくらい小さい値になるかは、右辺の結果によります。$s,t$が同時に出現することが多いほど、$\pi_{s\backslash t}$と$\pi_{t\backslash s}$が小さくなり、右辺が小さくなります。
カウントベース手法によるベクトル表現の問題点
ここまでカウントベース手法として、語彙「冷たい」「飲む」「大きい」「使い捨て」の4つのみとして、それぞれをベクトルの1要素に割り当てた4次元のベクトルを考えてきました。しかし、この表現には問題点があります。
実際の語彙というのは、定義にもよりますが数万~数百万以上にものぼります。語彙数が次元数となるベクトル表現をしていると、とんでもなく大きなベクトルを大量に扱うことになり、データとして保存や演算するのも大変です。9
また語彙というのは絶えず増加するもので、日々新しい 未知語 が生まれています。しかしカウントベース手法では、語彙がひとつ増えるごとにすべてのベクトル表現の次元数をひとつ増やしたものに更新したデータをイチから作り直す必要があります。
実際の膨大な語彙に対してこのようなベクトル表現をすると、要素のほんの少しだけが1であり後ほとんどがゼロとなる 疎な(スパースな)ベクトル になります。ほとんどの要素は情報量がなくてもったいないんですね。
そうではなくて、もうちょっとベクトル表現を工夫することで、要素が詰まっていてもいいので次元数の一定となるような"密な"ベクトルが得られないでしょうか。そのベクトルが、加法構成性のような特徴を保ったまま得られないでしょうか。
推論ベース手法
やっとword2vecの話になります。
word2vecのしくみ
分布仮説に基づいて、「似た周辺分布の単語は、似たベクトルを持つ」ように、良い感じにベクトルを定義したい、と考えます。
word2vecでは「ある単語を入力すると、周辺語の出現確率を出力する」ようなニューラルネットワークを考えます。
たとえば語彙が「寒い」「冷たい」「コーヒー」の3つだけだったとして、「寒い=(1,0,0)
」「冷たい=(0,1,0)
」「コーヒー=(0,0,1)
」のようにone-hotエンコーディングで3次元ベクトルを表現し、これを入力とします。
ニューラルネットワークの出力としては、各単語が周辺に出現する確率を示した3次元のベクトルになります。「コーヒー」を入力したら「寒い」よりも「冷たい」のほうが周辺出現確率が高いはずなので、「冷たい」に該当する2要素目の値が高いベクトル、たとえば(0.1, 0.8, 0.1)
のような出力が得られるでしょう。
隠れ層が1つだけの、2層ニューラルネットワークを作ります。ボキャブラリ数 v 、隠れ層の次元数 n とします。
v は先の例では3でしたが一般的には数万~数百万のとても大きな数であり、使うデータによって変動します。一方 n は固定値で、50~300程度が使われる事が多いようです。
入力層から隠れ層の間で、なんらかの計算が行われて、単語に対してn次元のベクトルが得られます。出力層では、単語のn次元ベクトルと周辺文脈内の語のn次元ベクトルとの内積を計算し、Softmax関数で確率化して出力とします。この値が全単語分あるのでv次元となります。共起する語の確率が高い値になるように、ニューラルネットワークを学習します。10
そして、ニューラルネットワークが"良い感じ"に学習できて、単語を与えたら周辺語の確率を"良い感じ"に出力層に出してくれるモデルができたとします。この出力の前の 隠れ層を取り出したn次元ベクトルが、単語のベクトル表現として使えます 。数学的な根拠はありますが、直感的にも「周辺語の出現確率を良い感じに出してくれるニューラルネットワークがあって、その出力層の1つ手前の層には、単語の統計的特徴が詰まっている」と理解できるかもしれません。
このようにして得られた固定長のベクトル表現は、以前定義した可変長の"疎な"ベクトルと区別して、単語の 分散表現 や 埋め込み表現 と呼ばれます。この分散表現には加法構成性が成り立つことが分かっており、先に示したような単語同士の足し算で統計的な意味の足し算が実現します。
また、ニューラルネットワーク学習時の隠れ層の設定によってベクトルの次元数を好きに設定できるため、100次元など好きな固定次元数のベクトルが得られます。100次元といわれると大きいような気がしますが、カウントベース手法で作ろうとしていた数万~数百万次元に比べると十分に小さい次元数であり、コンピュータで取り扱うには十分取り扱いやすい大きさと言えるでしょう。
こうして取り出された単語のベクトルにおいて、冒頭に挙げた王様-男+女 = 王女様
のような計算も成り立っています。
word2vec以外の単語分散表現
2013年にword2vecが登場した後、また別の方法で単語分散表現を得るモデルがいくつも公開されました。
GloVe
GloVe は、スタンフォード大学の公開している単語分散表現のためのライブラリです。
単語の共起確率を直接使うのではなく、ある単語と別の単語との共起確率の比を用いることで、単語間の相対関係をより適切に表せるようです。
fastText
fastText は、facebookの公開している単語分散表現のためのライブラリです。word2vecは形態素解析をベースにしていたのに対して、より細かい単位である サブワード に区切って学習するため、語彙数が少なくなって処理が高速化し、未知語やスペルミスにも強いようです。
サブワードというのは多分、たとえば「焼肉」「豚しゃぶ」という単語をさらに「焼」「肉」「豚」「しゃぶ」に区切って扱うことで、新しい語として「焼豚」が現れたときに「焼肉」の「焼」と「豚しゃぶ」の「豚」の合成である、と表現できるようになるものだと思っています。
word2vecの先
word2vecにはいくつか弱点があります。ひとつは 文脈に依存しない という点です。「このコーヒーは冷たい」の中の「コーヒー」の共起語「この」「は」「冷たい」の3つを統計的に同じように扱い、文脈における語順や依存関係などの情報が失われてしまうため、文章中における語のニュアンスなどを捉えきることができません。
後に登場する BERT 等は、このあたりを改善し文脈に依存した意味も表現できると言われています。ですが、そのぶんモデルも大規模になり学習や利用も大変になります。文脈に依存しない語義を取り扱いたい場合、word2vecのような単語分散表現を得る方法は今でも使われています。
まとめ
- 単語の「意味」の捉え方には色々ある
- word2vecのあらわす「意味」とは、統計的な観点での意味である
- word2vecの単語の足し算は、単語の登場する文脈の統計的特徴の和のようなものである
- 統計的特徴を良い感じに固定長のベクトルへ落とし込んだ物が、word2vecで得られる
参考文献
- 原沢伊都夫, 『日本語教師のための 入門言語学』, 2016.
- 田然, 「言語の意味空間」,『数学セミナー2020年3月号』, 2020.
- 田中久美子, 『言語とフラクタル』, 2021.
- Zellig S. Harris: Distributional Structure, 1954.
- Ran Tian, Naoaki Okazaki, Kentaro Inui:The Mechanism of Additive Composition, 2017
- 中山光樹『機械学習・深層学習による自然言語処理入門』2020.
- 斎藤 康毅『ゼロから作るDeep Learning 2 自然言語処理編』
-
実際に
most_similar()
で類似語を求める時はベクトルを正規化して演算する。その結果はmost_similar(positive=['king', 'woman'] ,negative=['man'])
で得られるが、本稿ではベクトルの加法を直接的に表現したいためこのようなソースコードを掲載している。 ↩ -
単語の意味をアーベル群として捉えれば純粋数学のみで説明可能かもしれないが本稿でそういう話はしない ↩
-
「物体中の分子や原子の平均運動エネルギーに比例した量」という記述もあるが、「コーヒーが冷たい」と言われた時に「運動エネルギーが小さい」というのが本質的な意味だというのは直感に反する。「冷たい」の意味は物理学の知識が無くても理解できるものだと考えられるから。 ↩
-
https://icc.rikkyo.ac.jp/wp/wp-content/uploads/2020/09/07%E5%B0%8F%E5%AE%AE%E7%A7%80%E4%BA%BA2.pdf より引用 ↩
-
この分野は分布意味論(distributional semantics)や統計的意味論(statistical semantics)と呼ばれるようだが、違いがよく分からなかったので本稿でこれらの用語の使用は控え「分布仮説に基づく意味論」「統計的な意味」という表現を用いる。 ↩
-
ベクトルの要素の数値について、単純に語が登場するかどうかの二値ではなく相対的な度数だと定義し直せば、「コーヒーカップ」を1語とした時の文脈の各語の値は「1」ではなく「0.5」に正規化するのが妥当とすることもできる。 ↩
-
ベクトルの次元圧縮等で密なベクトルを得る手法もあるが、大きなベクトルに対する演算が大変だという問題はなくならない。 ↩
-
ここで説明した「単語を入力として周辺語の出現確率を求める」ようなモデルはskip-gramと呼ばれる。word2vecにはもう1つのモデルとして、逆に「周辺語を入力として単語の出現確率を求める」CBOWと呼ばれるモデルもあり、精度や学習時間に差がある。 ↩