オライリー・ジャパンの「ゼロから作る Deep Learning」という本についての質問です。

疑問は、「定数関数を微分してるから結果はゼロになるんじゃないか?」というものですが、とりあえず関数を見てください。本を持ってる人は、p.159ページです。

def loss(self, x, t):
    y = self.predict(x)
    return self.lastLayer.forward(y, t)

def numerical_gradient(self, x, t):
    loss_W = lambda W: self.loss(x, t)

    grads = {}
    grads['W1'] = numerical_gradient(loss_W, self.params['W1'])
    grads['b1'] = numerical_gradient(loss_W, self.params['b1'])
    grads['W2'] = numerical_gradient(loss_W, self.params['W2'])
    grads['b2'] = numerical_gradient(loss_W, self.params['b2'])

    return grads

問題はnumerical_gradientで、これにxとtを代入すると、まずself.loss(x, t)が定数として確定します(これをcとおきます)。次に、loss_W = lambda W: self.loss(x, t)は、Wに関係なく定数cを返す定数関数として確定します。これに対してnumerical_gradientをしてもcの微分なので0しか返ってこないのでは?

numerical_gradientの中身は次のようになります。

def numerical_gradient(f, x):
    h = 1e-4
    grad = np.zeros_like(x)

    for idx in range(x.size):
        tmp_val=x[idx]
        # f(x+h)の計算
        x[idx] = tmp_val + h
        fxh1 = f(x)

        #f(x-h)の計算
        x[idx] = tmp_val - h
        fxh2 = f(x)

        grad[idx] = (fxh1 - fxh2) / (2*h)
        x[idx] = tmp_val

    return grad

つまり、numerical_gradient(loss_W, self.params['W1'])は、loss_W(Wij+h)やloss_W(Wij-h)を計算して(loss_W(Wij+h) - loss_W(Wij-h))/ (2*h)とかを出力しますが、loss_W(Wij+h)=loss_W(Wij-h)=self.loss(x, t)=cなので、ゼロしか返さないのでは?ということです。

わかる方お願いします!