ホーム » 深層学習
「深層学習」カテゴリーアーカイブ
Counterfactual Machine Learning 入門
本日は反事実機械学習に軽く入門してみようと思います。Causal InferenceやCounterfactual MLは個人的にはまだ若い分野だと思っていて非常に今後が楽しみです。ちなみに共分散構造分析(SEM)も気になります。
表記とか
反事実機械学習とは「オフライン環境下での新しいポリシーの学習・評価」のことです。まず記事中の表記は下の通りです。



広告を例にとりますとこんな感じです。





そこで重要なのが評価指標です。CTRなどは前回解説しました。他にも次のようなものがあります。

Reward Prediction
system



Counterfactual model
そこで登場する手法が反事実モデルです。報酬関数を高い精度で得るためにまずはポリシーの分布を近づけてバイアスを消そうというアイデアです。


選択していないアクションはCounterfactorと呼ばれます。従来のポリシーの評価では選択したアクションのみが評価対象でした、ここでは反事実つまり、選択されなかったアクションも評価にいれます。ではどうやって導入して、さらには指標として生かすのかみていきます。
Inverse Propensity Score Estimator
IPSと呼ばれる指標を紹介します。
IPS Utility Estimator
このIPSを用いて次のように改めて定義します。先ほどの指示関数のところが新しいポリシーによる確率分布に変わりました。分母は変わらず傾向スコアです。

最後にその他の指標について軽く触れておきます。少しでも理解しておきたい、、、、
Self-Normalized Estimator
どうやらIPSにおける定数問題を解決した指標らしい
Doubly Robust Estimator
二つの手法のいいとこ取りをした指標らしい
感想
非常に難しいです。新しい知識が多く得られたのでその点は嬉しいですが自分の実力不足にかなり萎えています。もう一度勉強しなおそうと思います。でわReferences
強化学習 Bandit Algorithm で入門する
本日は強化学習に入門します。けどMDPとかはやらないので安心してください。簡単だと思います。ビジネスにおいてもバンディット問題は多くあるということなのでためになるかなーと思います。
Keywords
この記事のキーワードを先にリストアップします。こうしたほうが読みやすくないか?と最近やっと気づきましたすいません。- Exploitation / Exploration
- MAB (Multi-Armed-Bandit)
- Advertising Technology
- A/B Test
- Bayesian A/B Test
– Greedy
- Boltzmann Softmax
Exploration / Exploitation
- Exploitation is 活用
- Exploration is 探索
ラーメンが好きで毎回行きつけのラーメン屋さんにいくんですよね。もちろん、毎回いっているということはそこが美味しいって経験からわかっているので通っているんです。これがExploitationです。
しかし、同じラーメン屋さんにばかり通っていると仮に近くにもっと美味しいラーメン屋さんやつけ麺屋さんがあってもその存在を知り得ないですよね。なのでたまには自分の知らないお店に期待していきたくなりますよね。僕も3回に1回くらいの割合で新しいお店を体験します。これがExplorationです。
ただ、新しいお店だと「美味しい!」時と「普通かなー」な時と「んー」な時がありますよね。これらを報酬といいます。もちろん報酬の高い、つまり「美味しい!」を選択できるようなExplorationができれば理想ですね。
これらを考慮すると、ベストな選択としては行きつけでExploitationしつつも期待度の高いお店にExplorationしたいですよね。


Multi-Armed Bandit
上記のように複数の選択肢に対してExploration / Exploitationを考える問題を多腕バンディット問題といいます。- 期待値がわからないK個の選択肢が存在する
回の試行全てにおいて最善の選択肢を選び続けトータルの報酬を最大化したい


