机器学习(七)

摘要

本文以影像辩识为例,从三个观察介绍了CNN的多个概念,为了解决全连接方式解决影像辩识问题产生大量参数的问题,通过CNN的三种方法简化参数,并从两个方向介绍CNN以及CNN的全过程总结和应用。 传统的CNN只能考虑感受野范围的信息,即只能考虑局部范围而没有考虑全局信息,此时如果使用很大的kernel size一次覆盖掉所有的输入,这种情况下的模型的参数量就会非常多,容易overfitting。除此之外,机器翻译的输入是长度不一的。self-attention,self-attention是一种可以考虑全局信息以及不同输入向量之间关系的机制,在训练时可以充分发挥这些关系,优化训练的结果,同时self-attention在很多领域都能得以运用。

Abstract

Taking image identification as an example, this paper introduces multiple concepts of CNN from three observations. In order to solve the problem of a large number of parameters generated by the full connection method to solve the problem of image identification, three methods of CNN are used to simplify the parameters, and CNN is introduced from two directions, as well as the whole process summary and application of CNN. The traditional CNN can only consider the information of the receptive field range, that is, it can only consider the local range without considering the global information. At this time, if a large kernel size is used to cover all the inputs at a time, the number of parameters of the model in this case will be very large, and it is easy to overfitting. In addition, machine translation inputs are of varying lengths. self-attention is a mechanism that can take into account the global information and the relationship between different input vectors, and can make full use of these relationships during training to optimize the training results. self-attention can be used in many fields.

1、卷积神经网络 (CNN)

卷积神经网络分别由输入层、卷积层、池化层、全连接层。输入层指的是图像数据,通常是三维的结构,如 28 x 28 x 1 的一个图像数据。卷积层可以简单理解为是提取特征,池化层可以简单理解为压缩特征。全连接层的每个神经元都与上一层的所有神经元相连,每个连接都有一个权重。在前向传播过程中,每个神经元的输出是上一层所有神经元的加权求和,并通过激活函数进行非线性处理。输出层最后得到的是一组概率值。
假设我们输入的图像是一个 32 x 32 x 3 的矩阵数值,而卷积无非是要做特征提取。但是我们在进行特征提取时,不同的特征,训练起来的精准度也不同。就比如我们输入的图像是一只小猫,小猫位于图片的正中间,图像中仍然有背景,图像边界的特征和小猫体态的某个细节部分的特征是不同的,因此我们需要做的是对图像不同区域提取出跟图像辨识物体的尽可能相似的特征,比如小猫的眼睛和鼻子,这两处特征不同,但通过这两处特征也能够区分出这张图像是小猫。同理,对于不同的特征,应该有不同的权重,比如这张图的背景,我们在提取特征的过程中也可能会将图像背景当成特征输入神经网络,但是通过图像背景特征并不能辨识这是只小猫,如果这些特征权重过大,最后训练出来的神经网络难免会存在较大的误差。因此我们需要将图片与辨识目标相近的地方,作为主要特征,比如小猫的眼睛、鼻子、爪子等。图像的不同区域要进行区别处理。

1.1、基于影像处理的三个观察

以图像分类为例,输入需要分类的图片大小都必须一致,对于机器来说,一张图片是一个tensor(维度大于2的矩阵),一维代表宽一维代表高一维代表channel,其中channel代表通道,对于图片来说是R、G、B三个通道。其中每个通道中的没一个点其实都是一个像素值。将三个维度展平就能得到一个一维的输入的向量,比如下图(100,100,3),展平之后,是3x100x100的输入向量。其中每一维向量的数值其实就是表示某一个颜色的强度。
在这里插入图片描述
展开的一维向量作为network的输入,如果采用Fully Connected Network,那么100x100x3的输入,如果有1000个神经元,每一个神经元都会给所有输入一个权值,那么这个权值就是100x100x3x1000=3x10^7个,参数的数量级真的非常大,参数越多当然可以增加模型的弹性和能力,但是也容易过拟合。
在这里插入图片描述
采用何种方式可以减少参数的数量呢?为了减少参数 我们可以不使用全连接网络 ,采用CNN进行简化。例如一张小鸟的图片 通过模型如何得出它是一只鸟?其实辨识到某些重要的特征 ,例如鸟嘴,鸟腿等就可以得出它是一只鸟。

1.2、Observation 1

