【问题标题】:Theano cost functionTheano 成本函数
【发布时间】:2015-10-24 17:06:32
【问题描述】:

我正在尝试学习如何使用 Theano。我经常使用生存分析,因此我想尝试使用 Theano 的自动微分和梯度下降来实现标准生存模型。我尝试实现的模型称为 Cox 模型,这里是维基百科文章:https://en.wikipedia.org/wiki/Proportional_hazards_model

非常有帮助,他们在那里编写了部分似然函数,这是在估计 Cox 模型的参数时最大化的函数。我对 Theano 很陌生,因此在实现这个成本函数时遇到了困难,所以我正在寻找一些指导。

这是我到目前为止编写的代码。我的数据集有 137 条记录,这也是我硬编码该值的原因。 T 指的是张量模块,W 指的是维基百科文章所说的 beta,status 是维基百科所说的 C。其余变量与维基百科的符号相同。

def negative_log_likelihood(self, y, status):
    v = 0
    for i in xrange(137):
        if T.eq(status[i], 1):
            v += T.dot(self.X[i], self.W)
            u = 0
            for j in xrange(137):
                if T.gt(y[j], y[i]):
                    u += T.exp(T.dot(self.X[j], self.W))
            v -= T.log(u)

    return T.sum(-v)

不幸的是,当我运行这段代码时,我不幸遇到了无限递归错误,我希望不会发生这种错误。这让我觉得我没有以 Theano 想要的方式实现这个成本函数,所以我希望得到一些关于如何改进这个代码以使其工作的指导。

【问题讨论】:

    标签: python optimization machine-learning theano


    【解决方案1】:

    您正在混合符号和非符号操作,但这不起作用。

    例如,T.eq 返回一个不可执行的 symbolic 表达式,表示比较两个事物是否相等的想法,但它实际上并没有立即进行比较。 T.eq 实际上返回一个表示相等比较的 Python 对象,并且由于非 None 对象引用被认为与 Python 中的 True 相同,因此将始终在 if 语句内继续执行。

    如果您需要构建一个涉及条件的 Theano 计算,那么您需要使用它的两个符号条件操作之一:T.switchtheano.ifelse.ifelseSee the documentation for examples and details.

    您还使用了 Python 循环,这可能不是您所需要的。要构建显式循环的 Theano 计算,您需要使用 theano.scan module。但是,如果您可以用矩阵运算(点积、归约等)来表达您的计算,那么它的运行速度将比使用扫描的运算快得多。

    我建议您在尝试从头开始实现一些复杂的东西之前,通过更多 Theano tutorials 工作。

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 2017-08-06
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      相关资源
      最近更新 更多