ホーム » 深層学習

深層学習」カテゴリーアーカイブ

Counterfactual Machine Learning 入門

こんにちは。kzです。

本日は反事実機械学習に軽く入門してみようと思います。Causal InferenceやCounterfactual MLは個人的にはまだ若い分野だと思っていて非常に今後が楽しみです。ちなみに共分散構造分析(SEM)も気になります。

表記とか

反事実機械学習とは「オフライン環境下での新しいポリシーの学習・評価」のことです。まず記事中の表記は下の通りです。
\deltaが報酬ですね。ちなみにx_iはContextとありますがこれは文脈バンディットの文脈にあたります。Contextual Banditとは各ユーザーのデータx_iをその特徴ベクトルし、バンディット問題を達成するアルゴリズムです。この特徴ベクトルをcontextといいます。

広告を例にとりますとこんな感じです。
このデータセットSより以下を目標とします。いわばこれが反事実機械学習の考え方の核です。(ちなみにデータのことをポリシー\piによるログデータともいいます。)
まずonlineとofflineについてですがこれらは逐次学習と一括学習をそれぞれ意味します。新たなアルゴリズムによるsystemをofflineで評価することが目的です。また、より良いsystemを学習させることも目標になります。(systemはpolicyのこと)画像を通してみてみます。
ポリシーの評価についてもっとも単純なアイデアはA/Bテストですね。画像上のことです。これをcounterfactorを用いてオフラインで行うことが目標です。画像下のことです。

そこで重要なのが評価指標です。CTRなどは前回解説しました。他にも次のようなものがあります。
特にインターリービングは僕は今回初めて知ったんですがA/Bテストより大いに効果を発揮してくれるものだそうです。Netflixさんも使っているらしいです。また今度詳しくみてみます。

Reward Prediction

system\piを評価する方法の一つ目がReward Predictorです。これは報酬関数を学習により得ようとする方針です。報酬関数がわかれば新たなポリシーに対してシミュレーションができます。
ただ、この方法だと\piがバイアスに影響を受けやすいようです。考えられるバイアスとしてはモデルバイアスとセレクションバイアスがあります。モデルバイアスとは特徴量とモデルに依存します。セレクションバイアスはポリシーによる過学習(過表現)です。
モデルバイアスとは報酬関数の複雑性に起因します。この関数は非線形であったり、または考え付かないほど複雑な構造を持っているかもしれません。そのような関数を学習することは難しいです。セレクションバイアスとはポリシーによる行動選択が一部に偏ってしまう現象をいいます。これはポリシーによる各行動の分布差から生じます。

Counterfactual model

そこで登場する手法が反事実モデルです。報酬関数を高い精度で得るためにまずはポリシーの分布を近づけてバイアスを消そうというアイデアです。
次の例を考えます。
つまり3種類のアクションに対して、各報酬はバイナリです。まずは単純な評価を行ってみます。
本当にこれでいいのでしょうか?そこで反事実という概念を導入します。

選択していないアクションはCounterfactorと呼ばれます。従来のポリシーの評価では選択したアクションのみが評価対象でした、ここでは反事実つまり、選択されなかったアクションも評価にいれます。ではどうやって導入して、さらには指標として生かすのかみていきます。

Inverse Propensity Score Estimator

IPSと呼ばれる指標を紹介します。
このように行動に対するIPSは反事実を含めて算出されます。単純計算(3/4)から得られるよりも実質的な効果を表しているんじゃないかと個人的に考えています。とはいえこのIPSを用いてポリシーの評価方法を考えていきます。

IPS Utility Estimator

このIPSを用いて次のように改めて定義します。先ほどの指示関数のところが新しいポリシーによる確率分布に変わりました。分母は変わらず傾向スコアです。
こう定義することで以下が得られます。計算
んー、正直僕はまだちゃんと理解できていません。すいません。ただわかったことを改めてまとめますと反事実モデルとIPSを用いることによって新たなアルゴリズム(ポリシー)のシミュレーションができると言うことです。

最後にその他の指標について軽く触れておきます。少しでも理解しておきたい、、、、

Self-Normalized Estimator

どうやらIPSにおける定数問題を解決した指標らしい

Doubly Robust Estimator

二つの手法のいいとこ取りをした指標らしい

感想

非常に難しいです。新しい知識が多く得られたのでその点は嬉しいですが自分の実力不足にかなり萎えています。もう一度勉強しなおそうと思います。でわ

References

強化学習 Bandit Algorithm で入門する

こんにちは。kzです。

本日は強化学習に入門します。けどMDPとかはやらないので安心してください。簡単だと思います。ビジネスにおいてもバンディット問題は多くあるということなのでためになるかなーと思います。

Keywords

この記事のキーワードを先にリストアップします。こうしたほうが読みやすくないか?と最近やっと気づきましたすいません。

  • Exploitation / Exploration
  • MAB (Multi-Armed-Bandit)
  • Advertising Technology
  • A/B Test
  • Bayesian A/B Test
  • \epsilon – Greedy
  • Boltzmann Softmax

