【Chainer】gradがもとまらない?【Python】

2018年5月27日

こんにちは、きちえです。

はじめに

こんにちは、きちえです。
最近chainerをいじっていて思っていなかった挙動を起こしたので、メモがわりに書いていきます。

以下インタラクティブなPython3で試していきます。

x.gradが出力される例

[Python]
x_data = np.array([5], dtype=np.float32)

x = Variable(x_data)

x
Out[30]: variable([5.])

y = x**2 – 2*x + 1

y.data
Out[32]: array([16.], dtype=float32)

x.grad
#出力なし

y.backward()

x.grad
Out[36]: array([8.], dtype=float32)
[/Python]

x.gradが出力されない例

[Python]
x_data = np.array([5], dtype=np.float32)

x = Variable(x_data)

y = x**2 – 2*x + 1

xを再定義

x = Variable(x_data)

y.data
Out[41]: array([16.], dtype=float32)

x.grad

y.backward()

x.grad
[/Python]

言いたいこと

xを持ったyという式(y = x**2 – 2*x + 1)を持っている場合yを定義した後に、xを再定義すると勾配がもとまらない。

なぜ勾配が求まらないのか?

予想としては、変数を定義し直すと保存されているメモリ領域が、上書きではなく、新しいアドレスが再定義されるためだと考えています。
間違えそうだと思ったので記事化しました。

以上です〜