2021年2月2日火曜日

ベイズ学習の枠組み②

 前回の投稿では、ベイズ学習は以下の2ステップで行っていくことを述べた。

  1. 確率モデルの構築:グラフィカルモデルなどを利用しながら、事象の同時確率を定式化する。
  2. 推論:上で定式化した同時確率分布と、その未知のパラメータに対する周辺確率から事後確率を求める
実際にこのステップに従って、非常にシンプルな例の推論を行ってみたい。これによって実際に同時確率と周辺確率を計算することで、事後確率が推論できることが実感できるとおもう。

ここで考える例は以下のとおり。
例)箱の中のボールの数の推論
ある箱の中にボールが3つ入っている。ボールの色は赤か白のどちらかだが、どの色が何個入っているかはわからない。ここで箱の中からランダムに1つボールを取り出しそのボールの色を確認後箱の中に戻すという操作を行う。
【ケースA】1回の試行で「白」が出た場合
【ケースB】3回の試行で「白→赤→白」が出た場合
の2つの場合で箱の中の白ボールの数がどのように推論できるかを見ていこう。

■【ケースA】1回の試行で「白」が出た場合

上のように、確率モデルの構築→推論とステップを踏んで進めていこう。

▼確率モデルの構築

この場合の事象は下図のようなグラフィカルモデルで表せる。ここで\(W=\{0, 1, 2, 3\}\)は白玉の数を示す確率変数で、\(W\)の値により試行時に取り出される玉の色\(X=\{r, w\}\)の確率が決まるというモデルになっている。

また、簡単な確率の考察からそれぞれの確率は下表のようになる。ここで箱の中の玉の数は何の情報もないため等確率で発生するものとして\(P_0(W)=1/4\)、ここで\(W=\{0,1, 2, 3\}\)としている。この\(P_0(W)\)を事前確率という。

▼推論

「1回の試行で白ボールを取り出した」というデータが確定したもとでの白ボールの数を推論したいので、求めたいのは事後確率\(P(W|X_1=w)\)であり、条件付き確率の定義から
\[P(W|X_1=w)=\frac{P(W,X_1=w)}{P(X_1=w)}=\frac{P(W,X_1=w)}{\sum_W{P(W, X_1=w)}}\tag{1}\]
と書ける。上記の最左辺の分子と分母はこれまでの情報で計算できることがわかると思う。それぞれ求めていってみよう。
分子の同時確率は\(P(W, X_1)=P(X_1|W)P(W)\)であり、\(P(W)_0=P(W)\)とすると、
上の表から以下のように計算できる。
\[\begin{cases}P(W=0, X_1=w) & =P(X_1=w|W=0)P_0(W=0)= 0 \cdot \frac{1}{4} = 0 \\P(W=1, X_1=w) & =P(X_1=w|W=1)P_0(W=1)= \frac{1}{3} \cdot \frac{1}{4} = \frac{1}{12} \\P(W=2, X_1=w) & =P(X_1=w|W=2)P_0(W=2)= \frac{2}{3} \cdot \frac{1}{4} = \frac{1}{6} \\P(W=3, X_1=w) & =P(X_1=w|W=3)P_0(W=3)= 1 \cdot \frac{1}{4} = \frac{1}{4} \\\end{cases}\]

また(1)式の分母である周辺確率は
\[P(X_1=w)=\sum_{W}P(W, X_1=w) = 0+ \frac{1}{12} + \frac{1}{6} + \frac{1}{4} = \frac{1}{2}\]
となり、同様に\(P(X_1=w)=\frac{1}{2}\)となる。

(1)式にこれらの結果を代入すると
\[\begin{cases}P(W=0|X_1=w) & = 0 / \frac{1}{2} = 0\\ P(W=1|X_1=w) & = \frac{1}{12} / \frac{1}{2} =\frac{1}{6}\\ P(W=2|X_1=w) & = \frac{1}{6} / \frac{1}{2} =\frac{1}{3}\\ P(W=3|X_1=w) & = \frac{1}{4} / \frac{1}{2} =\frac{1}{2}\\ \end{cases}\]
となり、1回目に白ボールが出た場合、確率的には箱の中のボールは全部白の可能性が一番高いと推論できることを示している。

