什么样的数据不适合用神经网络学习?
- 数据集太小,因为神经网络有效的关键就是大量的数据,有大量的参数需要训练,少量的数据不能充分训练参数。
- 数据集没有局部相关性。目前深度学习应用的领域主要是图像、语音、自然语言处理,这些领域的共性就是局部相关性。例如:图像中的像素组成物体,语音中的音位组成单词,文本数据中的单词组成句子,而深度学习的本质就是学习局部低层次的特征,然后组合低层次的特征成高层次的特征,得到不同特征之间的空间相关性。
什么是过拟合,什么是欠拟合?
过拟合:模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力太差。
欠拟合:模型没有很好地捕捉到数据特征,不能够很好地拟合数据。
神经网络中的激活函数:对比ReLU与Sigmoid、Tanh的优缺点?
优点:
- 从计算的角度上,Sigmoid和Tanh激活函数均需要计算指数,复杂度高,而ReLU只需要一个阈值即可得到激活值;
- ReLU的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活边界。
- ReLU的单侧抑制提供了网络的稀疏表达能力,和人脑的机制类似。
缺点:
ReLU和Sigmoid一样,它们的输出是非零中心化的,给后一层的神经网络引入偏置偏移, 会影响梯度下降的效率。
ReLU有哪些变种?
Leaky ReLU、ELU以及softplus函数。
卷积神经网络相比于前馈神经网络,由哪些部分构成?各部分作用分别是什么?
如果用全连接前馈网络来处理图像时,会存在以下两个问题:
- 参数太多;
- 很难提取局部不变特征。
卷积神经网络一般是由卷积层、池化层和全连接层交叉堆叠而成的前馈神经网络,使用反向传播算法进行训练。
卷积层的作用:局部连接,权重共享;
池化层(pooling layer),也叫子采样层(subsampling layer)的作用:进行特征选择,降低特征数量,并从而减少参数数量。
在深度学习中,网络层数增多会伴随哪些问题,怎么解决?
- 计算资源的消耗(GPU)
- 模型容易过拟合(Dropout,正则化)
- 梯度消失/梯度爆炸问题的产生(批归一化BN、梯度裁剪、网络结构变更):BN层能对各层的输出做归一化,这样梯度在反向层层传递后仍能保持分布稳定,不会出现过小或过大的情况。
- degradation退化问题:在神经网络可以收敛的前提下,随着网络深度增加,随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,这时候再增加网络深度的话,训练集loss反而会增大。注意这并不是过拟合,因为在过拟合中训练loss是一直减小的。(ResNet的初衷,是让网络拥有恒等映射的能力,即能够在加深网络的时候,至少能保证深层网络的表现至少和浅层网络持平。如何做到恒等映射呢?事实上,神经网络很难拟合潜在的恒等映射函数H(x) = x,但如果把网络设计为H(x) = F(x) + x,即直接把恒等映射作为网络的一部分,就可以把问题转化为学习一个残差函数F(x) = H(x) - x, 而只要F(x) = 0,就构成了一个恒等映射。 )
循环神经网络RNN中梯度消失与爆炸的原因是怎样的?
梯度消失:RNN梯度消失是因为激活函数tanh函数的倒数在0到1之间,反向传播时更新参数时,当参数W初始化为小于1的数,则多个(tanh函数’ * W)相乘,将导致求得的偏导极小(小于1的数连乘),从而导致远距离的项对于梯度的贡献很小,导致远距离的信息无法学习到。
梯度爆炸:当参数初始化为足够大,使得tanh函数的倒数乘以W大于1,则将导致偏导极大(大于1的数连乘),从而导致梯度爆炸。
循环神经网络RNN怎么解决长期依赖问题?
RNN中的长期依赖问题,也就是梯度消失或梯度爆炸可以采取如下方法解决:
- RNN梯度爆炸的解决方法:梯度截断
- RNN梯度消失的解决方法;残差结构、门控机制(LSTM、GRU)
为了RNN中的长期依赖问题,一种非常好的解决方案是引入门控Hochreiter and Schmidhuber 来控制信息的累积速度,包括有选择地加入新的信息,并有选择地遗忘之前累积的信息。这一类网络可以称为基于门控的循环神经网络(Gated RNN)。
什么是偏差,什么是方差?
偏差(bias):
度量了学习算法的期望预测与真实结果的偏离程度,即刻画了算法本身的拟合能力,偏差越大,表明越偏离真实值。
方差(variance):
度量了同样大小训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响,也就可以理解为衡量模型的稳定性(鲁棒性,泛化能力)。
粗略地说,偏差指的是算法在大型训练集上的错误率;方差指的是算法在测试集上的表现低于训练集的程度。
减小(可避免)偏差的方法有哪些?
- 加大模型规模(例如神经元/层的数量)
- 根据误差分析结果修改输入特征
- 减少或者去除正则化(L2 正则化,L1 正则化,dropout)
- 修改模型架构(比如神经网络架构)
减小方差的方法有哪些?
- 添加更多的训练数据
- 加入正则化(L2 正则化,L1 正则化,dropout)
- 加入提前终止(Early stopping,例如根据开发集误差提前终止梯度下降)
- 通过特征选择减少输入特征的数量和种类
- 减小模型规模(比如神经元/层的数量)
测试集上是否需要使用dropout?
不可以使用!dropout只能用于训练集。dropout是训练过程中应用的一种正则化技术。
使用全批量梯度下降法时,是否有必要打乱训练数据?
没有必要。因为每个epoch的梯度计算都会使用整个训练数据,所以打乱顺序也没有任何影响。
当使用小批量梯度下降时,为什么打乱数据很重要?
如果不打乱数据的顺序,那么假设我们训练一个神经网络分类器,且只有两个类别:A和B,假如各个epoch中的所有小批量都是完全相同的类别,这会导致收敛速度变慢,从而导致神经网络对数据的顺序产生倾向性。
神经网络怎样进行参数初始化?
- Gaussian 分布初始化
- Xavier均匀分布初始化
神经网络参数初始化为0、过大、过小会怎样?
参数为0:在第一遍前向计算时,所有的隐层神经元的激活值都相同。这样会导致深层神经元没有区分性。这种现象也称为对称权重现象。
参数过小:参数过小还会使得Sigmoid型激活函数丢失非线性的能力,这样多层神经网络的优势也就不存在了。
参数过大:会导致输入状态过大。对于Sigmoid 型激活函数来说,激活值变得饱和,从而导致梯度接近于0。
神经网络优化方法有哪些?(学习率衰减+梯度方向优化)
- 调整学习率,使得优化更稳定
- 调整梯度方向,优化训练速度
简要解释Adam优化器的概念?
两个基本点:
- 每个参数进行个性化更新,可加快收敛速度;
- 动量可避免卡在鞍点上。
什么是神经网络中的内部协变量偏移(Internal Covariate Shift)?
在深层神经网络中,中间某一层的输入是上一层的神经层的输出。因此,上一层的神经层的参数变化会导致其输入的分布发生较大的差异。在使用随机梯度下降来训练网络时,每次参数更新都会导致网络中间每一层的输入的分布发生改变。越深的层,其输入的分布会改变得越明显,那么其参数需要重新学习,这种现象叫做内部协变量偏移。
协变量偏移:协变量是一个统计学概念,是可能影响预测结果的统计变量。在机器学习中,协变量可以看作是输入。一般的机器学习算法都要求输入在训练集和测试集上的分布是相似的。如果不满足这个要求,这些学习算法在测试集的表现会比较差。
批量归一化(Batch Normalization,BN)主要原理是什么?
通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
然而,如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了?
针对此问题,BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作,y=scale*x+shift,即每个神经元增加了两个参数scale和shift参数,这两个参数通过训练学到,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。
核心思想:找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
流程:
批量归一化(Batch Normalization,BN)的主要作用是什么?主要原理是什么?
BN 是一种正则化方法(减少泛化误差),主要作用有:
- 加速网络的训练(缓解梯度消失,支持更大的学习率)
- 防止过拟合:BN 可以看作在各层之间加入了一个新的计算层,对数据分布进行额外的约束,从而增强模型的泛化能力
- 降低了参数初始化的要求
BN 在推理阶段(inference)是怎么做的?
BN在训练的时候可以根据Mini-Batch里的若干训练实例进行激活数值调整,但是在推理(inference)的过程中,很明显输入就只有一个实例,看不到Mini-Batch其它实例,那么这时候怎么对输入做BN呢?
很明显,一个实例是没法算实例集合求出的均值和方差的。因此,可以用从所有训练实例中获得的统计量来代替Mini-Batch里面m个训练实例获得的均值和方差统计量,在推理的时候直接用全局统计量即可。
Batch normalization存在什么缺点?
- 对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布;
- BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。
什么是Layer normalization?
BN与LN的区别在于:
- LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差;
- BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。
神经网络正则化的方法有哪些?
- L1 和L2 正则化:L1 和L2 正则化是机器学习中最常用的正 则化方法,通过约束参数的L1 和L2 范数来减小模型在训练数据集上的过拟合现象Batch Normalization。
- 提前停止: 当验证集上的错误率不再下降,就停止迭代。
- Dropout:集成学习的解释:每做一次丢弃,相当于从原始的网络中采样得到一个子网络。每次迭代都相当于训练一个不同的子网络,这些子网络都共享原始网络的参数。那么,最终的网络可以近似看作是集成了指数级个不同网络的组合模型。当在循环神经网络上应用丢弃法,不能直接对每个时刻的隐状态进行随机丢弃,这样会损害循环网络在时间维度上记忆能力。一种简单的方法是对非时间维度的连接(即非循环连接)进行随机丢失.
- 数据增强:增加数据量,提高模型鲁棒性,避免过拟合。目前,数据增强还主要应用在图像数据上,在文本等其它类型的数据还没有太好的方法。
- 标签平滑:在输出标签中添加噪声来避免模型过拟合。在分类任务中,我们通常对类别标签的编码使用one-hot的形式。在深度学习中,通常在全连接层的最后一层,加入一个softmax来计算输入数据属于每个类别的概率,并把概率最高的作为这个类别的输入,然后使用交叉熵作为损失函数。这会导致模型对正确分类的情况奖励最大,错误分类惩罚最大。如果训练数据能覆盖所有情况,或者是完全正确,那么这种方式没有问题。但事实上这不可能,所以这种方式可能会带来泛化能力差的问题,即过拟合。
解释GAN的概念?
GAN(Generative Adversarial Network)即生成对抗网络,通常由两个神经网络D和G组成,其中D指的是判别器(Discriminator),而G指生成网络(Generative Network)。模型的目标是创建数据,例如创建与真实图像并无二样的图像。假设我们想要创建一只猫的对抗示例。神经网络G负责生成图像,而神经网络D则负责判断图像是否是猫。G的目标是“愚弄”D——将G的输出始终分类为猫。