讨论通过改善卷积网络模型,使其达到优于transformer模型的效果(文章基于ResNet模型框架进行改造升级)
基于训练transformer模型的训练技术训练ResNet-50
EMA—指数滑动平均,好处在于:1.平滑数据、2.可以存储近似n个时刻的平均值,而不用在内存中保留n个时刻的历史数据,减少了内存消耗。本研究发现EMA会严重损害带有BatchNorm层的模型。
使用可分离卷积,分为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。(不同于标准卷积同时对所有channels进行卷积,而是先进行H*W维度的卷积,再进行channels维度的卷积,即各channels分别卷积完,再叠加生成最后的特征图。)
可分离卷积
卷积知识补充: [各种卷积的流程和优缺点]((35条消息) 各种卷积的流程和优缺点_深度可分离卷积的优缺点_浪迹天涯的yf的博客-CSDN博客)
对于标准卷积,其各channels间的权重是不重叠的,不共享的。
每个Transformer块中的一个重要设计是它创建了一个反向瓶颈,即MLP块的隐藏维度比输入维度宽四倍
Vison Transformer最显著的特点就是非局部注意力,因为多头自注意力机制,每个序列向量对于其他序列向量进行了相关计算,计算公式如下:
A t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T d k ) V Attention(Q, K, V) = SoftMax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=SoftMax(dkQKT)V
注意:gelu作为激活函数训练时,建议使用一个带动量的优化器
pytorch实现:
def gelu(x):
"""Implementation of the gelu activation function.
For information: OpenAI GPT's gelu is slightly different (and gives slightly different results):
0.5 * x * (1 + torch.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * torch.pow(x, 3))))
Also see https://arxiv.org/abs/1606.08415
"""
return x * 0.5 * (1.0 + torch.erf(x / math.sqrt(2.0)))
补充:[深度学习常用激活函数]((35条消息) 常用激活函数(relu,glu,gelu,swish等)_glu激活函数_栋次大次的博客-CSDN博客)
更少的激活函数。在每个块中使用单个GELU激活。
发现在块的开始添加一个额外的BN层并不能提高性能。
在介绍各个算法之前,我们先引进一个问题:为什么要做归一化处理?
神经网络学习过程的本质就是为了学习数据分布,如果我们没有做归一化处理,那么每一批次训练数据的分布不一样,从大的方向上看,神经网络则需要在这多个分布中找到平衡点,从小的方向上看,由于每层网络输入数据分布在不断变化,这也会导致每层网络在找平衡点,显然,神经网络就很难收敛了。当然,如果我们只是对输入的数据进行归一化处理(比如将输入的图像除以255,将其归到0到1之间),只能保证输入层数据分布是一样的,并不能保证每层网络输入数据分布是一样的,所以也需要在神经网络的中间层加入归一化处理。
BN、LN、IN和GN这四个归一化的计算流程几乎是一样的,可以分为四步:
计算出均值
计算出方差
归一化处理到均值为0,方差为1
变化重构,恢复出这一层网络所要学到的分布
训练的时候,是根据输入的每一批数据来计算均值和方差,那么测试的时候,平均值和方差是怎么来的?
对于均值来说直接计算所有训练时batch 均值的平均值;然后对于标准偏差采用每个batch 方差的无偏估计。
使用带有步长的卷积核进行下采样。
研究表明,在空间分辨率改变的地方添加归一化层有助于稳定训练。
混合模型:将卷积和Transformer相结合。
补充:[深度学习模型参数量/计算量和推理速度计算]((35条消息) 深度学习模型参数量/计算量和推理速度计算(一)_flopcountanalysis_曙光_deeplove的博客-CSDN博客)