こんにちは、きちえです。
はじめに
こんにちは、きちえです。
最近chainerをいじっていて思っていなかった挙動を起こしたので、メモがわりに書いていきます。
以下インタラクティブなPython3で試していきます。
x.gradが出力される例
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)
x.gradが出力されない例
x_data = np.array([5], dtype=np.float32) x = Variable(x_data) y = x**2 - 2*x + 1</pre> <h1>xを再定義</h1> <pre> x = Variable(x_data) y.data Out[41]: array([16.], dtype=float32) x.grad y.backward() x.grad
言いたいこと
xを持ったyという式(y = x**2 – 2*x + 1)を持っている場合yを定義した後に、xを再定義すると勾配がもとまらない。
なぜ勾配が求まらないのか?
予想としては、変数を定義し直すと保存されているメモリ領域が、上書きではなく、新しいアドレスが再定義されるためだと考えています。
間違えそうだと思ったので記事化しました。
以上です〜
コメントを残す