机器学习 面试常见问题&答案 ②

26次阅读

共计 3001 个字符,预计需要花费 8 分钟才能阅读完成。

欠拟合(通常代表高偏差)

精度

如前所述如果模型具有足够的数据,但因不够复杂而无法捕捉基本关系,则会出现偏差。这样一来,模型一直会系统地错误表示数据,从而导致预测精度低。这种现象叫做欠拟合(underfitting)。
简单来说,如果模型不适当,就会出现偏差。举个例子:如果对象是按颜色和形状分类的,但模型只能按颜色来区分对象和将对象分类(模型过度简化),因而一直会错误地分类对象。
或者,我们可能有本质上是多项式的连续数据,但模型只能表示线性关系。在此情况下,我们向模型提供多少数据并不重要,因为模型根本无法表示其中的基本关系,我们需要更复杂的模型。

过拟合(通常代表高方差)

过拟合又可以称之为维度灾难。
机器学习中的维度灾难 – 红色石头的专栏 – CSDN 博客 https://blog.csdn.net/red_stone1/article/details/71692444

过少的数据样本与有效特征,过高的维度,会导致模型学到噪声和不必要的无效特征,这个概念叫做过拟合,是维度灾难的一个直接后果。

在训练模型时,通常使用来自较大母体(训练集)的有限数量样本。如果利用选择的数据子集反复训练模型,可以预料它的预测结果会因提供给它的具体样本而异。在这里,方差(variance)用来测量预测结果对于任何给定的测试样本会出现多大的变化。
出现方差是正常的,但方差过高表明模型无法将其预测结果泛化到从中抽取训练样本的较大母体。对训练集高度敏感也称为过拟合(overfitting),而且通常出现在模型过于复杂或我们没有足够的数据支持它时。
通常,可以利用更多数据进行训练,以降低模型预测结果的方差并提高精度。

如何改进模型的有效性

我们可以看到,在给定一组固定数据时,模型不能过于简单或复杂。如果过于简单,模型无法了解数据并会错误地表示数据。但是,如果建立非常复杂的模型,则需要更多数据才能了解基本关系,否则十分常见的是,模型会推断出在数据中实际上并不存在的关系。
关键在于,通过找出正确的模型复杂度来找到最大限度降低偏差和方差的最有效点。当然,数据越多,模型随着时间推移会变得越好。
要详细了解偏差和方差,建议阅读 Scott Fortmann-Roe 撰写的这篇文章。http://scott.fortmann-roe.com…

除了选定用来训练模型的数据子集外,您使用的哪些来自给定数据集的特征也会显著影响模型的偏差和方差。

聊一下模型训练过程中的学习曲线

我们根据模型通过可视化图形从数据中学习的能力来探讨偏差与方差之间的关系。机器学习中的学习曲线是一种可视化图形,能根据一系列训练实例中的训练和测试数据比较模型的指标性能。在查看数据与误差之间的关系时,我们通常会看到,随着训练点数量的增加,误差会趋于下降。由于我们尝试构建从经验中学习的模型,因此这很有意义。我们将训练集和测试集分隔开,以便更好地了解能否将模型泛化到未见过的数据而不是拟合到刚见过的数据。在学习曲线中,当训练曲线和测试曲线均达到稳定阶段,并且两者之间的差距不再变化时,则可以确认模型已尽其所能地了解数据。

偏差
在训练误差和测试误差收敛并且相当高时,这实质上表示模型具有偏差。无论我们向其提供多少数据,模型都无法表示基本关系,因而出现系统性的高误差。

方差
如果训练误差与测试误差之间的差距很大,这实质上表示模型具有高方差。与偏差模型不同的是,如果有更多可供学习的数据,或者能简化表示数据的最重要特征的模型,则通常可以改进具有方差的模型。

理想的学习曲线
模型的最终目标是,误差小并能很好地泛化到未见过的数据(测试数据)。如果测试曲线和训练曲线均收敛,并且误差极低,就能看到这种模型。这种模型能根据未见过的数据非常准确地进行预测。

说一下你理解的信息增益(Information gain)

熵:表示变量的不确定性。
条件熵:在一个条件下,变量的不确定性。
信息增益:熵 – 条件熵

在一个条件下,信息不确定性减少的程度!

