花书十一章笔记(损失函数、性能度量、激活函数和优化算法)(补发)
最近实验室在一起读花书,每个人讲一两章,刚好自己读了十一章所以结合以往的知识进行一下记录;十一章主要是介绍的应用的方法论,goodfellow介绍的范围还是挺广的,从确定损失函数、性能度量,到搭建end-to-end的系统,其中包括了模型、优化方法、正则化等等
一.误差度量(损失函数)
误差就是实际预测数和样本真实标签之间的差异,训练集上称为训练误差,新样本上为泛化误差,同时度量但是肯定更加关心泛化误差。
而误差的度量用损失函数,一般来说,损失函数越小,模型的鲁棒性就越好。
损失根据不同类型的任务有很多种,下面我们来介绍其中常用的。
(1)分类任务
0-1 Loss
Yi=Yi_hat时,损失函数值为1,否则为0,这个损失函数很明显的缺点就是无法求导,在依赖于反向传播的深度学习模型中无法使用,实际中也基本上不会用,更多是启发新损失函数的产生
熵与交叉熵
熵是度量信息量的,熵越小,表示信息量越少,交叉熵也是分类任务中最常用的。
定义:给定两个概率分布,p(x)和q(x),p为已知分布,q为未知分布,则其交叉熵函数是两个分布的互信息,可以反应相关程度。
在模型中,y为样本标签分布,f为需要学习的模型,则两者的交叉熵函数为:
L(f,y)=-∑∑yij*log(f(xij))
其中,f(xij)表示的是基于第i个样本预测的标签为j类的概率,yij=0 or 1,表示第i个样本的真实标签是否为j类
softmax及其变种
当交叉熵中的f(xij)表现为softmax概率的形式时,就是softmax损失函数
其中,softmax概率=exp{xi}/∑exp{xi}
softmax顾名思义就是soft版本下的max,如果是hard版本下的max就是相当于直接求最大值,同样也会存在不可导,只有在最大值那个点上才会有梯度,所以softmax更加合理
KL散度
散度的概念其实和熵有相似,都可以反应两个分布的相似程度
Dkl(p|q)=∑pi*log(pi/qi)≥0,当pi=qi时,Dkl=0
KL散度的定义将对数拆开写成相减的形式其实就是p的熵减去p、q的交叉熵
Hinge Loss
主要用于SVM中,如果分类正确,则loss=0,如果错误,则为1-f(x),所以它的形式是一个分段不平滑的曲线,一般用来解决SVM中的间距最大化问题
(P.S. 间距最大化:SVM用来寻找数据集的最佳分割超平面,目标就是找到数据集中靠近这个决策边界(分割平面)的点与决策边界的距离最大时,就是最好的决策边界)
Exponential Loss和logistic loss
Exponential Loss:L(f(x),y)=exp{-βyf(x)},这个损失函数主要用于Adaboost,有较大的梯度;
logistic Loss:L(f(x),y)=ln(1+exp{-yf(x)})/ln2
小结
以上就是分类任务中比较常用的损失函数,可以看到其形式很多都是对数损失,这是和熵的定义以及极大似然估计决定的
(2)回归任务
L1、L2
L1就是绝对值求和,L2就是平方和,L1这个损失函数是不平滑,而L2又容易产生梯度爆炸,因此有很多改进,比如目标检测中Fast-RCNN用的平滑的L1,当X的绝对值小于1时,L=0.5x^2;否则的话,L=X的绝对值-0.5;
它表达的含义就是X比较小的时候,就是L2,保持平滑;X比较大的时候,就是L1,限制梯度爆炸
再比如基于Huber函数的改进
perceptual loss
感知损失,由于自己没有用过所以就不具体写了
(3)其他
近年来,产生了很多综合许多任务的模型,简单介绍两个最火的
GAN
生成对抗网络,利用生成模型和判别模型的博弈进行迭代优化,这种博弈的模型思想在其他领域也有很多应用,比如课程学习等等
GAN的损失函数的研究是一个很大的领域,现在已经有十种损失函数了,发表的论文有上千篇,最普通的GAN的损失函数形式为:
min max V(D,G)=Ex~pdata(x)【logD(X)】+
Ex~pz(z)【1-logD(G(Z))】
BERT
BERT是NLP近年来最出色的成就,它的损失函数包括两个部分
第一部分是MASK-LM的单词级别的分类任务,我们知道BERT在每一段语句内都会随机MASK一部分单词,用来学习和训练单词级别的信息,最终评估这些信息的就是这个损失函数
第二部分就是句子级别的分类任务,也就是BERT里面的Sentence推测任务,它们的损失函数形式还是logp的形式
二.性能度量
性能度量也就是评估模型训练好坏的指标,都是基于混淆矩阵的,对于二分类问题,其混淆矩阵为:
(1)Error rate和ACC
ACC=(TP+TN)/(P+N)
实际应用中这个指标用的不多,因为大部分样本都会存在类别不平衡的情况,或者说我们更关心的是某一类错误(第Ⅰ类错误和第Ⅱ类错误)
(2)precision和recall
精确率和召回率
precision=TP/(TP+FP),表示预测为正例的样本中实际为正例的比例
recall=TP/(TP+FN),表示有多少个真实为正例的样本被预测为正例
这两个指标从定义上来看是存在互相矛盾的,所以实际应用中客户端的需求往往也是在保证其中一个指标达到多少的情况下,尽量提高另外一个
(3)Fβ-score
综合precision和recall两个指标来看
β=1时,为F1-score,给予两个指标同样的权重
β>1时,recall更重要
β<1时,precision更重要
(4)灵敏度(sensitivity)和特异性(specificity)
灵敏度=recall,特异性=TN/(FP+TN),表示真实为负例的样本被预测为负例的比例,这两个指标不会受到样本类别不平衡的影响,因为它们的分母就是P和N
(5)PR曲线和ROC曲线,以及AUC
TPR=TP/(TP+FN)=recall=灵敏度
FPR=FP/(TN+FP)=1-特异性
PR曲线:以precision和recall为y、x轴画出每个样本点基于预测为正的概率的阈值来画图,曲线下的面积是AUC,越大越好,也即曲线越接近右上角越好(说明precision和recall都大)
ROC曲线:以TPR和FPR为y、x轴画图,面积为AUC,图形越接近左上角越好
三.激活函数
(1)sigmoid
函数形式为f(x)=1/(1+exp{-x}),取值范围为0~1,可以解释为一个神经元的激活率;
缺点:输入的x的绝对值较大时,梯度变为0,使得参数不能再更新
在神经网络中,如果是二分类问题,那么输出层一般是sigmoid,中间其他层可以用ReLU
(2)tanh
tanh(x)=sinh(x)/cosh(x)=(exp{x}-exp{-x})/(exp{x}+exp{-x})
取值范围为-1~1,仍然会sigmoid函数的问题
(3)ReLU
在CNN中常用,负数直接归0,正数保持原样输出
缺点:负数区域为0的现象叫做dead ReLU,所以如果用ReLU,设置学习率的时候就要小心,不能让网络中出现很多dead神经元
ReLU的几个改进
LeakyReLU
f(x)=max(0.01x,x),在负数区域不再dead
PReLu
f(x)=max(ax,x),a是可以学习的参数
ELU
f(x)=x,x>0;α(exp{x}-1),x≤0
(4)MaxOut:对ReLU家族的统一
本质上就是新增了一层(激活函数层),来学习激活函数本身
MaxOut层中每个神经元的计算公式为:
hi(x)=max j∈[1,k] Zij,其中,Zij=X’wij+bij,m和k为需要学习的参数,mk为bij的大小
四.优化算法
1.梯度下降
(1)BGD(批量梯度下降)
利用所有样本,θ=θ-η·▽J(θ)
(2)SGD(随机梯度下降)
单个样本,随机采样
θ=θ-η·▽J(θ;X(i),Y(i))
(3)MBGD(小批量梯度下降)
mini-batch个样本
θ=θ-η·▽J(θ;X(i,i+n),Y(i,i+n))
超参数为batch-size和学习率η
2.Momentum算法(动量)
Vt=γV(t-1)+ηt*gt
χt=χ(t-1)-Vt
γ为衰减因子
3.MAG算法
Vt=γV(t-1)+η·▽J(θ-γV(t-1))
xθ=θ-Vt
4.Adagrad算法
St=S(t-1)+gt⊙gt
χt=χ(t-1)-η/sqrt(St+ε)⊙gt
5.RMSprop算法
St=γS(t-1)+(1-γ)gt⊙gt
χt=χ(t-1)-η/sqrt(St+ε)⊙gt
6.Adadelta算法
St=γS(t-1)+(1-γ)gt⊙gt
χt=χ(t-1)-(γ△X(t-1))/sqrt(St+ε)⊙gt
7.Adam算法
RMSprop+Momentum
优化算法的研究是一个比较庞大的领域,近期还有比如AdamW,清华的一篇文章也有一个新的优化算法;最近自己在做的也有将元学习思想融入到优化算法中
8. 补充
最后想补充一下自己最近读文章看到的两种新的优化计术,这两种计术可以直接嵌入到以上的优化算法中。
第一种是基于元学习思想的pumpout算法,用来处理数据集中含有噪声标签的问题,对干净标签样本做梯度下降,对噪声标签样本做梯度上升。元学习不是一种算法,只是一类思想,这篇文章的思想就是想主动来对抗噪声标签,从而阻止噪声标签对神经网络训练过程中参数收敛的影响。
第二种是阿里达摩院刚刚发布的一篇文章,对梯度向量直接中心化来处理,同样可以大幅提升建模效果。