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 は、テストしたいと考えている関数が入ります。

この勾配は

g(α)=fg(α)=f(αx)x.

であり、α=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)
Note

func は、全ての入力の数値勾配を取得するために、何度も呼び出されます。この関数は func が異なる勾配を取得し、ランダムに振る舞うとき、正しく動作しません。

Parameters:
  • func (callable) –Variable を取得し、Variable を返す関数。func はmust returns a tuple of Variable のタプル、もしくは単体を返さなければなりません。 Function オブジェクト、 Link オブジェクト、もしくはこの条件を満たす関数を 使用することが
  • x_data (ndarray or tuple of ndarrays) – funcに渡されるndarrayの集合。x_data が ndarray オブジェクトの単体である場合、(x_data,)として、扱われる。
  • y_grad (ndarray or tuple of ndarrays or None) –  func.の戻り値を表す ndarray の集合。s y_grad が単体の ndarray オブジェクトである場合、 (y_grad,)として扱われる。  func は損失関数であるならば、y_grad はNoneが設定されなければならない。
  • params (Variable or tuple of ~chainder.Variable) –勾配がチェックされた Variable の集合。func が Link オブジェクトである場合、そのパラメータを paramsとして設定する。  params が単体の Variable オブジェクトである場合、 (params,)として扱われる。
  • eps (float) –  numerical_grad().に渡されるイプシロン値。
  • atol (float) – chainer.testing.assert_allclose()へ渡される絶対公差。
  • rtol (float) – chainer.testing.assert_allclose()へ渡される相対公差。
  • no_grads (list of bool) – 勾配表明のためのVariableをスキップするかどうかのフラグ。 x_data.と同じ長さでなければならない。
  • dtype (dtype) – x_data、 y_grad そしてparams は数値勾配計算時、このdtypeにキャストされる。 float型と None のみが許可されている。
See also

numerical_grad()