改めてAmazonページを見ると白色は在庫切れになってるね. 黒色でもいいんだけど黒色はつやつや素材になってて指紋が気になりそう. 白色はマット加工がなされてていつ見ても綺麗.
トラックパッドみたいなのは結局ソフトウェア的にトラックボールをエミュレートするものであって, なら最初からトラックボールが良いとずっと私は主張してる.
しかし親指トラックボールは中途半端だ. 小指一本で操作するよりは楽だけど, どんなに付け根が太くても親指一本に任せるのにはいつか無理が来る. それから, 人によるだろうけどマウスに立ち向かう際の腕の角度はシチュエーションで変わる. その時時で結局マウスを最適な角度に持ってくる作業が必要になってしまう.
大玉トラックボールはその点問題ない. 左を向きながらでも右を向きながらでも, 立ち上がって触るときでも, どんな角度でもただ球体がそこに鎮座してるだけだ. 使うときは指を曲げて摘むようなことはしないで, 常に手をニュートラルな状態, 指を伸ばした状態から筋肉をすべて緩めたその状態で, 好きな場所に球体をそっと触れ, 手首と腕を動かすのでいい. 手首が疲れたなら腕を動かせばいい. 腕が動かしにくいならその時は指先を動かせばいい. 右手が疲れたなら左手を使えばいい. でかい球体があるだけだから, どうやったっていい.
でかい動きと細かな動きの切り替えだけは練習が必要だ. 一応は本体にDPIの切り替えボタンがあるけど, こんなのは使う人いないだろう. これに頼らないで済む感度設定を頑張れ. 通常は大雑把に大きく, 最後は指先の動きで細かく動かす. これだけ.
線形オートエンコーダ (LAE) 系レコメンダは2つのバイアスがある. 人気アイテムが過剰評価される Popularity Bias と, 近すぎるアイテムが過剰評価される Neiborhood Bias.
DAN (Data-Adaptive Normalization) という正規化手法を提案する.
ユーザーに関する正規化とアイテムに関する正規化を2つやってることになる. \(\alpha, \beta\) はハイパーパラメータ.
コールドスタート問題に対応するように EASE を拡張した.
ユーザーに関するコールドスタート問題を解決する.
ユーザー対アイテムのインタラクション行列に, ユーザーの属性行列 \(U\) , アイテムの属性行列 \(T\) を結合して,
\[Z = \begin{bmatrix}{cc} X & \beta U \\ \alpha T & 0 \end{bmatrix}\]としてこの \(Z\) について EASE する.
アイテムに関するコールドスタート問題.
アイテム間の類似度行列 \(R\) を別途用意する. 例えばアイテムのテキスト表層情報から tf-idf で類似度を計算するなど. これが \(B\) とある程度近くなるようにする.
\[\| X - XB \| + \lambda \| B \| + \gamma \mathrm{diag}(B) + \delta \| R - B \|\]"Semi-Supervised Classification Based on Classification from Positive and Unlabeled Data"
二ヶ月前 に買った SlimBlade Pro だが, もう一つ欲しくなってる. しかし白色は Amazon では在庫がない. 色が好きなんじゃなくてマット素材が良いんで, 何色でも良いので出してくれ.
親指トラックボールがアホらしくなってしまった. あんなに喜んで使ってたのに.
LLM-based User Profile Management for Recommender.
Profile Update for REcommender (PURE)
を提案する. データセットは Amazon data. ユーザーの過去のレビュー文を使ってユーザーの特徴を抽出する. これをレコメンダに役立てる.
データセットにはユーザーの購入履歴以外にレビュー文もある. LLM にそれらを与えてユーザーの属性情報をテキストで吐かせる. 適宜, プロファイルは更新していく. なにかの方法でアイテムの候補を与えて, LLM にランク付けさせる. LLM には Llama-3.2-3B-Instruct を使った.
https://proceedings.neurips.cc/paper/2020/file/e33d974aae13e4d877477d51d8bafdc4-Paper.pdf
オートエンコーダは何も考えないと恒等写像 (単位行列) に収束してしまう. 過学習の結果といえる. denoising AE や Dropout, L2 正則化でこれを防ぎたいと考えるのが普通だが, これらは直接このことを防ぐための手法ではないので必ずしも効果的ではない. この論文では emphasized denoising AE を提案する. これは直接恒等写像への収束を防ぐことを目的とした手法である.
DLAE (Denoising Linear Autoencoder) という手法(不明)がすでにある. これは \(X = X B\) となるような行列 \(B\) を学習するもの. ここで対角成分が一番小さくなるものを選べば良い.
\[\min \| X - XB \| + \| \Lambda^{1/2} B \|_F^2\] \[\text{where } \Lambda = \frac{p}{1-p} \mathrm{diagMat}(\mathrm{diag}(X^T X))\]ここで \(\Lambda\) は正則化の係数になる対角行列. すなわち \(B\) の対角成分だけ小さくすることを目的とする.
これを解くと
\[B = I - (X^T X + \Lambda)^{-1} \Lambda\]ただしこれでも対角成分がゼロになるようなことを保証はできない.
に \(\mathrm{diag}(B) = 0\) を制約として加える.
この制約があるなら L2 正則化は不要では? と見える. でも, ラグランジュの未定乗数で解いてると思うなら, あってもいいか.
(案の定)ラグランジュの未定乗数で解くと
\[B = I - C \cdot \mathrm{dMat}(1 \ominus \mathrm{diag}(C))\] \[\text{where } C = (X^T X + \Lambda)^{-1}\]を得る.
ほとんど EASE と同じに見える... 何が違う? というかこの論文はなんで EASE に触れないのか?
It's Enough: Relaxing Diagonal Constraints in Linear Autoencoders for Recommendation | alphaXiv
EASE みたいな Linear Autoencoder はL2正則化と対角成分の制約で成っている. 経験的には NNs と同じか超えることもある. これを解明したい. そしてロングテール問題の解決をどうしたらいいか考えたい.
LAE または EASE から次を定義する.
これも閉形式解を持つ.
また同様に DAE と EDLAE から RDAE を定義できる.
Figure 3 は RLAE の \(\xi\) を変化させたときの結果. \(\xi=0\) のときは EASE と同等. \(\xi\) を大きくするにつれて TAIL の精度があがり, HEAD は下がってそう. トレードオフかな.
[山善] ノンフライヤー 4.5L
ってやつ. 今一番楽しいオモチャを手に入れた気分. 8/6 に家に届いてから毎日何かしら試してる.
買う前までは, 冷凍食品の揚げ物を本当に揚げ直したような出来を再現するための調理器具だと思ってた. 実際にはもっと万能だった. 揚げでもないし焼きでもないし電子レンジのような温めでもない. それらのちょうど中間にある.
私の最近発明した簡単レシピを紹介する. まず準備としてクッキングシートを底に敷いておく. うまく行けば使い終わったあとエアフライヤーは汚れずクッキングシートを丸めて捨てるだけで済む. 豚バラ肉だけを敷いて180度5分焼く. もうこれで食べてもお腹を壊さない程度の加熱はされてる. 豚バラ肉を裏返して, 大雑把にちぎったキャベツを上に乗せ, しめじなんかも上に乗せる. そしてまた180度5分焼く. お皿に盛り付けたらめんつゆを掛けて完成. 追加で大葉とかネギを添えると嬉しい.
ところでエアフライヤーには「ノンフライヤー」っていう名称もある. ノンフライヤーは「揚げ物ではない」ことを言ってる. エアフライヤーは「空気による揚げ物である」ことを言ってる. 実際には同じものだ. 私は「何をしないか」じゃなくて「何をするか」で語る大人になりたいので, エアフライヤーと呼ぶことにする.
NDCG の計算方法を誤って覚えてた. 今理解した.
\(N\) 個のアイテムを並べるのに内部で各アイテム \(i\) に確信度スコア \(s_i\) を与える. それとは別に真の適合度 \(g_i\) も与える. \(s_i\) が高いほど \(g_i\) が高いと嬉しい. 逆に \(g_i\) が低いアイテムには \(s_i\) を低くできてるほど嬉しい.
\(s_i\) はアイテムの順序を決定するためだけに使う. \(s_i\) に関して降順(大きい順)に並び替えて \(g_1, g_2, \ldots, g_N\) を取り出す. そして
\[\mathrm{DCG}(g) = g_1 + \sum_{i=2}^N \frac{g_i}{\log_2(i)}\]と計算する. そして DCG の上限は \(g_i\) に関して降順に並び替えて \(g_1^\ast, g_2^\ast, \ldots, g_N^\ast\) を取り出して
\[\mathrm{DCG}^\ast(g) = g_1^\ast + \sum_{i=2}^N \frac{g_i^\ast}{\log_2(i)}\]これを以て
\[\mathrm{NDCG}(g) = \frac{\mathrm{DCG}(g)}{\mathrm{DCG}^\ast(g)}\]とする. \(s_i\) は並び替えにしか使ってないので, 順序を保存する関数 \(f \colon \mathbb R \to \mathbb R\) があれば (つまり \(x \leq y \iff f(x) \leq f(y)\) な関数), \(f\) を \(s\) に適用しても NDCG の値は変わらない.
\(g\) と \(s\) を別々に持つと思ってなかったのでずっと考え間違いをしてた (常に \(g=s\) にするんだと思ってた).
from sklearn.metrics import ndcg_score
g = [[4, 2, 3, 0, 1]]
s = [[1.0, 0.75, 0.5, 0.0, 0.25]] # swap 2 and 3
print(ndcg_score(g, s)) # 0.982121886438581
s = [[x**2.0 for x in s[0]]] # preserve the order
print(ndcg_score(g, s)) # 0.982121886438581
s
はソートにしか使ってないので当然値は変わらない.
scikit-leran の実装でも argsort
にしか y_score
( \(s\) ) は使われてない.
読むべき論文
"A Pre-trained Zero-shot Sequential Recommendation Framework via Popularity Dynamics" https://arxiv.org/html/2401.01497v5 ドメイン (U,V) に依存しない推薦モデルを作る
"Personalized Playback Technology: How Short Video Services Create Excellent User Experience" https://arxiv.org/html/2410.17073v2 ByteDance による TikTok (Douyin) の解説