本文主要是介绍一个例子搞懂softmax regression,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
softmax regression简介
logistic regression (LR) 常用于二分类问题。对于多分类问题,使用softmax regression (SMR) 则是一个更好的选择,SMR也是逻辑回归在多分类问题上的一个推广。
下图分别显示了LR和SMR的训练过程和差别所在:
为了适应多分类问题,SMR使用softmax函数( Φ \Phi Φ)代替了原来的sigmoid函数。在SMR中,我们定义第 i i i个样本 X i X_i Xi属于类别 j j j的概率为:
P ( y = j ∣ X i ) = Φ ( z i ) = e z i j ∑ k = 0 K e z i k , (1) P(y=j|X_i)=\Phi (z_{i})=\frac{e^{z^j_{i}}}{\sum_{k=0}^Ke^{z^k_{i}}},\tag{1} P(y=j∣Xi)=Φ(zi)=∑k=0Kezikezij,(1)
其中, z i j = w 0 j x 0 + w 1 j x 1 + . . . + w m j x m = ∑ l = 0 m w l j x l = W j T X i , (2) z^j_i=w^j_0 x_0+w^j_1 x_1+...+w^j_m x_m=\sum_{l=0}^m w_l^j x_l=W^T_jX_i, \tag{2} zij=w0jx0+w1jx1+...+wmjxm=l=0∑mwljxl=WjTXi,(2)
其中, W j T W^T_j WjT对应第j个类的样本系数。根据(1)式可以分别计算样本 X i X_i Xi属于 K K K个类的概率,且概率之和为1。现在问题来了,怎么根据式(1)和(2)来建立一个准确的SMR模型呢?我们不妨使用一个简单的例子来进行说明。
一个简单的例子
假设我们有一个包含4个训练样本的训练集,这4个样本包含2个属性并分别属于三个类
(见下表)。
样本编号 | 样本属性 | 样本类别 |
---|---|---|
X 0 X_0 X0 | (0.1,0.5) | 0 |
X 1 X_1 X1 | (1.1,2.3) | 1 |
X 2 X_2 X2 | (-1.1,-2.3) | 2 |
X 3 X_3 X3 | (-1.5,-2.5) | 2 |
望将这四个样本的类标签编码为更容易使用的格式:
{ 1 0 0 0 1 0 0 0 1 0 0 1 } \left\{ \begin{matrix} 1 & 0 & 0 \\ 0& 1& 0 \\ 0& 0& 1 \\ 0& 0&1\\ \end{matrix} \right\} ⎩⎪⎪⎨⎪⎪⎧100001000011⎭⎪⎪⎬⎪⎪⎫
属于类别0的样本(第一行)在第一个单元格中为1,属于类别1的样本(第二行)在第二个单元格中为1,以此类推。
I n p u t s D = { 0.1 0.5 1.1 2.3 − 1.1 − 2.3 − 1.5 − 2.5 } Inputs\ D=\left\{ \begin{matrix} 0.1 & 0.5 \\ 1.1& 2.3 \\ -1.1& -2.3 \\ -1.5& -2.5\\ \end{matrix} \right\} Inputs D=⎩⎪⎪⎨⎪⎪⎧0.11.1−1.1−1.50.52.3−2.3−2.5⎭⎪⎪⎬⎪⎪⎫
初始化样本系数
W = { 0.1 0.2 0.3 0.1 0.2 0.3 } W=\left\{ \begin{matrix} 0.1 & 0.2 &0.3 \\ 0.1 & 0.2 &0.3 \\ \end{matrix} \right\} W={0.10.10.20.20.30.3}
偏差项
b i a s = { 0.01 0.1 0.1 } bias=\left\{ \begin{matrix} 0.01 & 0.1& 0.1\\ \end{matrix} \right\} bias={0.010.10.1}
加入了常数项1的D
I n p u t s D = { 1 0.1 0.5 1 1.1 2.3 1 − 1.1 − 2.3 1 − 1.5 − 2.5 } Inputs\ D=\left\{ \begin{matrix} 1&0.1 & 0.5 \\ 1& 1.1& 2.3 \\ 1& -1.1& -2.3 \\ 1& -1.5& -2.5\\ \end{matrix} \right\} Inputs D=⎩⎪⎪⎨⎪⎪⎧11110.11.1−1.1−1.50.52.3−2.3−2.5⎭⎪⎪⎬⎪⎪⎫
加入了偏差项的 W W W
W = { 0.01 0.1 0.1 0.1 0.2 0.3 0.1 0.2 0.3 } W=\left\{ \begin{matrix} 0.01 & 0.1& 0.1\\ 0.1 & 0.2 &0.3 \\ 0.1 & 0.2 &0.3 \\ \end{matrix} \right\} W=⎩⎨⎧0.010.10.10.10.20.20.10.30.3⎭⎬⎫
计算系数 W W W与样本属性 D D D的乘积:
Z = W D = { 0.07 0.22 0.28 0.35 0.78 1.12 − 0.33 − 0.58 − 0.92 − 0.39 − 0.7 − 1.1 } Z=WD=\left\{ \begin{matrix} 0.07 & 0.22& 0.28\\ 0.35 & 0.78& 1.12\\ -0.33 & -0.58& -0.92\\ -0.39 & -0.7& -1.1\\ \end{matrix} \right\} Z=WD=⎩⎪⎪⎨⎪⎪⎧0.070.35−0.33−0.390.220.78−0.58−0.70.281.12−0.92−1.1⎭⎪⎪⎬⎪⎪⎫
回顾一下公式(1),根据公式(1),我们就可以计算每个样本属于每个类别的概率:
s o f t m a x = { 0.2945 0.3422 0.3633 0.2129 0.3273 0.4598 0.4286 0.3338 0.2376 0.4494 0.3296 0.2210 } softmax=\left\{ \begin{matrix} 0.2945 & 0.3422& 0.3633\\ 0.2129 & 0.3273& 0.4598\\ 0.4286 & 0.3338&0.2376\\ 0.4494 & 0.3296& 0.2210\\ \end{matrix} \right\} softmax=⎩⎪⎪⎨⎪⎪⎧0.29450.21290.42860.44940.34220.32730.33380.32960.36330.45980.23760.2210⎭⎪⎪⎬⎪⎪⎫
我们看到softmax矩阵中的每一行代表一个样本,每一列代表一个类别,每一行的元素相加为1。(样本1属于类别0的概率为0.2945,属于类别1的概率为0.3422,以此类推)
根据softmax矩阵,我们得出4个样本的预测类别分别是[2,2,0,0]。显然这个预测结果错的离谱,因为正确答案是[0,1,2,2]。这是因为我们还没有对系数 W W W进行训练,训练方法可以使用梯度下降法。但是使用梯度下降法之前,我们还得定义一下我们需要最小化的损失函数 J J J:
J ( W ) = 1 n ∑ i = 1 n H ( T i , O i ) , (3) J(W)=\frac{1}{n}\sum_{i=1}^nH(T_i,O_i),\tag{3} J(W)=n1i=1∑nH(Ti,Oi),(3)
这是n个训练样本的所有交叉熵的平均值,其中 T i T_i Ti表示第 i i i个样本的真实标签, O i O_i Oi表示第 i i i个样本的预测概率(不是预测的类别)。交叉熵函数定义为 :
H ( T i , O i ) = − ∑ m T i ∗ l o g ( O i ) . (4) H(T_i,O_i)=-\sum_m T_i*log(O_i).\tag{4} H(Ti,Oi)=−m∑Ti∗log(Oi).(4)
交叉熵计算出来为[1.2225, 1.1169, 1.4372, 1.5098](可以自己验证一下)。
为了最下化损失函数,我们需要计算损失函数的梯度: ∇ w j J ( W ) , \nabla_{w_j}J(W), ∇wjJ(W),
然后我们沿着梯度的反方向来调整样本权重系数:
w j = w j − α ∇ w j J ( W ) , j ∈ { 0 , 1 , . . . , K } . (5) w_j=w_j-\alpha\nabla_{w_j}J(W), j\in\{0,1,...,K\}.\tag{5} wj=wj−α∇wjJ(W),j∈{0,1,...,K}.(5)
使用梯度下降法,我们迭代地更新权重矩阵,直到满足设置的停止条件(达到最大迭代次数或迭代前后损失函数的值之差小于设定的阈值)。
这篇文章完全是参考一篇英文博客,符号我做了一些调整,方便以后需要的时候复习,原文地址https://www.kdnuggets.com/2016/07/softmax-regression-related-logistic-regression.html 不用翻墙
这篇关于一个例子搞懂softmax regression的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!