人間はチンパンジーよりマグロに近かったで、意味空間には生物学的な分類が含まれていない、と書きました。そこには「使われ方の近さで決まっている」という説明を添えましたが、根拠は示していませんでした。
確かめられる話だったので、確かめました。予想より、はっきり出ました。
人間は「霊長類」に近くない
まず、『人間はチンパンジーよりマグロに近かった』と同じモデル——語や文を384個の数字の組に変えるだけの公開モデル paraphrase-multilingual-MiniLM-L12-v2(以下 MiniLM)——で、別の語を物差しにして測ります。文章を書くLLMではなく、文どうしが近いかを判定する側の道具です。
表の数字はコサイン類似度で、2つの語の意味ベクトル(数字の並び)がどれだけ同じ向きを指しているかを表します。1に近いほど意味が近く、0に近いほど無関係です(詳しい仕組みは『人間はチンパンジーよりマグロに近かった』で扱っています)。
| 物差し | 人間 | チンパンジー |
|---|---|---|
| 霊長類 | 0.45 | 0.81 |
| 哺乳類 | 0.46 | 0.60 |
| 社会 | 0.67 | 0.35 |
| 存在 | 0.70 | 0.38 |
きれいに裏返っています。 チンパンジーは「霊長類」「哺乳類」という分類の語の側にいて、人間は「社会」「存在」という抽象語の側にいます。
人間も霊長類です。それでも、そう扱われていません。
予言を立てて、確かめる
ここで一つ予言が立ちます。距離を決めているのが分類の正しさではなく「どれだけ一緒に書かれたか」なら、こういうことが起きるはずです。
クジラは「実は哺乳類である」と繰り返し書かれてきた。だからクジラのほうが、人間より「哺乳類」に近くなるはずだ。
どちらも同じ哺乳類なので、分類の正しさで決まるなら差は出ないはずの比較です。
import { pipeline } from '@huggingface/transformers'
const ex = await pipeline('feature-extraction', 'Xenova/paraphrase-multilingual-MiniLM-L12-v2')
const emb = async w => Array.from((await ex(w, { pooling: 'mean', normalize: true })).data)
const cos = (a, b) => a.reduce((s, x, i) => s + x * b[i], 0)
// 「哺乳類」を物差しにして、4つの哺乳類を測る
const mono = await emb('哺乳類')
for (const w of ['イルカ', 'クジラ', 'コウモリ', '人間']) {
console.log(`${w} ↔ 哺乳類: ${cos(await emb(w), mono).toFixed(3)}`)
}
結果です。
イルカ ↔ 哺乳類: 0.621
クジラ ↔ 哺乳類: 0.568
コウモリ ↔ 哺乳類: 0.548
人間 ↔ 哺乳類: 0.462
4つとも哺乳類です。そして人間が最下位でした。
上位3つに共通するのは、「実は哺乳類なんですよ」と言われ続けてきたことです。魚に見えるクジラとイルカ、鳥に見えるコウモリ。意外だから、繰り返し書かれる。
人間にその文はほとんど付きません。当たり前すぎて、わざわざ書かれないからです。
人類は、自分を霊長類として記述することが稀
理由はモデル側にはありません。モデルが学習した、世の中の膨大な文章を書いてきた書き手たちの側にあります。
人間について書かれた文章は膨大にありますが、その大半は生物学の文章ではありません。 社会、歴史、心理、経済、物語——人間はそういう文脈で語られます。自分たちを霊長類の一種として記述する文章は、全体から見ればごくわずかです。
人類は、自分が霊長類だと意識して生きているわけではありません。 だから、そう書かれる機会が少ない。書かれなければ、頻度で決まる以上、モデルもそう持ちません。モデルは、人類の書き方をそのまま映しています。
外れた仮説も書いておく
『人間はチンパンジーよりマグロに近かった』では、チンパンジーがゴリラ以外のほとんどの語から遠いという結果も得られていました。最初に立てた仮説は、これに対する別の説明でした。「チンパンジーは4つの断片に砕けるから、他の語から孤立するのではないか」という、トークン分割を原因とする筋読みです。
18語で、断片の数と「他の全語との平均類似度」を突き合わせました。
断片1個の語(11語)の平均: 0.394
断片2個の語(3語) の平均: 0.517
断片5個の語(1語) の平均: 0.562
関係がないどころか、わずかに逆でした。 この仮説は捨てています。
もう一つ、予言が外れた組もありました。「ダチョウ ↔ 鳥類」は0.441で、人間↔霊長類(0.451)より低くなっています。「意外だからよく書かれる」だけで全部が説明できるわけではありません。
「哺乳類」で検索しても、人間は上位に現れなかった
意味の近さで検索する仕組み——たとえば『自分の資料で、専門特化のエージェントを作る』で扱ったRAGのような仕組み——では、この距離の遠さがそのまま検索結果に反映されます。「哺乳類」で検索しても、資料の中に「人間」という語しかないページは、距離が遠いという理由だけで上位に現れないことがあります。「霊長類」で検索したときも同じです。分類上はまったく正しいのに、です。
これは『「犬」と「いぬ」は、別の語として扱われている』で見た、「いぬ」で検索しても「犬」と書かれた資料が引っかからない問題と、原因は同じです。意味の近さだけに頼ると、書き方や分類の違う同義語・同類語が、意図せず検索から漏れる。
対処もあちらの記事と同じ発想です。「人間」のように分類名では上位に現れにくいと分かっている語は、あらかじめリストにしておき、分類名で検索するときはリストの語も一緒に検索に加える。 ベクトルの近さだけに検索を任せきりにはできない、ということです。
まとめ
- 意味空間の距離は、分類の正しさではなく、「どれだけ一緒に書かれたか」で決まる
- 同じ哺乳類でも、クジラ・イルカ・コウモリのほうが人間より「哺乳類」に近かった。(今回測った1モデルでの結果です)意外だから繰り返し書かれた語が勝った
- 人間が遠かったのは、人類が自分を霊長類として書く機会が少ないから。 モデルは書き方を映しているだけ
- 断片の数で説明する仮説は外れた。 予言が外れた組(ダチョウ↔鳥類)もあった
- 分類名で検索すると、その分類の代表格が漏れることがある
「事実として正しい」と「よく書かれている」は、別のものです。モデルが持っているのは後者だけで、そこが食い違うとき、こういう形で表に出ます。