■【ケースB】3回の試行で「白→赤→白」が出た場合

ケースAと同様の考察を繰り返すと良いが力尽きたので気が向いたら追記予定。
要点は、ボールを試行の度に箱に戻すため、Wが決定された状態では、各試行間は独立なので\[P(X_1,X_2,X_3)=P(X_1)P(X_2)P(X_3)\]
となることを利用すれば良い。

2021年2月1日月曜日

ベイズ学習の枠組み①

ベイズ学習は、観測できない未知の変数\(W\)の確率分布\(P(W)\)を、観測された事象(データ)\(D\)が得られたという条件のもとで推論するものです。すなわち事後分布\(P(W|D)\)を求める作業になります。

例えば、赤玉と白玉が入っている箱がありそれぞれの色の個数の割合\(\theta\)が未知である場合、その\(\theta\)の確率分布\(P(\theta)\)を箱から無作為に取り出した玉の色のデータ\(D\)を得られた事実をもとに推論する、すなわち\(P(\Theta|D)\)を計算するというようなものになります。

もう1つの例としては線形回帰\( y=\boldsymbol{w} \cdot \boldsymbol{x} +b\)の学習パラメータ\(\boldsymbol{w}\)、\(b\)を未知の変数としその確率分布\(P(\boldsymbol{w})\)、\(P(b)\)を観測データ\(D\)から求める、すなわち\(P(\boldsymbol{w}|D)\)、\(P(b|D)\)を計算するというものが挙げられます。

ベイズ学習は一般的に以下の2つのStepで行っていくといえます。

▼ Step1:確率モデルの構築

まず、着目する事象が確率的なプロセスから発生するものだという仮定を置き、そのプロセスをモデル化することから始めます。モデル化には事象間もしくは変数間の関係性をグラフ表現するグラフィカルモデルが有用です。
また事象の確率プロセスがモデル化できるとそれはすなわち変数間の同時確率分布を定式化することになります。
例えば上の赤玉と白玉の割合の例の場合、下左図のようにモデル化することができます。
下図はすなわち、赤玉と白玉の割合自体も確率的に決まっており(\(P(\Theta)\))、そこから取り出される玉の色は玉の割合が\(\theta\)と決まった上での条件付き確率で表されるとモデル化していることになります。
また、線形回帰の例の場合も下右図のようにモデル化することができます(*)。未知のパラメータが確率的に決まっているものとし(\(P(\boldsymbol{w})\)、\(P(b)\))、かつ、データ自体も確率的に発生し、目的変数はそれら確率変数が決定された上での条件付き確率として表現できるというモデリングを行っています。


▼ Step2:推論

Step1で確率モデルが構築できたら、そのモデルと観測データから未知のパラメータの確率分布を推論します。これはすなわち冒頭での話のとおり、観測データ\(D\)を得た条件下で未知のパラメータがとる条件付き確率\(P(W|D)\)を推論することに相当します。
ではこの\(P(W|D)\)はどう計算すれば良いのかを考えていきましょう。条件付き確率の定義から
\[P(W|D)=\frac{P(W,D)}{P(D)}=\frac{P(W,X)}{\sum_W P(W,X)}\]
と書き換えられます。
分子の同時確率はStep1の確率モデルの構築ができた時点で定式化されており求めることができるし、分母は未知のパラメータの取りえる値全てに関して同時確率を足し合わす(周辺化する)ことで求められます。

つまりこの式は、どのような確率モデルの例であっても、同時確率とその未知のパラメータに対する周辺分布を計算することで事後分布\(P(W|D)\)を推論可能であるということを示していることになります。

実際の複雑な確率モデルを扱う場合、周辺確率を求めるのに非常にコストがかかるためサンプリングや変分法と呼ばれる近似手法によって事後分布を計算するケースが多いですが、おおもとのベイズ学習の発想は「同時確率とその未知のパラメータに対する周辺分布から事後分布を計算する」ということにあることは覚えておいた方が良いでしょう。

次回は、非常に単純なモデルを例に、同時確率とその周辺確率から実際にベイズ推論を行う例を見たいと思います。

2021年1月17日日曜日

