机器学习面试常见问题整理

目录

[toc]

常见的损失函数

通常机器学习每一个算法中都会有一个目标函数,算法的求解过程是通过对这个目标函数优化的过程。在分类或者回归问题中,通常使用损失函数(代价函数)作为其目标函数。损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的算法使用的损失函数不一样。
损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。通常表示为如下:

$ \theta ^{*}=argmin\frac{1}{N}\sum_{i=1}^{N}L(y_{i},f(x_{i};\theta_{i} ))+\lambda \Phi (\theta ) $

1. 0-1损失函数和绝对值损失函数

0-1损失是指,预测值和目标值不相等为1,否则为0:
$ L(Y,f(X))=\left\{\begin{matrix} 1, Y\neq f(X)\\ 0, Y=f(X) \end{matrix}\right. $

感知机就是用的这种损失函数。但是由于相等这个条件太过严格,因此我们可以放宽条件,即满足 $|Y-f(X)|<T$ 时认为相等。
$ L(Y,f(X))=\left\{\begin{matrix} 1, |Y-f(X)|\geq T\\ 0, |Y=f(X)|<T \end{matrix}\right. $

绝对值损失函数为:
$ L(Y,f(X)=|Y-f(X)| $

2. log对数损失函数

逻辑斯特回归的损失函数就是对数损失函数,在逻辑斯特回归的推导中,它假设样本服从伯努利分布(0-1)分布,然后求得满足该分布的似然函数,接着用对数求极值。逻辑斯特回归并没有求对数似然函数的最大值,而是把极大化当做一个思想,进而推导它的风险函数为最小化的负的似然函数。从损失函数的角度上,它就成为了log损失函数。

log损失函数的标准形式:
$ L(Y, P(Y|X)) = -logP(Y|X) $

在极大似然估计中,通常都是先取对数再求导,再找极值点,这样做是方便计算极大似然估计。损失函数$L(Y,P(Y|X))L(Y,P(Y|X))L(Y, P(Y|X))$是指样本X在分类Y的情况下,使概率P(Y|X)达到最大值(利用已知的样本分布,找到最大概率导致这种分布的参数值)

3. 平方损失函数

最小二乘法是线性回归的一种方法,它将回归的问题转化为了凸优化的问题。最小二乘法的基本原则是:最优拟合曲线应该使得所有点到回归直线的距离和最小。通常用欧几里得距离进行距离的度量。

平方损失的损失函数为:
$ L(Y|f(X)) = \sum_{N}(Y - f(X))^{2} $

4. 指数损失函数

AdaBoost就是一指数损失函数为损失函数的。
指数损失函数的标准形式:
$ L(Y|f(X)) = exp[-yf(x)] $

5. Hinge损失函数

Hinge损失函数和SVM是息息相关的。在线性支持向量机中,最优化问题可以等价于
$ \min_{w,b}\sum_{i}^{N}(1 - y_{i}(wx_{i}+b))+\lambda ||w^{2}|| $

这个式子和如下的式子非常像:
$ \frac{1}{m}\sum_{i=1}^{m}l(wx_{i}+by_{i})+||w||^{2} $
其中$l(wxi+byi)l(wxi+byi)l(wx_{i}+by_{i})$就是hinge损失函数,后面相当于L2正则项。
Hinge函数的标准形式:

$ L(y)=max(0,1-ty) $

y是预测值,在-1到+1之间,t为目标值(-1或+1)。其含义为,y的值在-1和+1之间就可以了,并不鼓励$|y|>1|y|>1|y|>1$,即并不鼓励分类器过度自信,让某个正确分类的样本的距离分割线超过1并不会有任何奖励,从而使分类器可以更专注于整体的分类误差。


梯度消失和梯度爆炸

神经网络的训练主要包括两个部分:前向传播和反向传播。
上一层的神经元与本层的神经元有连接,那么本层的神经元的激活等于上一层神经元对应的权值进行加权和运算,最后通过一个非线性函数(激活函数)如ReLu,sigmoid等函数,最后得到的结果就是本层神经元的输出。逐层逐神经元通过该操作向前传播,最终得到输出层的结果。
反向传播由最后一层开始,逐层向前传播进行权值的调整。

前向传播得到的结果与实际的结果得到一个偏差,然后通过梯度下降法的思想,通过偏导数与残差的乘积通过从最后一层逐层向前去改变每一层的权重。通过不断的前向传播和反向传播不断调整神经网络的权重,最终到达预设的迭代次数或者对样本的学习已经到了比较好的程度后,就停止迭代,那么一个神经网络就训练好了。

那么为什么会出现梯度消失的现象呢?

因为通常神经网络所用的激活函数是sigmoid函数,这个函数有个特点,就是能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是
f′(x)=f(x)(1−f(x))
因此两个0到1之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新,这就是梯度消失。

那么什么是梯度爆炸呢
梯度爆炸就是由于初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。

如何解决梯度消失和梯度爆炸?
常用的用于解决梯度消失和梯度爆炸的方法如下所示:

  • 使用 ReLU、LReLU、ELU、maxout 等激活函数
    sigmoid函数的梯度随着x的增大或减小和消失,而ReLU不会。
  • 使用批规范化:通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性.从上述分析分可以看到,反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸,Batch Normalization 就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。

如何防止过拟合

通常过拟合由以下三种原因产生:

  1. 假设过于复杂;
  2. 数据存在很多噪音;
  3. 数据规模太小。

过拟合的解决方法通常有:

  1. early stopping;
  2. 数据集扩增;
  3. 正则化;
  4. Dropout。

RF,SVM,神经网络的优缺点

链接

Batch Normalization

BN

K-means总结

k-means

-------------本文结束感谢您的阅读-------------
您的小小鼓励,是我不断更新的强大动力!