文本处理的padding

torchtext 可以选择将每个batch的sentences padding成同一个长度进行计算,除了运行速度和简便,我在想是不是有算法要求必须padding.
也有一些算法是要把所有的句子都padding成一个长度。

CNN

比较常用的方法是 Yoon Kim的方法,每个句子经过卷积层之后得到的其实是不同的kernel卷积的结果(根据kernel大小不同,卷积结果也长短不一),然后pooling。因为pooling不受限于输入的size大小,所以这里不同的batch可以用不同的pooling,并且pooling出来的size也是相同的。

在batch处理的时候,每个batch一起计算,为了保证kernel卷积出来的长度相等,所以每个batch padding成一个长度几乎是必需的

LSTM

LSTM是将句子中的词逐个输入LSTM神经元,那么hidden state的维度,其实是人为指定的。
(句子的长度不影响句子的embedding的长度)
在batch处理的时候,每个batch一起计算,那么padding成一个长度会简化计算。(或者说,如果按照batch的循环,每个句子同时处理,那么为了保证输入神经元的次数是一样的,那么每个batch padding成一个长度几乎也是必需的。

Attention

Attention在算相似度矩阵时,如果按照batch计算,是一定要padding的,因为这个Layer对每个pair产生一个矩阵,如果一个batch中的矩阵中的大小不一,那么对相似度矩阵的操作也将各不相同。

所以每个batch要padding成同一个长度。
那么是否要统一一下每个batch padding的长度呢?
这就取决于对相似度矩阵的操作是否可以无视相似度矩阵的大小。
比如,decomposable attention是利用相似度矩阵做加权平均,再和对应的词concat起来,
并且在最后每个句子求和,得到了一个向量,这个向量的维度其实是词向量的2倍,与任何句长都无关,那么这里每个batch 内部padding就可以了。

你可能感兴趣的:(文本处理的padding)