« 「カニちゃんこ、レッドバロン吉田、ヌンク!」(さうして、このごろ2021年5月版) | 最新のページに戻る | 「夜明けの口笛吹き、ゼラニウム・キッス」(さうして、このごろ2021年6月版) »

■ 「自由エネルギー原理FEPチュートリアル2021を開催しました」

2021年12月13日、14日に脳の自由エネルギー原理FEPチュートリアル・ワークショップ2021を開催しました。これは英語での発表、議論となる国際シンポジウムの部分と日本語でのチュートリアルの2パートから構成されております。

私吉田はこのイベントのオーガナイザーの一人であり、さらにチュートリアル(2.5時間*2)の講師を担当しました。そこで私がチュートリアルを準備していたとき、さらに開催後に考えたことをまとめておきたい。

[歴史的経緯]

このイベントは現在CHAINの同僚である島崎秀昭さんといっしょにやってきた一連のイベントの最新回です。

日本神経回路学会の時限研究会として「脳の理論から身体・世界へ: 行動と認識への再挑戦」を開催しました(2017年8月@京大)。このときのオーガナイザーは(当時京大、HRIの)島崎秀昭さんと(当時京大の)大羽成征さんと(当時生理研の)吉田。このときの実施報告

2018年には神経回路学会誌2018年25号3巻での特集「自由エネルギー原理入門」を島崎さんが編集して、私も田口茂さんとともに寄稿してます。このときは京大で集中討論会というのもやっていて、その様子はイントロダクション 特集「自由エネルギー原理入門」に記録されてる。

そして2019年から生理研が属するNINS自然科学研究機構の「分野融合共同研究事業」のサポートを受けるようになって、「脳の自由エネルギー原理チュートリアル・ワークショップ2019」を開催しました(島崎さんと吉田がオーガナイザー)。これは"The free energy principle for action and perception: A mathematical review." (J. Math Psychol. 2017)を書いたサセックス大学のChristopher Buckleyと、彼のラボの大学院生のAlexander Tschantz (ちょうど"Learning action-oriented models through active inference" PLoS Comput Biol. 2020をArXivに出したところだった)によるチュートリアルでした。PythonとGoogle Colabを使ったハッカソン形式になっていて、これは非常に充実していた。

でもって、今回2021年もNINS自然科学研究機構の「分野融合共同研究事業」のイベントとして、「脳の自由エネルギー原理チュートリアル・ワークショップ2021」を開催したというわけです。

[チュートリアルの構想1: 講義パート]

講義の内容については、これまでにこのブログや各所での講演などの資料が蓄積できていたので、それをまとめればなんとかなるだろうと思ってた。たとえばこれまでに作成した資料としては以下がある。

(なお、2017年あたりの資料は古くて間違っているところもあるので、上記のものを参照してほしい。あと、近いうち、今回の講義を踏まえて最新版を作成する予定です。)

とはいえ今回の講義のためには「期待自由エネルギーとPOMDP(部分観測マルコフ決定過程)」、「マルコフブランケットとNESS(非平衡定常状態)」のパートについて大幅にスライドを作る必要があった。

あと今回のチュートリアルの狙いとして「FEPの前にベイズ脳と予測符号化の説明をして、そこからの差分としてFEPを説明する」「FEPは実験的に検証可能か、という側面から、criticalな視点を保ちながら解説と議論を行う」ということを考えていた。これについては後述。

[チュートリアルの構想2: 演習パートのコードの元ネタ]

2019年のチュートリアルのときはオンサイトでハッカソンを行い、その場で与えられたprojectをグループごとに取り組んで結果を発表する、というものだったのだけど、これは機械学習の経験者にはよかったと思うけど、神経科学者や心理学者にとってはだいぶ難しかったと思う。

今回の「脳の自由エネルギー原理チュートリアル・ワークショップ2021」では「実験と検証」をテーマに挙げて国際シンポジウムを行うことにした。そこでワークショプ部分も機械学習の経験者だけでなく、もっと神経科学者や心理学者も含めてもっと間口を広げたものにしようというのが今回のチュートリアルの方針でした。そういうわけで、私吉田が日本語で講義を行い、R演習を加えたものとして開催することを考えたのでした。

演習の題材としては、以下の論文に付属しているコードでなんとかできるだろうと考えてた。

  • Rafal Bogaczの"A tutorial on the free-energy framework for modelling perception and learning." J Math Psychol. 2017
  • Christopher Buckleyらの"The free energy principle for action and perception: A mathematical review." (J. Math Psychol. 2017)
  • Ryan Smithらの"A Step-by-Step Tutorial on Active Inference and its Application to Empirical Data" PsyArXiv 2021

