引言

本着“凡我不能创造的,我就不能理解”的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。

要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不适用外部完备的框架前提下,实现我们想要的模型。本系列文章的宗旨就是通过这样的过程,让大家切实掌握深度学习底层实现,而不是仅做一个调包侠。
本系列文章首发于微信公众号:JavaNLP

逻辑回归只能处理二分类问题,但是很多时候我们遇到的是多分类问题。此时就需要用到多元逻辑回归(multinomial logistic regression),也称为Softmax回归。本文就来了解下Softmax回归。

Softmax回归

在softmax回归中,我们希望为每个样本从KKK个类别中标记一个类别,假设只有一个类别是正确的。

我们使用下面的表示:每个输入xxx对应的输出yyy是一个长度为KKK的向量。如果类ccc是正确的类别,我们设yc=1y_c=1yc​=1,然后设置yyy向量中所有其他元素为000。即yc=1y_c=1yc​=1同时yj=0∀j≠cy_j =0 \quad\forall j \neq cyj​=0∀j​=c,这种叫作独热向量(ont-hot vector)。分类器需要输出一个估计向量y^\hat yy^​。对于每个类kkk,y^k\hat y_ky^​k​的值就是分类器对于概率p(yk=1∣x)p(y_k = 1|x)p(yk​=1∣x)的估计。

Softmax回归中使用Sigmoid函数的推广版——Softmax函数,来计算p(yk=1∣x)p(y_k=1|x)p(yk​=1∣x)。

输入一个向量z=[z1,z2,⋯,zK]z=[z_1,z_2,\cdots,z_K]z=[z1​,z2​,⋯,zK​],其中元素可以是任意值,映射它为一个概率分布,即每个元素的值被映射到(0,1)(0,1)(0,1)之间,同时所有映射值总和为111。

对于维度为KKK的向量zzz,softmax定义为:
softmax(zi)=exp⁡(zi)∑j=1Kexp⁡(zj)1≤i≤K(1)\text{softmax}(z_i) = \frac{\exp(z_i)}{\sum_{j=1}^K \exp(z_j)} \quad 1 \leq i \leq K \tag{1} softmax(zi​)=∑j=1K​exp(zj​)exp(zi​)​1≤i≤K(1)

输入向量zzz经过softmax后得到向量:
softmax(z)=[exp⁡(z1)∑i=1Kexp⁡(zi),exp⁡(z2)∑i=1Kexp⁡(zi),⋯,exp⁡(zK)∑i=1Kexp⁡(zi)](2)\text{softmax}(z) = \left[ \frac{\exp(z_1)}{\sum_{i=1}^K \exp(z_i)}, \frac{\exp(z_2)}{\sum_{i=1}^K \exp(z_i)},\cdots, \frac{\exp(z_K)}{\sum_{i=1}^K \exp(z_i)}\right] \tag{2} softmax(z)=[∑i=1K​exp(zi​)exp(z1​)​,∑i=1K​exp(zi​)exp(z2​)​,⋯,∑i=1K​exp(zi​)exp(zK​)​](2)
该向量内所有元素总和为111,分母∑i=1Kexp⁡(zi)\sum_{i=1}^K \exp(z_i)∑i=1K​exp(zi​)用于将所有的值标准化成概率。

应用Softmax

类似逻辑回归,输入是一个权重向量www和一个输入向量xxx之间的点积,加上偏差bbb。但不同的是,这里我们要为每个类提供独立的权重向量wkw_kwk​和偏差bkb_kbk​。这样,我们的每个输出类y^k\hat y_ky^​k​的概率可以计算为:
p(yk=1∣x)=exp⁡(wk⋅x+bk)∑j=1Kexp⁡(wj⋅x+bj)(3)p(y_k=1|x) = \frac{\exp(w_k \cdot x + b_k)}{\sum_{j=1}^K \exp(w_j \cdot x + b_j)} \tag{3} p(yk​=1∣x)=∑j=1K​exp(wj​⋅x+bj​)exp(wk​⋅x+bk​)​(3)

上图是公式(3)(3)(3)的可视化,Softmax有KKK个权重和偏差(上图没有体现出来)。

