chainer.gradient_check.
check_backward
(func, x_data, y_grad,
params=(), eps=0.001, atol=1e-05, rtol=0.0001, no_grads=None, dtype=None)[source]¶
与えられた関数のテストの逆方向への演算。
この関数は与えられた関数のバックワード・プロセスを自動的にチェックします。例えば、 Function
クラスの2つの引数を取得し1つの値を返す MyFunc
を持っているとき、 これを下記のようにして、チェックすることができます。
>> def test_my_func(self):
>> func = MyFunc()
>> x1_data = xp.array(...)
>> x2_data = xp.array(...)
>> gy_data = xp.array(...)
>> check_backward(func, (x1_data, x2_data), gy_data)
このメソッドは x_data
を伴う Variable
を生成し、 処理の結果をVariable
として取得するために Variable
を伴うfunc
を呼び出します。それから、y_grad
配列をその結果の grad
属性にセットし、入力の勾配を取得するために backward
メソッドを呼び出します。勾配の正しさをチェックするために、この関数は numerical_grad()
を呼び出し、数値的に勾配を計算し、この勾配の型をchainer.testing.assert_allclose()
と比較します。
計算時間を減らすため、, 関数 g:ℝ→ℝn を用います。
これは g(α)=f(αx) と定義されており、ただし α∈ℝα∈ℝ かつ ff は、テストしたいと考えている関数が入ります。
この勾配は
であり、α=1のとき,g'(1)=f'(x)⋅ xです。 numerical_grad()
でg'(1)を計算をし、勾配のドット積と比較します。
入力オブジェクトが整数を表しているとき、 (この学習データ中でx1_data
または/かつ x2_data
)
それらの勾配は無視されます。
MyFunc
が引数を1個のみの場合、テストを簡略化することが可能です。
>> check_backward(func, x1_data, gy_data)
MyFunc
が損失関数であり、0次元の配列を返し、None
を gy_data
へ渡すとき、 この場合、 1
を結果の grad
属性に設定します。
>> check_backward(my_loss_func, (x1_data, x2_data), None)
MyFunc
が複数の出力を返す場合、出力の全ての勾配をタプルとして返します。
>> gy1_data = xp.array(...)
>> gy2_data = xp.array(...)
>> check_backward(func, x1_data, (gy1_data, gy2_data))
Link
をテストすることもできます。Linkのパラメータの勾配をチェックするため、パラメータのタプルを params
引数へセットします。
>> check_backward(my_link, (x1_data, x2_data), gy_data,
>> (my_link.W, my_link.b))
params
は ndarray
ではなく、 Variables
であることに注意してください。
Function オブジェクトは func
引数として受け入れ可能です。
>> check_backward(lambda x1, x2: f(x1, x2),
>> (x1_data, x2_data), gy_data)
func
は、全ての入力の数値勾配を取得するために、何度も呼び出されます。この関数は func
が異なる勾配を取得し、ランダムに振る舞うとき、正しく動作しません。
Parameters: |
|
---|