けっきょくChrisのコードは使わなかった。あと、"Step-by-Step Tutorial"を動かしてみたら、spm12をインストールする必要があって、最小限動くコードを作るにしては巨大すぎた。けっきょくほとんど自作する必要があることがわかった。

[チュートリアルの構想3: 演習パートの言語と環境]

演習部分をなんの言語でやるかについてはいろいろ考えるところがあった。私吉田はふだんMatlabを使っているので、Matlabでやるのが準備は楽だった。また、前述のChris BuckeyのJ. Mathematical Psychol. 2017にしろ、今回大々的に援用したBogaczのJ Math Psychol. 2017にしろ、論文に付属しているコードはMatlabなので、これを使えばいいというのもあった。

一方で、こういう公開イベントでMatlabのようなプロプライエタリ・ソフトウェアを使うのはよいことだろうか?という考えがあった。神経科学者にとってはMatlabは身近だと思うけど、逆に機械学習の人や企業の人にとってはMatlabは敷居が高い(あれアカデミック版でないとクッソ高いからね)。(まだやってないけど)後日コードをGitHubにアップロードすることを考えても、ここはR, Python, Juliaなどを使うべきではないかと考えた。

2019年のチュートリアルのときはChrisとAlecはPythonをGoogle Colab上で動かしていて、これはなかなかよかったので、Pythonにしようかとも思っていた。でもPythonは機械学習の経験者にはいいけど、神経科学者や心理学者にとってはまだ敷居が高い。(あとGoogle Colabの使い勝手の問題もある。後述。)

最終的に決め手になったのは、R言語とそのIDEであるRStudioがオンラインで動くRStudio.cloudを知ったこと、そして実際に運用したことでした。私の所属する北海道大学 人間知・脳・AI研究教育センター(CHAIN)では毎年夏と冬に「CHAINサマースクール、ウィンタースクール」を開催している。2021年1月に開催されたウィンタースクールではドイツ・コンスタンツ大学の豊川航さんに講師をやっていただいたのだけど、RStudio.cloud上でのR演習を行っていただいた。(Multi arm Bandit課題でのwisdom of crowdがテーマ。) でも豊川さんはドイツ在住なので時差のため、zoomでのリモート講義は午後からになる。そこで私が午前中に「補講」としてRStudio.cloudの動作確認や、強化学習の基礎の基礎(two arm Bandit課題とRWモデル)の資料を作成して、補講の講義も行ったというわけです(資料はこちら: CHAINウィンタースクール2020 豊川航先生R演習の前準備用資料)。これで参加者30人程度の演習を問題なく運用する経験を積むことができたので、今回のFEPチュートリアルでもRStudio.cloudを使ってみることにしたわけです。

(なお、Google Colabはログインするたびにコードをアップロードしたり、ライブラリをインストールしないといけないけど、RStudio.cloudは講師が作った環境をそのまんまコピーすることができる。この点でも優れている。しかもFreeのコースでここまでなら十分対応できる。)

[じっさいの準備状況から開催まで]

そんなこんなで、だいたいの構成は3ヶ月前にはできていたのだけど、じっさいの作業が始まったのは開催1ヶ月を切ったあたりだった。

この時点で北大に異動してからはじめてのウイルス注入実験を終えて、4週間後にさらにGRINレンズを刺入するオペが待っていた(ちゃんと成功しました)。論文書きもしているし、ヒアリングの準備とかいろいろな仕事が入っていて、週末にすら準備に取り掛かれないという絶望的な状況で時が過ぎていった。まさに「できらぁ!」「え!!」ってかんじ。

だいたいこれまでは、ブログやTwitterでチュートリアルの準備状況とか構想とかを語ったりして、そうやって対外的に語って尻に火を付けることが駆動力になったりしていたのだけど、今回はマヂで時間がなくて、危機的な状況だった。

先に演習用のコードを完成させて、そこから逆算的に講義の部分を作らないと二度手間になると気がついたので開催3週間前。上記の"A Step-by-Step Tutorial"を読み進めて、これをそのまま使うのは無理と気づいたのが2週間前。講義の基本的な構成は開催10日前に行われた東大國吉さんの大学院講義の資料を作成することでだいたい完成したけど、本格的にコードを書き出したのはその後。ひととおりコードを書いてオーガナイザーの皆さん(島崎さん、理研の磯村さん、広大の本田さん)に見てもらったのが開催1週間前。とくに理研磯村さんにはコードレビューをしていただいてすごく助けていただきました。ここで改めて御礼申し上げます。