在这里插入图片描述
比如 某一个neuron 看到的是鸟嘴 有一个neuron看到了眼睛 另一个neuron看到了鸟爪 当这些重要的特征组合在一起 我们就可以判断是一只鸟,因此可以考虑不将整个图像的特征作为一个神经元的输入,例如识别下图的鸟,并不一定要将整个图片作为输入,只需要将图片的一部分当作neuron的输入即可 这样我们就可以做简化,有两种简化方法。
简化方法1:Receptive Field
CNN概念-感受野
感受野(Receptive Field):用来表示网络内部的不同位置的神经元对原始图像的感受范围的大小。
每一个nounor只关心自己的receptive field发生的事情,以图中为例,这个蓝色的神经元对于圈出来的receptive field,这是三个3×3的矩阵,把它拉直成为一个27维的向量作为该神经元的输入
在这里插入图片描述
①receptive field彼此之间可以重叠,多个神经元可以使用同一个receptive field。
②pattern有不同大小因此不同的神经元使用的receptive field也可以有不同的大小。
③receptive field可以只考虑部分cahnnel,有些pattern可能只在红色或蓝色的channel出现。
④receptive field可以有各式各样的性质,范围也可以不相连。
最经典的receptive field样式
采用全部的channel,高和宽合起来叫做kernel_size,常见的设置是3*3,最左边的receptive field以stride的值进行移动得到新的filter。除了水平移动,还可以垂直移动。
CNN概念-步长stride:stride一般不会设太大,如果太大就会导致receptive field之间没有重叠,因为有可能一个pattern出现在两个receptive field之间,就没有神经元可以侦测到这个pattern而将他miss了。
**CNN概念-填充padding:**超出范围做paddding,为了不遗落边上的pattern,采用这种方式扫描完整个图片。使用Padding填充方法。
常见的填充方法:填充现有数据的均值、全部填充0、填充边界的相同值。

1.3、Observation 2

相同的图案可能出现在图片的不同位置,通过参数共享以减少参数量。
因为receptive field是覆盖整个图片,因此不管一个pattern出现在图片的什么位置,都是会落在神经元的receptive field中,receptive field一定有一组神经元在照顾,假设在这个里面有一个神经元 是检测鸟嘴的话鸟嘴就会被侦测出来。
在这里插入图片描述
这些侦测鸟嘴的神经元工作都是一样的,只不过是使用在不同的receptive field上。如果每一个receptive field上都需要有侦测鸟嘴的神经元,那么参数是不是太大了?如果放在影像处理上呢?
简化方法2:参数共享
CNN概念-参数共享:可以让不同receptive field的神经元共享参数,即两个神经元的weight是完全一样的,但是他们的receptive field不同因此神经网的输入不同,因此结果也不会一样。
在这里插入图片描述
每个receptive field都只有一组参数filter,是第一个Receptive field的第一个filter1和第二个Receptive field第一个filter1共享参数,第一个Receptive field的第一个filter2和第二个Receptive field第一个filter2共享参数,以此类推。
在这里插入图片描述
总结简化解决问题
Fully Connected Layer:全连接层;决定看整张图片还是部分。
Receptive Field:感受野,不需要全部图片,通过部分区域能够识别分类。
Parameter Sharing:参数共享;不同的Neuron之间共享相同的参数。
当感受野 + 参数共享 之后就构成了卷积层Convolutional Layer。
在这里插入图片描述
以上两种simplification一个是每个神经元考虑同一个receptive filed来减少参数,一个是通过不同的receptive filed公用同一组参数的方法减少参数。这两种简化方法总结到一起就是Convolutional Layer。
CNN的另一种介绍方式
这个角度是说,对于一层卷积层,我们有很多个Filter,可以认为每一个Filter都是为了侦测某一个特征,其大小为设为( 3 × 3 × channel) ,而其中的参数就是我们通过学习得到的。假设我们已知参数,计算的过程称为Convolution。

在这里插入图片描述
通过Filter和原图的內积得到的结果组成了特征图 Feature Map,这个Feature Map就可以看成是一张新的图片,具有64个channels(即有64个Filters)有多少个filter就会产生多少个channel,每一个filter的高度也要跟输入channel保持一致的。
在这里插入图片描述
filter的大小全为3x3的,那么超过3✖3的pattern是否检测不到?
答:并不会,因为第一层的filter检测的是3x3的pattern,得到的结果输入到第二个卷积层,第二个filter还是3x3,但是将上一个结果作为输入,检测的范围其实是5x5的区域(如下图,第二个图像的-1来自第一个图像左上角filter计算的值,第二个图像的-2来自第一个图像右下角filter计算的值,所以第二个filter检测到的是原始图像输入的5x5的pattern),以此类推,只要网络够深,filter即使一直是3x3的,也会检测到足够大的pattern。
在这里插入图片描述

1.4、Observation 3

