[复试准备]机器学习 知识点整理
九涅·烧包包儿 / / 程序员 / 阅读量

二分类问题

  • 损失函数:计算的是一个样本的误差
  • 代价函数:是整个训练集上所有样本误差的平均
  • 目标函数:代价函数 + 正则化项

$$L(\bar{y},y) = -(ylog(\bar{y})+(1-y) log(1-\bar{y}) $$

01损失分类误差: f(x)>K : 1 | f(x)<K : 0

Logistic误差:$J(\omega ,b) = \cfrac{1}{m}\sum_1^m L(\bar{y},y) $
均方误差:$J=\frac{1}{k} \sum_{k}\left(y_{k}-t_{k}\right)^{2}$

优化方法

定义损失函数为$L$,则梯度为$\nabla L$

GDA

数据集上算所有的误差,求平均

$$w = w ± 1/n \times \sum{J}$$

SGDA

随便取个样本,求误差

SGD

随机梯度下降法。

公式为

$$W_{t+1}=W_{t}-\eta_{t} g_{t}$$

其中$g_t$为$$g_{t}=\Delta J_{i_{s}}\left(W_{t} ; X^{\left(i_{s}\right)} ; X^{\left(i_{s}\right)}\right), i_{s} \in 1,2, \ldots, n$$
也就是说,随机从这些n个梯度方向中选择了一个,进行梯度下降。$\eta_t$是一个系数。

优点:
    虽然SGD需要走很多步的样子,但是对梯度的要求很低(计算梯度快)。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。
缺点:
    SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。SGD没能单独克服局部最优解的问题。

动量法

直观理解,对于形同山谷状的梯度而言(你懂我意思),我们希望梯度的更新在纵向上更缓,在横向上更快。

$$\begin{aligned}
&S d w=\beta S d w + (1-\beta) d w\
&W=W-\alpha {d w}\
&S d b=\beta S d b + (1-\beta) d b\
&b=b-\alpha {d b}
\end{aligned}$$

动量主要解决SGD的两个问题:一是随机梯度的方法(引入的噪声);二是SGD在收敛过程中和正确梯度相比来回摆动比较大的问题。

由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。

RMSprop 均方传递法

直观理解,对于形同山谷状的梯度而言(你懂我意思),我们希望梯度的更新在纵向上更缓,在横向上更快。

$$\begin{aligned}
&S d w=\beta S d w+(1-\beta) d w^{2}\
&W=W-\alpha \frac{d w}{\sqrt{S d w}}\
&S d b=\beta S d b+(1-\beta) d b^{2}\
&b=b-\alpha \frac{d b}{\sqrt{S d b}}
\end{aligned}$$

更新权重的时候,使用除根号的方法,可以使较大的梯度大幅度变小,而较小的梯度小幅度变小,这样就可以使较大梯度方向上的波动小下来,那么整个梯度下降的过程中摆动就会比较小,就能设置较大的LR,使得学习步子变大,达到加快学习的目的。

Adam 自适应据估计法

直观理解:Adam结合了RMSprop以及动量法的优点。

$$\begin{aligned}
&V d w=\beta_1 V d w + (1-\beta_1) d w\
&V d b=\beta_1 V d b + (1-\beta_1) d b\
&S d w=\beta_2 S d w+(1-\beta_2) d w^{2}\
&S d b=\beta_2 S d b+(1-\beta_2) d b^{2}\
& V^{correct}{dw} = \frac{V{dw}}{1-\beta_1}; V^{correct}{db} = \frac{V{db}}{1-\beta_1} \
& S^{correct}{dw} = \frac{S{dw}}{1-\beta_2};  S^{correct}{db} = \frac{S{db}}{1-\beta_2}\
& W := W - \alpha \frac{V^{correct}{dw}}{\sqrt{ S^{correct}{dw}  + \epsilon}} \
& b := b - \alpha \frac{V^{correct}{db}}{\sqrt{ S^{correct}{db}  + \epsilon}}
\end{aligned}$$

为什么用一阶不用二阶?

二阶要用到雅酷比矩阵。二阶尽管比一阶优,但是二阶计算太复杂了。

BatchNomalization(BN) 批规格化

对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。

同时为了确保非线性,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift)

