深度学习面试题解答(持续更新)

2019-10-16  本文已影响0人  Cat丹

前几天看到一份深度学习面试题,抽空做个解答,温故而知新。
解答多来自网络,后文附上了链接。

深度学习

模型评估方法

Accuracy的局限

Accuracy=\frac{N_{correct}}{N_{total}}

当正负样本极度不均衡时存在问题!比如,正样本有99%时,分类器只要将所有样本划分为正样本就可以达到99%的准确率。但显然这个分类器是存在问题的。

当正负样本不均衡时,常用的评价指标为ROC曲线和PR曲线。

ROC(receiver operating characteristic)曲线

ROC接受者操作特征曲线,其显示的是分类器的TPR和FPR之间的关系,如下图所示:


img

TPR=\frac{TP}{P}=\frac{TP}{TP+FN}

FPR=\frac{FP}{N}=\frac{FP}{FP+TN}

常用于二分类问题中的模型比较。具体方法是在不同的分类阈值 (threshold) 设定下分别以TPR和FPR为纵、横轴作图。曲线越靠近左上角,意味着越多的正例优先于负例,模型的整体表现也就越好。

优点

缺点

PR(Precision - Recall)曲线

PR曲线与ROC曲线的相同点是都采用了TPR (Recall),都可以用AUC来衡量分类器的效果。不同点是ROC曲线使用了FPR,而PR曲线使用了Precision,因此PR曲线的两个指标都聚焦于正例。类别不平衡问题中由于主要关心正例,所以在此情况下PR曲线被广泛认为优于ROC曲线。

recall=\frac{TP}{TP+FN}

precision=\frac{TP}{TP+FP}

img

使用场景

F1=\frac{2TP}{2TP+FN+FP}=\frac{2⋅Precision⋅Recall}{Precision+Recall}

AUC(Area Under the Curve)

可解读为:从所有正例中随机选取一个样本A,再从所有负例中随机选取一个样本B,分类器将A判为正例的概率比将B判为正例的概率大的可能性。

所以根据定义:我们最直观的有两种计算AUC的方法

  1. 绘制ROC曲线,ROC曲线下面的面积就是AUC的值

  2. 假设总共有(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是否有影响?(待解答)

余弦距离与欧式距离有什么特点?

余弦距离

余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。如果两个向量的方向一致,即夹角接近零,那么这两个向量就相近。

cos\theta=\frac{<x,y>}{\left \| x \right \|.\left \| y \right \|}

欧式距离

d(x,y)=\sqrt{\sum_{i=0}^{N}(x_{i}-y_{i})^2}

余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异。

当对向量进行归一化后,欧式距离与余弦距离一致。

euc=\sqrt{2-2.cos\theta}

基本方法

如何划分训练集?如何选取验证集?

随机采样

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")

什么是偏差和方差?

什么是过拟合?深度学习解决过拟合的方法有哪些?

过拟合是指模型拟合了训练样本中的噪声,导致泛化能力差。

解决方法如下:

解决欠拟合的方法有哪些?

深度模型参数调整的一般方法论?

本节参考

优化方法

简述了解的优化器,发展综述?

深度学习优化算法经历了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 这样的发展历程。

优化算法框架

首先定义:待优化参数:w,目标函数:f(w),初始学习率\theta

而后,开始进行迭代优化。在每个epoch t :

  1. 计算目标函数关于当前参数的梯度: g_{t}=\bigtriangledown f(w_{t})
  2. 根据历史梯度计算一阶动量和二阶动量:m_{t}=\phi(g_{1},g_{2},...gg_{t}),V_{t}=\varphi(g_{1},g_{2},...gg_{t})
  3. 计算当前时刻的下降梯度: \eta_{t}=\alpha.\frac{m_{t}}{\sqrt{V_{t}}}
  4. 根据下降梯度进行更新: w_{t+1}=w_{t}-\eta_{t}

SGD

Adam

常用的损失函数有哪些?分别适用于什么场景?

img

梯度下降与拟牛顿法的异同?

L1和L2正则分别有什么特点?为何L1稀疏?

在梯度更新时,不管 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

sigmoid(x)=\frac{1}{1+e^{-x}}

{(sigmoid(x))}'=\frac {e^(-x)}{(1+e^{-x})^2}=sigmoid(x)(1-sigmoid(x))

tanh

tanh(x)=\frac{sinh(x)}{cosh(x)}=\frac{\frac{e^z-e^(-z)}{2}}{\frac{e^z+e^{-z}}{2}}=\frac{e^z-e^{-z}}{e^z+e^{-z}}

{(tanh(x))}'=1-tanh^{2}(x)

ReLu

f(x)=\left\{\begin{matrix}x & if&x\geq0 &\\ 0&if&x<0 \end{matrix}\right.

{f(x)}'=\left\{\begin{matrix}1 & if&x\geq0 &\\ 0&if&x<0 \end{matrix}\right.

leaky ReLu

f(x)=\left\{\begin{matrix}x & if&x\geq0 &\\ \lambda x&if&x<0 \end{matrix}\right.
{f(x)}'=\left\{\begin{matrix}1 & if&x\geq0 &\\ \lambda&if&x<0 \end{matrix}\right.
https://zhuanlan.zhihu.com/p/39673127

relu的有优点?又有什么局限性?他们的系列改进方法是啥?

https://zhuanlan.zhihu.com/p/31742800

sigmoid和tanh为什么会导致梯度消失?

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

给定卷积核的尺寸,特征图大小计算方法?

featuresize=\frac{(inputsize-ksize+2*padsize)}{stride}+1

网络容量计算方法(待解答)

共享参数有什么优点

常用的池化操作有哪些?有什么特点?

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。但是人像分割中无用,应该就是我们的应用场景没有特别小的物体。

上一篇 下一篇

猜你喜欢

热点阅读