深度学习常见问答

目录

有哪些方法可以避免过拟合?

造成过拟合的原因:

解决办法:

dropout在训练时和推理时的区别是什么?

L1和L2正则化的区别?为什么L1比L2更稀疏?

Batch Size大小如何影响收敛速度?

BN的原理,与白化的联系

损失函数有哪些,分别有什么特点?

分类问题的评价标准?

回归问题的评价标准?

sgd、momentum、rmsprop、adam区别与联系

梯度消失和爆炸的原因以及解决办法

Inception各版本的改进

RCNN,FAST-RCNN,FASTER-RCNN的区别和进步,faster-rcnn和SSD以及YOLO之间的区别和联系

 增大感受野的方法?

群卷积?

转置卷积怎么做?

GAN算法的机制?

CGAN, CYCLEGAN, WGAN分别有什么优点或改进?

GAN可以处理哪些问题(应用场景)?如何处理?

为什么很多做人脸的paper会最后加入一个local connected conv

人脸识别算法softmax是如何改进的?

attention机制为什么比RNN好


  • 有哪些方法可以避免过拟合?

造成过拟合的原因:

  1. 数据规模太小
  2. 数据有很多噪声
  3. 假设过于复杂,导致模型过于复杂,而数据分布并不那么复杂

解决办法:

  1. early stopping:观察loss或者accuracy或error曲线,在正常训练的情况下train error会一直减小,但过拟合时val error会开始增大。早停最简单的做法是,训练过程中记录当前最好的验证集精度,并保存模型,当连续10次epoch(或更多)没有达到最佳验证集精度时则停止训练
  2. 扩增数据集:1)从数据源头采集更多数据;2)复制原有数据并加上随机噪声或转换(如翻转、15度旋转,对语音数据可以加速或减速);3)重采样;4)根据当前数据集攻击数据分布参数,使用该分布产生更多的数据
  3. 控制模型参数大小(正则化:L1, L2):对模型的代价函数加上正则项,L1是加一个权重的绝对值,L2是加一个权重的平方,严格来说,early stopping也是正则化的一种
  4. dropout(某种程度上相当于减少参数的数量)
  5. Batch Normalization:将一个batch的数据缩成期望=0,方差=1的形式
  • dropout在训练时和推理时的区别是什么?

假设有100个神经元,dropout=0.5

训练时:每一个batch训练中只有50个神经元参与,一个batch更新这50个神经元的参数之后,再恢复所有的神经元,下一个batch训练再从这100个神经元中选50个神经元参与训练

推理时:使用100个神经元,但是参数w要乘0.5。

  • L1和L2正则化的区别?为什么L1比L2更稀疏?

L1正则化:在优化损失函数的时候L1正则化会产生稀疏矩阵,导致一部分w为0,注意这也是L1正则化的核心思想。产生稀疏矩阵之后,一部分w为0,一部分不为0,这样即可对特征进行选择。选择比较重要、明显的特征作为分类和预测的依据,抛弃那些不重要的特征。

L2正则化:L2正则项的求导在超参数都为正的情况下就是个正数,所以在梯度更新的过程中会减去这个正数,相当于一个权值衰减的过程。最后会构造一个所有参数都比较小但比较平滑的模型,L2对大数的惩罚比小点的数多。

由于L1正则项求导时在w=0处有一个绝对值造成的突变,因此w=0处是一个极小值,所以在训练过程优化时,很容易优化到该极小值上,即w=0。

  • Batch Size大小如何影响收敛速度?

Batch Size 太小:极限取1时,相当于最原始的SGD,训练时会造成震荡,在很多epoch下不能收敛,因为太少的数据不能很好地代表所有数据的特性。

Batch Size太大:会造成显存或者内存不足,迭代次数减少的情况下也可能造成收敛变慢。

策略:对于小数据集的训练,可以直接使用所有的数据来当作一个batch;对于大数据集根据具体的数据数量可以参考128,256,512等,不可以使用过大的batch。

一定范围内增大batch size

  1. 提高了内存的利用率,大矩阵乘法的并行化效率提高
  2. 运行一次epoch所需要的迭代次数减少,相同数据量的数据处理速度加快。
  3.  Batch_size越大下降方向越准,引起的训练震荡越小。

batchsize已经取了很小了但是仍然出现内存不够的问题,主要有以下几种原因:

  1. 模型太过复杂,复杂的模型容易占用大量的内存。
  2. 使用nvida-smi命令来查看是否有其他占用内存的程序在运行。
  3. train和test的batchsize都要改成一致的。
  4. 图片太大,导致无法训练下去。