もっともポピュラーな例は広告の最適化とかですかね。薬の投与などもたまにExampleで見られますがここでは広告を例にして話を進めます。なのでいったんBanditからは離れてこれについてちょっと深入りしていきます。
Advertising Technology
広告に関わる全住民つまり、広告主側と媒体側(広告主,メディア,消費者)を幸せにするためのテクノロジーです。そのなかでもReal time bidding(RTB)がキーワードになります。それを説明する前に次の用語を簡単に
- DSP (Demand-Side Platform)
- SSP (Supply Side Platform)
つまり、DSPが「この広告貼ってー」とお願いし、SSPが「ええよー」と返します。しかし、一対一関係ではないので「俺の広告も貼ってくれー」といろんな人がお願いします。(SSPも複数あります。サイトA、サイトB的な感じです)
そんなマーケットのことをRTBといいます。複数のDSPが各々資金を持ってSSPに交渉し、最も価格の高いDSPをSSPが決定します。ただ値段の妥当性がわからないですよね。これも機械学習で最適化するそうです。そこで次の用語が登場します。
- CVR:ConVersion Rate.コンバージョン率
- CTR:Click Through Rate.クリック率
Bayesian A/B Test
A/Bテストってご存知ですよね。AとBどっちがいいの??を統計学的仮説検定を元に検証する試験のことです。Bayesian A/Bテストとは、A/Bテストをベイズでやろう!!のことです。たとえば商品Aの購入率が


この方の記事が最高に纏まっています。一応僕もベイズ推定の記事書いてます。
ちなみにバンディットのアルゴリズム実装の最後にベイズ使うので理解しておくことをおすすめします。
Banditを再確認
これらを踏まえてBanditをおさらいするとバンディットアルゴリズムはアームを選択した結果得られる報酬を逐次的に反映し、次のアームの選択に活かすことからA/Bテストに比べて機会損失の低減が見込めます。いわば逐次最適化A/Bテスト的な感じですかね。
加えてですねえ、A/Bテストは事前分布の問題もあるのでねえ、では次のセクションで最適化に移るためにBandit Algorithmを定式化します。

注目して欲しいのは



– Greedy
では一つ目のアルゴリズムの紹介です。
- パラメータ
を設定
の確率でExploration
- ランダムでArmを選択
の確率でExploitation
- 経験を元に、最大の行動価値を持つArmを選択









Boltzmann Softmax

- パラメータ
を設定 (small)
- パラメータ
を設定 (small)
の確率でExploration
- 各Armの行動価値をSoftmaxで重み付けし選択
の確率でExploitation
- 経験を元に、最大の行動価値を持つArmを選択





したがってExploitationは次のように定式化されます






最後にコードを貼っておきます。
References
- https://accel-brain.com/semantics-of-natural-language-processing-driven-by-bayesian-information-search-by-deep-reinforcement-learning/verstarkungslernalgorithmus-als-funktionale-erweiterung-des-banditenalgorithmus/
- https://ferret-plus.com/11986
- https://www.cs.princeton.edu/courses/archive/fall16/cos402/lectures/402-lec22.pdf
- https://lilianweng.github.io/lil-log/2018/01/23/the-multi-armed-bandit-problem-and-its-solutions.html
- https://www.smartbowwow.com/2018/08/python.html
- https://haltaro.github.io/2017/08/08/introduction-to-ad-tech
- https://github.com/brianfarris/RLtalk/blob/master/RLtalk.ipynb
- https://blog.albert2005.co.jp/2017/01/23/%E3%83%90%E3%83%B3%E3%83%87%E3%82%A3%E3%83%83%E3%83%88%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%80%80%E5%9F%BA%E6%9C%AC%E7%B7%A8/
- https://www.cs.princeton.edu/courses/archive/fall16/cos402/lectures/402-lec22.pdf
Feature Importanceを知る
世の中ではやはり解釈性が重要らしいです。
前回、SHAP含めてモデル解釈の指標についていくつか触れました。やはり一度では僕は残念ながら理解できないので復習も含めて今回この記事を書きます。
前回の復習
上記のリンク先が前回の記事になります。- Permutation Importance
- Partial Dependence
- LIME
- SHAP
ちなみに他にもDrop-Column Importanceとかもあるらしいです。
Feature Importance
順番的には逆になってしまいましたが、決定木自体にはFeature Importanceというものがあります。ご存知ですよね。どうやって算出されてるのや?と思ったので調べました。結論から言えばあまりにも式が複雑で完全に理解し切るのはかなりハードです。。なのでその計算の核となるGini Impurityから始めます。
Gini不純度

