滅入るんるん

何か書きます

【忘備録】機械学習によるレコメンドシステムまとめ

最初に

この記事は自分用にレコメンドシステムについて調べたことのまとめです。特に機械学習エンジニアであるわけでもなく、機械学習をたくさんやってきたという人間でもなく、ただのアプリケーションエンジニアによる忘備録ですので、間違ってることなどがあると思います

語句

コサイン類似度

  • データを平面座標上に配置し、それぞれの原点からのベクトル成分の向きの類似度のことを指す
  • ベクトル間の数値的な大きさを考慮しない場面で利用する

特徴量(Feature)

  • モデルに入力する変数

Sparse Feature

  • 特徴量がまばらに分布している状態
  • 値の欠落(null)ではなく、0が広く分布している

embedding

  • 異なるカテゴリーの特徴量を別の特徴量に変換することで近似できるカテゴリーにし計算しやすくする

シグモイド関数(Sigmoid Function)

  • \varsigma(x)=\frac{1}{1+e^{-ax}}=\frac{\tanh(ax/2)+1}{2} のような関数
  • 0から1の間の値に写像する
  • x=0が変曲点となり\varsigma(0)=1/2となる

ReLU

  •  f(x) = maxof(0, x)のような関数
  • 0以上になるように値を返す

クロス積(Cross Product)

  • 2つのベクトルの積のこと
  • 外積とも呼ばれる

テンソル(Tensor)

  • ベクトルや行列を一般化したものみたい
  • ベクトルは1次元テンソル、行列は2次元テンソルという感じに

線形モデルと非線形モデル

  • 線形モデル: 1次関数によって数値予測する
  • 非線形モデル: 線形モデルではないもの(曲線型)
  • 線形モデルの利点: データ数が少ない場合の予測に強い

多層パーセプトロン(MLP: Multilayer perceptron)

  • 動物の脳の神経細胞をモデル化したもの
  • n個の入力に対し1個の出力をする活性化関数をパーセプトロンと呼ぶ
    • f(x) = a1*x1 + a2*x2 + ... + an*xn + bという感じ
    • この関数が0以上になれば1、そうでなければ0のように2値に写像する
  • パーセプトロンを多層にしたものを多層パーセプトロンと呼ぶ
    • 入力層(Input Layer)・中間層(隠れ層(Hidden Layer)とも言う)・出力層(Output Layer)が用意される
  • 一方でパーセプトロン1層からなる場合は単層パーセプトロン(Singlelayer perceptron)と呼ぶ
  • 中間層が2層以上になるとディープラーニング(Deep Learning)と呼ばれるようになる

ニューラルネットワーク(Neural Network)

  • MLPの一部ではあるが、一般的には活性化関数が異なる
  • シグモイド関数などにより0から1の間の値に写像される
  • 中間層が2層以上になるとディープラーニング(Deep Learning)と呼ばれるようになる

ディープニューラルネットワーク(DNN: Deep Neural Network)

  • ニューラルネットワークによるディープラーニングはDNNとも呼ばれる

グラフニューラルネットワーク(GNN: Graph Neural Networks)

  • グラフを用いたDNNの一種
    • ここでのグラフはグラフ理論的なグラフのこと
  • グラフを用いるのでノードとエッジで表現できる形式の処理に向いている

グラフ畳み込みネットワーク(GCN: Graph Convolutional Networks)

  • GNNの一種
  • CNNの仕組みを参考に畳み込みを行う
    • CNNでは画像畳み込みなので8方向だが、GCNはグラフなので周辺ノードなどからの畳み込みを行う

ナレッジグラフ(KG: Knowledge Graph)

  • すでに知っている知識を紐づけていき、グラフを構築する
    • DBなどの情報を連想ゲームのようにつなげる感じ
  • コンテンツベースなレコメンドシステムになる

Attention機構

  • 入力されたデータのどこに注目すべきかを選定する仕組み

