人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

Theanoの使い方 (2) 自動微分

Theanoの使い方 (1) シンボルと共有変数(2015/5/9)のつづき。

今回はTheanoの自動微分を試してみる。ロジスティック回帰やニューラルネットなど勾配降下法を使うアルゴリズムではパラメータの更新式にコスト関数(誤差関数)E の微分が必要になる。

 \bf{w}^{(\tau + 1)} = \bf{w}^{(\tau)} - \eta \nabla E(\bf{w}^{(\tau)})

通常、誤差関数の微分  \nabla E(\bf{w}^{(\tau)}) を紙の上で解いてからその結果の数式を実装する。たとえば、前に実装した多層パーセプトロンによる関数近似(2015/1/22)では、手順 (4) で誤差関数の微分を手計算で求めてから実装している。

しかし、コスト関数が複雑になってくるとこの微分を手で計算するのは面倒くさいし間違いやすい。Theanoの自動微分では、コスト関数とどの変数について微分するかを与えるだけで自動的に微分を計算してくれるのだ。まずは、手計算できる簡単な微分を計算してみよう。

例1

まずは簡単な例で

 y = x^2

を計算してみよう。手で計算すると

 \displaystyle \frac{dy}{dx} = 2x

となることがすぐわかる。これをTheanoの自動微分で解いてみる。

(TensorConstant{2.0} * x)
4.0
6.0
8.0

T.grad()costに微分される数式のシンボル、wrtに微分する変数のシンボルを入れれば、微分の数式のシンボルが返される。微分はシンボルのままでは使えないのでfunction()で関数化してから使う。

微分の数式を表示したいときはtheano.pp()で表示できる。TheanoチュートリアルのNoteにあるが、gyをそのまま与えないで、関数化したあとのf.maker.fgraph.outputs[0]を与えるとよりわかりやすい表記になる。

例2

 y = e^x

 \displaystyle \frac{dy}{dx} = e^x

exp(x)
7.38905609893
20.0855369232
54.5981500331

例3

 y = \sin(x)

 \displaystyle \frac{dy}{dx} = \cos(x)

cos(x)
1.0
6.12303176911e-17
-1.0

例4

 y = (x - 4)(x^2 + 6)

 \displaystyle \frac{dy}{dx} = 3 x^2 - 8 x + 6

Elemwise{Composite{(i0 + sqr(i1) + (i2 * (i3 + i1) * i1))}}(TensorConstant{6.0}, x, TensorConstant{2.0}, TensorConstant{-4.0})
6.0
1.0
2.0

結果の式のi0などは後ろの丸かっこ内の数字のプレースホルダとして使われているようだ。sqr()は2乗を意味する。展開すると手計算した結果と同じになるのが確認できる。この奇妙な結果式は内部の微分のやり方と関係あるのかな?

例5

 y = (\sqrt{x} + 1)^3

 \displaystyle \frac{dy}{dx} = \frac{3 (\sqrt{x} + 1)^2}{2 \sqrt{x}}

Elemwise{Composite{((i0 * sqr((i1 + sqrt(i2)))) / sqrt(i2))}}(TensorConstant{1.5}, TensorConstant{1.0}, x)
6.18198051534
6.46410161514

これもプレースホルダに値を入れれば手計算した結果と同じになるのが確認できる。

例6

最後に偏微分の例も試してみよう。

 z = (x + 2 y)^2

 \displaystyle \frac{\partial z}{\partial x} = 2 (x + 2y)

 \displaystyle \frac{\partial z}{\partial y} = 4 (x + 2y)

Elemwise{Composite{(i0 * (i1 + (i0 * i2)))}}(TensorConstant{2.0}, x, y)
Elemwise{Composite{(i0 * (i1 + (i2 * i3)))}}(TensorConstant{4.0}, x, TensorConstant{2.0}, y)
10.0
12.0
20.0
24.0

自動微分は初めて知ったけれどこれはすごい。次回はこれまでの例を組み合わせたより実践的な事例として2クラスのロジスティック回帰を実装してみたい。