Exploration / Exploitation

  • Exploitation is 活用
  • Exploration is 探索
になります。僕の日常生活を例にして説明します。

ラーメンが好きで毎回行きつけのラーメン屋さんにいくんですよね。もちろん、毎回いっているということはそこが美味しいって経験からわかっているので通っているんです。これがExploitationです。

しかし、同じラーメン屋さんにばかり通っていると仮に近くにもっと美味しいラーメン屋さんやつけ麺屋さんがあってもその存在を知り得ないですよね。なのでたまには自分の知らないお店に期待していきたくなりますよね。僕も3回に1回くらいの割合で新しいお店を体験します。これがExplorationです。

ただ、新しいお店だと「美味しい!」時と「普通かなー」な時と「んー」な時がありますよね。これらを報酬といいます。もちろん報酬の高い、つまり「美味しい!」を選択できるようなExplorationができれば理想ですね。

これらを考慮すると、ベストな選択としては行きつけでExploitationしつつも期待度の高いお店にExplorationしたいですよね。
期間T内で探索・活用をベストな比率で行って最終的に最高の報酬(満足度)を得たい!がBandit問題です。

Multi-Armed Bandit

上記のように複数の選択肢に対してExploration / Exploitationを考える問題を多腕バンディット問題といいます。

  • 期待値がわからないK個の選択肢が存在する
  • N回の試行全てにおいて最善の選択肢を選び続けトータルの報酬を最大化したい