Artificial Life(ALife)とはなにか?

 最近、ちょくちょくと人工生命(Artificial Life: ALife)というワードを聞くようになった。単語から読み取れるところなんとなくイメージできるけど、具体的にどういう研究なのか?どういう応用が期待できるか?人工知能(AI)と何が違うのか?などのイメージが沸かない。

ここここの記事がその疑問を少し解決してくれたので改めて整理したい。

■ キャッチフレーズは "Life as it could be."

人工生命のキャッチフレーズは"Life as it could be"、すなわち「あり得たかもしれない生命」などと言われるらしい。なるほど実際に地球上に存在する(していた)生物について研究する生物学とは異なり、よりメタ的な生命を研究する。つまり「生命」と呼べるものがもつ一般的な性質(生命であるための必要条件)を探ろうという学問と考えられる。そしてその必要条件が何かを探るために、構成論的にボトムアップで生命を作っていこうする。これは意識とは何かを探る、谷口忠大先生の記号創発ロボティクスとアプローチが似ている。


■人工知能との違い

人工知能は人間の知性すなわち、大脳新皮質の部分の役割にフォーカスしているのに対して、人工生命は身体知や生命維持など脳幹が司る知能にフォーカスを与えている。
さらに私が最もガッテンしたのが、適用方法の違い。人工知能は学習、人工生命は「進化」という違いがある。学習はある程度収束するものであるが、進化は終わりなき進化を続けていく(Open-ended evolution)。そして学習が個の範囲で閉じるのに対して進化は集団として個が相互作用しながら長期的、永続的に進んでいくものである違いがある。

少しづつ勉強を進めていこう。

2020年11月15日日曜日

分散や標準偏差のオンライン計算 → Welfordアルゴリズム

データが逐次追加されていく際に、追加されるたびにその時点での「分散」や「標準偏差」を計算したい場合がある。その時点での全てのデータから毎度計算しても良いが、やはり計算量が馬鹿らしい。そこで欲しくなるのが、これらの量をオンライン(ストリーム処理)で計算できるアルゴリズムだ。

安心してください、ありますよ。「Welford アルゴリズム」というものです。

ここではそのWelfordアルゴリズムを紹介したい。

※以下、不偏分散を考えるが、標本分散の場合でも全く同じ考えが出来る。

■分散と標準偏差

データサンプルが\(x_i, \ldots, x_N\)で与えられる場合を考えられる。この時、データの不偏分散\(s^2\)の定義は

\[s^2 = \frac{\sum_{i=1}^N (x_i – \bar{x})^2}{N-1}\]

として与えられる。そして標準偏差\(s\)はその平方根\(s = \sqrt{s^2}\)だ。

ここで\(\bar{x}\)はサンプルの平均、すなわち\(\bar{x} = \frac{1}{N}\sum_{i=1}^N x_i\)である。

この定義通りに分散を計算する場合、以下の2ステップを辿る。

  1. データ全体の平均\(\bar{x}\)を計算。
  2. 各データ\(x_i\)と平均\(\bar{x}\)の差分の二乗を計算。
このような計算は明らかに無駄が多い。まずデータ全体を舐める計算を2回も繰り返す必要がある。また、データ全体に対する計算を行うためにすべてのデータを保持しないといけないので今回の主題であるオンラインの計算をするためにはこのままではダメだ。何か工夫がいる。

■Welfordアルゴリズム

そこでWelfordアルゴリズムでは、サンプルが\(N\)個の時と\(N-1\)個の時の分散の差に着目して以下の計算を行う。

\begin{align} &(N-1)s_N^2 – (N-2)s_{N-1}^2 \\ &= \sum_{i=1}^N (x_i-\bar{x}_N)^2-\sum_{i=1}^{N-1} (x_i-\bar{x}_{N-1})^2 \\ &= (x_N-\bar{x}_N)^2 + \sum_{i=1}^{N-1}\left((x_i-\bar{x}_N)^2-(x_i-\bar{x}_{N-1})^2\right) \\ &= (x_N-\bar{x}_N)^2 + \sum_{i=1}^{N-1}(x_i-\bar{x}_N + x_i-\bar{x}_{N-1})(\bar{x}_{N-1} – \bar{x}_{N}) \\ &= (x_N-\bar{x}_N)^2 + (\bar{x}_N – x_N)(\bar{x}_{N-1} – \bar{x}_{N}) \\ &= (x_N-\bar{x}_N)(x_N-\bar{x}_N – \bar{x}_{N-1} + \bar{x}_{N}) \\ &= (x_N-\bar{x}_N)(x_N – \bar{x}_{N-1}) \\ \end{align}

