人工智能算法学习笔记(七)——SoftMax回归

要学习softmax回归,就不得不提到前面学习过的逻辑回归。为什么呢?直接给出结论:因为类别数 k = 2 时,SoftMax 回归退化为逻辑回归!原因在后面的推导过程中给出。

一、什么是SoftMax回归

在机器学习尤其是深度学习中,softmaxsoftmax(PS:该函数被称作柔性最大值传输函数)是个非常常用而且比较重要的函数,尤其在多分类的场景中使用广泛。他把一些输入映射为010-1之间的实数,并且归一化保证和为11,因此多分类的概率之和也刚好为11
为什么叫做SoftMaxSoftMax?顾名思义,SoftMaxSoftMax由两个单词组成,其中一个是MaxMax。对于MaxMax我们都很熟悉,比如有两个变量a,ba,b。如果a>ba>b,则maxmaxaa,反之为bb。用伪码简单描述一下就是 ifa>breturna;elsebif\quad a > b\quad return\quad a; else\quad b。 另外一个单词为SoftSoft,因为MaxMax存在的问题,如果将MaxMax看成一个分类问题,就是非黑即白,最后的输出是一个确定的变量。更多的时候,我们希望输出的是取到某个分类的概率,或者说,我们希望分值大的那一项被经常取到,而分值较小的那一项也有一定的概率偶尔被取到,所以我们就应用到了SoftSoft的概念,即最后的输出是每个分类被取到的概率。

逻辑回归的分类器是以伯努利分布为模型建模的,它可以用来分两种类别;而SoftMaxSoftMax回归的分类器以多项式分布为模型建模的,它可以分多种互斥的类别

二、SoftMax回归

先给一张在讲SoftMaxSoftMax回归时很经典的图,这个图比较清晰地告诉我们softmaxsoftmax是怎么计算的,很直观明了。
人工智能算法学习笔记(七)——SoftMax回归