批规格化牛逼在:

  • ①不仅仅极大提升了训练速度,收敛过程大大加快;
  • ②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;
  • ③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。

防止过拟合的技术方法

DropOut 技术

训练过程中为了避免过拟合风险,常引入Dropout技术,请简述DropOut
[ref] https://blog.csdn.net/program_developer/article/details/80737724

输入的张量越来越大,随着模型越来越复杂,模型的超参数会越来越多。那么就会遇上一下俩问题

  • 模型训练慢
  • 模型容易过拟合

因此引入了DropOut技术,也就是在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。

为啥它能?
  • 整个dropout的过程可以理解为让每个神经元“取平均”,相当于在同一时空中训练了好多个神经网络,并对其输出取了平均。因此可以让某些过拟合的神经元“反向拟合”。
  • 减少了神经元之间过于复杂的依赖关系。
注意点【我也是在博文里看到的】

在预测模型的时候,每一个神经单元的权重参数要乘以概率p。

在Loss中增加正则项

在说正则项之前,先说一下L0,L1,L2,Linf范数是咋算的,参考以前的文章

我理解上损失函数中的L1,L2正则项可以理解为一种惩罚项。
下面将摘录一些以前写的理解

L1正则项

$|W|_1$实际上是矩阵中每个元素的绝对值之和。

可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择。

二维平面下L1正则项的图形是正方形。在优化损失函数的时候,与该图形相交的地方很少,往往是在边角上。因此

L2正则项

$|W|_2^2$实际上是矩阵中每个元素的平方和再开根号。

可以防止模型过拟合。烧包的理解是这样的:

对于模型$Y = w_0 + w_1 x_1 + w_2 x_2 ... + w_n x_n $而言。

如果单个$w_i$的绝对值越大。那么曲线就会变得愈发歪曲。这时候就需要有东西来约束这个曲线扭曲的程度。而恰好L2范数就能够做到这点。

一般在防止过拟合的时候会选择L2

因此L2相比于L1范数

  • 更容易微分(因为这个是可微的,而绝对值函数不一定可微)

数据集分隔

对于来之不易的数据集,我们会分为:训练集,验证集,测试集。

验证集要来干嘛呢?

验证集可以用在训练的过程中,一般在训练时,几个epoch结束后跑一次验证集看看效果

  • 及时发现模型或者参数的问题,比如模型在验证集上发散啦、出现很奇怪的结果啦(如无穷大)、mAP不增长或者增长很慢啦等等情况,这时可以及时终止训练,重新调参或者调整模型,而不需要等到训练结束。
  • 验证模型的泛化能力,如果在验证集上的效果比训练集上差很多,就该考虑模型是否过拟合了。根据验证集所提供的信息,可以及时停止训练或者保存模型

如何理解K-Fold交叉验证?

模型在验证数据中的评估常用的是交叉验证,又称循环验证。

实际上就是原始数据分成K组(K-Fold),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型。

这K个模型分别在验证集中评估结果,将最后的方差加和平均就得到交叉验证误差。

交叉验证有效利用了有限的数据,并且评估结果能够尽可能接近模型在测试集上的表现,可以做为模型优化的指标使用。

如何理解留一法

没听说过,上网查了查

留一法交叉验证是一种用来训练和测试分类器的方法,会用到图像数据集里所有的数据,假定数据集有N个样本(N1、N2、...Nn),将这个样本分为两份,第一份N-1个样本用来训练分类器,另一份1个样本用来测试,如此从N1到Nn迭代N次,所有的样本里所有对象都经历了测试和训练。

