以前書いた #Julia言語 版HMC(Hamiltonian Monte Carlo)のサンプルコード

ポテンシャル函数φ(x)から、確率分布p(x)=exp(-φ(x))/Zのi.i.d.サンプルを生成する方法の1つ。

60行程度しかない。 Image
#Julia言語 leapfrog法でHamiltonの正準方程式を解くので、leapfrog法のために必要な情報をLFProblem型の変数に格納し、それをHMC函数に渡すと分布p(x)=exp(-φ(x))/Zのサンプルを返してくれる。

そういうシンプルなコードになっています。

nbviewer.org/github/genkuro… Image
#Julia言語 この手の問題では、ポテンシャル函数φ(x)がパラメータに依存している場合が多いので、ポテンシャル函数はφ(x, param)の形式の函数で与える仕様になっています。

だから、HMC函数および関連の函数にはポテンシャル函数を決めるためのparamを渡す必要があります。

nbviewer.org/github/genkuro… Image
#Julia言語 Juliaでは(constも含めて)グローバル変数を引数を経由せずに函数の中で使うことは損になります。計算速度が落ちたり、柔軟な試行錯誤の可能性が潰されてしまう。

それを防ぐ最も単純な方法は「グローバル変数を使うときには毎回函数に引数として渡す」です。トートロジカルな方法が良い!
#Julia言語 しかし、複数の函数に毎回引数として渡される変数達が多いと面倒になります。

だから、複数の函数に毎回引数として渡される情報達を1つ(もしくは高々2〜3個)の変数にまとめるとよいです。

そのために自前でstructを定義して利用することが多いです。
#Julia言語 コードは

* 問題を記述するための情報を格納するとオブジェクトのコンストラクタ

* 問題を記述する情報を渡すと問題を解いてくれる函数

の形式で整理すると分かりやすくなることが多いです。
#Julia言語 日本に限らず、

* 問題を記述する情報を沢山のグローバル変数にべた書き

* 長大なmain函数で問題を解く

のようなスタイルのコードを書くスタイルの悪しき教育を受けた人達は多く、上で解説したスタイルなどで整理されたコードの書き方が普及するとよいと思います。
#Julia言語 HMCの短いサンプルコード

nbviewer.org/github/genkuro…

で参考になると思われる点は他にもあります。

まず、JuliaにおけるStaticArrays.jlを用いた計算の効率化。Juliaには多彩な配列の型があり、使いこなすと楽に見易く高速なコードを書けます。続く Image
#Julia言語 次に、自動微分!

Hamiltonの正準方程式ではポテンシャル函数φ(x, param)のxに関する導函数(gradient)が必要になります。

手計算でgradientを計算して、それを函数として実装して、問題を記述する情報が格納された変数に格納するのは面倒です。続く#

nbviewer.org/github/genkuro… Image
#Julia言語 φ(x, param)を与えるだけで、そのgradientを丸め誤差を除いて正確にかつ高速に自動的に計算してくれるならば、人間側はgradientを手計算する作業から解放されます。

nbviewer.org/github/genkuro… のサンプルコードでは実際にそれをForwardDiff.jlによる自動微分で実現しています! Image
#Julia言語 シンプルなサンプルコードだけでどれだけのことができるのか?

例1. φ(x) = (x₁² + x₁x₂ + x₂²)/2の場合の分布p(x)=exp(-φ(x))/Z (これは2次元の正規分布になる)のサンプルの生成。

問題を記述するデータを格納した変数lfを

lf = My.LFProblem(2, φ)

で作っています。 Image
#Julia言語 例2. φ(x) = a(x₁² - 1)² の場合の分布p(x)=exp(-φ(x))/Zのサンプルの生成。a=3,4,5,6,7,8の場合を計算しています。

aが大きいほど、2つの山が強く分離されるようになり、偏りのないサンプル生成が難しくなります。 Image
#Julia言語 例3. 正規分布モデルでのベイズ統計

HMC法はベイズ統計での事後分布のサンプルの構成でも役立つ。

面倒なので事前分布はフラット事前分布にしてしまっています(手抜き)。その場合のポテンシャル函数φ(x)はモデルのパラメータxの対数尤度函数の-1倍になります。

nbviewer.org/github/genkuro… Image
#Julia言語 サンプルコード

nbviewer.org/github/genkuro…

はJuliaで効率的に計算するための基礎になる「型安定性」と「アロケーションの削減」もきっちり実現しています。

こういう点も参考になると思います。 Image
#Julia言語 ループの内側でrandn(rng, n)で長さnの配列の乱数を生成すると、毎回その分だけにメモリ割当が発生し、計算効率が悪化してしまいます。

サンプルコードでは randn!(rng, vtmp) の形式で事前割当された配列vtmpに乱数を書き込むことによってそれを防いでいます。

nbviewer.org/github/genkuro… Image
#Julia言語 注意・警告: StaticArrays.jlの使用は長さ30程度の配列を扱う場合程度までは有効ですが、サイズがそれを超えると大幅に遅くなる場合があるので要注意です。

StaticArrays.jlが使えないほど大きな問題では、in-place計算でメモリ割当を削減する必要があります。

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

8 Dec
minimal working examples抜きには曖昧過ぎて微妙に危険な感じ。よい推定、よい予測、よい意思決定の中身が不明過ぎる。

