写在前面的说明
这个系列【ML-2020/21】大部分是课上内容的简单复述,之前上过但因为笔记写得很乱就忘了很多,所以重来一遍。与其看我这篇,不如直接去看视频,讲得还更生动。视频系列链接$\rightarrow$这里。
这里介绍两个常见的Network架构,分别为CNN 和 Self-Attention。
CNN
CNN主要是用来处理图像的,对于Fully Connected Network,每个神经元都要观察整张图片,这明显不是高效率的做法,所以更常见的是让每个神经元处理某一特定的pattern,,比如说就像下图:
我们就希望能简化这个网络,这里有两种解释。
两种解释
1. Receptive field
就像下图那样:
每个神经元只负责其中一个区域的信息,并且,同个区域可以有多个不同的神经元负责。
另外,这个Receptive field可以有大有小,也可以让Receptive field只考虑某一特定的channel,比如rgb里的红色区域。
一般来说,最经典的size大小是$3\times 3$,然后对于同一个Receptive field,一般会有一组神经元(比如64或者128个)去处理它,而且一般来说这个Receptive field的排布是会重叠的,以保证覆盖整个图像,如下:
parameter sharing
对于下面这种情况:
鸟喙出现在图中的不同位置,由于每个pattern都有很多个神经元去处理,所以理所当然地,这两种情况都能把鸟喙给检测出来,但对于同种作用的检测器,我们明显不希望它们分属两个不同的东西,不然参数会很多,所以就希望,对于相同作用的检测器,它们的参数应该是相同的(即参数共享)。
至此,就一步步地将模型简化了,如下图所示:
这就是convolutional layer,而用了convolutional layer的就是CNN。另外,CNN的$bias$一般会比较大。
2. Filter
对于convolutional layer的另一种解释是用Filter。如下图:
以右上角这个filter为例,从图片左上角一直滑到右下角,对应相乘后相加。对于每个卷积层都有很多个Filters。
另外,虽然这个filter只是$3\times 3$的,但由于不断进行卷积,每一个卷积层都把它的考虑范围扩大了,如下图,下面那层的$3\times 3$等于是考虑了上面那层的$5\times 5$范围:
也就是说,network越深考虑的范围越大。
上面的parameter sharing实际就是这里的filter扫过各个区域过程。
上面的receptive filter实际就是这里的不同的filter。
所以两种解释其实是一模一样的。
Pooling
pooling的思想源于降采样,即是对于一幅图,我们把它进行将采用,比如把一幅图的偶数像素都删除,并不妨碍我们识别这幅图。如下图:
pooling是不需要学习的,就跟激活函数类似。
Max Pooling
除了Max pooling,还有mean Pooling之类的,都差不多。
基本概念就是选各个区域最大的那个数,比如下图:
选完之后就变成下面这样了:
这里区域大小也是自己定的,不一定要用$2\times 2$。通过这个操作就能把”图片“变小。这个池化层一般是和卷积层交替使用的。
pooling 是为了减少运算量,但现在由于运算能力的发展,越来越多地方开始去除pooling层了,这也是一种趋势。
至此就有了CNN的基本架构了:
Self-Attention
在CNN中,我们的输入都是一个向量,但如果遇到输入是一组向量的话该怎么办?比如说语言处理,输入的单词长度都不一样,Self-Attention 就是解决这种问题的一种办法。
在这种架构中对于输出一般有以下三种情况:
- $N$个输入对应$N$个输出,比如说输入一句话,我们要分析每个单词对应的词性。
- $N$个输入对应$1$个输出,比如输入一句话,分析其是褒义还是贬义。
- $N$个输入对应$M$个输出,比如翻译。
这里先介绍第一种,即同维度输入输出。以输入一句话为例。
第一种最直接的想法是用Fully Connected,由于要考虑单词间的联系,就有了如下这种结构:
这确实能做,某些情况下效果也不坏,但如果我们要考虑整句话,而不是图中的红色框框呢?又一个直接的想法是:扩大window的大小以囊括整句话。
但,这里每句话的长度是不相等的,如果要用这种方法,那就要首先检测数据集中最长那句话有多长,但这样运算量会非常大,而且容易overfitting,而且在测试中也不一定适用。
另一种更好的方法就是Self-Attention,其基本结构如下:
也就是说,我们先把整句话用self-attention处理,对应产生新的向量,这时候的每个向量就已经是考虑整句话后的向量了。
这两种网络是可以交替使用的,比如下面这个:
运作
假设我们的输入(或者中间某一层的输出)为这四个向量$[a^1,a^2,a^3,a^4]$,现在我们想要做的就是每一个向量与其它向量的关联程度。
以两个向量为例,计算关联度有很多种方法,比如下面两种:
以下都用左边那种
对于四个向量,计算与$a^1$的关联度如下图:
注意,这里也要计算与自身的关联度。
这里的激活函数不一定要用Soft-max,也可以用其他的比如ReLu。
接下来计算新的向量,也就是根据关联性计算,如下:
以上过程可以用矩阵乘法表示。
矩阵乘法表示
(这部分很无聊可以直接跳过)
这其中只有$W^q,W^k,W^v$是需要学习的。
Multi-head-Self-attention
这里以两个head为例:
对于两个head计算出的$b^{i,1},b^{i,2}$可通过新引入的矩阵进行结合:
Position Encoding
现在还剩一个问题,就是我们虽然考虑了整个句子,但我们没有考虑各个单词的相对位置。
这里需要引入一个位置参数$e^i$,每个向量都要加上特定的位置参数,如下:
最早的$e^i$(也就是在paper”Attention all you need“里)长这样:
这个图的每一列代表一个$e^i$。位置参数不一定要用这种,可以自己研究。