数値微分をすると計算が遅い自動微分を自分で実装するのは大変という問題があり、数値微分で妥協するか、よほど問題が大きい時には頑張って自動微分を実装するしかありませんでした。一方で、昨今用いられているディープラーニングで用いられている誤差逆伝播法というのは、実は自動微分(より正しくは、自動微分手法の中のリバースモード蓄積と呼ばれる手法)のことであり、つまりディープラーニングのライブラリを使えば簡単に自動微分が実装できるのでは?と考えました。Chainerはチュートリアルのページで微分計算が簡単にできることをPRしており、これを使って自動微分をしてみたよ、というのが今回の記事です。Derivatives題材はあまりいいのが思いつかなかったのですが、前から興味があった、逆行列を最適化計算で求める、というものにしてみました。逆行列の計算ですので、環境・評価関数を以下のように考えます。環境は任意の行列Xと、推定中の逆行列Yの積を返す評価関数は、XYとIの差分の要素ごとの2乗和とする上記のようにすると、評価関数値を最小化するように最適化すれば、XYがIに近づくように、つまりYがXの逆行列となるはずです。勾配を取得するまでの処理のイメージは以下になります。numpyのarrayをchainerのVariable形式に変換したり、各種処理をchainerの関数で実装することが必要です。3).astype(np.float32)#chainerの形式に変換する。(計算グラフが記録されるようになる。np.eye(Z.shape[0])))#評価関数値の勾配に任意の値(1)を与えて、backwardファンクションを呼び出す。Y.grad勾配の値は、例えばこんな感じです。最急降下法を使って、3×3の逆行列を求めてみました(ソースコードは末尾)。Xとして乱数で生成した以下を与えました。dtype=float32)また、同様にYの初期値として以下を与えました。dtype=float32)初期のYはXの逆行列ではないので、積はIにはなりません。dtype=float32)最適化計算を実施することで誤差が減っていきます。I行列との誤差が0.001以下になったところで計算を止めています。