对图片进行subsampling,例如拿掉图像奇数行,偶数列的像素变成十分之一,不改变图片的本质只改变了像素的大小:在这里插入图片描述
简化方法3:Pooling
Pooling有多种方式,最常用的Max Pooling:
1、 假设我们通过Filter先生成了一个Feature Map特征图
在这里插入图片描述
在每个filter与每个reeceptive filed进行内积之后得到一张feature map,做Pooling的时候,就把filter产生的结果分组,比如每2x2的数字为一组,Max Pooling就是在每一组挑一个最大值作为这一组的结果。不一定要选取2✖2一组,也不一定要选取最大的值,可以自由选择。Pooling的运算中没有参数学习,比较像sigmod函数。Pooling的作用就是为了减少计算量。
Pooling把图片变小,改变了长宽,但不改变channel数,即深度不变。
采用Convolutional Layers+Pooling,就是一个Convolutional后面一个Pooling,一个Convolutional后面一个Pooling,以此类推,为了得到最后的结果,会先进行Flatten操作,即将一个多维矩阵展开为一个一维矩阵,将得到的一维矩阵作为一个全连接网络的输入,再将network的输出结果进行softmax(将结果化为0-1之间),得到概率分布的结果,最后确定类别。

2、Self-attention

传统的CNN只能考虑感受野范围的信息,即只能考虑局部范围而没有考虑全局信息,此时如果使用很大的kernel size一次覆盖掉所有的输入,这种情况下的模型的参数量就会非常多,容易overfitting。除此之外,机器翻译的输入是长度不一的。

2.1、复杂的输入

第一个例子:文字处理
当输入是一句英语,每个单词对应一个向量,而每个单词长度不一,就说明向量的长度不一,那么当输入的多个向量是长短不一,怎么将他们表示成向量?
在这里插入图片描述
第一种方法:One-hot Encoding

假如有十万个词汇,就开一个十万维的向量,每一个维度对应到一个词汇,但存在一个问题,就是看不到词汇之间的任何关系,得不到任何信息。
第二种方法:Word Embedding
给每个词汇一个向量,相关的词汇会聚集在一个区域,关于这个方法的学习链接如图下方。
第二个例子:声音处理
一段声音讯号就是一排向量,一般会在声音讯号取一个范围,将这一范围的资讯描绘成向量,把这么一个向量叫作frame。
在这里插入图片描述
除此之外,一个graph也可以看成一堆向量组成,一个分子可以看作一组向量,每一个原子就是一个向量。
在这里插入图片描述
第一种:当输入N个(一组)向量,经过Model预测后输出N个分类结果/数值型结果,例如词义辩识、语音声音讯号等。在这里插入图片描述
第二种:当输入N个(一组)向量,经过Model预测后输出一个分类结果/数值型结果。例如判断一句话是正面还是反面、语音辨认、判断分子是否具有某个性质等。
在这里插入图片描述
第三种:当输入任意个向量,经过Model预测后输出任意个分类结果/数值型结果,例如语音辩识、翻译等。
在这里插入图片描述
主要学习第一种情况

2.2 、序列标注

每一个输入向量对应一个标签,这种叫做Sequence Labeling(序列标注)。把前后几个向量串起来一起输入Full-Connected,给Full-Connected一整个window的信息,让它可以考虑上下文,通过network 产生输出,有几个输入就有几个输出,输出的向量是考虑整个sequence的结果。
在输入的这句话中,每个词汇作为一个输入的向量,这里面的两个“saw”前面的是动词后面的是名词,但是对于Full-Connected来说,这两个“saw”没有任何区别,如果要判断一句话中相同词汇的不同词性,window的范围可能要覆盖整句话。在这里插入图片描述
这样的方法还是存在极限的,如果window需要覆盖整个sequence,那么Full-Connected参数会很多,不止运算量大,还很容易overfitting,那么有什么方法可以将所有的sequence考虑进去呢?那就是self-attention。

2.3、Self-attention+FC

Self-attention不仅只能用一次,可以进行叠加使用,输入的向量通过Self-attention的输出可以传入Full-connected network,输出的结果再做一次Self-attention,再重新考虑一次整个sequence的信息,将结果再放入Full-connected network得到最终的结果。
在这里插入图片描述

2.4 、Self-attention的运作

Self-attention的输入通常是一串向量,而这个向量可能是这一整个神经网络的输入,也可能是某个隐藏层的输出。每个b都是考虑所有的a产生的。
在这里插入图片描述
那么b是如何计算出来的?

