【ML-2020/21】CNN & Self-Attention

写在前面的说明

这个系列【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 × 3 3\times 3 3×3,然后对于同一个Receptive field,一般会有一组神经元(比如64或者128个)去处理它,而且一般来说这个Receptive field的排布是会重叠的,以保证覆盖整个图像,如下:
在这里插入图片描述

parameter sharing

对于下面这种情况:
在这里插入图片描述
鸟喙出现在图中的不同位置,由于每个pattern都有很多个神经元去处理,所以理所当然地,这两种情况都能把鸟喙给检测出来,但对于同种作用的检测器,我们明显不希望它们分属两个不同的东西,不然参数会很多,所以就希望,对于相同作用的检测器,它们的参数应该是相同的(即参数共享)。
至此,就一步步地将模型简化了,如下图所示:
在这里插入图片描述
这就是convolutional layer,而用了convolutional layer的就是CNN。另外,CNN的 b i a s bias bias一般会比较大。

2. Filter

对于convolutional layer的另一种解释是用Filter。如下图:
在这里插入图片描述
以右上角这个filter为例,从图片左上角一直滑到右下角,对应相乘后相加。对于每个卷积层都有很多个Filters。
另外,虽然这个filter只是 3 × 3 3\times 3 3×3的,但由于不断进行卷积,每一个卷积层都把它的考虑范围扩大了,如下图,下面那层的 3 × 3 3\times 3 3×3等于是考虑了上面那层的 5 × 5 5\times 5 5×5范围:
在这里插入图片描述
也就是说,network越深考虑的范围越大。

上面的parameter sharing实际就是这里的filter扫过各个区域过程。
上面的receptive filter实际就是这里的不同的filter。
所以两种解释其实是一模一样的。

Pooling

pooling的思想源于降采样,即是对于一幅图,我们把它进行将采用,比如把一幅图的偶数像素都删除,并不妨碍我们识别这幅图。如下图:
在这里插入图片描述
pooling是不需要学习的,就跟激活函数类似。

Max Pooling

除了Max pooling,还有mean Pooling之类的,都差不多。
基本概念就是选各个区域最大的那个数,比如下图:
在这里插入图片描述
选完之后就变成下面这样了:
在这里插入图片描述
这里区域大小也是自己定的,不一定要用 2 × 2 2\times 2 2×2。通过这个操作就能把”图片“变小。这个池化层一般是和卷积层交替使用的。

pooling 是为了减少运算量,但现在由于运算能力的发展,越来越多地方开始去除pooling层了,这也是一种趋势。

至此就有了CNN的基本架构了:
在这里插入图片描述

Self-Attention

在CNN中,我们的输入都是一个向量,但如果遇到输入是一组向量的话该怎么办?比如说语言处理,输入的单词长度都不一样,Self-Attention 就是解决这种问题的一种办法。
在这种架构中对于输出一般有以下三种情况:

  1. N N N个输入对应 N N N个输出,比如说输入一句话,我们要分析每个单词对应的词性。
  2. N N N个输入对应 1 1 1个输出,比如输入一句话,分析其是褒义还是贬义。
  3. N N N个输入对应 M M M个输出,比如翻译。

这里先介绍第一种,即同维度输入输出。以输入一句话为例。
第一种最直接的想法是用Fully Connected,由于要考虑单词间的联系,就有了如下这种结构:
在这里插入图片描述
这确实能做,某些情况下效果也不坏,但如果我们要考虑整句话,而不是图中的红色框框呢?又一个直接的想法是:扩大window的大小以囊括整句话。
但,这里每句话的长度是不相等的,如果要用这种方法,那就要首先检测数据集中最长那句话有多长,但这样运算量会非常大,而且容易overfitting,而且在测试中也不一定适用。
另一种更好的方法就是Self-Attention,其基本结构如下:
在这里插入图片描述
也就是说,我们先把整句话用self-attention处理,对应产生新的向量,这时候的每个向量就已经是考虑整句话后的向量了。
这两种网络是可以交替使用的,比如下面这个:
在这里插入图片描述

运作

假设我们的输入(或者中间某一层的输出)为这四个向量 [ a 1 , a 2 , a 3 , a 4 ] [a^1,a^2,a^3,a^4] [a1,a2,a3,a4],现在我们想要做的就是每一个向量与其它向量的关联程度。
以两个向量为例,计算关联度有很多种方法,比如下面两种:
在这里插入图片描述
以下都用左边那种
对于四个向量,计算与 a 1 a^1 a1的关联度如下图:
在这里插入图片描述

注意,这里也要计算与自身的关联度。

这里的激活函数不一定要用Soft-max,也可以用其他的比如ReLu。
接下来计算新的向量,也就是根据关联性计算,如下:
在这里插入图片描述
以上过程可以用矩阵乘法表示。

矩阵乘法表示

(这部分很无聊可以直接跳过)在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这其中只有 W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv是需要学习的。

Multi-head-Self-attention

这里以两个head为例:
在这里插入图片描述
对于两个head计算出的 b i , 1 , b i , 2 b^{i,1},b^{i,2} bi,1,bi,2可通过新引入的矩阵进行结合:
在这里插入图片描述

Position Encoding

现在还剩一个问题,就是我们虽然考虑了整个句子,但我们没有考虑各个单词的相对位置。
这里需要引入一个位置参数 e i e^i ei,每个向量都要加上特定的位置参数,如下:
在这里插入图片描述
最早的 e i e^i ei(也就是在paper”Attention all you need“里)长这样:
在这里插入图片描述
这个图的每一列代表一个 e i e^i ei。位置参数不一定要用这种,可以自己研究。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值