模型评估

我们常用偏差和方差来描述一个模型的拟合情况。

(这不就是信度和效度么,个人感觉)

title

对于上述问题,提供自己的解决方案

对于情况1:建议增加模型复杂度,增加层数;或者继续训练

对于情况2:建议采用Dropout,L1,L2正则化项;对数据集进行扩充

常见评估参数的计算公式

图片标题
  • 准确率:$ACC = \cfrac{TP+TN} {TP+TN+FP+FN}$
  • 灵敏度:$Sensitive_{POS} = \cfrac{TP}{P}$
  • 正例中分对的比例
  • 特效度:$Sensitive_{NEG} = \cfrac{TN}{N}$
  • 负例中分队的比例
  • 精度: $Precision = \cfrac{TP}{TP+FP}$
  • 正例中的实例为正例的比例
  • 召回率:$Recall = \cfrac{TP}{TP+FN} = TP / P$也就是林敏度
  • 综合评价指标$F_{Measure} = \cfrac{2\times P \times R }{P+R}$
  • 又称为F-Score
  • P是精度,R是召回率,也就是P和R的加权平均数(二分类的情况)
  • 数据失调的时候,所用到的情况。

常见的参数评估曲线

参考https://www.cnblogs.com/Zhi-Z/p/8728168.html

ROC曲线

ROC(Receiver Operating Characteristic)曲线是以假正率(FP_rate)和假负率(TP_rate)为轴的曲线,ROC曲线下面的面积我们叫做AUC

其中
$$T P_{r a t e}=\frac{T P}{P_{c}}, \text {FP}{rate}=\frac{F P}{N{c}}$$

图片标题
  • AUC的面积越大,说明性能越好。
  • A是最完美的点,B是最差的点。
  • 低于C-D,说明该算法比随机猜测还要差,高于C-D,说明比随机猜测好
  • ROC 在高不平衡数据下表现任然太过于理想,不能很好反映实际情况

PR曲线
PR曲线综合考虑了TP和FP的值,在数据高度不平衡(正样本很少)的情况下,PR曲线比ROC曲线更加实用

非监督算法

简述K-means算法

该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

对于点集合$A$,将其分类为K个类别。利用k-means流程如下:

$||X_1 - X_2 ||_2 = X^T · X$

$X^T ·Q^T M Q· X = $

欧式距离不太好,换一个最朴素的方法,中间加个非奇异矩阵。

  • 随机选择K个数据点作为质心。
  • 计算每个点距离这K个点的距离(如欧式距离),并将该点归入距离最近的数据点K中去。
  • 把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。
  • 如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。
  • 如果新质心和原质心距离变化很大,需要迭代前两步

优点:

1、原理比较简单,实现也是很容易,收敛速度快。
2、当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。
3、主要需要调参的参数仅仅是簇数k。

缺点:

1、K值需要预先给定,很多情况下K值的估计是非常困难的。
2、K-Means算法对初始选取的质心点是敏感的,不同的随机种子点得到的聚类结果完全不同 ,对结果影响很大。
3、对噪音和异常点比较的敏感。
4、采用迭代方法,可能只能得到局部的最优解,而无法得到全局的最优解。

简述EM聚类算法

没听说过。。。参考链接
https://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2603020.html
似乎比较复杂,目前还没看。

EM 算法,全称期望最大化算法。

主要分为两个步骤,第一步计算期望E,利用隐藏变量的现有估计值,计算最大似然估计值。第二步,最大化,最大化E步上求得的最大似然值来计算参数的值。

PCA 与降维

对于高维度数据,我们需要用一些方法来降维。请简述一下PCA算法?

https://blog.csdn.net/program_developer/article/details/80632779
PCA这个东西需要一些线性代数(非考研内容)的知识。早年间我也写过一些理解(然而那些理解也太稚嫩了)。如果面试问到,我也只能回答他是咋做的以及它为什么能。详细的数学原理我自己也说不清楚。

