首页 文章

Theano中的可变长度张量

提问于
浏览
2

这个问题涉及Theano的最佳实践 . 这是我想要做的:

我正在为SMT系统构建一个神经网络 . 在这种情况下,我在概念上将句子表示为可变长度的单词列表,将单词表示为固定长度的整数列表 . 理想情况下,我想将我的语料库表示为3D张量(第一维=语料库中的句子,第二维=句子中的单词,第三维=单词中的整数特征) . 困难在于句子长度可变,据我所知,Theano中的张量有严格要求一维中的所有长度必须相同 .

我想到的解决方案包括:

  • 使用带有虚拟单词的填充,以使句子的大小相同 . 但这意味着每当我迭代一个句子时,我需要包含特殊代码来丢弃填充 .

  • 将语料库表示为矩阵向量 . 但是,这使得难以使用某些功能 . 例如,如果我想在句子中添加所有单词的表示,我不能简单地使用* corpus.sum(axis = 1)* . 我必须循环句子,执行* sentence.sum(axis = 0)*,然后将结果收集到另一个张量中 .

我的问题是:哪些替代品更受欢迎,还是更好?

1 回答

  • 3

    在大多数情况下,第一种选择可能是最佳选择 . 这就是我所做的,虽然它确实意味着绕过一个单独的句子长度向量并屏蔽某些结果以在需要时消除填充区域 .

    一般来说,如果你想对所有句子执行一致的操作,那么你通常可以更快地将该操作应用于单个3D张量而不是顺序地应用于一系列矩阵 . 对于在GPU上运行的操作尤其如此 .

    如果您正在使用扫描操作,速度差异将变得更加放大 . 你最好扫描一个3D张量并在你的步长函数中使用每个单词矩阵进行操作,该函数涵盖了所有(或一小部分)句子 . 如果需要,您可能需要知道该矩阵的哪些行是实际数据,哪些是填充 . 另外,我发现将3D张量的第一个维度设置为时间/序列位置维度有助于在使用扫描时始终扫描第一维度 .

    通常,使用零值作为填充值将导致填充对您的操作没有影响 .

    另一个选择,循环句子,将意味着混合Theano和Python代码,这可能使一些计算变得困难或不可能 . 例如,如果数据存储在许多单独的矩阵中,则可能无法在所有(或批量)句子上获取关于某些参数的成本函数的梯度 .

相关问题