RNN无法做到的事情:
- can’t capture phrases without prefix context
- often capture too much of last words in final vector
所以引入了CNN:
- 为每个组合词都计算一个向量
- CNN的解决思路说来也很简单粗暴,那就计算相邻的ngram,不管它到底是不是真正的短语,眉毛胡子一把抓地为它们计算向量
举个例子:
sentence:the country of my birth
2-ngram:the country/country of/of my/my birth
3-ngram:the country of/country of my/of my birth
这通常会导致:
- 不符合语法规范噶
- 不符合阅读的一般认知
卷积
1维卷积/1d 卷积:
(
f
∗
g
)
[
n
]
=
∑
m
=
−
M
M
f
[
n
−
m
]
g
[
m
]
(f*g)[n] = \sum\limits_{m=-M}^Mf[n-m]g[m]
(f∗g)[n]=m=−M∑Mf[n−m]g[m]
这里过滤器的大小是2M,其中f是源目标,g是过滤器,移动过滤器2M的距离去想成,计算得分。
2维卷积/2d卷积:
得
分
=
∑
f
i
l
t
e
r
n
u
m
∗
图
像
n
u
m
得分=\sum filter_{num}*图像_{num}
得分=∑filternum∗图像num
理解深度学习中的卷积(值得一看)
卷积的形式化描述: 它是一种混合信息的手段,两个装满信息的桶,将一个桶倒入另一个桶中并且通过某种规则搅拌搅拌。也就是说卷积是一种混合两种信息的流程。
卷积的意义: 它就是一种数学运算,跟减加乘除没有本质的区别。虽然这种运算本身很复杂,但它非常有助于简化更复杂的表达式。
卷积核: 卷积是一种操作,卷积核是滤波矩阵。
feature map: 对于输入矩阵,经过滤波器后得到的新的矩阵。
图像卷积意义: 图像中可能含有很多我们不关心的噪音,如果你想要区分衣服的式样,那么衣服的颜色就不那么重要了;另外像商标之类的细节也不那么重要。最重要的可能是衣服的外形。卷积应用经常被称作滤波而卷积核经常被称作滤波器。
卷积神经网络/特征学习: 卷积神经网络,我们赋予参数给这些卷积核,参数将在数据上得到训练。随着卷积神经网络的训练,这些卷积核为了得到有用信息,在图像或feature map上的过滤工作会变得越来越好。
快速傅里叶变换: 一种将时域和空域中的数据转换到频域上去的算法。(一种映射的方法)
NLP中CNN示例
定义:
word vector:
x
i
∈
R
k
x_i \in R^k
xi∈Rk
sentence vector:
x
1
:
n
=
x
1
⊕
x
2
.
.
.
⊕
x
n
x_{1:n}=x_1\oplus x_2...\oplus x_n
x1:n=x1⊕x2...⊕xn(向量串联,1-n个词组成的句子向量)
convolution filter:
w
∈
R
h
k
w \in R^{hk}
w∈Rhk
feature:
c
i
=
f
(
w
T
x
i
:
i
+
h
−
1
+
b
)
c_i=f(w^Tx_{i:i+h-1}+b)
ci=f(wTxi:i+h−1+b)
feature map:
c
=
[
c
1
,
c
2
.
.
.
c
n
−
h
+
1
]
c=[c_1,c_2...c_{n-h+1}]
c=[c1,c2...cn−h+1]
取k=2, n=5, h=3,则如下:
narrow convolution: 对于前后边缘的词,为了保证其次数的公平性,会在句子的前后补0,这时候得到的就不再是
R
n
−
h
+
1
R^{n−h+1}
Rn−h+1的向量了
池化:
卷积不是最终目的,最终目的是将卷积结果输入到其他网络中去。在不补零的情况下,卷积结果c中有n−h+1个数,与n有关;而我们想要一个定长的输入。
max-pooling:
c
^
=
m
a
x
c
\hat c=max{c}
c^=maxc
其中 c ^ ∈ R \hat c\in R c^∈R,当然也可以用min,不过ReLU时经常结果是0,所以没什么意义。max的意义是,这个过滤器就是要过滤出最强烈的那个ngram,作为整段话的中心意思。
为了得到多个卷积特征,简单地使用多个卷积核(不需要大小一致),然后把池化结果拼接起来。
分类
最终m个卷积核输出的特征向量是:z=[c1,⋯,cm]
喂给最终的softmax层:y=softmax(W(S)z+b)
图示
一个漂亮的图示:
双通道词向量=>多个卷积核得到的feature map(红色是bigram,橙色是trigram)=>池化得到最终特征=>softmax分类输出。
dropout()
一种丢弃的方法:randomly mask/drop out/set to 0 for some of the feature。也相当于在数据上采样子集训练模型,然后平均起来(ensemble),通常可以带来2-4%的效果提升。
这些训练trick都相当于给GD引入噪声,让其不再肯定地瞄准一个局部最优,而是尽可能地探索尽可能多的landscape。以前挺有希望的高斯过程调参也不流行了,人们觉得随机采样超参数空间就已经惊人地好用了。
双通道不显著地带来了一点提升。这张对比表也暴露了深度学习学术界公开的“黑幕”,没有人把每个训练trick单独拎出来报告提升比;2014年之前几乎没人用Dropout,可最新发表的论文就是要跟它们比Dropout,却不愿把它们加入Dropout重新实现一遍(可能费时费力还不讨好吧,万一被baseline反杀不就完蛋啦)。事实上,这个结果只能说明Dropout比不Dropout有2-4%的提升,不能说明CNN多有效。