PCA集也就是主成分分析方法,是一种使用非常广泛的降维算法。PCA的主要思想是将N维的特征映射到K维的空间上去。而这K维的向量被称之为主成分。

前置线代知识

特征值分解: $X = Q \sum  Q^T$

SCD分解: $X = U \sum V^T$

其中,$U$为$AA^T$的单位化特征向量,$V$为$A^TA$的单位化特征值向量。且$AA^T$,$A^TA$的特征值相同,对齐求平方根可以得到$\sum$

PCA的特征值分解实现

  • 对于数据集X,每个维度先减去各自的平均值
  • 计算协方差矩阵 $\frac{1}{N} X X^T$
  • 求出协方差矩阵$\frac{1}{N} X X^T$的特征值与特征向量
  • 对特征值从小到大排序,将其对应的k个特征向量作为行向量做成特征向量矩阵。
  • 将数据转化到K个特征向量构成的新空间:$Y = P X$

PCA的SVD分解实现

  • 对于数据集X,每个维度先减去各自的平均值
  • 计算协方差矩阵 $\frac{1}{N} X X^T$
  • 求出协方差矩阵$\frac{1}{N} X X^T$的特征值与特征向量
  • 对特征值从小到大排序,将其对应的k个特征向量作为行向量做成特征向量矩阵P。
  • 将数据转化到K个特征向量构成的新空间:$Y = P X$

PCA为什么能?

按照最大方差理论,当我们降维的时候,当然希望数据之间的差异性损失尽可能少就好。而PCA降维的时候选择的是方差最大的那K位,这也是它为什么能的原因。

PCA在AutoEncoder的应用。

图片标题

通俗点来说,对于我们的编码器输出y而言,自然是希望y越简单越好。编码器不用于密码,其编码的过程中是允许对于输入有所损失的。而PCA就很好的做到了这一点,其在降维的基础上保证了数据之间的差异性,并且这个过程是可逆的。

这是一张非常著名的图,作者将28*28的手写数据集经过PCA降维到二维(X轴和Y轴)

title

CNN

简述卷积层的工作原理

这个问题很简单,但是如何答得有一定深度呢?

卷积操作过程其实很简单,也就是将卷积核与数据对应相乘,然后求和。从而提取一些关键的信息(将底层的信息提取到高层)

卷积操作实际上是在扩大神经元的感受野。卷积操作是线性的扩大过程。

为了识别以下这样的feature,应该如何设计卷积核?

title

个人理解如下:

[
-2 -1  0 
-1  0  1 
 0  1  2 
]

MaxPooling和AvgPooling的工作方法。

以2x2池化为例,Max是选取2x2区域内的最大值。而AVG则是选取均值。

对于4x4的图像,在应用2x2池化后,大小会缩小到2x2。

池化层进一步扩大了神经元的感受野,也对数据进行了降维,而且让分类器对于图像的旋转,平移,翻折变得更加鲁棒。

卷积与池化的反向传播算法

现假设l层的误差为$\delta^l$ ,求当l-1层的误差$\delta ^{l-1}$。并且l层的激活函数输出为$a^l = \sigma (z^l)$,
神经元的输出函数为$z^l = f(a^{l-1},\omega,b)$,损失函数为$C$

$\delta ^ l = \cfrac{\partial C}{\partial z^l} $
$\delta ^ {l-1} = \cfrac{\partial C} {\partial z^{l-1} } = \cfrac{\partial C}{\partial z^l} · \cfrac{\partial z^l}{\partial  a^{l-1}} · \cfrac{\partial a^{l-1}}{\partial z^{l-1}}$