協調フィルタリング(Collaborative Filtering)

  • ある行動AをしたユーザーAはある行動Bをしている、ユーザーBがある行動Aをしたのである行動Bをレコメンドするというような感じ
  • 行動履歴に基づいてレコメンドするのでコンテンツ情報は必要ない
  • ユーザー同士またはアイテム同士の類似度をコサイン類似度で計算する
  • 特徴
    • 新しいコンテンツ・新しいユーザーにレコメンドできない
    • 類似コンテンツをレコメンドしてしまう
    • 類似のユーザーがいなければレコメンドできない
    • ユーザーやアイテムなどが増えると次元が増え、計算量が増加する

協調フィルタリングを効率化する手法

MF(Matrix Factorization)

  • 各ユーザー・各アイテムの評価値を既知の評価値から推測することで次元を減らし、計算量を軽減する

SVD(Singluar Value Decomposition)

  • 行列を近似できる行列に変換し、次元を減らし、計算量を軽減する
  • レコメンドシステムとの相性がよくない

FM(Factorization Machine)

  • Matfix Factorizationと同様なことを複数の行列に対して行う
    • それぞれの特徴量の間の相互作用を考慮する
    • ユーザー・アイテム以外の情報を扱うことができるようになるためレコメンド精度が向上する

多層パーセプトロンによる協調フィルタリング

  • MLP構造にし、そこで特徴量の相互作用・次元削減・スコアの計算を行う協調フィルタリングの一種
  • 非線形変換モデル

Wide and Deep Learning

  • Wide LearningコンポーネントとDeep Learningコンポーネントからなる
  • Wide Learningコンポーネント: Sparse Featureをクロス積変換し、相互作用を記録できる単層パーセプトロン
  • Deep Learningコンポーネント: アイテムをembeddingし特徴量の相互作用を計算するMLP
  • 最終的なスコアはシグモイド関数によってWide LearningコンポーネントとDeep Learningコンポーネントの値が結合される

DeepFM(Deep Factorization Machine)

  • Wide and Deep Learningの拡張
  • Wide Learningコンポーネントをembeddingしたアイテムを入力したFMに置き換えたもの

xDeepFM(Extreme Deep Factorization Machine)

  • DeepFMの拡張
  • 線形モデルとCINとMLPのコンポーネントからなる

CIN(Compressed Interaction Network)

  • 以下のような設計がされている
    • 相互作用はビット単位ではなくベクトル単位で計算される
    • 高次の特徴の相互作用は明示的に計算される
    • ネットワークの複雑性は相互作用に対して指数関数的に増加することはない
  • 各層が1つ前の層の隠れ層と新たな入力に伴って計算される点でRNNに似ている
  • 各層の中間テンソルは1つ前の隠れ層と入力の特徴行列の各次元の外積となる。これはCNNと強い関係があり、中間テンソルは特殊なタイプの画像と見なすことができる
  • 各層の出力は入力の合計が出力され(Sum pooling)され、それらの合計をシグモイド関数で出力する

DNNによる協調フィルタリング

  • 多層パーセプトロンによる協調フィルタリングの一種
  • 活性化関数の差異だけかなと思う

Neural Factorization Machines

  • FMの交互作用の部分をf(x)に置き換える
    • f(x)はMLPとなる
    • 活性化関数にシグモイド関数やtanhやReLUを選ぶことができるのでDNNであると言えるかも
  • また、Embedding LayerとHidden Layersの間にBilinear-Intaraction layerがあることも特徴
    • embeddingされたベクトルを1つのベクトルに変換する

NCF(Neural Collaborative Filtering)

  • ユーザーやアイテムをembeddingし、それを入力とする
  • MLP構造にし、MFを行う
    • 活性化関数にはシグモイド関数やReLUなどを使う

NeuMF(Neural Matfix Factorization)

  • GMFとNCFを組み合わせたもの
  • 最終的なスコアの計算は2つのネットワークの出力が連結される

GMF(Generalized Matrix Factorization)

  • Matrix Factorizationをニューラルネットワークバージョンにしたもの
  • ユーザーとアイテムの要素ごとの積が入力となる
  • どうやらFactorization Machineと同じことを指してる様子

