<style> .reveal, .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, "Microsoft JhengHei", Meiryo, sans-serif; } h1, h2, h3, h4, h5, h6 { text-transform: none !important; } .color-yellow{ color: yellow; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; text-align: left; padding: 10px 0; } .alert-info { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .alert-success { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .alert-danger { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .reveal .slides span { text-align: left; display: inline-block; } p, li { font-size: 0.88em !important; } li>p { font-size: 1em !important; } </style> # JuliaTokai #8 (2020/11/14) ###### tags: `JuliaTokai` `prezentation` --- # MCMCで求める<br>Holy Numbers [堀川 由人, ほりたみゅ, @Hyrodium](https://hyrodium.github.io/profile) ---- ### おしながき * 自己紹介 * Holy Numbers * MCMC * モデリング * 計算結果 * まとめ等 --- ## 自己紹介 私の学生時代、知りたいですよね..? * 高専時代 * 大学以降 ---- ### リンク機構と私 (高専時代) * 高専ロボコン(1年-3年) * リンク機構大好き少年 ![](https://scontent.fitm1-1.fna.fbcdn.net/v/t31.0-8/1397786_430884727034379_961664847_o.jpg?_nc_cat=100&_nc_sid=174925&_nc_ohc=k1sJeqBMNMcAX9VQrfk&_nc_ht=scontent.fitm1-1.fna&oh=64267c4a255ceff72885fa56e98097f4&oe=5FB457EB =x185) ![](https://media2.giphy.com/media/oHymWVC6HvHGFsvyh9/giphy.gif =x185) ![](https://media0.giphy.com/media/nUShFKBurfcEC9BVXy/giphy.gif =x185) ![](https://i.giphy.com/media/kxcxqcnx2wWhmoI1HU/giphy.webp =x200) ![](https://i.giphy.com/media/2MIsxL1OfwTZRgxora/giphy.gif =x200) ---- ### リンク機構と私 (大学以降) * まだまだリンク機構は面白い * 3年前のストローで作った作品 ![](https://64.media.tumblr.com/7d53aa7b75c68f1af89e216394bcf3d0/tumblr_oxx7dfEO1d1s2lbywo1_500.gifv =x300) ![](https://64.media.tumblr.com/0771176b4f955aa8f8a9d1b86db16546/tumblr_oxx7dfEO1d1s2lbywo2_400.gifv =x300) ![](https://64.media.tumblr.com/32197c096a43d90086cd5152abb3e58d/tumblr_oxx7dfEO1d1s2lbywo3_400.gifv =x300) 最近の気持ち: **Juliaによる数値計算がアツい!!** --- ## Holy Numbers 本LTの題材の説明です * Strand Beest * Holy Numbers * やりたいこと! ---- ### Strand Beest * オランダの芸術家Theo Jansen氏による[作品](https://www.youtube.com/watch?v=MYGJ9jrbpvg) * 「風を食べて動く生命体」 ![](https://i.pinimg.com/originals/9e/96/0a/9e960a42ac3e13f4c683b60501b9840a.gif) ---- ### Holy Numbers (1) * 「聖なる13の数」 * Strand Beestのリンク比のこと * Tシャツも販売されていた ![](https://media2.giphy.com/media/RmOatrDXondfzHKHFy/giphy.gif =x300) ![](https://i.imgur.com/HvYybtl.png =x300) ![](https://static.wixstatic.com/media/75f4fd_8dbb918d71644eb6a1b6a8a0917ee151~mv2_d_3456_3120_s_4_2.jpg/v1/fill/w_1620,h_1462,al_c,q_85,usm_0.66_1.00_0.01/75f4fd_8dbb918d71644eb6a1b6a8a0917ee151~mv2_d_3456_3120_s_4_2.jpg =x300) ---- ### Holy Numbers (2) * リンク比マジ重要 * 少しでも変わると変な軌跡になる →滑らかに歩けない →**疑似直線**運動が必要 ![](https://media2.giphy.com/media/RmOatrDXondfzHKHFy/giphy.gif =x220) ![](https://media0.giphy.com/media/sryCwwa9AJ4Y8Dufwu/giphy.gif =x220) ![](https://media2.giphy.com/media/h7IuvXriVI8lfynXk9/giphy.gif =x220) ![](https://media3.giphy.com/media/cogjGUCbuBuXFbIU05/giphy.gif =x220) ---- ### やりたいこと! * このリンク比(Holy Numbers)を自分で求めたい! * あわよくば..もっと良いリンク比を見つけたい! ![](https://media2.giphy.com/media/RmOatrDXondfzHKHFy/giphy.gif =x350) ![](https://i.imgur.com/HvYybtl.png =x350) --- ## MCMC 最適化のための道具の紹介! * MCMCってなに? * MH法 * 焼き鈍し法 ---- ## MCMCってなに? (1) * **M**arkov **C**hain **M**onte **C**arlo * Markov Chain (マルコフ連鎖) * 前の状態を記憶する * Monte Carlo (モンテカルロ) * 確率的に実行する * サンプリング手法の一つ * ベイズ推論の応用でもよく使われる * (らしいですが、まだ詳しくないです..) *(最近勉強し始めた分野なのでマサカリ歓迎です!!)* ---- ## MCMCってなに? (2) * 与えられた確率分布$p(x)$を元にサンプリング * ヒストグラムが$p(x)$に一致する (すごい!) ![](https://i.imgur.com/UOVTYkj.png) ---- ## MH法 * Metropolis-Hastings法 (MCMC法の一つ) 1. 初期点$x_{0}$を決める 2. 点$x_{i}$をもとにランダムに$x'$を決定 3. 以下の漸化式で確率的に$x_{i+1}$を決定 ここで$\operatorname{rand}()$は$[0,1]$区間の一様乱数 $x_{i+1} = \begin{cases} x' & \left(\operatorname{rand}()<\frac{p(x')}{p(x)}\right) \\ x_{i} & (\text{otherwise}) \end{cases}$ * これだけで確率分布$p(x)$に従うサンプリングが可能 ---- ## 焼き鈍し法 (1) * MCMCって最適化問題にも使えるんですか? * 使えます!(焼き鈍し法) * 最適化問題 * エネルギー関数$x\mapsto E(x)$が最小になる$x$を求める * ハイパーパラメータ$\beta>0$を用意して以下で変換 * 分母は定数なので分母の計算は不要 $\displaystyle p(x) = \frac{\exp(-\beta E(x))}{\int_{x' \in D}\exp(-\beta E(x')) dx'}$ ---- ## 焼き鈍し法 (2) * ハイパーパラメータ$\beta>0$って? * 逆温度と呼ばれる量 (統計力学からの輸入) * $\beta$を徐々に大きくすると.. * エネルギーの小さい所に存在する確率が上がる! <iframe src="https://www.desmos.com/calculator/cvonetwtmk" width="600" height="400" frameborder="0" style="border:0" allowfullscreen></iframe> --- ## モデリング 「MCMCで求めるHoly Numbers」をどう実現するか? * 未知変数の設定 * エネルギー関数の設計 * 最適化手法の検討 ---- ### 未知変数の設定 * リンク機構を決定する変数は13個 * $(w_{1},\dots,w_{13})$とおきます * 全体の定数倍は同じ軌跡(相似)になる * 原動節の長さ$w_{13}$を固定すれば残るは12個 * つまり$(w_{1},\dots,w_{12})$が未知変数 ![](https://media2.giphy.com/media/RmOatrDXondfzHKHFy/giphy.gif =x330) ![](https://i.imgur.com/HvYybtl.png =x330) ---- ### エネルギー関数の設計 * 悪い軌跡には高いエネルギー:arrow_up: * 良い軌跡には低いエネルギー:arrow_down: ![](https://media2.giphy.com/media/RmOatrDXondfzHKHFy/giphy.gif =x220) ![](https://media0.giphy.com/media/sryCwwa9AJ4Y8Dufwu/giphy.gif =x220) ![](https://media2.giphy.com/media/h7IuvXriVI8lfynXk9/giphy.gif =x220) ![](https://media3.giphy.com/media/cogjGUCbuBuXFbIU05/giphy.gif =x220) 10     60     150     80 エネルギー関数の最小化問題に帰着される $E : \mathbb{R}^{12}\to \mathbb{R};(w_{1},\dots,w_{12})\mapsto E(w)$ ---- ### エネルギー関数の例 * 足先の位置ベクトル: $\displaystyle\newcommand\Pare[1]{\left(#1\right)} \newcommand\od[2]{\frac{d#1}{d#2}} \newcommand\pd[2]{\frac{\partial#1}{\partial#2}} \newcommand\sod[2]{\sfrac{d#1}{d#2}} \newcommand\spd[2]{\sfrac{\partial#1}{\partial#2}} \newcommand\tensor[2]{\boldsymbol{\mathrm{T}}^#1_#2} \newcommand\bm[1]{\boldsymbol{#1}}\bm{c}(\theta; w)=(c_x(\theta;w), c_y(\theta;w))$ * リンク比: $w=(w_{1},\dots,w_{12})$ * 原動節の角度: $\theta\in[0,2\pi)=[0,\tau)$ * 位置エネルギー (重力の一般化) $\displaystyle\newcommand\Pare[1]{\left(#1\right)} \newcommand\od[2]{\frac{d#1}{d#2}} \newcommand\pd[2]{\frac{\partial#1}{\partial#2}} \newcommand\sod[2]{\sfrac{d#1}{d#2}} \newcommand\spd[2]{\sfrac{\partial#1}{\partial#2}} \newcommand\tensor[2]{\boldsymbol{\mathrm{T}}^#1_#2} \newcommand\bm[1]{\boldsymbol{#1}} E_{\text{potential}}(w)=\int_{0}^{\tau} \Pare{c_y(\theta; w)-\min_{\theta'\in [0,\tau)}c_y(\theta';w)}^r d\theta$ * 面積一定 (風船) $\displaystyle E_{\text{area}}(w)=\Pare{\frac{1}{2}\int_{0}^{\tau} \Pare{\bm{c}(\theta; w)\times\od{\bm{c}(\theta; w)}{\theta}} d\theta-A_0}^2$ ---- ### 最適化の出番! * 次元の呪い * 10分割ずつ総当りだと$10^{12}$パターン * 他の方法ダメなの? (e.g. 最急降下法, Newton法) * 微分可能性: 無いかも (あるいは面倒) * 大域的性質: 局所最適なんて要らねえ(ドン!) * そこでMCMCですよ! $\displaystyle p(w) = \frac{\exp(-\beta E(w))}{\int_{w' \in \mathbb{R}^{12}}\exp(-\beta E(w')) d\mu(w')}$ --- ## 計算結果 色々な面白い結果が揃いました! * 使用言語 * デモ * 計算例 * 目的関数の設計について ---- ### 使用言語は..もちろんJulia! * 速い! * LLVMベースでJITコンパイル * 基本的にCやRustなどと同等の速度 * 書きやすい! * 動的実行 * 多重ディスパッチ ![](https://download.logo.wine/logo/Julia_(programming_language)/Julia_(programming_language)-Logo.wine.png =400x) ---- ### デモ ここで計算します:computer: * 10,000回の反復計算が1秒くらい * グラフィックスは[Luxor.jl](https://juliagraphics.github.io/Luxor.jl/stable/)で出力 * (最適化の計算より画像出力の方が遅い..) ---- ### 計算例 (1/5: 位置エネルギー最小化) とりあえず位置エネルギーを小さくしてみるか:thinking_face: $\displaystyle\newcommand\Pare[1]{\left(#1\right)} \newcommand\od[2]{\frac{d#1}{d#2}} \newcommand\pd[2]{\frac{\partial#1}{\partial#2}} \newcommand\sod[2]{\sfrac{d#1}{d#2}} \newcommand\spd[2]{\sfrac{\partial#1}{\partial#2}} \newcommand\tensor[2]{\boldsymbol{\mathrm{T}}^#1_#2} \newcommand\bm[1]{\boldsymbol{#1}} \begin{aligned}E_{\text{potential}}(w)&=\int_{0}^{\tau} \Pare{c_y(\theta; w)-\min_{\theta'\in [0,\tau)}c_y(\theta';w)}^r d\theta \\ E(w)&=E_{\text{potential}}(w)\end{aligned}$ ---- ### 計算例 (1/5: 位置エネルギー最小化) ![](https://media3.giphy.com/media/nRBir7Cv92yXe4I6Y4/giphy.gif =x450) 潰れた:hushed:!? ---- ### 計算例 (2/5: 面積一定) 軌跡は閉曲線だから面積が計算できるのでは:smirk: $\displaystyle\newcommand\Pare[1]{\left(#1\right)} \newcommand\od[2]{\frac{d#1}{d#2}} \newcommand\pd[2]{\frac{\partial#1}{\partial#2}} \newcommand\sod[2]{\sfrac{d#1}{d#2}} \newcommand\spd[2]{\sfrac{\partial#1}{\partial#2}} \newcommand\tensor[2]{\boldsymbol{\mathrm{T}}^#1_#2} \newcommand\bm[1]{\boldsymbol{#1}} \begin{aligned}E_{\text{area}}(w)&=\Pare{\frac{1}{2}\int_{0}^{\tau} \Pare{\bm{c}(\theta; w)\times\od{\bm{c}(\theta; w)}{\theta}} d\theta-A_0}^2 \\ E(w)&=E_{\text{area}}(w) \end{aligned}$ ---- ### 計算例 (2/5: 面積一定) ![](https://media2.giphy.com/media/UG4jSuCRUgMagfOUVv/giphy.gif =x450) 潰れないが、これでは歩行できん:worried: ---- ### 計算例 (3/5: 組み合わせ) 組み合わせたらいけそう:bulb: $\displaystyle\newcommand\Pare[1]{\left(#1\right)} \newcommand\od[2]{\frac{d#1}{d#2}} \newcommand\pd[2]{\frac{\partial#1}{\partial#2}} \newcommand\sod[2]{\sfrac{d#1}{d#2}} \newcommand\spd[2]{\sfrac{\partial#1}{\partial#2}} \newcommand\tensor[2]{\boldsymbol{\mathrm{T}}^#1_#2} \newcommand\bm[1]{\boldsymbol{#1}} \begin{aligned}E_{\text{area}}(w)&=\Pare{\frac{1}{2}\int_{0}^{\tau} \Pare{\bm{c}(\theta; w)\times\od{\bm{c}(\theta; w)}{\theta}} d\theta-A_0}^2 \\ E(w)&=E_{\text{potential}}(w)+E_{\text{area}}(w)\end{aligned}$ ---- ### 計算例 (3/5: 組み合わせ) ![](https://media3.giphy.com/media/gPnok8mjGBkQTwz5Jf/giphy.gif =x450) 結構ええんちゃう!?膝がめり込んでるが..:anguished: ---- ### 計算例 (4/5: 面積の調整) 軌跡の面積が大きすぎたか..?:face_with_rolling_eyes: $\displaystyle\newcommand\Pare[1]{\left(#1\right)} \newcommand\od[2]{\frac{d#1}{d#2}} \newcommand\pd[2]{\frac{\partial#1}{\partial#2}} \newcommand\sod[2]{\sfrac{d#1}{d#2}} \newcommand\spd[2]{\sfrac{\partial#1}{\partial#2}} \newcommand\tensor[2]{\boldsymbol{\mathrm{T}}^#1_#2} \newcommand\bm[1]{\boldsymbol{#1}} \begin{aligned}E_{\text{area}}(w)&=\Pare{\frac{1}{2}\int_{0}^{\tau} \Pare{\bm{c}(\theta; w)\times\od{\bm{c}(\theta; w)}{\theta}} d\theta-A_0}^2 \\ E(w)&=E_{\text{potential}}(w)+E_{\text{area}}(w)\end{aligned}$ ↓↓↓ $A_0$を半分くらいにしてみよう! ---- ### 計算例 (4/5: 面積の調整) ![](https://media3.giphy.com/media/2iTIf0mdxew2nfpLGj/giphy.gif =x450) かなりええんちゃう!?ちょっと細長いけれども..:grin: ---- ### 計算例 (5/5: 負の面積) 軌跡の面積って負の数にしてもいけるんやろか..:exclamation::question: $\displaystyle\newcommand\Pare[1]{\left(#1\right)} \newcommand\od[2]{\frac{d#1}{d#2}} \newcommand\pd[2]{\frac{\partial#1}{\partial#2}} \newcommand\sod[2]{\sfrac{d#1}{d#2}} \newcommand\spd[2]{\sfrac{\partial#1}{\partial#2}} \newcommand\tensor[2]{\boldsymbol{\mathrm{T}}^#1_#2} \newcommand\bm[1]{\boldsymbol{#1}} \begin{aligned}E_{\text{area}}(w)&=\Pare{\frac{1}{2}\int_{0}^{\tau} \Pare{\bm{c}(\theta; w)\times\od{\bm{c}(\theta; w)}{\theta}} d\theta-A_0}^2 \\ E(w)&=E_{\text{potential}}(w)+E_{\text{area}}(w)\end{aligned}$ ↓↓↓ $A_0$の代わりに$-A_0$にしてみよう! ---- ### 計算例 (5/5: 負の面積) ![](https://media2.giphy.com/media/RmOatrDXondfzHKHFy/giphy.gif =x350) ![](https://media1.giphy.com/media/0JNogfMEw8DMEXxhgo/giphy.gif =x350) 逆回転の軌跡ができた!:star-struck: ---- ### 計算結果の一旦まとめ * 疑似直線は意外と簡単に作れる * 目的関数(=エネルギー関数)次第で形状が大きく変化 * そもそも良い軌跡ってどんな形? * 同値な問い: 最適な目的関数とは..? ![](https://media2.giphy.com/media/RmOatrDXondfzHKHFy/giphy.gif =x250) ![](https://media1.giphy.com/media/0JNogfMEw8DMEXxhgo/giphy.gif =x250) ![](https://media3.giphy.com/media/2iTIf0mdxew2nfpLGj/giphy.gif =x250) ---- <!-- .slide: data-background="https://i.imgur.com/yEDcmq3.gif" --> ### 目的関数の設計 * 目的関数(=エネルギー関数)への要求 * 接地部の**軌跡は平坦**な方が良い:walking: * スムーズに歩くため * 接地部の**速度は一定**の方が良い:runner: * もっとスムーズに歩くため * **軌跡は高い**方が良い:arrow_down: * 重心が低い方が安定 * 軌跡の**上下幅は小さい**方が良い:battery: * 足を上げるのは無駄なエネルギー消費 * 軌跡の**上下幅は大きい**方が良い:mountain: * 不整地走破性のため * 各**リンクは短い**方が良い:balloon: * 軽量化したい * *全部を考慮するのは大変!!* <small>..(でも"それっぽい"ものは作れた)</small> --- ## まとめ等 長々とお付き合いありがとうございました。 <small>(10分に収まっていたでしょうか..?)</small> * Theo Jansen氏の計算との比較 * 色々実装した感想 * 参考文献など ---- ### Theo Jansen氏の計算との比較 * オリジナルのHoly Numbersは得られなかった * 目的関数が分からん.. * 新しい結果 * 逆向きの回転方向 * 軌跡の高さを(多少は)調整可能 * 軌跡の面積を(多少は)調整可能 ![](https://media2.giphy.com/media/RmOatrDXondfzHKHFy/giphy.gif =x220) ![](https://media1.giphy.com/media/0JNogfMEw8DMEXxhgo/giphy.gif =x220) ![](https://media2.giphy.com/media/HG5yOR4crWT8boHLAM/giphy.gif =x220) ![](https://media4.giphy.com/media/3dm2Y5E8kK7x0AQNtP/giphy.gif =x220) ---- ### Theo Jansenマジ天才!! * 1991年にはリンク比の計算を終えていた * [当時の計算環境](https://youtu.be/FFS-2axFo1Y?t=85)・インターネット環境..:floppy_disk: * GA(遺伝的アルゴリズム, ≠MCMC)を使ったらしい * リンク機構だけじゃない * 風力で歩く * 水を感知して制御 * 圧縮空気も動力源に ![](https://image.news.livedoor.com/newsimage/stf/e/1/e1f79_126_548c015f99a6dcd5b9d8d2b381ea05d2.gif) ---- ### 色々実装した感想 * リンク機構は楽しい! * 単純な回転運動から複雑な軌跡を生成 * MCMCは面白い! * しかし最適化での目的関数の設計は泥臭い.. * Juliaは最高! * 超速い!書きやすい!気持ちいい! ![](https://media1.giphy.com/media/0JNogfMEw8DMEXxhgo/giphy.gif =x220) ![](https://i.imgur.com/UOVTYkj.png =x220) ![](https://download.logo.wine/logo/Julia_(programming_language)/Julia_(programming_language)-Logo.wine.png =x220) ---- ### 参考文献など * Theo Jansen Japan * 公式サイト * https://theojansen.net/ * 計算統計Ⅱ * MCMC法とその周辺 * https://www.amazon.co.jp/dp/400730789X * 平面上の2円の交点の座標について * リンク機構の計算に使いました * https://hyrodium.github.io/pdf * HolyNumbersByMCMC * 今回の計算のリポジトリ * https://github.com/hyrodium/HolyNumbersByMCMC
{"metaMigratedAt":"2023-06-15T15:27:01.970Z","metaMigratedFrom":"YAML","title":"JuliaTokai #8 (2020/11/14)","breaks":true,"lang":"ja","dir":"ltr","robots":"noindex, nofollow","slideOptions":"{\"theme\":\"white\",\"transition\":\"slide\"}","description":"堀川 由人, ほりたみゅ, @Hyrodium","contributors":"[{\"id\":\"41421433-16a1-4a57-ac11-6f7b7becb765\",\"add\":13570,\"del\":33}]"}
    842 views