1:BN机制,公式(前向和反向),BN怎么训练,以及作用
BN不是凭空拍脑袋拍出来的好点子,它是有启发来源的:之前的研究表明如果在图像处理中对输入图像进行白化(Whiten)操作的话,
所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布
那么神经网络会较快收敛,那么BN作者就开始推论了:图像是深度神经网络的输入层,做白化能加快收敛,那么其实对于深度网络来说,其中某个隐层的神经元是下一层的输入,意思是其实深度神经网络的每一个隐层都是输入层,不过是相对下一层来说而已,那么能不能对每个隐层都做白化呢?这就是启发BN产生的原初想法,而BN也确实就是这么做的,可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作。
BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致后向传播时低层神经网络的梯度消失。
这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
其实一句话就是:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。因为梯度一直都能保持比较大的状态,所以很明显对神经网络的参数调整效率比较高,就是变动大,就是说向损失函数最优值迈动的步子大,也就是说收敛地快。方法很简单,道理很深刻。
就是说经过BN后,目前大部分Activation的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。
公式:
作用:
BN(Batch Normalization)层的作用
(1)加速收敛,防止梯度消失(2)控制过拟合,可以少用或不用Dropout和正则(3)降低网络对初始化权重不敏感(4)允许使用较大的学习率
在每一层输入的时候,加个BN预处理操作。BN应作用在非线性映射前,即对x=Wu+b做规范化。在BN中,是通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大。可以说是一种更有效的local response normalization方法。
2写softmax公式,解释
3:梯度爆炸与消失产生原理与解决方法。
原因:实际上就是反向传播梯度计算过程中,网络层数很深,w值和激活函数的导数值相乘大于1或者小于1的问题,如果是大于1,那么经历过很多个隐藏层梯度就会越来越大,即梯度爆炸,如果是小于1当然就是梯度消失
梯度消失:(1)隐藏层的层数过多;(2)采用了不合适的激活函数(更容易产生梯度消失,但是也有可能产生梯度爆炸)
梯度爆炸:(1)隐藏层的层数过多;(2)权重的初始化值过大
解决梯度消失问题:
- 预训练加微调
- 梯度剪切、权重正则(针对梯度爆炸)
- 使用不同的激活函数
- 使用batchnorm
- 使用残差结构
- 使用LSTM网络
4:输入特征归一化有哪些方式,有什么好处。svm需不需要?决策树需不需要
1.归一化可以加快梯度下降法求解最优解的速度。
当特征之间的数值变化范围相差太大时,会使得收敛路径呈Z字型,导致收敛太慢,或者根本收敛不到最优解的结果。
2.归一化可以提高计算精度。
一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。
因此,可以看出,当算法需要使用梯度下降的方法求解最优解(比如逻辑回归)或者该算法计算样本点距离时(比如KNN)必须使用归一化处理。
归一化的方法有线性归一化,标准差标准化,非线性归一化,最常用的是标准差标准化, 概率模型(树形模型)不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、RF。而像Adaboost、SVM、LR、Knn、KMeans之类的最优化问题就需要归一化。
1)线性归一化
这种归一化方法比较适用在数值比较集中的情况,数据点没有因为特征的基本性质而产生较大差异,即确保数据处于同一数量级(同一量纲),提高不同特征数据的可比性。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。
把每个特征向量(特别是奇异样本数据)的值都缩放到相同数值范围。如[0,1]或[-1,1]。最常用的归一化形式就是将特征向量调整为L1范数(就是绝对值相加),使特征向量的数值之和为1。L2范数就是欧几里得之和。
2)标准差标准化
经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:
其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
3)非线性归一化
经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。
5:解决过拟和方法
- 数据增强
- 正则化、dropout、bn
- 早停止
-
降维
6:知道什么是k-means?k-means是否一定收敛,k的选择
算法流程:
1.选择聚类的个数k(kmeans算法传递超参数的时候,只需设置最大的K值)
2.任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心。
3.对每个点确定其聚类中心点。
4.再计算其聚类新中心。
5.重复以上步骤直到满足收敛要求。(通常就是确定的中心点不再改变。)
优点:
1、原理简单(靠近中心点) ,实现容易
2、聚类效果中上(依赖K的选择)
3、空间复杂度o(N)时间复杂度o(IKN)
N为样本点个数,K为中心点个数,I为迭代次数
缺点:
1、对离群点, 噪声敏感 (中心点易偏移)
2、很难发现大小差别很大的簇及进行增量计算
3、结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关)
K的选择:https://blog.csdn.net/sinat_30353259/article/details/80887779#K_49
7:gbdt里如何知道每个特征的重要性
在sklearn中,GBDT和RF的特征重要性计算方法是相同的,都是基于单棵树计算每个特征的重要性,探究每个特征在每棵树上做了多少的贡献,再取个平均值
利用Gini计算特征的重要性
单棵树上特征的重要性定义为:特征在所有非叶节在分裂时加权不纯度的减少,减少的越多说明特征越重要。
8:为什么svm的loss不能直接用梯度下降要用对偶?说说你知道的优化算法
- 对偶问题将原始问题中的约束转为了对偶问题中的等式约束
- 方便核函数的引入
- 改变了问题的复杂度。由求特征向量w转化为求比例系数a,在原始问题下,求解的复杂度与样本的维度有关,即w的维度。在对偶问题下,只与样本数量有关
9:LSTM减弱梯度消失的原理
门机制
10:L1范数L2范数原理,公式
11:AUC究竟在衡量模型什么能力?代码实现
当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。
它不受类别不平衡问题的影响,不同的样本比例不会影响AUC的评测结果
#author: wepon
def naive_auc(labels,preds):
"""
最简单粗暴的方法
先排序,然后统计有多少正负样本对满足:正样本预测值>负样本预测值, 再除以总的正负样本对个数
复杂度 O(NlogN), N为样本数
"""
n_pos = sum(labels)
n_neg = len(labels) - n_pos
total_pair = n_pos * n_neg
labels_preds = zip(labels,preds)
labels_preds = sorted(labels_preds,key=lambda x:x[1])
accumulated_neg = 0
satisfied_pair = 0
for i in range(len(labels_preds)):
if labels_preds[i][0] == 1:
satisfied_pair += accumulated_neg
else:
accumulated_neg += 1
return satisfied_pair / float(total_pair)
12:牛顿法和二分法的差别,和各自的优劣
13:分类问题的指标?准确度、召回率、PR曲线
https://blog.csdn.net/qq_36047533/article/details/88094878#2_Precision_11
在数据不平衡时,PR曲线是敏感的,随着正负样本比例的变化,PR会发生强烈的变化。而ROC曲线是不敏感的,其曲线能够基本保持不变。
14:特征选择的方法?Lasso回归、相关系数等
SQL如何取出成绩表中各科的前三名?
15:介绍Adam和dropout的原理BN为什么防止过拟合
16:xgboost和GBDT的分裂方式你认为哪个好。
17:word2vec
针对hierarchical softmax的缺点,然后针对这个缺点才有了负例采样,所以应该是hierarchical softmax的缺点,负例采样的优点。
hierarchical softmax的对生僻词不是很友好,因为词频越高的词在离根节点越近的叶子节点,词频越低的词在离根节点越远的叶子节点,也就是说当该模型在训练到生僻词时,需要走很深的路径经过更多的节点到达该生僻词的叶子节点位置,训练的时间更长。而负例采样在对生僻词进行训练时,训练时要找的反例词个数不变,所以每次训练更新的参数的个数不变,花费的训练时间不变,这样就会让训练速度更稳定,不会因为生僻词而使训练耗费更多的时间
word2vec的缺点的话就是他没有考虑到词的语序信息;另外就是word2vec只考虑到了局部信息,缺少了一些全局信息,而Glove针对这个有了改进,因为他里面有一个全局共现矩阵。
17:
面试题:https://www.nowcoder.com/discuss/341024?type=0&order=0&pos=112&page=1
正确答案应该是
大概意思是:在训练中,BN的使用使得一个mini-batch中的所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果。
这句话什么意思呢?意思就是同样一个样本的输出不再仅仅取决于样本本身,也取决于跟这个样本属于同一个mini-batch的其它样本。同一个样本跟不同的样本组成一个mini-batch,它们的输出是不同的(仅限于训练阶段,在inference阶段是没有这种情况的)。我把这个理解成一种数据增强:同样一个样本在超平面上被拉扯,每次拉扯的方向的大小均有不同。不同于数据增强的是,这种拉扯是贯穿数据流过神经网络的整个过程的,意味着神经网络每一层的输入都被数据增强处理了。