接下来,就要介绍SoftMaxSoftMax回归模型了。
该模型是逻辑回归模型在多分类问题上的推广,在多分类问题中,类标签yy可以取两个以上的值。 SoftMaxSoftMax回归模型对于诸如MNISTMNIST手写数字分类等问题是很有用的,该问题的目的是辨识1010个不同的单个数字。SoftMaxSoftMax回归是有监督的,当然也有与深度学习/无监督学习方法的结合。
SoftMaxSoftMax回归中,由于解决的是多分类问题,类标yy可以取kk个不同的值,因此,对于训练集{(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}\left \{ \left ( x^{(1)},y^{(1)} \right ),\left ( x^{(2)},y^{(2)} \right ),...,\left ( x^{(m)},y^{(m)} \right ) \right \},有y(i){1,2,...,k}y^{(i)}\in \left \{ 1,2,...,k \right \},(注意此处的类别下标从 11 开始,而不是00),例如,在 MNISTMNIST 数字识别任务中,我们有 k=10k=10 个不同的类别。

对于给定的测试输入xx,我们想用假设函数针对每一个类别j估算出概率值 p(y=jx)p\left(y=j\mid x \right)。也就是说,我们想估计 xx 的每一种分类结果出现的概率,
p(y=jx)=Φip\left(y=j\mid x \right)=\Phi_i ——属于某ii类别的概率,

那么必然有i=1kΦi=1\sum_{i=1}^{k}\Phi _i=1
p(y=kx)=1i=1k1Φip\left ( y=k\mid x \right )=1-\sum_{i=1}^{k-1}\Phi _i

引入T(y)T\left ( y \right )k1k-1维向量,k列
T(1)=(1000)T(2)=(0100)T(3)=(0010)...T(k1)=(0001)T(k)=(0000)T\left ( 1 \right )=\begin{pmatrix} 1\\ 0\\ 0\\ \vdots \\ 0 \end{pmatrix} T\left ( 2 \right )=\begin{pmatrix} 0\\ 1\\ 0\\ \vdots \\ 0 \end{pmatrix} T\left ( 3 \right )=\begin{pmatrix} 0\\ 0\\ 1\\ \vdots \\ 0 \end{pmatrix} ... \quad T\left ( k-1 \right )=\begin{pmatrix} 0\\ 0\\ 0\\ \vdots \\ 1 \end{pmatrix} T\left ( k \right )=\begin{pmatrix} 0\\ 0\\ 0\\ \vdots \\ 0 \end{pmatrix}

我们定义一个运算μ(y=i)=1\mu \left ( y=i \right )=1,表示y=iy=i为真,μ(y=i)=0\mu \left ( y=i \right )=0,表示y=iy=i为假。(PS:示性函数

因此有:
T(y=i)i=μ(y=i)T\left ( y=i \right )_i=\mu \left ( y=i \right )

则联合分布的概率密度函数如下:
p(y=kx)p\left ( y=k\mid x \right )
=Φ1μ(y=1)Φ2μ(y=2)...Φkμ(y=k)=\Phi _1^{\mu \left ( y=1 \right )}\Phi _2^{\mu \left ( y=2 \right )}...\Phi _k^{\mu \left ( y=k \right )}
=Φ1μ(y=1)Φ2μ(y=2)...Φk1i=1k1μ(y=i)\qquad\quad=\Phi _1^{\mu \left ( y=1 \right )}\Phi _2^{\mu \left ( y=2 \right )}...\Phi _k^{1-\sum_{i=1}^{k-1}\mu \left ( y=i \right )}
=Φ1T(y)1Φ2T(y)2...Φk1i=1k1T(y)i\qquad=\Phi _1^{T \left ( y\right )_1}\Phi _2^{T \left ( y\right )_2}...\Phi _k^{1-\sum_{i=1}^{k-1}T \left ( y\right )_i}
=exp(T(y)1lnΦ1+T(y)2lnΦ2+...+(1i=1k1T(y)i)lnΦk)\qquad\qquad\qquad\qquad\quad\qquad=exp\left ( T\left ( y \right )_1ln\Phi_1+T\left ( y \right )_2ln\Phi_2+...+\left ( 1-\sum_{i=1}^{k-1}T\left ( y \right )_i \right )ln\Phi_k \right )
=exp(T(y)1lnΦ1Φk+T(y)2lnΦ2Φk+...+T(y)k1lnΦk1Φk+lnΦk)\qquad\qquad\qquad\qquad\quad\qquad=exp\left ( T\left ( y \right )_1ln\frac{\Phi_1}{\Phi_k}+T\left ( y \right )_2ln\frac{\Phi_2}{\Phi_k}+...+T\left ( y \right )_{k-1}ln\frac{\Phi_{k-1}}{\Phi_k}+ln\Phi_k \right )
=b(y)exp(ηTT(y)a(η))\quad\quad=b\left ( y \right )exp\left ( \eta^TT\left ( y \right )-a\left ( \eta \right ) \right )

到了这一步,看着眼熟么?对!就是指数分布族
对应的,
η=[lnΦ1ΦklnΦ2ΦklnΦk1Φk]\eta =\begin{bmatrix} ln\frac{\Phi_1}{\Phi_k}\\ ln\frac{\Phi_2}{\Phi_k}\\ \vdots \\ ln\frac{\Phi_{k-1}}{\Phi_k} \end{bmatrix}
a(η)=lnΦka\left ( \eta \right )=-ln\Phi_k
b(y)=1b\left ( y \right )=1
因为ηi=lnΦiΦkΦi=Φkeηi\eta_i=ln\frac{\Phi_i}{\Phi_k}\Rightarrow\Phi_i=\Phi_ke^{\eta_i}

以及Φki=1keηi=i=1kΦi=1\Phi_k\sum_{i=1}^{k}e^{\eta_i}=\sum_{i=1}^{k}\Phi_i=1

所以Φi=eηij=1kΦj\Phi_i=\frac{e^{\eta_i}}{\sum_{j=1}^{k}\Phi_j}

重点来了:Φi\Phi_i就是我们想用假设函数针对每一个类别ii估算出概率值p(y=ix)=eηij=1kΦjp\left ( y=i\mid x \right )=\frac{e^{\eta_i}}{\sum_{j=1}^{k}\Phi_j},也就是说,我们想估计xx的每一种分类结果出现的概率。

因此呢,假设函数将要输出一个kk维的向量(向量元素的和为11)来表示这 kk个估计的概率值。那么假设函数hθ(x)h_\theta\left(x\right)形式如下:
hθ(x)=[Φ1Φ2Φk]=1kj=1eθjTx[eθ1Txeθ2TxeθkTx]h_\theta\left ( x \right )=\begin{bmatrix} \Phi_1\\ \Phi_2\\ \vdots \\ \Phi_k \end{bmatrix}=\frac{1}{\sum_{k}^{j=1}e^{\theta_j^Tx}}\begin{bmatrix} e^{\theta_1^Tx}\\ e^{\theta_2^Tx}\\ \vdots \\ e^{\theta_k^Tx} \end{bmatrix}
其中θ1,θ2,...,θkn+1\theta_1,\theta_2,...,\theta_k\in\Re^{n+1}是模型的参数。1kj=1eθjTx\frac{1}{\sum_{k}^{j=1}e^{\theta_j^Tx}}这一项对概率分布进行归一化,使得所有概率之和为11θ\theta用一个kn1k*n-1维向量来表示:
θ=[θ1θ2θk]\theta = \begin{bmatrix} \theta_1\\ \theta_2\\ \vdots \\ \theta_k \end{bmatrix}

接下来要介绍SoftMaxSoftMax损失函数了。
首先,考虑一个样本(x,y)\left(x,y\right),有P(y=ix;θ)=eθiTxj=1keθjTxP\left(y=i\mid x;\theta\right)=\frac{e^{\theta_i^Tx}}{\sum_{j=1}^{k}e^{\theta_j^Tx}},令aj=θjTxa_j=\theta_j^Tx
那么损失函数被定义为:
L(x,y^)=j=1kl{y=j}lnyj^L\left(x,\hat{y}\right)=-\sum_{j=1}^{k}l\left \{ y=j \right \}ln\hat{y_j}
这种形式的损失函数被称作交叉熵损失函数
其中y^\hat{y}是预测结果的概率值,l{y=j}l\left\{y=j\right\}是示性函数,表示yy是第jj个类别的真实值,只能取0or10 or 1.

那什么是交叉熵又要开一篇文章去介绍,给三篇文章我认为写的很不错,也比较容易理解。
理解熵与交叉熵
简单的交叉熵损失函数,你真的懂了吗?
一文搞懂交叉熵在机器学习中的使用,透彻理解交叉熵背后的直觉

接下来,要对损失函数求导了,对θj\theta_j求偏导,运用求导链式法则即可:
L(x,y^)θj=i=1kL(x,y^)yi^yi^ajajθj=i=1kl{y=i}yi^eail=1kealajθjTxθj=i=1kl{y=i}yi^eail{i=j}(l=1keal)eaieaj(l=1keal)2x=x(i=1kl{y=i}yi^eaieaj(l=1keal)2i=1kl{y=i}yi^eail{i=j}(l=1keal)(l=1keal)2)=x(i=1kl{y=i}yi^yi^yj^i=1kl{y=i}yi^yi^l{i=j})=x(yj^i=1kl{y=i}l{i=j})=x(yj^l{y=j})\frac{\partial L\left (x,\hat{y}\right )}{\partial \theta_j}=-\sum_{i=1}^{k}\frac{\partial L\left (x,\hat{y}\right)}{\partial \hat{y_i}}\frac{\partial \hat{y_i}}{\partial a_j}\frac{\partial a_j}{\partial \theta_j}\\\\ =-\sum_{i=1}^{k}\frac{l\left \{ y=i \right \}}{\hat{y_i}}\frac{\partial \frac{e^{a_i}}{\sum_{l=1}^{k}e^{a_l}}}{\partial a_j}\frac{\partial \theta_j^Tx}{\partial \theta_j}\\\\ =-\sum_{i=1}^{k}\frac{l\left \{ y=i \right \}}{\hat{y_i}}\frac{e^{a_i}\cdot l\left \{ i=j \right \}\cdot \left ( \sum_{l=1}^{k}e^{a_l} \right )-e^{a_i}\cdot e^{a_j}}{\left ( \sum_{l=1}^{k}e^{a_l} \right )^2}x\\\\ =x\left (\sum_{i=1}^{k} \frac{l\left \{ y=i \right \}}{\hat{y_i}}\frac{e^{a_i}\cdot e^{a_j}}{\left ( \sum_{l=1}^{k}e^{a_l} \right )^2}- \sum_{i=1}^{k}\frac{l\left \{ y=i \right \}}{\hat{y_i}}\frac{e^{a_i}\cdot l\left \{ i=j \right \}\cdot \left ( \sum_{l=1}^{k}e^{a_l} \right )}{\left ( \sum_{l=1}^{k}e^{a_l} \right )^2} \right )\\\\ =x\cdot \left (\sum_{i=1}^{k}\frac{l\left \{ y=i \right \}}{\hat{y_i}}\cdot \hat{y_i}\hat{y_j}- \sum_{i=1}^{k}\frac{l\left \{ y=i \right \}}{\hat{y_i}}\hat{y_i}\cdot l\left \{ i=j \right \} \right )\\\\ =x\cdot\left (\hat{y_j} - \sum_{i=1}^{k}l\left \{ y=i \right \}\cdot l\left \{ i=j \right \}\right )\\\\\\ =x\cdot\left (\hat{y_j} - l\left \{ y=j \right \}\right )

以上是对单个样本的损失函数求偏导(PS:其实就是单个样本的梯度),但实际上,我们可能有mm个样本,因此,需要累加在一起。如下所示:
θjJ(θ)=i=1mxi(yj^l{yi=j})\bigtriangledown_{\theta_j}J\left ( \theta \right ) =\sum_{i=1}^{m}x^i\cdot \left (\hat{y_j}-l\left \{ y^i=j \right\}\right)

利用梯度下降法可以求最优解,即:
θj:=θjαθjJ(θ)\theta_j:=\theta_j-\alpha\bigtriangledown_{\theta_j}J\left (\theta \right )

最后谈谈权重衰减(正则化)。
J(θ)J\left(\theta\right)加个L2L_2权重衰减项λ2i=1kj=0nθij2\frac{\lambda }{2}\sum_{i=1}^{k}\sum_{j=0}^{n}\theta_{ij}^2来修改代价函数,这个衰减项会惩罚过大的参数值,有了这个权重衰减项以后(λ>0)(\lambda > 0),代价函数就变成了严格的凸函数,这样就可以保证得到唯一的解了。

三、Softmax 回归 vs. k 个二元分类器

如果你在开发一个音乐分类的应用,需要对kk种类型的音乐进行识别,那么是选择使用softmaxsoftmax分类器呢,还是使用逻辑回归算法建立kk个独立的二元分类器呢?
这一选择取决于你的类别之间是否互斥,例如,如果你有四个类别的音乐,分别为:古典音乐、乡村音乐、摇滚乐和爵士乐,那么你可以假设每个训练样本只会被打上一个标签(即:一首歌只能属于这四种音乐类型的其中一种),此时你应该使用类别数 k=4k = 4softmaxsoftmax回归。(如果在你的数据集中,有的歌曲不属于以上四类的其中任何一类,那么你可以添加一个“其他类”,并将类别数 kk 设为55。) 如果你的四个类别如下:人声音乐、舞曲、影视原声、流行歌曲,那么这些类别之间并不是互斥的。例如:一首歌曲可以来源于影视原声,同时也包含人声 。这种情况下,使用44个二分类的逻辑回归分类器更为合适。这样,对于每个新的音乐作品 ,我们的算法可以分别判断它是否属于各个类别。
现在我们来看一个计算视觉领域的例子,你的任务是将图像分到三个不同类别中。
11 假设这三个类别分别是:室内场景、户外城区场景、户外荒野场景。你会使用sofmaxsofmax回归还是 33个逻辑回归分类器呢?
22 现在假设这三个类别分别是室内场景、黑白图片、包含人物的图片,你又会选择 softmaxsoftmax 回归还是多个逻辑回归分类器呢?
在第一个例子中,三个类别是互斥的,因此更适于选择softmaxsoftmax回归分类器 。而在第二个例子中,建立三个独立的逻辑回归分类器更加合适。

未完待续。。。