🤔

text-embedding-003-largeで生成したベクトルの大きさが大体1になる理由を考える

に公開

これは何の記事?

OpenAI の埋め込みモデルtext-embedding-003-largeで生成したベクトルの大きさ(普通のL2ノルム)を求めると、大体1程度の値になるのが以前から疑問だったので、理由を考えてみようという記事です。

何故半径1に偏っていると不自然だと思うのか?

  • 前提として text-embedding-003-large で生成したベクトルは「意味を表す座標空間上の位置ベクトル」と見做せるはずです。
  • ベクトルの長さが1に固定されているということは、意味の世界の球面上にしか意味を割り当てていないということを表している、と言えそうです。
  • 直感的には空間内のいろんな場所に意味を割り当てた方が多様な意味を表せそうなのに、何故そうしないのか?というのが不自然に思った点です。

もらったヒント

  • 先輩社員から「高次元ベクトル空間では最外殻に質量が集中するよ」(意訳)ということを教えてもらいました。[1]
  • これをヒントにして理解のためのノートを書いてみます。

原因を予想する

「多分高次元の球体は半径の外側ほど体積が大きいから、確率的にそうなりやすいんじゃないか?」と予想します。これが正しいかを調べるには、以下をやってみると良さそうです。

  • d次元の球について半径rにおける微小な球殻の体積を求める
  • 半径Rの球について、最外殻(r1=R)の体積と、そこから1%内側の球殻((r2=0.99R))の体積の比を求める
  • 大きな差があれば、大体予想が成り立っていると言える

予想が正しいかを調べる

d次元の球の半径rにおける微小な球殻の体積の表式

微小な球殻の体積は、半径rにおける表面積 * drなので、以下のように表せます。

dV = S_d(r) \cdot dr = \frac{2\pi^{d/2}}{\Gamma(d/2)} r^{d-1} dr

ガンマ関数だと自分がパッと理解しにくいので偶数の時に限定します。(text-embedding-003-large が生成するベクトルが3072次元なので、今回はこれでOKです)
微小な球殻の体積の表式は次のようになりました。

dV = \frac{2\pi^n}{(n-1)!} r^{2n-1} dr \quad (d=2n)

半径Rの球について、r1の球殻の体積とr2の球殻の体積との比を求める標識を書く

上記から次のように書けそうです。(結局次元を偶数に限定する必要はなかった)

\begin{align} \frac{dV_1}{dV_2} &= \frac{\frac{2\pi^{d/2}}{\Gamma(d/2)} r_1^{d-1} dr}{\frac{2\pi^{d/2}}{\Gamma(d/2)} r_2^{d-1} dr} \\ &= \frac{r_1^{d-1}}{r_2^{d-1}} \end{align}

半径Rの球について、最外殻(r1=R)の体積と、そこから1%内側の球殻(r2=0.99R)の体積の比を求める

次元d=3072を使って、最外殻Rの球殻の体積と、そのちょっと内側の 0.99R の球殻の体積、の比を求めてみます。

\frac{dV_1}{dV_2} = \left(\frac{R}{0.99R}\right)^{3071} = \left(\frac{1}{0.99}\right)^{3071} \approx 2.5 \times 10^{13}

比は 2.5*10^13 程度とかなり大きな値になりました。
なので「意味が空間上に確率的に一様に分布する時は、球の外側の方が空間が非常に大きいので、最外殻に分布が集中しやすい」と言えそうです。

わかったことまとめ

text-embedding-003-largeで生成したベクトルの大きさが1になるのは、次元が3072次元と極めて大きいから、と言えそうです。

このノートではわからなかったこと

  • ベクトルは直感的には立方体になりそうですが、球面を指す理由はよくわかりませんでした。(次元が大きくなると立方体が球っぽくなってくるんでしょうか・・・)
脚注
  1. この概念自体は情報科学や統計学がやったことがある人はみんな「次元の呪い」という名前で知っているそうです。知らなかった・・・ ↩︎

Discussion