(1)深度学习的一些基础的东西:
①感知机:根据输入实例的特征向量x对其进行二类分类的线性分类模型,具体的公式就是
f
(
x
)
=
s
i
g
n
(
w
∗
x
+
b
)
f(x)=sign(w*x+b)
f(x)=sign(w∗x+b),感知机的目的就是学习
w
∗
x
+
b
w*x+b
w∗x+b这个超平面,根据这个超平面来对测试用例进行分了(例如
w
x
i
+
b
>
0
wx_i+b>0
wxi+b>0 则分为正类),只有两层
②多层感知机:就是多加几层感知机,并且函数不只限于
s
i
g
n
(
x
)
sign(x)
sign(x),和DNN没有什么非常显著的差别
③受限玻尔兹曼机(RBM):受限玻尔兹曼机(RBM)是一种生成式随机神经网络,RBM能够学习到数据的潜在表示,是深度学习的重要组成部分。在训练阶段,RBM 的目标是学习一个能量模型,使得训练数据的概率最大化
V为可见层,用于表示观测数据,h为隐层,可视为一些特征提取器(feature detectors),W为两层之间的连接权重。
④DNN(如下图所示)
①Input Layer:承载着输入
②Output Layer:承载着模型的输出,若为分类模型,则
y
i
y_i
yi最大的话分为第i类
③中间的若干层全连接层倍称为隐藏层,全连接层是可以用矩阵运算来实现的,假设
L
a
y
e
r
i
和
L
a
y
e
r
j
Layer_i和Layer_j
Layeri和Layerj之间有全连接层的话,可以有一下公式:
x
j
=
σ
(
W
∗
x
i
+
b
i
)
x_j=\sigma(W*x_i+b_i)
xj=σ(W∗xi+bi),
W
W
W是
L
a
y
e
r
i
Layer_i
Layeri和
L
a
y
e
r
j
Layer_j
Layerj的权重连接,
b
i
是
b_i是
bi是两个层之间的偏置向量,因此整个DNN可以看作一个很大的复合函数,如下所示:
σ
(
x
)
\sigma(x)
σ(x)是激活函数
④神经网络的反向传播算法:其实就是一种梯度下降的在神经网络当中的应用而已,梯度下降的算法过程如下所示:
具体的数学理解如下所示,从下列过程可看出计算过程当中一些结果是Forward pass的时候计算出来,一些结果是Backward pass(这个过程有点像递归)的时候“从后往前”加上Forward pass的计算结果推出来的,这也解释了为什么pytorch训练过程当中大量内存用于保存中间结果)
(2)CNN
卷积神经网络(英语:convolutional neural network,缩写:CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。这个网络的提出就是专门用于处理图像的。
我们知道图片在计算机的表达就是一个三维的tensor,灰度图片是
M
∗
N
∗
1
M*N*1
M∗N∗1,RGB图片是
M
∗
N
∗
3
(
3
个
c
h
a
n
e
l
)
M*N*3(3个chanel)
M∗N∗3(3个chanel)根据前面的DNN的相关知识我们可以知道DNN的输入一定是个一维的向量,所以我们把图片展开变成一个长度为
M
∗
N
∗
3
M*N*3
M∗N∗3的一维向量
但是这样的话就是让那些Hidden Layer的神经元们每一个都要去看整张的图片,这样参数太多容易过拟合。但是我们在日常生活当中的去识别图片中的猫和狗的时候往往可以通过一小块的动物特征就可以识别出来,并不用去看整张的图片。因此我们据此引入了感受野(Receptive field)这一说法,这里体现在CNN里面就是卷积核的大小。神经元只用关注特定区域内就可以了。具体应用在CNN里面体现在以下几点:
①Filter(滤波器)
就是一个卷积核通过水平和垂直把整个图片扫一遍,具体过程如下图所示:
其中涉及到几个基本的知识点:
①Stride:在这里可以理解为把关注的水平和垂直区域移动一下,把整张图片分成若干个这样的小区域看看,但是stride不可以太大,因为stride太大的话可能要捕捉的特征(例如鸟嘴)在两个区域的交叉,这样就没法获取了,所以要让这些区域有交集。而且有这么一种情况:一个图片里面可能有多个这样的特征(例如鸟嘴),所以卷积核在移动的时候参数还不能变(共享参数),这样一个Filter进行一次对图片的卷积以后就得到了一个新的矩阵,这个矩阵就是该卷积核所代表的特征在张图片上的分布,说专业点就叫Feature map。下面举一个例子说一下Feature map:
上图所示的Filter1在遇到下面矩阵这样的"对角线特征"的时候值最大为3
1
0
0
0
1
0
0
0
1
\begin{matrix} 1 & 0&0 \\ 0 & 1&0\\0&0&1 \end{matrix}
100010001
根据这个Filter1得到的Feature map我们看到左上角和左下角的值是最大的为3,可以看出这两个地方的对角线特征是最明显的,这个Feature map可以看作是对角线特征在图像上的分布,这个过程也可以看作是一次特征抽取。因此在图像当中我们可以安排
h
h
h个Filter,其中Filter1抽取特征A,Filter抽取特征B…。这样一个
M
∗
N
∗
3
M*N*3
M∗N∗3的三维tensor可以转化为
M
1
∗
N
2
∗
h
M_1*N_2*h
M1∗N2∗h的一个经过特征提取的三维tensor。
②填充(padding):卷积核移动到边缘的时候会出现”不匹配“的情况,所以要在边缘之外的地方填充某个常数,这样便于提取边缘特征。
③池化(pooling):我们看图片的时候就算图片大小不一样也是可以识别的
针对这种情况引入了一种技术叫做池化,以3*3的Maxpooling为例子,就是把3*3区域内特征性最强的那组特征作为”代表“提交上去,实际应用还可以选择最小或者平均来作为代表,这样做的目的是减少计算量但是会消耗特征,随着现在计算机计算能力的增加,已经没有这方面顾虑了,所以池化现在是不常见的技术了。
②CNN的完整架构以及特点
CNN的特点有:
①拟合能力小于全连接网络,但是在图像识别和与图像识别相似度比较大的一些任务(不用完全俯瞰全局,特征隐藏在不同的小的区域内,全局可能有多个特征)
②从上述Feature map的获取过程中可以看出CNN会把两张翻转过的照片提取出不一样的Feature map,因此CNN没有办法处理图像翻转的问题,所以在用CNN做项目的时候可以进行图片翻转这样的数据增强(Data Augmentation),下面是我复现VGG-16所用的pytorch代码在Kaggle的猫狗识别项目的github源码。
③随着一层一层的卷积以后,感受域会慢慢变大,不会无法捕捉感受域大的特征。
(3)Attention机制
Attention(注意力)机制如果浅层的理解,跟他的名字非常匹配。他的核心逻辑就是从关注全部到关注重点。就是说在处理序列数据的时候要充分考虑上下文,并且上下文里面比较重要的就给予大一点的权重,没那么重要的就给予小一些的权重。从模型上看,Attention一般用在CNN和LSTM这些模型上面(因为这些模型很难决定哪些特征重要哪些不重要)上,也可以直接进行纯Attention计算。至于怎么做attention如下图所示:
在计算attention时主要分为三步:(Query是输入的查询对象,各个Key是被查询对象,
(1)将query和每个key进行相似度计算得到权重,常用的有点积,拼接,感知机等;
(2)使用一个softmax函数对这些权重进行归一化;
(3)将权重和相应的键值value进行加权求和得到最后的新的value,这个value对于query是更加有用的。
可以表示为如下:
PS:Query,Key,Value的概念取自于信息检索系统,举个简单的搜索的例子来说。
Query:电商平台搜索输入某件商品(年轻女士冬季穿的红色薄款羽绒服)
Key:搜索引擎根据Query为你匹配Key(例如商品的种类,颜色,描述等)。
Value:然后根据Query和Key的相似度得到匹配的内容
Self-attention(也被叫做内部注意力机制)
自注意力机制和注意力机制的区别就在于,注意力机制的查询和键是不同来源的,例如,在Encoder-Decoder模型中,键是Encoder中的元素,而查询是Decoder中的元素。在中译英模型中,查询是中文单词特征,而键则是英文单词特征。而自注意力机制的查询和键则都是来自于同一组的元素,例如,在Encoder-Decoder模型中,查询和键都是Encoder中的元素,即查询和键都是中文特征,相互之间做注意力汇聚。优点:可以建立全局的依赖关系,扩大图像的感受野。相比于CNN,其感受野更大,可以获取更多上下文信息。具体的关系图如下:
根据上面的Attention机制的公式可以知道Q,K,V就是所需要的矩阵,self-attention的具体的公式以及转化都如下所示:
Self-attention的具体的作用如下所示:
①Self Attention可以捕获同一个句子中单词之间的一些句法特征或者语义特征。
②引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。但是Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。
③Self Attention对于增加计算的并行性也有直接帮助作用。这是为何Self Attention逐渐被广泛使用的主要原因。
Muti-head Self-attention(多头注意力机制)
单单的一个Attention机制可以理解为是在某一个特定的的维度考虑全局信息。但是一段序列是可以从多个角度来考虑的,例如一段文字可能蕴含了比如情感维度、时间维度、逻辑维度等很多维度的特征,为了能从不同的维度抓住输入信息的重点,引入了多头注意力,简单说就是把输入序列投影为多组不同的Query,Key,Value,并行分别计算后,再把各组计算的结果合并作为最终的结果,通过使用多头注意力机制。具体如下图所示:
Attention没有考虑位置信息,所以要引入可以表示位置信息的叫做Positional Encoding
(4)Transformer
在Transformer的核心是其编码器-解码器架构——两个关键组件之间的共生关系,分别负责处理输入序列和生成输出序列。编码器和解码器中的每一层都包含相同的子层,包括自注意力机制和前馈网络。这种架构不仅有助于全面理解输入序列,而且能够生成上下文丰富的输出序列。
Transformer主要就是由Encoders和Decoders组成
(1)Encoders层(由多个Encoder组成)
这一层的目的是为了得到更加优秀的向量表达,具体的图如下所示:
对于每一个Block的大概图如下:(先执行左边流程再执行右边流程)
第一幅图中的两个Add & Norm层的表达的意思就是residual(拟合残差)+层归一化。
(2)Decoders层(由多个Dncoder组成)
每个Decoder Block有两个Multi-Head Attention层+一个Add & Norm与Feed Foward层
第一个Multi-Head Attention层采用了Masked操作
第二个Multi-Head Attention层的K、V矩阵输入源来自Encoder的输出编码矩阵,而Q矩阵是由经过Add & Norm层之后的输出计算来的
Masked Multi-Head Attention(带掩码的多头注意力机制)
Decoder中的第一个Multi-Head Attention是采用了Masked的操作,他和普通的多头注意力机制计算上来将是一致的,只是多了个掩码矩阵,用于遮盖当前输入后面的数据,不让当前时间模型知道后面的答案是什么。
Transformer的训练方式和其它模型不太一样,他在训练过程是采用了Teacher Forcing的训练模型,就是会将原始输入和正确答案都会喂给模型,然后模型进行训练,而在推理过程中,具体的就是先给一个Begin标志产生第一个输出以后再作为输入输进去产生第二个,知道出现End标志以后才会停止,如下所示:
具体的训练过程也是类似的“一个一个来进行训练”,如下面两幅图所示:
PS:Begin和End这两个token都是词表里面的一个
一些小Tips:
①SGD到达最优解的过程缓慢而曲折,为了防止走弯路使用SGD+Momentum算法会观察历史梯度,若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。
②CNN架构的历史:Alexnet——>VGG(规定了一些基本的卷积神经网络规则例如卷积层为3*3)——>Googlenet(追求效率,提出了Inception)——>Resnet和Batch Normalization的出现让网络的训练层数加深
③Resnet解决了网络学习效果退化的问题:增加了短路连接(shortcut connection)网络在最差的情况下也能获得和输入一样的输出,即增加的层什么也不学习,仅仅复制输入的特征,至少使得网络不会出现退化的问题。
④Batch Normalization是对一个batch-size样本内的每个特征做归一化,将特征值分布重新拉回标准正态分布,解决梯度消失或梯度爆炸)的出现让网络的训练层数加深。
⑤Layer Normalization(横向规范化):对于网络中的每一层,计算该层所有神经元输出的均值和方差,并使用这些统计数据来规范化输出。Layer normalization 是在特征维度上进行标准化的
⑥sigmoid激活函数容易发生**“梯度消失”(可以从图像看出),并且可能所有的权重w的梯度都是一样的,并且exp()计算也是很难的
⑦Stochastic Depth算法(和Dropout一样的防止过拟合的算法,有点相似),在网络训练时随机丢弃一部分网络结构**,而在测试时使用完整的网络结构
⑧Mixup是ICLR2017年提出的针对计算机视觉的一项简单的数据增广策略。该方法从原始数据中随机抽取两个不同样本,并计算得到一个扩张样本,通过对输入数据进行简单的线性变换:
x
i
是数据,
y
i
是类别
x_{i}是数据,y_{i}是类别
xi是数据,yi是类别,下列是个方法用于目标检测
⑨下列是帮助神经网络训练的方法:
⑩几张训练神经网络的过程曲线图:
(11)迁移学习现在在计算机视觉任务当中已经占有了不错的地位了,因为这个训练好的模型中已经有了一些对图片的理解能力, 而模型最后输出层的作用是分类之前的图片, 对于现在计算价值的任务是用不到的, 所以我将最后一层替换掉, 变为服务于现在这个任务的输出层。可以理解为距离分类器比较远的学习的是低级的特征,这些特征具有普适性,二距离分类器比较近的深度学习层学习的是高级特征,是不具有普适性的。所以那些学习到的低级特征知识是可以直接搬过来用于新的高级特征的学习。如下图所示,可以把已经训练好的网络用于只是训练分类器,或者训练靠近分类器的几层神经网络:
迁移学习是一个很大的话题,一点点博客根本讲不完
(12)目标检测的一些入门知识
①RCNN与候选区域:目标检测的任务不仅仅是多分类任务,还要用Box把那些类别圈出来,所以需要一种方法来选出一组Region Proposal(备选Box)用于进行分类。以前采用的方法就是使用滑动窗口的方法来把一张图片内的所有方框都来一遍,但是这样的话太耗运算。因此RCNN就所以使用了一种基于图像纹理特征的SS算法用于生成2000个Region Proposal。R-CNN的具体步骤如下:
②Faster -RCNN的贡献在于在RCNN的基础之上引入了RPN(Region Proposal Network)。即区域候选网络,该网络替代了之前RCNN版本的Selective Search,用于生成候选框。
(13)图像分割
①图像分割以前的方法是采用一些可解释性强的方法来不同的物体区域分开,基于深度学习的方法:利用卷积神经网络,把每个像素都标注上与其对应的类别
②图像分割的三个级别
(1)语义分割:语义分割的目的是把图像中的每个像素分为特定的语义类别,属于特定类别的像素仅被分类到该类别,而不考虑其他信息,例如:人、车等这就是不同的类别
(2)实例分割:实例分割根据“实例”而不是类别将像素分类,实例分割的目的是将图像中的目标检测出来,它不仅要对图像中的每个像素进行语义类别的分类,还要将同一类别的不同实例进行区分,并且对目标的每个像素分配类别标签以区分它们
(3)全景分割:全景分割是最新开发的分割任务,可以表示为全景分割同时完成语义分割和实例分割任务,需要对图片中的每一个可见object和region进行辨别与描述