はクラスの総数
はクラスiの割合
二郎系 家系 まぜそば各クラスから均等な量の場合とあるクラスに偏りがある場合
count = 4 4 4
p = 4/12 4/12 4/12
= 1/3 1/3 1/3
GI = 1 - [ (1/3)^2 + (1/3)^2 + (1/3)^2 ]
= 1 - [ 1/9 + 1/9 + 1/9 ]
= 1 - 1/3
= 2/3
= 0.667
二郎系 家系 まぜそば少し小さくなりました。ではあるノードにおいて単一のクラスのみある場合はどうでしょうか。
count = 3 3 6
p = 3/12 3/12 6/12
= 1/4 1/4 1/2
GI = 1 - [ (1/4)^2 + (1/4)^2 + (1/2)^2 ]
= 1 - [ 1/16 + 1/16 + 1/4 ]
= 1 - 6/16
= 10/16
= 0.625
二郎系 家系 まぜそば0となりました。きれいに分類できている証拠ですね。決定木のFeature ImportanceはこのGiniを用いて算出されているようです。 参考文献によると
count = 0 12 0
p = 0/12 12/12 0/12
= 0 1 0
GI = 1 - [ 0^2 + 1^2 + 0^2 ]
= 1 - [ 0 + 1 + 0 ]
= 1 - 1
= 0.00


つまり、対象の特徴量が木全体においてどれだけGini不純度の減少に寄与できたかという指標でFeature Importanceが算出されているということです。
ということはです。分岐点を多く作りやすい変数の方が相対的にFeature Importanceが大きくなるのは直感的ですよね。単純に考えるとカテゴリカル変数よりも連続値変数の方がFeature Importanceが相対的に高まってしまうということです。さらに木を深めることで多くの分岐点が生成されるのであればその効果は莫大です。
実際Feature ImportanceにはCardinalityが密接に関係します。次にCardinalityについてみてみます。
Cardinality
みんな大好きKaggleにおいて次のような質問があった。

ここでカーディナリティとは、対象の変数の多様性のこと。つまり性別のようなカテゴリカル変数よりは連続値の変数の方がカーディナリティは相対的に高い。
これはまさに上記のGiniの定義より得られた考えのことだ。よってさきほどのFeature Importanceに対する理解は正しかったということだ。
Information Gain
実は決定木における重要な指標はGini Impurityだけではなく、Information Gain(平均情報量)というものが別であります。
LIME
じゃあ、どうしたらちゃんとした、まともな、直感的なFeature Importanceが得られるのか。という問に対する答えは僕の知るベストだとSHAPだ。もうSHAPしかない。上述した理由から決定木におけるFeature Importanceに信憑性はない、結果的に重回帰がやはり好かれている。しかし、分類という点においては決定木やNNには重回帰では残念ながら勝てない。
最高に分類できる状態を保ちつつ、重回帰のように最高の形でFeature Importanceがほしい、という欲求を満たしてくれるのがSHAPだ。LIMEの上位互換なのでやってることはほぼ同じ。
記事の最後になりましたがここでは低次元空間においてLIMEの振る舞いを簡単に実装してSHAP(LIMEの上位互換)のイメージを理解します。下のような非線形データを考えます。




ちなみにSHAPの凄いところは制約3つめのConsistencyです。これによって対象の特徴量のFIがより重み付されます。これによって決定木におけるFIの相対的なつぶれよりも直感的なFIを得ることができます。
Reference
- https://jamesmccaffrey.wordpress.com/2018/09/06/calculating-gini-impurity-example/
- https://en.wikipedia.org/wiki/Decision_tree_learning#Gini_impurity
- https://mlcourse.ai/articles/topic5-part3-feature-importance/
- https://towardsdatascience.com/the-mathematics-of-decision-trees-random-forest-and-feature-importance-in-scikit-learn-and-spark-f2861df67e3
- https://medium.com/coinmonks/what-is-entropy-and-why-information-gain-is-matter-4e85d46d2f01
- https://datascience.stackexchange.com/questions/10228/when-should-i-use-gini-impurity-as-opposed-to-information-gain
ベイジアン入門 ベイズ推定
前回、MAP推定までやりました。 しかしプロットもコードも書かなかったのでMAP推定をプロットするところからはじめます。復習がてらにね