という感じです。(お気づきの方もいるかもしれませんが状態Sを考えません。厳密には|S| = 1

もっともポピュラーな例は広告の最適化とかですかね。薬の投与などもたまにExampleで見られますがここでは広告を例にして話を進めます。なのでいったんBanditからは離れてこれについてちょっと深入りしていきます。

Advertising Technology

広告に関わる全住民つまり、広告主側と媒体側(広告主,メディア,消費者)を幸せにするためのテクノロジーです。

そのなかでもReal time bidding(RTB)がキーワードになります。それを説明する前に次の用語を簡単に

  • DSP (Demand-Side Platform)
  • SSP (Supply Side Platform)
DSPは広告主側の広告効果を最適化するため、ユーザーに適した単価の安い配信先を探す側。媒体側の広告収益を最適化するため、より高額な広告に入札する側です。

つまり、DSPが「この広告貼ってー」とお願いし、SSPが「ええよー」と返します。しかし、一対一関係ではないので「俺の広告も貼ってくれー」といろんな人がお願いします。(SSPも複数あります。サイトA、サイトB的な感じです)

そんなマーケットのことをRTBといいます。複数のDSPが各々資金を持ってSSPに交渉し、最も価格の高いDSPをSSPが決定します。ただ値段の妥当性がわからないですよね。これも機械学習で最適化するそうです。そこで次の用語が登場します。

  • CVR:ConVersion Rate.コンバージョン率
  • CTR:Click Through Rate.クリック率
これらの指標をもちいてDSPの値段が決定されたりします。これ以上はここでは触れません。気になる方は参考文献より飛んでください。

Bayesian A/B Test

A/Bテストってご存知ですよね。AとBどっちがいいの??を統計学的仮説検定を元に検証する試験のことです。

Bayesian A/Bテストとは、A/Bテストをベイズでやろう!!のことです。たとえば商品Aの購入率がp、商品Bの購入率がqとしたとき分布に有意差あんの?をベイズで解決します。

この方の記事が最高に纏まっています。一応僕もベイズ推定の記事書いてます。

ちなみにバンディットのアルゴリズム実装の最後にベイズ使うので理解しておくことをおすすめします。

Banditを再確認

これらを踏まえてBanditをおさらいすると
バンディットアルゴリズムはアームを選択した結果得られる報酬を逐次的に反映し、次のアームの選択に活かすことからA/Bテストに比べて機会損失の低減が見込めます。いわば逐次最適化A/Bテスト的な感じですかね。


加えてですねえ、A/Bテストは事前分布の問題もあるのでねえ、では次のセクションで最適化に移るためにBandit Algorithmを定式化します。
英語やああああああ、と思わないでください。よく見てくださいめっちゃ簡単な単語しか出てきてません。

注目して欲しいのは\mathcal{Q}(a)です。これは行動aを入力とする行動価値関数と言われます。
注目すべきはRegret(後悔)です。これは最適な行動価値から実際にとった行動価値の差分で定義されます。定義より小さいほうがいいことがわかります。

\epsilon – Greedy

では一つ目のアルゴリズムの紹介です。
  • パラメータ\epsilon \in (0,1)を設定
  • \epsilonの確率でExploration
    • ランダムでArmを選択
  • 1-\epsilonの確率でExploitation
    • 経験を元に、最大の行動価値を持つArmを選択
経験を元に算出される行動価値は次で定義されます
ただし
はaction=aが選択された総数です。したがってExploitationは次のように定式化されます
\epsilonを変化させて実装結果を確認します。アームは10種類でそれぞれの確率は単調増加で設定しました。なのでインデックスでは9番が最大の行動価値をもったアームということになります。
たしかに、\epsilonを増やすとExplorationが多くされていることがわかりまうす。Rewardsと最適なアームを選んだ割合(BAR)の変化を比較します。
青が小さい\epsilonでオレンジが大きい\epsilonでの結果です。\epsilonをおきくするほど探索の割合が大きくなるのでその影響がBARに顕著に現れています。

Boltzmann Softmax

\epsilonの問題は探索をランダムで行っている点です。つまり、実際には行動価値の高いアームも低いアームも等確率で扱っていた点です。BoltzmannのアルゴリズムではSoftmax関数を用いることで各アームを経験行動価値で重み付します。その出力をそれぞれのアームの確率で扱います。
  • パラメータ\epsilon \in (0,1)を設定 (small)
  • パラメータw \in (0,1)を設定 (small)
  • \epsilonの確率でExploration
    • 各Armの行動価値をSoftmaxで重み付けし選択
  • 1-\epsilonの確率でExploitation
    • 経験を元に、最大の行動価値を持つArmを選択
定式化すると次のようになります。
よく見てみるとwで割り算されていることがわかります。これもハイパーパラメータです。察しの通りでw \rightarrow \inftyのときp_a = 1/|\mathcal{A}|となるので\epsilon-Greedyと同じようになります。

したがってExploitationは次のように定式化されます
では実装結果を確認します。
\epsilon-Greedyと比較してみます。
いいかんじ
Tを分割して確認しますとうすい水色である本来のベストなアームがT=200を超えたあたりから盛り返してきてることがわかります。

最後にコードを貼っておきます。
次回はUDBとThompson sampling実装しますー。でそのノリでContextual Banditとかも頑張りますー。

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を知る

こんにちは。kzです。

世の中ではやはり解釈性が重要らしいです。

前回、SHAP含めてモデル解釈の指標についていくつか触れました。やはり一度では僕は残念ながら理解できないので復習も含めて今回この記事を書きます。

前回の復習

上記のリンク先が前回の記事になります。

  • Permutation Importance
  • Partial Dependence
  • LIME
  • SHAP
雑におさらいするとPIは対象の変数をシャッフルして精度の変化からその変数の影響力を見る手法。PDは対象の変数以外を周辺化で消すことによってその変数のみの影響力を見る手法。LIMEは対象の入力データ周辺でブラックボックスモデルを線形近似しその重みでそれぞれの変数の寄与具合を見る手法。SHAPはLIMEのモデルに複数の制約(Consistencyなど)を与えてできた特殊な距離を使った手法(LIMEの上位互換)

ちなみに他にもDrop-Column Importanceとかもあるらしいです。

Feature Importance

順番的には逆になってしまいましたが、決定木自体にはFeature Importanceというものがあります。ご存知ですよね。どうやって算出されてるのや?と思ったので調べました。結論から言えばあまりにも式が複雑で完全に理解し切るのはかなりハードです。。

なのでその計算の核となるGini Impurityから始めます。

Gini不純度

あるノードにおけるGini不純度は上のように定義されます。記号については以下の通り

  • Cはクラスの総数
  • p_iはクラス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
少し小さくなりました。ではあるノードにおいて単一のクラスのみある場合はどうでしょうか。
         二郎系   家系     まぜそば 
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
0となりました。きれいに分類できている証拠ですね。決定木のFeature ImportanceはこのGiniを用いて算出されているようです。 参考文献によると
とありました。難しいですが、要は最後の式だけ見ればなんとなくわかります。分母は前ノードにおけるImpurity Reductionの総和であり、分子は対象の特徴量jによる分岐ノードでのImpurity Reductionの総和となっています。

つまり、対象の特徴量が木全体においてどれだけGini不純度の減少に寄与できたかという指標でFeature Importanceが算出されているということです。

ということはです。分岐点を多く作りやすい変数の方が相対的にFeature Importanceが大きくなるのは直感的ですよね。単純に考えるとカテゴリカル変数よりも連続値変数の方がFeature Importanceが相対的に高まってしまうということです。さらに木を深めることで多くの分岐点が生成されるのであればその効果は莫大です。

実際Feature ImportanceにはCardinalityが密接に関係します。次にCardinalityについてみてみます。

Cardinality

みんな大好きKaggleにおいて次のような質問があった。
タイタニックデータをxgboostでバイナリ分類したのちfeature importanceをみた結果、特徴量の1つであるSexは目的変数と高い相関があるにもかかわらず、比較的低いimportaceが得られたらしい。 これに対して気になるコメントがあった。
なにを言っているのかというと。カーディナリティによってfeature importanceにバイアスが生じる。high-cardinalityはhigh-importanceを持つ。これが原因でSexが相対的にlow-importaceになっている。

ここでカーディナリティとは、対象の変数の多様性のこと。つまり性別のようなカテゴリカル変数よりは連続値の変数の方がカーディナリティは相対的に高い。

これはまさに上記のGiniの定義より得られた考えのことだ。よってさきほどのFeature Importanceに対する理解は正しかったということだ。

Information Gain

実は決定木における重要な指標はGini Impurityだけではなく、Information Gain(平均情報量)というものが別であります。
じゃあ、どっちを決定木では使うの?どっちのほうがいいの?という問に対する答えはGini Impurityです。理由は簡単で計算が楽だからです。後者を選んでしまうと対数の計算が必要になります。詳しくは次のリンクへどうぞ

LIME

じゃあ、どうしたらちゃんとした、まともな、直感的なFeature Importanceが得られるのか。という問に対する答えは僕の知るベストだとSHAPだ。もうSHAPしかない。

上述した理由から決定木におけるFeature Importanceに信憑性はない、結果的に重回帰がやはり好かれている。しかし、分類という点においては決定木やNNには重回帰では残念ながら勝てない。

最高に分類できる状態を保ちつつ、重回帰のように最高の形でFeature Importanceがほしい、という欲求を満たしてくれるのがSHAPだ。LIMEの上位互換なのでやってることはほぼ同じ。

記事の最後になりましたがここでは低次元空間においてLIMEの振る舞いを簡単に実装してSHAP(LIMEの上位互換)のイメージを理解します。下のような非線形データを考えます。
可視化に力をいれたいのでgridでデータを再度作成し、とあるインプット(青)を考えます。このインプットしたいするlimeを求めます。
LIMEもSHAPもローカルなので局所的な空間を考えます。多様体の言葉でいうとチャート、または局所座標近傍です。
距離関数としてL2距離を算出します。実際にロス関数を定義して重みを最適化するのではなく、この距離を線形回帰のライブラリのweightというパラメータに用いて外れ値を考慮した線形モデルを構築します。
前述通り今回はロス関数を定義して計算しているわけではないので厳密なLIMEの実装ではないので注意。あとは線形回帰モデルを作って重みを取得するだけです。
両軸を特徴量として扱っているので線形モデルの直線は可視化できませんが上のマークより、その振る舞いは理解できたのでわないかと思います。ピンクの部分はプラスでグレーの部分はマイナスと分類されています。その時の切片、係数も取得できます。これがlimeです。 厳密ではないですがLIMEのやっていることは理解できたかな?と思います。

ちなみにSHAPの凄いところは制約3つめのConsistencyです。これによって対象の特徴量のFIがより重み付されます。これによって決定木におけるFIの相対的なつぶれよりも直感的なFIを得ることができます。
SHAPの距離のところがよくわからない。でわ

Reference

ベイジアン入門 ベイズ推定

こんにちは。kzです。

前回、MAP推定までやりました。 しかしプロットもコードも書かなかったのでMAP推定をプロットするところからはじめます。復習がてらにね
この青いプロットは今回のテーマであるベイズ推定です。まぁそれは置いておいて、「尤度x事前分布」の最大化がMAP推定でした。プロットすると上図のように山が最も高くなる点になります。

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

MAP推定は右辺の分子の最大化でした。一方でベイズ推定とは分母を切り捨てずちゃんと計算して左辺をちゃんと導出します。(なぜ切り捨ててよかったというとP(D)はパラメータ\thetaに依存しないからです。)

ということはベイズの方が難しいんですよ。(ちなみに最尤法、MAP推定は値を推定するので点推定とも呼ばれます。)

なぜベイズ推定したいのか?

これはあくまで僕なりの理解と見解なのでそれを踏まえて聞いて欲しいです。

前述通りMAP推定よりベイズ推定の方が難しいです。理由は分母の計算があるからです。この計算は積分の形になり、さらにいうと計算できなくて困っているくらいなのです(MCMCとかで対応)そこまでしてベイズ推定するメリットはなんなのか?なぜMAP推定ではダメなのか?

僕の理解だとまず、MAPがダメというわけではないです。ベイズ推定の結果がMAP推定と同値的なことになることはあります。
例えばベイズ推定後のパラメータの分布が上のようになったとしましょう。するとベイズ推定最大の利点の一つは「平均をとることもできる」という点だと思っています。説明すると、MAP推定のみの場合は得られる情報は真ん中の山の頂点を指す点、つまり\theta=10のみです。

一方で、ベイズ推定をすると事後分布の全体像がわかるため、例えば図においていい山が3つあるので平均をとって

    \[ \theta=\frac{6+10+17}{3}=11\]

のようにパラメータをより主観的に微調整できるのです。なぜ主観的という言葉を使ったかというとそもそもベイズの根幹に

直感・主観

を反映させるというアイデアがあるからです。

ベイズ推定

最も簡単なのでコイン投げを例に取りましょう。なぜ簡単かというとパラメータが一つで済むからです。というのは表が出る確率を\thetaとすると自動的に裏が出る確率が1-\thetaということです。

加えて計算も楽なのです。(僕は数学が苦手なので複雑な理論とかはできない。)ここではパラメータ\thetaの分布をベイズ推定で求めると同時に、その分布の変化を可視化することで理解を深めます。

パラメータの確率密度関数をf_n、コイン投げの結果x_nH(head)T(tale)で表し、確率変数をcと表すことにします。

例えば

    \[f_n(\theta) = f_n(\theta|c=H)\]

は表が出た時のベイズ推定で得た分布ということです。これを踏まえるとn+1回目の更新では次のようになります。

    \[f_{n+1}(\theta) = f_{n+1}(\theta|c=x_n) = \frac{p(c=x_n|\theta) f_n(\theta)}{p(c=x_n)} \]

ただし

    \[ p(c=x_n) = \int_0^1 p(c=x_n|\theta)f_n(\theta) d\theta    \]

では事前分布を決めましょう。これは上式のf_1に相当します。事前分布とはパラメータに仮定する分布でした。今回のパラメータ\thetaはコインが表をだす確率です。僕なら事前分布に一様分布を仮定します。なぜなら表も裏も同じくらい出るだろうと思っているからです。

え?一様分布はいや?なら例えば次のような例を考えてみましょう。コイン持っていた人間が表がめっちゃ好きな人間なら事前分布は右に偏ったものになりますよね。つまり一様分布とはかけ離れ\theta=1付近で最大値をとるようないわばデルタ分布とかを仮定することになります。しかし、話がややこしくなるんです。なので一様分布で許してください。

つまり

    \[ f_1(\theta) = 1 \]


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

残るは尤度、上式のp(c=x_n)のみです。尤度とはなんだった?それは試行の結果をパラメータを用いて表現したモデルでした

つまり、x_1=Hだったとするとその事象に対する尤度は

    \[ p(c=H|\theta) = \theta \]

となります、実にシンプルだろ?もし二項分布とかでやると計算がうわああってなります。(サイコロのようによりマルチなものをやろうとするとディリクレ分布とかが絡んできて、うわあああってなります)

ではベイズ推定してみよう。前述通りx_1=Hというデータが得られたとします。まずは分母つまり次の積分を計算しましょう。

    \[ p(c=x_1) = \int_0^1 p(c=H|\theta)f_n(\theta) d\theta    \]

代入すると

    \[  p(c=x_1) =  \int_0^1 \left( \theta \times  1 \right) d\theta   = \frac{1}{2} \]

では分子も計算します

    \[f_{2}(\theta) = f_{2}(\theta|c=x_1) = \frac{p(c=H|\theta) f_1(\theta)}{1/2}  \]

    \[f_{2}(\theta) = \frac{ \theta \times 1}{1/2} = 2\theta  \]

もとまりました。少しまとめてみましょうか。
  1. (試行前)裏表同じくらいで出るよなー?
  2. (試行)Headが出た
  3. (試行後)まじ?まさか表出やすい?けどゆうてまだ一回目やしな
今この3にいるわけです。ではもう一度ベイズ推定してみましょう。
f_2x_2というデータを用いたベイズ推定における事前分布となることに注意します。

二回目の試行も一回目と同じくx_2=Hだったとします。すると尤度は

    \[ p(c=H|\theta) \]

なのでこれを用いて先ほどと同様に積分と分布を計算します

    \[  p(c=x_2) =  \int_0^1 \left( \theta \times  f_2(\theta) \right) d\theta   = \frac{2}{3}  \]

    \[f_{3}(\theta) = f_{3}(\theta|c=x_2) = \frac{p(c=H|\theta) f_2(\theta)}{2/3}  \]

    \[f_{3}(\theta) = \frac{ \theta \times 2\theta}{2/3} = 3\theta^2  \]

となりました。先ほど同様にまとめます。
  1. (試行前)裏表同じくらいで出るよなー?
  2. (試行)Headが出た
  3. (試行後)まじ?まさか表出やすい?けどゆうてまだ一回目やしな
  4. (試行)Headが出た
  5. (試行後)うせやろ?これ表しかでーへんパターンやろ
こんな気持ちですよね。この気持ちが分布(密度関数f_n)として現れているんです。というのはf_nに注目してみると
  1. f_1 = 1
  2. f_2 = 2\theta
  3. f_3 = 3\theta^2
とこれ単調増加具合が増えてますよね。可視化してみます。
まとめますとベイズ推定で得られる事後分布とはデータを知った後のパラメータに対する気持ちの分布なのです。今の例だと二回も連続で表が出たので表の出る確率が1に近いほど確率密度が高いのです。

もっとシュミレーションすると
ディリクレ分布でもやりたいんですけど、もう計算が酷くて、、、それよりmcmcしたいですよね。数値計算で積分求めるなんて素敵だと思いませんか?でわ

SHAP値で解釈する前にPermutation ImportanceとPDPを知る

こんにちは。kzです。

昔、kaggleから宿題メールみたいなものが届いたんですよね。
今回はこれをやっていきます。先に一言で言うと機械学習のfitを説明しよう、と言うことです。言い換えるとモデルがデータをどう扱ったか解釈しよう、と言うことです。なんとなくまとめを先に行っておくと次の通りです。

ブラックボックス

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

この記事ではそんなブラックボックスを少しでも理解するための方法をまとめます。

Permutation Importance

例えば決定木だとFeature Importanceがあります。これはモデルが使用する特徴量の重要度を数値化したものです。アルゴリズムに関してここでは触れませんがPlotはこんな感じです。
人間はやはり可視化が好きなんですよね、上のものは決定木から得られたんですがこれを別のアルゴリズム、例えばリッジとラッソとかでもやりたくないですか?そんな時に使うのがPermutation Importanceです。これはある列を選択しその列内の値をランダムに並び替えて再度予測することでその精度の変化から逆算的に、選択した列の重要度を測るアルゴリズムです。

Partial Dependence Plots

上でどの特徴量が重要か分かりました。ではその特徴量と出力の間の関係知りたくなりますよね?そこでpartial dependence plotの登場です。参考文献にあるLINEさんのスライド見てあまりにも感動したんです。なんでかと言いますとこのアルゴリズムは選択した特徴量以外を周辺化で消すんですよね、その周辺化がまさに積分なんです。ベイズで出てくる周辺分布と同じようなことをしてるんです。
とは言っても周辺分布(周辺確率)のイメージとは異なる気がします。具体的な計算は次のようになっているようです。
最後はこれらの平均をとるのですが加重平均もOKです。これを見て思ったのが着目する特徴量がカテゴリカルでない場合は計算量がえぐそうですね、、、

ではプロットを見てみます。データはirisです。
  • x軸は変数の値
  • y軸はbaseline(一番左の点)との予測(prediction)の比較
  • 青枠は信頼区間
となります。例えばpetal length(class 1)だと4cmの時に予測が最もうまく働いていますが4cmを超えてからは悪い影響を与えていると読み取ることができます。

SHapley Additive exPlanations Value

やっときましたSHAP値。これは予測値と特徴量の関係を与えます。例えばプラスに働いたのか、マイナスに働いたのかと言うことです。

LIME

SHAPアルゴリズムについてはLIMEというものがベースとなっているようです。
LIMEでは対象のデータ周辺で局所的にモデルを線形近似します。上の図において、赤・青のバックグラウンドで表現されているのがブラックボックスである関数fです。濃い目の赤が説明したいデータ(インスタンス)です。黒のダッシュが局所的に線形近似した分類モデルになります。その係数の大小で各特徴量の重みを測ります。ちなみにLIMEは以下の最小化を行うようです。
二乗誤差を重み付けして最小化していますね。なんか気持ちいいです。まあこんな感じです(これ以上はわからない、、)

SHAP

話が少しそれましたがSHAPのアルゴリズムに移ります。これが非常に難しかった。。

論文中にある「Simple Properties Uniquely Determine Additive Feature Attributions」の部分が肝です。LIMEに制約を設ける感じです。
はいまず制約その1です。ブラックボックスモデルと近似モデルが等しい。

制約その2です。存在しない説明変数の貢献度はゼロとします。まあそんなに気にしてくていいです。
制約その3です。重み\phiが大きくなる条件のようですがすいませんよくわかりません。
これらの制約をうまく満たしてくれるのが上のモデルになります。LIMEに比べて距離関数のところがかっこよくなりました。

これ以上は全くわからないのですいません、説明はここまでします。ここでは使えるようになることに集中します。 例えばwineのデータにかけてみると
SHAP値ではベースライン(データ全体の期待値)との比較を行っているようです。これがよくわかってないです、コメントください。
上のようにクラス別でも見れます。
上の図は目的変数との相関になります。(分類だとplotできなかったため回帰問題のデータに変えました)

横軸が目的変数の値で縦軸が特徴変数の貢献度の高さです。赤が正の値を、青が負の値となります。例えば、s5は目的変数が大きく(右側)なるほど赤い分布となり、目的変数が小さく(左側)なるほど青い分布となります。つまり、目的変数とs5は正の相関があることがわかります。
上のグラフにおいてs5は血清測定値5という特徴量です。s5の値が大きいほど目的変数である1年後の疾患進行状況指標が高いことがわかります。
一通りやってみました。ここでは触れてませんが画像処理において画像のどの部分が寄与したか、などもわかるようです。ぜひ参考リンクをご覧ください。

アルゴリズム勉強します。

Reference

ハイパラ最適化に困ってるんやろ?Optunaやで

こんにちは。kzです。

久しぶりに欲しいものができたんですよね。無印の「軽量オーストラリアダウンポケッタブルマフラー」なんですけどオンラインでも全部在庫がないみたいで入荷を心待ちにしています。

そんなことはおいておいて、本日はハイパーパラメータ最適化についてです。

ハイパーパラメータとは

ハイパーパラメータの前にパラメータがありますよね、違いはなんでしょう?LassoとRidgeを例に取りましょう。

上の記事で解説したのでそちらもみていただきたいのですが、モデルを定義する際に学習させる変数がありますよね。よく\thetaで表されるやつです。例えばRidgeの場合だと
となり、Lassoの場合だと
となりました。このように学習(よくfitやtrainと言われる)において学習される変数をパラメータといいます。ではハイパーパラメータとはなんでしょう?これは我々が手動で設定する必要があるパラメータのことです。例えば次のLassoの目的関数を見てみましょう。
先ほど通り、\thetaがパラメータです。一方で、\lambdaがありますよね。これは我々が決めるパラメータなのでハイパーパラメータになります。

これでパラメータとハイパーパラメータの違いが理解できたと思います。真相学習や機械学習の問題の一つはこのハイパーパラメータの最適化です。例えばニューラルネットワークにおいて活性化関数に何を使うかや決定木において深さをどうするかめっちゃ悩みますよね?それを最適化したいんです。

Grid Search

よくある手法の一つがグリッドサーチです。これは格子状にハイパーパラメータの候補を作り、総当たりしてその結果を見てハイパーパラメータを選ぶという手法です。sklearnにあるのでみてみましょう。
いいんです、これでもいいんですけど「探索の最適化」したいですよね?紹介しましょう。オプチュナを。

Optuna

あの最強のPreferred Networks, Inc.さんが開発しました。
Optuna はハイパーパラメータの最適化を自動化するためのソフトウェアフレームワークです。ハイパーパラメータの値に関する試行錯誤を自動的に行いながら、優れた性能を発揮するハイパーパラメータの値を自動的に発見します。現在は Python で利用できます。
Optuna は次の試行で試すべきハイパーパラメータの値を決めるために、完了している試行の履歴を用いています。そこまでで完了している試行の履歴に基づき、有望そうな領域を推定し、その領域の値を実際に試すということを繰り返します。そして、新たに得られた結果に基づき、更に有望そうな領域を推定します。具体的には、Tree-structured Parzen Estimator というベイズ最適化アルゴリズムの一種を用いています。

これがすごいんです。論文にもなったようです。

使い方

テンプレは上の感じです。超シンプルなんですよね。ちなみに最後にgistsを貼りますが、出力も多く、plotもplotlyを用いているのでnotebookでは表示されませんので注意です。
例えばSVCのパラメータ探索をしたいときのコードは上の感じ。
時にはLightGBMとXGboostのように異なるアルゴリズムで比較したいときもありますよね。できるんです。
で、このOptunaの最大の魅力だと個人的に思っているのがPlotでして、plot自体が魅力的ではなくて、plotからOptunaが使っているアルゴリズムがすごいということがわかるんです。
これをみていただくとわかるかもしれませんが、ベイズ最適化を使っているんですよね。デフォルトだとTPEと呼ばれるアルゴリズムを使用されているようです。僕もベイズ最適化あたりは勉強しないといけないので良さそうなリンクを上げておきます。

で、まだ特徴があってデータベースに学習記録が保存できるらしいです。使い道はよくわかりませんが、、コメントください、

Code

Optunaはすごいですね、これからさらに追加される機能も気になりますし、gitからベイズ最適化のアルゴリズムの勉強もさせてもらえそうです。勉強頑張りましょう。でわ

References

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

こんにちは。 この記事はメモみたいになってます。次の記事へ移るようおねがいします。 本日は音声解析の準備段階としてスペクトログラムの可視化まで行いたいと思います。音声解析のライブラリは色々あるようですがlibrosaがおそらく一番だそうです。今回、スペクトログラムまで進めるにあたって専門用語がかなり多く、それぞれ非常に難しいものでした。特にメルあたりを理解するには少し時間がかかりそうです。。まぁ、始めましょう。
上の図を見てほしいんですが、音声解析で扱うデータは音です。しかし、この音が単純ではなかったわけです、何かと言うと、音源特性と声道特性という2つの要素から音が構成させているのです。ちなみにこことても重要だと思います。(後々のメルに絡んでいる模様)そしてこの音のデータを用いて音声解析のイメージ図は次のようになります。
キーワードとしては
  • デシベル・ピッチ・メル
  • フーリエ変換(FFT)
  • スペクトル
  • スペクトログラム
  • メルスペクトログラム
  • ケプストラム
  • メル尺度
  • メルケプストラム
  • メル周波数ケプストラム係数(MFCC)
  • ヴェーバー‐フェヒナーの法則
  • 等ラウドネス曲線
見ての通り非常にやることが多いです、、ひとまず詳しいことは今回は置いておいてスペクトログラムをPythonで表示してみます。

フーリエ変換

厳密な定義はひとまず無視して、信号f(t)に対するフーリエ変換は
となります。フーリエ変換によって、複合音を構成する各純音(スペクトラム)の周波数、振幅(パワー)の値を調べます。スペクトルF(omega)は、周波数成分と振幅成分を抽出したものです。

F(omega)は複素数で、その絶対値|F(omega)|と偏角arg F(omega)はそれぞれ、周波数omegaの正弦波の大きさと 位相を表し、それぞれ、振幅スペクトル、位相スペクトルと呼ばれます。
  • 振幅スペクトル
    • 絶対値|F(omega)|は周波数omegaの正弦波の大きさを表す
  • 位相スペクトル
    • 偏角arg F(omega)は周波数omegaの正弦波の位相を表す
また、|F(omega)|^2はパワースペクトル または エネルギースペクトル などと呼ばれます。

一般には周波数成分の「大きさ」が重要なので、F(omega)を図で表す場合、特にことわらなければ 横軸に(角)周波数、縦軸に周波数成分の大きさ を描きます。

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

        \[20 log _{10}(|F(omega)|)\]

  • パワースペクトルを用いる場合、

        \[20 log _{10}(|F(omega)|^2 )\]

みての通り、dB自体は変わりません。

また、omegaが負の部分を描くこともありますが、+omega-omegaは同じ周波数を表し、 |F(omega)|の値は同じ。 よって、|F(omega)|omega=0を中心に左右対称となります。

スペクトログラム

スペクトログラムとは音声を短時間ごとに区切り、各フレームのスペクトラムを時間軸に沿って並べたものです。

サンプリングレート

1秒間の音の信号をいくつに分割するかを表す数値です。音楽用CDでのサンプリング周波数である44.1kHzは、1秒間の音の信号を4万4100に分割して4万4100のデータに変換します。





ねぇPython、CNNって何?(理論編 Part-1)

本日からはニューラルネットワークweek。最新のものまで突っ走りましょう。

てゆーか、ニューラルネットワークってなんだったっけ?

入出力数とか層数などは気にせずこんな風にニューロンを使った関数がニューラルネットワークでした。そして層が比較的深いものを多層パーセプトロンといいました。よく見ると

入出力がベクトル

になっていますね。いいんです。実際データなんてベクトル形式なんです。各学生のテストのデータも、競馬のデータも株価も終値とかを横並びにしてベクトルです。

しかーーし!

これ今日僕がとって虹なんですけど。こんな風に画像を入力としたい場合はベクトルじゃなくないですか?実際サイズは(691 × 502)ですし、しかもRGBなんです。RGBはレッド・グリーン・ブルーの略です、つまり3次元。

この画像のニューラルネットワークの入力として使いたいとするとこのままだと無理なので作戦を考える必要があります。

  1. とりあえずグレースケールにする(RGBからモノクロ)

こうするととりあえずデータのシェイプ(横,縦,奥)が(691\times 502\times 1)になります。しかしまだ行列のままなのでもう一工夫

  1. 各行を横に並べて1\times (502\times 691)のベクトルにするもしくは縦に並べたベクトルにする

こうすることで画像をベクトルとして扱えるようになりました!わーい

それは無理やりすぎる

ごもっともです。行列をベクトルにするなんて邪道すぎますね。行列入力できるニューラルネットワークが

畳み込みニューラルネットワーク(Convolutional Neural Network)

なんです。そう、画像に特化したニューラルネットワーク

けどどうやって行列入力可能にしたんや?

その前に、そもそもなんで画像をベクトルとして扱うべきでないかというと

たとえばこの画像、四角で囲ったところを1ピクセルだとします。ここだけ見ても何もわからなくないですか?というのはこのピクセルから学習できそうなことはあるのか?ということです。一方で

こう見るとどうですか?虹がハッキリと映っていてさっきよりは意味あるピクセルになっていますよね、つまり、コンピューターが画像を学習するには今までのようなベクトルの要素単位ではなくもっと大きな範囲を1単位として見る必要があるからです。それが

畳み込み

なんです。この場合だと真ん中の(2\times 2)行列がコンピューターの目となりKernel matrixといったりします。これをずらしていって手前の出力を作るんですがとりあえず一気に定式化します。

  • 入力シェイプはW_1 \times H_1 \times D_1
    フィルタ数: K
    フィルタサイズ: F
    スライド幅: S
    パディング: P
  • 出力シェイプはW_2 \times H_2 \times D_2
    W_2 = (W_1 − F + 2P)/S + 1
    H_2 = (H_1 − F + 2P)/S + 1
    D_2 = K

フィルタサイズとはKernelサイズのこと、スライド幅はフィルタのずらし幅、パディングは画像の縁に新たなピクセルを組み込むことzero-paddingがメジャー。これは縁に0ピクセルを付け加えること、こうすることで

  • 縁の畳み込み回数が増える
  • パラメータの更新数が増える
  • カーネルのサイズを調節できる

などのメリットがあります。

そして出力のシェイプで分母にSとありますがこれについては次の図を見てください。緑が入力、オレンジが出力

スライド幅: 1

スライド幅: 2

 

緑のブロックにカーネルを重ね合わせ線型結合を計算します。この際、スライド幅が適切でないシェイプが少数になるのでそこだけ注意。

CNNでは畳み込みに加えてPoolingという操作があります。これは画像の縮小です。今までのニューラルネットワークでは隠れ層のノード数を減らすことで次元を落としていました。これを行列入力においても可能にしようというものです。

具体的な方法はMax-poolingというものです。(2\times 2)のKernelでスライド幅2だと次のようになります。

定式化すると

  • 入力: W_1 \times H_1 \times D_1
    フィルタサイズ: F
    スライド幅: S
  • 出力: W_2 \times H_2 \times D_2
    W_2 = (W_1 − F)/S + 1
    H_2 = (H_1 − F)/S + 1
    D_2 = D_1

となります。しかし、Poolingという操作はあまり人気がないらしいのでスライド幅の大きい畳み込みで対処するようです。

最後に次のリンクが非常に参考になるので見てみてください。

 

本日はここまでです。でわ。