我正在使用Theano来实现Bengio et al 2003行的神经n-gram语言模型。这个模型使用了单词的分布式表示,我在编写一个符号表达式时遇到了麻烦,这个表达式允许我根据单词表示向量采用渐变。
根据论文中的符号,我有一个大小为 V xm 的单词表示矩阵C
,其中 V 是词汇量大小, m 是单词嵌入的维度。 C
的每一行都是一个单词的向量表示。
我的训练数据包括从语料库中提取的n-gram。我们说我让 n = 3 。然后我试图估计 P(w t | w t-1 ,w t-2 )。神经网络通过使用 w t-1 和 w t-2 的连接嵌入向量来估计此概率通过非线性函数预测 w t 。 (有关详细信息,请参阅该文章。)每个单词都由一个词汇表的索引表示,该词汇表还在C
中对其表示行进行索引。如果这些索引是 i 1 , i 2 , i 3 ,我正在尝试写一个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 xn - 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代码。我发现的所有教程材料都是用于在图像数据上编写神经网络,但我还没有看到任何关于如何进行分布式表示的示例。
答案 0 :(得分:3)
reshape
参数周围错过了一对额外的括号。以下作品。
function([X_var], C[X_var].reshape((X_var.shape[0], -1)))
虽然令人困惑,因为reshape
的{{1}}方法将采用我上面的两个参数或者像我在答案中那样的元组,但Theano只会编译后者。