这个问题涉及Theano的最佳实践。这是我想要做的:
我正在为SMT系统构建神经网络。在这种情况下,我在概念上将句子表示为可变长度的单词列表,将单词表示为固定长度的整数列表。理想情况下,我想将我的语料库表示为3D张量(第一维=语料库中的句子,第二维=句子中的单词,第三维=单词中的整数特征)。困难在于句子长度可变,据我所知,Theano中的张量严格要求一维中的所有长度都必须相同。
我想到的解决方案包括:
我的问题是:这些替代品中哪一种更受欢迎,还是更好?
答案 0 :(得分:3)
在大多数情况下,第一个选项可能是最佳选择。它是我做的,虽然它确实意味着绕过一个单独的句子长度向量并屏蔽某些结果以在需要时消除填充区域。
通常,如果您想对所有句子执行一致的操作,那么您通常会将该操作应用于单个3D张量,而不是顺序地连接到一系列矩阵。对于在GPU上运行的操作尤其如此。
如果您正在使用扫描操作,速度差异将变得更加放大。你可以更好地扫描3D张量并在步长函数中的每个单词矩阵上操作,覆盖所有(或一小部分)句子。如果需要,您可能需要知道该矩阵的哪些行是实际数据,哪些是填充。另外,我发现将3D张量的第一个维度设置为时间/序列位置维度有助于在使用扫描时始终扫描第一维度。
通常,使用零值作为填充值将导致填充对您的操作没有影响。
另一个选项,循环句子,将意味着混合Theano和Python代码,这可能使一些计算变得困难或不可能。例如,如果数据存储在许多单独的矩阵中,则可能无法在所有(或批量)句子上获取关于某些参数的成本函数的梯度。