从RNN到CNN
RNN的输入是一个完整的序列,其每一个时间步的输出均受到之前时间步的影响,RNN最终捕捉的是整个序列的特征信息,而一些NLP问题可能更加关注于句子的局部信息(例如本文分类),这一点是CNN的强项。
CNN解决NLP问题的出发点
按照窗口大小,在原序列上进行滑动,获得不同相同长度的子序列(语义可能无关),对于这些个子序列分别计算向量信息
- 忽略了语法和语义信息,只是距离上的临近
- 没有RNN的语法语义上的说服性(你就这样随便划分,提取出来的向量能有用?)
NLP中的CNN类似于图像处理中的多通道一维卷积问题(conv1d)
- 同样通过增加空向量,实现padding操作
- 使用多个卷积核,实现多通道输出
- pooling over time,k-max pooling over time,dilation pooling
Batch Normalization
作为网络的一层,对输入的一个batch进行标准化处理(减均值,除以方差),能够有效的降低深度网络的学习难度
batch分布不断变化导致模型拟合偏差
- 每次梯度下降根据输入batch的分布计算,或者说拟合的是输入的分布
- 不同batch分布不同,导致每次拟合不断改变方向(类似于无头苍蝇),导致学习速率减慢
- 在机器学习或者浅层模型中,这种问题并不严重,而在深度网络中,每一层都在进行着(无头苍蝇拟合),为了避免震荡,必须将学习率设置的小一些(Internal Covariate Shift)。
BN的主要操作:
- 对batch数据进行标准化操作(减均值,除以方差)
- 这一步的参数是由输入batch决定的不需要学习
- 对标准化后的数据进行平移和放缩(修改均值,和方差)
- 平移和放缩的量由网络学习得到,即batch分布的均值和方差由学习得到
BN带来的好处:
- 所有变换均为线性变换,反向传播求导较为简单
- 可以使用更大的学习率
- 权重的大小和初始化值不再重要,bias也可以设置为0
CNN的应用
Translation
使用cnn作为encoder,rnn作为decoder
使用cnn实现深度nlp文本分类系统