GNNによる協調フィルタリング

  • DNNによる協調フィルタリングの一種

NGCF(Neural Graph Collaorative Filtering)

  • GCNを利用している
  • EmbeddingしたあとにEmbedding Propagation Layerを複数層重ねる
    • ここで畳み込みをしてると言えそう
    • embedding時に隣接ノードのembeddingを利用しているので、最終的なembeddingはEmbeddig Propagation Layerのすべての層のembeddingをまとめていることになる
  • 最終的なスコアは内積を行っている

LightGCN(Light Graph Convolutional Network)

  • NGCFから非線形関数や特徴変換行列を取り除いてNGCFの計算量を抑えている
    • 各層では近傍ノードの特徴量の和を取るだけになっている
    • しかし、NGCFより精度・収束速度の両面でLightGCNのほうが優れている
  • ニューラルネットワークの要素が取り除かれているのでDNN/GNN/GCNと言えるのかは謎

DGCF(Disentangled Graph Collaborative Filtering)

  • ユーザーとアイテムの間にインテント層があることが特徴みたいだけど論文をチラ見してもよくわからなかった
  • 2020年ごろに発表されたばかり見たいなのでググってもあまり出てこなかった

KGによるレコメンド

DKN(Deep Knowledge-Aware Network for News Recommendation)

  • ニュースの推薦をするために考案された
    • リアルタイム性・ユーザーごとの興味範囲・ニュースの情報は省略されている(タイトルとか)といった難題があった
    • それを解決するためにKGによるアプローチがされた
  • 候補ニュースとあるユーザーの過去に見たニュースが入力となり予想されるCTRを出力するモデル
  • 候補ニュースの特徴量をRNNやCNNでベクトルに変換し、Knowledge Graph Embeddingによって得た特徴量を加える、そして候補ニュースと過去に見た記事のAttentionを計算し予想CTRを算出する

Knowledge Graph Embedding

  • KGにおける各ノードとエッジの低次元なembeddingを求める
  • (head, relation, trail)という構造をなるべく維持したまま低次元化する

RippleNet

  • ぐぐっても情報があまり出なかった
  • hwwang55/RippleNetで実装がされてるけどアプリケーションエンジニアにはPythonわからないよね()

CKE(Collaborative Knowledge Base Embedding for Recommender Systems)

  • これもぐぐっても情報があまり出なかった
  • ナレッジグラフと画像解析とテキスト解析を駆使しているらしい

すまん、力尽きた

レコメンドシステムに使われるアルゴリズムを芋づる式に調べていったら思ってたより数が多くて力尽きたので近年のトレンド(?)的なものは駆け足で書いておきます

  • CNN
    • 画像認識系のアルゴリズム
    • 画像の一部からさらに細部へと...という感じに畳み込んでNNに喰わせるアルゴリズム
  • RNN
    • 時系列データに強いが、長期間に渡る行動データに基づく予測は厳しい
  • LSTM
    • RNNの改良型
    • 長期記憶と短期記憶に分けることでRNNの欠点を補っている
  • Transformer
    • めちゃくちゃ計算速度が速くなった(雑解釈)
  • GPT-1, GPT-2, GPT-3
    • 膨大な学習データを用意できるようになった
    • それによってTransformerに膨大なデータを喰わせて爆発的に精度が向上したらしい
  • BERT
    • Transformerを双方向にして精度を向上(?)

さて、最後のほうは駆け足というか、レコメンドに関係なさそうな画像認識・自然言語処理などのアルゴリズムも載せちゃいました。ついでということでもなく、自然言語処理ができるならばレコメンドにも使えたりするという感じだからです

あと、これらのアルゴリズムや今まで書き記してきたアルゴリズムは単体で使われることもあれば複数を組み合わせて使われることもあります。それぞれのアルゴリズムで得意不得意があるからなのですが、それらの長所短所がわかってくると機械学習エンジニアになれたりするんですかね(?)

参考文献