处理这些不同的义务,从模型角度来讲什么最重要?是特征抽取器的才能。尤其是深度学习盛行开来后,这一点更凸显出来。由于深度学习最大的优点是「端到端(end to end)」,当然这里不是指的从客户端到云端,意思是以前研发人员得思索设计抽取哪些特征,而端到端时代后,这些你完全不用管,把原始输入扔给好的特征抽取器,它本人会把有用的特征抽取出来。
下面说过,RNN 不能并行计算的症结所在,在于 T 时辰对 T-1 时辰计算结果的依赖,而这体如今隐层之间的全衔接网络上。既然症结在这里,那么要想处理成绩,也得在这个环节下手才行。在这个环节多做点什么事情可以添加 RNN 的并行计算才能呢?你可以想一想。
其实留给你的选项并不多,你可以有两个大的思绪来改进:一种是照旧保留恣意延续工夫步(T-1 到 T 时辰)之间的隐层衔接;而另外一种是部分地打断延续工夫步(T-1 到 T 时辰)之间的隐层衔接。
我们先来看第一种方法,如今我们的成绩转化成了:我们照旧要保留恣意延续工夫步(T-1 到 T 时辰)之间的隐层衔接,但是在这个前提下,我们还要可以做到并行计算,这怎样处理呢?由于只需保留延续两个工夫步的隐层衔接,则意味着要计算 T 时辰的隐层结果,就需求 T-1 时辰隐层结果先算完,这不又落入了序列依赖的圈套里了吗?嗯,的确是这样,但是为什么一定要在不同工夫步的输入之间并行呢?没有人说 RNN 的并行计算一定发生在不同工夫步上啊,你想想,隐层是不是也是包含很多神经元?那么在隐层神经元之间并行计算行吗?假如你要是还没了解这是什么意思,那请看下图。
最早将 CNN 引入 NLP 的是 Kim 在 2014 年做的工作,论文和网络结构参考上图。普通而言,输入的字或者词用 Word Embedding 的方式表达,这样本来一维的文本信息输入就转换成了二维的输入结构,假设输入 X 包含 n 个字符,而每个字符的 Word Embedding 的长度为 d,那么输入就是 d*n 的二维向量。
卷积层本质上是个特征抽取层,可以设定超参数 F 来指定卷积层包含多少个卷积核(Filter)。对于某个 Filter 来说,可以想象有一个 d*k 大小的移动窗口从输入矩阵的第一个字末尾不断往后移动,其中 k 是 Filter 指定的窗口大小,d 是 Word Embedding 长度。对于某个时辰的窗口,经过神经网络的非线性变换,将这个窗口内的输入值转换为某个特征值,随着窗口不断往后移动,这个 Filter 对应的特征值不断产生,构成这个 Filter 的特征向量。这就是卷积核抽取特征的过程。卷积层内每个 Filter 都如此操作,就构成了不同的特征序列。Pooling 层则对 Filter 的特征停止降维操作,构成最终的特征。普通在 Pooling 层之后衔接全联接层神经网络,构成最后的分类过程。