theano中符号变量自动更新

Symbolic variables automatically update in theano

我正在按照给定 here 的 theano 教程进行简单的随机梯度下降。然而,在这里我无法理解在这个块中 p_y_given_xy_pred 的值是如何根据 Wb 的值自动更新的,因为后来当我们运行 test_logistic() 我们只更新 Wb 的值? 谢谢

class LogisticRegression(object):

    def __init__(self, input, n_in, n_out):
        self.W = theano.shared(
            value=numpy.zeros(
                (n_in, n_out),
                dtype=theano.config.floatX
            ),
            name='W',
            borrow=True
        )
        # initialize the baises b as a vector of n_out 0s
        self.b = theano.shared(
            value=numpy.zeros(
                (n_out,),
                dtype=theano.config.floatX
            ),
            name='b',
            borrow=True
        )
        self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)
        self.y_pred = T.argmax(self.p_y_given_x, axis=1)
        self.params = [self.W, self.b]

    def negative_log_likelihood(self, y):
        return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]), y])
        # end-snippet-2

    def errors(self, y):
        if y.ndim != self.y_pred.ndim:
            raise TypeError(
                'y should have the same shape as self.y_pred',
                ('y', y.type, 'y_pred', self.y_pred.type)
            )
        # check if y is of the correct datatype
        if y.dtype.startswith('int'):
            # the T.neq operator returns a vector of 0s and 1s, where 1
            # represents a mistake in prediction
            return T.mean(T.neq(self.y_pred, y))
        else:
            raise NotImplementedError() 

p_y_given_xy_pred 是符号变量(只是来自 Theano 的 python 对象)。那些指向 Theano 对象的 python 变量不会得到更新。它们只是代表我们想要做的计算。像伪代码一样思考。

编译Theano函数时会用到。只有到那时才会计算该值。但这不会导致指向对象 p_y_given_xy_pred 的 python 变量发生任何变化。对象未更改。

了解这种区别对某些人来说需要时间。这是一种新的思维方式。所以不要犹豫,问问题。有帮助的一件事是始终问自己是在符号世界还是数字世界。数字世界只发生在编译的 Theano 函数上。