本篇内容为 Softmax 回归和西瓜书第 3 章线性模型 3.6 节内容:
- Softmax 回归
- 3.6 类别不平衡问题
Softmax 回归
简介
Softmax
回归模型是 logistic
回归模型在多分类问题上的推广,属于监督学习。对于诸如 MNIST 手写数字分类等问题十分有用。
对于给定的测试输入 $ x $,我们想用假设函数针对每一个类别 $ j $ 估算出概率值 $ p(y=j | x)$。也就是说,我们想估计 $ x $ 的每一种分类结果出现的概率。
假设函数形式如下:
$$ h_{\theta}(x^{(i)})=p(y^{(i)}=k|x^{(i)};\theta)=\frac{exp(\theta_j^Tx^{(i)})}{\sum_{l=1}^{k} exp(\theta_l^Tx^{(i)})} $$
其中,$j=1, 2,3,···, k$。
上式进行了归一化处理,使得所有概率之和为 1。
代价函数
softmax 回归算法的代价函数为:
$$ J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^{m}\sum_{j=1}^{k}1\{y^{(i)}=j\}log\frac{exp(\theta_j^Tx^{(i)})}{\sum_{l=1}^k\theta_l^Tx^{(i)}}\right] $$
上述公式是 logistic 回归代价函数的推广。对比 logistic 回归代价函数:
$$ J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^{m}(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))+y^{(i)}logh_{\theta}(x^{(i)}) \right] \\ =-\frac{1}{m}\left[\sum_{i=1}^{m}\sum_{j=0}^{1}1\{y^{(i)}=j\}logp(y^{(i)=j}|x^{(i)};\theta) \right] $$
可以看到,Softmax 代价函数与 logistic 代价函数在形式上非常类似,只是在 Softmax 损失函数中对类标记的 $k$ 个可能值进行了累加。
在 Softmax 回归中将 $ x $ 分类给类别 $j$ 的概率表示为:
$$ p(y^{(i)=j}|x^{(i)};\theta)=log\frac{exp(\theta_j^Tx^{(i)})}{\sum_{l=1}^k\theta_l^Tx^{(i)}} $$
将其代入logistic 回归代价函数改写后的形式,再对类标记的 $k$ 个可能值进行累加,即可得到softmax 回归算法的代价函数。
$1\{·\}$ 是示性函数,其取值规则为:$1\{值为真的表达式\} = 1$;$1\{值为假的表达式\} = 0$
接下来我们要使代价函数$J(\theta)$最小化。由于目前还没有它的闭式解法,我们使用迭代的优化算法,这里使用梯度下降法。
对其求导,得到梯度公式如下:
$$ \nabla_{\theta_{j}}J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}\left[x^{()}(1\{y^{(i)}=j\}-p(y^{(i)=j}|x^{(i)};\theta) ) \right] $$
符号 $\nabla_{\theta_{j}}$ 的含义:
$\nabla_{\theta_{j}}J(\theta)$ 本身是一个向量。它的第 $l$ 个元素 $\frac{\partial J(\theta)}{\partial \theta_{jl}}$ 是 $J(\theta)$ 对 $\theta_{j}$ 的第 $l$ 个分量的偏导数。
我们将上面的偏导数公式代入到梯度下降算法中,来最小化 $J(\theta)$。
在梯度下降法的标准实现中,每一次迭代需要进行如下更新:
$$ \theta_{j}: = \theta_{j}-\alpha\nabla_{\theta_{j}}J(\theta) $$
其中,$J = 1,2,···,k$。
在实现 softmax 回归算法时,我们通常会使用上述代价函数的一个改进版本,和权重衰减一起使用 (weight decay),即加入一个权重衰减项。接下来分别介绍使用它的动机和细节。
Softmax 回归模型参数化的特点
下面我们来说明使用权重衰减的动机。
Softmax 回归有一个不寻常的特点:它有一个“冗余”的参数集。我们之所以在代价函数中加入权重衰减,是为了解决 softmax 回归的参数冗余所带来的数值问题。
那么什么是 softmax 回归的参数冗余所带来的数值问题呢?
首先,让我们来看假设函数的一个变化。我们上面已经说明了假设函数如下:
$$ h_{\theta}(x^{(i)})=p(y^{(i)}=k|x^{(i)};\theta)=\frac{exp(\theta_j^Tx^{(i)})}{\sum_{l=1}^{k} exp(\theta_l^Tx^{(i)})} $$
从上述假设函数的参数向量 $\theta_{j}$ 中减去一个向量 $\psi$。式子变形为:
$$ p(y^{(i)}=k|x^{(i)};\theta)=\frac{exp((\theta_j-\psi)^Tx^{(i)})}{\sum_{l=1}^{k} exp((\theta_l-\psi)^Tx^{(i)})} \\ =\frac{exp(\theta_j^Tx^{(i)}) exp(-\psi^T x^{(i)})}{\sum_{l=1}^{k} exp(\theta_l^Tx^{(i)})exp(-\psi^T x^{(i)})} \\ =\frac{exp(\theta_j^Tx^{(i)})}{\sum_{l=1}^{k} exp(\theta_l^Tx^{(i)})} $$
这也就是说,从 $\theta_{j}$ 中减去 $\psi$ 完全不影响假设函数的预测结果。
这表明前面的 softmax 回归模型中存在冗余的参数。更具体的说 Softmax 模型被过度参数化了。对于任意一个用于拟合数据的假设函数,可以求出多组参数值,这些参数得到的是完全相同的假设函数 $h_{\theta}$。
这样一来,使最小化 $J(\theta)$ 的解就不是唯一的。也就是说,如果 $(\theta_1,\theta_2,···,\theta_k)$ 是代价函数 $J(\theta)$ 的极小值点,那么 $(\theta_1-\psi,\theta_2-\psi,···,\theta_k-\psi)$ 同样也是它的极小值点。
由于 $J(\theta)$ 仍然是一个凸函数,因此梯度下降时不会遇到局部最优解的问题。但是 Hessian 矩阵是奇异的/不可逆的,这会直接导致采用牛顿法优化就遇到数值计算的问题。
这样,我们就能用零向量来替换某些参数,且这种变换不会影响假设函数,因此我们可以去掉某些参数向量来优化算法。但在实际应用中,为了使算法实现更简单清楚,往往保留所有参数 $(\theta_1, \theta_2,\ldots, \theta_n)$,而不任意地将某一参数设置为 0。
此时我们需要对代价函数做一个改动:加入权重衰减。
权重衰减
下面我们来介绍加入权重衰弱的具体实现。
我们通过添加一个权重衰减项 $\frac{\lambda}{2} \sum_{i=1}^k \sum_{j=0}^{n} \theta_{ij}^2$ 来修改代价函数,这个衰减项会惩罚过大的参数值,现在我们的代价函数变为:
$$ J(\theta) = - \frac{1}{m} \left[ \sum_{i=1}^{m} \sum_{j=1}^{k} 1\left\{y^{(i)} = j\right\} \log \frac{e^{\theta_j^T x^{(i)}}}{\sum_{l=1}^k e^{ \theta_l^T x^{(i)} }} \right] + \frac{\lambda}{2} \sum_{i=1}^k \sum_{j=0}^n \theta_{ij}^2 $$
有了这个权重衰减项以后($ \lambda > 0$),代价函数就变成了严格的凸函数,这样就可以保证得到唯一的解了。
此时的 Hessian 矩阵变为可逆矩阵,并且因为 $ J(\theta)$ 是凸函数,梯度下降法和 L-BFGS 等算法可以保证收敛到全局最优解。
下面我们求这个新函数 $ J(\theta)$ 的导数,如下:
$$ \nabla_{\theta_j} J(\theta) = - \frac{1}{m} \sum_{i=1}^{m}{ \left[ x^{(i)} ( 1\{ y^{(i)} = j\} - p(y^{(i)} = j | x^{(i)}; \theta) ) \right] } + \lambda \theta_j $$
然后代入梯度下降算法中来最小化 $J(\theta)$,我们就能实现一个可用的 softmax 回归模型。
Softmax 回归与 Logistic 回归的关系
当类别数 $k = 2$ 时,softmax 回归退化为 logistic 回归。这表明 softmax 回归是 logistic 回归的一般形式。
具体地说,当 $k = 2$ 时,softmax 回归的假设函数为:
$$ h_\theta(x) = \frac{1}{ e^{\theta_1^Tx} + e^{ \theta_2^T x^{(i)} } } \begin{bmatrix} e^{ \theta_1^T x } \\ e^{ \theta_2^T x } \end{bmatrix} = \begin{bmatrix} \frac{1}{ 1 + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \\ 1 - \frac{1}{ 1 + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \\ \end{bmatrix} $$
利用 softmax 回归参数冗余的特点,我们令 $\psi = \theta_1$,并且从两个参数向量中都减去向量 $\theta_1$,得到:
$$ h(x) = \frac{1}{ e^{\vec{0}^Tx} + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \begin{bmatrix} e^{ \vec{0}^T x } \\ e^{ (\theta_2-\theta_1)^T x } \end{bmatrix} \\ = \begin{bmatrix} \frac{1}{ 1 + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \\ \frac{e^{ (\theta_2-\theta_1)^T x }}{ 1 + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \end{bmatrix} \\ = \begin{bmatrix} \frac{1}{ 1 + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \\ 1 - \frac{1}{ 1 + e^{ (\theta_2-\theta_1)^T x^{(i)} } } \\ \end{bmatrix} $$
因此,用 $\theta'$ 来表示 $\theta_2-\theta_1$,我们就会发现 softmax 回归器预测其中一个类别的概率为 $\frac{1}{ 1 + e^{ (\theta')^{T} x^{(i)} } }$,另一个类别概率的为 $1 - \frac{1}{ 1 + e^{ (\theta')^T x^{(i)} } }$,这与 logistic回归是一致的。
Softmax 回归 vs. k 个二元分类器
我们用 Softmax 回归解决多分类问题,也可以使用多个二元分类器来完成多分类任务。
下面用一个例子来说明。
如果你在开发一个音乐分类的应用,需要对 k 种类型的音乐进行识别,那么是选择使用 softmax 分类器呢,还是使用 logistic 回归算法建立 k 个独立的二元分类器呢?
这一选择取决于你的类别之间是否互斥,例如,如果你有四个类别的音乐,分别为:古典音乐、乡村音乐、摇滚乐和爵士乐,那么你可以假设每个训练样本只会被打上一个标签,此时你应该使用类别数 k = 4 的 softmax 回归。
如果你的四个类别如下:人声音乐、舞曲、影视原声、流行歌曲,那么这些类别之间并不是互斥的。例如:一首歌曲可以来源于影视原声,同时也包含人声 。这种情况下,使用 4 个二分类的 logistic 回归分类器更为合适。这样,对于每个新的音乐作品 ,我们的算法可以分别判断它是否属于各个类别。
也就是说,当我们要进行分类的类别互斥时,使用 softmax 回归;而当它们存在包含关系时,使用多个二分类的 logistic 回归分类器更好。
类别不平衡问题
问题的提出
类别不平衡 (class-imbalance) 就是指分类任务中不同类别的训练样例数目差别很大的情况。
例如有 998 个反例,但正例只有 2 个,那么学习方法只需返回一个永远将新样本预测为反例的学习器,就能达到 99.8% 的精度。然而这样的学习器往往没有价值,因为它不能预测出任何正例。
因此,我们有必要了解类别不平衡性处理的基本方法。
基本策略
当我们用 $y=w^Tx+b$ 对新样本 $x$ 进行分类时,实际是在用预测出的 $y$ 值与一个阈值进行比较。
当不同类别的训练样例数目相当时,通常在 $y>0.5$ 时判别为正例,否则为反例,阈值设为 0.5 表明分类器认为真实正、反例可能性相同,即分类器决策规则为:若$\frac{y}{1-y}>1$,则预测为正例。
当训练集中正、反例的数目不同时,令 $m^+$ 表示正例数目,$m^-$ 表示负例数目,则观察几率是$\frac{m^+}{m^-}$。当分类器的预测几率高于观测几率就应判定为正例,即分类器决策规则为:若$\frac{y}{1-y}>\frac{m^+}{m^-}$,则预测为正例。
我们通常假设训练集是真实样本总体的无偏采样,因此观测几率就代表了真实几率。
对上式进行微调,使得在基于式$\frac{y}{1-y}>1$(分类器基于此式进行决策)决策时,实际是在执行$\frac{y}{1-y}>\frac{m^+}{m^-}$,只需令:
$$ \frac{y'}{1-y'}=\frac{y}{1-y}\times\frac{m^+}{m^-} $$
这就是类别不平衡学习的一个基本策略——再缩放 (recaling)。
由于这一策略所基于的“训练集是真实样本总体的无偏采样”这个假设往往不成立,因此实际操作并不容易,现在技术大体上有下面的三类做法。
常用方法
欠采样
对训练集里的反类样例进行“欠采样”。去除一些反例使得正、反例数目接近,然后再进行学习。由于丢弃了很多反例,使得分类器训练集远小于初始训练集。
代表算法:EasyEnsemble
利用集成学习机制,将反例划分为若干个集合供不同学习器使用,这样对每个学习器来看都进行了欠采样,但在全局来看却不会丢失重要信息。
算法原理:
- 首先通过从多数类中独立随机抽取出若干子集。
- 将每个子集与少数类数据联合起来训练生成多个基分类器。
- 最终将这些基分类器组合形成一个集成学习系统。
EasyEnsemble 算法被认为是非监督学习算法,因此它每次都独立利用可放回随机抽样机制来提取多数类样本。
过采样
对训练集里的正类样例进行“过采样”。增加一些正例使得正、反例数目接近,然后再进行学习。由于增加了很多正例,其训练集大于初始训练集,时间开销远大于欠采样。
代表算法:SMOTE
通过对训练集里的正例进行插值来产生额外的正例。
算法原理:
SMOTE 算法是建立在相距较近的少数类样本之间的样本仍然是少数类的假设基础上的,它是利用特征空间中现存少数类样本之间的相似性来建立人工数据的。这里我们简单的介绍 SMOTE 算法的思想。
下图表示一个数据集:
可以看出,蓝色样本数量远远大于红色样本,在常规调用分类模型去判断的时候可能会导致之间忽视掉红色样本带了的影响,只强调蓝色样本的分类准确性,因此需要增加红色样本来平衡数据集。
先随机选定 n 个少类的样本:
再找出最靠近它的 m 个少类样本:
再任选最临近的 m 个少类样本中的任意一点:
在这两点上任选一点,这点就是新增的数据样本。
阈值移动
基于原始训练集进行学习,但在用训练好的分类器进行预测时,将再缩放的公式 $\frac{y'}{1-y'}=\frac{y}{1-y}\times\frac{m^+}{m^-}$ 嵌入到决策过程中,称为“阈值移动”。
参考链接:
Softmax回归
交叉熵代价函数(损失函数)及其求导推导
牛顿法与Hessian矩阵
L-BFGS
Python:SMOTE算法
SMOTE算法(人工合成数据)
深度 | 解决真实世界问题:如何在不平衡类上使用机器学习?
$$ $$
不足之处,欢迎指正。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。