前几天看到一份深度学习面试题,抽空做个解答,温故而知新。
解答多来自网络,后文附上了链接。
深度学习
模型评估方法
Accuracy的局限
当正负样本极度不均衡时存在问题!比如,正样本有99%时,分类器只要将所有样本划分为正样本就可以达到99%的准确率。但显然这个分类器是存在问题的。
当正负样本不均衡时,常用的评价指标为ROC曲线和PR曲线。
ROC(receiver operating characteristic)曲线
ROC接受者操作特征曲线,其显示的是分类器的TPR和FPR之间的关系,如下图所示:

常用于二分类问题中的模型比较。具体方法是在不同的分类阈值 (threshold) 设定下分别以TPR和FPR为纵、横轴作图。曲线越靠近左上角,意味着越多的正例优先于负例,模型的整体表现也就越好。
优点
- 兼顾正例和负例的权衡。因为TPR聚焦于正例,FPR聚焦于与负例,使其成为一个比较均衡的评估方法。
- ROC曲线选用的两个指标, TPR和FPR,都不依赖于具体的类别分布。
缺点
- ROC曲线的优点是不会随着类别分布的改变而改变,但这在某种程度上也是其缺点。因为负例N增加了很多,而曲线却没变,这等于产生了大量FP。像信息检索中如果主要关心正例的预测准确性的话,这就不可接受了。
- 在类别不平衡的背景下,负例的数目众多致使FPR的增长不明显,导致ROC曲线呈现一个过分乐观的效果估计。ROC曲线的横轴采用FPR,根据公式 ,当负例N的数量远超正例P时,FP的大幅增长只能换来FPR的微小改变。结果是虽然大量负例被错判成正例,在ROC曲线上却无法直观地看出来。(当然也可以只分析ROC曲线左边一小段)
PR(Precision - Recall)曲线
PR曲线与ROC曲线的相同点是都采用了TPR (Recall),都可以用AUC来衡量分类器的效果。不同点是ROC曲线使用了FPR,而PR曲线使用了Precision,因此PR曲线的两个指标都聚焦于正例。类别不平衡问题中由于主要关心正例,所以在此情况下PR曲线被广泛认为优于ROC曲线。

