【问题标题】:Broadcasting of shared variables in logistic regression with theano使用 theano 在逻辑回归中广播共享变量
【发布时间】:2016-09-08 21:16:28
【问题描述】:

我目前正在通过 theano tutorial 进行逻辑回归,非常类似于这篇文章中讨论的内容: what-does-negative-log-likelihood-of-logistic-regression-in-theano-look-like。但是,原来的tutorial 使用共享变量 W 和b,以及一个称为输入 的矩阵。输入是n x n_in 矩阵,W 是n_in x n_out,b 是n_out x 1 列向量。

    self.W = theano.shared(
        value=numpy.zeros(
            (n_in, n_out),
            dtype=theano.config.floatX
        ),
        name='W',
        borrow=True
    )

    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)

现在,据我从共享变量的文档中了解到,共享变量的广播模式默认为 false。那为什么这行代码没有因为尺寸不匹配而抛出错误呢?

self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)

毕竟,我们将矩阵T.dot(input, self.W) 添加到向量b。毕竟默认情况下共享变量会广播吗?即使有广播,维度也不会加起来。 T.dot(input, self.W)n x n_out 矩阵和 b 是 n_out x 1 向量。

我错过了什么?

【问题讨论】:

    标签: theano


    【解决方案1】:

    默认情况下共享变量是不可广播的,因为它们的形状可以改变,但是,当请求像向矩阵添加标量、向矩阵添加向量等操作时,Theano 会使用张量进行必要的广播。查看documentation 了解更多详情。 请注意,input 是符号变量而不是共享变量。如果self.W 的第二维即 n_out 与向量b 的第一维不同,则会发生尺寸不匹配,这里不是这种情况,所以它们完美地相加,是一样的在 numpy 中也是如此:

    import numpy as np
    a = np.asarray([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
    b = np.asarray([1,2,3])
    print(a + b)
    

    【讨论】:

    • 感谢您的回答。但是,我仍然缺少一个细节:self.b 是一个共享变量,它被添加到T.dot(input, self.W)。因此,我们似乎需要广播才能完成这项工作,但是 self.b 并未被定义为可广播。为什么它仍然有效?我理解为什么它适用于符号变量或纯 numpy,但不明白为什么它适用于共享变量。
    • 因为T.dot(input, self.W) 将返回符号矩阵/向量。 theano.tensor.dot(X, Y)
    • 好的,在您的帮助下,我发现了我的错误。当我在 theano 的 docu 中读到这个时,它发出了点击:当一个元素操作(如加法或减法)的两个参数具有不同的维数时,可广播模式通过填充向左扩展是的。因此,假设在运行时这也适用于共享变量,默认情况下具有可广播模式[false, false, ...],现在一切都有意义了。我的错误是假设共享变量不会发生填充。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2016-06-30
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多