首页 文章

Theano功能内的索引体操

提问于
浏览
1

我正在使用Theano来实现Bengio et al 2003行的神经n-gram语言模型 . 这个模型使用了单词的分布式表示,我在编写一个符号表达式时遇到了麻烦,这个表达式允许我对单词表示向量采用渐变 .

根据论文中的符号,我有一个大小为V x m的单词表示矩阵 C ,其中V是词汇量大小,m是单词嵌入的维度 . C 的每一行都是一个单词的向量表示 .

我的训练数据包括从语料库中提取的n-gram . 假设我让n = 3.然后我试图估计P(wt | wt-1,wt-2) . 神经网络通过使用wt-1和wt-2的级联嵌入向量来通过非线性函数来预测wt来估计该概率 . (有关详细信息,请参阅该文章 . )每个单词都由一个词汇表索引表示,该词汇表还在 C 中对其表示行进行索引 . 如果这些索引是i1,i2和i3,我正在尝试写一个Theano表达式 .

f(i_3, C[i_1].C[i_2])

其中 f 包含隐藏层和非线性函数, C[i_1].C[i_2] 是数组 C[i_1]C[i_2] 的串联 . 我要做的第一件事是为 C[i_1].C[i_2] 写一个象征性的Theano表达式 . 此外,此功能不仅需要单个训练实例,还需要一小批多个训练实例 .

如果我直接使用numpy matricies而不是抽象的Theano表达式,我知道如何做到这一点 . 例如,如果 C 是共享的,并且 X 是N x n - 1个单词索引的N个训练向量的小批量,我可以像这样查找连接的向量:

C.get_value()[X].reshape(X.shape[0], -1)

(我在StackOverflow上学到了一些索引体操elsewhere . )

但是,当我尝试将此表达式编译为Theano函数时,我遇到了错误 .

X_var = T.lmatrix('X_var')
function([X_var], C[X_var].reshape(X_var.shape[0], -1))

前面给出了这个错误

Exception: ('The following error happened while compiling the node'
, Reshape{-1 (AdvancedSubtensor1.0, InplaceDimShuffle{x}.0), 
'\n', "Compilation failed (return status=1): 
/Users/williammcneill/.theano/compiledir_Darwin-13.3.0-x86_64-i386-64bit-i386-2.7.6-64/tmpOlUO0n/mod.cpp:300:31: error: 
'new_dims' declared as an array with a negative size.
             npy_intp new_dims[-1];.
                               ^~. 1 error generated.. ", '[Reshape{-1}(<TensorType(float64, matrix)>, <TensorType(int64, (True,))>)]')

我认为这意味着Theano编译器不支持将-1作为最终重塑参数的索引技巧 .

等效命令会产生不同的错误 .

function([X_var], C[X_var].reshape(X_var.shape[0], X_var.shape[1]*X_var.shape[2]))

ValueError: Expected ndim to be an integer, is <class 'theano.tensor.var.TensorVariable'>

我需要为 f 编写符号表达式,以便我可以根据 C 获取其渐变 . 任何人都可以帮我这样做吗?

或者,有人可以指向我使用单词嵌入的示例Theano代码 . 我发现的所有教程材料都是用于在图像数据上编写神经网络,但我还没有看到任何关于如何进行分布式表示的示例 .

1 回答

  • 3

    好吧,我是个白痴 . 均田 . 我在 reshape 论点附近错过了一对额外的括号 . 以下作品 .

    function([X_var], C[X_var].reshape((X_var.shape[0], -1)))
    

    这令人困惑,因为 arrayreshape 方法将采用我上面的两个参数或者像我在答案中那样的元组,但Theano只会编译后者 .

相关问题