使用场景
- ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能,相比而言PR曲线完全聚焦于正例。
- 如果有多份数据且存在不同的类别分布,比如信用卡欺诈问题中每个月正例和负例的比例可能都不相同,这时候如果只想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较;反之,如果想测试不同类别分布下对分类器的性能的影响,则PR曲线比较适合。
- 如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线。
- 类别不平衡问题中,ROC曲线通常会给出一个乐观的效果估计,所以大部分时候还是PR曲线更好。
- 最后可以根据具体的应用,在曲线上找到最优的点,得到相对应的precision,recall,f1 score等指标,去调整模型的阈值,从而得到一个符合具体应用的模型。
AUC(Area Under the Curve)
可解读为:从所有正例中随机选取一个样本A,再从所有负例中随机选取一个样本B,分类器将A判为正例的概率比将B判为正例的概率大的可能性。
所以根据定义:我们最直观的有两种计算AUC的方法
-
绘制ROC曲线,ROC曲线下面的面积就是AUC的值
-
假设总共有(m+n)个样本,其中正样本m个,负样本n个,总共有mn个样本对,计数,正样本预测为正样本的概率值大于负样本预测为正样本的概率值记为1,累加计数,然后除以(mn)就是AUC的值
编程实现AUC的计算,并指出复杂度?
def get_roc(pos_prob,y_true):
pos = y_true[y_true==1]
neg = y_true[y_true==0]
threshold = np.sort(pos_prob)[::-1] # 按概率大小逆序排列
y = y_true[pos_prob.argsort()[::-1]]
tpr_all = [0] ; fpr_all = [0]
tpr = 0 ; fpr = 0
x_step = 1/float(len(neg))
y_step = 1/float(len(pos))
y_sum = 0 # 用于计算AUC
for i in range(len(threshold)):
if y[i] == 1:
tpr += y_step
tpr_all.append(tpr)
fpr_all.append(fpr)
else:
fpr += x_step
fpr_all.append(fpr)
tpr_all.append(tpr)
y_sum += tpr
return tpr_all,fpr_all,y_sum*x_step # 获得总体TPR,FPR和相应的AUC
排序复杂度:O(log2(P+N))
计算AUC的复杂度:O(P+N)
AUC指标有什么特点?放缩结果对AUC是否有影响?(待解答)
余弦距离与欧式距离有什么特点?
余弦距离
余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。如果两个向量的方向一致,即夹角接近零,那么这两个向量就相近。
欧式距离
余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异。
当对向量进行归一化后,欧式距离与余弦距离一致。
基本方法
如何划分训练集?如何选取验证集?
- 通常80%为训练集,20%为测试集
- 当数据量较小时(万级别及以下)的时候将训练集、验证集以及测试集划分为6:2:2;若是数据很大,可以将训练集、验证集、测试集比例调整为98:1:1
- 当数据量很小时,可以采用K折交叉验证
- 划分数据集时可采用随机划分法(当样本比较均衡时),分层采样法(当样本分布极度不均衡时)
随机采样
import numpy as np
def split_train_test(data,test_ratio):
#设置随机数种子,保证每次生成的结果都是一样的
np.random.seed(42)
#permutation随机生成0-len(data)随机序列
shuffled_indices = np.random.permutation(len(data))
#test_ratio为测试集所占的半分比
test_set_size = int(len(data)) * test_ratio
test_indices = shuffled_indices[:test_ratio]
train_indices = shuffled_indices[test_set_size:]
#iloc选择参数序列中所对应的行
return data.iloc[train_indices],data.iloc[test_indices]
#测试
train_set,test_set = split_train_test(data,0.2)
print(len(train_set), "train +", len(test_set), "test")
什么是偏差和方差?
- 偏差:描述预测值的期望与真实值之间的差别,偏差越大说明模型的预测结果越差。
- 方差:描述预测值的变化范围。方差越大说明模型的预测越不稳定。
- 高方差过拟合,高偏差欠拟合。
- 常用交叉验证来权衡模型的方差和偏差。
- 也可以比较均方误差
img
什么是过拟合?深度学习解决过拟合的方法有哪些?
过拟合是指模型拟合了训练样本中的噪声,导致泛化能力差。
解决方法如下:
- 增加训练数据
- 缩减模型表达能力
- Dropout
- 训练时提前终止
- 集成多种模型
解决欠拟合的方法有哪些?
- 增加模型复杂度
- 调整模型初始化方式
- 调整学习率
- 集成多种模型
深度模型参数调整的一般方法论?
- 学习率:遵循小->大->小原则
- 初始化:选择合适的初始化方式,有预训练模型更好
- 优化器选择:adam比较快,sgd较慢
- loss:回归问题选L2 loss,分类问题选交叉熵
- 可视化
- 从小数据大模型入手,先过拟合,再增加数据并根据需要调整模型复杂度
本节参考
- https://zhuanlan.zhihu.com/p/34655990
- https://www.zhihu.com/question/19640394
- https://zhuanlan.zhihu.com/p/48976706
- https://www.zhihu.com/question/20448464
- https://www.zhihu.com/question/59201590
- https://zhuanlan.zhihu.com/p/29707029
- https://www.zhihu.com/question/25097993
优化方法
简述了解的优化器,发展综述?
深度学习优化算法经历了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 这样的发展历程。
优化算法框架
首先定义:待优化参数:w,目标函数:f(w),初始学习率。
而后,开始进行迭代优化。在每个epoch t :
- 计算目标函数关于当前参数的梯度:
- 根据历史梯度计算一阶动量和二阶动量:
- 计算当前时刻的下降梯度:
- 根据下降梯度进行更新:
- SGD:没有动量的概念
- SGDM:加入一阶动量
- NAG:加入牛顿加速
- AdaGrad:加入二阶动量
- AdaDelta:
- Adam: 加入SGDM的一阶动量和AdaDelta二阶动量
- NAdam:Adam加上牛顿加速
SGD
- 下降速度慢,而且可能会在沟壑的两边持续震荡,停留在一个局部最优点
- 精调参数,往往能取得更好的效果
Adam
- 收敛速度快
- 可能在训练后期引起学习率的震荡,导致模型无法收敛
- 自适应学习率算法可能会对前期出现的特征过拟合,后期才出现的特征很难纠正前期的拟合效果,可能错过全局最优解
常用的损失函数有哪些?分别适用于什么场景?