公式(3)(3)(3)形式看起来似乎会分别计算每个输出。相反,更常见的做法是通过向量化利用GPU来更有效地计算。我们将通过将KKK个权向量的集合表示为权矩阵WWW和偏差向量bbb。WWW的第kkk行对应于wkw_kwk​的权重向量。因此,WWW有形状[K×f][K \times f][K×f],KKK是输出类的数量,fff是输入特征的数量。偏差向量bbb对每个输出类都有一个值。如果我们用这种方式表示权值,我们可以通过一个优雅的方程来计算y^\hat yy^​,一次计算KKK个类的输出概率:
y^=softmax(Wx+b)(4)\hat y = \text{softmax}(Wx +b) \tag{4} y^​=softmax(Wx+b)(4)

Softmax回归的损失函数

Softmax回归的损失函数是将逻辑回归的损失函数从222类推广到KKK类。回顾一下,逻辑回归的交叉熵是:
LCE(y^,y)=−log⁡p(y∣x)=−[ylog⁡y^+(1−y)log⁡(1−y^)](5)L_{CE}(\hat y,y) = - \log p(y|x) = - [y\log \hat y + (1-y)\log (1 - \hat y)] \tag{5} LCE​(y^​,y)=−logp(y∣x)=−[ylogy^​+(1−y)log(1−y^​)](5)
Softmax回归的损失函数推广了上式中的这两项(当y=1y=1y=1时的ylog⁡y^y\log \hat yylogy^​和y=0y=0y=0时的(1−y)log⁡(1−y^)(1-y)\log(1-\hat y)(1−y)log(1−y^​))。对于Softmax回归,yyy和y^\hat yy^​会被表示成向量。真实标签yyy是一个带有KKK个元素的向量,每个元素都对应一个类,假设正确的类是ccc,则yc=1y_c=1yc​=1,yyy的所有其他元素都是000。模型也将生成一个带有KKK个元素的估计向量y^\hat yy^​,其中每个元素y^k\hat y_ky^​k​代表估计概率p(yk=1∣x)p(y_k=1|x)p(yk​=1∣x)。

对于单个样本xxx的损失函数,从逻辑回归推广,是KKK个输出的对数和,每个乘上对应的yky_kyk​,见下(5)(5)(5)。这正好变成了正确类别ccc的负对数概率:

从(6)(6)(6)到(7)(7)(7)是怎么转换的呢?因为只有一个类,假设记为ccc,是正确类别,向量yyy只有其对应的元素为111,比如yc=1y_c=1yc​=1同时yj=0∀j≠cy_j = 0 \quad \forall j \neq cyj​=0∀j​=c。这意味着(6)(6)(6)中的求和项都是000,除了正确类ccc对应的那项。就变成了−1⋅log⁡y^c- 1 \cdot \log \hat y _c−1⋅logy^​c​。因此交叉熵损失简单的变成了正确类别的输出概率的对数,因此称(7)(7)(7)​为负对数似然损失。

Softmax回归的梯度

当然,对于梯度下降,我们不需要损失,我们需要它的梯度。单个样本的梯度与我们在前文中看到的逻辑回归的梯度(y^−y)x(\hat y - y)x(y^​−y)x非常相似。让我们考虑一下梯度的一部分,即单个权重的导数。对于每个类kkk,输入xxx的第iii个元素的权重是wk,iw_{k,i}wk,i​,假设xxx共有nnn个特征。与wk,iw_{k,i}wk,i​有关的损失的偏导数是多少?因为kkk被占用了,因此我们用新的符号lll。

由于分母∑j=1Kexp⁡(wj⋅x+bj)\sum_{j=1}^K \exp(w_j \cdot x+ b_j)∑j=1K​exp(wj​⋅x+bj​)中包含wkw_kwk​,因此我们推导如下:

因为只有wk,i⋅xiw_{k,i}\cdot x_iwk,i​⋅xi​项与wk,iw_{k,i}wk,i​有关,其他的偏导数都是000​,所以上面进行了简化。

