前回のブログでは、自動微分を実際に手で計算することで、関数を四則演算の単純な組み合わせに分解し、その計算順序に従って微分をすることで、解析的な解き方と同じ答えが求められることを確認しました。
今回のブログは、自分で計算するのではなく、Pythonというプログラムを使って、パソコンで微分をしてみよう、という内容です。
いきなり、自動微分をプログラムするのは難しいので、まずは数値微分のプログラムの紹介です。ちなみに、僕はプログラミングはfortran77しかやったことないです。ただ、自宅のパソコンにfortranのコンパイラがないし、ネットで探すのも面倒くさいので、これを機に、Pythonで微分をやってみましょう。
classで任意の、例えばlogとか好きな関数を定義して、求めたい関数になるように組み合わせれば、その関数の導関数値を求めることができます。高校生の授業や大学受験で苦しんだ微分も、プログラミングを使えば簡単に解けます。ただ、パソコンではlim h→0というように無限大に小さいという概念は、現実的にはh=0.0001などと定義してあげる必要があり、誤差の原因になることと、数値微分はあくまで導関数値という数字を求めることであり、導関数を求めることができない点に注意が必要です。
ゼロから作るdeep learning 3 から、プログラムは持ってきました。とてもおもしろいので、出版したら買います。https://www.dropbox.com/sh/l9cw1jmozqel6ps/AAC0MVzIwjH9S6ge4AN6f0n-a?dl=0&preview=stage1.pdf#
» 自動微分を手動でやってみる
自動微分を手動でやってみるという表面的な日本語としては違和感を感じますが、このタイトルでOKだと思います。
感動のポイントとしては、普通に関数を計算するのと同じ手順で、四則演算の計算の組み合わせで、導関数を計算することができることです。複雑な関数であっても、単純な式の組み合わせで、その関数の勾配を求めることができ、しかも数値微分よりも正確に計算することができる。
自動微分の特徴としては、関数をアルゴリズムの概念で扱うので、その関数が数式的に表現できないような複雑な条件、例えば繰り返しの計算や条件分岐による式の変化にも柔軟に対応できることです。
自動微分がなぜ重要なのか。人工知能もしくは機械学習の分野で、特定の変数の値に対応した関数の勾配を求めることで、勾配降下法という手法を使って、目的の関数の最小値を得ることができるからです。勾配降下法を使うには、関数の勾配を求める必要があり、その有力な手法が自動微分ということです。
感動のポイントとしては、普通に関数を計算するのと同じ手順で、四則演算の計算の組み合わせで、導関数を計算することができることです。複雑な関数であっても、単純な式の組み合わせで、その関数の勾配を求めることができ、しかも数値微分よりも正確に計算することができる。
自動微分の特徴としては、関数をアルゴリズムの概念で扱うので、その関数が数式的に表現できないような複雑な条件、例えば繰り返しの計算や条件分岐による式の変化にも柔軟に対応できることです。
自動微分がなぜ重要なのか。人工知能もしくは機械学習の分野で、特定の変数の値に対応した関数の勾配を求めることで、勾配降下法という手法を使って、目的の関数の最小値を得ることができるからです。勾配降下法を使うには、関数の勾配を求める必要があり、その有力な手法が自動微分ということです。
» 行政課題の数理モデルを最適化をするための微分の基礎的な復習
近直、自動微分で政策課題を解決してみよう、という投稿を考えているのですが、自動微分についてのネット上の情報が極めて少なく、ほぼ、初学者向けの情報は皆無と言えるので、せっかくなので事前のエントリー記事を書きます。
大学の数学では、偏微分をならった。
高校生の数学で習って大学入試とかで使う微分と、偏微分の違いは何かと言うと
微分は
という感じで、ある関数の変数の一つに注目して、上記の関数だとxに注目して微分します
余談だけど、僕は高校の時は微分より積分の方が苦手だったけど、パソコンで計算すると積分は、その原理上、数値計算が楽なので、現時点では積分より微分の方がとても難しかったなと感じています。そもそも現時点は微分、積分なんて日常生活では使いません。
さて、微分に対して、偏微分は
という感じに、2つ以上の変数を含んだ関数について、ある一つの変数について微分することを偏微分と呼びます。
そもそも微分の定義は、
直感的には、関数f(x)の接線の傾きが微分と表現できます。そして、このhという値は十分に小さいのですが、これが問題です。どれくらい小さいかというと、パソコンで具体的に計算する時は、例えば、0.001だったり、0.0000000001とかだったりします。この数字をどうするかで、計算精度が変わるのですが、一応、目安となる法則があるらしいですが、この塩梅の理屈が僕には正直わかりません。
次に最適化について、ニュートン法を復習?、します。ニュートン法は、大学でも数学とか物理では勉強せず、プログラミングの授業で、熱力学のシュミレーションで習った気がします。最適化ってなにかというと、関数f(x)=0 の時のxの値を見つけ出すという行為です。なんで、関数f(x)=0 の時のxの値を探すかというと、それが一番ちょうどいい!とされる値だからです。この辺りは、また次回以降、実例で解説します。
ニュートン法の具体的な実行手順は、
今回はここまで。次回は微分の復習、合成関数の微分と一緒に、ニュートン法とは別のやり方の自動微分の基礎について解説していきます。
最近のコメント