以b1计算为例,首先根据a1找出整个sequence里面跟a1相关的其他向量,计算整个sequence里面所有向量跟向量a1的关联度(α),因为Self-attention就是为了考虑整个sequence,但又不希望把所有的信息都包括在window里面,所以需要找出哪些部分是重要的,因此通过这个机制过滤掉不重要的信息。
在这里插入图片描述
那么self-attention怎么找出每一个a呢?

方法一:Dot-product方法
将输入的两个向量分别乘以两个不同的矩阵Wq,Wk,得到向量q和k,最后q和k进行一个dot-product得到相关联度。
方法二:Additive
同样将输入的向量与两个矩阵相乘得到的向量相加,然后使用tanh投射到一个新的函数空间,再相乘得到最后结果。·

在这里插入图片描述
对每个输入的向量,两两之间按上面的方法计算出关联度α(i,j),在得到关联度之后,将结果进行soft-max(也可以使用Relu等方法)计算出一个attention distribution,在得到attention distribution之后相比较就知道哪些向量与α1关系密切,就可以根据抽取出这个sequence里面重要的信息。
在这里插入图片描述
在得到每一个向量和α1之间的关联度之后,使用新的矩阵Wv乘上输入的向量αi,得到一个新的向量vi,然后将得到的关联度与向量vi相乘,对每个输入的向量进行该操作,最后将每个关联度与向量vi相乘的结果相加得到一个唯一向量b1。
在这里插入图片描述
b1、b2、b3、b4、并不是依次产生而是同时被计算出来的。
在这里插入图片描述

2.5、 Muti-Head Self-attention

在transformation中,应用最广的一种self-attention机制叫做muti-head self-attention,这种attention相对之前的在attention而言,它对于每一个向量a可以具备多组的q,k,v来描述这一个向量,而之前的只用到了一组,使用多组q,k,v,那么就需要对每一组计算其b的值,有几组就有几个b值。不同的任务需要用到的head数目是不一样的,对于有些任务比如语音辨识,使用的head越多效果越好。
Q:为什么head越多越好呢?
A:在做self-attention的时候,就是用q去找相关的k,但是相关这件事情有不同的形式、不同的定义,因此需要更多的q负责不同种类的相关性。
在这里插入图片描述

2.5、 Self-attention的应用

2.5.1 Self-attention for Speech

在做语音的时候,要把声音信号表示成一排向量,而每个向量只代表10ms的长度,假设有一秒钟的声音信号那就有一百个向量,因此要描述一段声音信息,那么需要的vector sequence是非常长的,如果采用self-attention的话,那么就需要很大的Attention Matrix。为了减少计算量,因此在做语音的时候可以采用Truncated Self-attention,在语音辨识里有可能不会考虑整个序列而是只考虑一个范围,这个范围是根据任务设定的。
在这里插入图片描述

2.5.2 Self-attention for Image

在这里插入图片描述

换一个角度来看image,可以把每一个三维的pixel看作一个vetor,然后所有合起来就是一个向量集。

3 、 Self-attention VS CNN

CNN可以看作简化版的Self-attention,因为在做CNN的时候只考虑receptive field里面的信息,而Self-attention是考虑全部的信息。(Self-attention如果设定一定的参数就可以做和CNN一样的事情)
在这里插入图片描述
Self-attention考虑的范围更大,它的模型自由度高,因此需要更多的data,data不够就有可能overfitting,而对于CNN这种有限制的模型,在data比较少的时候也不会容易overfitting。从下图的一个测试中可以看出,在资料量少的时候,CNN表现得比Self-attention好,而当资料量越老越多达到一定数量后,Self-attention反而会超过CNN。
在这里插入图片描述

4、 Self-attention VS RNN

共同点:都要处理一个input是一个sequence的状况
区别:①self-attention考虑了所有输入的向量,而RNN只能考虑左边已经输入的向量而不能考虑右边没有输入的向量。②self-attention可以进行平行运算所有输出,而RNN不可以进行平行运算。
在这里插入图片描述

总结

本周学习了CNN和self-attention, 卷积神经网络由于在卷积的过程中采用了参数共享,所需参数相比于传统的神经网络要少的多。与传统神经网络相比,卷积神经网络减少了过拟合的情况以及梯度下降更新参数的效率也大大提高。学习了self-attention机制,了解了self-attention的运作方法,分析了self-attention与CNN、RNN等其他机制的异同点,以及学习了self-attention的相关应用领域。self-attention要解决的问题是:当神经网络的输入是多个大小不一样的向量,并且可能向量之间存在一定的关联,而在训练时却无法充分发挥这些关系,导致模型训练结果较差。通过计算输入之间的关联性,过滤掉无效的信息,减少计算量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值