例子:原来明天下雨例如信息熵是 2,条件熵是 0.01(因为如果是阴天就下雨的概率很大,信息就少了),这样相减后为 1.99,在获得阴天这个信息后,下雨信息不确定性减少了 1.99!是很多的!所以信息增益大!也就是说,阴天这个信息对下雨来说是很重要的!
所以在特征选择的时候常常用信息增益,如果 IG(信息增益大)的话那么这个特征对于分类来说很关键~~

决策树就是这样来找特征的。

说一下分类和回归的区别?

两者追到本质是一样。
分类模型和回归模型本质一样,分类模型可将回归模型的输出离散化,回归模型也可将分类模型的输出连续化,举几个例子:

Logistic Regression 和 Linear Regression:

Linear Regression:输出一个标量 wx+b,这个值是连续值,所以可以用来处理回归问题
Logistic Regression:把上面的 wx+b 通过 sigmoid 函数映射到 (0,1) 上,并划分一个阈值,大于阈值的分为一类,小于等于分为另一类,可以用来处理二分类问题
更进一步:对于 N 分类问题,则是先得到 N 组 w 值不同的 wx+b,然后归一化,比如用 softmax 函数,最后变成 N 个类上的概率,可以处理多分类问题

Support Vector Regression 和 Support Vector Machine:

SVR:输出 wx+b,即某个样本点到分类面的距离,是连续值,所以是回归模型
SVM:把这个距离用 sign(·)函数作用,距离为正 (在超平面一侧) 的样本点是一类,为负的是另一类,所以是分类模型

Naive Bayes 用于分类 和 回归:

用于分类:y 是离散的类别,所以得到离散的 p(y|x),给定 x,输出每个类上的概率
用于回归:对上面离散的 p(y|x)求期望 ΣyP(y|x),就得到连续值。但因为此时 y 本身是连续的值,所以最地道的做法是,得到连续的概率密度函数 p(y|x),然后再对 y 求期望。参考 http://www.cs.waikato.ac.nz/~eibe/pubs/nbr.pdf

前馈神经网络(如 CNN 系列) 用于 分类 和 回归:

用于回归:最后一层有 m 个神经元,每个神经元输出一个标量,m 个神经元的输出可以看做向量 v,现全部连到一个神经元上,则这个神经元输出 wv+b,是一个连续值,可以处理回归问题,跟上面 Linear Regression 思想一样
用于 N 分类:现在这 m 个神经元最后连接到 N 个神经元,就有 N 组 w 值不同的 wv+b,同理可以归一化(比如用 softmax)变成 N 个类上的概率(补充一下,如果不用 softmax,而是每个 wx+ b 用一个 sigmoid,就变成多标签问题,跟多分类的区别在于,样本可以被打上多个标签)

循环神经网络(如 RNN 系列) 用于分类 和 回归:
用于回归 和 分类:跟 CNN 类似,输出层的值 y =wv+b,可做分类可做回归,只不过区别在于,RNN 的输出跟时间有关,即输出的是 {y(t),y(t+1),…}序列(关于时间序列,见下面的更新)

上面的例子其实都是从 prediction 的角度举例的,如果从 training 角度来看,分类模型和回归模型的目标函数不同,分类常见的是 log loss,hinge loss, 而回归是 square loss

       
如文章你已看懂,点个「喜欢」即可。如若错误以及不清晰的地方,随时提出。欢迎扫一扫上面二维码加入我的个人微信号进行技术交流。

正文完
 0

机器学习 面试常见问题&答案 ①

26次阅读

共计 3442 个字符,预计需要花费 9 分钟才能阅读完成。

给定卷积神经网络输入,卷积核大小,padding,步长,求输出的 shape?

各个激活函数的优缺点

Sigmod

优点

输出值 0 -1(很重大的优点)
其余的和其他众多激活函数比起来,感觉没有什么优点,方便入门理解

缺点

容易梯度消失
x 的可变值区域太小,极其容易陷入级值的状况(-0.9~0.9)
指数 exp 计算复杂

Tanh

优点
和 sigmod 比起来,是零均值化处理。(零均值化可以加快模型的收敛)

缺点
和 sigmod 一样的缺点

Relu

优点
计算复杂度低(只有一个 if>0 判断,大于 0 则激活值为 1),部分区域线性递增,没有幂运算与指数运算

缺点

x 小于 0 时无法产生激活值
训练到后期可能权重参数更新太大

