34.1_sin函数的实现

34.1 sin函数的实现

首先要实现的是支持高阶导数的新的Sin类。我们先来看一下式子, y=sin(x)y = \sin (x) 的导数为 yx=cos(x)\frac{\partial y}{\partial x} = \cos (x) 。因此,Sin类和sin函数可以通过如下代码实现。

dezero/functions.py

import numpy as np   
fromdezero.core import Function   
class Sin(Functions): defforward(self,x):  $\mathbf{y} = \mathbf{np}\cdot \sin (\mathbf{x})$
return y   
def backward(self, gy): x,  $=$  selfinputs  $\mathrm{gx} = \mathrm{gy}*\cos (\mathrm{x})$  return gx   
def sin(x): return Sin()x

这里重点看一下backward方法的实现。特别要注意的是,backward方法中的所有变量都是Variable实例(forward方法中的变量是ndarray实例)。因此,代码中的 cos(x)\cos(x) 是DeZero的 cos\cos 函数。这意味着要想实现Sin类,需要用到Cos类和 cos\cos 函数。

另外,backward方法的实现需要所有计算都使用DeZero函数。如果函数不是DeZero函数,就得重新实现它。上面代码中的乘法运算 gycos(x)\mathrm{gy} * \cos(x) 通过运算符重载调用了DeZero的mul函数。

dezero/functions.py中的Sin类的代码与上面的代码有一些不同。实际的代码中增加了支持GPU的代码。另外,本书后面出现的函数的代码中也省略了支持GPU的代码。步骤52中会实现对GPU的支持。