特に「意思決定」という言葉が「推定」や「予測」など任意の行動を決める意味が広い用語になっているせいで、「本当はよい意思決定を目指すべきだ」と誤解する危険性がある。続く
教科書によく書いてある意思決定論では、パラメータ付きのモデル(推定推測推論用のモデル、以下単にモデルという)の内部で「最悪の場合の最善手」(ミニマックス)や「期待リスク最小化」(事前分布を主観確率と解釈すれば主観内で計算した期待リスク最小化)を考えます。
続く。リスクの定義を決める損失函数として「推定の悪さ」「予測の悪さ」の指標にすれば「モデル内でのよい推定」「モデル内でのよい予測」が得られ、仮に「金銭的な損失」の指標にできれば「モデル内での金銭的に最適な意思決定」が得られます。

そういう話は確かに結構面白いです。続く
Read 12 tweets
8 Dec
数学がめちゃくちゃ苦手であっても「3×2だとウサギが3本耳になる」と本当に教えていることに呆れざるを得ないのですが、事情を知らない人の中には、「場面を式に表す」を「場面から数値・数量に関する式を作る」の意味だと誤解して、おかしな教え方を擁護し出すというようなことがあるように思えます。
あと、これは10年前から言っていることですが、「3×2だとウサギが3本耳になる」(算数でもならないし、理科でも国語でもならない(笑))という教え方が論外なことは、数学が苦手でも当たり前に理解できることです。

理系大学教授を持ち出すのはミスリーディング。
通常の批判では「非常識」という言葉は使い難いのですが、算数教育界の伝統が育てたおかしな教え方については例外的に「非常識」という批判は非常に適切であり、社会全体できちんと悪い意味で非常識扱いして行くべきだと思う。

数学がどんなに苦手でもダメだとすぐに分かる非常識な教え方をしている。
Read 8 tweets
7 Dec
統計量の分布をぼーっと眺める 〜中心極限定理観察〜 qiita.com/gilbert_yumu/i… #Qiita @gilbert_yumuより
【中心極限定理の可視化、また母集団によっては成り立たないことの可視化】

#統計 中心極限定理が成立しない場合や成立していても収束が遅い場合も扱っている点が非常に良い。
中心極限定理が特別に非常にうまく行く場合(ベルヌイ分布、一様分布、左右対称な分布の多く)の可視化だけを見て終わりにすると、中心極限定理による近似が小さなnで常に良くなるように誤解してしまうリスクがあると思う。

中心極限定理が成立してかつ収束が遅い場合の可視化は特に重要だと思う。
#統計 和に関する再生性と条件付き分布 qiita.com/gilbert_yumu/i… #Qiita @gilbert_yumuより

これも教育的。条件付き確率分布の計算は基本の1つ。簡単だが、非自明さのある面白い例を紹介している。匙加減が非常によい。
Read 15 tweets
7 Dec
#統計

改訂増補版:統計検定を理解せずに使っている人のために I
池田 郁男
東北大学未来科学技術共同研究センター
Published: 2019-08-01
© 2019 公益社団法人日本農芸化学会
katosei.jsbba.or.jp/view_html.php?…

いやあ、これは色々雑な解説の仕方で頭を抱えた。
#統計

改訂増補版:統計検定を理解せずに使っている人のためにII
池田 郁男
東北大学未来科学技術共同研究センター
Published: 2019-09-01
© 2019 公益社団法人日本農芸化学会
katosei.jsbba.or.jp/view_html.php?…

Welch検定で自由度を四捨五入するのはやめて!

以前にもこれ見た覚えがある。
#統計 不偏分散の平方根は母標準偏差の不偏推定量にならないことは自明。

多分それよりも要注意なのは、不偏分散は緩い条件のもとで任意のi.i.d.サンプルで母分散の不偏推定量になること。これは例外的なので要注意。

一般に不偏推定量は特定のモデル内でしか不偏推定量にならない。
Read 14 tweets
7 Dec
ここ10年で得た情報から、これは非常に納得できる話。

算数教育界には100年以上前から受け継がれて来た子供を害する教え方があるという予備知識があると、教科書の記述の不味さにやっと気付けるのだが、本当にまずい記述であることの決定的な証拠は一般人購入不可の指導書を見ないと得られない。
私企業による単なる出版物なので政府が手を出せない教科書の指導書に教科書の使い方の説明を入れて、さらにその出版物を一般人購入不可&高価にすることによって、全国の小学校の先生への巨大な影響力を行使したままで、子供を害する教え方を広めることができる。

堂々とこれが行われているわけ。
子供相手のことでここまでの無茶が堂々と行われており、何十年ものあいだ完全に放置されている。

さらにそういう無茶をやる人達の後任を育てる社会的仕組みも整備されている。算数教育界伝統の非常識な教え方をマスターした人を社会的に出世させる仕組みがある。

稀に見るひどい話。
Read 4 tweets
6 Dec
#統計 目的が測度論的確率論での条件付き期待値の理解ではなく、数理統計学の場合には、E[g(X,Y)|X]のような記号を使わずに「なるべく積分表記を用いる」という方針がよいと私も思います。

渡辺澄夫『ベイズ統計の理論と方法』のような難しい本の内容でも測度論的確率論は大して重要ではない感じ。 Image
#統計 むしろ統計学で頻繁に現れる確率密度函数があるケースでの条件付き期待値や条件付き確率分布の全部積分で書く扱いを知らずに、測度論的確率論での条件付き期待値の定義を学ぶ方が不健全な勉強の仕方に思えます。

算数レベルの計算の経験抜きに整数論をいきなり勉強するようなもの。
#統計 一度

❌離散分布と連続分布の区別がうざい。確率測度で整理したい。その方針で数理統計学の教科書を徹底的に書き直す。

という悪いアイデアでノートを書き始めてみれば分かるが、統計学的に重要でない話の分量と割合が爆発します。

測度論的確率論と統計学は完全に別の分野。
Read 4 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(