Leakly ReLu

优点
相对于 relu 来说,激活值必然可以产生

缺点
Relu 的其他缺点一概继承下来了

ELU

优点
相对于 Leaky relu 来说,激活值更平滑

缺点
其他的 Leaky relu 的缺点一并继承下来了。

如何选择激活函数?

Relu- 小心设置 learning
rate(因为 x >0 的情况下,导数均为 1),最好是设置一个比较小的值。

不要使用 sigmod(缺点太多,计算复杂)

如何初始化 CNN?(理论)

不要全部把超参数设置为 0(单层网络可以)
容易梯度消失

如何初始化 CNN?(实践)

Xavier-tanh(不太适合 relu)

fan_in 输出通道数

Fan_out 输出通道数
代码 Np.randon.rand(fan_in,fan_out)/np.sqrt(fan_in/2)

如何分析初始化参数结果好坏?

查看初始化后各层的激活值分布
是否在固定的,稳定的,同一个区间的均匀分布

比较好的初始化结果

均值为 0,方差为 0.02
如 tanh,relu 函数

什么叫梯度消失,梯度爆炸

当网络层数过多时,前面层由于求导过程乘积运算,出现 weight 与 bias 变得异常大与异常小的情况

左下角的内容清楚的说明了梯度爆炸和梯度消失的场景

BN 是什么,为什么能提高收敛速度

批归一化是什么?

标准化处理,特征缩放的一个方式,将数据规整到一定范围内。

如上图所示,BN 步骤主要分为 4 步:

求每一个训练批次数据的均值
求每一个训练批次数据的方差
使用求得的均值和方差对该批次的训练数据做归一化,获得 0 - 1 分布。其中 εε 是为了避免除数为 0 时所使用的微小正数。
尺度变换和偏移:将 xixi 乘以 γγ 调整数值大小,再加上 ββ 增加偏移后得到 yiyi,这里的 γγ 是尺度因子,ββ 是平移因子。这一步是 BN 的精髓,由于归一化后的 xixi 基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:γγ,ββ。γγ 和 ββ 是在训练时网络自己学习得到的。

为什么能提高收敛速度?

解决 internal covariate shift 问题。
特征没有消失,而是归一到一定范围内,加快学习速度
因为最终都是映射到归一化范围内,所以前一层的权重调整对后一层的影响程度都会降低,不用重新适应新的分布,从而让模型学的更快,避免完全从头学习

Tips
BN 不用于输入层和输出层(经验论)

BN(实践)
每次 batch 传入时都做 BN

各个优化器的优缺点

优化器分两种

固定学习率的优化算法

SGD 随机梯度下降

优点
只随机采样一个样本来计算梯度,加快学习效率,并且避免了普通 GD 一次性参数更新的坏处(导致模型无法收敛)

缺点
选择合适的学习率较为困难

Momentum 动量

优点

动量梯度下降,动力火车,惯性火车,这一次梯度下降的值,会影响下一次梯度下降的值,相对于简单的梯度下降来说,Momentum 动量带有延续性相对于简单的梯度下降来说,
减少梯度震荡

缺点
和 SGD 一样,选择合适的学习率较为困难

自适应学习率的优化算法

Adagrad

优点

更新参数时,会针对原梯度值乘上一个变量,即其所有梯度历史平均值总和的平方根(如上图)
这样在训练初期,分母较小,学习率较大,学习比较快,后期时,学习会逐渐减慢

缺点

从训练开始就积累梯度方差会导致有效学习率过早和过量的减小
只能解决凸问题,当应用于非凸函数训练神经网络时,学习可能会到达一个局部是凸碗的区域

RMSProp

优点

能够解决凸问题
由累计平方梯度变成和平均梯度

缺点
缺少 Momentum 动量元素

Adam(结合了动量和 RMSProp,通用方案)
结合了 Momentum 和 RMSProp 的优点

手画一下 LSTM

梯度裁剪

介绍一下残差网络
ResNet 基于 VGG 没解决深层网络下出现性能 [梯度消失,导致学不到东西] 与效率下降 [反向传播运算成本大] 的问题,优化出来的一个新的神经网络结构,如图所示,两条路一起走,最终线性激活输入值 f(x)+x,然后将 f(x)+ x 传递给激活函数[假设为 relu]。那么在反向传播的时候,后面层的梯度更加“无损”的直接传递到前面层,前面层的参数因此也能继续更新。

