※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。
y = cos(sin(x))以下、前回と同じで、式の部分が異なる。
>>> x = Variable(np.array(np.linspace(-np.pi, np.pi, 21), dtype=np.float16)) >>> y = F.cos(F.sin(x)) >>> y.data array([ 1. , 0.95263672, 0.83251953, 0.68994141, 0.58056641, 0.54052734, 0.58056641, 0.68994141, 0.83203125, 0.95263672, 1. , 0.95263672, 0.83203125, 0.68994141, 0.58056641, 0.54052734, 0.58056641, 0.68994141, 0.83251953, 0.95263672, 1. ], dtype=float16) >>> y.grad = np.ones((21),dtype=np.float16) >>> y.backward() >>> x.grad array([ -9.67502594e-04, -2.88574219e-01, -4.48486328e-01, -4.25537109e-01, -2.51464844e-01, 4.06980515e-04, 2.51464844e-01, 4.25537109e-01, 4.48730469e-01, 2.89306641e-01, -0.00000000e+00, -2.89306641e-01, -4.48730469e-01, -4.25537109e-01, -2.51464844e-01, -4.06980515e-04, 2.51464844e-01, 4.25537109e-01, 4.48486328e-01, 2.88574219e-01, 9.67502594e-04], dtype=float16)これで、ちゃんと微分ができているような気がする。
>>> dy = - F.cos(x) * F.sin(F.sin(x)) >>> dy.data array([ -9.67502594e-04, -2.88574219e-01, -4.48486328e-01, -4.25537109e-01, -2.51464844e-01, 4.06980515e-04, 2.51464844e-01, 4.25537109e-01, 4.48730469e-01, 2.89306641e-01, -0.00000000e+00, -2.89306641e-01, -4.48730469e-01, -4.25537109e-01, -2.51464844e-01, -4.06980515e-04, 2.51464844e-01, 4.25537109e-01, 4.48486328e-01, 2.88574219e-01, 9.67502594e-04], 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) >>> np.max(np.abs(x.grad - dy.data)) 0.0複雑なのでもできるようだ。
>>> x = Variable(np.array(np.linspace(0.1, 2.0, 20), dtype=np.float16)) >>> y = x ** F.arctan(x) >>> y.data array([ 0.79492188, 0.72802734, 0.70410156, 0.70556641, 0.72509766, 0.75878906, 0.80419922, 0.85986328, 0.92578125, 1. , 1.08203125, 1.17285156, 1.27148438, 1.37695312, 1.48925781, 1.60839844, 1.73535156, 1.86816406, 2.0078125 , 2.15429688], dtype=float16) >>> y.grad = np.ones((20),dtype=np.float16) >>> y.backward() >>> x.grad array([-1.01953125, -0.40820312, -0.09423828, 0.11425781, 0.27001953, 0.39892578, 0.50927734, 0.60839844, 0.70019531, 0.78515625, 0.86621094, 0.94433594, 1.01953125, 1.09179688, 1.16210938, 1.22949219, 1.296875 , 1.36230469, 1.42675781, 1.49121094], dtype=float16) >>> >>> dy = x**F.arctan(x) * (F.log(x)/(1+x*x) + F.arctan(x)/x) >>> dy.data array([-1.02050781, -0.40820312, -0.09350586, 0.1137085 , 0.27001953, 0.39868164, 0.50927734, 0.60839844, 0.70019531, 0.78515625, 0.86572266, 0.94384766, 1.01953125, 1.09082031, 1.16210938, 1.22949219, 1.29785156, 1.36328125, 1.42675781, 1.49121094], dtype=float16) >>> >>> x.grad - dy.data array([ 0.00097656, 0. , -0.00073242, 0.00054932, 0. , 0.00024414, 0. , 0. , 0. , 0. , 0.00048828, 0.00048828, 0. , 0.00097656, 0. , 0. , -0.00097656, -0.00097656, 0. , 0. ], dtype=float16) >>> np.max(np.abs(x.grad - dy.data)) 0.00097656さて、次から多変数関数の微分、つまり偏微分をする。