$\delta ^ {l-1} =  \delta ^ l·  \cfrac{\partial z^l}{\partial  a^{l-1}} · \sigma^{'} (z^{l-1}) $

Cov

设卷积核为$\omega$则有

$\delta ^ {l-1} =  \delta ^ l \star rot(\omega ^ l ,180) \odot \sigma^{'} (z^{l-1}) $

Maxpooling

$\delta ^ {l-1} =  \delta ^ l·  f(x_{ij}) · \sigma^{'} (z^{l-1}) $

$f(x_{ij}) = 1 ;if ;x_{ij} =\text{ maxArea else 0}$

AvgPooling

$\delta ^ {l-1} =  \delta ^ l·  \cfrac{x_{ij}}{AreaSize} · \sigma^{'} (z^{l-1}) $

口的感受野大小

title

layerheightwidthchannelinput551Conv((2,2),128)44128MaxPooling((2,2))22128

实际MaxPooling中一个框的感受野是  (3*3)

更加一般的公式(百度的)

$$r(i) = (r(i+1) - 1) \times stride(i) + c(i)$$

stride 是步长,c是卷积核大小

如何理解1x1卷积

1x1卷积被称为网中网。其特点主要有

  • 降维/升维
  • 增加非线性
  • 跨通道信息交互
图片标题

W(宽)H(高)K(通道数)N(卷积核个数)282812832282832

吴老师有说道,其实1x1的卷积可以理解为全连接。

如何理解全局池化

对于输出的每一个通道的特征图的所有像素计算一个平均值,经过全局平均池化之后就得到一个 维度=$C_{in}$=类别数 的特征向量,然后直接输入到softmax层

dalao的Net in Net 第3.2章第二段:
全球平均池在完全连接层中的一个优点是,通过强制的特征图和类别之间的对应关系形成更为自然的卷积结构。因此,特征映射可以很容易地理解为类映射。
另一个优点是,没有参数优化。从而避免在该层过拟合
此外,全局平均池总和所展现的是空间信息,因此它更为鲁棒

如何理解残差网络

统计学的残差

残差和误差是非常容易混淆的两个概念。

误差是衡量观测值和真实值之间的差距。

残差是指预测值和观测值之间的差距。

残差 块V1

图片标题

残差网络是由一系列残差块(如上图)组成。一个残差块可以用表示为:

$$x_{l+1}=x_{l}+\mathcal{F}\left(x_{l}, W_{l}\right)$$

可以看到,残差块分为两个部分,直接映射部分以及残差部分。这里就有个问题,因为残差的维度和原$x_l$的维度可能不一样,所以需要用1x1卷积来降维或者升维。

定义函数$h\left(x_{l}\right)=W_{l}^{\prime} x$,则有

$$x_{l+1}=h\left(x_{l}\right)+\mathcal{F}\left(x_{l}, W_{l}\right)$$

残差块V2

在第一版本的基础上,作者对于残差块的激活函数位置,批规格化函数的位置进行了探究,提出了V2的版本。(右图)

残差网络的牛逼之处

正向

  • L层可以表示为任何一个比它浅的层l到该层的残差之和。(也就是说,L层综合了比它浅的任何一个层的残差)

反向

  • 在反向传播过程中,残差块的偏导不可能一直为-1,也就是说残差块不会出现梯度消失的问题。
  • 深层的残差会一直反向传递到任何一个比它浅的层l。

常见CNN模型以及特点

LeNet5 2010 ?

基础模型

AlexNet 2012

  • ReLu
  • DropOut
  • 数据

VGG 2014

  • 1*1 卷积

Google Inception Net 2014

  • 全局均值池化
  • 激活策略
  • (V2) 更小的卷积核,以及批规格化
  • (V3) 大的二维卷积拆成两个小的以为卷积;更改inception module结构

ResNet 2015

  • 残差网络概念,高速公路结构,让网络更深
  • ReLu -> Linar 线性函数(V2)

CNN 应用

RCNN这种我不会啊。。。
支付宝捐赠
请使用支付宝扫一扫进行捐赠
微信捐赠
请使用微信扫一扫进行赞赏
有 0 篇文章