前回からChainerの基本オブジェクトについて私が勉強したことを記述しています.
前回はVariableについて書きました.今回は活性化関数や誤差関数などニューラルネットワークにおいて重要な関数を提供するfunctionsについて書きます.
#functions
前回紹介したVariableオブジェクトを変数として持つ関数をfunctionsは提供してくれます.
Variableと同じくchainerから呼び出します.(すでにchainerとVariableは呼び出されている前提)
from chainer import Function as F
関数はざっくり言うと色々あります.
例えば三角関数とか...
>>> x = Variable(np.array([-1], dtype=np.float32))
>>> F.sin(x).data
array([-0.84147056], dtype=float32)
>>> F.cos(x).data
array([ 0.54030228], dtype=float32)
ちなみに関数の返り値はVariableオブジェクトとして返されるため,微分も可能です.
>>> x = Variable(np.array([-0.5], dtype=np.float32))
>>> z = F.cos(x)
>>> z.data
array([0.87758255], dtype=float32)
>>> z.backward
>>>x.grad
array([0.47942555], dtype=float32)
ここで,
(\cos x)' = - \sin x
なので,
>>> - F.sin(x).data
array([0.47942555], dtype=float32)
同じ結果となることが確認できました.
なお,変数が多次元となる場合は,関数の傾きをあらかじめ指定する必要があるみたいです.
>>> x = Variable(np.array([-1, 0, 1], dtype=np.float32))
>>> z = F.sin(x)
>>> z.grad = np.ones(3, dtype=float32) #3次元の配列をあらかじめ作成
>>> z.backward()
>>> x.grad
array([0.54030228, 1., 0.54030228], dtype=float32)
なお,np.onesではなくnp.zerosを使うとx.gradの際に全て0になってしまいます.
>>> z.grad = np.zeros(3, dtype=float32) #3次元の配列をあらかじめ作成
>>> z.backward()
>>> x.grad
array([0., 0., 0.], dtype=float32)
ちなみにそれらしいsigmoid関数を使うと(sigmoid関数は(-∞, ∞)→ (0, 1)の単調増加連続関数.活性化関数として用いられる.)
>>> x = Variable(np.array([-1, 0, 1], dtype=np.float32))
>>> x.sigmoid(x).data
array([ 0.37754068], dtype=float32)
あっという間に計算できました.
#おわりに
簡単な計算のみになりましたが,今回はここまでにします.
次回はlinksオブジェクトについて書きます.
#参考
新納浩幸
Chainerによる実践深層学習~複雑なNNの実装方法~ オーム社