本篇涉及机器学习炼丹过程中的一些必须知道的知识点,比如评价指标,损失函数,激活函数,正则化,卷积,RNN等,envolving…
多层感知机和布尔函数
- 只是用一个隐藏层,实现$n$元输入的任意布尔函数,需要的隐藏节点数量:**$2^{n-1}$**
- 多个隐藏层,实现$n$元输入的任意布尔函数,需要的隐藏节点数量为(包含输出层节点)$3(n-1)$,使用多个隐藏层的方式,可以有效减少节点数量,这些节点数量对应着$2(n-1)$网络层,对每层使用二分思想,两两分组进行异或运算,最少需要的网络层数为**$2log_{2}N$**向上取整。
评价指标
分类问题
混淆矩阵
分类器在测试集数据集上预测或正确或不正确,总共会出现四种情况
- TP: true positive–将正类样本预测为正
- TN:true negative—将负类样本预测为负
- FP:false positive—将负类样本预测为正
- FN:false negative–将正类样本预测为负
准确率
对于分类问题,评价指标一般是分类**准确率(ACC:accuracy)**,对于给定的测试数据集,分类器正确分类的样本数占据总样本数量之比,,也就是损失函数是0-1损失时测试数据集上的准确率,分类正确为1,分类错误为0,计算公式为
$$
ACC=\frac{1}{N} \sum_{i=1}^{N}I(y_{i}=f(x_{i}))
$$
使用混淆矩阵表示为
$$
ACC=\frac{预测为正}{所有样本}=\frac{TP+FP}{TP+FP+TN+FN}
$$
对于类别分布不均与的样本集,占比较多的类别通常会对准确率有更大的影响,而对于自然存在的样本集来说,大概率是样本类别分布不均匀的,因此一般使用各个类别小的样本准确率的算数平均来作为模型评估标准。
召回率
对于二分类的评价指标一般使用召回率(recall),精确率(precision),对于多分类,可以认为关注的类为正类,其余类为父类。
召回率又称作查全率。召回率的意思是,在样本中为正类的样本有多少被预测为真,针对实际样本而言。计算公式为
$$
Recall=\frac{正例预测为正}{样本中所有正例}=\frac{TP}{TP+FN}
$$
精确率
精确率又称作查准率,精确率表示的是,预测为真的样本中有多少为真的真样本,针对预测结果而言。计算公式为
$$
Precision=\frac{正例预测为正}{所有预测为正的样本}=\frac{TP}{TP+FP}
$$
F值
F值是召回率和精确率的调和平均,当召回率和精确率都高时,F值也会高
$$
\frac{2}{F}=\frac{1}{Recall}+\frac{1}{Precision}
$$
查准率和查全率是一对矛盾的度量,一般来说,查准率高的时候,查全率就会偏低,而查全率高时查准率就会偏低。
PR曲线
可以使用查准率为纵轴,查全率为横轴绘制PR曲线,如果一个学习的PR曲线被另一个学习器包住,可以认为后者的性能优于前者。
带入P和R的公式
$$
\begin{align}
P&=\frac{TP}{TP+FP}\
R&=\frac{TP}{TP+FN}\
\frac{P}{R}&=\frac{TP+FN}{TP+FP}
\end{align}
$$
分析公式(39),可以看到,对于数据集来说,如果增加负样本的数量,对应的FP数值就会出现变化,从而会使得PR曲线发生变化。
ROC曲线
ROC的纵轴为真正率TPR和召回率相同,表示将正例分类正确的概率;横轴为假正率FPR,表示将负例预测为正的概率,二者的定义为:
$$
\begin{align}
TPR&=\frac{正例预测为正}{样本中所有正例}=\frac{TP}{TP+FN} \
FPR&=\frac{负例预测为正}{样本中所有的负例}=\frac{FP}{TN+FP}
\end{align}
$$
和PR曲线类似,如果一个学习器的ROC曲线被另一个学习器包住,那么可以认为后者的性能更优。
PR_VS_ROC
显然P-R曲线和ROC曲线都能对模型的性能进行评价,二者比较ROC曲线适应性更好,对于正负样本分布比例变化时,P-R曲线会发生剧烈的变化,但是ROC曲线基本保持不变,也就是说ROC描述的更偏向与分类器的属性,能尽量降低不同的数据集测试对模型效果测试带来的影响,一般情况下都是使用该曲线来评价模型;而P-R曲线描述的和数据集有很大的关系,除了针对特定场景的特定数据集使用PR曲线,一般不会优先使用。
激活函数
博客中曲线均使用Mac
自带应用 Grapher
绘制
sigmoid
函数
函数公式
$$
f(x)=\frac{1}{1+exp(-x)}
$$
该函数限制了f(X)
的取值为$[0,1]$之间,x为正无穷时,f(x)=1
,x
取值为负无穷时f(X)=0
,对sigmod
激活函数进行求导可以得到
$$
\begin{align}
\bar{f}(x)&=\frac{e^{-x}}{(1+e^{-x})^{2}}=f(x)(1-f(x))
\end{align}
$$
从曲线中可以看到,当$|x| \rightarrow \infty $,对应的导数为$0$,根据机器学习中梯度反向求导的训练策略,激活函数的特性会导致梯度接近于$0$,造成梯度消失的情况,导致训练无法进行。
由于sigmoid
函数,会将输出控制在$[0,1]$之间,有时候会在多分类任务中,使用sigmoid
的值代表分类的概率值,如yolov3
目标检测模型,为了适应coco
数据集中存在的类别重叠情形,如人,女人这两类,使用sigmoid
作为模型类别的预测输出,而没有直接使用softmax
的方式(softmax会默认类别见相互独立,只取得最大的一个值)
Tanh
函数
函数公式
$$
f(x)=tanh(x)=\frac{e^{x}-e^{-x}}{e^x+e^{-x}}
$$
该函数限制了f(X)
的取值为$[-1,1]$之间,x为正无穷时,f(x)=1
,x
取值为负无穷时f(X)=-1
,对tanh
激活函数进行求导可以得到
$$
\bar{f}(x)=1-\frac{(e^x-e^{-x})^2}{(e^x+e^{-x})^2}=1-(f(x))^{2}
$$
从曲线中可以看出,和sigmoid
函数及其导函数类似,当$|x| \rightarrow \infty $,对应的导数为$0$。同样会导致出现梯度消失的情况。
对于Tanh
函数实际上可以看做是对sigmoid
函数的平移和拉伸,二者具有相同的函数特性,只是sigmid
将输出值控制在$[0,1]$之间,而Tanh
函数将输出控制在了[-1,1]
之间,是一个偶函数。
Relu
整流线性函数
函数公式
$$
f(x)=max(0,x)
$$
从relu
的函数曲线可以看出,在一半的定义域上输出为$0$,这使得只要整流线性单元处于激活状态,它的导数都能保持较大并且导数一致。
- 优点
- 相比于
sigmoid
和Tanh
均需要计算指数而言,relu
只需要一个阈值就能够得到激活值,计算量更小 relu
可以有效解决梯度消失的问题,提供相对宽的激活边界;relu
的单侧抑制,提供了网络的稀疏表达能力,提高了泛化能力;
- 相比于
- 缺点
- 由于单侧抑制会导致训练时神经网络的死亡问题,在负梯度经过
relu
单元时,会被置为0,并且之后再也不会被任何数据激活,也就是经过该神经元的梯度会永远变为0,不对任何数据产生响应; - 在训练过程中如果学习率设置的过大,会导致超过一定比例的神经元死亡,导致训练失败
- 由于单侧抑制会导致训练时神经网络的死亡问题,在负梯度经过
relu改进型
leaky relu渗透整流单元
$$
f(x)=
\begin{cases}
\alpha x ::::::::: & if :::::::: & x \leq 0 \
x & if & x > 0
\end{cases}
$$
一般$\alpha=0.01$一个较小的值elus
$$
f(x)=
\begin{cases}
\alpha (e^{x}-1) ::::::::: & if :::::::: & x < 0 \
x & if & x \ge 0
\end{cases}
$$
一般$\alpha=0.01$一个较小的值实验表明,
Elus
激活函数和Relu
相似,都是不带参数的,并且收敛速度比Relu
更快。使用Elus
时,不使用批处理比使用批处理能够得到更好的效果,同时Elus
函数不使用批处理的效果比使用Relu
加批处理的效果更好。
swish函数
由Google提出的效果更优于Relu
的激活函数,在保持其余参数不变的情形下,将模型的Relu
激活函数修改成Swish
模型正确率均有提升
$$
f(x)=x \times sigmoid(\beta x)
$$
其中$\beta$为缩放参数,一般设置为$1$,在使用BN
时,还要对缩放系数$\beta$进行设置。
softmax-处理分类处理问题
softmax
主要针对多分类,并且类别互斥,一个样本只能对应其中的一类。
sigmoid
可以进行类别重叠的分类任务。
$$
softmax(x_{i})=\frac{e^{x_{i}}}{\sum e^{x_{i}}}
$$
保证所有类别之和为$1$,可以认为是一种概率表示。
对于softmax
标签一般使用的是onehot
的编码形式,并且最后一层的节点数等于类别数。
Loss_Fuction
损失函数用于描述模型预测值和真实值之间的差距。
MSE
一般用于回归问题
均方差损失函数,L2
损失函数
$$
MSE=\frac{1}{n}\sum_{i=1}^{n}(observed-predict)^{2}
$$
类似的还有
均方根误差
RMSE
:将MSE
开平方平均绝对值
MAD
:$MAD=\frac{1}{n}\sum |observed-predict|$,真实值与预测值相减的绝对值求平均,**L1
损失函数**SmoothL1
:该损失函数比L2
损失函数,其对离群点、异常值不敏感,可控制梯度的量级使训练时不容易跑飞。
$$
\begin{align*}
Smooth_{L_{1}}=
\begin{cases}
0.5|x|^{2}::::::::::& if |x|<1 \
|x|-0.5 & otherwise
\end{cases}
\end{align*}
$$
要控制模型的预测和真实值具有同样的数据分布。
- SmoothL1损失带超参数,这是SmoothL1损失的优化,也是一般形式
$$
\begin{align*}
Smooth_{L_{\sigma}}=
\begin{cases}
0.5(\sigma x)^{2}::::::::::& if |x|< 1/\sigma^2\
|x|-0.5/ \sigma & otherwise
\end{cases}
\end{align*}
$$
式子中的$\sigma$是设置的超参数
crossentropy
预测的样本属于某一类的概率,
假设y
代表真实类别$(0,1)$,a
代表预测值
$$
Crossentropy(a)=-\frac{1}{n}\sum [yln(a)+(1-y)ln(1-a)]
$$
公式前面有负号
假设预测值和真实值非常接近,预测的越准,那么对应的交叉熵很小。
平方差损失函数为何不适合最后一层含有sigmoid或softmax
对于平方差损失函数其反向求导过程为
$$
\begin{align}
MSE&=\frac{1}{n}\sum_{i=1}^{n}(observed-predict)^{2} \
\delta ^{L}&=-(observed-predict) \bar{f}(z^{L})
\end{align}
$$
其中$z^L$为第L
层节点的输出,满足关系式$predict=f(z^L)$
如果激活函数$f(.)$为sigmoid
时,如果$z^L$的绝对值较大,函数的梯度会趋于饱和接近于$0$,即$\bar{f}(z^L)$的绝对值非常小,导致反向求导时$\delta ^L$取值会非常小,使得基于梯度的学习速度非常缓慢。而如果在sigmoid
之后使用的是交叉熵损失函数,不会出现这种问题。
防止过拟合
所谓正则化
在神经网络计算损失的过程中,在损失后面增加一项,如此损失值所代表的输出与标准结果之间的误差就会受到干扰,导致学习到的参数w
和b
无法按照目标方向进行调整,实现模型无法与样本无法完全拟合的结果,从此实现了防止过拟合的效果,使原来的优化目标由训练误差变为了泛化误差。
- 模型欠拟合时,希望正则化对模型误差的影响越小越好,以便模型快速拟合
- 模型过拟合时,希望正则化对模型影响越大越好,以便模型不要发生过拟合
正则化的一般形式为
$$
\min {f \in F} \frac{1}{N} \sum {i=1}^{N} L(y{i},f(x{i}))+\lambda J(f)
$$
其中第一项L
是经验损失,第二项J
为正则化项,$\lambda$为平衡系数
对于常用的正则,一般为L1
正则和L2
正则
$$
L_{1}=less(0)+\lambda\sum_{W}^{n}|W| \
L_{2}=less(0)+\frac{\lambda}{2}\sum_{W}^{n}W^2
$$L1
:所有学习参数w
的绝对值的和
L2
:所有学习参数w
的平方和然后再求平方根
$\lambda$为设置的超参数。
注意
一般我们只对权重参数进行正则化约束,而不对偏置项进行正则约束。精确拟合偏置所需的数据通常比拟合权重少得多,每个权重会指定两个变量如何相互作用。我们需要在各种条件下观察这两个变量才能良好地拟合权重,而每个偏置仅控制一个单变量,这意味着,我们不对其进行正则化也不会导致太大的方差。
L1正则化
对于添加正则化的优化问题,可以认为是在原有优化目标的基础上增加了一个约束项,
对于L1
正则化
$$
\begin{align}
& \min_{w} ::::::: & \frac{1}{N}\sum_{i=1}^{N} (f(x,w)-y)^{2} \
& s.t & \lambda\sum_{W}^{n}|W| \le a
\end{align}
$$
对应的拉格朗日问题为
$$
L(x,\beta)=\frac{1}{N}\sum_{i=1}^{N} (f(x,w)-y)^{2}+\beta(\lambda\sum_{W}^{n}|W|- a)
$$
根据KKT条件可以得到:
$$
\begin{align}
& |W| \le \frac{a}{\lambda}
\end{align}
$$
同理对于L2
正则化KK条件可以得到:
$$
W^{2} \le \frac{a}{\lambda}
$$
由此可以看出,约束条件限制了神经网络参数的取值空间。对于二维情况下,权值为$w^{1}$和$w^{2}$,此时解空间的约束为$|w^{1}|+|w^{2}| \le A$,此时的L1
约束可以得到$w^{1}$和$w^{2}$的约束空间与目标函数的学习参数的解
可以看出,对于L1
正则的目标函数,会在正则项的解空间和经验损失的解空间的交点处,得到模型的参数。
L1损失函数会产生稀疏模型并防止过拟合
对于L1
正则化,平衡参数$\lambda$越大,可以使得代价函数在参数为$0$时取得最小值。
L2正则化
L2一般也称作权重衰减,或者岭回归。
对于L2
损失函数,同样进行如此分析,解空间的约束为$(w^{1})^{2}+(w^2)^{2}<A$
对于L2
的目标函数,正则项约束了解的空间为一个圆形,与经验损失的解空间的交集出于L1
相比,没有尖角特性,因此不会对模型的稀疏性产生影响。
两种正则的效果
L2正则函数只会对参数的值产生限制,但并不会使模型产生稀疏性
对于模型训练,一般认为得到的模型参数数值小的模型更简单,并且能够更好的适应不同的数据集,在一定程度上能够避免过拟合的现象。对于L2
正则化可以使得模型获得更小的参数值,
对于模型训练,假设代价函数为$E_{k}=\frac{1}{2}\sum_{j=1}^{l}(\bar{y}-y)^2$,进行反向求导可以得到参数更新的方法为$\delta {hj}=\delta{hj}-\eta\frac{\partial{E_{k}}}{\partial{w_{hj}}}$,其中参数$\eta$为学习率,控制参数更新幅度,如果模型的代价函数加上了L2
正则化,则参数更新方法为$\delta {hj}=\delta{hj}(1-a\lambda)-\eta\frac{\partial{E_{k}}}{\partial{w_{hj}}}$,在进行训练时,当前的参数都会乘以一个小于1的因子,使得更新之后的参数$\delta_{hj}$不断减小,因此L2正则又称作权重衰减。
L1正则会产生更稀疏的最优解,稀疏指的是在最优值中的一些参数为0,和L2相比,L1正则化的洗稀疏性具有本质的不同,L2正则不会使得参数变得稀疏,而L1正则有可能设置足够大的参数$\lambda$实现稀疏性。
Dropuout-防止过拟合
在神经网络训练时,以一定的概率随机的丢弃一部分神经元节点,Droupout
作用于每份小批量训练数据,相当于每次迭代都会在训练不同结构的神经网络,实际上这是一种Bagging
集成学习的一种方法,在训练时,减弱了全体神经元之间的级联性,减少了过拟合的风险,增强了泛化能力。
在训练阶段,droupout会随机选择一定比例数量的神经元作为下一层网络的输入,这个时候显然会改变原来的数据分布,那么在预测的时候,droupout设置为1,也就是保留了全部的神经元,使用权重比例推断规则将训练阶段得到的权重处以训练时droupout的比例。
实际上可以这么认为,假设原来的数据分布是p,现在使用droupout的方法,随机的选择和抛弃一些点传递到下一层,因为选择的过程是一个完全随机的过程,可以认为得到的数据分布为q,那么显然原来数据的期望进行了缩放但是方差没变。
批归一化BN-防止过拟合
神经网络训练的过程就是学习数据分布的过程,因此在训练之前对输入数据进行归一化处理。随着训练数据的增加,数据的分布随之该改变,致使网络在每次迭代时需要拟合不同的数据分布,这就增大了训练的复杂度和过拟合的风险。
批归一化针对每一批次输入的训练数据,在网络的每层输入之前加入归一化处理(均值为0,标准化为1),将所有批数据强制在统一的数据分布之下,对该层的每一个神经元
$$
\bar{x}^{k}=\frac{x^{k}-E(x^{k})}{\sqrt{Var[x^{k}]}}
$$
其中$x^{k}$为第$k$层神经元的原始数据,$E[x^{k}]$为这一批次的数据在第$k$个神经元的均值,$\sqrt{Var[x^{k}]}$为这一批次数据在第$k$个神经元的标准差。
批标准化相当于对数据分布增加了额外的约束,从而增加了模型的泛化能力,但是这样也会降低模型的拟合能力。归一化之后的数据被强制为0均值1标准差,为了恢复原始数据的分布,引入两个学习参数$\beta$和$\gamma$
$$
y^{k}=\gamma ^{k} \bar{x}^{k}+\beta ^{k}
$$
$\gamma ^{k}$ 和$\beta ^{k}$分别为输入数据分布的方差和标准差,为学习参数。使用这两个参数进行反向变换,得到了原始数据的分布。
在卷积网络之中使用BN
,由于卷积神经网络的参数共享机制,每一个卷积核参数在不同位置的神经元中是共享的,每一个卷积核对应一组待学习的BN
参数$\gamma ,\beta $
BN
在一定程度上可以代替Droupout
正则化与欠约束的问题
大多形式的正则化能够保证应用于欠定问题的迭代方法收敛。例如,当似然的斜率等于权重衰减的稀疏的时候,权重衰减将阻止梯度下降继续增加权重的大小。
数据集增强
图像数据
在图像相关领域,一般使用随机旋转,水平翻转,垂直翻转,缩放,平移,拉伸,增加白噪声,对比度,亮度等等处理,目前在目标检测领域还有mixup的处理方法(将两个图像进行合并)
语音序列数据
输入数据加入噪声
噪声鲁棒性
在输入中加入方差极小的噪声等价于对权重施加范数惩罚
在权重中加入噪声,主要用于循环神经网络
输出目标中加入噪声
多数情况下标签存在一定的错误,错误的标签y不利于最大化似然函数$\log(y|x)$,可以使用标签平滑的方法吧确切的目标从0到1变成$\frac{\delta}{k-1}$和$1-\delta$,正则化具有k出输出的softmax函数的模型
提前终止
在训练阶段防止过拟合的方法,也就是早停的技术,在训练完每个轮次的训练集之后,在验证集上运行,得到模型的而评估效果,如果在指定的循环次数内验证集上没有进一步改善,算法提前终止,结束训练。
提前终止也是一种正则化的策略,可以认为提前终止可以将优化过程的参数空间限制在初始参数$\theta_{0}$的小邻域内
对抗训练
目前深度学习一般是基于神经网络进行搭建,例如在目标识别领域,目前很多深度学习模型已经超过了人眼识别的准确率。但是当对原始样本添加扰动之后,得到的对抗样本在人来看适合原来的样本一致的,但是神经网络就出出现错误的识别结果,就如下图所示。
可以通过对抗训练(adversarial training)减少原有独立同分布的测试集的错误率——在对抗扰动的训练集样本上训练网络。
如图中所示,原始为一张熊猫的图片,并且神经网络给出了正确的输出,添加噪声扰动形成对抗样本,在人眼看来还是一张熊猫的照片,但是神经网络预测出现错误。
卷积网络
卷积输出的尺寸计算公式
卷积有两种padding
表示是否要对输出的feature map
进行边框补零操作,如果padding=SAME
并且卷积的移动步长为1是生成的feature map
与输入的尺寸相等。
如果padding=SAME
,计算公式为
$$
\begin{align}
height_{out}&=ceil[height_{input} \div height_{stride}] \
width_{out}&=ceil[width_{input} \div width_{stride}]
\end{align}
$$
如果padding=VALID
,计算公式为
$$
\begin{align}
height_{out}&=ceil[(height_{input}-height_{kernel}+1) \div height_{stride}] \
width_{out}&=ceil[(width_{input}-width_{kernel}+1) \div width_{stride}]
\end{align}
$$ceil
表示向上取整
卷积操作的本质特征
本质特征:稀疏交互,参数共享
稀疏交互
对于全连接来说,任何一对输入与输出神经元之间都产生交互,形成稠密连接结构。
卷积网络中,卷积核尺度远小于输入的维度,每个输出神经元金鱼前一层特定区域内(卷积核感受野区域)的神经元存在连接,成为稀疏交互
相对全连接来说,模型的参数量会减小几个数量级,会改善过拟合的情况
物理意义:对于图像,文本,语言等数据都具有局部的特征结构,可以先学习局部特征,再将局部特征组合成更复杂和抽象的特征。底层特征抽取的是边缘特征,高层抽取的是组合特征。
参数共享
在同一个模型的不同模块中使用相同的参数,这是卷积运算的固有属性。
卷积核中的每个元素将作用于每一次局部输入的特定位置上,只需要学习一组参数,而不需要去学习每个位置的每个参数,降低了模型的存储需求和参数量
参数共享的物理意义:使卷积层具有平移不变形,假设一张图像中有一只🐱,不论这只猫在什么位置,都应该识别出来是🐱。当$f(g(x))=g(f(x))$时,乘坐$f(x)$关于变换$g$具有不变性,将$g$视为输入的任意平移函数。
池化操作
池化主要针对非重叠区域,包括均值池化和最大池化。其本质是进行降采样。
- 均值池化:对区域内数值求平均值,能够抑制由于邻域大小受限造成的估值方差增大的现象,对背景保留较好;
- 最大池化:提取区域内的最大值,能够抑制网络参数误差造成估计均值偏差的现象,能更好提取问题信息;
- 相邻重叠区域池化:采用的是比池化窗口更小的步长,在窗口每次滑动时存在重叠区域;
- 空间金字塔池化:多尺度池化,使用不同尺寸的矩阵进行池化,之后将所有结果拼接在一起作为整个池化的结果输出;
池化不但能够显著降低模型的参数量,还能够对模型保持平移、伸缩、旋转操作的不变性。
平移不变性:输出的结果对输入的小量平移基本保持不变
伸缩不变性:池化主要感受的是邻域范围内的值,并不是某个确定的值,当输入尺度变换之后,输出保持不变;
旋转不变性:当池化之前的卷积核学习到不同角度的旋转时,对于之后的池化都会产生激活
卷积应用于文本分类
在图像上,卷积操作捕捉局部特征,对于文本来说,可以看做高度为$1$,宽度为L
的序列。
对于文本分来任务,局部特征可以看做由若干个单词组成的滑动窗口,类似于N-gram
。卷积能够实现对N-gram
特征进行组合和删选,获取不同层次的语义信息,由于卷积操作共享权重,因此参数量更小,训练速度快。
具体实现:
- 输入为$N \times K$的矩阵,$N$为文章对应的单词总数,$K$表示每个词对应的表示向量的维度。每个词的$K$维向量可以从其它从语料库中训练好的,类似于加载预训练参数,也可以使用词向量
word embeding
的方式进行生成。 - 由于
N
对应着文章中所有的单词,一般情况下N
是一个非常大的数,使用卷积核在N
的方向上进行移动,假设每次卷积核的视野为$n \times H$,每次卷积核与感受野范围内的矩阵进行运算得到一个输出值,假设n=2
,经过卷积,最终可以得到N-2
个卷积输出,将这些输出连接在一起 - 卷积之后进行池化降采样,可以使用最大池化或者平均池化
- 池化之后链接
softmax
进行文本分类输出
循环神经网络
网络结构
对于循环神经网络,设计的初衷是为了解决序列型数据。