MAP推定とベイズ推定の違いを簡単に



ということはベイズの方が難しいんですよ。(ちなみに最尤法、MAP推定は値を推定するので点推定とも呼ばれます。)
なぜベイズ推定したいのか?
これはあくまで僕なりの理解と見解なのでそれを踏まえて聞いて欲しいです。前述通りMAP推定よりベイズ推定の方が難しいです。理由は分母の計算があるからです。この計算は積分の形になり、さらにいうと計算できなくて困っているくらいなのです(MCMCとかで対応)そこまでしてベイズ推定するメリットはなんなのか?なぜMAP推定ではダメなのか?
僕の理解だとまず、MAPがダメというわけではないです。ベイズ推定の結果がMAP推定と同値的なことになることはあります。


一方で、ベイズ推定をすると事後分布の全体像がわかるため、例えば図においていい山が3つあるので平均をとって
直感・主観
を反映させるというアイデアがあるからです。ベイズ推定
最も簡単なのでコイン投げを例に取りましょう。なぜ簡単かというとパラメータが一つで済むからです。というのは表が出る確率を

加えて計算も楽なのです。(僕は数学が苦手なので複雑な理論とかはできない。)ここではパラメータ

パラメータの確率密度関数を





例えば



え?一様分布はいや?なら例えば次のような例を考えてみましょう。コイン持っていた人間が表がめっちゃ好きな人間なら事前分布は右に偏ったものになりますよね。つまり一様分布とはかけ離れ

つまり
前回の記事を読んでくれた方は共役事前分布は?と思ったかもしれないがいったん忘れてください。なぜならとことん話が簡単になるからですよ。
残るは尤度、上式の

つまり、

ではベイズ推定してみよう。前述通り

- (試行前)裏表同じくらいで出るよなー?
- (試行)Headが出た
- (試行後)まじ?まさか表出やすい?けどゆうてまだ一回目やしな


二回目の試行も一回目と同じく

- (試行前)裏表同じくらいで出るよなー?
- (試行)Headが出た
- (試行後)まじ?まさか表出やすい?けどゆうてまだ一回目やしな
- (試行)Headが出た
- (試行後)うせやろ?これ表しかでーへんパターンやろ



もっとシュミレーションすると

SHAP値で解釈する前にPermutation ImportanceとPDPを知る
昔、kaggleから宿題メールみたいなものが届いたんですよね。


ブラックボックス
機械学習も僕の知っている2年前に比べて色々と賑やかになってきました。決定木だとLightGBMやXGBOOSTありますし、ニューラルネットだとStacked LSTMやGANとかですねえ。そんな優秀なアルゴリズム達をどうやって理解すればいいんだろう?と言うのがブラックボックス問題です。例えば「ニューラルネットで学習させたけどこの重みの意味って、、、?」とか「この入力と出力の間の関係は、、?」とか「この変数って予測にプラスに働いたのか、、、?」などです。この記事ではそんなブラックボックスを少しでも理解するための方法をまとめます。
Permutation Importance
例えば決定木だとFeature Importanceがあります。これはモデルが使用する特徴量の重要度を数値化したものです。アルゴリズムに関してここでは触れませんがPlotはこんな感じです。

Partial Dependence Plots
上でどの特徴量が重要か分かりました。ではその特徴量と出力の間の関係知りたくなりますよね?そこでpartial dependence plotの登場です。参考文献にあるLINEさんのスライド見てあまりにも感動したんです。なんでかと言いますとこのアルゴリズムは選択した特徴量以外を周辺化で消すんですよね、その周辺化がまさに積分なんです。ベイズで出てくる周辺分布と同じようなことをしてるんです。

ではプロットを見てみます。データはirisです。

- x軸は変数の値
- y軸はbaseline(一番左の点)との予測(prediction)の比較
- 青枠は信頼区間
SHapley Additive exPlanations Value

LIME
SHAPアルゴリズムについてはLIMEというものがベースとなっているようです。


SHAP
話が少しそれましたがSHAPのアルゴリズムに移ります。これが非常に難しかった。。論文中にある「Simple Properties Uniquely Determine Additive Feature Attributions」の部分が肝です。LIMEに制約を設ける感じです。





