提示:本文章篇幅过长,现已分出下面两篇文章,想了解更多可以移步!
Transformer系列学习笔记(mae+bert+vit等等)
卷积神经网络系列学习笔记yolo+R-CNN+GAN等等
目录
专业词汇
FLOPs:s小写,意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。那么FLOPs越小越好还是越大越好?
找了二十篇博客没人说这个,真的是逆天,我的理解是FLOPs越大,表示模型占gpu计算资源越多,所以FLOPs越小越好
fine-tuning和linear probing的区别:fine-tuning是在微调时对整个模型进行参数更新,而linear probing只训练最后的线性层
端到端:整个学习的流程并不进行人为的子问题划分,而是完全交给深度学习模型直接学习从原始数据到期望输出的映射。
归纳偏置(inductive bias):可以理解为某一网络的特性,比如卷积有归纳偏置局部性,平移不变性等
回归:连续变量的预测叫回归,离散变量的预测是分类
ColorJitter 随机调整图像的亮度、对比度、饱和度和色调的数据增强方法
学习率:一个参数,人为选择,用于控制梯度下降中x的更新
将数据分为测试数据集和验证数据集,验证数据集用于验证,只能使用一次
反向传播算法也叫bp算法,用于优化神经网络
head:卷积神经网络中,把预测分支成为“头”(也就是head)
单层感知器(两层神经网络)是最简单的人工神经网络,用于二元线性分类器
损失函数︰衡量模型输出与真实标签的差异,定义在单个样本上
代价函数:定义在整个训练集上,是损失函数的平均
前向传播︰输入层数据开始经隐含层,从前向后,数据逐步传递至输出层。链式求导,从前往后
反向传播︰损失函数开始从后向前,梯度逐步传递至第一层。链式求导,从后往前。传播的是梯度和误差
模型不仅在训练集表现良好,在未知的数据(测试集)也表现良好,即具有良好的泛化能力
预训练:以CNN为例,越浅层,所学到的特征越通用,越深层的特征与目标的关联越高。预训练模型指训练出通用特征的模型,训练出来的通用特征可以直接使用
下游任务:即获得预训练数据后再进行的任务
微调:在一个大数据集预训练得到数据,在目标任务的数据集上再训练一下的过程就是微调(即使用预训练的训练过程称为微调)
双线性差值法实现图片上采样(数据增强)(放大图片)线形插值即通过已有的点预测没有的点,即通过已有的像素生成一些像素达到上采样的目的
zero-shot:测试集中不存在训练集中出现的类别,one shot就是训练集中出现少量测试集中类别的样本,主要用于迁移学习中,让模型去学习不同类别的不同,而不是学习类别的特征
自监督学习不需要人工标注的类别标签信息,直接利用数据本身作为监督信息,学习样本数据的特征表达,应用于下游的任务。比如mae模型,输入一张图片然后掩码,计算损失是与原图片的均方误差(任务是重建图像)
(使用未标号的数据生成有标号的数据)自监督学习又可以分为对比学习(contrastivelearning) 和 生成学习(generative learning)
有监督学习:全部用有标号的数据训练
半监督学习:半监督学习使用大量的未标记数据,以及同时使用标记数据。使用未标记的数据作预训练,然后在有标记的数据集是作微调
无监督学习:全部用没有标号的数据训练
预训练模型和微调模型有什么不同?微调模型会对预训练模型做一些改动,比如加上分类头做分类
基础神经网络
感知机
最早的人工智能模型y,是一个二分类问题,对于给定训练集,通过给定的输入和输出拟合出一个超平面完成分类。对于测试集,当其值在超平面一侧时,就输出结果(判断其属于哪一类)
y=wx+b是感知机模型的函数,x是一个n维向量,n的维数取决于样本的特征数量,比如这样一个例子,对于输入的图片,图片中红色像素的个数为x1,绿色像素的个数为x2,那么维数为2,假设根据红绿像素所占比例我们可以判断一张图片中是花还是草,这个例子中x是二维的,所以超平面是一维,(超平面用于分割一个空间,所以是比原空间低一个维度)
在这个例子中,我们通过样本数据拟合参数wb,将样本数据分割成两部分,其中一部分是花,另一部分就是草,这样就完成了一个分类问题
如何拟合参数?即如何更新wb 。答:通过梯度下降法
损失函数:感知机的损失判断就是根据误分类点的数目和误分类点到超平面的距离。那么损失函数就是所有误分类点到超平面的距离和
激活函数:sign函数
感知机的步骤:1,初始化wb,一般都取0或一个极小值 。2,选一个误判点使用梯度下降法更新wb。3,继续选误判点更新wb,直至损失最小
多层感知机MLP
也叫bp神经网络,前馈神经网络,bp算法就是反向传播算法
单层感知机的缺点:无法对复杂问题做出分类
多层感知机在单层感知机的线性函数上增加了非线性激活函数(常用relu),增加模型的非线性性,可以对复杂问题分类。
多层感知机是最简单的多层神经网络模型,包括输入层,隐藏层和输出层。隐藏层就是指输入和输出中间的一层
问题:前向传播输出的结果是什么?如何反向传播更新权重?初始化权重参数,通过前向传播计算出预测结果,然后通过反向传播更新权重参数
是解决分类还是回归问题?既可以解决分类问题,也可以解决回归问题,
如何更新权重参数?梯度下降
损失函数是什么?均方误差
多层感知机可以理解为将所给的数据(分布在二维坐标的数据),若里面所包含的种类数为n
则通过输入拟合了m条线性函数,将二维坐标划分为n个区域完成分类。然后增加激活函数增加非线性性。其中n就是感知机的输出out_features,m是隐藏层的大小
下图是前向传播过程
x1和x2和x3指假设输入的一维向量为1*3,则下面这个感知机代码为
nn.Linear(in_features=3, out_features=1),nn.ReLU()#激活函数
下图中就是一个两个隐藏层的mlp,第一个mlp的隐藏层大小为3,第二个隐藏层的大小为1
y=softmax(O),完成分类
可以堆叠这样的隐藏层,即多个Linear加一个激活函数。最后再加一个Linear,最后是不用激活函数的
超参数是隐藏层的数量和隐藏层的大小
梯度爆炸和梯度消失
梯度爆炸就是梯度越算越大,导致超过值域,且会对学习率非常敏感,大的学习率会使梯度更大,小则训无法训练
梯度消失指梯度越算越小,无限接近于零,会导致训练没有进展
解决办法:•目标:让梯度值在合理的范围内
•将乘法变加法
• ResNet, I LSTM
• 归一化
•梯度归一化,梯度裁剪
•合理的权重初始和激活函数 1,目的:让每层的方差是一个常数,将每层的输出和梯度都看做随机变量,让它们的均值和方差都保持一致
权重初始化方法Xavier,激活函数为本身(f(x)近似x)
dropout丢弃法:训练模型时对于每一个隐藏层的单元,有一定概率p使其隐藏起来。测试时不丢弃,输出结果乘以p
作用:从而在训练模型时起到正则化的作用,并可以用来应对过拟合。
卷积神经网络CNN
卷积:对全连接层使用平移不变和局部性得到卷积层
感受野:卷积核与输入矩阵运算的子矩阵就是感受野(特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的)
对比全连接层,大大减少权重参数
卷积通过一个核矩阵学习到一个区域的特征,当时卷积无法学习到全局的一些信息,比如眼镜和鼻子他们在人脸上的位置关系?
提问:
1,什么叫卷积,卷积层的作用是什么?答:卷积是一种数学操作,数学模型,在生活中可以找到应用场景,在图像处理中其目的是提取特征,从而降低噪声。图像处理中的卷积运算与数学中的卷积运算有些不同
卷积层的作用是将输入和核矩阵进行交叉相关加上偏移后得到输出。这个输出就是一个特征
核矩阵和偏移是可学习的参数,核矩阵的大小是超参数
2,那如何提取特征呢?答:图像特征是一些矩阵,卷积核是一个小矩阵,一般是3乘3,将这两个矩阵通过一些操作获得新矩阵。
3,新矩阵就是提取到的特征?为什么这样做就能提取特征呢?答:新矩阵是提取的特征,对于输入矩阵来说,新矩阵就是其特征向量。新矩阵是通过编码器而得出的,用于解码器
4,新矩阵只是原矩阵的特征矩阵,如何能代替原矩阵呢?新矩阵后面将作什么运算?答:新矩阵应该就是代替原矩阵,后面就是池化层和全连接层然后输出了。
输入矩阵和核矩阵的运算:选输入矩阵的第一个和核矩阵形状一样的子矩阵和核矩阵作运算,然后在输入矩阵再往右移一列取子矩阵和核矩阵作运算,这样从左到右从上到下取矩阵作运算,右移一列则步幅为1
卷积层将输入和核矩阵进行交叉相关,加上偏移后得到输出。交叉相关即对映元素相乘再取和,公式就是y=wx+b,y是输出值
w是输入矩阵中即将和核矩阵x做交叉相关运算的矩阵,wx就是交叉相关运算(矩阵点乘求和)。x和b都是可学习参数
卷积层中有三个参数:通道和填充和步幅
通道:一张图片是多通道的叠加,比如rgb是三通道,对每个通道的结果求和。每个通道表示为一种或是一些特征,在rgb三通道中就表示红黄绿三中颜色。对于每一个通道都有对应一个卷积核,所以增加通道数就增加了卷积核的数量,也就是增加了可学习的参数的数量。也就是使得输出的特征更加多
填充就是对输入矩阵进行填充,在输入矩阵附近添加一些全为零的行和列,使得输出矩阵是预想的形状
步幅是每次移动的步幅,也会影响输出矩阵的形状
总参数量是核size核size通道数
池化层:池化层分为3类,平均池化(取平均值),最大池化(取最大值)和随机池化(取随机值)。
作用:压缩数据和参数的数量并使模型获得一些平移不变性(将图像边缘区域都设为其中的最大值或平均值这样)
池化层的工作原理类似于卷积操作,计算方法不同,池化层的超参数是核的大小nm和步幅d和填充
池化层在输入矩阵中从第一个位置取nm大小的子矩阵进行操作,这个操作对于最大池化方法来说就是取其中的最大值,然后从左向右,从上到下按步幅d平移
lenet卷积神经网络:LeNet是早期成功的神经网络,先使用卷积层来学习图片空间信息,然后通过池化层,然后使用全连接层获得输出
全接层 将数据输出为一个1*n的数据,里面每一个数据是表示所属这n个类别的概率,取最大值即为分类结果。n是类别总数
Alexnet:更深更大的 LeNet
主要改进:
•丟弃法
• ReLu
• MaxPooling
计算机视觉方法论的改变
卷积神经网络误差反向传播:
全连接层的参数过多,会出现过拟合问题
vgg,vgg块,一个神经网络主要由多个块组成,块内由各种层组成。如何更好的加深加宽神经网络。现在神经网络的训练成本依然很高,如何减少训练成本
nin,nin块,无全连接层,用多个卷积代替,效果比Alex net好一点
google net,inception块,通过1x1的卷积层降低通道数
空洞卷积(膨胀卷积):增大感受野,但会s丧失一些连续信息,对小目标有害无益,但合理利用多个不同膨胀系数的空洞卷积可以缓解这个问题resnet残差网络:残差块
解决问题:无脑的增加模型的参数,反而会降低模型的精读,loss越算越大,即偏离了梯度下降路线
解决方法:当网络退化时,浅层网络能够达到比深层网络更好的训练效果,这时如果我们把低层的特征传到高层,那么效果应该至少不比浅层的网络效果差,或者说如果一个VGG-100网络在第98层使用的是和VGG-16第14层一模一样的特征,那么VGG-100的效果应该会和VGG-16的效果相同。所以,我们可以在VGG-100的98层和14层之问添加一条直接映射 (Identity Mapping) 来达到此效果。
残差网络,浅层模型的输出是x,则再加模型,她不是继续从x开始学习,即输入不是x,而是h-x,h是真实值,若最后的输出是y,则整个模型的输出为y+x
梯度消失在更深模型中出现的原理是因为这样计算梯度是一个复合函数求导,是由多个乘法组成,导致梯度计算越来越小
残差网络则优化了梯度下降方法,使得梯度下降慢了一些
Bounding-Box regression:边界框回归,即对最后确定的框再进行微调
金字塔网络:解决小目标检测的问题,小目标的特征会在经过逐层的下采样后受损,目的就是分类或预测
FPN是一个结合了SSD的多分辨率尺度预测和U-Net的多分辨率特征融合的网络结构,如图2所示。FPN可以分成3部分:
图左侧的自底向上的卷积;图右侧的自顶向下的上采样;图中间的横向的特征融合。
其中P5是由C5计算得到,P4是由P5和C4计算得到,以此类推。FPN的这种计算方式便是自顶向下的路径
那么是如何从p5c4得到p4呢?
激活函数+常见损失函数
softmax:
交叉熵
nn.CrossEntropyLoss(logits,index)
1.首先对输入进行softmax操作,不改变输入形状
2.然后对每个数取log操作(输出全为负数)
3.最后按index(索引下标)取得对应的值加起来求平均再取反
意义:softmax操作获得目标值对于所有输入的得分,通过交叉熵损失使这个得分最大
Sigmoid函数优缺点∶
优点∶输出0~1区间,映射平滑适合预测概率
缺点∶不过零点,没有负值激活(没有负值),影响梯度下降效率;饱和区梯度消失问题!(当x趋向于无穷时梯度为0)
Tanh函数优缺点︰
优点∶映射到(-1,1)之间,过零点,值域比sigmoid更大缺点:饱和区梯度消失!
ReLU函数优缺点:
优点∶计算简单,导数恒定;拥有稀疏性,符合人脑的神经元活跃特性
缺点:非零中心化,没有负激活值,影响梯度下降效率;如果一次不恰当的参数更新后,所有数据都不能使某个神经元激活,则其对应的参数梯度为0,以后也无法激活,陷入‘死亡’(Dead ReLU)
改进ReLU
max{(ax,x},解决ReLU函数负区间的零激活问题。αc取固定值则为LReLU,为可以学习的参数则为PreLU,为随机值则为RreLU。
LReLU函数:有ReLU的所有优点,并且不会有Dead ReLU问题PReLU:网络的浅层尤其是第一层卷积中,学习到的α会比较大,而到了深层就比较小。这可以理解为网络的浅层学习到了类似于Gabor的浅层特征,更大的c可以提取到更加稠密的特征,而随着网络深度的增加,特征变得更加的稀疏。
RReLU:当作一个正则项,用于增强网络的泛化能力。
ELU函数优点︰
优点︰被证实有较高的噪声鲁棒性,能够使得神经元的平均激活均值趋近为0。
缺点︰由于需要计算指数,计算量较大。
Maxout函数优缺点:
优点∶整体学习输入到输出的非线性映射关系,拟合能力非常强
缺点∶计算量增加,增加了k-1个神经元
Swish函数,swish(x)=x . sigmoid(Bx)
Swish函数优点∶
线性函数与ReLU函数之间的非线性插值函数,无上界有下界、平滑非单调,从数据中学习参数β,可以获得任务相关的激活机制
参数初始化
什么是好的参数初始化
各层激活值不能为0也不会出现饱和;每层的权重方差、梯度与层数无关,会更加有利于优化;
全零初始化︰在第一次更新的时候,除了输出层之外,所有的中间层的节点的值都为零。一般神经网络拥有对称的结构,导致进行第一次误差反向传播时,更新后的网络参数将会相同,在下一次更新时
相同的网络参数提取不到有用的特征。即使是对于非对称的网络结构,这样的随机参数也不利于接下来的优化。
随机初始化:np.random.randn(n),用随机值进行初始化。参数的初始值不能取得太小,因为较小的参数在反向传播时会导致过小的梯度,会产生梯度弥散问题,降低参数的收敛速度。而过大不仅会造成震荡,对于Sigmoid等激活函数也会进入梯度饱和区。
固定方差方法
Xavier初始化 :方差缩放(Variance Scaling)的初始化方法
应用最广泛的方法。待详细了解
MSRA初始化适合ReLU的初始化
标准化/归一化 :数据预处理操作
BN批量归一化:解决问题:训练集和测试集,或是模型的每一层,数据的分布(均值和方差)不一致(不均衡),所以导致在训练时需要重新适应新的分布的数据,导致训练变慢。(那么数据分布的不均衡是如何影响神经网络的训练呢?)(数据种类不均衡也会对神经网络的训练产生影响)
可学习的参数有两个,用于找到合适的分布。使用BN后可以不用dropout
LayerNorm:每个特征的均值为o,方差为1。这样做的好处是可以减少特征之间的相关性,从而提高模型的泛化能力和鲁榛性。
作用在
•全连接层和卷积层输出 上,激活函数前
•全连接层和卷积层输入上
对全连接层,作用在特征维。对于卷积层,作用在通道维
归一化的作用
去除量纲干扰,保证数据的有效性,稳定数据分布
去除量纲的干扰,防止数值过小的特征被淹没
保证数据的有效性
·稳定前向传播激活值和反向传播过程中的梯度
稳定数据分布
.当深层网络中数据分布如果在某一层开始有明显的偏
移,会使得接下来这一问题加剧,内部协变量偏移( Internal Covariate Shift )
批标准化方法
假设神经网络某层一个batch的输入为X=[xj,×2…× ],其中x代表一个样本,n为batch size。
数据维度为(N,C,H,W),每一层normalization是基于NHW个数值进行求平均以及方差的操作。
优点:减轻了对参数初始化的依赖,前向激活值与反向梯度更加有效。平滑了优化目标函数曲面,梯度更稳定,可以使用更高的学习率,从而跳出局部极值,增强了泛化能力。
缺点:要求固定的Batch长度与均匀采样; batch过小数值计算不稳定
优化:
池化:将一个区域的信息压缩成一个值,完成信息的抽象,获得一定程度上的平移旋转不变性。在初始化的时候使用。现在大多数都是带步长的卷积替代池化的使用
常见方法:选择区域均值或最大值
随机池化:归一化pooling的输入,计算分布概率p ;
从基于p的多项式分布中随机采样位置,按照其概率值大小随机选择,元素被选中的概率与数值大小正相关
混合池化:从最大个平均池化中进行随机选择
模型不仅在训练集表现良好,在未知的数据(测试集)也表现良好,即具有良好的泛化能力
正则化
它的目标就是要同时让经验风险和模型复杂度都较小,是对模型的一种规则约束。增加模型对复杂情况的能力
f即预测结果函数,V即损失函数,R(f)是跟模型复杂度相关的单调递增函数,用于约束模型的表达能力。
方法分类:显式(Explicit)i正则化与隐式(Implicit)i正则化
显式正则化:1.根据损失函数的变化,提前终止模型的训练:
2.训练多个不同的模型进行结果融合。多次使用不同的数据训练模型进行结果融合
3.Dropout技术
对于每一个隐藏层的单元,训练时按照概率p随机的丢弃一部分节点,测试时不丢弃,输出结果乘以p
4.类时Dropout技术
5.参数正则化:损失函数的修改
隐式正则化:没有直接对模型进行正则化约束,但间接获取好的泛化能力
1.数据标准化,平滑了优化目标函数曲面
2.数据增强,扩大数据集规模
3.随机梯度下降算法,不同优化过程获得不同结果
4.标签噪声 。。。。。。
最优化方法
数学上指求最值
机器学习用有限训练集上的期望损失作为优化目标(代理损失函数),已知某个标量y和某个向量X,要确定一个函数f(x)描述y和X之间的对应关系,使得loss(f(X),y)尽量小。这个loss(f(X),y)就是损失函数
鞍点:低维空间中局部极小值很常见,高维空间中,参数维度很高,鞍点(横截面上的局部极小值,某一些方向梯度下降,另一些方向梯度上升)更加常见
学习率:参数更新的步长(乘因子)(一般指梯度下降法中)
随机梯度下降法SGD:沿梯度反方向,减少值最快的反向
-小批量随机梯度下降:使用最多
-动量法:加速SGD,特别是处理高曲率、小但一致的梯度﹔积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。梯度平滑
NAG法:在标准动量方法中添加了一个校正因子
Adagrad法 自适应地为各个维度的参数分配不同的学习率
Rmsprop法 :
-Adam法 梯度平滑比冲量法好一点。同时包含了动量更新与学习率调整,使用梯度的一阶矩估计和二阶矩估计来动态调整每个参数的学习率,momentum和RMSProp结合。
Adam算法的改进
Adamax ,Nadam,AMSgrad,Adafactor ,Adabound
二阶优化算法优缺点,一阶用得多
优点∶二阶的方法因为使用了导数的二阶信息,因此其优化方向更加准确,速度也更快。
缺点∶二阶方法通常需要直接计算或者近似估计Hessian矩阵,一阶方法一次迭代更新复杂度为O(N),二阶方法就是O(N*N),计算量大。
模型优化目标:机器学习用有限训练集上的期望损失作为优化目标(代理损失函数),损失代表预测值f(x)与真实值Y的不一致程度,损失函数越小,一般模型的性能越好。
分类任务损失-嫡:预测概率,不确定性,嫡函数。用于表示信息多少,不确定性越大,概率越低,则信息越多,嫡越高
分类任务损失-交叉嫡损失与KL散度:衡量两个概率分布p(x)和q()的相似性
分类任务损失-Hinge loss:分段不光滑的曲线,如果分类正确,损失为0,如果错误则为1-yf(x), y表示真值,f(x)为预测值
回归任务损失-L1/L2距离:以数值的绝对差范数作为距离
回归任务损失-L1/L2距离的改进
Huber loss,解决L1 loss梯度不平滑,L2 loss梯度爆炸的问题
评测指标
ROC曲线/AUC面积
Receiver operating characteristic,分类算法在不同的参数下的表现情况
混淆矩阵:矩阵第i行第j列,表示第i类目标被分类为第j类的概率
IoU(Intersection-over-Union):
AP(Average Precision)/mAP:检索与回归任务常用指标
峰值信噪比PSNR:信号处理领域广泛使用的定量指标,计算复杂度小
,实现速度快,在视频编码标准H.264、H.265中
结构一致性相似SSIM:考虑空域像素间的相关性
数据增强:将数据的使用最大化,比如将一张图反转缩放模糊等等的
降低数据采集成本,提高模型泛化能力,只对训练集处理
微调:重要‼️先预训练出来的参数,用于正式训练初始化模型
生成模型GAN
GAN的一个基本思想结构就是生成对抗网络。具体来说就是有两个模型,一个模型是造假,即生成和真实的不一样但是一个类别的东西。另一个模型就是对生成的东西去分类。两个模型不断的重复生成和分类操作(即一个训练过程),直到造假模型生成的东西能够通过分类模型,即造假模型通过给定一个类别A,生成出原数据中不存在的一个东西B,B通过分类模型后能够被分类为类别A
在图片生成中,假设一张图片x是400*400像素,则里面每一个像素是一个变量,整张图片里所有像素值则服从一个分布。
生成模型的原理就是说我不用知道本来的分布是怎样的,但我估计里面的数据数量大概是z这个规模,然后通过训练mlp去拟合这样一个分布,使得模型通过z生成的结果y非常近似x
判别模型:最简单的情况下也是一个mlp,通过训练,使得判别模型对y处理后输出的结果尽量靠近0,0表示说这个y不是原数据中的值,是一个假的值
DCGAN对抗过程:第1代生成器输入随机噪声z,输出一张生成的图片,生成器计算loss,更新参数,和真实图片一起分别第1代鉴别器,鉴别器分别生成两个loss,对两个loss求均值后,反向传播更新参数。然后第2代生成器调节参数,生成一张更为真实的图片,继续喂给第1代鉴别器,第1代鉴别器无法判断这个样本是来自生成器还是真实图片,于是第1代鉴别器调节参数,有了第2代鉴别器,以此类推,直到鉴别器无法判断这个样本是来自生成器还是真实图片
生成器是反卷积
反卷积是在 整个输入矩阵周围添 0,微步幅度卷积把输入矩阵拆开,在每一个像素点的周围添 0。
生成对抗网络(Generative Adversarial Network,GAN):不显式地估计出数据分布的密度函数,但能生成符合数据分布Pdata(x)的样本
生成对抗原理:生成网络和判别网络相互对抗(adversarial),共同学习
GAN的核心优化目标:生成器损失与判别器损失
语义分割:语义分割将图片中的每个像素分类到对应的类别(是狗还是猫)
应用:背景虚化等
转置卷积:增大输入矩阵的高宽
实现,输入的每个元素和卷积核作乘积,然后将所有结果加起来
全连接卷积神经网络:转置卷积的应用
样式迁移:图像识别的应用,基于cnn的样式迁移
自然语言处理NLP
序列数据:具有时序性的数据,当前数据和之前的数据相关
自回归:用自己以前的数据去预测未来的数据
文本预处理
语言模型:
编码器—解码器结构:在机器翻译中,编码器是将一个长文n的句子转换为也是长为n的序列,但其中每个值是对应每个词的一个向量表示。解码器是将编码器的输出加工成一个长为m的向量,解码器与编码器的不同在于编码器是一个词一个词的运算输出,解码器则不需要,生成的序列长度也是不定的
这里可以简单的理解为:特征提取一过程即为编码器,而分类过程即为解码器。
即:编码器:将输入编程成中间表达式形式(特征)【特征抽取】
解码器:将中问表示解码成输出。【分类器】
循环神经网络RNN
用于序列数据,循环神经网络的来源是为了刻画一个序列当前的输出与之前信息的关系。从网络结构上,循环神经网络会记忆之前的信息,并利用之前的信息影响后面结点的输出。即:循环神经网络的隐藏层之问的结点是有连接的,隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出。
循环神经网络只能记住上一时刻的信息吗?,那上上时刻的信息呢?????都记住了?
梯度剪裁:解决梯度爆炸问题,但梯度衰减问题在循环神经网络中没有解决
门控循环单元GRU:在循环神经网络中每一时刻的权重是相同的,所以无法区分数据是否重要。对于时序数据,不是所有数据都是重要的,GRU通过门来有选择的遗忘和保存重要数据
如何遗忘保存????
答:重置门决定了如何将新的输入和前面的记忆相结合(关注前面记忆的数据,也就是上一时刻保留的数据)。更新门决定带多少信息到下一个时刻(说法可能有点问题)
LSTM:长短期记忆网络
双向循环神经网络,不仅关注前面的数据,也关注后面的数据。用于翻译
序列到序列seq2seq:用于机器翻译…….
束搜索:每次在序列中选取最好的几个最为下一次的输入,若只选一个,则是贪心算法,但贪心算法不一定是全局最优解
注意力机制:解决问题:在选词填空中,我们需要根据上下文来确定这个空到底填什么,在机器翻译中,目标词的意思多半需要根据上下文来进行翻译
Transformer
注意力机制:定这样一个场景:把输入信息向量X看做是一个信息存储器,现在给定一个查询向量g(目标字),用来查找井选择x中的某些信息(即根据g有偏重的从x中选取出某些东西),那么就需要知道被选择信息的索引位置。采取"软性”选择机制,不是从存储的多个信息中只挑出一条信息来,而是雨露均沾,从所有的信息中都抽取一些,只不过最相关的信息抽取得就多一些。
注意力分数:描述注意力关注程度,不同注意力机制的打分函数不同
注意力权重是注意力分数soft Max的结果
使用注意力机制的seq2seq:
自注意:将x作为key,value,query来对序列抽取特征,优点•完全并行、最长序列为1、但对长序列
计算复杂度高
Transformer:如下图所示:Transformer的编码器由6个Encoder组成,解码器由6个Decoder组成,输入数据经由6个Encoder编码后,输入到6个Decoder中完成解码,产生最终输出结果。
Transformer中每一个Encoder模块的内部结构如下图所示
Transformer中每一个Decoder模块的内部结构如下图所示
注意力机制概述:
假设输入是n个字,n个字进入embedding后输出为mn,即每个字用一个m长的向量表示
位置编码则是对mn中的每个数计算得到一个也是长为mn的输出,再于词向量相加即可,所以输出还是mn
在自注意力中,矩阵乘法能够的到相关性的原因在于向量点乘计算在空间上算的是位置,所以自注意力其实是得到了每个词的自注意力系数
总模型,其中一些跳跃的箭头指残差连接,feed forward就是一个mlp
下面解释一下上面的图 左边部分是编码器,右边部分是解码器
transformer和rnn在处理时序信息的不同点在于,transformer是同时拿到所有时刻的信息,然后在输出时用掩码机制使得它看不到当前时刻后面的信息,而rnn是每次的输入是上时刻的输出和这时刻的输入,即每次记录上时刻的信息。
掩码注意力机制就是对于当前时刻后面的信息,将他全部设为一个非常小的负数,这样再SoftMax后,这些值都会变成0
在机器翻译中,编码器是将一个长为n的句子转换为也是长为n的序列,但其中每个值是对应每个词的一个向量表示。解码器是将编码器的输出加工成一个长为m的向量,解码器与编码器的不同在于编码器是一个词一个词的运算输出,解码器则不需要,生成的序列长度也是不定的(翻译的结果长度是不定的 )
问题: 如果不是自主意力机制,那么key,value,query都是什么?
Transformer中的自注意力机制:见下面的左图
输出是value的加权和,每个value权重是这个value对应的每个key和query的相似度来计算的。 即相识度高的,权重会比较大
这个相似度不同的的注意力机制有不同的算法
在transformer中,这个相似度的计算公式是对每一个query和key做内积,值越大则相识度越高,最后对于内积值再除以根号d,d是key的长度,最后在套上个softmax得到权重
之所以除于d是因为softmax函数对于大值会输出更靠近1,而小值会靠近于0,这是因为softmax是分类运算,对于置信度大的我们希望它更靠近于1,这样就完成了分类,梯度就会渐渐收,即梯度比较小了。但在transformer的注意力中这样不利于梯度计算,因为梯度越大就越还没有到收的地步
多头注意力机制的基本思想是类似于多通道的卷积。看下面的右图
其中线性层其中一个作用是投影,先投影到低维并且增加一个可学习的权重参数W,再投影回原来维数
cancat是对h层自注意机制的输出进行合并操作 在transformer中h=8
head即是每一层 自注意力的输出。W是可学习的权重参数,WO是最后一层linear
embedding就是将输入文本转为数字表示,初始时是随机的值,然后训练改变这些值
matmul表示矩阵乘法, scale是除根号d
掩码的多头自注意力:
position encoding则是将这个词的位置加入到下一个计算的输入内,从而获得时序信息
即用长为512的一个向量来表示位置值,这个512是因为前面输入的长度为512,保持一致
这个向量的计算是通过一个cos,sin函数计算出来的,那么他的值会在-1到1间,和前面的输入的数据的大小差不多。 输出则就是把这个记录位置信息的向量和前面输入的向量相加即可
对transformer的评价:
为什么现在基于transformer的模型都特别大特别贵,因为transformer需要更大的模型更多的数据去训练才能达到和cnn.rnn差不多的效果,这是为什么呢?能改进吗?
因为它是多模态的,对不同的任务都能抓取其中的特征信息,抓去的信息太广泛这样
transformer缺点,自注意力是对所有数据作加权和,没必要对所有数据加权和
然后矩阵乘法计算量挺大
为什么能打赢RNN,它不会对数据顺序建模
RNN可以显示的建模序列信息
因为用了一个跟广泛的归纳偏置,使得其能处理更一般化的信息,这就是为什么transformer更贵,模型更大的原因
rnn的缺点是每时刻都需要上一时刻的输出作为输入,无法并行。
因为需要记住前面时刻的时序信息,在句子比较长时,内存开销大
有许多改进方法,但本质问题没有解决
自编码器
对比学习
SimCLR
两个encoder共享参数,Dense是一个mlp,将encoder输出的特征映射到一个小维度的空间中
Projection head 使用非线性层比较好
更深的 Projection head 可以学习到更好的representation,在 SimCLR v2 里面是3层的MLP
模型左右基本都是共享参数的(包括encoder和Projection head )
SimMIM 实验证明重建所有的 patches 的效果不如只重建 masked patches 的效果
SimMIM 证明decoder只是一层linear也有比较好的结果 而mae实验证明,decoder的深度几乎不影响微调性能,但对线性探测的精度影响挺大的8个点的差距
所以在实验微调性能时,可以只用简单的一个linear试试
对比学习就是说,假设已知图片分为n类别,对于每个类别的图片,我们希望他们的特征向量在特征空间中尽量靠近在一起,这样我们只需要构造一个损失函数去达到这个效果即可,
这是无监督的,因为我们对于每一张图片,我们可以通过数据增强创造类似的图片,所以每一张图片都可以当作一个类别
只要能将一些东西按类区分开来都能用对比学习,甚至比如说一张图片的正反面,等等
MoCo:代码中的label表示正样本所在的索引,在mocov1中,正样本永远在第一列,所以标签为全0.在mocov3中,一个batchsize的一个元素为正样本,其他为负样本,所以正样本的位置应该是range(batchsize)
将一张图片a当成一个类别,那么我们对这张图片做数据增强获得另外一张图片b,a,b都属于一个类别,取名为正样本,将a丢入模型中获得特征q,b放入其他不同类别样本中组成key,并进入动量编码器输出为k
则相当于key是一个字典,q是我们要查找的,我们通过去比较q和key中b对应的bkey的相似程度(用一个目标函数)
我们希望这个目标函数满足这些:当q和bkey非常相似时,loss是较低的,当q和其他key不相似时,loss也是较低的。反之则loss尽可能的大,让模型通过迭代更新参数使得loss下降
NCEloss则将类别简化成一系列二分类问题,一个是数据样本,一个是噪声样本,每次将这两个样本作对比即可
但这样计算复杂度高,解决的办法就是从负样本中取一些样本作计算就行,这样得到一个近似的结果
之所以需要动量更新应该是因为两个正样本区别不大,如果放进同一个encoder,那么输出的特征本来就很接近,那么模型就学不到好的参数
而且 Momentum Encoder 的更新极其缓慢 (因为 很接近于1),所以Momentum Encoder 的更新相当于是看了很多的 Batch,也就是很多负样本。
具体说来用一个队列q存储所有负样本,初始时这个队列都是随机的值,第一个迭代,将k和k+分别放入两个encoder中,然后将k和k+的特征进行相似度计算,将k和q进行相似度计算,然后更新k+encoder,具体的更新方法是获得encoder0.001%的参数即param_k+encoder = param_k+encoder * 0.999 + param_qencoder * (1.0 - 0.999)
最后更新队列q,将k+放入队列的前几列
两个encoder不共享参数
infoNCE loss:下图是公式,q点成k表示相似度计算
在一个batchsize中,我们取其中一张图片q,经过数据增强后得到一张图片k+,我们将q,k+和其他图片都输入到encoder得到他们的编码表示(即特征向量),然后将这些编码表示进行infoNCEloss计算
T是超参数,分子是q和k+的相似度计算/T,分母是q和所有其他图片的编码表示进行相似度计算/T,其中K=batchsize
这个计算过程和softmax是一样的(K=batchsize还是K=batchsize-1?即分母中有没有q和k+的相似度计算,大概率有,因为这样才能保住log右边的值域在0-1)
从上图可以看出,将infonce loss中的qk/T=z,则infonce loss等于交叉熵loss(softmax)
softmax的输入是一个一维向量,输出是一个长度为总类别数的一维向量,里面每个数表示属于每个类别的得分,总和为1,得分最大的表示该输入属于概率的概率最大
从最外层的交叉熵损失看,infonce就是一个分类损失,目的是将q归于k+这个类(交叉熵损失的目的是将输入逼近到1)
CLIP:一张图片和对一张图片的文字描述组成一个正样本,其他数据为负样本,作对比学习
给你一张图片作为query,所有类别词对应生成一个句子,例狗,猫…分别生成句子这是一个狗,这是一个猫…
将这些句子作为key,去作对比学习
不同的prompt对性能的提升区别是非常大的。coop论文里则试图去学习一个最优的prompt,
输入数据是图片和文本,比如64张图片和文本,其中第x张图片和第x个文本为一对作为正样本
图片输入图片encoder获得特征,文本输入文本encoder获得特征,这两个特征作为正样本通过对比loss拉近,其他作为负样本
SigLIP:和CLIP的区别在于SigLIP对于一个文本和多个图像做二分类操作。而CLIP是多个文本多个图像的多分类
模型推理比较简单,只需要将输入图片传给ImagesEncoder模块,就会生成一个一维的图片特征向量,然后拿这个图片特征和 第二阶段生成的文本特征做余弦相似度对比,最相似的即为我们想要的那个结果,比如这里应该会得到 A photo of a dog.
DALL-E2/UNCLIP:基于扩散模型的clip模型。细节演变过程看DALL-E2就可以
上面是clip模型,下面是GLIDE模型,clip模型训练好后,任意给一个文本用clip生成文本特征,再利用文本特征输入到glide模型(用扩散模型生成图片的模型)生成图片,prior就是给定一个文本特征能够生成一个类似clip的一个图像特征,则拿clip生成的文本特征和图像特征训练,使得prior生成的图像特征越来越近似clip生成的图像特征,解码器则根据这个特征生成图像。prior模型存在的意义在于在整个模型训练好后就可以根据用户的输入文本获得一个图像特征,decoder是一个扩散模型
自编码器AE:一张图片x,经过encoder后获得特征z,再经过decoder获得一个输出y,我们希望这个y重建x
VAE:对于前面自编码器经过encoder的输出,我们不再直接使用z,而是去预测它的一个分布,对于分布再采样一些数据z输入decoder获得y
VQVAE:对于VAE,我们不是通过分布去采样一些数据,而是通过增加一个聚类中心,对于z,我们看它和聚类中心的哪一部分最近,我们使用最近的那部分作为decoder的输入
ALBEF:下面部分就是一个moco
MoMe:transformer模型做一个改变,对不同的输入用不一样的全连接层得到输出
训练时冻住部分层,即参数不用更新,在图像输入训练后就冻住自注意力层,即自注意力层不用更新,可以直接用于文本训练
coca blip多模态下
video classification
双流卷积网络:用一个卷积神经网络处理图片,再用一个卷积神经网络处理动作。最后的结果做一个加权平均或是其他操作
处理动作这里我们从一个动作视频中抽取光影信息,光影即表示物体运动的信息的图片,(其中每一个像素指向下一个光流图片该像素运动的地方),在光影图片中,运动的物体的运动幅度大的部位更亮,其他信息则全部忽略
一帧一帧光流计算太慢,多个光流帧叠加计算更好,有两种叠加方法,左边是直接叠加,右边是按光流流向叠加,实验证明左边效果更好,但作者认为理论上右边效果更好,应该是未来的一个研究方向
I3D:3D卷积就是只要在原有的卷积神经网络上,只要是2维的,我们都变成3维即可
TSN:将一个视频分为很多小片段,对于每一个片段抽取一个帧做下面运算,然后再从每个小片段抽取一个帧做下面操作
处理时序的卷积是用一维卷积进过一些操作实现的
通过堆叠一维卷积扩大卷积的感受野处理时序信息,但这样所需的卷积层过多,参数过多,并且对输入有重复的计算
上图中2个卷积,感受野只有5,下图3个卷积,感受野为11
下图的方法使用空洞卷积的方法扩大感受野,降低了卷积的层数
slow fast 对于人类视觉来说,大多数细胞都是用于处理动态,少数用于处理静态
所以隔16帧抽图片+大网络训练,再结合4帧抽图片+小网络这样的模型
CLIP4Clip:视频检索。主要还是使用CLIP
如何将多帧图片合成一个video。将多个特征合成一个特征兼顾空间和时序信息
r(2+1)D:将3D卷积拆分为先做2D空间上卷积,再做1D时间上卷积。因为3D卷积计算量大,而2D卷积效果又只比3D差一点点
进阶:竞赛
工业界:将应用表达成机器学习问题、收集数据
经典论文需要读懂每一句话
可以看openreview上的评(吐)论槽)