「StanとRでベイズ統計モデリング」のメモ
StanとRでベイズ統計モデリング (Wonderful R)
- 作者: 松浦健太郎,石田基広
- 出版社/メーカー: 共立出版
- 発売日: 2016/10/25
- メディア: 単行本
- この商品を含むブログ (10件) を見る
確率的プログラミングとは
随所で「確率的プログラミング」という言葉を見かけ、気になっていたので本書を読んだ。そのときのメモ。 最初、この単語は確率論を考慮したプログラミングを指すのか?と思っていたがそうではなく、ベイズ統計モデリングをするための言語とのことだった。
数理最適化計算のためのモデリング言語でAMPLというのがあるが、それの確率モデリング版と考えるのがしっくりきた。「確率的プログラミング」でなく「ベイズ統計モデリング言語」と呼んだ方が誤解がない気もする。その意味で、本書のタイトルは的を射ている。
既存の確率的プログラミング言語の例は以下の通り。
何がうれしい?
確率的プログラミング言語の良いところは、使用者がモデリングに集中できるところ。従来だと式の導出などが手間だったらしいが、それをうまく隠蔽できている。
深層学習用のライブラリが、誤差逆伝播時の自動微分を隠蔽しているようなものと理解した。
本書の主張
本書で一番主張したいことは、「ベイズ統計モデリングは以下の手順で実施すると大抵うまくいく。」ということだと理解した(もちろんRやStanといったツールは何でもよいが)。
- 解析目的の定義
- データの分布の確認
- データ生成原理の想像
- モデル式の記述
- Rでのモデル式のシミュレーション
- Stanでモデルを実装
- 推定結果の解釈
- 図によるモデルの妥当性確認
この手順に沿ったベイズ統計モデリングの例が、本書には数多く掲載されている。 理論というよりも実践寄り。 ベイズ統計の理論面は、以下のウェブサイトで紹介されている本を読めば理解できそう(須山ベイズ:ベイズ推論による機械学習入門 、渡辺ベイズ:ベイズ統計の理論と方法)。
階層モデル
グループ差や個人差(グループ、個人に由来する差異)をうまく扱うための手法の一つ。 「グループ差を表すパラメータはグループ内で類似しており、特定の分布(正規分布)などから生成される」という仮定を置いてモデリングする。 これにより、たとえ特定グループのデータが少なかったとしても精度の高いモデリングが可能となる。 グラフィカルモデルで見ると、説明変数/決定変数間の関係が階層化されているため、階層モデルと呼ばれる。
伝統的な統計論とベイズ統計との違い
思想
伝統的な統計論(頻度論)と、ベイズ統計との思想の違いは以下のページが詳しい。 前者は真のパラメータはひとつだけ存在するという思想であり、後者は、確率的にパラメータが決まるというものである。したがって、前者ではというような表記はしない(これをやった場合、パラメータを確率変数としてみなすことになるため)。
ベイズ推定、最尤法、最小二乗法の違いは、以下のページがよくまとまっている。 一般性が高い順に並べると以下の通り。
ベイズ推定>最尤法>最小二乗法
つまり、最尤法はベイズ推定で、ある仮定を置いた特別な場合に相当する。 以下引用。
最尤推定 = 事前分布が一様であるBayes推定
信頼区間
本書でも言及があるが、信頼区間の意味は直観的でない。 「サンプルをとる→パラメータの推定区間作成」というのを繰り返したとき、真のパラメータが推定区間内に含まれる確率が95%という意味。 以下のサイトの図を見ると理解が進む。
19-3. 95%信頼区間のもつ意味 | 統計学の時間 | 統計WEB
事後分布の両端からα/2%の面積を切り取って、残った中央部の(1-α)%に対応する区間を(1-α)%ベイズ信頼区間と呼ぶ。
その他メモ
尤度と事後分布
事後分布と尤度がごっちゃになったのでメモ。
文字の定義
- :パラメータ
- :得られたデータ
尤度と事後分布
- ):尤度。パラメータの候補に対し、それがデータにどれだけフィットするかを表す。最尤推定で使う指標。和が1でないので確率ではない。
- :事後分布。データが与えられたもとで、パラメータはどういう分布を取るかの確率密度を表す。
ベイズの定理より なので、事後確率最大推定値(MAP推定値)は、パラメータに関しての情報がないとき、最尤推定の結果と一致する。
機械学習のための連続最適化 まとめ
書籍「機械学習のための連続最適化」を読んでいる途中ですが、自分用にまとめます。 1、3、9、10章は個人的に目新しさがなかったので省略。 随時追記予定。
2019/2/10: 2章を加筆、11、12章を追記しました。
機械学習のための連続最適化 (機械学習プロフェッショナルシリーズ)
- 作者: 金森敬文,鈴木大慈,竹内一郎,佐藤一誠
- 出版社/メーカー: 講談社
- 発売日: 2016/12/07
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
2章:基礎事項
リプシッツ連続
関数がリプシッツ連続であるとは、
が成り立つこと。
一階微分の絶対値が有限とみなすと覚えやすい。
γ平滑
勾配がリプシッツ連続性
を満たすとき、を-平滑関数という。
二階微分が有限。
アフィン包
集合を包むような超平面で次元が最小になるもの
例えば、集合が二次元でものように一次元的に点が並んでいれば、その直線がアフィン包になる。
相対的内点
集合の相対的内点はなどと書かれる。 内点と比較して考えるとわかりやすい。
内点:ε近傍(中心がで半径εの円)がSに含まれるようなε近傍が存在するとき、点を内点という。
相対的内点:アフィン包とε近傍との共通集合が、Sに含まれるようなε近傍が存在するとき、点を相対的内点という。
相対的内点ではアフィン包との共通集合をとっているために、相対的内点ではあるが内点ではない点というのが存在する。 例えば、だが、の制限が有り、点が平面に拘束される場合を考える。この場合、方向にから少し(たとえεでも)ずれると、そこはに属さないため、内点は存在しない。 だが、アフィン包(この場合は平面)とε近傍との共通集合である相対的内点は存在する。
以下の記事は例が豊富でとてもわかりやすい。 seetheworld1992.hatenablog.com
相対的内部の扱いどころは、Wikipedia大先生が詳しい。
相対的内部は(中略)高次元空間内の低次元集合を扱う際にしばしば有用となる
エピグラフ
関数のエピグラフは以下のように定義される、「ある関数の上側の領域」。
凸関数のエピグラフが空集合でないとき、を真凸関数という。 真凸関数であることは、となるが存在することと同値。
By Eli Osherovich - 投稿者自身による作品, CC 表示-継承 3.0, Link
上図はエピグラフ (数学) - Wikipedia)より引用。
エピグラフが閉集合の時、を閉凸関数という。 閉凸関数であることは、凸関数が下半連続であることと同値。
下半連続
下半連続の概念は、Wikipediaの説明と図が理解しやすい。
半連続性(英: semi-continuity)とは、拡張実数値関数(値として[tex] \pm \infty]を取り得る)に対して定義される「連続性」よりも弱い性質である。
By Mktyscn - 投稿者自身による作品, パブリック・ドメイン, Link
上図は、で下半連続である関数を示している。半連続 - Wikipediaより引用。
がで下半連続であることは、数式では次のように書ける。
定義域の全ての点で下半連続となる関数を、下半連続関数という。
共役関数
真凸関数に対して次式で定義される関数のこと。
の接平面の情報を保持している。 双対上昇法で出てくる。
劣微分
勾配の概念を拡張したもの。微分可能とは限らない凸関数にも微分を定義できる。 凸関数が微分可能なら劣微分はその勾配に一致するが、そうでない場合は、劣微分は一般に集合となる。
4章:勾配法の基礎
直線探索
1変数関数の最小値を見つけるための計算法を直線探索法という。
関数値が十分に減少したかを判定するための条件がいくつか提案されている。
- アルミホ条件
- ウルフ条件
- 強ウルフ条件
- ゴールドシュタイン条件
アルミホ条件を用いて直線探索を行う方法の一つが、バックトラッキング法。
ゾーテンダイク条件
この条件が成り立つ関数を最小化する場合、最適化アルゴリズムが設定する降下方向と、目的関数の勾配方向が直交しなければ(ならば)、初期解に依存せずに、目的関数の勾配がゼロベクトルに収束(大域的収束)する。
したがって、最適化アルゴリズムの収束性を議論する際には以下の条件を示すことが多い。
座標降下法
目的関数を、各座標軸に沿って最適化していく手法。
最急降下法
関数を一次近似したときに、関数値が最も減少する方向であるの方向を探索する。
5章:ニュートン法
ニュートン法
おなじみニュートン法。関数を二次近似したときに、関数値が最も減少する方向を探索する。
ただし、ヘッセ行列が正定値でない場合、関数が減少しない。
修正ニュートン法
ヘッセ行列を修正し、確実に目的関数を減少できるようにした方法。
の最小固有値がのとき、をより大きくとれば、正定値性が保証される。
ガウスニュートン法
目的関数が次のように二乗の形で表されるときに使える。 目的関数を一次近似したときの線形最小二乗解の方向へ探索する。 Introduction to Applied Linear Algebraの説明の方がわかりやすい。
レーベンバーグ・マーカート法
ガウスニュートン法とレーベンバーグ・マーカート法の関係は、 ニュートン法に対する修正ニュートン法の関係と同じで、 正定値性を保証する修正を加えたもの。 Introduction to Applied Linear Algebraでは、 別の解釈が紹介されている。 すなわち、ガウスニュートン法で解く線形最小二乗問題の目的関数に、 との距離を小さくするという評価項を加えたものだと説明されている。
自然勾配法
距離構造が、ユークリッド距離でなくヘリンジャー距離で表される場合に用いる最適化手法。 機械学習屋さんは使うんですかね。。
6章:共役勾配法
目的関数が楕円のような形状をしている場合、最急降下法では効率的に最適化できない。 共役勾配法では、座標変換により楕円を真円に補正することで、この課題を解決している。
7章:準ニュートン法
ニュートン法の実行にはヘッセ行列を計算する必要があり、計算コストがかかる。 これを回避するために考えられた、ヘッセ行列を低計算量で模擬する方法が準ニュートン法である。 近似ヘッセ行列(正確にはその逆行列)は、漸化式の形で毎ステップ計算できる。
BFGS法、DFP法
目的関数の勾配:をまわりで1次近似した式を、近似ヘッセ行列が満たすべき拘束条件として扱う。 →セカント条件:式(7.2)
セカント条件を満たす正定値行列のなかで、今の近似行列に最も「近い」ものを次ステップの近似行列とする。
- 定式化:式(7.6)
- 本書では、主にKLダイバージェンスを使って「近さ」を定式化する
- 距離の公理を満たす基準を用いた場合→7.2.3節
距離基準としてKLダイバージェンスを採用した場合の解:BFGS公式、DFP公式:式(7.3), (7.4)
- ダイバージェンスをとる順番で、得られる公式がBFGSかDFPか決まる:式(7.8), (7.9)
- 図示:図(7.1)
- BFGSとDFPは相補的な関係:をBFGSで更新したとき、はDFPで更新されている。したがって、を計算した後にその逆行列を求める、といった回り道はせず、直に欲しい値:を公式で計算すればよい
- 行列の更新則は、座標変換に関して共変的(座標変換してから更新しても、その逆順でも、得られるは同じ)
L-BFGS法
BFGS:の計算量に加え、行列を記憶できるだけのメモリ容量が必要だが、が大きくなったとき、これらは現実的でない。 そこで計算量、必要なメモリ量がともになL-BFGS法が提案されている。 が記憶しておくべきベクトルの本数。 次元が数千の問題に対しては、程度で良好な結果が得られるとのこと。
8章:信頼領域法
信頼領域法ではまず、目的関数をモデル関数(通常、二次関数)で近似する。 次に、この近似が妥当な範囲(信頼領域)内でモデル関数を最適化する。 すなわち、次の2次関数の制約付き最適化問題を逐次解いていく形になる。
信頼領域は繰り返し計算中で一定ではなく、モデル関数が目的関数をよく近似できるようであれば大きくし、そうでないようであれば小さくする。
11章:主問題に対する最適化法
有効制約法
まず、有効制約式について説明する。 有効制約式とは、不等式制約()ありの最適化問題の実行可能解に対して、を満たす制約式の集合をいう。 実行可能解で等式が成り立っていない制約はの近傍では考慮する必要がないため、このような区別は有用である。
それでは、有効制約法の実行手順について説明する。テキストの図11.1を見ると理解が進む。なお、制約は線形不等式制約を仮定する。
- 有効制約を一定に保ったまま(有効な制約の直線上を滑らせ)、目的関数がこれ以上小さくならない点まで解を更新する。
- 有効制約のうちの幾つかを外し、の方向へ解を更新することで目的関数を小さくすることができるのであれば、そのように解を更新する。無理ならそこで終了。
- 手順2で更新する場合、別の制約に引っかかるか、あるいはの最小値を見つけるかするまで解を更新する。別の制約に引っかかった場合は、それを有効制約に加え、1へ戻る。の最小値が見つかったらもちろん終了。
ペナルティ法
目的関数を修正し、制約なし最適化問題として扱う手法。 具体的には、ペナルティ関数と呼ばれる非負値連続関数を目的関数に次のように加える。
等式制約に対してよく用いられるペナルティ関数は制約の二乗和。 ペナルティ関数を絶対値の和とした手法は正確なペナルティ関数法と呼ばれる。 通常のペナルティ法では、を徐々に大きくして最適化問題を繰り返し解く。 だが、を十分に大きくしないと元の問題の最適化問題の解が求まらない一方で、が大きいと最適化が困難になるというジレンマが存在する。 正確なペナルティ関数法では、ある程度大きなパラメータに対して1回だけ最適化を行えば、元の問題の局所解を得ることができる。
バリア関数法
方針はペナルティ法と同じ。 となる境界の点で無限大に発散する罰則項(バリア関数)を目的関数に加える点が異なる。 こちらも最適化問題を繰り返し解くが、ペナルティ法とは違い、途中でイテレーションを止めてもそれまでで最も良い実行可能解が得られるとのこと。つまり、繰り返しは必要ないと思われる。テキスト上に記載はないが。
12章:ラグランジュ関数を用いる最適化法
双対上昇法
主問題を変換し、双対問題を解くことに帰着させた最適化手法。 繰り返し計算の中で、主変数と双対変数(ラグランジュ変数)が交互に更新される。このような手法は主双対法と呼ばれる。
以下のように目的関数が和の形で表される場合、をそれぞれ独立して動かして最適化すること(双対分解)が可能なため、本手法の有用性が高い。
conda-forgeからのPythonパッケージインストール
conda-forgeからPythonパッケージをインストールする際、conda install -c conda-forge hogehoge
としたら要らないパッケージまでインストールされそうになったのでメモ。
2020/1/1 追記
このページは割と見られているようなので、公式のインストール手順ページへのリンクも貼っておく。
A brief introduction — conda-forge 2019.01 documentation
2019/11/3 追記
本記事の手順でパッケージインストールすると、conda-forge由来のパッケージと、anaconda由来のものが混じる。 パッケージによってはこれがバグ(おそらく実行時にエラーがでる)を引き起こすこともあるので注意。 例えば、geopandasなど。詳細は以下。 qiita.com
個人的には、conda-forge由来のパッケージを一つでも使う場合には、すべてのパッケージをconda-forge由来にしたほうがよいのではと感じる。 conda-forge onlyで困ったことはないし。
まとめ
conda config --append channels conda-forge
してからconda install hogehoge
する- 最初のコマンドは、初めてconda-forgeからインストールするときに必要。2回目以降は不要。
解決法
conda install -c conda-forge hogehoge
とするとconda-forge
チャンネルの優先度がデフォルトチャンネルよりも高くなってしまうことが原因ではないかと考えている。そこで、
conda config --append channels conda-forge
とコマンドを打ち、conda-forge
を低優先度でチャンネル追加したのちに
conda install hogehoge
とパッケージをインストールすればよい。
チャンネル追加は一度やれば十分なので、次からはinstall
コマンドを打つだけでよい。
実行例
不要なパッケージがインストールされそうになる例
PS C:\Users\USER> conda install -c conda-forge tensorboardx Solving environment: done ## Package Plan ## environment location: C:\Users\USER\Miniconda3 added / updated specs: - tensorboardx The following packages will be downloaded: package | build ---------------------------|----------------- certifi-2018.11.29 | py37_1000 144 KB conda-forge python-3.7.1 | hc182675_1000 20.9 MB conda-forge tensorboardx-1.6 | py_0 63 KB conda-forge cryptography-2.3.1 |py37h74b6da3_1000 506 KB conda-forge openssl-1.0.2p | hfa6e2cd_1002 5.4 MB conda-forge qt-5.9.6 | vc14h1e9a669_2 93.9 MB protobuf-3.6.1 |py37he025d50_1001 515 KB conda-forge conda-4.5.12 | py37_1000 660 KB conda-forge ca-certificates-2018.11.29 | ha4d7672_0 179 KB conda-forge libprotobuf-3.6.1 | h1a1b453_1000 2.0 MB conda-forge ------------------------------------------------------------ Total: 124.2 MB The following NEW packages will be INSTALLED: libprotobuf: 3.6.1-h1a1b453_1000 conda-forge protobuf: 3.6.1-py37he025d50_1001 conda-forge tensorboardx: 1.6-py_0 conda-forge The following packages will be UPDATED: ca-certificates: 2018.03.07-0 --> 2018.11.29-ha4d7672_0 conda-forge certifi: 2018.11.29-py37_0 --> 2018.11.29-py37_1000 conda-forge conda: 4.5.12-py37_0 --> 4.5.12-py37_1000 conda-forge The following packages will be DOWNGRADED: cryptography: 2.4.2-py37h7a1dbc1_0 --> 2.3.1-py37h74b6da3_1000 conda-forge openssl: 1.1.1a-he774522_0 --> 1.0.2p-hfa6e2cd_1002 conda-forge python: 3.7.2-h8c8aaf0_0 --> 3.7.1-hc182675_1000 conda-forge qt: 5.9.7-vc14h73c81de_0 --> 5.9.6-vc14h1e9a669_2 Proceed ([y]/n)? n
以下のやりかただと、最小限のインストールで済む
PS C:\Users\USER> conda config --append channels conda-forge >> PS C:\Users\USER> conda install tensorboardx Solving environment: done ## Package Plan ## environment location: C:\Users\USER\Miniconda3 added / updated specs: - tensorboardx The following packages will be downloaded: package | build ---------------------------|----------------- tensorboardx-1.6 | py_0 63 KB conda-forge libprotobuf-3.6.1 | h7bd577a_0 1.9 MB protobuf-3.6.1 | py37h33f27b4_0 514 KB ------------------------------------------------------------ Total: 2.5 MB The following NEW packages will be INSTALLED: libprotobuf: 3.6.1-h7bd577a_0 protobuf: 3.6.1-py37h33f27b4_0 tensorboardx: 1.6-py_0 conda-forge Proceed ([y]/n)?
参考
以下のページがよくまとまっている。 devlights.hatenablog.com
Introduction to Applied Linear Algebra まとめ
My Enigmaさんに触発されてIntroduction to Applied Linear Algebraを読んだのでそのメモ。 ベクトル、行列のあたりは知っていることが多かったので、最小二乗法だけまとめます。
本の内容はPDFファイルで公開されているので、興味のある人は以下のURLから見てください。 http://web.stanford.edu/~boyd/vmls/vmls.pdf
Introduction to Applied Linear Algebra: Vectors, Matrices, and Least Squares
- 作者: Stephen Boyd,Lieven Vandenberghe
- 出版社/メーカー: Cambridge University Press
- 発売日: 2018/06/07
- メディア: ハードカバー
- この商品を含むブログを見る
線形最小二乗法
最適化すべき変数をとして、以下の問題を考える。
この問題の解は、変分法によって以下のように求められる。
ここでは の擬似逆行列である。
等式拘束条件がある場合も、線形最小二乗法なら結局のところ擬似逆行列を使う方法に帰着できるので、擬似逆行列が線形最小二乗法のキモと言える。
非線形最小二乗法
以下の問題を扱う。
はともに非線形関数である。 このような場合、線形最小二乗法の場合とは違い、繰り返し計算で解を求めていくしかない。
拘束条件がない場合に、非線形関数の二乗値を最小化する手法として、Gauss-Newton 法とLevenberg-Marquardt 法が紹介されている。 これらは非線形関数を逐次的に一次近似して、線形最小二乗法で求めた解で状態変数を更新していく手法である。 Gauss-Newton 法に計算を安定させるための工夫を施したのがLevenberg-Marquardt 法という位置づけ。
ちなみに、本書では、変数(ラグランジュ乗数ではない)の導入は、現在のステップの解と次のステップの解の差を小さくするためのものと位置付けられている一方で、書籍「機械学習のための連続最適化」では、正定値性を保証するものとして紹介されている。
また、Newton法は、目的関数のヤコビアンが正方行列のとき、すなわち目的関数の入出力次元が一致するときのGauss-Newton法の特別な形としてみなせるとして紹介されている。
等式拘束条件がある場合のアルゴリズムとしては、ペナルティ法と拡張ラグランジュ法が紹介されている。 前者は、拘束条件を評価関数の中に組み込み、拘束条件なしとして問題を解く手法である。 後者では、通常のラグランジュ関数ではなく、拡張ラグランジュ関数を最小化する問題を解く。 制約なしとみなして次ステップの状態変数を決定するという点はペナルティ法と似ているが、拡張ラグランジュ法では、最適性条件を満たすようにラグランジュ乗数を決定する点が異なる。 拡張ラグランジュ法の方がよりよい結果を得られるとのこと。
正直、僕の説明よりも以下の金森先生の資料の方がわかりやすい。 3ページ目の3. 乗数法 の項に記載がある。
数理情報学演習 I 第 10 回 等式制約あり最適化問題の解法 – 拡張ラグランジュ関数と乗数法 –
雑記
- 作成したモデルに過学習が起きているかどうかを調べるには、データを訓練データとテストデータに分けるとよい。両者の誤差に乖離(訓練データの誤差の方が小さい)があれば、過学習が起きている。
- 機械学習でデータを訓練用&テスト用に分けていた意味がようやくわかった。。
- 非線形最小二乗法でMNISTを分類すると、人間と同じくらいの性能(誤答率2%)が出る
- 19.4節の車の非線形制御問題の運動方程式の導出:
https://www.springer.com/cda/content/document/cda_downloaddocument/9783319247274-c2.pdf?SGWID=0-0-45-1532785-p177708750のp.12、2.1.4節参照
- 後輪速度、かつ後輪周りの角速度で走行している車の前輪速度はどうなるか?を考えると理解しやすい
- 前輪速度もでは?と勘違いしていたので理解に時間がかかった
参考
既存conda環境へのJulia (v1.0.3)のインストール
JuliaからPythonを呼び出す場合、Juliaはcondaを自動的にインストールする。 だが、自分の環境には既にcondaが入っていたため、これをJulia側に認識させる方法をまとめた。
まとめ
前提
- OS:Windows 10
- Julia: v1.0.3
手順
- MinicondaとJuliaをインストール
CONDA_JL_HOME
にcondaのルート環境へのパス(例:C:\Users\USERNAME\Miniconda3
)を設定- 好きなエディタでプログラミングする(VS Code + julia-vscodeなど)。
注意点
CONDA_JL_HOME
にはcondaで作成した仮想環境も設定できる(例:C:\Users\USERNAME\Miniconda3\env\conda_jl
)。
だが、この設定でPythonライブラリを呼ぶとエラーがでる。
例えば、以下のコードを実行したときにnumpy
が見つからないというエラーを吐く。
using PyCall @pyimport numpy
したがって、 CONDA_JL_HOME
にはcondaのルート環境(非仮想環境)を設定する必要がある。
実はConda.jlのREADMEに以下のような文言があるが、ここでの"root environment"は、CONDA_JL_HOME
に設定した環境のことだと誤解し、仮想環境でもイケると勘違いしていた。
NOTE: If you are installing Python packages for use with PyCall, you must use the root environment.
Juliaを使ってみての所感
My Enigmaさんに触発されてIntroduction to Applied Linear Algebraを読み、そのサンプルコードを実行してみただけだが、現在までのJulia + julia-vscodeに対する所感を書く。
- サンプルコードを実行しただけなので、Juliaの速さは感じられなかった。。
- julia-vscodeは、インストールするだけで他に設定なしにVS CodeでJuliaが使えるようになるので便利
- julia-vscodeにデバッグ機能がないのは辛い。デバッガが付けば、MATLABからの乗り換え用に布教したい
参考
- Conda.jlのREADME github.com