1.4 Pooling
假设我们不使用补零,我们将得到最终的卷积输出, 有 −
ℎ+1
个数。通常,我们希望接收 CNN 的输出,并将其作为输
入,输入到更深层,如前馈神经网络或 RecNN。但是,所有这
些都需要一个固定长度的输入,而 CNN 输出的长度依赖于句
子的长度
。解决这个问题的一个聪明的方法是使用 max-
pooling。CNN 的输出 ∈
ℝ
−ℎ−1
是 max-pooling 层的输入。
max-pooling 的输出层
=max{}
,因此
∈ℝ
。
我们也可以使用最小池化,因为通常我们使用 ReLU 作为非线
性激活函数而 ReLU 的下界是 0。因此,一个最小池化可能会
被 ReLU 覆盖,所以我们几乎总是使用最大池化而不是最小池
化。
1.5 Multiple-Filters
在上面与图 2 相关的例子中,我们有 h = 2,这意味着我们只
使用一个特定的组合方法,即使用过滤器来查看 bi-grams。我
们可以使用多个 bi-grams 过滤器,因为每个过滤器将学习识
别不同类型的 bi-grams。更一般地说,我们并不仅限于使用
bi-grams,还可以使用 tri-grams、 quad-grams 甚至更长的
过滤器。每个过滤器都有一个关联的最大池化层。因此,CNN
层的最终输出将是一个长度等于过滤器数量的向量
1.6 Multiple-Channels
如果我们允许梯度流入这里使用的单词向量,那么单词向量可能
会随着训练而发生显著变化。这是需要的,因为它将单词向量专
门用于当前特定任务(远离 GloVe 初始化)。但是,如果单词只
出现在测试集中而没有出现在训练集上呢?虽然出现在训练集中
的其他语义相关的单词向量将从它们的起始点显著移动,但是这
些单词仍将处于它们的初始点。神经网络将专门用于已更新的输
入。因此,我们在使用这些单词的句子中会表现得很差。
一种方法是维护两组单词向量,一组“静态”(没有梯度流)和一
组“动态”(通过 SGD 更新)。它们最初是一样的(GloVe 或者
其他初始化)。这两个集合同时作为神经网络的输入。因此,初
始化的词向量在神经网络的训练中始终起着重要的作用。在测试
中给出看不见的单词可以提高正确理解的几率。