覚えていないことをどう使うか ── 埋め込みと検索
第9章の結論の一つは、覚えていないことは対を見せても出てこないでした。SFT の的は事前学習の1万分の1で、そこで変えられるのは出し方であって中身ではない。
では、重みに入っていないことを使わせたいときはどうするか。道は2つです。重みに入れ直す(もう一度学習する)か、その場で渡すか。この章は後者を扱います。
渡すには選ばなければなりません。選ぶには「近い」を数で決めなければなりません。第0部第1章で預けたコサイン類似度を、ここで回収します。
1. 「全部渡す」は成り立たない
まず、選ばずに済む道が閉じていることを確かめます。
文書を512トークンずつに切ったとして、文脈長 に何個入るか。
| 文脈長 | 入るチャンク |
|---|---|
| 8,192 | 16個 |
| 32,768 | 64個 |
| 131,072 | 256個 |
手元に100万チャンクあるなら、16個は全体の です。999,984個は捨てている。
「文脈を伸ばせばよい」は、第6章の がそのまま値段になります。 を 8k から 128k にすると注意の表は 倍。入る数は16倍にしかなりません。
2. 近さを決める ── 内積ではなくコサイン
文書も問い合わせも、学習済みのモデルがベクトルに写します(埋め込み)。近さは内積で測れそうですが、素の内積には罠があります。
実測します。問い合わせ に対し、
- :向きが近い()
- :向きは遠い()が、長さが3倍
内積は に対し 。向きの遠い が勝ちます。 長さは「文書が長い」「語数が多い」といった事情で付くことがあり、近さと関係ありません。
だから長さを割ります。第0部第1章の式です。
正規化してしまえば、ユークリッド距離も同じ順位を返します。 なら
実測でも一致しました( 側 0.0143 と 0.0143、 側 0.8682 と 0.8682)。コサインが最大の文書は、L2 が最小の文書と同じです。
3. 高い次元では、無関係はほぼ直角
埋め込みは数百〜数千次元です。高次元には、検索にとって都合のよい性質があります。
乱数の単位ベクトルを2本取ってコサインを測りました(各次元4,000組)。
| 標準偏差 | の最大 | ||
|---|---|---|---|
| 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 で、ばらつきは で縮みます(第0部第3章で見た と同じ形)。 では、4,000組のうち最も偏ったものでも でした。
無関係なものどうしが 0 のまわりに固まるから、少しでも関係があるものが浮き上がります。これが「埋め込みで検索できる」ことの土台です。
同時に、裏側も見えます。 では 0.05 を超えればもう珍しい。0.82 と 0.79 の差を「意味の差」として読むのは危ういということでもあります。
4. 総当たりは何回の掛け算か
個の文書を 次元で持ち、問い合わせ1件ごとに全部と内積を取ると、掛け算と足し算で FLOPs です。
| FLOPs / 1件 | 記憶(float32) | |
|---|---|---|
| 3.1 GB | ||
| 307 GB |
での値です。問い合わせのたびにこの計算を払います。第8章の学習の に比べれば小さいですが、学習は一度、検索は毎回です。
だから「全部は見ない」方法が要ります。
5. 近似最近傍 ── 見た割合と取りこぼし
やり方は単純です。文書をあらかじめ房に分けておき(k-means)、問い合わせに近い房だけ中を見る。見る房の数が です。
実験しました。、、房は100、、問い合わせ200件。データは50個の中心のまわりに散らしたもので、同じ房どうしの平均コサインは 0.410 です。対照として、同じ件数をでたらめに選んだときの recall も一緒に測りました。
| 見た割合 | 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件はほぼ取れています。
コメント
コメントにはログインが必要です