同理,第二项:
∂∂wk,i[∑l=1Kyllog⁡∑j=1Kexp⁡(wj⋅x+bj)]=∑l=1Kyl∂∂wk,i[∑j=1Kexp⁡(wj⋅x+bj)]∑j=1Kexp⁡(wj⋅x+bj)=∑l=1Kylexp⁡(wk⋅x+bk)⋅xi∑j=1Kexp⁡(wj⋅x+bj)\begin{aligned} \frac{\partial}{\partial w_{k,i}} \left[ \sum_{l=1}^K y_l \log \sum_{j=1}^K \exp(w_j \cdot x + b_j) \right] &= \sum_{l=1}^K y_l \frac{\frac{\partial }{\partial w_{k,i}} \left[ \sum_{j=1}^K \exp(w_j \cdot x + b_j) \right] }{\sum_{j=1}^K \exp(w_j \cdot x + b_j)} \\ &= \sum_{l=1}^K y_l \frac{\exp(w_k \cdot x + b_k) \cdot x_i}{\sum_{j=1}^K \exp(w_j \cdot x + b_j)} \end{aligned} ∂wk,i​∂​[l=1∑K​yl​logj=1∑K​exp(wj​⋅x+bj​)]​=l=1∑K​yl​∑j=1K​exp(wj​⋅x+bj​)∂wk,i​∂​[∑j=1K​exp(wj​⋅x+bj​)]​=l=1∑K​yl​∑j=1K​exp(wj​⋅x+bj​)exp(wk​⋅x+bk​)⋅xi​​​

(11)(11)(11)到(12)(12)(12)是因为exp⁡(wk⋅x+bk)⋅xi∑j=1Kexp⁡(wj⋅x+bj)\frac{\exp(w_k \cdot x + b_k) \cdot x_i}{\sum_{j=1}^K \exp(w_j \cdot x + b_j)}∑j=1K​exp(wj​⋅x+bj​)exp(wk​⋅x+bk​)⋅xi​​ 与lll无关,因此可以提到求和符号左边。而∑l=1Kyl=1\sum_{l=1}^K y_l=1∑l=1K​yl​=1,因此变成了(13)(13)(13)。

联立公式(3)(3)(3)就得到了最后的公式。

事实证明,这个导数只是kkk类的真实值(即1或0)和kkk类分类器输出的概率之间的差额。

Softmax回归与逻辑回归的关系

逻辑回归处理二分类问题,而Softmax回归可以处理多分类问题。那么它们之间有什么关系呢?

Softmax回归具有参数冗余的特点,即参数中有些是没有用的,比如从www参数向量([w1,w2,⋯,wK]T[w_1,w_2,\cdots,w_K]^T[w1​,w2​,⋯,wK​]T)中减去某个向量ϕ\phiϕ,为了方便描述,我们将偏置项bbb增广到www中,变成:
p(yk=1∣x)=exp⁡(wk⋅x)∑j=1Kexp⁡(wj⋅x)=exp⁡[(wk−ϕ)⋅x]∑j=1Kexp⁡[(wj−ϕ)⋅x]=exp⁡(wk⋅x)⋅exp⁡(−ϕ⋅x)∑j=1Kexp⁡(wj⋅x)exp⁡(−ϕ⋅x)=exp⁡(wk⋅x)⋅exp⁡(−ϕ⋅x)exp⁡(−ϕ⋅x)∑j=1Kexp⁡(wj⋅x)=exp⁡(wk⋅x)∑j=1Kexp⁡(wj⋅x)(17)\begin{aligned} p(y_k=1|x) &= \frac{\exp(w_k \cdot x)}{\sum_{j=1}^K \exp(w_j \cdot x)} \\ &= \frac{\exp[(w_k -\phi )\cdot x ]}{\sum_{j=1}^K \exp[(w_j - \phi)\cdot x]} \\ &= \frac{\exp(w_k\cdot x) \cdot \exp(-\phi \cdot x)}{\sum_{j=1}^K \exp(w_j \cdot x) \exp(- \phi \cdot x)} \\ &= \frac{\exp(w_k\cdot x) \cdot \cancel{\exp(-\phi \cdot x)} }{ \cancel {\exp(- \phi \cdot x)} \sum_{j=1}^K \exp(w_j \cdot x) } \\ &= \frac{\exp(w_k \cdot x )}{\sum_{j=1}^K \exp(w_j \cdot x )} \end{aligned} \tag{17} p(yk​=1∣x)​=∑j=1K​exp(wj​⋅x)exp(wk​⋅x)​=∑j=1K​exp[(wj​−ϕ)⋅x]exp[(wk​−ϕ)⋅x]​=∑j=1K​exp(wj​⋅x)exp(−ϕ⋅x)exp(wk​⋅x)⋅exp(−ϕ⋅x)​=exp(−ϕ⋅x)​∑j=1K​exp(wj​⋅x)exp(wk​⋅x)⋅exp(−ϕ⋅x)​​=∑j=1K​exp(wj​⋅x)exp(wk​⋅x)​​(17)
可以看到,从参数向量www中减去ϕ\phiϕ对预测结果没有任何影响,即在模型中存在多组最优解。