ともあれ当日を迎えることができて、大きなトラブルもなく(「参加者の大半のコードが動かない!」みたいなことは起こらなかった)講義と演習を終えることができた。

参加者の方に事後評価のアンケートを書いてもらったのだけど(チュートリアルのwebサイトに掲載)、講義の評価はexcellentが67%、goodが32%で、fair, poorはゼロ。演習の評価はexcellentが46%、goodが53%で、fair, poorはゼロ。舞台裏はここに書いたようにドタバタだったのだけど、まあそれなりに満足してもらえたのではないかと思う。

[反省の弁、将来に向けて]

いろいろやり足りなかったことはある。またこういう機会があったとしたらそのときに改善できるようにメモしておこうと思う。

コード書きの基本的な作業はmatlabからRへの移植だったけど、Rとmatlabで行列計算をするときの流儀の違いがあって、これの検算でクッソ時間がかかった。正直Rでの行列計算には懲りたので、次回こういうことやるならJuliaにしたいなと思う。ただ、Google ColabでJuliaを動かすためにはそのつどJuliaをインストールしないといけないので、現時点ではまだ時期尚早だと思う。RStudio.cloudはほんとうに素晴らしい。

RStudioでは(2021年の)ver.1.4からvisual editing modeというのが導入されて、LaTeXで書いた数式とかがそのままRmarkdownのエディタ上で表示できる。これは素晴らしい。でも、visual editing modeはまだ新しくて不都合があるらしく、visual editing modeからnormal modeに変えるタイミングで、数式モードを開始する$$の改行が消える。これはUndoでは直せないので、ぜんぶ改行を入れ直す必要があった。この問題を解決できなかったので、けっきょく本番ではvisual editing modeを使うのは断念した。もしかしたらLaTeXのコードの書き方で対処できたのかもしれない。受講者の方から教わって解決した部分もあったので。

R markdownを使った演習だと、チャンクを実行して「はい、グラフが書けましたね、次行きましょう」みたいなかんじで、コードを理解できてなくてもなんとなく進めることができてしまう。かといって、コードを1行1行説明するような時間もない。そこでRmarkdownの説明部分とコード内のコメント文にあとで読んだときに意味がわかるように説明を加えておいた。あと、受動的にコードを実行して終わりにならないように、演習問題(例: 生成モデルの設定を変えて動かしてみよう)を各セクションごとに作った。これも時間がないので、「後で自分で試してみてください」で飛ばすことになった。このあたりは反省点。あとから振り返ってみれば、R演習だけで150分必要だった。

FEPを実際に試してみたい人のために本当に役立つものを提供するという意味では、「あなた固有の問題について、生成モデルを作って、自由エネルギー最小化を試してもらう」ところまでできればベストだったと思う。しかしそれには時間が足りなかった。そもそもそのような生成モデルを作る練習というのはFEPに限った話ではない。ベイズモデリングにおいて、たとえばRSTANで尤度を定義してMCMCして事後分布を計算するときに必要なこととほとんど重なっている。そういう意味では、将来的な展開として「FEPの講義と演習を、ベイズモデリングの概要を説明したうえで、MCMCの代わりに変分推定しているだけだよ、とまとめる」こういうやりかたもあるかなと思った。

あと、コードと講義の内容で足りていなかったのは、「学習」の扱い。今回はBogacz論文に基づいた説明のときに「priorを更新したら、収束が早くなります」みたいな話をするだけでお茶を濁した。でも学習についてちゃんと説明するなら、複数試行の結果からoutcomeについての予測誤差を計算して、生成モデルのパラメーターを更新する、というステップを踏む必要がなる。これは次の機会にこそちゃんと説明できるようになりたい。

今回のチュートリアルの狙いとして「FEPの前にベイズ脳と予測符号化の説明をして、そこからの差分としてFEPを説明する」「FEPは実験的に検証可能か、という側面から、criticalな視点を保ちながら解説と議論を行う」ということを考えていた。これは100%はできなかったし、トータル5時間でやるのは土台無理だった。そもそもFEPを考えなくても、ベイズ脳と予測符号化だけで話は一旦閉じることはできる(カルマンフィルタによるベイズ更新)。だから、ベイズ脳と予測符号化の話をきっちりやって、そのうえでFEPがなにをプラスしているのかを説明をしないと、「FEPはほんとうに新しいのか、検証可能なのか」といった議論をする準備が足りない。これも次回以降の課題。

というようなことをいろいろ考えていたという話です。それではまた。


お勧めエントリ


月別過去ログ