-
均方误差(MSE)是最常用的回归损失函数,计算方法是求预测值与真实值之间的距离的平方和。
-
平均绝对值误差(MAE)是目标值和预测值之差的绝对值之和。
-
MSE计算简便,但MAE对异常点具有更好的鲁棒性。
-
Huber损失,平滑的绝对平均误差,对异常点没有平方误差那么敏感。本质上是绝对误差。
-
Log-Cosh损失,预测误差的双曲余弦对数。基本类似与均方误差,同时不易受异常点影响。
。
在x较小时约等于
,在x较大时约等于
。
-
分位损失,更关注预测区间而不仅仅是预测点。当
值小于0.5时,对高估的惩罚更大,使得预测值略低于中值。
梯度下降与拟牛顿法的异同?
- 参数更新模式相同
- 梯度下降法利用误差的梯度来更新参数,拟牛顿法利用海塞矩阵的近似来更新参数
- 梯度下降是泰勒级数的一阶展开,而拟牛顿法是泰勒级数的二阶展开
- SGD能保证收敛,但是L-BFGS在非凸时不收敛
L1和L2正则分别有什么特点?为何L1稀疏?
-
P-norm:
将向量投影到[0,)范围内,其中只有0向量的norm取到0
-
p=1为L1-norm,p=2为L2-norm,用作正则项则对应为L1正则,L2正则
-
L1对异常值更鲁棒
-
L1在0点不可导,计算不方便
-
L1没有唯一解
-
L1输出稀疏,会把不重要的特征直接置零
-
L2计算方便
-
L2对异常值敏感
-
L2有唯一解
img
在梯度更新时,不管 L1 的大小是多少(只要不是0)梯度都是1或者-1,所以每次更新时,它都是稳步向0前进。从而导致L1输出稀疏。
本节参考:
深度学习基础
以一层隐层的神经网络,relu激活,MSE作为损失函数推导反向传播
http://galaxy.agh.edu.pl/%7Evlsi/AI/backp_t_en/backprop.html
https://blog.csdn.net/login_sonata/article/details/76737482
NN的权重参数能否初始化为0?
不能,可能导致模型无法收敛
什么是梯度消失和梯度爆炸?
https://cloud.tencent.com/developer/article/1374163
常用的激活函数,导数?
sigmoid
tanh
ReLu
leaky ReLu
https://zhuanlan.zhihu.com/p/39673127
relu的有优点?又有什么局限性?他们的系列改进方法是啥?
- 部分解决了梯度消失问题
- 收敛速度更快
- 在小于0部分相当于神经元死亡而且不会复活
- Leaky ReLU解决了神经元死亡问题
https://zhuanlan.zhihu.com/p/31742800
sigmoid和tanh为什么会导致梯度消失?


一个隐层需要多少节点能实现包含n元输入的任意布尔函数?
https://zhuanlan.zhihu.com/p/32579088
多个隐层实现包含n元输入的任意布尔函数,需要多少节点和网络层?
dropout为何能防止过拟合?
- 相当于同时训练了多个网络,类似集成学习的效果
- 削弱了神经元之间的依赖性
dropout和BN 在前向传播和反向传播阶段的区别?
drouput:
https://blog.csdn.net/oBrightLamp/article/details/84105097
BN:
https://blog.csdn.net/silent_crown/article/details/78121270
CNN
给定卷积核的尺寸,特征图大小计算方法?
网络容量计算方法(待解答)
共享参数有什么优点
- 削减参数量,压缩模型复杂度
- 实现平移不变性
常用的池化操作有哪些?有什么特点?
-
下采样
-
实现非线性
-
扩大感受野
-
实现不变性(平移、旋转和尺度)
-
maxpooling:取最大值,加上index,在上采样时可以尽量还原信息,比如deep matting的上采样,必须用带有index的,才能保证抠出头发丝
-
averagepooling:取平均值,计算简单
CNN如何用于文本分类?
https://zhuanlan.zhihu.com/p/28087321
resnet提出的背景和核心理论是?
https://www.zhihu.com/question/64494691
背景:当模型深度增加到某个程度后,在增加深度,模型效果可能不升反降,出现退化现象。(不是过拟合也不是梯度爆炸或消失)
核心理论:恒等映射
空洞卷积是什么?有什么应用场景?
https://www.zhihu.com/question/54149221
在卷积图上注入空洞,增加感受野。注入空洞的数量由dilation rate确定。常规卷积的dilation rate为1。
多尺度检测,利于检测出小物体
语义分割中常用dilation rate。但是人像分割中无用,应该就是我们的应用场景没有特别小的物体。
网友评论