これ以上は全くわからないのですいません、説明はここまでします。ここでは使えるようになることに集中します。
- https://github.com/slundberg/shap
- https://arxiv.org/abs/1602.04938
- https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions.pdf



横軸が目的変数の値で縦軸が特徴変数の貢献度の高さです。赤が正の値を、青が負の値となります。例えば、s5は目的変数が大きく(右側)なるほど赤い分布となり、目的変数が小さく(左側)なるほど青い分布となります。つまり、目的変数とs5は正の相関があることがわかります。


Reference
- https://www.kaggle.com/dansbecker/permutation-importance
- https://speakerdeck.com/line_developers/machine-learning-and-interpretability
- http://alfredplpl.hatenablog.com/entry/2013/12/24/225420
- http://maruo51.com/2019/05/02/feature_importances_/
- https://dropout009.hatenablog.com/entry/2019/01/07/124214
- https://qiita.com/shin_mura/items/cde01198552eda9146b7
- https://slundberg.github.io/shap/notebooks/plots/dependence_plot.html
- https://www.slideshare.net/SatoshiHara3/ss-126157179
ハイパラ最適化に困ってるんやろ?Optunaやで
久しぶりに欲しいものができたんですよね。無印の「軽量オーストラリアダウンポケッタブルマフラー」なんですけどオンラインでも全部在庫がないみたいで入荷を心待ちにしています。
そんなことはおいておいて、本日はハイパーパラメータ最適化についてです。
ハイパーパラメータとは
ハイパーパラメータの前にパラメータがありますよね、違いはなんでしょう?LassoとRidgeを例に取りましょう。上の記事で解説したのでそちらもみていただきたいのですが、モデルを定義する際に学習させる変数がありますよね。よく






これでパラメータとハイパーパラメータの違いが理解できたと思います。真相学習や機械学習の問題の一つはこのハイパーパラメータの最適化です。例えばニューラルネットワークにおいて活性化関数に何を使うかや決定木において深さをどうするかめっちゃ悩みますよね?それを最適化したいんです。
Grid Search
よくある手法の一つがグリッドサーチです。これは格子状にハイパーパラメータの候補を作り、総当たりしてその結果を見てハイパーパラメータを選ぶという手法です。sklearnにあるのでみてみましょう。Optuna
あの最強のPreferred Networks, Inc.さんが開発しました。Optuna はハイパーパラメータの最適化を自動化するためのソフトウェアフレームワークです。ハイパーパラメータの値に関する試行錯誤を自動的に行いながら、優れた性能を発揮するハイパーパラメータの値を自動的に発見します。現在は Python で利用できます。これがすごいんです。論文にもなったようです。
Optuna は次の試行で試すべきハイパーパラメータの値を決めるために、完了している試行の履歴を用いています。そこまでで完了している試行の履歴に基づき、有望そうな領域を推定し、その領域の値を実際に試すということを繰り返します。そして、新たに得られた結果に基づき、更に有望そうな領域を推定します。具体的には、Tree-structured Parzen Estimator というベイズ最適化アルゴリズムの一種を用いています。

使い方






- https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf
- https://www.slideshare.net/hskksk/hyperopt
- https://pythonoum.wordpress.com/2018/09/09/parameter-tuning/
- https://qiita.com/kenchin110100/items/ac3edb480d789481f134

Code
References
音声解析のための準備をPythonでやる


- デシベル・ピッチ・メル
- フーリエ変換(FFT)
- スペクトル
- スペクトログラム
- メルスペクトログラム
- ケプストラム
- メル尺度
- メルケプストラム
- メル周波数ケプストラム係数(MFCC)
- ヴェーバー‐フェヒナーの法則
- 等ラウドネス曲線
フーリエ変換
厳密な定義はひとまず無視して、信号






- 振幅スペクトル
- 絶対値
は周波数
の正弦波の大きさを表す
- 絶対値
- 位相スペクトル
- 偏角
は周波数
の正弦波の位相を表す
- 偏角

一般には周波数成分の「大きさ」が重要なので、

大きさは dB で表すことがもっとも一般的です。
- 振幅スペクトルを用いる場合、
- パワースペクトルを用いる場合、
また、






