
本記事ではPythonで微分する方法についてご紹介していきます。
微分とは
まず基礎的なおさらいとして、微分とはその関数の瞬間的な変化量を求める計算手法です。
例を上げれば、下記のような式の場合
元の式)
微分した結果)
高校生以上なら誰でも分かる計算なので、詳しい解説は全て割愛します。
こんな誰でも分かる計算を、自分の頭ではなくプログラムでやってくださいと言われたら困る人向けに執筆しております。
方法①:SymPyを使う
Pythonで1番シンプルに微分しようと思った場合、SymPyというライブラリを使った上記の方法です。
上記の方法だと微分後の式も出力でき、最も多くの人が思い浮かべる微分法だと言えるでしょう。
方法②:自分で作る
何かしらの理由でライブラリを使用しない場合、自作コードで微分しようと思ったら上記のようになります。
この変数hは数値リテラルを使っており、詳細は下記の記事を参考にしてください。
簡単に言えば非常に小さな値であり、これで疑似的にlim(極限h→0)を表現しています。
ただしこの方法は浮動小数点を使用する性質上、処理が重くなってしまうため推奨できない方法です。
方法③:直接代入する
Blog_DifferentialByAssignment.py
最後、上記のように直接代入する方法が、プログラムで微分する方法として挙げられます。
この方法を微分と呼んでいいのか、筆者は最初見た時にそう思いましたが考えてみれば当たり前の処理です。
なぜなら全く同じ式を、もしくは定数のみ違う式を微分する時、全て最初から計算し直すことは人間でもあまりいないからです。
プログラムでも同じく、最初からどのような式を微分したいのか判明しているのならば、上記の方法にしておくのが最も処理速度が早くなります。
処理時間の違い
さて今回Pythonで微分の方法を紹介したわけですが、なぜ今微分なのかと言えば下記の記事で紹介している誤差逆伝播法にて微分を使用するからです。
誤差逆伝播法の仕組みや概念を解説!基礎編1 - TomoGのごちゃまぜ倉庫
この誤差逆伝播法では微分を使用するわけですが、その微分の仕方が本記事でご紹介している③の方法をとっています。
そんなプログラムの世界で使用される微分の裏道的なものですが、それでは具体的にどれくらい処理速度に違いがあるのか計測してみました。
計測に使用したプログラムは下記の通りです。
Blog_DifferentialProcessTime.py
結果は下記のようになりました。
・SymPy:257.434 ms
・Self:2.610 ms
・Assignment:1.441 ms
・SymPy-CalcOnly:48.082 ms
圧倒的に③の直接代入が早く、実際に微分する場合は今回のテストの数万倍以上の計算をしていると考えると、直接代入を選択するのが当然と言えるでしょう。
また、SymPyで既に微分した式がある状態で計算のみさせた場合「SymPy-CalcOnly」でも、如実に遅くなっていることが分かります。
この結果からも分かる通り、プログラムで微分したい時かつ既に式が判明している場合は、微分の計算をするのではなく直接微分した式に代入する方法が最も早く実用的だということが分かるでしょう。
本記事の内容は以上となります。
今回の記事は筆者が誤差逆伝播法を勉強している中で、微分の部分が分からず悩んだ結果、判明した衝撃の事実を込めて記事にしています。
あくまで欲しいのは出力される数値であって計算過程ではない、微分と聞いたら微分の方法を考えてしまう筆者のような頭の固い人間に届いたらいいなと思いつつ記事にしました。
本記事は以上です。お疲れさまでした。