参考:https://blog.csdn.net/wangmengmeng99/article/details/82460437 

  • BN的原理,与白化的联系

白化(Whitening)做法:对数据的预处理,用于去除数据间的相关性(也可以理解为去除冗余性),生成的新数据集满足两个条件:一是特征相关性较低;二是特征具有相同的方差。在对数据做PCA处理(通过协方差矩阵求特征向量,然后将特征映射到特征向量上)后,再对每一维特征做一个标准差归一化处理,就叫做PCA白化。由于白化需要计算特征向量,计算量很大,而且白化不是处处可微,在深度学习中很少使用。

Batch Normalization做法:在一层网络的Wx+b后激活函数之前,每一维度数据减去自身均值,再除以自身标准差。初始的W是从标准高斯分布中采样得到的,而W中元素的数量远大于x,Wx+b每维的均值本身就接近0、方差接近1,所以在Wx+b后使用Batch Normalization能得到更稳定的结果)Wx+b的均值和方差是对整张map求得的,在batch_size * channel * height * width这么大的一层中,对总共batch_size*height*width个像素点统计得到一个均值和一个标准差,共得到channel组参数。

白化一般用于输入数据的预处理,而BN可以用于每一层网络,即逐层的归一化。

BN的优点

  1. 归一化了每层和每维度的scale,所以可以整体使用一个较高的学习率,而不必像以前那样迁就小scale的维度。现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。
  2. 归一化后使得更多的权重分界面落在了数据中,降低了overfit的可能性,因此一些防止overfit但会降低速度的方法,例如dropout和权重衰减(L2)就可以不使用或者降低其权重,BN具有提高网络泛化能力的特性。
  3. 替代局部响应归一化层(LRN层),不再需要LRN。