この結果から、下式のようにデータが\(N\)個の時の分散を\(N-1\)個の時の分散から求められることがわかる。

\[ s_N^2 = \frac{N-2}{N-1} s_{N-1}^2 + \frac{1}{N-1} (x_N-\bar{x}_N)(x_N – \bar{x}_{N-1}) \]

この結果をもとに分散をオンラインで計算するアルゴリズムに落とすと、下の疑似コードのようになる。(forで各データを逐次回している部分がそれだ)

驚くほど簡単なアルゴリズムだ。

■ライブラリ

簡単なので必要に応じて自分で実装すれば良いが、Python用のライブラリを作ってPypiに登録してみたのでよければそれを使ってみてください。改良点があればGithubリポジトリにIssue投げて頂ければ嬉しいです。


■参考

2020年11月14日土曜日

Gradient Boosting(勾配ブースティング)とは

最近、Kaggleだとかその周辺では、XGboostだとかcatboostだとか、Gradient Boosting(勾配ブースティング)の手法が流行っているらしい。最終的にcatboostを勉強する目的で、その前段階として勾配ブースティングをひととおり勉強したので、そのメモ。

■Boosting(ブースティング)とは?

ブースティングとはアンサンブル学習の一種で、弱学習機を「積み重ねる」ことで精度を上げようとするもの。下の図がわかりやすいが、バギングは複数の弱学習機を並列に並べてそれぞれの学習機の結果を平均したり投票したりして最終的な結果を出力するもので、Random Forestが代表的な例。一方でブースティングは複数の弱学習機を「直列」に並べてモデルを強化してあげようという思想のもの。具体的な例としてはLS_boostingが挙げられる。この手法は1つ目の弱学習機での回帰残差を2つめの弱学習機で最小化するようにし、さらにその結果の残差を3つめの弱学習機で最小化するようにし・・・・、というふうに学習機を繋いでいく。
ブースティングのアルゴリズムには幾つか種類があり、代表的なのはAdaboostや今回のトピックである勾配ブースティング。

■勾配ブースティングの概要

勾配ブースティングは、超ざっくりでいうと「前の学習機の誤差を埋めるように次の弱学習機を学習させる」ことをしている。
勾配ブースティングアルゴリズムの疑似コードは以下のようなものだ。

ここで、\(L\)は回帰や分類のLoss関数、\(h\)は個別の弱学習器、\(F_m\)は各弱学習器を統合した(つまり繋いだ)加法モデルを示している。
  • 3行目:それぞれのサンプル(\(i\))についてのLossをその時点(の1つ前)の加法モデルの偏微分(\(F\)を微小変化させた時の\(L\)の変化量)のマイナスを\(\tilde{y}_i\)と計算している。つまりこれはLossを最小にするための勾配降下の方向を示している。
  • 4行目:3行目で求めた勾配降下の方向に最も近くなる修正を加える弱学習器を学習させる。
  • 5行目:4行目で求めた弱学習機をその時点の加法モデルに加える時のパラメータ(学習レート?)を学習。
  • 6行目:4行目と5行目の結果から、加法モデルを決定。
というプロセスを繰り返すアルゴリズムとなっている。
ここで、勾配効果の方向にむけて弱学習器を学習させていくことから「勾配」ブースティングという名前がついているのだ。

■勾配ブースティングの具体例

勾配ブースティング自体は一般的なアルゴリズムのため、そのアルゴリズムの中で利用するLossの種類などは様々なバリエーションが存在する。
最もシンプルな具体的なLossを回帰の二乗誤差とするもので、LS_boosting。
Lossを二乗誤差、つまり\(L(y_i, F(\boldsymbol{x}_i))=\frac{1}{2}(y_i - F(\boldsymbol{x}_i))^2\)としたときに、3行目の偏微分は
\[\tilde{y}_i= - \left[\frac{\partial L}{\partial F}\right] _{F=F_{m-1}}= - \left[\frac{\partial \frac{1}{2}(y_i - F)^2}{\partial F}\right] _{F=F_{m-1}} = y_i - F_{m-1}\]
となり、一つ前のイタレーションで作成した加法モデルと実測との残差になる。そのため前述したようにLS_boostingはこの残差を最小化するように次の弱学習器を作成するということになる。

