Processing math: 100%

神经网络优化篇:详解如何训练一个 Softmax 分类器(Training a Softmax classifier)

如何训练一个 Softmax 分类器

回忆一下之前举的的例子,输出层计算出的z[l]如下,z[l]=[5213]有四个分类C=4z[l]可以是4×1维向量,计算了临时变量tt=[e5e2e1e3],对元素进行幂运算,最后,如果的输出层的激活函数g[L]()Softmax激活函数,那么输出就会是这样的:

简单来说就是用临时变量t将它归一化,使总和为1,于是这就变成了a[L],注意到向量z中,最大的元素是5,而最大的概率也就是第一种概率。

Softmax这个名称的来源是与所谓hardmax对比,hardmax会把向量z变成这个向量[1000]hardmax函数会观察z的元素,然后在z中最大元素的位置放上1,其它位置放上0,所这是一个hard max,也就是最大的元素的输出为1,其它的输出都为0。与之相反,Softmax所做的从z到这些概率的映射更为温和,不知道这是不是一个好名字,但至少这就是softmax这一名称背后所包含的想法,与hardmax正好相反。

有一点没有细讲,但之前已经提到过的,就是Softmax回归或Softmax激活函数将logistic激活函数推广到C类,而不仅仅是两类,结果就是如果C=2,那么C=2Softmax实际上变回了logistic回归,因篇幅这里不会给出证明,但是大致的证明思路是这样的,如果C=2,并且应用了Softmax,那么输出层a[L]将会输出两个数字,如果C=2的话,也许输出0.842和0.158,对吧?这两个数字加起来要等于1,因为它们的和必须为1,其实它们是冗余的,也许不需要计算两个,而只需要计算其中一个,结果就是最终计算那个数字的方式又回到了logistic回归计算单个输出的方式。这算不上是一个证明,但可以从中得出结论,Softmax回归将logistic回归推广到了两种分类以上。

接下来来看怎样训练带有Softmax输出层的神经网络,具体而言,先定义训练神经网络使会用到的损失函数。举个例子,来看看训练集中某个样本的目标输出,真实标签是[0100],用上个例子,这表示这是一张猫的图片,因为它属于类1,现在假设的神经网络输出的是ˆyˆy是一个包括总和为1的概率的向量,y=[0.30.20.10.4],可以看到总和为1,这就是a[l]a[l]=y=[0.30.20.10.4]。对于这个样本神经网络的表现不佳,这实际上是一只猫,但却只分配到20%是猫的概率,所以在本例中表现不佳。

那么想用什么损失函数来训练这个神经网络?在Softmax分类中,一般用到的损失函数是L(ˆy,y)=4j=1yjlogˆyj,来看上面的单个样本来更好地理解整个过程。注意在这个样本中y1=y3=y4=0,因为这些都是0,只有y2=1,如果看这个求和,所有含有值为0的yj的项都等于0,最后只剩下y2tlogˆy2,因为当按照下标j全部加起来,所有的项都为0,除了j=2时,又因为y2=1,所以它就等于 logˆy2
L(ˆy,y)=4j=1yjlogˆyj=y2 logˆy2= logˆy2

这就意味着,如果的学习算法试图将它变小,因为梯度下降法是用来减少训练集的损失的,要使它变小的唯一方式就是使logˆy2变小,要想做到这一点,就需要使ˆy2尽可能大,因为这些是概率,所以不可能比1大,但这的确也讲得通,因为在这个例子中x是猫的图片,就需要这项输出的概率尽可能地大(y=[0.30.20.10.4]中第二个元素)。

概括来讲,损失函数所做的就是它找到的训练集中的真实类别,然后试图使该类别相应的概率尽可能地高,如果熟悉统计学中最大似然估计,这其实就是最大似然估计的一种形式。但如果不知道那是什么意思,也不用担心,用刚刚讲过的算法思维也足够了。

这是单个训练样本的损失,整个训练集的损失J又如何呢?也就是设定参数的代价之类的,还有各种形式的偏差的代价,它的定义大致也能猜到,就是整个训练集损失的总和,把的训练算法对所有训练样本的预测都加起来,

J(w[1],b[1],)=1mmi=1L(ˆy(i),y(i))

因此要做的就是用梯度下降法,使这里的损失最小化。

最后还有一个实现细节,注意因为C=4y是一个4×1向量,y也是一个4×1向量,如果实现向量化,矩阵大写Y就是[y(1)y(2) y(m)],例如如果上面这个样本是的第一个训练样本,那么矩阵Y=[001100010000],那么这个矩阵Y最终就是一个4×m维矩阵。类似的,ˆY=[ˆy(1)ˆy(2) ˆy(m)],这个其实就是ˆy(1)a[l](1)=y(1)=[0.30.20.10.4]),或是第一个训练样本的输出,那么ˆY=[0.30.20.10.4]ˆY本身也是一个4×m维矩阵。


最后来看一下,在有Softmax输出层时如何实现梯度下降法,这个输出层会计算z[l],它是C×1维的,在这个例子中是4×1,然后用Softmax激活函数来得到a[l]或者说y,然后又能由此计算出损失。已经讲了如何实现神经网络前向传播的步骤,来得到这些输出,并计算损失,那么反向传播步骤或者梯度下降法又如何呢?其实初始化反向传播所需要的关键步骤或者说关键方程是这个表达式dz[l]=ˆyy,可以用ˆy这个4×1向量减去y这个4×1向量,可以看到这些都会是4×1向量,当有4个分类时,在一般情况下就是C×1,这符合对dz的一般定义,这是对z[l]损失函数的偏导数(dz[l]=Jz[l]),如果精通微积分就可以自己推导,或者说如果精通微积分,可以试着自己推导,但如果需要从零开始使用这个公式,它也一样有用。

有了这个,就可以计算dz[l],然后开始反向传播的过程,计算整个神经网络中所需要的所有导数。

开始使用一种深度学习编程框架,对于这些编程框架,通常只需要专注于把前向传播做对,只要将它指明为编程框架,前向传播,它自己会弄明白怎样反向传播,会帮实现反向传播,所以这个表达式值得牢记(dz[l]=ˆyy)。

posted @   Oten  阅读(187)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡
点击右上角即可分享
微信分享提示