BN训练和推理(测试)时候的使用区别:训练时候的均值和标准差是当前batch的均值和标准差,推理的时候没有batch,用的是整个训练集的均值和标准差,所以BN在训练的过程中应该记下每个batch的均值和标准差,用于测试、推理阶段。

  • 损失/代价函数有哪些,分别有什么特点?

  • 平方代价函数(最小二乘法, Ordinary Least Squares ):即样本标签和模型输出值之间的距离。平方代价函数是非凸函数,容易陷入局部最优解;我们希望在神经网络的训练过程中,调参幅度和误差大小成正比,即误差越大,调参幅度应越大,从而使训练加快收敛,但是二次代价函数对应的是sigmoid激活函数,效果正好相反;二次代价函数对参数求偏导时会有激活函数导数项,该项值很小,会导致梯度更新幅度小。替代者交叉熵代价函数用于分类问题,平方代价函数可用于回归问题

       平方损失函数可以通过线性回归在假设样本服从高斯分布的情况下推导出来。

       最小二乘法是线性回归的一种,OLS将问题转化成了一个凸优化问题。在线性回归中,它假设样本和噪声都服从高斯分布(为什么假设成高斯分布呢?其实这里隐藏了一个小知识点,就是中心极限定理,最后通过极大似然估计(MLE)可以推导出最小二乘式子。最小二乘的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。换言之,OLS是基于距离的,而这个距离就是我们用的最多的欧几里得距离(Mean squared error, MSE

  • 交叉熵代价函数(log对数代价函数):

       交叉熵代价函数是逻辑回归问题中假设样本服从伯努利分布,然后求得满足该分布的似然函数,接着取对数求极值推导出来的。

  1. Logistic 回归——二分类任务——       C=-\frac{1}{n}\sum_{x}[ylog(a)+(1-y)log(1-a)]
  2. Softmax回归——多分类任务——       C=-\frac{1}{n}\sum_{x}ylog(a)

参考:作者:Arya鑫
链接:https://www.jianshu.com/p/93c209ddb9b3

  • 反向传播算法

https://zhuanlan.zhihu.com/p/39195266

  • 分类问题的评价标准?

准确率 = (TP+TN)/总样本数

精确率 = TP/(TP+FP) = 所有预测为正类样本中正类的概率

召回率 = TP/(TP+FN) = 所有真正类样本中正类的概率

2/调和平均值 = 1/精确率+1/召回率

P-R曲线:纵轴为精确率,横轴为召回率,基于平衡点(P=R)度量各个基分类器的优劣;

ROC曲线:纵轴为TPR,横轴为FPR,ROC曲线越靠近左上角,实验的准确性就越高

TPR = TP/(TP+FN)  FPR = FP/(FP+TN)

AUC:ROC曲线下的面积,面积越大,实验的准确性越高。

mAP(mean average precision,多个类别的物体检测) = 所有类别的AP之和/类别数量

P = (一张图片类别C识别正确数量)/(一张图片类别C的总数量)

AP = 每张图片的P之和/图片数量

参考:https://blog.csdn.net/attitude_yu/article/details/80963323 

  • 回归问题的评价标准?

平均绝对值误差(MAE)

均方差(MSE)

  • 优化算法SGD、Momentum、Nesterov Momentum(也称作NAG Nesterov Acceleration Gradient)、Adagrad、RMSprop、Adam区别与联系

SGD: 这里指Mini-batch Stochastic Gradient ,算法较稳定,结果准确率高,不过容易卡在鞍点,且训练速度慢。该算法还有一个棘手的问题是学习率不好设置,学习率太小训练慢,学习率太大容易震荡不收敛,所以一般模拟退火算法,先设置较大学习率,迭代一定步数后再减小学习率。

MomentumV(t)​=γ⋅V(t−1​)+α⋅▽Θ​J(Θ) 使用物理中的惯性/动量的直觉概念,即t时刻的梯度,继承了t-1时刻梯度的惯性/动量,再结合当前时刻本身的梯度▽Θ​J(Θ)。该方法可以在一定程度上增加稳定性,使训练更快,而且由于惯性的存在,使模型有越过鞍点或者跳出局部最优的性能。

Nesterov MomentumV(t)​=γ⋅V(t−1​)+α⋅▽Θ​J(Θ−γ⋅V(t−1​)​) 在小球向下滚动的过程中,我们希望小球能够提前知道在哪些地方坡面会上升,这样在遇到上升坡面之前,小球就开始减速。与Momentum相比,在第二项当前梯度中减去了γ⋅V(t−1​),可以理解为当前梯度基于累积动量做出的“妥协”,提前预知一下“未来”。这种方法的优化速度要比普通Momentum更快。

Adagrad自适应学习方法,在训练过程中自动对学习率进行调整。对于经常更新的参数,不希望其被单个的样本影响太大,希望学习率慢一些;对于偶尔更新的参数,希望其从偶然出现的样本上学习得多一些(学习率大一些)。为了评估参数更新的频率,使用所有历史动量,给学习率加一个值为历史梯度平方和的根(开方)的分母,更新频率高,该分母就大,学习率就小。Adagrad对每一个参数都作用,Adagrad的缺点是在训练的中后期,分母上梯度平方的累加将会越来越大(学习率单调递减),从而梯度趋近于0,使得训练提前结束。

RMSprop:Adagrad单调递减的学习率太过激进,RMSprop不累积全部历史梯度,只关注过去一段时间的下降梯度。公式如下:V_{t}=0.9*V_{t-1} + 0.1*g_{t}^{2}    。公式中历史积累梯度有一个0.9(该值可改),再迭代多次后(0.9连乘),之前的梯度影响会变得非常小,只有临近的梯度才会有较大影响,从而避免了学习率Adagrad学习率下降过快的问题。

Adam:Momentum+RMSprop

Nadam:Nesterov Momentum+RMSprop

参考:https://blog.csdn.net/u010089444/article/details/76725843

  • 梯度消失和爆炸的原因以及解决办法

  • 原因:
    • 梯度消失:激活函数求导小于1(sigmoid导数<=0.25, tanh<=1),多层情况下小于1的数连乘导致梯度过小;对参数的偏导公式中也有参数项,如果参数初始化的数值都小于1,连乘也会导致梯度过小,而且实际上,如果权重值越小,模型用在测试集和训练集的效果会越接近,大的权重容易出现过拟合,L2正则化的结果就是让权重都变得很小,而在权重都很小的情况下,梯度消失就很容易出现。
    • 梯度爆炸:反向传播过程中,对参数的偏导公式中也有参数项(weight),如果参数初始化的数值都比较大,多层情况下大数连乘导致梯度爆炸。
  • 解决办法:
  1. 改用Relu激活函数,relu在x>0的情况下,导数为1,可以缓解梯度消失问题,但不能完全解决,因为x<0时,导数为0,容易出现死单元。另外relu也没法解决梯度爆炸的问题。ReLU的衍生品还有leaky Relu,ELU,SELU,GELU等。Relu除了可以缓解梯度消失问题,求导简单,可以加速训练和计算。
  2. 梯度剪切、正则化(针对梯度爆炸):梯度剪切就是给梯度设置一个阈值,即最大值,直接防止梯度过大;正则化见L1和L2正则化的区别?为什么L1比L2更稀疏?在loss中加一个L2正则化项(权重的平方),如果梯度很大,loss也会很大,更新幅度也更大。
  3. Batch Normalization:见BN的原理,与白化的联系,随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致后向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正太分布而不是萝莉分布(哦,是正态分布),其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
  4. Residual残差结构
  5. LSTM里使用的方法:设置一个状态值,和以外状态之间做加法,防止连乘带来的梯度消失。

参考:https://zhuanlan.zhihu.com/p/33006526https://blog.csdn.net/m0_37477175/article/details/80259773

  • 参数初始化的方法和作用?

参数的初始化对训练很重要,如果参数初始化不当,有可能造成无法收敛,参数过大会导致梯度爆炸,参数过小又会造成梯度消失;同时初始化也影响着收敛的速度;差不多的代价的初始点具有极大的泛化误差。随机的初始化可以打破对称,让不同的单元学到不同的东西。

  • 全0初始化:不可行,因为这样所有神经元的输出都一样,无法进行bp更新
  • 随机初始化(random initialization):最原始的初始化方法,让每一层的参数都是随机正态分布,均值为0,不过当网络层数加深,会出现梯度消失或爆炸,要么梯度都向0靠拢,要么都向1和-1靠拢,不好训练,现基本不用
  • Xavier initialization:Xavier初始化的基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0,解决上面随机初始化的问题。适用于输出激活函数为sigmoid/tanh的模型(不适用于Relu)
  • MSRA/HE initialization:解决了Xavier在Relu激活函数的模型中表现不佳的问题。在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所以,要保持variance不变,只需要在Xavier的基础上再除以2(详见以下链接)。
  • Batch Normalization:BN也可以解决初始化不好的问题(BN真是个神器),初始化不好会带来每一层输出的分布不好(如向0靠拢),BN强行对输出做一次分布调整,让输出再次符合均值为0方差为1的高斯分布(正态分布)。有了BN,用随机初始化也不怕

参考:https://www.cnblogs.com/ying-chease/p/9469826.html

  • Inception各版本的改进

Inception-V1:提出Inception Module,一个Inception里使用不同卷积尺寸的卷积核对同一个feature map同时做卷积,并叠加卷积后得到的feature map。用到了1x1,3x3和5x5的卷积,同时使用了3x3的max pooling。由于一个Inception module有多种卷积核,参数多,使用了1x1的卷积来进行降维。 整个网络的中间还额外添加了两个loss,保证更好的收敛,有正则化的作用;同时,网络最后一个全连接层之前使用的是global average pooling(感受野是整个feature map,如果输入是10*10*16的特征,输出是1*1*16的特征向量,可以减少参数,适当防止过拟合)。

Inception-V2

  1. 学习了 VGG 用两个3x3的卷积代替5x5的大卷积,减少参数的同时,建立了更多的非线性变换(多了层激活函数),使网络更深,表达能力更强。
  2. 使用了Batch Normalization,BN 在用于神经网络某层时,会对每一个 mini-batch 数据的内部进行标准化(normalization)处理,使输出规范化到 N(0,1) 的正态分布,减少了 Internal Covariate Shift(内部神经元分布的改变)。

Inception-V3

  1. 用两个3x3代替5x5
  2. 用3x1和1x3代替3x3,7x1和1x7代替7x7
  3. pooling会带来信息的丢失,为了防止这个问题,应该在池化前增大特征维度,为了不增多参数量,就并行进行卷积和池化,然后将结果直接叠加。

Inception-V4:发现residual对于深层的网络也不是那么有用,没有residual也造成了比较深的网络,不过residual在加速网络训练中起了作用。网络构成上,延续了前三个版本使用到的trick,新增的reduction也是类似的卷积(卷积后的feature map尺寸变小),增加网络的深度,模型的性能会更好。

  • 1x1卷积有什么用

  主要用于降维,同时可以跨通道组织信息,提高网络表达能力。

  • RCNN,FAST-RCNN,FASTER-RCNN的区别和进步,faster-rcnn和SSD以及YOLO之间的区别和联系

FAST-RCNN:

  1. 使用patch特征映射,不再对一个框都求一遍卷积,而是只做一次整个图片的卷积运算,减少了计算量。
  2. ROI pooling layer:ROI是Region of Interest的简写,指的是在“特征图上的框”。selective search之后的框映射到特征图上,Pooling的过程就是将一个个大小不同的box矩形框,都映射成大小固定(w * h)的矩形框
  3. 使用softmax分类器和bbox回归。

Faster-RCNN:

  • 不再使用selective search选取框,改用RPN(Region Proposal Network):直接从conv5上进行滑框来替代原图滑框。
  • 设置候选区域(anchor):对51x39图像的每一个位置都考虑9种候选框(3种面积x3种比例)。
    1. 把每个标定的真值区域与其重叠最大的anchor记为前景样本。
    2. 剩余的anchor与某个标记重叠大余0.7的记为前景样本。
    3. 与任意一个标记region重叠小于0.3的记为背景样本。
    4. 其余的舍弃。

     代价函数同时最小化分类误差和前景样本的区域位置偏差。

  • Bounding-box Regression种需要学习平移和缩放的映射。

YOLO:

使用整幅图的特征,预测所有类上的所有box

  1. end-to-end设计:将图片分成7*7个格子,如果目标中心落到某个grid种,该grid就负责检测该object。基于GoogleNet设计网络,最后一层FC层输出bbox中心点坐标(x,y,w,h)和p*IOU(p=0或1)。
  2. 由于bbox里经常不包含物体,即p=0,会导致loss收敛效果差,所以坐标预测权重=5,分类预测=0.5。且为了降低不同大小bbox宽高预测的方差,采用平方根形式计算宽高预测loss。

YOLO V2:https://zhuanlan.zhihu.com/p/25167153

  1. 每层卷积层后,加BN层,并去掉dropout层。
  2. 使用Anchor box
  3. Dimension Clusters(维度聚类):通过对数据集中的ground true box做聚类,找到ground true box的统计规律。以聚类个数k为anchor boxs个数,以k个聚类中心box的宽高维度为anchor box的维度。
  4. Multi-scale Training:使用了不同尺寸的图片进行训练(更改网络尺寸)

      ……

  •  增大感受野的方法?

使用空洞卷积(dilated convolution)

增大卷积核尺寸

  • 转置卷积(transposed Convolutions)怎么做?

2x2的feature map通过3x3的卷积核返回4x4feature map:转置卷积过程中,卷积核和步长都不变(和正向卷积相同),padding需要根据尺寸要求来,此处上下左右padding都为2

转置卷积不是卷积的对称逆(不可通过转置卷积获得卷积前的value,只能获得相同的shape,“反卷积”表达不准确)。

  • 深度可分离卷积(depthwise separable convolution)?

MobileNet中使用到的trick,用于减少参数量,往往精度会有一些下降,但是推理速度会增快很多。

考虑4x4x16的feature map通过3x3的卷积核卷积成2x2x32的feature map

普通卷积参:由于卷积有channel 方向,参数量为3x3x16x32

深度可分离卷积:先使用16个3x3x1的卷积核(channel为1)对16个channel的feature map分别卷积(丢掉了channel方向的联系),得到2x2x16的feature map;再使用32个1x1x16的卷积核对其卷积,用于获取channel方向的联系,得到2x2x32,总参数量为:3x3x16+32x1x1x16=41x16<288x16,参数量变成了1/7

  • Residual机制(残差网络)有什么优势?

                                                    preview

残差诞生的原因:在利用Batch Normalization和Relu激活函数等trick的前提下(消除一些梯度消失问题),理论上网络越深网络的表达应该更好,然而实验证明网络深了会带来网络退化的问题(在训练集上表现下降,不是过拟合,过拟合会在训练集上表现更好),理论上过深的网络与浅的网络相比,即使多出来的网络层都是恒等层(不学习东西),性能也不应该下降,可能原因是过深的网络对这种恒等层的表达形式也很难训练,这种恒等层也是没有意义的,于是想到了用近似恒等或者添加了扰动的恒等来训练更深层的网络关于恒等表达的能力,让网络在加深的时候,模型的能力不至于下降

残差为什么work如果网络需要学习一个恒等映射,将残差优化成0要比使用一些非线性层优化成一个恒等映射相比,要简单得多。与正常网络相比,残差仅仅多了X identity这一项,假设输入x=5,想要学习的输出是5.1,对于正常网络而言,需要更新参数以适应0.1/5=2%的改进;而对于残差网络而言,因为需要更新的是F(x),想要让F(x)直接输出0.1而不是5.1,对于在同一量级上的更新,F(x)显得更加“得心应手”。假设下一个batch的训练,输出想要更新为5.2,那么对于F(x)来说,普通网络是不足2%的更新量,而对于残差来说是100%的更新量。

为什么残差是+X而不是+X/2:作者实验证明+X效果更佳。

参考:https://baike.baidu.com/item/%E6%AE%8B%E5%B7%AE%E7%BD%91%E7%BB%9C/22701838?fr=aladdin

  • Transfer-learning与Fine-tuning

举个例子,假设今天老板给你一个新的数据集,让你做一下图片分类,这个数据集是关于Flowers的。问题是,数据集中flower的类别很少,数据集中的数据也不多,你发现从零训练开始训练CNN的效果很差,很容易过拟合。怎么办呢,于是你想到了使用Transfer Learning,用别人已经训练好的Imagenet的模型来做。

做的方法有很多:

  1. 把Alexnet里卷积层最后一层输出的特征拿出来,然后直接用SVM分类。这是Transfer Learning,因为你用到了Alexnet中已经学到了的“知识”
  2. 把Vggnet卷积层最后的输出拿出来,用贝叶斯分类器分类。思想基本同上。
  3. 甚至你可以把Alexnet、Vggnet的输出拿出来进行组合,自己设计一个分类器分类。这个过程中你不仅用了Alexnet的“知识”,也用了Vggnet的“知识”。
  4. 最后,你也可以直接使用fine-tune这种方法,在Alexnet的基础上,重新加上全连接层,再去训练网络。


综上,Transfer Learning关心的问题是:什么是“知识”以及如何更好地运用之前得到的“知识”。这可以有很多方法和手段。而fine-tune只是其中的一种手段。

作者:何之源
链接:https://www.zhihu.com/question/49534423/answer/127022241
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Transfer-learning解决了数据集很少的问题,同时训练出一个模型的速度也很快,另外利用成熟的模型(别人调好的模型)性能也会较好。

使用fine-tuning时,可以先固定前面网络的参数,只训练新添加的层至loss到达一个比较小的值,再降低学习率,所有参数一起训练,这样不至于破坏原来模型的表征能力,也能在新的数据集上表现更好。

  • GAN算法的机制?

  • CGAN, CYCLEGAN, WGAN分别有什么优点或改进?

  • 引起GAN collapse mode的原因是什么?

  • GAN可以处理哪些问题(应用场景)?如何处理?

  • 为什么很多做人脸的paper会最后加入一个local connected conv

  • Focal Loss for Dense Object Detection有什么用?

https://www.zhihu.com/question/63581984

  • 人脸识别算法softmax是如何改进的?

  • attention机制为什么比RNN好?

  • attention和self-attention的区别?

在encoder-decoder模型中,attention的输入是encoder序列的输出+decoder序列中当前单元的隐状态(decoder上个单元延续的状态),即用在encoder和decoder的衔接中. 而self-attention是用在encoder内部或者decoder内部的attention结构, 用于捕捉序列本身的特征,输入只涉及到自己所在的序列.

在transformer里, encoder的一个大layer(一共有6个)里有一个self-attention,decoder的一个大layer里有一个self-attention和一个衔接encoder和decoder的普通attention(也可以称作context-attention).

  • encoder-decoder训练时和预测时有什么区别?

例: 我是工程师->I am engineer.

decoder训练时的输入是同一层里前一个单元的target,如输出am的单元的输入应该是I, 输出engineer的单元的输入应该是am; 但在预测时的输入是前一个单元的输出(预测时没有现成的target可以用). 

对于transformer模型是同样的训练方法, transformer模型中输出序列整个输入到decoder中,再使用搭配的mask机制来让后面的layer只关注之前单元的输出, 其实就相当于只输入了之前单元的输出,训练时用的直接是target,预测时用的是模型的输出

  •  

参考:

https://blog.csdn.net/qq_29462849/article/details/83068421

https://blog.csdn.net/wangmengmeng99/article/details/82460437

https://blog.csdn.net/wfei101/article/details/79997708

https://blog.csdn.net/shwan_ma/article/details/78354073

猜你喜欢

转载自blog.csdn.net/ygfrancois/article/details/88059035
今日推荐