作者:刘浪
著作权归作者所有。AI开发者获得授权转载,禁止二次转载
https://zhuanlan.zhihu.com/p/62935978
Softmax函数与交叉熵
在Logistic regression二分类问题中,我们可以使用sigmoid函数将输入Wx+b映射到(0,1)区间中,从而得到属于某个类别的概率。将这个问题进行泛化,推广到多分类问题中,我们可以使用softmax函数,对输出的值归一化为概率值
这里假设在进入函数之前,已经有模型输出C值,其中C是要预测的类别数,模型可以是全连接网络的输出aa,其输出个数为C,即输出为:
所以对每个样本,它属于类别i的概率为:
通过上式可以保证
,即属于各个类别的概率和为1
对函数进行求导,即求:,第i项的输出对第j项输入的偏导。代入函数表达式,可以得到:
求导规则:对于,导数为:
所以在我们这个例子中,
上面两个式子只是代表直接进行替换,而非真的等式。,(即g(x)=
进行求导),要分情况讨论:
如果i=j,则求导结果为
如果i≠j,则求导结果为0
再来看对求导,结果为
所以,当i=j时:(其中,为了方便,令
)
当i≠j时:
标红下,这俩公式很重要:
Loss function
对数似然函数
机器学习里面,对模型的训练都是对Loss function进行优化,在分类问题中,我们一般使用最大似然估计(Maximum likelihood estimation)来构造损失函数。对于输入的x,其对应的类标签为t,我们的目标是找到这样的θ使得p(t|x)最大。在二分类的问题中,我们有:
其中,y=f(x)y=f(x)是模型预测的概率值,t是样本对应的类标签,将问题泛化为更一般的情况,多分类问题,此时t是one-hot编码,例如[0,0,0,1,0,0],此时中间那个1对应真正的标签:
由于连乘可能导致最终结果接近0的问题,一般对似然函数取对数的负数,变成最小化对数似然函数。
交叉熵
说交叉熵之前先介绍相对熵,相对熵又称为KL散度(Kullback-Leibler Divergence),用来衡量两个分布之间的距离,记为
这里H(p)是p的熵。假设有两个分布p和q,它们在给定样本集上的相对熵定义为:
从这里可以看出,交叉熵和相对熵相差了H(p),而当p已知的时候,H(p)是个常数,所以交叉熵和相对熵在这里是等价的,反映了分布p和q之间的相似程度。关于熵与交叉熵等概念
回到我们多分类的问题上,真实的类标签可以看作是分布,对某个样本属于哪个类别可以用One-hot的编码方式,是一个维度为C的向量,比如在5个类别的分类中,[0, 1, 0, 0, 0]表示该样本属于第二个类,其概率值为1。我们把真实的类标签分布记为p,该分布中,ti=1当i属于它的真实类别c。同时,分类模型经过softmax函数之后,也是一个概率分布,因为
所以我们把模型的输出的分布记为q,它也是一个维度为CC的向量,如[0.1, 0.8, 0.05, 0.05, 0]。
对一个样本来说,真实类标签分布与模型预测的类标签分布可以用交叉熵来表示:
最终,对所有的样本n,我们有以下loss function:
其中是样本k属于类别i的概率,是模型对样本k预测为属于类别i的概率。
当i=j时:
当i≠j时:
所以,将求导结果代入上式:
参考:Softmax函数与交叉熵
https://blog.csdn.net/behamcheung/article/details/71911133
神经网络训练中的梯度消失与梯度爆炸
层数比较多的神经网络模型在训练时也是会出现一些问题的,其中就包括梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)。梯度消失问题和梯度爆炸问题一般随着网络层数的增加会变得越来越明显。
例如,对于下图所示的含有3个隐藏层的神经网络,梯度消失问题发生时,接近于输出层的hidden layer 3等的权值更新相对正常,但前面的hidden layer 1的权值更新会变得很慢,导致前面的层权值几乎不变,仍接近于初始化的权值,这就导致hidden layer 1相当于只是一个映射层,对所有的输入做了一个同一映射,这是此深层网络的学习就等价于只有后几层的浅层网络的学习了。
而这种问题为何会产生呢?以下图的反向传播为例(假设每一层只有一个神经元且对于每一层,其中为sigmoid函数)
可以推导出
而sigmoid的导数如下图
可见,的最大值为,而我们初始化的网络权值通常都小于1,因此,因此对于上面的链式求导,层数越多,求导结果越小,因而导致梯度消失的情况出现。这样,梯度爆炸问题的出现原因就显而易见了,即,也就是比较大的情况。但对于使用sigmoid激活函数来说,这种情况比较少。因为的大小也与有关(),除非该层的输入值一直在一个比较小的范围内。
其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑用ReLU激活函数取代sigmoid激活函数。另外,LSTM的结构设计也可以改善RNN中的梯度消失问题。
参考:神经网络训练中的梯度消失与梯度爆炸
https://zhuanlan.zhihu.com/p/25631496
Batchnorm原理
Batchnorm是归一化的一种手段,极限来说,这种方式会减小图像之间的绝对差异,突出相对差异,加快训练速度,如果我们每一个batch输入的数据都具有不同的分布,显然会给网络的训练带来困难。另一方面,数据经过一层层网络计算后,其数据分布也在发生着变化,会给下一层的网络学习带来困难。batchnorm就是为了解决这个分布变化问题。
BatchNorm就是对神经网络的每一层进行归一化,假设将每一层输出后的数据都归一化到0均值,1方差,满足正太分布,但是,此时有一个问题,每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。但是如果稍作修改,加入可训练的参数做归一化,那就是BatchNorm实现的了
算法流程:
输入:一个batch的样本:,和超参数
输出:
之所以称之为batchnorm是因为所norm的数据是一个batch的,假设输入数据是,输出是,batchnorm的步骤如下:
先求出此次批量数据x的均值:
求出此次batch的方差:
接下来就是对x做归一化,得到:
最重要的一步,引入缩放和平移变量,计算归一化后的值
之前也说过如果直接做归一化不做其他处理,神经网络是学不到任何东西的,但是加入这两个参数后,事情就不一样了,先考虑特殊情况下,如果γ和β分别等于此batch的标准差和均值,那么不就还原到归一化前的x了吗,也即是缩放平移到了归一化前的分布,相当于batchnorm没有起作用,β和γ分别称之为 平移参数和缩放参数。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。
batchnorm是在输入值和激活函数之间进行的,每次训练给一个批量,然后计算批量的均值方差,但是在测试的时候可不是这样,测试的时候每次只输入一张图片,这怎么计算批量的均值和方差,于是,在训练的时候实现计算好mean var测试的时候直接拿来用就可以了,不用计算均值和方差。
推荐岗位1:腾讯-机器学习方向(可内推,深圳、北京、上海、广州)
推荐岗位2:搜狗-语音增强实习(可内推)
领取专属 10元无门槛券
私享最新 技术干货