自分で実装した Factorization Machines による Bayesian Personalized Ranking を用いた implicit feedback の推定はうまくいった
Factorization Machines で Bayesian Personalized Ranking を用いた implicit feedback の推定を行いたかったけどうまくいかなかった - 糞ネット弁慶
Matrix Factorization で Bayesian Personalized Ranking を用いた implicit feedback の推定はうまくいった - 糞ネット弁慶
の続き.
要約
- Bayesian Personalized Ranking がまだまだ諦められない
- 前回の実装を発展させ, Factorization Machines を実装して推定したところ AUC が適切な値になった
- fastFM の使い方が本当に謎.
手法
Factorization Machines である.
入力が「誰が何を買ったか」の 0/1 のみであるとし,その他の特徴量を用いないとすると,
Matrix Factorization は の に対する評価は前回同様 となる.この時 は共に 次元の低次元表現ベクトル.
Factorization Machines の交互作用を色々と含んだ式をこれに当てはめると となる.ただ が加わっただけであwることがわかる. は 次元の行列であり, は 次元のベクトル.
実装
推定する際,本来は であるのだけど, となるため,勾配の計算時にが消えてしまう.そのため今回は は 次元で推定している.
実験
データセットは MovieLens 100K Dataset | GroupLens . 5-fold CV 用にデータが既に分かれているのでそれに従う.
元データは Rating だが, implicit feedback の状況を作りたいので,「ユーザが映画をレビューしたかどうか」とし,レビューしていた場合は '1' とする.
学習率は 0.01 ,正則化は V/W 共に = 0.01,行列分解の次元数を 10 とした時,SGD のステップ数とテストデータに対する AUC の平均値との関係を以下に記す.
ステップ数 | AUC |
---|---|
1 * 80000 | 0.5537658848362093 |
10 * 80000 | 0.7635102655525375 |
50 * 80000 | 0.8624333710084262 |
50 * 80000 (MF) | 0.8091419600355472 |
適切に学習できており,ナイーブな Matrix Factorization より改善している.やはり Factorization Machines は少なくともこのデータ,および限定された特徴量ではうまく動いていることがわかる.
ここからは特徴量を増やすことで精度が改善するか確認したい.
では何が問題か
GitHub - ibayer/fastFM: fastFM: A Library for Factorization Machinesの正しい使い方がわかっていない.
自分だけが勘違いしているのかもしれないが,他の人も同じように失敗しているし,そもそもこれで成功している人を見かけない.
Matrix Factorization で Bayesian Personalized Ranking を用いた implicit feedback の推定はうまくいった
要約
- Bayesian Personalized Ranking が諦められない
- pairwise な loss を考慮した Matrix Factorization で MovieLens 100K を学習・予測すると AUC が 0.8 程度を示した
手法
Matrix Factorization は ユーザ u \in U とアイテム i \in I を行列 X で表し,X を 2 つの密行列に分解 X \approx H W^T に分解する手法.
通常は分解後の行列の積を推定値とし,観測値との誤差を最小化するように分解後の行列の値を更新するが,今回は BPR を目的関数にして学習する.
レコメンドアルゴリズム(BPR)の導出から実装まで - Start Today Technologies TECH BLOGを読むのが早い.
実装
レコメンドアルゴリズム(BPR)の導出から実装まで - Start Today Technologies TECH BLOG
機械学習アルゴリズムのボトルネックをCythonで改善する話
勾配計算とパラメータ更新には Cython は使わず numpy を用いたが今回実験に用いたデータぐらいであれば十分な速度が出た.
また,学習データに対する誤差は愚直に BPR を計算すると重すぎる.例えば movielens 100K の cv 1 では 118596998 個のデータに対して計算が必要になる.
vasily の記事ではどうしているのだろうと実装を読むと元行列の値との二乗誤差を学習誤差としていた.これならば 80000 回の計算で済むのでとりあえず真似することした.
しかし,BPR は値の大小関係のみを考慮し、値そのものに対しては無頓着であるため,評価したアイテムに対する予測値が1を超えたり,評価していないアイテムへの予測値が0から遠ざかる(かつ,評価しているアイテムより値が小さい)場合には予測時の AUC が改善するのに学習誤差が悪化するという現象が発生しうる(と思っていたら手元で発生した,良かった)のでその点だけは忘れないようにしたい.
実験
データセットは MovieLens 100K Dataset | GroupLens . 5-fold CV 用にデータが既に分かれているのでそれに従う.
元データは Rating だが, implicit feedback の状況を作りたいので,「ユーザが映画をレビューしたかどうか」とし,レビューしていた場合は '1' とする.
学習率は 0.01 ,正則化の lambda =0.01,行列分解の次元数を 10 とした時,SGD のステップ数とテストデータに対する AUC の平均値との関係を以下に記す.
ステップ数 | AUC |
---|---|
1 * 80000 | 0.5025368957322833 |
10 * 80000 | 0.715481069666248 |
50 * 80000 | 0.8091419600355472 |
適切に学習できている.良かった.しかし通常の目的関数との比較は未知なので BPR をあえて選ぶかどうかはまた別の実験が必要だと思う.
Factorization Machines で Bayesian Personalized Ranking を用いた implicit feedback の推定を行いたかったけどうまくいかなかった
何故上手くいかなかったのか,あとから再現できるよう忘れないために書く.
要約
- 回帰や分類ではなく, Bayesian Personalized Ranking にもとづく Factorization Machines を試したい
- 実装はibayer/fastFM を使い,データに MovieLens 100K を選び実験するも AUC が 0.5 程度から改善しない
- どう考えても自分の使い方が間違っている
導入
Factorization Machines (ICDM 2010)という手法がある.
元論文の説明は昔書いた記事(Factorization Machines (ICDM 2010) 読んだ - 糞ネット弁慶)を自分でも見返したりしている.
それとは別の話で BPR (Bayesian Personalized Ranking) と呼ばれる目的関数があり,特に implicit feedback と呼ばれる状況において有効である,とされている.
BPR: Bayesian Personalized Ranking from Implicit Feedback (UAI 2009)
レコメンドアルゴリズム(BPR)の導出から実装まで - Start Today Technologies TECH BLOG
implicit feedback の例としては,ユーザがある動画を閲覧したかどうか,というデータである.
例えば,ユーザ u_1 が 全 item i_1, ..., i_M のうち,i_1, i_2, i_3 だけを閲覧していたとする.
この時,BPR では「閲覧しなかったものより閲覧したものの方が優れている」という仮定をおき,そのようなスコアを出力する関数を学習する.
つまり,なんらかのスコアを返す関数 f(u, i) について,
f(u_1, i_1) > f(u_1, i_4), f(u_1, i_1) > f(u_1, i_5), ..., f(u_1, i_1) > f(u_1, i_M),
f(u_1, i_2) > f(u_1, i_4), f(u_1, i_2) > f(u_1, i_5), ..., f(u_1, i_2) > f(u_1, i_M),
f(u_1, i_3) > f(u_1, i_4), f(u_1, i_3) > f(u_1, i_5), ..., f(u_1, i_3) > f(u_1, i_M)
といった形の pairwise なデータを作り,この差の和が最大になるように学習を行う.
あとは予測対象の (u, i) に対して学習した関数を適用し,スコアを得たならば AUC なり top-K なりが計算できる.
この時,関数は Ranking を学習するものであるため,値の大小関係のみが重要であり,値そのものをなんらかの形では利用できないことは注意する必要がある.
好奇心から BPR を試してみたかったが手頃な実装が見当たらなかった.ちょうどいいところに BRP を目的関数に取る Factorization Machins の実装があったので実験することにした.
実装
pairwise なデータを作るところで愚直に list を使うと重いので np.array を長めに確保して切り詰めるというしょうもないことをやっている.
実験
データは MovieLens 100K Dataset | GroupLens を使った. 5-fold CV 用にデータが既に分かれているのでそれに従う.
元データは Rating だが, implicit feedback の状況を作りたいので「ユーザが映画をレビューしたかどうか」とし,レビューしていた場合は '1' とする.
特徴ベクトルはシンプルにユーザとアイテムとを one-hot encoding したものを concat している.なので今回の場合は 943 + 1682 次元.
学習率は 0.01 ,正則化パラメータはデフォルト値,行列分解の次元数を 20 とした時,SGD のステップ数と AUC の平均値との関係を以下に記す.
ステップ数 | AUC |
---|---|
10 | 0.491907136 |
50 | 0.491988281 |
100 | 0.491724715 |
明らかにまともに学習できていない.学習率や次元数を変えてみたが改善しない.何か失敗していると思われるが原因が分からない.
Modeling Consumer Preferences and Price Sensitivities from Large-Scale Grocery Shopping Transaction Logs (WWW 2017) 読んだ
概要
ある商品の購入数を予測する上で階層構造を導入する.更に値段も重要だからモデルに組み込む.
具体的には が に を 個購入する時,
を が にてカテゴリ を選ぶという行動
を が にて を購入するという行動として,
とする.
なので,あるカテゴリを購入するかどうか,するのなら何を選ぶか,その上でいくつ買うか,という過程をモデル化する.
モデル化は基本的には行列分解に基づく特徴量だのの線形和をリンク関数に通す方法.GLMix: Generalized Linear Mixed Models For Large-Scale Response Predictionを引用しているけどその前に気持ちとしてはFactorization meets the neighborhood.時間要素を無視すれば Koren のそれと同じモデルになると式 (3) でも指摘されている.
その上でカテゴリの選択にはシグモイドを,商品選択には softmax を,個数にはポアソン分布を通す.ここまではいい.
どうやって価格を入れるかというと,商品 の価格 を log に通して重み をかける.
推定そのものは MLE (maximum likelihood estimation) と BPR (Bayesian Personalized Ranking) について触れられている.
パラメータの数が非常に多いのでかなり頑張ってデータを確保して推定しないとうまく働かなさそうという感想.
疑問
モデル化に際し,重みを商品とユーザごとに求める理由が不明.価格弾力性を導入するという気持ちはわかるけど,商品の価格が時間ごとにどの程度変化するのかについてここまで細かく対応する必要があるのか,という点がわからない.著者 Julian McAuley は accept された論文の review comment を公開しており,それを見ると overall で -2 をつけたレビュアーも
More details on the price variability of the datasets is required to understand the datasets. What types of discounts/specials were observed, what relative decreases in price were achieved.
https://cseweb.ucsd.edu/~jmcauley/reviews/www17.txt
と指摘している.
また,「精度が上がったから導入した意味はあった」というのは論文で用いられる論法であるけど,そこまで劇的に改善しているわけではないとレビュアーも指摘している.
Portrait of an Online Shopper: Understanding and Predicting Consumer Behavior (WSDM 2016) 読んだ
[1512.04912] Portrait of an Online Shopper: Understanding and Predicting Consumer Behavior
オンラインでの購買行動に関する様々な分析.
年齢,性別の購買傾向,購買した商品の違い,購買間隔,購買金額の分析,および購買金額,購買間隔の予測.
冬のコミックマーケット C91 12月30日(金) 東 R23-a で最後の「声優統計 第九号」を出します
日本声優統計学会としての九度目,そして最後となるコミケ参加です.
最後と特に明記した記憶は無いのに恐らくお誕生日席です.
「声優統計第九号」内容
- 前書き (@R_Linux)
- 声優力:第二の種田梨沙を探せ (@Med_KU)
- きららフェスタ2016:観客動員数No.1 は誰だ (@Med_KU)
- 声優統計特別研究員:声優統計による研究費獲得への道 (@Med_KU)
- seiyu2vec (仮) (@y_benjo and @MagnesiumRibbon)
- 二次配布可能な音素バランス文と声優統計音声コーパスの構築 (@y_benjo)
- テレビアニメにおける新人声優とその傾向について (@kkobayashi)
- 黒沢ともよさんの音楽嗜好に基づくロックフェス推薦システムに関する取り組み (@wakuteka)
価格は500円を予定しています.
声優統計論文集第二号
第五号から第八号までのオフセットまとめです.
冬のコミックマーケットC87 28日日曜日東テ29-aで「声優統計 第五号」「声優統計論文集第一号」を出します - 糞ネット弁慶
夏のコミックマーケットC88 8月15日 土曜日 東ト47-bで「声優統計 第六号」を出します - 糞ネット弁慶
冬のコミックマーケットC89 12月29日 火曜日 東へ60-aで「声優統計 第七号」を出します - 糞ネット弁慶
夏のコミックマーケット C90 8月12日 金曜日 西M02-bで「声優統計 第八号」を出します - 糞ネット弁慶
156ページ,価格は500円です.赤字.
既刊
- 声優統計論文集第一号(第一号から第四号までのオフセットまとめ)
- 10冊も無いです
おまけ: 声優統計ホログラムステッカー
まだまだあります.
取り置き
今回も取り置きを行います.以下のフォームからお願いします.
日本声優統計学会取り置き
今回,取り置きは14時までとさせていただきます.
それでは,12月30日金曜日 東 R23-a でお待ちしています.
夏のコミックマーケット C90 8月12日 金曜日 西M02-bで「声優統計 第八号」を出します
日本声優統計学会としての八度目のコミケ参加です.今年は暑い.
今年は声優島そのものが西ホールに配置されているので注意が必要です.
「声優統計第八号」内容
- なれる!声優〜Deep Learning を利用した声質変換〜 (@asteerism)
- 声優しりとり (@Med_KU)
- 複数声優歌唱楽曲における歌唱パート特定問題 ~声優統計的ハイレゾのススメ~ (@MagnesiumRibbon)
- 「他界」の科学 (2) : 個別の感染症モデルにもとづくイベント参加予測 (@y_benjo)
- 会いにいける賃貸住宅を求めて (@wakuteka and @y_benjo)
価格は500円を予定しています.
おまけ: 声優統計ホログラムステッカー
多分送った荷物に入っている.
取り置き
今回も取り置きを行います.以下のフォームからお願いします.
日本声優統計学会取り置き
今回,取り置きは14時までとさせていただきます.
それでは,8月12日金曜日,東 M02-b でお待ちしています.