假设一个样本只属于一个类别,使用Softmax回归来进行分类:
p(y∣x)=1∑j=1Kexp⁡(wj⋅x)[exp⁡(w1⋅x)exp⁡(w2⋅x)⋮exp⁡(wK⋅x)](18)p(y|x) =\frac{1}{\sum_{j=1}^K \exp(w_j \cdot x ) } \begin{bmatrix} \exp(w_1 \cdot x ) \\ \exp(w_2 \cdot x ) \\ \vdots \\ \exp(w_K \cdot x) \\ \end{bmatrix} \tag{18} p(y∣x)=∑j=1K​exp(wj​⋅x)1​⎣⎢⎢⎢⎡​exp(w1​⋅x)exp(w2​⋅x)⋮exp(wK​⋅x)​⎦⎥⎥⎥⎤​(18)
当类别数为2时,
p(y∣x)=1exp⁡(w1⋅x)+exp⁡(w2⋅x)[exp⁡(w1⋅x)exp⁡(w2⋅x)](19)p(y|x) =\frac{1}{ \exp(w_1 \cdot x ) + \exp(w_2 \cdot x ) } \begin{bmatrix} \exp(w_1 \cdot x ) \\ \exp(w_2 \cdot x ) \\ \end{bmatrix} \tag{19} p(y∣x)=exp(w1​⋅x)+exp(w2​⋅x)1​[exp(w1​⋅x)exp(w2​⋅x)​](19)
利用参数冗余的特点,我们将www参数减去w1w_1w1​,(19)(19)(19)变成了

p(y∣x)=1exp⁡(0⋅x)+exp⁡[(w2−w1)⋅x][exp⁡(0⋅x)exp⁡[(w2−w1)⋅x]]=11+exp⁡[(w2−w1)⋅x][1exp⁡[(w2−w1)⋅x]]=[11+exp⁡(w⋅x)exp⁡(w⋅x)1+exp⁡(w⋅x)]=[11+exp⁡(w⋅x)1−11+exp⁡(w⋅x)](20)\begin{aligned} p(y|x) &=\frac{1}{ \exp(0 \cdot x) + \exp[(w_2 - w_1) \cdot x] } \begin{bmatrix} \exp(0 \cdot x ) \\ \exp[(w_2-w_1) \cdot x] \\ \end{bmatrix} \\ &= \frac{1}{ 1 + \exp[(w_2 - w_1) \cdot x] } \begin{bmatrix} 1\\ \exp[(w_2-w_1) \cdot x] \\ \end{bmatrix} \\ &= \begin{bmatrix} \frac{1}{ 1 + \exp(w \cdot x) }\\ \frac{\exp(w \cdot x) }{ 1 + \exp(w \cdot x) }\\ \end{bmatrix} \\ &= \begin{bmatrix} \frac{1}{ 1 + \exp(w \cdot x) }\\ 1 - \frac{1}{ 1 + \exp(w \cdot x)}\\ \end{bmatrix} \end{aligned} \tag{20} p(y∣x)​=exp(0⋅x)+exp[(w2​−w1​)⋅x]1​[exp(0⋅x)exp[(w2​−w1​)⋅x]​]=1+exp[(w2​−w1​)⋅x]1​[1exp[(w2​−w1​)⋅x]​]=[1+exp(w⋅x)1​1+exp(w⋅x)exp(w⋅x)​​]=[1+exp(w⋅x)1​1−1+exp(w⋅x)1​​]​(20)

又令w=w2−w1w = w_2 - w_1w=w2​−w1​,得上式,整理后的式子与逻辑回归一致。

