なぜ疑似ラベルが効果的か調べてみた
はじめに
なぜ疑似ラベル ( Pseudo-Label ) が効果的かを知るために、「Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks」を読んだので、内容を記載します。
http://deeplearning.net/wp-content/uploads/2013/03/pseudo_label_final.pdf
疑似ラベル ( Pseudo-Label ) とは
疑似ラベルを使った半教師あり学習の方法
1. ラベルづけされているデータで学習済みモデルを作る
2. 1.で作成したモデルを使って、ラベルづけされていないデータで予測値を出す
3. 2.の予測値を疑似的なラベル、疑似ラベルとし、疑似ラベルづきデータをラベルづきデータに混ぜて学習する
なぜうまくいくのか
Abstractを読むと「エントロピー正則化として作用するから」と書かれてました。
これだけだとよく分からなかったので、順を追って読んでみました。
多クラス分類問題を扱っています。
損失関数
損失関数を、ラベル付きデータと未ラベルデータで分けて表現すると、以下のように記載できます。
がラベル付きデータの個数で、が未ラベルデータの個数で、 がクラス数です。
第 1 項目がラベル付きデータのLoss、第 2 項目が未ラベルデータのLossで、その合計が全体のLossです。
ここで、未ラベルデータの疑似ラベルで、以下のように、ネットワークの出力の最大予測確率を持つクラスを選択します。
この損失関数 の はバランスを取るための係数で、徐々に大きくなるようにスケジューリングする必要があるそうです。あまりにも高いと学習を阻害し、低すぎると疑似ラベルの恩恵を受けられなくなるのだそう。
エントロピー正則化
エントロピー正則化は、エントロピーを最小化することで、クラス間の境界部分を低密度な状態 ( 境界にデータがあまりなくてが分類しやすい状態 ) にしてくれるそうです。
エントロピーは各クラスのデータのオーバーラップに対する評価値となります。
エントロピーは以下のように表されます。
: 未ラベルデータの個数
: クラスの個数
: 未ラベルデータ
: 未ラベルデータの疑似ラベル
先ほどの損失関数 (各: 交差エントロピー誤差) の両辺に負の値をとり、損失関数の最小化問題をMAP推定 ( 事後確率を最大化するようなパラメータを推定する問題 ) に置き換えるため、先ほどのエントロピーの式も合わせて、以下のように書き直して考えます。
これを最大化させるので、未ラベルデータのエントロピー(第2項)を最小化して、ラベル付きデータの対数尤度(第1項)を最大化することになり、ラベル付きデータだけの学習よりもパフォーマンスがよくなるそうです。
結果
MNISTのデータを使い、Pseudo-Labelを使ったものと使わなかったものとで、t-SNEにより比較しています。
確かに、Pseudo-Labelを使ったものの方が、各クラス間の境界部分が低密度な状態になっていると言えそうです。
終わり
完全に腑に落ちるところまで理解することはできなかったです( ˘ω˘ ; )
KaggleでもPseudo-Labelが上手くいく場合と、上手く行かない場合があるように見受けられ、疑似ラベル付きデータをどのくらいの数、どのタイミングで入れるかが難しいのかな、と思いました。
記載に誤りがあれば教えていただけたら嬉しいです。
終わり 2
転職して、まだ入社していないのですが ( 12月から入社です \( •̀ω•́ )/ ) 次の会社の勉強会に参加させてもらってます。めっちゃ面白いです。
今回のブログも、勉強会中で疑問になったことをきっかけに調べてみようと思って書きました。
ちなみに、勉強会の内容ですが、先輩がGitHubで公開してくれています!!良きです!
github.com
参考
https://papers.nips.cc/paper/2740-semi-supervised-learning-by-entropy-minimization.pdf
https://pdfs.semanticscholar.org/1ee2/7c66fabde8ffe90bd2f4ccee5835f8dedbb9.pdf
arxiv.org
推薦のアルゴリズムを調べた
はじめに
基本的な推薦のアルゴリズムについて勉強しました。
「推薦システム: 統計的機械学習の理論と実践」を参考に、一部ピックアップして、要点を記載しました。
Pythonで実装する場合、使えそうなライブラリも一緒に記載しています。
推薦のタスク
- コンテンツのフィルタリング
- ユーザ特性モデル
- スコアリング
- ランキング
古典的手法
bag-of-words
アイテム素性ベクトルを構成するためにbag-of-wordsベクトル空間モデルを使用。各単語を次元として扱う。
このベクトル空間に写像する方法。
バイナリ表現
単語の有無を0,1で表現
TF
単語の出現率
: 単語 t の文書 d 内での出現回数
TF - IDF
文書中に含まれる単語の重要度を表す。
まず IDF 逆文書頻度を以下とする。
: 全文書数
: ある単語 t が出現する文書の数
TF-IDF は以下であわらされる。
sklearn.feature_extraction.text.TfidfVectorizer — scikit-learn 0.21.3 documentation
次元削減
bag-of-wordsの表現は、次元が大きくなってスパースネスになってしまう。
それを抑える代表的な方法。
類義語拡張
類義語を加えてスパース性に対応
日本語 Wordnet
SudachiDict/synonyms.md at develop · WorksApplications/SudachiDict · GitHub
素性選択
過剰に出現率が高い/低い単語は無視する
ランダム射影
距離関係を保ったまま次元削減する。
sklearn.random_projection.SparseRandomProjection — scikit-learn 0.21.3 documentation
トピックモデル
文章からトピックを推定する。
LDAモデルが単語を生成する仕組みを学習するもの。
トピック分布
文章が各トピックに属する確率
トピック分布を以下のようにあわらす
ベクトルの和が 1 であるシンプレックス。
例 )
トピック0 が ゲーム なら、ゲーム に属する確率は0.3
トピック1 が 教育 なら、教育 に属する確率は0.2
トピックk が IT なら、IT に属する確率は0.1
潜在トピック
文章 d の各単語 0~n に対して、それぞれ潜在トピックが存在しており、それはトピック分布から生成される。
単語の生起確率
トピックk における、各単語 0~n の生起確率が存在し、各単語の潜在トピックとそのトピックの単語出現率から実際の単語が生成される。
トピック分布は、全トピック数の次元のベクトルをパラメータにもつ、ディリクレ分布から生成される。
単語の生起確率も、全単語数の次元のベクトルをパラメータにもつ、ディリクレ分布から生成される。
そのパラメータを変分近似またはギブスサンプリングで推定するらしいが....パラメータ推定の部分の理解は省略。
協調フィルタリング
アイテムの評価行動が似ている2人のユーザは嗜好が似ていると言える。ユーザ i に類似する他のユーザの集合を得て、アイテムを好む程度を予測する。
ユーザ間の類似度に基づいた手法
ユーザ i と似ているユーザがアイテム j に与えた評価を元に、ユーザ i がまだ評価していないアイテム j のレイティング(スコア)を以下のように表す。
: ユーザ i の平均レイティング
: ユーザ l の アイテム j に対すレイティング
: ユーザ i に似ていて、アイテム j を評価したユーザの集合
: ユーザ i がアイテム j を評価する時のユーザ j に対する重み
重み を一般的には以下のユーザ間の類似度で表す。
ユーザ間の類似度
ユーザ i とユーザ l の類似度。
: ユーザ i とユーザ l の両方に評価されたアイテムの集合
アイテム間の類似度に基づいた手法
アイテム j と似ているアイテムに与えられた評価を元に、ユーザ i がまだ評価していないアイテム j のレイティング(スコア)を以下のように表す。
: ユーザ i によって評価されたアイテム j と似ているアイテムの集合
探索と活用
多腕バンディット
複数のスロットマシーンで各マシーンの当たりが出る確率がわからない状況で、腕を選択する試行を繰り返し報酬を最大にする課題。
探索と活用のトレードオフ問題に対する、いくつかのアプローチがある。
ベイジアンアプローチやミニマックスアプローチがあるが、実践でよく使われる、ヒューリスティックなバンディット戦略を記載。
- グリーディ
の確率で探索をし、 で活用(報酬確率の推定値が最大となる選択)をする。
過度の探索をさせないために時間の経過と共に、 を減少させる。
例えば、今の時点で腕を引いた総数 に対して、とする。
SoftMax
腕を探索する確率を以下のようにする方法。 はハイパーパラメータ。良さそうな腕を多く探索できるが、分散を考慮できていない。
: 腕 i から得られた報酬の標本平均
Thompson Sampling
スロットマシーンごとにベータ分布を以下のように定めて乱数を発生させて、その値が大きかったマシーンを引く。
: そのマシーンで当たりがでた回数
: そのマシーンでハズレがでた回数
推薦システムの評価
オフライン評価
過去に観測されたアイテムへのレイティングにもとづいて行う。
データを様々な方法で分割する。無作為分割、時間ベース分割、ユーザベース分割、アイテムベース分割。
数値予測の指標
数値レイティングが推定対象の場合は、指標としてはRMSE、MAEが広く使われている。ユーザがアイテムにポジティブなレスポンスをする確率を予測するモデルでは、対数尤度がよく使われる。
: テストデータセット内の対のデータ (ユーザ i , アイム j ) の集合
: ユーザ i がアイテム j にポジティブなレスポンスをする予測確率
: ユーザ i がアイテム j にポジティブなレスポンスをしたかどうかの0,1
局所的ランキングの指標
AP(Average Precision)
その順位までの適合率を、適合したデータに限定して平均したもの。
: 適合データの数
: その位置 r での適合率
: 適合していれば 1 を返して、適合していなければ 0 を返す
sklearn.metrics.label_ranking_average_precision_score — scikit-learn 0.21.3 documentation
MAP(Mean Average Precision)
APの平均。ユーザに対する推薦であればユーザ数で平均をとる。
AP@nやMAP@nなど、@nがつく場合は、nまでの順位のみに限定する。
nDCG
正規化割引累積利得(nDCG)について記載する。
まず、割引累積利得(DCG)を以下のようにする
: 順位 k のアイテムにユーザ i が評価したレイティング。正なら1, 負なら0。
: ユーザ i が評価したアイテムの数。
: ユーザ i が正のレイティングとして評価したアイテムの数。
nDCGはユーザ i における最大DCG値によって正規化されたDCG。
オンラインバケットテスト
オンラインバケットテストとは、無作為に選択した一部のユーザに新しいモデルでサービスを提供し、ユーザがどのようなレスポンスをするかを観測すること。
ユーザベースでバケットを分けるパターンや、リクエストベースでバケットを分けるパターンがある。
一般的に使用されるオンラインパフォーマンのエンゲージメント指標には、CTR(クリック率)やユーザあたりの平均クリック数、クリックするユーザの割合、クリック以外のアクション(コメントを書き込むなど)、消費時間などがある。
オフラインシミュレーション
オフラインシミュレーションでは、オフライン環境でアイテムに対するユーザの応答をシミュレートできるグランドトゥルースモデル(GT)を構築することが基本的なアイディアであるが、かなり難しい。
省略。
ランク学習
ランク学習は素性ベクトルからアイテムのスコアリストへの写像を学習。
その写像を
とし、教師データは以下のように表す
Pointwise approach
1つのアイテムに対して、ランキングのどの位置かを予測するアプローチ。
損失関数の例
Pairwise approach
2つのアイテムに対して、どっちの方がランキングが上かを予測するアプローチ。
損失関数の例
はヒンジ関数や指数関数など。
Listwise approach
複数のアイテムに対して、それぞれのアイテムがランキングではどの位置かを予測するアプローチ。ランキング全体としての良さを求めている。
損失関数の例
は i 番目にランクづけされたオブジェクトをさす
RankNet
NNを利用したPairwise approach。
をモデルとし、2つのアイテム、 のスコアを 、 とする。
アイテム の方が よりランクが高いことを、 と書く。
となる確率を以下のように定める。
損失関数はクロスエントロピーとし、勾配降下法で最適化する。
は真の確率で、以下のように定める。
ListNet
NNを利用したListwise approach。
データの並び順の起こりやすさを確率分布 にして考える。
: クエリーあたりのデータ数
: 並び順
損失関数はRankNetと同じくクロスエントロピーとし、勾配降下法で最適化する。
Dataset
推薦のアルゴリズムで使えそうなデータセット
cseweb.ucsd.edu
おわり
まだ理解が粗く、範囲も不十分なところがあるので、落ち着いたら(雲コンペ終ったら) もう少し掘り下げたいです。
間違ってるところがあればご指摘いただけたら嬉しいです。
推薦って面白いなと思いました⸜( ‘ ᵕ ‘ )⸝⸜
参考
https://papers.nips.cc/paper/3708-ranking-measures-and-loss-functions-in-learning-to-rank.pdf
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-2007-40.pdf
http://www.nactem.ac.uk/tsujii/T-FaNT2/T-FaNT.files/Slides/liu.pdf
ランク学習 Advent Calendar 2018 まとめ - 人間だったら考えて
画像認識でよく使われるライブラリ一覧
概要
画像コンペ初参加につき、画像認識でよく使われているライブラリを調べました。
言語はPython、ディープラーニング関連はPyTorchに限って記載してます。
今後も便利なライブラリを見つけ次第、追記していきますφ(・ω・ )
画像処理全般
速度比較
- 画像の読み込み速度はscikit-imageが一番速い
- リサイズや色彩変換の画像変換処理の速度はOpenCVが一番速い
PIL vs Opencv | Kaggle
【Python】画像処理の速度比較(scikit-image vs. OpenCV) | 加賀百万石ですが何か?
Pythonの画像読み込み: PIL, OpenCV, scikit-image - Qiita
データ拡張
Albumentation
- データ拡張用ライブラリ
- データ拡張バリエーションが多い
- 処理速度も他のデータ拡張系ライブラリに比べて早い
- torchvisionからの移行が容易
速度比較
CPU 1コアで 1秒間に処理できる枚数なので、多い方が高速
https://github.com/albu/albumentations#benchmarking-results
モデル
速度向上
こちらも画像専用ではないですが、便利なライブラリなのでメモ。