概述
机器学习面试题汇总(1~50题)
- 1 深度神经网络预防过拟合的方法?
- 2 SMOTE算法(过采样算法)?
- 3 为什么LR(逻辑回归)用sigmoid函数?
- 4 LR损失函数?
- 5 几种神经网络梯度下降方法?
- 6 克莱姆法则?
- 7 各种排序的时间复杂度?
- 8 鞍点上的Hessian矩阵情况
- 9 均匀分布的期望和方差?
- 10 切比雪夫不等式?
- 11 如何检验数据是否符合正态分布?
- 12 协方差相关系数?
- 13 ROC曲线绘制?
- 14 欧氏距离和余弦距离的使用?
- 15 模型评估的方法?
- 16 超参数调优的方法?
- 16 过拟合和欠拟合的解决方法?
- 17 逻辑斯蒂回归和线性回归的区别?
- 18 多标签分类的策略?
- 19 ID3、C4.5与CART区别?
- 20 异常值检测?
- 21 生成模型和判别模型?
- 21 信息熵问题?
- 22 最小回归生成树的生成?
- 23 分类树的生成生成?
- 24 方差与偏差?
- 25 为什么L1正则化会更容易得到稀疏解?
- 26 SVM支持向量机?
- 27 介绍常见的核函数?
- 28 最大池化层作用?
- 29 机器学习中的距离?
- 30 梯度消失和梯度爆炸?
- 31 如何解决梯度消失和梯度爆炸?
- 32 LSTM?
- 33 GRU?
- 34 Transformer?
- 35 GAN(对抗生成网络)?
- 36 Batch_Normalization
- 37 Attention问题
- 38 Dropout的使用
- 39 请简要介绍下tensorflow的计算图
- 40 L1正则化和L2正则化的区别
- 41 LR和SVM的联系与区别
- 42 请问(决策树、Random Forest、Booting、Adaboot)GBDT和XGBoost的区别是什么?
- 43 为什么xgboost要用泰勒展开,优势在哪里?
- 44 xgboost如何寻找最优特征?是又放回还是无放回的呢?
- 45 CNN应用于CV、NLP和Speech的共性?
- 46 请简要说说EM算法
- 47 防止过拟合的方法
- 48 机器学习中,为何要经常对数据做归一化
- 49 对于树形结构为什么不需要归一化?
- 50 请简要说说一个完整机器学习项目的流程
1 深度神经网络预防过拟合的方法?
①数据增强(比如图片,增加图片数量、翻转等,用更多数据来训练)
②添加正则化项(参数范数惩罚,平衡偏差和方差)、
③提前停止(当随着模型的能力提升,训练集的误差会先减小再增大)
④添加dropout(随机让一部分神经元失活)
⑤归一化(Batch Normalization)(对每一个mini-batch的数据进行归一化,使输出规范到N(0,1)的正态分布,减少了内部神经元分布的改变,学习速率可以增大很多倍)
⑥Bagging和其他集成方法。
2 SMOTE算法(过采样算法)?
对少数类中的每个样本x,从它在少数类样本中的K近邻中随机选取m(采样倍率)个y,然后在x,y连线上随机选取一点作为合成的新样本。
算法缺陷:
①k的下限是m,但是上限没法确定,只能反复测试以使算法达到最优。
②该算法无法克服非平衡数据集的数据分布问题,容易产生分布边缘化问题。
3 为什么LR(逻辑回归)用sigmoid函数?
LR模型是一个二分类模型,即对于一个X,预测其发生或不发生。但事实上,对于一个事件发生的情况,往往不能得到100%的预测,因此LR可以得到一个事件发生的可能性,超过50%则认为事件发生,低于50%则认为事件不发生。因此从LR的目的上来看,在选择函数时,有两个条件是必须要满足的:
- 取值范围在0~1之间。
- 对于一个事件发生情况,50%是其结果的分水岭,选择函数应该在0.5中心对称。
此外,sigmoid函数以对数的方式完成到(0,1)的映射,凸显大的分数的作用,使其输出概率更高;抑制小分数额输出概率。
4 LR损失函数?
LR的损失函数是负的对数损失函数,线性回归是平方损失函数。LR使用的是交叉熵损失函数,使用极大释然估计进行求解。其实也可以用MSE函数,因为最大化似然估计等价于MSE最小。
5 几种神经网络梯度下降方法?
神经网络经典五大超参数:
学习率(Learning Rate)、权值初始化(Weight Initialization)、网络层数(Layers)
单层神经元数(Units)、正则惩罚项(Regularizer|Normalization)
显然在这里超参数指的是事先指定的learningrate,而对超参数不敏感的梯度算法是Adadelta,牛顿法。
优化算法的功能,是通过改善训练方式,来最小化(或最大化)损失函数E(x)。
- BGD批量梯度下降(一次迭代训练所有样本)
- SGD随机梯度下降(SGD的思想是每次只训练一个样本去更新参数,为了加快收敛速度,并且解决大数据量无法一次性塞入内存的问题)
- Adagrad(Adagrad方法是通过参数来调整合适的学习率η,对稀疏参数进行大幅更新和对频繁参数进行小幅更新。因此,Adagrad方法非常适合处理稀疏数据。Adagrad方法的主要缺点是,学习率η总是在降低和衰减。)
- Adadelta自适应学习率调整(这是一个AdaGrad的延伸方法,它倾向于解决其学习率衰减的问题。Adadelta不是累积所有之前的平方梯度,而是将累积之前梯度的窗口限制到某个固定大小w。)
- Momentum冲量法(SGD方法中的高方差振荡使得网络很难稳定收敛,所以有研究者提出了一种称为动量(Momentum)的技术,通过优化相关方向的训练和弱化无关方向的振荡,来加速SGD训练。换句话说,这种新方法将上个步骤中更新向量的分量’γ’添加到当前更新向量。)
- NAG(NGA算法是一个对冲量算法的改进算法,其求梯度并非求解当前位置的梯度,而是应该 求解下一个时刻的梯度。相当于一般的冲量算法是根据当前的梯度决定运动方向。而NGA算法则相当于看一下前方的梯度,再决定运动方向。)
- 牛顿法(牛顿法其实就是给函数在当前位置做一个一阶展开,即每次迭代的x的变化量都为当前位置的斜率。)
6 克莱姆法则?
①克莱姆法则适用于求解变量和方程数目相等的线性方程组
②克莱姆法则可知,当方程组的系数行列式不等于零时,则方程组有解,且具有唯一的解
③如果方程组无解或者有两个不同的解,那么方程组的系数行列式必定等于零
7 各种排序的时间复杂度?
8 鞍点上的Hessian矩阵情况
神经网络优化问题中的鞍点即一个维度向上倾斜且另一维度向下倾斜的点。
鞍点:梯度等于零,在其附近Hessian矩阵有正的和负的特征值,行列式小于0,不定的。
鞍点和局部极小值相同的是,在该点处的梯度都等于零,不同在于在鞍点附近Hessian矩阵是不定的,非正定,非负定,非半正定(行列式小于0),而在局部极值附近的Hessian矩阵是正定的。
在鞍点附近,基于梯度的优化算法(几乎目前所有的实际使用的优化算法都是基于梯度的)会遇到较为严重的问题。
鞍点处的梯度为零,会降低神经网络学习速度。在高维的情形,这个鞍点附近的平坦区域范围可能非常大,这使得SGD算法很难脱离区域,即可能会长时间卡在该点附近(因为梯度在所有维度上接近于零)。 在鞍点数目极大的时候,这个问题会变得非常严重。
高维非凸优化问题之所以困难,是因为高维参数空间存在大量的鞍点
9 均匀分布的期望和方差?
数学期望是分布区间左右两端和的平均值,方差为分布区间左右两端差值平方的十二分之一。均匀分布又被叫做矩形分布和等概率分布。
10 切比雪夫不等式?
11 如何检验数据是否符合正态分布?
图示法:P-P图 Q-Q图 直方图 茎叶图
统计指示法:偏度和峰度 偏度和峰度联合检验 W检验 K-S检验 Cramér-VonMises检验
Anderson-Darling检验
中心极限定理?
12 协方差相关系数?
二维随机变量(X,Y),X与Y之间的协方差定义为:
协方差:
C
o
v
(
X
,
Y
)
=
E
[
X
−
E
(
X
)
]
[
Y
−
E
(
Y
)
]
Cov(X,Y)=E{[X-E(X)][Y-E(Y)]}
Cov(X,Y)=E[X−E(X)][Y−E(Y)]
当协方差Cov(X,Y)>0时,称X与Y正相关
当协方差Cov(X,Y)<0时,称X与Y负相关
当协方差Cov(X,Y)=0时,称X与Y不相关
相关系数:
13 ROC曲线绘制?
横坐标为假阳率FP(实际是负的,预测为正的)
纵坐标为真阳率TP(实际是正的,预测为正的)
通过不断地调整阈值获得样本的假阳率和真阳率依次绘制在坐标轴上,即得到AUC曲线,阈值一般从大到小进行调整。这就需要样本的预测概率和标签进行计算。
AUC面积就是ROC曲线下与横纵坐标形成的面积,当正负样本的分布发生变化时,ROC曲线能够保持稳定而P-R曲线差别较大。ROC曲线能够降低不同测试集带来的干扰,比如正负样本比例极其不均衡的情况下,更加稳定地反映模型的好坏。
AUC越大,说明分类器越可能把真正的样本排在前面,分类性能越好。
14 欧氏距离和余弦距离的使用?
欧氏距离关注数值上的差异(比如用户的活跃度),而余弦距离体现方向上的绝对差异(比如观看行为)
余弦距离满足正定性质(大于0),满足对称性,不满足三角不等式(反例为[0,1],[1,1],[1,0]),因此它不是一个严格定义的距离。清楚dist(A,B)距离公式的定义。
15 模型评估的方法?
Holdout检验,对数据进行三七分,但是性能过分依赖原始分组
交叉检验:k-fold交叉验证和留一验证。K值一般取10,但是应用开销较大
自助法:基于自主采样的检验方法,对于样本数为n的集合进行n次有放回的随机采样。当样本数量很大时,大约有36.8%样本从未被选择过,将没被抽出的样本作为训练集。
16 超参数调优的方法?
- 网格搜索(穷举式超参数优化方法GridSearch):一般用较广的搜索范围和较大的步长来寻找全局最优值,实际应用中先找到全局最优值可能的位置,再逐步缩小搜索范围和步长来寻找更精确的最优值,时间和开销极大。
- 随机搜素(随机采样式超参数优化方法Randomized):在超参数范围内,随机选择最优点,比网格搜索快些,结果无法保证。
- 贝叶斯优化算法:网格搜索和随机搜索在测试一个新点时会忽略前一个点的信息,而贝叶斯优化算法则充分利用之前的信息,找到目标函数全局最优值提升的参数。具体:根据先验分布,假设一个搜集函数;然后,每次使用新的样本点来测试目标函数式,利用这个信息来更新目标函数的先验分布,最后算法测试由后验分布给出的全局最值最可能出现的位置的点。一旦找到局部最优值,会在该区域不断采样,很容易陷入局部最优,需要在探索和利用之间找到平衡。
16 过拟合和欠拟合的解决方法?
过拟合:在训练集上表现良好在测试集上表现较差
- 增加数据量
- 降低模型的复杂度
- 添加正则化项
- 集成学习的方法
欠拟合:在训练集和测试集表现效果均不好 - 添加新特征
- 增加模型的复杂度
- 减少正则化系数
17 逻辑斯蒂回归和线性回归的区别?
①逻辑斯蒂回归解决的是分类问题,而线性回归解决的则是预测问题。逻辑斯蒂回归将实例x划分到条件概率最大的那一类。
②逻辑斯蒂回归的因变量是离散的,而线性回归得因变量是连续的,逻辑斯蒂回归可以看成是对数几率的线性回归。
③逻辑斯蒂回归参数求解的过程中,使用到了极大似然估计而线性回归则使用最小二乘法。二者在求解时均用到了梯度下降的方法。
18 多标签分类的策略?
①OVR:一对剩余,对于有n个类的样本数据集,需要训练n个分类器,每次将一个类的样例作为正例、所有其他类的样例作为反例来训练。测试时若仅有一个分类器预测为正类,则对应的类别标记作为最终分类结果。若有多个分类器预测为正类,则通常考虑各分类器的预测置信度,选择置信度最大的类别标记作为分类结果。
②OVO:N个类两两配对,共需要训练
n
(
n
−
1
)
2
frac{n(n-1)}{2}
2n(n−1)个二分类任务。新样本将同时提交给所有分类器,于是我们将得到
N
(
N
−
1
)
2
frac{N(N-1)}{2}
2N(N−1)个分类结果,最终结果可通过投票产生:即把被预测得最多的类别作为最终分类结果。
③OvO的优点是,在类别很多时,每次训练使用两类样本数据,训练时间要比OvR少。缺点是,分类器个数多。
④OvR的优点是,分类器个数少,但是每次训练使用全部数据。存储开销和测试时间比OvO少。缺点是,类别很多时,训练时间长。
19 ID3、C4.5与CART区别?
ID3使用的信息增益,C4.5使用的是信息增益率,CART使用的是基尼系数
ID3、C4.5决策树只适合用来做分类,而CART既可以用来做分类又可以用来做回归。
20 异常值检测?
离群点:全局离群点、情景离群点和集体离群点
定义:分布稀疏且离密度高的群体距离远的点
原因:数据收集过程中出现错误(录入错误)、数据测量误差(人为、测量仪器)、数据随机误差(数据误差)
如何检测:
- 基于高斯分布的异常点检测:根据已有数据集建立高斯分布的模型,通过新数据与已知分布的差异判断异常值。
- 四分位数:Q1为上四分位数,Q3为下四分位数,IQR=Q3-Q1,min=Q1-k * IQR, max=Q3+k * IQR,k一般取1.5
- 基于统计学的方法、基于临近性的方法、基于聚类的方法。基于统计学的方法:假定数据集中的正常对象由一个生成模型产生,因此,正常对象出现在该随机模型的高概率区域中,而低概率区域中的对象是离群点。基于临近性和密度的方法:基于距离的和基于密度的。基于距离的考虑对象给定半径的邻域。基于密度的考察对象和它近邻的密度,比如使用对象的3个最近邻进行建模,则区域R中的对象显著地不同于该数据集的其他对象。对于R中的两个对象,它们的第二个和第三个最近邻都显著地比其他对象的第二个和第三个最近邻更远,因此可以把R中的对象标记为基于临近性的离群点。基于聚类的方法:通过考察对象与簇之间的关系检测离群点。离群点是一个对象,属于小的偏远簇,或不属于任何簇,根据该对象对最近簇中心的距离。有监督的学习方法,将其视为种类及其不均衡的二分类问题,通过对负样本抽样复制或者人工构造离群点来增加离群点的数量。
- 高维数据的离群点检测。面临离群点解释、数据稀疏性、数据子空间、维度可伸缩性的挑战。扩充的传统离群点检测、找出子空间中的离群点和对高维离群点建模,基于角的离群点建模,对于簇中心的点,和任意两个点形成的角度差别很大,而对于离群点,角度变化显著地小。
- 异常值如何处理:删除观察值、转换、分组、估算或其他统计方法。删除:如果由于数据输入错误且异常值点非常少,我们可以直接将其删除。变换合并值:对其取自然对数。估算:使用中位数、平均值或众数填充,也可以使用统计模型来预测异常值观测值,而后用预测值估算它。单独处理:如果存在大量异常值,我们就需要对其单独进行处理。将两组视为两个不同的组,并为两组建立个体模型,然后组合输出。
- oneclass分类,将类别分为是和否,猛一看和二分类一样,但是其训练集只包括购买了产品用户的数据,而二分类则包括买和不买的用户数据。
21 生成模型和判别模型?
- 生成式模型估计它们的联合概率分布P(x,y)
- 判别式模型估计决策函数F(X)或条件概率分布P(y|x)
- 生成式式模型可以根据贝叶斯公式得到判别式模型,但反过来不行
生成式模型 - 判别式分析
- 朴素贝叶斯Native Bayes
- 混合高斯型Gaussians
- K近邻KNN
- 隐马尔科夫模型HMM
- 贝叶斯网络
- sigmoid belief networks
- 马尔科夫随机场Markov random fields
- 深度信念网络DBN
- 隐含狄利克雷分布简称LDA(Latent Dirichlet allocation)
- 多专家模型(the mixture of experts model)
判别式模型 - 线性回归linear regression
- 逻辑回归logic regression
- 神经网络NN
- 支持向量机SVM
- 高斯过程Gaussian process
- 条件随机场CRF
- CART(Classification and regression tree)
- Boosting
9.区分度训练
21 信息熵问题?
熵表示随机变量的不确定性,特征取值越多,熵的值就越大。
信息增益:知道特征X的信息而使类Y的信息的不确定性减少的程度。
信息增益的计算公式
信息增益比的计算公式
基尼系数的计算公式
ID3和C4.5只能解决分类问题,CART则可以解决分类和回归问题
预剪枝和后剪枝
决策树学习的损失函数,既考虑了模型的预测误差,又考虑了模型的复杂度,即叶节点的个数,在两者之间达到平衡。
22 最小回归生成树的生成?
①在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树。
②选择最优切分变量j与切分点s,遍历切分变量j,对固定的切分变量扫描切分点s
③用选定的对(j,s)划分区域并决定相应的输出值
④继续对两个子区域递归调用上述两个步骤,直到满足停止条件
将输入空间划分为M个区域,生成决策树。
23 分类树的生成生成?
①计算现有特征对该数据集的基尼系数,对于每一个特征A,对其可能取的每一个值a,计算样本点对A=a的测试为“是”或“否”将D分成D1和D2两部分。
②在所有的特征A以及它们所有的切分点a中,选择基尼系数最小的特征及对应的切分点作为最优特征和最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子节点中去。
③对两个子结点递归调用以上两步,直到满足停止条件。停止条件一般有叶子结点个数以及基尼系数规定。
24 方差与偏差?
①偏差度量了学习算法的期望预测与真实结果的偏离程序, 即 刻画了学习算法本身的拟合能力 .
②方差度量了同样大小的训练集的变动所导致的学习性能的变化, 即 刻画了数据扰动所造成的影响 .
③噪声表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界, 即 刻画了学习问题本身的难度 . 巧妇难为无米之炊, 给一堆很差的食材, 要想做出一顿美味, 肯定是很有难度的.
给定一个学习任务, 在训练初期, 由于训练不足, 学习器的拟合能力不够强, 偏差比较大, 也是由于拟合能力不强, 数据集的扰动也无法使学习器产生显著变化, 也就是欠拟合的情况;
随着训练程度的加深, 学习器的拟合能力逐渐增强, 训练数据的扰动也能够渐渐被学习器学到;充分训练后, 学习器的拟合能力已非常强, 训练数据的轻微扰动都会导致学习器发生显著变化, 当训练数据自身的、非全局的特性被学习器学到了, 则将发生过拟合.
25 为什么L1正则化会更容易得到稀疏解?
①L1正则化就是在目标函数后面添加
λ
w
lambda w
λw,而L2正则化在损失函数后面添加
λ
w
lambda w
λw参数的平方,一般而言参数及参数的平方会规定小于某个特征的常量,那么我们就可以写出拉格朗日函数,
(
m
i
n
(
y
−
w
∗
x
)
2
+
λ
∗
(
w
2
−
m
)
)
(min(y-w*x)^2+lambda*(w^2-m))
(min(y−w∗x)2+λ∗(w2−m))根据KKT条件应该满足对w进行求导得到为0。
L2正则化相当于为参数定义了一个圆形的解空间,因为必须保证L2范数不能大于m,而L1正则化相当于为参数定义了一个菱形的解空间。如果原问题目标函数的最优解不是恰好落在解空间内,那么约束条件的最优解一定是在解空间的边界上 ,而L1的解空间显然更容易与目标函数等高线在坐标轴上相遇,进而产生稀疏解。
②两种正则项能不能把最优的x变成0,取决于原先的损失函数在0点处的导数。如果本来导数不为0,那么施加L2正则项后导数依然不为0,最优的x也不会变成0。而施加L1正则项时,只要系数C大于原损失函数在0点处的导数的绝对值,x=0就会变成一个极小值点。这是因为,L1正则化的损失函数在极值处(尖点)是不可导的,也就是说该点两边的导数异号,也即f’(0)-C和f’(0)+C异号,故C大于f’(0)时,x=0就会变成一个极小值点。
26 SVM支持向量机?
以二分类为例,我们将正例划分为1,负例划分为-1。支持向量机的思想就是找到一个最大分割超平面,将样本分为正类和负类。感知机利用误分类最小的策略,解可能有无数个。而线性可分支持向量机利用间隔最大化求最优超平面,这时候解是唯一的。
①接着目标函数:
f
=
1
2
w
2
f = frac{1}{2} w^2
f=21w2
限制条件为
y
(
w
∗
x
+
b
)
−
1
>
=
0
y(w*x+b)-1>=0
y(w∗x+b)−1>=0
②接着我们构建拉格朗日函数
根据拉格朗日对偶性可知原始问题的对偶问题为极大极小问题,对w,b求极小,对
α
alpha
α求极大。对w,b求极小我们可以得到w可以用
α
alpha
α,y与x进行表示,代入到L函数可得到表示形式,接着L对
α
alpha
α求极小,w和b求得得解满足KKT条件,从而可以解出
α
alpha
α,x和y的值,从而得到最大超平面的函数。
序列最小最优化方法来求
α
alpha
α的值(SMO算法)
对
α
alpha
α而言,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题,这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,这会使得原始二次规划问题的目标函数值变得更小。
这时子问题可以通过解析的方法求解,这样就大大提高了整个算法的计算速度。
子问题有两个变量,一个是违反KKT最严重的那一个,另一个由约束条件自动确定。每次完成两个变量的优化后,都要从新计算b和差值E
27 介绍常见的核函数?
- 线性核函数
主要用于线性可分的情况。我们可以看到特征空间到输入空间的维度是一样的,其参数少|速度快。对于线性可分数据,其分类效果很理想。
k ( x , y ) = x t y k(x,y)=x^ty k(x,y)=xty - 多项式核函数
多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。
k ( x , y ) = ( a x t y + c ) d k(x,y)=(ax^ty+c)^d k(x,y)=(axty+c)d - 高斯径向基核函数
可以将一个样本映射到一个更高维的空间内,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少。
k ( x , y ) = e − ∣ ∣ x − y ∣ ∣ 2 2 σ 2 k(x,y) = e^{-frac{||x-y||^2}{2sigma ^2}} k(x,y)=e−2σ2∣∣x−y∣∣2 - 字符串核函数
常用于文本分类、信息检索和生物信息学。字符串s和t总长度等于n的所有子串组成的特征向量的余弦相似度。两个字符串给出的相同的子串越多,它们就越相似,字符串核函数的值就越大。
28 最大池化层作用?
- invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)
- 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力。做了特征选择,选出了分类辨识度更好的特征,提供了非线性。
此外还有average_pooling和weighted_pooling两种处理方式,average_pooling更多地保留图像的背景信息,确保图片信息的完整传递。
29 机器学习中的距离?
曼哈顿距离、欧氏距离、切比雪夫距离、汉明距离(两个字符串对应位置不一样的个数)、余弦相似度。
30 梯度消失和梯度爆炸?
两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。
①深度网络中
在利用反向传播算法来更新参数时,由于多个隐层状态相乘,表现在链式求导中,对激活函数中的变量进行求导。如果w<1,越往前梯度会越小,直至梯度消失;如果w>1,越往前梯度越大,呈指数增长就会导致梯度爆炸。
②激活函数角度
上文中提到计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了,如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。
31 如何解决梯度消失和梯度爆炸?
- 预训练加微调
此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。 - 梯度剪切、正则
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
权重正则化(weithts regularization)比较常见的是l1正则,和l2正则。
正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:
L o s s = ( y − W T x ) 2 + α ∣ ∣ W ∣ ∣ 2 Loss=(y-W^Tx)^2+ alpha ||W||^2 Loss=(y−WTx)2+α∣∣W∣∣2
其中,α 是指正则项系数,因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。 - relu、leakrelu等激活函数
①Relu:思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。由于负数部分恒为0,会导致一些神经元无法激活,且输出不是以0为中心的。
②leakrelu:就是为了解决relu的0区间带来的影响,其数学表达为: l l e a k r e l u = m a x ( k ∗ x , x ) lleakrelu=max(k∗x,x) lleakrelu=max(k∗x,x)其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来。 - batchnorm
Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
具体的batchnorm原理非常复杂,在这里不做详细展开,此部分大概讲一下batchnorm解决梯度的问题上。具体来说就是反向传播中,经过每一层的梯度会乘以该层的权重,举个简单例子:
正向传播中 f 2 = f 1 ( w T ∗ x + b ) f 2 f2=f1(wT∗x+b) f_2 f2=f1(wT∗x+b)f2,那么反向传播中, ∂ f 2 ∂ x = ∂ f 2 ∂ f 1 w frac {partial f_2}{partial x}=frac{partial f_2}{partial f_1}w ∂x∂f2=∂f1∂f2w,反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。 - 残差结构
几乎所有的深度网络都离不开残差的身影,相比较之前的几层,几十层的深度网络,在残差网络面前都不值一提,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分,其中残差单元如下图所示:
相比较于以前网络的直来直去结构,残差中有很多这样的跨层连接结构,这样的结构在反向传播中具有很大的好处。
- LSTM
LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates),如下图,LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。
32 LSTM?
长短时间记忆网络,包含输入门,输出门,遗忘门。
33 GRU?
是LSTM的一个变体,比LSTM简单。将忘记门和输入门合成了一个单一的更新门,还混合了细胞状态和隐藏状态,加诸其他一些改动。
34 Transformer?
见博客图解Transformer
其中encoder有6层,每层有self-attention层和一个全连接的前馈神经网络
Decoder与encoder类似,也有6层,每层有self-attention层、encoder-decoder层和一个全连接的前馈神经网络。
词向量嵌入只发生在最底层得encoder上,其他5层的输入就是前一层的的输出
列表的大小和词向量维度的大小都是可以设置的超参数。一般情况下,它是我们训练数据集中最长的句子的长度
Self-attention层的输入和输出是有依赖关系的,而前馈层则没有依赖,可以并行化提高学习速率。
Self-attention实现比较复杂,在翻译的不同时刻会聚焦在不同的单词上。
①第一步
在每个encoder的输入上创建3个向量,分别为键向量、值向量和查询向量。分别是拿词向量嵌入乘以三个向量的训练矩阵得到的
②第二步:计算得分
我们在某个位置编码单词时,分数决定了对输入句子的其他单词的关照程度。
是拿Q向量乘以K向量进行点乘计算得分,然后除以词向量维度的开方。再对分数进行softmax处理得到概率乘以值向量得到z1向量
③Transformer使用多头机制,计算得到8个不同的权值矩阵,最后进行拼接乘以输出向量权值矩阵得到输出
此外还独创位置编码考虑单词的顺序,将位置向量与词向量相加代入到encoder层
Decoder
Self-attention只关注序列中较早的位置
Encoder-decoder attention层的工作方式与多头self-attention一样,只是它从下面的层创建查询矩阵,获取key向量和value向量的矩阵。
线性层是一个简单的全连接神经网络,它是由Decoder堆栈产生的向量投影到一个更大,更大的向量中,称为对数向量
假设实验中我们的模型从训练数据集上总共学习到1万个英语单词(“Output Vocabulary”)。这对应的Logits矢量也有1万个长度-每一段表示了一个唯一单词的得分。在线性层之后是一个softmax层,softmax将这些分数转换为概率。选取概率最高的索引,然后通过这个索引找到对应的单词作为输出。
35 GAN(对抗生成网络)?
GAN 有两个网络,一个是 generator,一个是 discriminator。
大体思想:
①一代的 generator,它能生成一些很差的图片,然后有一个一代的 discriminator,它能准确的把生成的图片,和真实的图片分类,简而言之,这个 discriminator 就是一个二分类器,对生成的图片输出 0,对真实的图片输出 1。
②接着,开始训练出二代的 generator,它能生成稍好一点的图片,能够让一代的 discriminator 认为这些生成的图片是真实的图片。然后会训练出一个二代的 discriminator,它能准确的识别出真实的图片,和二代 generator 生成的图片。以此类推,会有三代,四代。。。n 代的 generator 和 discriminator,最后 discriminator 无法分辨生成的图片和真实图片,这个网络就拟合了
1)首先训练D,D希望V(G, D)越大越好,所以是加上梯度(ascending)
2)然后训练G时,G希望V(G, D)越小越好,所以是减去梯度(descending);
3) 整个训练过程交替进行。
在训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。
最后博弈的结果是什么?在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。
这样我们的目的就达成了:我们得到了一个生成式的模型G,它可以用来生成图片。
36 Batch_Normalization
BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
BN的好处:①不仅仅极大提升了训练速度,收敛过程大大加快;②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。
37 Attention问题
Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射。输入序列不论长短都会被编码成一个固定长度的向量表示,而解码则受限于该固定长度的向量表示。
在计算attention时主要分为三步:
①第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;
②第二步一般是使用一个softmax函数对这些权重进行归一化;
③最后将权重和相应的键值value进行加权求和得到最后的attention。
目前在NLP研究中,key和value常常都是同一个,即key=value。
38 Dropout的使用
Dropout的使用是预防过拟合的手段,使得神经网络的神经元在训练时以一定概率停止工作。具体工作如下,首先随机选择一定数量的神经元停止工作,让其他神经元对特征进行学习向前传播,然后把得到的损失结果通过修改后的网络反向传播,对工作的神经元参数进行调整,上一轮停止工作的神经元参数不变,接着再随机选取一部分神经元停止工作,依次类推,直到达到停止训练条件。
这样做的好处有二:
①对过拟合取平均。不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。
②减少神经元之间复杂的共适应现象。因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐藏节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征。
39 请简要介绍下tensorflow的计算图
Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
40 L1正则化和L2正则化的区别
L1正则化,又叫Lasso Regression,L1是向量各元素的绝对值之和。
L2正则化,又叫Ridge Regression,L2是向量各元素的平方和。
相同点:都用于避免过拟合
不同点:L1可以让一部分特征的系数缩小到0,从而间接实现特征选择。所以L1适用于特征之间有关联的情况。
L2让所有特征的系数都缩小,但是不会减为0,它会使优化求解稳定快速。所以L2适用于特征之间没有关联的情况
41 LR和SVM的联系与区别
1、LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题)
2、两个方法都可以增加不同的正则化项,如l1、l2等等。所以在很多实验中,两种算法的结果是很接近的。
区别:
1、LR是参数模型,SVM是非参数模型。
2、从目标函数来看,区别在于逻辑回归采用的是logistical loss,SVM采用的是hinge loss.这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
3、SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。
4、逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
5、logic 能做的 svm能做,但可能在准确率上有问题,svm能做的logic有的做不了。
42 请问(决策树、Random Forest、Booting、Adaboot)GBDT和XGBoost的区别是什么?
决策树属于最常用的学习器, 其学习过程是从根建立树, 也就是如何决策叶子节点分裂. ID3/C4.5决策树用信息熵计算最优分裂, CART决策树用基尼指数计算最优分裂, xgboost决策树使用二阶泰勒展开系数计算最优分裂.
下面所提到的学习器都是决策树:
Bagging方法:
学习器间不存在强依赖关系, 学习器可并行训练生成, 集成方式一般为投票;
Random Forest属于Bagging的代表, 放回抽样, 每个学习器随机选择部分特征去优化;
Boosting方法:
学习器之间存在强依赖关系、必须串行生成, 集成方式为加权和;
Adaboost属于Boosting, 采用指数损失函数替代原本分类任务的0/1损失函数;
GBDT属于Boosting的优秀代表, 对函数残差近似值进行梯度下降, 用CART回归树做学习器, 集成为回归模型;
xgboost属于Boosting的集大成者, 对函数残差近似值进行梯度下降, 迭代时利用了二阶梯度信息, 集成模型可分类也可回归. 由于它可在特征粒度上并行计算, 结构风险和工程实现都做了很多优化, 泛化, 性能和扩展性都比GBDT要好。xgboost与gbdt相比:
1.损失函数是用泰勒展式二项逼近,而不是像gbdt里的就是一阶导数
2.对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性
3.节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的
43 为什么xgboost要用泰勒展开,优势在哪里?
xgboost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得二阶倒数形式, 可以在不选定损失函数具体形式的情况下用于算法优化分析.本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性。
44 xgboost如何寻找最优特征?是又放回还是无放回的呢?
xgboost在训练的过程中给出各个特征的增益评分,最大增益的特征会被选出来作为分裂依据, 从而记忆了每个特征对在模型训练时的重要性 – 从根到叶子中间节点涉及某特征的次数作为该特征重要性排序。
xgboost属于boosting集成学习方法, 样本是不放回的, 因而每轮计算样本不重复。另一方面, xgboost支持子采样, 也就是每轮计算可以不使用全部样本, 以减少过拟合。进一步地, xgboost 还有列采样, 每轮计算按百分比随机采样一部分特征, 既提高计算速度又减少过拟合。
45 CNN应用于CV、NLP和Speech的共性?
以上几个不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。
CNN抓住此共性的手段主要有四个:局部连接/权值共享/池化操作/多层次结构。
①局部连接使网络可以提取数据的局部特征;
②权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积;
③池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。
46 请简要说说EM算法
有时候因为样本的产生和隐含变量有关(隐含变量是不能观察的),而求模型的参数时一般采用最大似然估计,由于含有了隐含变量,所以对似然函数参数求导是求不出来的,这时可以采用EM算法来求模型的参数的(对应模型参数个数可能有多个),EM算法一般分为2步:
E步:选取一组参数,求出在该参数下隐含变量的条件概率值;
M步:结合E步求出的隐含变量条件概率,求出似然函数下界函数(本质上是某个期望函数)的最大值。
重复上面2步直至收敛。
47 防止过拟合的方法
过拟合的原因是算法的学习能力过强;一些假设条件(如样本独立同分布)可能是不成立的;训练样本过少不能对整个空间进行分布估计。
处理方法:
①早停止:如在训练中多次迭代后发现模型性能没有显著提高就停止训练
②数据集扩增:原有数据增加、原有数据加随机噪声、重采样
③正则化
④交叉验证
⑤特征选择/特征降维
⑥创建一个验证集是最基本的防止过拟合的方法。我们最终训练得到的模型目标是要在验证集上面有好的表现,而不训练集。
48 机器学习中,为何要经常对数据做归一化
- 归一化能提高梯度下降法求解最优解的速度
如果不归一化,它的图像可能是个椭圆,当使用梯度下降法寻求最优解时,很有可能走“Z”字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛; - 归一化有可能提高精度
一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖
49 对于树形结构为什么不需要归一化?
数值缩放,不影响分裂点位置。因为第一步都是按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。
另外,注意树模型是不能进行梯度下降的,因为树模型是阶跃的,阶跃点是不可导的,并且求导没意义,所以树模型(回归树)寻找最优点事通过寻找最优分裂点完成的。
50 请简要说说一个完整机器学习项目的流程
- 抽象成数学问题
明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如何划归为其中的某类问题。 - 获取数据
①数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。
②数据要有代表性,否则必然会过拟合。
③而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。
④而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。 - 特征预处理与特征选择
特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。
筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法 - 训练模型与调优
调整这些算法的(超)参数,使得结果变得更加优良。 - 模型诊断
①过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。
②误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题……
③诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。 - 模型融合
工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。 - 上线运行
模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。
最后
以上就是单纯抽屉为你收集整理的机器学习面试题汇总(1~50题)的全部内容,希望文章能够帮你解决机器学习面试题汇总(1~50题)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复