因此,Softmax回归实际上是逻辑回归在多分类下的一种推广。

从零实现深度学习框架——Softmax回归简介相关推荐

  1. 深度学习基础--SOFTMAX回归(单层神经网络)

    深度学习基础–SOFTMAX回归(单层神经网络) 最近在阅读一本书籍–Dive-into-DL-Pytorch(动手学深度学习),链接:https://github.com/newmonkey/Div ...

  2. python学习框架图-从零搭建深度学习框架(二)用Python实现计算图和自动微分

    我们在上一篇文章<从零搭建深度学习框架(一)用NumPy实现GAN>中用Python+NumPy实现了一个简单的GAN模型,并大致设想了一下深度学习框架需要实现的主要功能.其中,不确定性最 ...

  3. DL框架之Tensorflow:深度学习框架Tensorflow的简介、安装、使用方法之详细攻略

    DL框架之Tensorflow:深度学习框架Tensorflow的简介.安装.使用方法之详细攻略 目录 Tensorflow的简介 1.描述 2.TensorFlow的六大特征 3.了解Tensorf ...

  4. DL框架之PyTorch:深度学习框架PyTorch的简介、安装、使用方法之详细攻略

    DL框架之PyTorch:PyTorch的简介.安装.使用方法之详细攻略 DL框架之PyTorch:深度学习框架PyTorch的简介.安装.使用方法之详细攻略 目录 PyTorch的简介 1.pyto ...

  5. DL框架之darknet:深度学习框架darknet的简介、安装、使用方法的详细攻略

    DL框架之darknet:深度学习框架darknet的简介.安装.使用方法的详细攻略 目录 darknet的简介 darknet的安装 darknet的使用方法 1.YOLO: Real-Time O ...

  6. 【动手学深度学习】Softmax 回归 + 损失函数 + 图片分类数据集

    学习资料: 09 Softmax 回归 + 损失函数 + 图片分类数据集[动手学深度学习v2]_哔哩哔哩_bilibili torchvision.transforms.ToTensor详解 | 使用 ...

  7. 从零实现深度学习框架——深入浅出Word2vec(下)

    引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导. 要深入理解深度学 ...

  8. 从零实现深度学习框架——GloVe从理论到实战

    引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导.

  9. 从零实现深度学习框架——Seq2Seq从理论到实战【实战】

    引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导.

  10. 从零实现深度学习框架——RNN从理论到实战【理论】

    引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导.

最新文章

  1. 【Java基础】关键字
  2. Android性能优化篇 [ 谷歌官方 ]
  3. 大学生学业指导类书目
  4. Subset-Sum Problem 子集和问题
  5. java键盘监听keyadapter_JAVA 键盘监听当中,释放键盘并没有停止运动
  6. Swift教程之基本操作符
  7. SAP澄清概念、理清思路、组织机构
  8. 高平二中2021高考成绩查询,录取信息
  9. Eclipse 中 去掉 行末端(尾部) 的 空格。(需要「AnyEdit」插件)
  10. 激光雷达是什么?一文带你读懂激光雷达
  11. 提高办公效率的wps、office插件
  12. ASP.NET MVC form表单提交
  13. 前端3D立体魔方小游戏
  14. leetcode 810. Chalkboard XOR Game
  15. 一款简单的声控报警电路
  16. 电脑上的文件如何备份到服务器,教您电脑文件备份怎么弄
  17. php 获取到当前ip,获取当前IP地址,跳转到对应城市网站。
  18. ML参数及ResNet中Pre-activation和post-activation的区别
  19. C语言基于FOC控制算法和STM32主控芯片的双路直流无刷电机控制器源码
  20. java完成excel导出下载

热门文章

  1. java day40【会话技术:Cookie 、会话技术:Session 、JSP:入门学习】
  2. 微信小程序scroll-view横向滚动
  3. 【UVA10537】The Toll! Revisited (逆推最短路)
  4. eclipse引入jar类包的源代码
  5. 题目1088:剩下的树(小端快排+大端判断边界)
  6. java课堂作业(四)
  7. grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
  8. LightSpeed ORM .NET简单运用
  9. 读书摘要——《凌波微步-软件开发警戒案例集》
  10. 接口Request传参的常用注解