教科書 › 第III部 深層学習:何の前提を足すか
CHAPTER 10

覚えていないことをどう使うか ── 埋め込みと検索

★ 会員17分

第9章の結論の一つは、覚えていないことは対を見せても出てこないでした。SFT の的は事前学習の1万分の1で、そこで変えられるのは出し方であって中身ではない。

では、重みに入っていないことを使わせたいときはどうするか。道は2つです。重みに入れ直す(もう一度学習する)か、その場で渡すか。この章は後者を扱います。

渡すには選ばなければなりません。選ぶには「近い」を数で決めなければなりません。第0部第1章で預けたコサイン類似度を、ここで回収します。

1. 「全部渡す」は成り立たない

まず、選ばずに済む道が閉じていることを確かめます。

文書を512トークンずつに切ったとして、文脈長 TT に何個入るか。

文脈長 TT 入るチャンク
8,192 16個
32,768 64個
131,072 256個

手元に100万チャンクあるなら、16個は全体の 1.6×10−51.6\times10^{-5} です。999,984個は捨てている。

「文脈を伸ばせばよい」は、第6章の T2T^2 がそのまま値段になります。TT を 8k から 128k にすると注意の表は 162=25616^2 = 256 倍。入る数は16倍にしかなりません。

検索は賢い仕掛けではありません。文脈に入る16個を、100万個のどこから採るかという問題です。選ぶ以上、採り方の良し悪しが性能そのものになります。

2. 近さを決める ── 内積ではなくコサイン

文書も問い合わせも、学習済みのモデルがベクトルに写します(埋め込み)。近さは内積で測れそうですが、素の内積には罠があります。

実測します。問い合わせ qq に対し、

  • aa:向きが近い(cos⁡=0.9929\cos = 0.9929)
  • bb:向きは遠い(cos⁡=0.5659\cos = 0.5659)が、長さが3倍

内積は q⋅a=0.9929q\cdot a = 0.9929 に対し q⋅b=1.6977q\cdot b = 1.6977。向きの遠い bb が勝ちます。 長さは「文書が長い」「語数が多い」といった事情で付くことがあり、近さと関係ありません。

だから長さを割ります。第0部第1章の式です。

cos⁡θ  =  x⊤y∥x∥ ∥y∥\cos\theta \;=\; \frac{x^{\top}y}{\|x\|\,\|y\|}
(1)

正規化してしまえば、ユークリッド距離も同じ順位を返します。∥x∥=∥y∥=1\|x\|=\|y\|=1 なら

∥x−y∥2  =  2−2 x⊤y\|x-y\|^{2} \;=\; 2 - 2\,x^{\top}y
(2)

実測でも一致しました(aa 側 0.0143 と 0.0143、bb 側 0.8682 と 0.8682)。コサインが最大の文書は、L2 が最小の文書と同じです。

FIG 1文書の房の中でクエリを動かす。コサイン/内積/L2 で top-5 の顔ぶれが変わる。内積にすると、向きが合っていないのに長いだけの房(C)が割り込んでくる
コサインが高いのは「このモデルの埋め込みで向きが揃っている」という意味であって、答えが書いてある保証ではありません。何を近いと思うかは埋め込みの学習で決まっており、その学習は本書では測っていません。

3. 高い次元では、無関係はほぼ直角

埋め込みは数百〜数千次元です。高次元には、検索にとって都合のよい性質があります。

乱数の単位ベクトルを2本取ってコサインを測りました(各次元4,000組)。

dd 標準偏差 1/d1/\sqrt{d} ∣cos⁡∣\lvert\cos\rvert の最大
2 0.7079 0.7071 1.000
8 0.3525 0.3536 0.941
64 0.1273 0.1250 0.501
512 0.0436 0.0442 0.162
4,096 0.0164 0.0156 0.055

平均はどの次元でも 0 で、ばらつきは 1/d1/\sqrt{d} で縮みます(第0部第3章で見た σ/n\sigma/\sqrt{n} と同じ形)。d=4096d = 4096 では、4,000組のうち最も偏ったものでも ∣cos⁡∣=0.055\lvert\cos\rvert = 0.055 でした。

無関係なものどうしが 0 のまわりに固まるから、少しでも関係があるものが浮き上がります。これが「埋め込みで検索できる」ことの土台です。

同時に、裏側も見えます。d=4096d=4096 では 0.05 を超えればもう珍しい。0.82 と 0.79 の差を「意味の差」として読むのは危ういということでもあります。

4. 総当たりは何回の掛け算か

NN 個の文書を dd 次元で持ち、問い合わせ1件ごとに全部と内積を取ると、掛け算と足し算で 2Nd2Nd FLOPs です。

NN FLOPs / 1件 記憶(float32)
10610^{6} 1.54×1091.54\times10^{9} 3.1 GB
10810^{8} 1.54×10111.54\times10^{11} 307 GB

d=768d = 768 での値です。問い合わせのたびにこの計算を払います。第8章の学習の 102110^{21} に比べれば小さいですが、学習は一度、検索は毎回です。

だから「全部は見ない」方法が要ります。

5. 近似最近傍 ── 見た割合と取りこぼし

やり方は単純です。文書をあらかじめ房に分けておき(k-means)、問い合わせに近い房だけ中を見る。見る房の数が nproben_{\text{probe}} です。

FIG 2左は2本のベクトルのコサインの分布。同じ房どうし(金)と別の房(灰)が離れているほど、データに「かたまり」がある。右は見た割合に対する recall@10 で、点線は同じ件数をでたらめに選んだときの線。ばらつきを上げて房をぼやけさせると曲線は大きく下がるが、点線までは落ちない(図は本文より小さい規模でその場で回している)

実験しました。N=10,000N = 10{,}000、d=64d = 64、房は100、K=10K = 10、問い合わせ200件。データは50個の中心のまわりに散らしたもので、同じ房どうしの平均コサインは 0.410 です。対照として、同じ件数をでたらめに選んだときの recall も一緒に測りました。

nproben_{\text{probe}} 見た割合 recall@10 でたらめに同数
1 1.1% 66.8% 1.3%
2 2.0% 99.6% 1.8%
5 5.0% 99.9% 5.1%
50 49.9% 100.0% 51.1%

2.0% だけ見て 99.6%。 計算を50分の1にして、上位10件はほぼ取れています。

§

この先は会員限定です

全42章と全ラボが読み放題。月額¥490、いつでも解約できます。

コメント

コメントにはログインが必要です