Softmax回归
softmax 回归是 logistic 回归的一般化,适用于K分类的问题,即多分类问题。针对于每个类别都有一个参数向量 θ (即每个类别都一套对应该类别的 ),第k类的参数为向量
,组成的二维矩阵为
*n;
softmax 只适用于样本单分类。例如,输入一张图片,softmax 可以判断这张图片中属于哪一种类别的动物,不能判断这张图片中属于哪几种类别的动物。softmax 的损失函数决定了每个样本只有一种类别的概率很大,分到其他类别的概率会很小。
softmax 函数的本质就是将一个K维的任意实数向量压缩(映射)成另一 个K维的实数向量,其中向量中的每个元素取值都介于(0,1)之间。即将样本特征值映射到(0,1)之间,可以看成概率来理解。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。
Softmax算法原理(预测过程)
softmax 回归概率函数为:
其中,小写 k 表示各个类别,大写 K 表示总类别数。 表示第 k 个类别对应的线性回归拟合函数。分子可以看成是某样本在某个类别上的拟合程度的指数,分母可以看成是某样本各个类别上的拟合程度的指数之和。Softmax 将多分类的输出数值转化为相对概率,更容易理解和比较,最后的输出是每个分类被取到的概率。
下面举个通俗的例子,假设有5个类别:猫,狗,鸡,鸭,鼠。我们要判断一张图片(图片上只有一种动物)应该分类为哪个类别,样本的特征分别是:头,尾巴,前脚,后脚,身体。如下图所示,以该图片作为一个样本:
于是,我们想知道当输入这个样本时,输出为猫的概率,上述 softmax 回归概率函数可以形象的表示为:
然后我们把上面的Softmax物理意义图拆分一下, 变成如下图
没错 ,预测结果与输入特征之间存在明显相关性。并且,Softmax 具有更好的解释性,包含属于猫的这一类的特征越多,输出为猫的概率就越大。(插播一句,这里所谓的概率,是相对概率,而不是绝对概率,假设上图P输出的概率为0.75,物理含义是,当输入为X时,预测为猫的概率是预测不是猫的概率的3倍)上面的情况是假设不同特征是相互独立的。
然而,这可能在许多情况下不成立,因为特征之间可能存在协同作用或冗余,这种协同或者作用会直接影响输出概率,比如猫前脚和猫后脚。为了解决这种情况,我们可以:
1)去除有协同作用或冗余的特征,如x3 =X1⋅x2x3=x1⋅x2(但是如果我们不知道哪些特征值是相关的,我们可能会引入更多无用的特征!
2)当两个特征经常一起被激活时,训练过程将学习较小的权重W1和W2,使得它们的联合效果更接近真实效果
上面的例子取自 https://cloud.tencent.com/developer/news/307323 ,感谢作者。
softmax 是解决K分类的问题,所以对于每一个分类,都需要计算出一个与之对应的拟合函数,所以每个拟合函数都对应一组值,K 分类就有K组不同的
值。即每个样本在模型中都需要计算 K 次,表示该样本在每个分类上的概率。于是将上面的 softmax 回归概率函数推广到对 K 个类别都计算一次的情况,即可得到:
上式应该是 softmax 回归完整的概率函数,其中, i 表示第 i 个样本,p(...) 表示该样本在每个分类上的概率,一共有k个类别,所以每个样本都会有 k 个概率,即这里的 p(...) 。最后面的关于 的矩阵表示我们最终的目的就是求出最合适的
矩阵,即求出该矩阵内所有元素的值。
为什么要求 的值?因为
是 softmax 回归的概率函数中的自变量 x 的系数,求出
,即可求出 softmax 回的概率函数,即模型。这里要清楚我们的最终目的是什么,就是求所有的
值。
Softmax算法损失函数(训练过程)
由上面的论述我们可以知道,每一个用来训练模型的样本都对应一个 ,所以 softmax 回归的似然函数就是所有训练样本所对应的的
的乘积。为什么是乘积?见之前 ' 线性回归&逻辑回归 ' 博客,其中有解答。
1. softmax 的似然函数:
上式中,k 表示样本 i 的标签类别为类别 k,K 表示类别总数,j 表示第 j 个类别,m 表示样本总数。
表示的是:模型计算出的该样本在标签类别(实际类别)上的概率。
上述softmax 的似然函数可表述为:各个样本在其的标签类别上模型计算出的概率的乘积。
2. softmax 的损失函数:
损失函数一般都是似然函数推到出来的,这里 softmax 回归的似然函数是概率相乘的结果,对似然函数取对数即可转化成相加。为什么要取对数?因为相乘的计算量比较大,取对数后即可转换成加运算,计算量会小很多。由此可以得到 softmax 的损失函数,如下:
这里m表示所有样本的数量,k为类别数量,j 表示第 j 个类别,i 表示第 i 个样本。
假设一个样本 i,其标签为类别 a,样本总量为 n 。上式可表述为:各个样本在其标签类别上模型计算出的概率取对数再相加求和。就是说,如果模型计算出样本 i 的类别为 b,而样本 i 的实际类别为 a,这种情况下预测结果和实际结果不一致的话,损失函数不会计算模型计算样本 i 在类别为 b 上的概率(实际上是被I()函数赋值为0了,这就是I()函数的作用),还是只计算样本 i 在类别 a 上模型计算出的概率。即要保证样本在标签类别上计算出的概率越大越好,即上式掉前面的 ,剩下的部分要越大越好 ( 其实剩下的部分就是似然函数,前提是如果上面损失函数的类别 j 表示样本 i 的标签类别(实际类别),上式的
可以去掉。就和上面的似然函数一致了 ) ,表示要尽量让样本 i 分类为类别 a 的概率最大。对于所有样本都要如此。
中的符号主要是为了方便使用梯度下降求最小值,而除以 m 只是为了平均一下,无伤大雅。
损失函数取到最小值时,此时的 值即为最合适的,代入 softmax 回归概率函数即可。
预测过程就是:用训练出的模型(即回归概率函数)对每个样本在每个分类上的概率都计算一下,然后取概率值最大的那个分类作为该样本的分类。
3. 标签平滑
上面的损失函数其实是点缺陷的,会导致模型的精准程度降低,上面的损失函数只考虑模型计算出的各个样本在其标签类别(实际类别)上的概率,默认样本在非标签类别(实际类别)上的概率为0(因为I()函数),实际上样本在非标签类别(实际类别)上的概率不是0,是有值的,而我们要保证这些值应该越小越好,所以可以定义 在
的情况下的值为一个很小的超参,比如 0.01,而不是直接设置为 0 。这样将 ' 样本在非标签类别(实际类别)上的概率 ' 也考虑到损失函数中,更为科学。
补充
最后,softmax 和 k个二元分类器(例如逻辑回归) 之间应该如何选择呢?
1. 如果样本最后只能分类为1个类别,例如一张图片只有猫,在猫、狗、鼠中,最后被分类为猫,适合用softmax
2. 如果样本最后能分类为n个类别,例如一张图片上有猫和狗,在猫、狗、鼠中,最后被分类为猫和狗,适合用n个二元分类器(第一步判断是猫/非猫,判断完成后该分类器判断是狗/非狗,以此类推)
参考资料:
CNN入门讲解:我的Softmax和你的不太一样 - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/news/307323