わかりやすい自動売買入門書販売し始めました!

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

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

はじめに

こんにちは、きちえです。
最近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を再定義すると勾配がもとまらない。

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

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

以上です〜

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です