向きは分かった。でも、あの軸は誰が置いたのか
前回、好みを「甘いもの好き度」と「辛いもの好き度」の二つの軸で表して、平面上の矢印にしました。そして、似ているかどうかは矢印の長さではなく向きで測れる、という話をしました。同じ向きなら、強さが違っても好みの傾きは同じ。向きが近いほど似ている、というわけです。
ここで、正直に打ち明けておきたいことがあります。あの「甘い」「辛い」という二つの軸は、説明のために自分が勝手に置いたものでした。都合よく名前の付いた軸を用意して、そこに好みを並べてみせただけなんです。
でも、本物の AI は、そんな親切な軸を誰からももらえません。「この方向が甘さ、この方向が辛さ」と最初から決まっている座標なんて、どこにも用意されていない。では AI は、何を軸にして単語を置いているのでしょうか。
背番号では、意味が乗らない
単語を数にする、といちばん素朴に考えると、ただ番号を振るやり方が浮かびます。「犬」は1523番、「猫」は1524番、「金利」は8871番、というように、辞書に載っている順で背番号を付けていく。
これはこれで、単語を数にはできています。でも、困ったことがあります。番号の近さが、意味の近さと何の関係もないのです。1523番の「犬」と1524番の「猫」がたまたま隣どうしだったとしても、それは辞書の並び順の都合でしかありません。1522番が「けやき」で、1525番が「原価」だったりする。番号が1つ違うことと、意味が似ていることは、まったく無関係です。
背番号をベクトルにすると、1523番の位置だけに旗を立てた、こんな形になります。埋め込みでは、列の中に数がぎっしり詰まります。
$$ \begin{aligned} x_{\mathrm{ID}}&=(0,\ 0,\ \ldots,\ 1,\ \ldots,\ 0)\\ x_{\mathrm{embed}}&=(0.21,\ -0.83,\ 0.05,\ \ldots,\ 0.44) \end{aligned} $$
上の列は、1523番目だけが $1$ で、ほかはすべて $0$ です。下の数値は説明用のイメージですが、実際の埋め込みも数百個ほどの数が並ぶ密なベクトルです。一つひとつの数が場所を決め、その組み合わせが単語の向きを作ります。
意味を数に乗せたいなら、別のやり方が要ります。「向きが近ければ意味が近い」となるように、単語を置いてやればいい。全部の単語を、意味の近い語どうしが近くに集まるように、一つの空間の中に配置していくのです。

この「単語を、意味の空間の中に置く」という操作を、英語で embedding と呼びます。日本語では埋め込みです。空間の中に単語を埋め込んでいく、というイメージから来た名前です。犬や猫やハムスターは動物の一角に、株や金利や為替はお金の一角に、それぞれ固まって埋め込まれる。近くに置かれた語どうしは、意味も近い。名前のとおり、意味の空間に単語を埋め込んだもの、それが埋め込みです。
その軸は、単語の使われ方から決まる
では、どこに置くか、つまり向きを決めているのは何なのでしょうか。答えは、その単語の使われ方です。
「犬」という単語は、文章の中で「飼う」「散歩」「鳴く」といった言葉と一緒に現れます。「猫」も、「飼う」「鳴く」「爪とぎ」あたりと並んで出てきます。二つの語は、周りに連れている言葉がよく似ています。だから、意味の空間の中でも近い向きに置かれる。

一方で「犬」と「金利」は、同じような周辺語と結びつくことが少ない。使われ方の重なりが小さいので、遠い向きへ置かれます。
面白いのはここです。前回のように「甘い」「辛い」といった、人間が読んで分かる名前は、この軸には付いていません。埋め込みの一つひとつの軸を取り出して「これは何を表す軸ですか」と聞いても、素朴には答えられないのが普通です。それでも、意味の近さは向きにちゃんと残る。似た使われ方をする語は近くに、違う使われ方をする語は遠くに。名前のない軸の上で、意味の地図ができあがっているのです。
軸を決める仕事を、人からデータへ渡した
ここで一段引いてみると、これは埋め込みだけの話ではありません。
統計や従来の機械学習では、データをどの切り口で見るかを人が選んできました。この切り口を、専門的には特徴量と呼びます。データを説明する数値の目印、と言ってもいいでしょう。身長と体重で人を見るのも、前回のように甘いもの好き度と辛いもの好き度で好みを見るのも、人が特徴量を用意した例です。
どの特徴量を選ぶかで、見える関係も予測の結果も変わります。だから、よい軸を見つけて数値にする作業は、長く人の知識と経験に支えられてきました。統計でいう説明変数を選ぶ仕事とも地続きです。
ディープラーニングが大きく変えたのは、この特徴量そのものをデータから学ばせるようにしたことです。英語では representation learning、日本語では表現学習と呼びます。埋め込みは、その分かりやすい実例です。甘い、辛いという軸を人が先に渡すのではなく、単語の使われ方を材料にして、役に立つ軸を学習の中で作っていく。
もちろん、人が何もしなくなったわけではありません。どんな仕組みで学ばせるか、何を材料として与えるかは、今も人が決めています。仕事の場所が、「軸を手で設計する」から「軸を学べる仕組みを用意する」へ移ったのです。
どうやって置いているのか
その配置は、人が一つひとつ手で置いているわけではありません。
大量の文章を材料にして、「この単語の周りには、どんな言葉が来るだろう」と当てる練習を、ひたすら繰り返します。うまく当てられるように置き場所を少しずつ直していくと、似た文脈で使われる語が、自然と似た向きへ寄っていく。犬と猫が近づき、犬と金利が離れていく。
その「少しずつ直す」中身、つまりどうやって置き場所を調整していくのかは、また別の回にひらきます。ここでは、使われ方をたくさん見せるうちに、意味の近さが向きに現れてくる、というところまでで十分です。
意味は、置き場所に宿っていた
こうして使われ方から決まった単語の置き場所が、埋め込みです。そして前回の「似ているは向きで測れる」という話は、この埋め込みの上でそのまま効きます。二つの埋め込みを $a$ と $b$ とすると、向きの近さはコサインで測れます。
$$ \cos(a,b)=\frac{a\cdot b}{|a|\,|b|} $$
$a\cdot b$ は二つのベクトルの内積、$|a|$ と $|b|$ はそれぞれの長さです。値が $1$ に近いほど向きが近く、単語の使われ方も似ています。説明用の値を置くなら、犬と猫はおよそ $0.8$、犬と金利はおよそ $0.1$。実際の埋め込みから計算した値ではありませんが、「使われ方の重なり」が向きの差として現れる様子はこう読めます。前回の内積とコサインの話は、この置き場所があってはじめて意味を持つ土台だったわけです。
そう考えると、意味というのは、単語そのものの中にあるというより、意味の空間のどこに置かれたか、に宿っている気がしてきます。「犬」の意味は「犬」という文字の中にあるのではなく、猫の近く、金利の遠く、という置き場所の関係の中にある。
甘い辛いの軸は、説明のために自分が置いていました。本物の AI は、その軸を単語の使われ方から自分で決めている。意味は単語の中にではなく、意味の空間のどこに置かれたか、に宿っていたわけです。
では、こうして決まった単語の置き場所を、AI は文章を読むときにどう使い分けているのでしょうね。それが前回ちらっと予告した、AI が文章を読むときの入り口の話で、次回のテーマにしようと思います。
あわせて読みたい関連記事。