スペクトログラム
スペクトログラムとは音声を短時間ごとに区切り、各フレームのスペクトラムを時間軸に沿って並べたものです。サンプリングレート
1秒間の音の信号をいくつに分割するかを表す数値です。音楽用CDでのサンプリング周波数である44.1kHzは、1秒間の音の信号を4万4100に分割して4万4100のデータに変換します。
ねぇPython、CNNって何?(理論編 Part-1)
本日からはニューラルネットワークweek。最新のものまで突っ走りましょう。
てゆーか、ニューラルネットワークってなんだったっけ?
入出力数とか層数などは気にせずこんな風にニューロンを使った関数がニューラルネットワークでした。そして層が比較的深いものを多層パーセプトロンといいました。よく見ると
入出力がベクトル
になっていますね。いいんです。実際データなんてベクトル形式なんです。各学生のテストのデータも、競馬のデータも株価も終値とかを横並びにしてベクトルです。
しかーーし!
これ今日僕がとって虹なんですけど。こんな風に画像を入力としたい場合はベクトルじゃなくないですか?実際サイズは(691 × 502)ですし、しかもRGBなんです。RGBはレッド・グリーン・ブルーの略です、つまり3次元。
この画像のニューラルネットワークの入力として使いたいとするとこのままだと無理なので作戦を考える必要があります。
- とりあえずグレースケールにする(RGBからモノクロ)
こうするととりあえずデータのシェイプ(横,縦,奥)がになります。しかしまだ行列のままなのでもう一工夫
- 各行を横に並べて
のベクトルにするもしくは縦に並べたベクトルにする
こうすることで画像をベクトルとして扱えるようになりました!わーい
それは無理やりすぎる
ごもっともです。行列をベクトルにするなんて邪道すぎますね。行列入力できるニューラルネットワークが
畳み込みニューラルネットワーク(Convolutional Neural Network)
なんです。そう、画像に特化したニューラルネットワーク。
けどどうやって行列入力可能にしたんや?
その前に、そもそもなんで画像をベクトルとして扱うべきでないかというと
たとえばこの画像、四角で囲ったところを1ピクセルだとします。ここだけ見ても何もわからなくないですか?というのはこのピクセルから学習できそうなことはあるのか?ということです。一方で
こう見るとどうですか?虹がハッキリと映っていてさっきよりは意味あるピクセルになっていますよね、つまり、コンピューターが画像を学習するには今までのようなベクトルの要素単位ではなくもっと大きな範囲を1単位として見る必要があるからです。それが
畳み込み
なんです。この場合だと真ん中の行列がコンピューターの目となりKernel matrixといったりします。これをずらしていって手前の出力を作るんですがとりあえず一気に定式化します。
- 入力シェイプは
フィルタ数: K
フィルタサイズ: F
スライド幅: S
パディング: P - 出力シェイプは
フィルタサイズとはKernelサイズのこと、スライド幅はフィルタのずらし幅、パディングは画像の縁に新たなピクセルを組み込むことzero-paddingがメジャー。これは縁に0ピクセルを付け加えること、こうすることで
- 縁の畳み込み回数が増える
- パラメータの更新数が増える
- カーネルのサイズを調節できる
などのメリットがあります。
そして出力のシェイプで分母にとありますがこれについては次の図を見てください。緑が入力、オレンジが出力
スライド幅: 1
スライド幅: 2
緑のブロックにカーネルを重ね合わせ線型結合を計算します。この際、スライド幅が適切でないシェイプが少数になるのでそこだけ注意。
CNNでは畳み込みに加えてPoolingという操作があります。これは画像の縮小です。今までのニューラルネットワークでは隠れ層のノード数を減らすことで次元を落としていました。これを行列入力においても可能にしようというものです。
具体的な方法はMax-poolingというものです。のKernelでスライド幅2だと次のようになります。
定式化すると
- 入力:
フィルタサイズ: F
スライド幅: S - 出力:
となります。しかし、Poolingという操作はあまり人気がないらしいのでスライド幅の大きい畳み込みで対処するようです。
最後に次のリンクが非常に参考になるので見てみてください。
本日はここまでです。でわ。