从零实现深度学习框架——Softmax回归简介
引言
本着“凡我不能创造的,我就不能理解”的思想,本系列文章会基于纯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=1Kexp(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=1Kexp(zi)exp(z1),∑i=1Kexp(zi)exp(z2),⋯,∑i=1Kexp(zi)exp(zK)](2)
该向量内所有元素总和为111,分母∑i=1Kexp(zi)\sum_{i=1}^K \exp(z_i)∑i=1Kexp(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=1Kexp(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)=−logp(y∣x)=−[ylogy^+(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时的ylogy^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⋅logy^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=1Kexp(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∑Kyllogj=1∑Kexp(wj⋅x+bj)]=l=1∑Kyl∑j=1Kexp(wj⋅x+bj)∂wk,i∂[∑j=1Kexp(wj⋅x+bj)]=l=1∑Kyl∑j=1Kexp(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=1Kexp(wj⋅x+bj)exp(wk⋅x+bk)⋅xi 与lll无关,因此可以提到求和符号左边。而∑l=1Kyl=1\sum_{l=1}^K y_l=1∑l=1Kyl=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=1Kexp(wj⋅x)exp(wk⋅x)=∑j=1Kexp[(wj−ϕ)⋅x]exp[(wk−ϕ)⋅x]=∑j=1Kexp(wj⋅x)exp(−ϕ⋅x)exp(wk⋅x)⋅exp(−ϕ⋅x)=exp(−ϕ⋅x)∑j=1Kexp(wj⋅x)exp(wk⋅x)⋅exp(−ϕ⋅x)=∑j=1Kexp(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=1Kexp(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)11+exp(w⋅x)exp(w⋅x)]=[1+exp(w⋅x)11−1+exp(w⋅x)1](20)
又令w=w2−w1w = w_2 - w_1w=w2−w1,得上式,整理后的式子与逻辑回归一致。
因此,Softmax回归实际上是逻辑回归在多分类下的一种推广。
从零实现深度学习框架——Softmax回归简介相关推荐
- 深度学习基础--SOFTMAX回归(单层神经网络)
深度学习基础–SOFTMAX回归(单层神经网络) 最近在阅读一本书籍–Dive-into-DL-Pytorch(动手学深度学习),链接:https://github.com/newmonkey/Div ...
- python学习框架图-从零搭建深度学习框架(二)用Python实现计算图和自动微分
我们在上一篇文章<从零搭建深度学习框架(一)用NumPy实现GAN>中用Python+NumPy实现了一个简单的GAN模型,并大致设想了一下深度学习框架需要实现的主要功能.其中,不确定性最 ...
- DL框架之Tensorflow:深度学习框架Tensorflow的简介、安装、使用方法之详细攻略
DL框架之Tensorflow:深度学习框架Tensorflow的简介.安装.使用方法之详细攻略 目录 Tensorflow的简介 1.描述 2.TensorFlow的六大特征 3.了解Tensorf ...
- DL框架之PyTorch:深度学习框架PyTorch的简介、安装、使用方法之详细攻略
DL框架之PyTorch:PyTorch的简介.安装.使用方法之详细攻略 DL框架之PyTorch:深度学习框架PyTorch的简介.安装.使用方法之详细攻略 目录 PyTorch的简介 1.pyto ...
- DL框架之darknet:深度学习框架darknet的简介、安装、使用方法的详细攻略
DL框架之darknet:深度学习框架darknet的简介.安装.使用方法的详细攻略 目录 darknet的简介 darknet的安装 darknet的使用方法 1.YOLO: Real-Time O ...
- 【动手学深度学习】Softmax 回归 + 损失函数 + 图片分类数据集
学习资料: 09 Softmax 回归 + 损失函数 + 图片分类数据集[动手学深度学习v2]_哔哩哔哩_bilibili torchvision.transforms.ToTensor详解 | 使用 ...
- 从零实现深度学习框架——深入浅出Word2vec(下)
引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导. 要深入理解深度学 ...
- 从零实现深度学习框架——GloVe从理论到实战
引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导.
- 从零实现深度学习框架——Seq2Seq从理论到实战【实战】
引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导.
- 从零实现深度学习框架——RNN从理论到实战【理论】
引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导.
最新文章
- 【Java基础】关键字
- Android性能优化篇 [ 谷歌官方 ]
- 大学生学业指导类书目
- Subset-Sum Problem 子集和问题
- java键盘监听keyadapter_JAVA 键盘监听当中,释放键盘并没有停止运动
- Swift教程之基本操作符
- SAP澄清概念、理清思路、组织机构
- 高平二中2021高考成绩查询,录取信息
- Eclipse 中 去掉 行末端(尾部) 的 空格。(需要「AnyEdit」插件)
- 激光雷达是什么?一文带你读懂激光雷达
- 提高办公效率的wps、office插件
- ASP.NET MVC form表单提交
- 前端3D立体魔方小游戏
- leetcode 810. Chalkboard XOR Game
- 一款简单的声控报警电路
- 电脑上的文件如何备份到服务器,教您电脑文件备份怎么弄
- php 获取到当前ip,获取当前IP地址,跳转到对应城市网站。
- ML参数及ResNet中Pre-activation和post-activation的区别
- C语言基于FOC控制算法和STM32主控芯片的双路直流无刷电机控制器源码
- java完成excel导出下载