■参考

https://www.st-hakky-blog.com/entry/2017/08/08/092031
https://ticc-econometrics.hatenablog.com/entry/gbdt2#fn-6241a4a1

2020年9月26日土曜日

データは寡黙である。

これまで十数年間、いくつかの企業でデータ分析に携わってきた。その間にビッグデータや人工知能、ディープラーニングというようなバズワードが流行り「データ至上主義」ともいえる風潮が流れ始めているふうに感じる。

 確かに画像などの判別技術や購買予測、レコメンデーション技術など、大量データを学習機に食わせて成果を出している分野もある。

しかし、企業でデータ活用として期待されているのはこれらだけでない。それよりも「現在起きている、または予測されることに対してどのようにアクションとるべきか?」をデータから見出すこと(以降、これを「データからインサイトを得る」と表現する)が求められるケースが圧倒的に多い。

注意が必要なのは、「購買予測をする」ことと「より売上を上げるためにとるべきアクションを見出す」ことは全く異なり、またそれに必要な技術も全く別物であることだ。

典型的で有名な例として「アイスクリーム売上と犯罪発生数の関連性」を挙げてみる。下の左のグラフはある町のアイスクリームの売上と犯罪発生数の関連性を示したものだ。グラフから読み取るにアイスクリームの売上が多い時に犯罪発生数が多い関係性が見て取れる。しかしよく言われるように、これは関連性(相関)があるだけで、決して「アイスクリームの売上が増えたから犯罪発生数が増えた」という原因と結果を示しているわけではない。この裏には下右図のように、「気温」というアイスと犯罪の両者の増減に影響を与える共通の要因(交絡因子)が存在し、気温が暑い時にはアイスクリームの売上が増えるのと同時に、イライラして犯罪数も増えることで、直接関係のないアイスと犯罪に関連性が現れているのである(偽相関)。


この例は2つの重要なことを示している。

1つは、「予測する」と「原因と結果の関係性(因果関係)を分析する」は別物であるということである。図から見て取れるようにアイスの売上を説明変数にして犯罪率を予測することは(ある程度の汎化性をもって)可能である。しかし、だからといって犯罪数を減らすためにアイスの売上を減らす(店舗を閉鎖させる)というアクションは全く有効ではないことは自明であろう。

2つめは、ほとんどの場合にデータのみだけでは因果関係はわからないという事実だ。データからわかるのは事象間の関連性(相関)のみであり、原因と結果の関連性を見出すためには、事象の関係に対するその分野での固有の知識(ドメイン知識)が不可欠である。例えば上の例では、「アイスクリームが犯罪の発生に寄与することはないはずだ」、「両者に共通する要因として気温が考えられる」というという事前知識があるが故に本当の因果関係を見出すことができた。

企業でデータ分析の業務を行っていると、データが大量にあればなんでもわかるという誤った神話に苦労することが多い。データは因果分析においては恐ろしいほど寡黙であり、データにドメイン知識を与えて初めてデータが物事を語り始めるということを認識しないといけない。






2020年7月23日木曜日

RandomForestはホントに交互作用を拾うか?

木構造系のモデルは、分岐の組み合わせにより説明変数間の交互作用もモデルに自動的に組み込まれそうな「気がする」。しかし実際に実際に動かしてそのことを確認した記事がネット上になかったので自分自身で確認することに。

まずはトイデータを用意。ここでX[:, 2]とX[:, 3]が交互作用で目的変数に効くようにしている。X[:, 0]は目的変数には無関係な説明変数。

次に学習&テストデータセットに分けて学習と予測を行って精度評価してみる。
ここでは比較対象として単純な線形回帰モデルも使っている。



なるほど、ほとんど予測できていない線形回帰と比べてRandomForestは精度良く予測できている。

Importanceも一応見てみると、交互作用に関わる変数のImportanceが高くなっている。


以上、当たり前といえば当たり前だけど実際に確認してみた。

ここに元のNotebookを置いています。