大晦日からずっと factorio してたわけなんだけど, 遊んでた相手が火鍋食べに行くって言い出したんで, じゃあ私は一蘭食べに行くことにした. よりにもよって浅草に行っちゃったんだが, 着いてみたら90人待ちだった. QRコードで順番待ちできるシステムになってたんでその間に浅草寺あたりを散歩した. 結果90分くらい待った.
reasoning じゃない安価なLLMモデルを想定してる.
言語モデルは前から読んで前から生成するバイアスがあるので, プロンプトの与え方によって性能が大きく変わる. 例えば, 質問してから文脈を与えるか, 文脈を与えてから質問するかで性能が変わる. ではいっそ, プロンプト全体を2回繰り返して与えたらこういったバイアスが打ち消されて性能が上がった. 特に「50の選択肢から正解を選ぶ」という NameIndex というタスクで効果が大きかった.
一ヶ月待たされて, ようやく結果見れるようになってたね. 遅いわ.
当然だけど採点基準や点数配分は不明だから自己採点してたときとは違うね. なんなら写作は100点満点取れるつもりで挑んでただけに悔しみ.
冷蔵庫いつの間にか壊れてた. 確信したのが昨日というだけで, 本当に壊れたのがいつかと言われると分からないね. 冷凍庫開けると霜が溶けて手でキレイに取れるレベルになってた. 強さとか冬季モードがあったんで試したたけど, 半日待っても, うんともすんともだった. 冷凍モノは保冷剤と一緒に保冷バッグに入れて, 段ボール箱に更に入れた上でベランダに放置した. さすがに冷凍食品はしっかり溶けていた.
1/5 (Mon) にマイナポータル(スマホ)で申請. 顔写真はスマホで自撮り撮影した.
東京都旅券作成ページ(マイナポータルとは全く別)を毎日チェック. その甲斐あって今見たら "1/16に交付" と表示されていた.
あんな自撮りでいいのか~.
さっさとパスポート受け取りたかったので 今日は朝早めに起きて池袋まで行くぞということにした. 8時に目が覚め, 次の瞬間には9時半に目が覚めた. 家のお掃除ロボットが徘徊するのと共に身支度を始めた. 池袋まではバスで行くつもりだったが, 40分バスに乗った上にそこから更に10分ほど歩く必要があるのを知って考え直した. バイクの駐輪場を調べてみると, サンシャイン西駐輪場というのが一時間無料であった. ちなみにこういうのは, 空いてなかったときに備えて, 予備の駐輪場もあと一つか二つは無いと絶対に不安なので今回もそうした.
バイクで池袋に向かう. GoogleMap なんて使ったせいで, 明らかに地元民のための生活用道路を通らされた. 普通のでかい道だけ使わせてくれ. 駐輪場にバイクを停め, パスポートセンターへ向かう. 私と同様にパスポートを受け取りに来た人は私より前には二人だけ, 私の後にも4,5人程度と空いていてかつ, 手続き自体も5分と待たされなかった. すべてがあっさりだった.
というわけで, パスポートRTA, 記録は11日でした.
帰り.
有料ソフトウェアがソフトウェア利用の対価にお金を要求するように, 本来の OSS は対価として貢献を要求する. 貢献とは機能追加やバグ修正を指してる. ただし質の悪い貢献は貢献とは見なされないが. LLM もとい AI は OSS への貢献のハードルを下げるし, OSS オーナーは LLM の使用を許すことで貢献を強制することすらできる. 出来はするけど, これを歓迎するような人はいるのかな.
Residual-Quantized VAE.
\[x \in \mathbb{R}^D \mapsto z \in \mathbb{R}^{D'} \mapsto \{c_1, c_2, \ldots, c_M\} \mapsto \hat{x}\]ここでレベル \(\ell\) のコードブックというものが予めあって
\[\mathcal{C}_\ell = \{ c_{\ell, 1}, c_{\ell, 2}, \ldots, c_{\ell, K} \}\]で、 \(\text{Quantize}_i(r)\) は
\[\text{Quantize}_\ell(r) = \arg\min_{c \in \mathcal{C}_\ell} \| r - c \|^2\]コードブックから最も近いコードを選ぶ操作.
最終的な量子化表現を
\[\hat{z} = \sum_{\ell=1}^L c_\ell\]とする.
RQ-VAE 損失は差分 \(r\) たちとコードブックをお互いに近づけるように働く.
人間らしい生活ができる喜び
"Better Generalization with Semantic IDs: A Case Study in Ranking for Recommendations"
\(K\) はコードブックのサイズで \(2048\) を採用
自宅に冷蔵庫があるの嬉しすぎて意味もなく開け閉めしちゃうね
予定
Diffusion を推薦システムに適用する.
ユーザーのインタラクション履歴の行列 \(x\) の取ってきて \(x_0\) とする. ガウスノイズを付加する系列
\[q(x_t \mid x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t I)\]この逆向きの操作を 復元 と呼ぶ.
\[p_\theta(x_{t-1} \mid x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t))\]ここで \(\mu_\theta\) と \(\Sigma_\theta\) はニューラルネットワークでパラメタライズされる.
DiffRec 初期バージョン
\(x_0\) が与えられたとき適当な \(T'\) ステップのガウスノイズを付加して \(x_{T'}\) を生成する.
\[x_0 \to x_1 \to \cdots \to x_{T'}\]次に \(\hat{x_T} = x_{T'}\) として \(T\) ステップの復元過程を開始する.
\[\hat{x_T} \to \hat{x_{T-1}} \to \cdots \to \hat{x_0}\]ここで \(\hat{x_0}\) が推薦結果となる.
L-DiffRec (Latent DiffRec)
大規模データについて DiffRec を適用するのに VAE で次元削減を行ってから, 潜在空間で DiffRec を行う.
T-DiffRec (Temporal DiffRec)
時系列情報を使いたい. 各インタラクションに時間を考慮した重みを付加するだけ.
ユーザーのインタラクションが \((i_1, i_2, \ldots, i_M)\) であったとき,
\[w_j = \alpha + \frac{j-1}{M-1}(\beta - \alpha)\]って線形に重みを付加する. これを DiffRec または L-DiffRec に放り込む.
前回の Semantic ID で推薦する話の前の話. 彼らの言う SID の初出.
レベルは \(L=3\) でコードブックサイズは \(K=256\) . ただしSIDの重複があるので, ただ重複を避けるために連番IDを最後に追加すること事実上 SID は一意になる. 空間サイズは \(K^L \times \mathbb{N}\) になる.
推薦モデルは Seq-to-Seq Transformer. ユーザーの視聴履歴を SID の列として与えて, 次に見る動画の SID を予測する.
SID はいくつかアップデートがあるけど基本的には同じなので略.
一番は SID の含めたテキストのデータセットを作って LLM を事前学習 (CPT) している点.
## Example user behavior training data (watch history)
wh = <sid_1> <channel_name> <watch_ratio> <watch_time>
<hours_since_final_watch> <sid_2> <channel_name> ... || <sid_n>
## SID + video title
Video <sid> has title (en): <video_title>
## SID + video topics
The topics in video <sid> are: <topics>
次動画の推薦も LLM による SID 予測で行う.
M.Gray "Vector Quantization" 1984: https://www.ee.columbia.edu/~dpwe/papers/Gray84-vq.pdf
1984年の Vector Quantization サーベイ論文.
Memoryless \(k\) 次元 Vector Quantizer とは次の \((\gamma, \beta)\) のこと.
ここで \([M] = \{0,1,\ldots,M-1\}\) .
\(\mathcal{C} = \{\beta(0), \beta(1), \ldots, \beta(M-1)\}\) のことを codebook , \(y \in \mathcal{C}\) を codeword と呼んでいる.
\(x\) について \(\tilde{x} = \beta(\gamma(x))\) を \(x\) の量子化ベクトルという. VQ の性能を測るのに距離(コスト)尺度 \(d(x, \hat{x})\) を用意する. \(\mathbb{E}_x(d(x, \tilde{x}))\) が小さいことが望ましい.
\(\beta\) が与えられたとき, 最良の \(\gamma\) は以下を満たすように定義される.
\[\gamma(x) = \arg\min_{v \in [M]} d(x, \beta(v))\]とても普通のことを言ってる.
\(\gamma\) が与えられたとき, 最良の \(\beta\) は重心で与えられる.
\[\beta(v) = \mathbb{E}_x[x \mid \gamma(x) = v]\]たとえば \(d\) が二乗距離の場合, \(\beta(v)\) は \(\{x \mid \gamma(x) = v\}\) の点の平均になる. 文字通りの重心になる. 多様な距離尺度を考えてよいが重心が定義できる必要がある.
というわけで Generalized Lloyd Algorithm (LBG Algorithm) では上記の Prop.1 と Prop.2 を交互に適用することで \((\gamma, \beta)\) を(局所)最適化する.
\(x\) を1つ目のVQで量子化して \(\tilde{x}^{(1)}\) を得る. 残差 \(r^{(1)} = x - \tilde{x}^{(1)}\) を2つ目の VQ にかけて \(\tilde{x}^{(2)}\) を得る. これが 2 stages VQ.
へえ~~. どうせ近似だから 70 より 72 を使ってるのまで含めて賢い.
或いはOSCで送信されるパラメータを全て確認したい
server.py を以下の通り用意する. python-osc · PyPI が必要なので
pip install python-osc なりしてから動かす.
import logging
from pythonosc import osc_server
from pythonosc.dispatcher import Dispatcher
## ロギングの設定
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(message)s")
## ディスパッチャーの設定(すべてのアドレスをキャッチ)
dispatcher = Dispatcher()
dispatcher.map(
"/*", # * ですべてのアドレスをキャッチ
lambda addr, *args: logging.info(f"Received OSC from {addr}: {args}"),
)
## サーバーの起動
IP = "0.0.0.0"
server = osc_server.ThreadingOSCUDPServer((IP, 9001), dispatcher)
logging.info(f"OSC server starting on {IP}:9001")
server.serve_forever()
先述したように Windows から見ると server.py は localhost ではないので、そのままだとサーバに届かない. 一度 VRChat を終了して --osc オプションを付けて起動する必要がある.
Windows から見た WSL の IP は以下で確認できる.
## WSL 上で
$ ip addr show eth0 | grep inet
inet 172.25.159.6/20 brd 172.25.159.255 scope global eth0
inet6 fe80::215:5dff:fed1:6ff0/64 scope link
なら 172.25.159.6 が IP. VRChat を --osc=9000:172.25.159.6:9001 で起動すれば、VRChat から WSL 上のサーバに OSC でパラメータが送信されるようになる.
先のサーバは /* をキャッチするようにしているので, 膨大な量のパラメータを受信するので注意.
これ買ったのが2025年4月. 将来見てる私にはリンクが切れてて見えない可能性大なので説明すると, 木目調模様の平たい時計なんだが, 上にちょうどスマホが一台置けるようになってて, これが Qi 充電になってるってやつ. 先々週あたりから, 朝起きると充電できてないことが多くなってきた. バッテリー側なら劣化することもあるだろうけど, 充電側がダメになるんだ. 見た目がオシャレで気に入ってたのに.
こないだアキバヨドバシでオウルテックの適当な Qi 充電器 (OWL-QI10W05) を買ってきて. こちらはスタンドにもなるよってやつ. 問題なく充電できるんで, やっぱり時計付きの充電器の方がダメになってたらしい. スマホが当たる面が布製になってるの, 良い. ガジェットはこういうところ, 大事だと思う.
なんと3月は一つも日記を書いていなかった!