Символьные переменные автоматически обновляются в theano

Я следую учебнику theano, приведенному здесь для простого стохастического градиентного спуска. Однако здесь я не могу понять в этом блоке, как значения p_y_given_x и y_pred автоматически обновляются в соответствии со значениями W и b, поскольку позже, когда мы запускаем test_logistic(), мы только обновляем значения W и b? Спасибо

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() 

person tangy    schedule 18.01.2015    source источник


Ответы (1)


p_y_given_x и y_pred являются символическими переменными (просто объект Python из Theano). Те переменные Python, которые указывают на объект Theano, не обновляются. Они просто представляют вычисление, которое мы хотим сделать. Думайте, как в псевдокоде.

Они будут использоваться при компиляции функции Theano. Только после этого будет вычислено значение. Но это не приводит к изменению переменной Python, указывающей на объект p_y_given_x и y_pred. Объект не изменен.

Понимание этого различия требует времени для некоторых людей. Это новый способ мышления. Так что не стесняйтесь задавать вопросы. Одна вещь, которая помогает, — это всегда спрашивать себя, находитесь ли вы в символическом мире или в числовом мире. числовой мир происходит только с скомпилированной функцией Theano.

person nouiz    schedule 21.01.2015
comment
Я все еще немного запутался, согласился, что все это работает с точки зрения псевдокода, однако как обновление общих переменных self.W и self.b автоматически приводит к обновлению значений, обозначенных символическими переменными, полученными из этих общих переменных? - person tangy; 24.01.2015
comment
Теано следит за этим. Когда вы вызываете theano.function(), мы просто сохраняем ссылку на контейнер, в котором находится значение. Контейнер — это нечто внутреннее в Theano, о котором вам не нужно знать (просто обычный класс python, который обертывает значение). Это просто позволяет нам иметь скомпилированную функцию и общую переменную для доступа к одним и тем же базовым данным. Функция и общая переменная имеют ссылку на один и тот же контейнер. Таким образом, оба всегда видят одно и то же значение. - person nouiz; 27.01.2015
comment
Спасибо! Итак, я пришел к выводу, что каждая тензорная переменная, которая была вычислена с использованием общей переменной, будет автоматически обновляться, как только будет обновлено значение соответствующей общей переменной. - person tangy; 30.01.2015