为什么残差网络会有效果?
□ 先验证明《深层网络效果会比浅层网络好》

只要有理想的训练方式,更深的网络肯定会比较浅的网络效果要好。证明过程也很简单:假设在一种网络 A 的后面添加几层形成新的网络 B,如果增加的层级只是对 A 的输出做了个恒等映射(identity mapping),即 A 的输出经过新增的层级变成 B 的输出后没有发生变化,这样网络 A 和网络 B 的错误率就是相等的,也就证明了加深后的网络不会比加深前的网络效果差。
当层数比较多时,容易导致模型学不到东西,甚至出现反效果,然而 deep layers 又确实是能使模型效果变好的,所以出现残差网络。

效率不影响,层数增加,可以低成本高效率的学到更多非线性的特征。
解决梯度弥漫问题
如上所说,关键点在于反向传播的时候,梯度可以沿着 shortcut 无损进行回传,避免梯度弥漫问题。

解决模型退化问题

避免了过渡训练后,导致模型准确率反而降低的情况。paper 中称为 degration。经过实验后发现确实能解决这个问题。
本人对于这个问题的确切原因并不清楚,但是猜测这个原因很可能是由于梯度消失以及众多其他原因所造成的。

Q: 既然说中间层是不必要的,那么为什么不直接把这些层去掉呢?可事实上,ResNet 的结果比浅层网络的结果好的多,这应该怎么解释呢?
加入中间层主要是为了说明会产生退化的效果。ResNet 效果好是因为解决了退化问题,, 梯度爆炸 / 梯度弥散,调节了网络结构,简化了反向传播求导运算的流程。这和砍掉深一点的层是不一样的思想

风格转换的原理

图像风格转换

由风格特征与内容特征共同计算得出

风格特征
风格的抽象度(越往后层,加入了越多内容的元素,更加具像)

内容特征
内容的相似度(越往后层,加入了越多风格的元素,和原图越不像)

## 怎么解决过拟合

简化模型
正则化(包含 dropout)
数据增强
集成学习
早停
减少特征数或使用较少的特征组合

## 怎么解决欠拟合

增加特征数或者使用较多的特征组合
减小正则权重
增加模型复杂度
使用 boosting 集成学习

如何提高学习算法性能的指导方针

-> 低可拟合偏差

更大的模型,更深的层
更好的优化器方案
探索更合适的超参数

-> 低方差

找寻更多的数据
正则化,dropout
对抗神经网络
探索更合适的超参数

-> 清晰的正交化方案

……
思路逻辑清晰的调试

数据预处理一般步骤有哪些?
指定原始数据的文件列表 -> 创建文件列表队列 -> 从文件中读取数据 -> 数据预处理 -> 整理成 batch 作为神经网络输入

如何用指标和方案去评判一个优秀的模型?

train/Validation/Test 准确率 / 召回率
方差
偏差

CNN 模型加速与压缩汇总
1. 合理设计模型 2. 权值剪枝(编程稀疏矩阵)
3. 权值量化(聚类)
4. 二值化(BWN,XNorNet)
5. 霍夫曼编码
6. 奇异值分解(projection 层)
7. 1×1 卷积的恰当使用减少通道量
8. 卷积分解为 deepwise Conv 和 pointwiseConv 可大幅度减小计算量和参数量 1 /(Dk^2)
9. Group Conv(可节省 1 / g 计算量)
10. Channel Shuffle
11. 蒸馏法
12. 低秩分解
13. 模型裁剪

# 怎么选择超参数
神经网路中的超参数主要包括 1. 学习率 η,
2. 正则化参数 λ,
3. 神经网络的层数 L
4. 每一个隐层中神经元的个数 j
5. 学习的回合数 Epoch
6. 小批量数据 minibatch 的大小
由神经网络的机理进行选择
7. 输出神经元的编码方式
8. 代价函数的选择
9. 权重初始化的方法
10. 神经元激活函数的种类
11 . 宽泛策略的核心在于简化和监控
12. 参加训练模型数据的规模

如文章你已看懂,点个「喜欢」即可。如若错误以及不清晰的地方,随时提出。欢迎扫一扫上面二维码加入我的个人微信号进行技术交流。

正文完
 0