1、relu激活函数的好处
- relu激活函数计算简单,可以减少很多计算量。反向传播求误差梯度时,计算量较大,采用relu激活函数,可以节省很多计算量。
- 避免梯度消失问题。对于深层网络,sigmoid函数反向传播时,很容易会出现梯度消失问题(sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况造成信息丢失),从而无法完成深层网络的训练。
- 可以缓解过拟合的问题。relu会使一部分神经元的输出为0,这样造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合的发生。
- 相比sigmoid函数,relu函数有利于随机梯度下降方法收敛。
2、为什么要使用非线性激活函数
如果使用线性激活函数(恒等激活函数),那么无论神经网络有多少层,一直在做线性组合,线性函数的组合还是线性函数,除非引入非线性函数,所以中间的隐藏层没有用了,还不如去掉中间的隐藏层。
3、神经网络为什么权值需要随机初始化
对于逻辑回归,可以将权重初始化为0,但如果将神经网络的权重初始化为0,再使用梯度下降方法,那么完全无效。如果权重一样,隐藏层单元都在做一样的运算,隐藏层的单元完全一样,这就是所谓的完全对称,在这种情况下多个隐藏层单元没有意义,所以权重都是随机初始化的。权重初始化一般很小,如果权重太大, z i = w i x i + b z_{i}=w_{i}x_{i}+b zi=wixi+b过大, a i = g ( z i ) a_{i}=g(z_{i}) ai=g(zi)过大,使用tanh或者sigmoid激活函数时,梯度非常小,梯度下降会非常慢。
4、神经网络中的epoch、batch、batch size和iteration
epoch:所有数据进行一个正向传播和一个反向传播
iteration:一个正向传播和一个反向传播
batch:在不能将数据一次性通过神经网络的时候,就需要将数据集分成几个 batch
batch size:一个 batch 中的样本总数
在一个 epoch 中,batch 数和迭代数是相等的。
举个例子:
CIFAR10 数据集有 50000 张训练图片,10000 张测试图片。现在选择 Batch Size = 256 对模型进行训练。
每个 Epoch 要训练的图片数量: 50000
训练集具有的 Batch 个数: 50000 / 256 = 195 + 1 = 196(不能整除时+1)
每个 Epoch 需要完成的 Batch 个数: 196
每个 Epoch 具有的 Iteration 个数: 196
每个 Epoch 中发生模型权重更新的次数: 196
训练 10 代后,模型权重更新的次数: 196 * 10 = 1960
不同代的训练,其实用的是同一个训练集的数据。第 1 代和第 10 代虽然用的都是训练集的五万张图片,但是对模型的权重更新值却是完全不同的。因为不同代的模型处于代价函数空间上的不同位置,模型的训练代越靠后,越接近谷底,其代价越小。
为什么要使用多于一个 epoch?
在神经网络中传递完整的数据集一次是不够的,而且需要将完整的数据集在同样的神经网络中传递多次。但是请记住,使用的是有限的数据集,并且使用一个迭代过程即梯度下降,因此仅仅更新权重一次或者说使用一个 epoch 是不够的。
5、小卷积核
小卷积核(如3x3)通过多层叠加可取得与大卷积核(如7x7)同等规模的感受野,比如一张12x12的图片,使用两种不同大小的卷积核(3x3、7x7)来卷积,步长为1,7x7的卷积核卷积一次得到6x6大小的特征图,3X3的卷积核卷积三次得到6x6大小的特征图。
小卷积核需多层叠加,加深了网络深度进而增强了网络容量(model capacity)和复杂度(model complexity)。
增强了网络容量的同时减少了参数个数。
更多的非线性变换。3个3x3的卷积可以使用3次relu激活函数,1个7x7的卷积只用一次relu激活函数。
6、CNN结构特点
局部连接,权值共享,池化操作,多层次结构。
- 局部连接使网络可以提取数据的局部特征
- 权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积
- 池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。
7、pooling层作用
- 增加特征平移不变性。pooling可以提高网络对微小位移的容忍能力。
- 减小特征图大小。pooling层对空间局部区域进行下采样,使下一层需要的参数量和计算量减少,并降低过拟合风险,提高模型的泛化能力。
- max pooling可以带来非线性。这是目前max pooling更常用的原因之一。
8、Overfitting怎么解决
首先所谓过拟合,指的是一个模型过于复杂之后,它可以很好地“记忆”每一个训练数据中随机噪音的部分而忘记了去“训练”数据中的通用趋势。过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。
解决Overfitting的常用手段:
- Parameter Norm Penalties(参数范数惩罚);
- Dataset Augmentation (数据集增强);
- Early Stopping(提前终止);
- Parameter Tying and Parameter Sharing (参数绑定与参数共享);
- Bagging and Other Ensemble Methods(Bagging 和其他集成方法);
- dropout;
- regularization;
- batch normalization;
9、什么是梯度消失和爆炸,怎么解决?
当训练较多层数的模型时,一般会出现梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)。注意在反向传播中,当网络模型层数较多时,梯度消失和梯度爆炸是不可避免的。
深度神经网络中的梯度不稳定性,根本原因在于前面层上的梯度是来自于后面层上梯度的乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景。前面的层比后面的层梯度变化更小,故变化更慢,故引起了梯度消失问题。前面层比后面层梯度变化更快,故引起梯度爆炸问题。
神经网络的训练中,通过改变神经元的权重,使网络的输出值尽可能逼近标签以降低误差值,训练普遍使用BP算法,核心思想是,计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,进行权值的迭代。
梯度消失会造成权值更新缓慢,模型训练难度增加。造成梯度消失的一个原因是,许多激活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为0,造成学习停止。
解决梯度消失和梯度爆炸问题,常用的有以下几个方案:
- 预训练模型 + 微调
- 梯度剪切 + 正则化
- relu、leakrelu、elu等激活函数
- BN批归一化
10、训练过程中模型不收敛,是否说明这个模型无效,致模型不收敛的原因有哪些?
不一定。导致模型不收敛的原因有很多种可能,常见的有以下几种:
- 没有对数据做归一化。
- 没有检查过结果。这里的结果包括预处理结果和最终的训练测试结果。
- 忘了做数据预处理。
- 忘了使用正则化。
- Batch Size设的太大。
- 学习率设的不对。
- 最后一层的激活函数用的不对。
- 网络存在坏梯度。比如Relu对负值的梯度为0,反向传播时,0梯度就是不传播。
- 参数初始化错误。
- 网络太深。隐藏层神经元数量错误。
11、数据为什么要归一化
归一化就是将数据映射到[0,1]或者[-1,1]区间或者其它区间。
- 输入数据单位不一样,有些数据的范围可能特别大,导致神经网络收敛慢、训练时间长
- 数据范围大的输入在模式识别中的作用可能会偏大,而数据范围小的输入的作用就可能偏小。
- 由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练目标数据映射到激活函数的值域。例如神经网络的输出层若采用sigmoid激活函数,它的值域(0,1),也就是说神经网络的输出只能限制在(0,1)之间,所以训练数据的输出要归一化到[0,1]区间。
- S型激活函数在(0,1)区间以外的区间很平缓,区分度太小。
12、特征是否必须要归一化,请结合逻辑回归和决策树算法做简要分析。
特征并不一定要归一化;
在主要基于梯度下降优化算法的模型如逻辑回归,GBDT,需要将特征归一;
在决策树模型中,如XGBoost,不需要特征归一化。
13、L1正则化和L2正则化的区别
L1是模型各个参数的绝对值之和;L2是模型各个参数的平方和的开方值。
L1正则化让大部分变量解为0,这就让有效的变量的解减少,从而达到一种稀疏的目的,会产生稀疏权重矩阵,具有特征选择的功能;L2正则化相当于给每个变量相同的权值,不强调某一个(些)变量,考虑每个变量(即考虑全局特性),L2正则化具有比较好的鲁棒性。
14、PCA和特征选择的区别
特征选择是从已存在的特征中选取信息量最多的特征,特征选择之后所选择出来的特征仍然具有可解释性,可以在原数据中找到这些特征;
PCA是将已存在的特征进行压缩,将维后的特征不是原本特征矩阵中任何一个特征,而是通过某些方式组合起来的新特征,降维后的特征不具有可解释性。