※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。
>>> y = F.sin(x) >>> y.grad = np.ones(21,dtype=np.float16) # 追加, 勾配の初期化 >>> y.backward() >>> x.grad array([ -1.00000000e+00, -9.51171875e-01, -8.09082031e-01, -5.87890625e-01, -3.08837891e-01, 4.83751297e-04, 3.08837891e-01, 5.87890625e-01, 8.09082031e-01, 9.51171875e-01, 1.00000000e+00, 9.51171875e-01, 8.09082031e-01, 5.87890625e-01, 3.08837891e-01, 4.83751297e-04, -3.08837891e-01, -5.87890625e-01, -8.09082031e-01, -9.51171875e-01, -1.00000000e+00], dtype=float16)これで、配列xの各値に対するsin(x)の微分係数が求まっているはず。
>>> dy = F.cos(x) >>> dy.data array([ -1.00000000e+00, -9.51171875e-01, -8.09082031e-01, -5.87890625e-01, -3.08837891e-01, 4.83751297e-04, 3.08837891e-01, 5.87890625e-01, 8.09082031e-01, 9.51171875e-01, 1.00000000e+00, 9.51171875e-01, 8.09082031e-01, 5.87890625e-01, 3.08837891e-01, 4.83751297e-04, -3.08837891e-01, -5.87890625e-01, -8.09082031e-01, -9.51171875e-01, -1.00000000e+00], dtype=float16)どうやら一致しているようだが、目視確認なんて面倒くさい。
>>> x.grad-dy.data array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float16)Lazyはプログラマの最大の美徳であることを忘れてはいけない。