カテゴリ変数を Word Tour で数値化する

こんにちは。株式会社 LabBase リサーチチームの髙橋です。
[LabBase テックカレンダー 2024](https://qiita.com/advent-calendar/2024/labbase) 5日目です。

本記事では **テーブルデータのカテゴリ変数を Word Tour で数値化し学習を効率化する工夫** を紹介します。

（2024-12-05 現在、本記事は書きかけの節を含みます）

## 背景

LabBase では就職活動・採用活動を支援するサービスを展開しています。
私たちリサーチチームは就活者と求人のマッチング精度の向上に日々取り組んでいます。そのなかで、学生情報や企業情報などのテーブルデータをしばしば扱います。

テーブルデータ上で何らかの推論を行う際、まず検討するモデルは **[GBDT](https://ja.wikipedia.org/wiki/%E5%8B%BE%E9%85%8D%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)** でしょう。
GBDT は決定木ベースのアルゴリズムで、テーブルデータと相性がよいことが知られています。Kaggle などのデータ分析コンペでもたびたび使われてきました。

GBDT の入出力データは、何らかの形で数値化されている必要があります。
しかし私たちが扱うデータは、カテゴリ変数や自由形式の文字列など、数値化されていない変数が大半です。たとえば学生が属している学部・学科、求人の職種など。

これらのデータをなるべく GBDT と相性のよい形で数値化したい、というのが今回の目的になります。

## 手法概要

本記事では、**[Word Tour](https://github.com/joisino/wordtour)** と呼ばれる手法を用いて、背景で述べた特徴量を数値化する工夫を紹介します。
ざっくりとしたフローは以下の通りです。

1. 埋め込み
2. Word Tour による 1 次元化
3. もとの埋め込み空間上の距離の累積で数値化
4. GBDT

それぞれ詳細をみていきましょう。

## 埋め込み

**埋め込みベクトル** について、以降の章の理解に役立つ知見をまとめておきます。自然言語処理に詳しい方はスキップしても構いません。

埋め込みモデル $E$ は、自然言語に現れるトークン（$\fallingdotseq$ 単語）を、埋め込み空間と呼ばれる何らかの多様体 $M$ 上に埋め込みます（たいていは単位球面 $S_n$）。
たとえば [OpenAI](https://platform.openai.com/docs/guides/embeddings/use-cases) の `text-embedding-3-small` は、入力された単語を $1535$ 次元単位球面上の値に変換します。本記事の実験でもこのモデルを使う予定です。

```python
import tqdm
import numpy as np
from openai import OpenAI

client = OpenAI(api_key=api_key)
embeddings = np.empty((n, 1536))

for i in tqdm.tqdm(range(n)):
    resp = client.embeddings.create(model="text-embedding-3-small", input=[tokens[i]])
    embeddings[i] = resp.data[0].embedding
```

埋め込みモデルはコーパスに現れる単語の共起度に基づいて学習されます。
結果として、意味の近い単語間の距離が近くなるよう埋め込まれるのですが、さらに以下の顕著な性質を獲得する傾向があります。

例として、$\langle\text{man}, \text{woman}\rangle$ と $\langle\text{king}, \text{queen}\rangle$ という単語の組を考えましょう。
これらが埋め込みモデル $E$ によって写る値について、一般に以下の傾向が観察されます。

$$
E(\text{man})-E(\text{woman})\approx E(\text{king})-E(\text{queen})
$$

$\langle\text{father}, \text{mother}\rangle$ や $\langle\text{uncle}, \text{aunt}\rangle$ なども同様です。
このことから、埋め込み空間 $M$ の特定の軸が「性別」と強い関連をもつように、埋め込みモデル $E$ が単語を学習していることが示唆されます。

上は一例です。「性別」だけでなく、「単数／複数」「物質の状態」「感情」など、さまざまな軸を観察できます。
ちなみに「単数／複数」軸に序数詞のベクトルを射影すると、おおむねソートされるようです。

埋め込みモデル $E$ は意味的に独立した軸をどれだけ持つことができるのでしょうか。
埋め込み空間 $S_n$ の場合を考えると、直感的には高々 $n$ 個の軸ということになりそうですが、[Johnson–Lindenstrauss の補題](https://en.wikipedia.org/wiki/Johnson%E2%80%93Lindenstrauss_lemma) によると、直交基底より少し弱い条件を満たす軸の数は $\exp(\epsilon n)$ のオーダーになります。すなわち、直感よりもずっと多くの軸が $M$ に埋め込まれているかもしれないということです。

$n$ 次元空間上の操作についての幾何学的直感を養うとき、私たちはまず $n=2,3$ でイメージしてみることがほとんどでしょう。たとえば主成分分析を、$3$ 次元の楕円体のフィッティングとしてイメージするなど。
この常套手段はたいてい有効に機能するのですが、高次元ならではの例外もあり、上記の補題はその一つの例になっています。

### （閑話休題：就活学生や人事担当者にどのような推薦をすべきか）

本節は私個人についてのお話です。興味のない方は次節に飛んでください。

3 年前の [最適輸送セミナー](https://sites.google.com/view/uda-0x-seminar/home/0x03?authuser=0) で、私は初めて自然言語処理について学びました。以下はそのときの資料です。

- [最適輸送の使い方](https://speakerdeck.com/eumesy/how-to-leverage-optimal-transport)
- [最適輸送の解き方](https://speakerdeck.com/joisino/zui-shi-shu-song-nojie-kifang)

いま読んでも、どちらも明快で興味深い内容が充実している良資料だと感じます。

当時はまだ LabBase に入社しておらず、前職で 3D データのアルゴリズム開発に従事していました。セミナーに参加した当初の動機も、3D データに最適輸送問題を応用するアイデアを得るためでした。
このとき自然言語処理について学んだことが将来活きるかもしれないとは、当時は考えていませんでした。

私はこうした専門分野の転換をした経験から、単に技術的な適性だけを評価するのではなく、**新奇性** や **意外性**、**多様性** を満たすような就活生や求人の推薦システムを実現できないか、ということを意識しています。
今回は割愛しますが、この課題に対する研究は興味深いものが多く、キャッチアップしていて楽しいです。

### （閑話休題：Transformer と Super Weight）

本節の内容はやや発展的です。

上述の埋め込みモデル `text-embedding-3-small` は、同じ入力トークンに対しては毎回同じ値を返す、いわば静的なモデルです。

一方 GPT などに代表される Transformer モデルの入出力形式にも、埋め込みベクトルは用いられています。
Transformer 内部の構造を見ると、入力の埋め込みベクトルに対し、Attention 機構で周囲の文脈を作用させ、MLP でトークンごとに固有の情報を付加するということを繰り返しているように見えます。
したがって Transformer は、埋め込みベクトルを逐次更新する動的な埋め込みモデルとして解釈することもできそうです。

以上が非常にラフなイメージであることには注意しておきます。最新の Transformer のなかで本当のところ何が起こっているのかは、パラメータが膨大すぎてほとんどわかりません。

さて Transformer モデルについて、最近 [The Super Weight in Large Language Models](https://arxiv.org/abs/2411.07191) という論文が少し話題になりました。
これによると、Transformer ベースの LLM の数十億パラメータのなかからたった 1 つを選んで $0$ に置き換えるだけで、モデルのテキスト生成能力が完全に崩壊します。このパラメータを論文では **Super Weight** と呼んでいます。

Super Weight はつねに初期の層の MLP の down projection の中に少なくとも 1 つ見つかるようです。MLP の down projection のパラメータの 1 つを $0$ に置き換えるということは、その含まれる列が表す代表特徴量ベクトルを少しずらすことに相当します。
先ほどのイメージと照らし合わせると、この操作によってすべてのトークンに少し誤った固有の情報が渡される、と解釈できそうです。その影響は次層の Attention 機構で、近傍のほかのトークンに波及していきます。この論文の日本語の解説で「情報の削除」という表記を見かけましたが、厳密には「誤情報の付与」というべきかと思います。
$0$ 置換によって、たとえば "the" や "," のような特徴のない語に、何か特別な意義を与えてしまうような弊害があるかもしれません。実際、崩壊した LLM の出力トークンは、このような語の出現確率が数倍に跳ね上がるそうです。

上のイメージは、あくまで個人的なものです。これがどれくらい的を得ているのか、正直なところよくわかりません。まったく見当はずれのことを言ってしまっているかもしれません。
とはいえ、埋め込みベクトルや LLM の振る舞いについて「だいたいこんな感じかな？」というイメージを自分なりに構築し、最新の結果に照合してアップデートしていくことは、これらをプロダクトに活用する上で重要になってくるのではと思います。

## Word Tour

長々と脱線してしまいました。本題に戻りましょう。

NAACL 2022 に [Word Tour](https://github.com/joisino/wordtour) という論文が現れました。
端的にいうと、埋め込み空間上で巡回セールスマン問題を（近似的に）解くことにより、単語がグラデーション状に並ぶというものです。

具体的な結果を見たほうが早いでしょう。
「学部・学科」カラムに Word Tour を適用した結果を一部抜粋します。

> データサイエンス研究科
> 応用データサイエンス学位プログラム
> 応用情報技術研究科
> 情報技術研究科
> 情報生産システム研究科
> 有機材料システム研究科
> 機械システム学科
> 共生システム理工学研究科
> システム理工学部
> システム工学部
> システム工学研究科
> システムデザイン工学研究科
> システムデザイン研究科
> システムデザイン学部
> システムデザイン工学部
> デザイン工学部
> デザイン学部
> 建築都市デザイン学部
> 建築学部

（以下、書きかけ）

## GBDT

## 検証

## 結果