1. softmax回归是分类问题

  回归(Regression)是用于预测某个值为“多少”的问题,如房屋的价格、患者住院的天数等。

  分类(Classification)不是问“多少”,而是问“哪一个”,用于预测某个事物属于哪个类别,如该电子邮件是否是垃圾邮件、该图像是猫还是狗、该用户接下来最有可能看哪部电影等。

  分类问题也有些许差别:(1)我们只对样本的硬性类别感兴趣,即属于哪个类别;(2)我们希望得到软性类别,即每个类别的概率是多少。这两者的界限往往很模糊,我们通常使用软性类别的模型来进行硬性分类。这也是softmax模型的原理。

2. 如何表示分类问题——独热编码(one-hot encoding)

  我们需要在分类问题中表示类别(标签)。最直接的想法是选择 $y\in \left\{1,2,3 \right\}$ ,其中的整数分别代表每个类别,如果类别之间有一些自然顺序,比如 $\left\{\text{婴儿},\text{儿童},\text{青少年},\text{年青人},\text{中年人},\text{老年人}\right\}$ ,那么将这个问题转变为回归问题并保留这种格式是有意义的。

  但是,一般的分类问题并不与类别之间的自然顺序有关。对此,我们使用一种简单的表示方法:独热编码(one-hot encoding)。独热编码是一个向量,它的分量和类别数目一样多,类别对应的分类设置为 $1$ ,其他所有分量设置为 $0$ 。

  例如,一个图像分类问题,输入图像是一个 $2\times 2$ 的灰度图像,可以用一个标量表示每个像素值,每个图像对应四个特征 $x_{1},x_{2},x_{3},x_{4}$ 。输入图像被分类为“猫”、“狗”、“鸡”,那么标签 $y$ 就是一个三维向量,其中 $\left(1,0,0\right)$ 对应于“猫”, $\left(0,1,0\right)$ 对应于“狗”,$\left(0,0,1\right)$ 对应于“鸡”:

$$y\in\left\{\left(1,0,0\right),\left(0,1,0\right),\left(0,0,1\right)\right\}$$

3. 网络结构

  为了获得所有可能类别的概率,我们需要一个多输出的模型,每个类别对应一个输出。为了实现线性模型的分类,我们需要和输出一样多的仿射函数,每个输出对应于自己的仿射函数。

  在我们提出的例子中,由于我们有 $4$ 个特征和 $3$ 个可能的输出类别,我们将需要 $12$ 个标量来表示权重( $w$ ), $3$ 个标量来表示偏置( $b$ )。下面根据输入特征来计算三个预测:$o_{1},o_{2},o_{3}$  。

$$o_{1} = w_{11}x_{1} + w_{12}x_{2} + w_{13}x_{3} + w_{14}x_{4} + b_{1}$$

$$o_{2} = w_{21}x_{1} + w_{22}x_{2} + w_{23}x_{3} + w_{24}x_{4} + b_{2}$$

$$o_{3} = w_{31}x_{1} + w_{32}x_{2} + w_{33}x_{3} + w_{34}x_{4} + b_{3}$$

  由于计算每个输出 $o_{1},o_{2},o_{3}$ 取决于输入的 $x_{1},x_{2},x_{3},x_{4}$ ,所以softmax回归的输出层也是全连接层。

  我们使用线性代数符号简洁地表达模型,模型的向量形式为:

$$\textbf o = \textbf W \textbf x + \textbf b$$

  其中, $\textbf o \in \mathbb R^{3}$ , $\textbf W \in \mathbb R^{3 \times 4}$ , $\textbf x \in \mathbb R^{4}$ , $\textbf b \in \mathbb R^{3}$ ,权重 $\textbf W$ 为一个 $3 \times 4$ 的矩阵,对于给定数据样本的特征 $\textbf x$ ,我们的输出 $\textbf o$ 是由权重与输入特征进行矩阵-向量乘法再加上偏置 $\textbf b$ 得到的。

4. softmax运算

  这里使用的方法是,将模型的输出视为概率。

  我们希望模型的输出 $\hat{y_{j}}$ 可以视为属于类别 $j$ 的概率。然后,选择最大输出值的类别 $\mathop{\arg\max}_{j}y_{j}$ 做为我们的预测。例如,如果 $\hat{y_{1}}$ , $\hat{y_{2}}$ , $\hat{y_{3}}$ 分别为 $0.1$ , $0.8$ , $0.1$ ,那么我们预测的类别就是 $2$ ,在我们的例子中代表“狗”。

  为什么我们不可以用预测 $\textbf o$ 直接作为输出呢?一方面,这些值的总和不一定为 $1$ ;另一方面,这些值可以为负数。

  要将输出视为概率,我们必须保证模型在任何数据上的输出都是非负值且总和为 $1$ 。此外,还需要一个训练目标,来使模型能精准的估计概率。如在输出为 $0.5$ 的所有样本中,我们希望有一半实际上属于预测的类别。这个属性叫做校准(calibration)。

  我们使用softmax函数来将未归一化的预测变换为非负且总和为 $1$ ,同时模型可导。我们首先对每个未归一化的预测求幂,这样可以保证输出非负。为了保证输出总和为 $1$ ,我们再对每个求幂后的结果除以它们的总和。公式如下:

$$\hat{\textbf y} = softmax\left( \textbf o \right) \qquad\text{其中}\qquad \hat{y_{j}} = \frac{\exp{o_{j}}}{\sum_{k}\exp{o_{k}}}$$

  如上所示,对所有的 $j$ 都有 $0 \le \hat{y_{j}} \le 1$ ,因此,输出 $\hat{\textbf y}$ 可以视为一个概率分布。

  softmax运算不会改变预测 $\textbf o$ 之间的顺序,只会确定每个输出类别的概率。因此,在预测过程中,我们有:

$$\mathop{\arg\max}_{j}\hat{y_{j}} = \mathop{\arg\max}_{j}o_{j}$$

  尽管softmax是一个非线性函数,但softmax回归的输出仍然由输入特征的仿射变换决定。因此,softmax回归是一个线性模型。

5. softmax运算的矢量化

  假设我们读取一个批量的样本 $\textbf X$ ,每个样本有 $d$ 个特征,批量大小为 $n$ ,输出类别数量为 $q$ 。那么批量样本特征为 $\textbf X \in \mathbb{R^{n \times d}}$ ,权重为 $\textbf W \in \mathbb{R^{d \times q}}$ ,偏置为 $\textbf b \in \mathbb{R^{1 \times q}}$ ,于是,softmax回归的矢量计算表达式为:

$$\textbf O = \textbf X \textbf W + \textbf b$$

$$\hat{\textbf Y} = softmax \left( \textbf O \right)$$

  $\textbf O \in \mathbb{R^{n \times q}}$ ,$+\textbf b$ 求和使用广播,$softmax$ 运算按行进行, $\hat{\textbf Y} \in \mathbb{R^{n \times q}}$ 。

6. 损失函数——交叉熵损失(cross-entropy loss)

  在softmax回归中,我们使用交叉熵损失来衡量预测和真实值之间的区别。

  $softmax$ 函数将为归一化的输出 $\textbf o$ 映射为一个向量 $\hat{\textbf y}$ ,我们可以将其视为给定任意输入 $\textbf x$ 的每个类别的估计条件概率,假设整个数据集 $\left\{\textbf X,\textbf Y \right\}$ 具有 $n$ 个样本,其中索引为 $i$ 的样本由特征向量 $\textbf x^{\left( i \right)}$ 和独热标签向量 $\textbf y^{\left( i \right)}$ 组成。

  对于任意标签 $\textbf y$ 和模型预测 $\hat{\textbf y}$ ,我们的损失函数(交叉熵损失)为:

$$l\left( \textbf y,\hat{\textbf y}\right) = - \sum_{j=1}^{q}y_{j}\log{\hat{y}_{j}}$$

  独热标签向量 $\textbf y$ 中,只有一个分量为 $1$ 其余都为 $0$ ,于是损失函数又可以写做:

$$l\left( \textbf y,\hat{\textbf y}\right) = - \log{\hat{y}_{y}}$$

  根据softmax的定义,将损失函数展开为:

$$l\left( \textbf y,\hat{\textbf y}\right) = - \sum_{j=1}^{q} y_{j} \log{ \frac{ \exp{\left( o_{j}\right)} }{ \sum{_{k=1}^{q}\exp{\left(o_{k}\right)}} } }$$

$$= \sum^{q}_{j=1} \log{ \sum^{q}_{k=1} \exp{\left(o_{k}\right)} } - \sum^{q}_{j=1}y_{j}o_{j}$$

$$= \log{  \sum^{q}_{k=1}\exp{\left(o_{k}\right)}  } - \sum^{q}_{j=1}y_{j}o_{j}$$

  损失函数对任何预测 $o_{j}$ 求导:

$$\frac{\partial l\left( \textbf y,\hat{\textbf y}\right)}{\partial o_{j}} = \frac{\exp{o_{j}}}{\sum^{q}_{k=1}\exp{o_{k}}} - y_{i} = softmax\left(\textbf o \right)_{j} - y_{j}$$

  由上式知,导数是我们模型得到的概率与实际之间的差异。

本文为学习笔记,学习内容来自李沐 https://zh-v2.d2l.ai/

【深度学习】softmax回归——原理、one-hot编码、结构和运算、交叉熵损失的更多相关文章

  1. 5 TensorFlow实战Google深度学习框架一书中的错误两处(交叉熵定义有误)

    第一处: 书中62页定义的交叉熵函数定义有误,虽然这个所谓交叉熵的数值能够减少,但是是不能提升预测性能的,因为定义就错了. 我已经将预测过程可视化,直接将交叉熵改为我的,或者用原书的,就可以看到预测结 ...

  2. UFLDL深度学习笔记 (五)自编码线性解码器

    UFLDL深度学习笔记 (五)自编码线性解码器 1. 基本问题 在第一篇 UFLDL深度学习笔记 (一)基本知识与稀疏自编码中讨论了激活函数为\(sigmoid\)函数的系数自编码网络,本文要讨论&q ...

  3. 深度学习Anchor Boxes原理与实战技术

    深度学习Anchor Boxes原理与实战技术 目标检测算法通常对输入图像中的大量区域进行采样,判断这些区域是否包含感兴趣的目标,并调整这些区域的边缘,以便更准确地预测目标的地面真实边界框.不同的模型 ...

  4. 机器学习(2):Softmax回归原理及其实现

    Softmax回归用于处理多分类问题,是Logistic回归的一种推广.这两种回归都是用回归的思想处理分类问题.这样做的一个优点就是输出的判断为概率值,便于直观理解和决策.下面我们介绍它的原理和实现. ...

  5. 深度学习中Dropout原理解析

    1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象. 在训练神经网络的时候经常会遇到过拟合的问题 ...

  6. Hebye 深度学习中Dropout原理解析

    1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象. 在训练神经网络的时候经常会遇到过拟合的问题 ...

  7. Softmax 回归原理介绍

    考虑一个多分类问题,即预测变量y可以取k个离散值中的任何一个.比如一个邮件分类系统将邮件分为私人邮件,工作邮件和垃圾邮件.由于y仍然是一个离散值,只是相对于二分类的逻辑回归多了一些类别.下面将根据多项 ...

  8. 深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)

    1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')  # 对数据进行卷积操作 参数说明:x表示输入数据,w表示卷积核, stride ...

  9. 动手学深度学习5-softmax回归

    softmax回归 softmax 回归模型 单样本分类的矢量计算表达式 小批量样本分类的矢量计算表达式 交叉熵损失函数 模型预测以及评价 小结 softmax回归 前几节介绍的是线性回归模型适用于输 ...

随机推荐

  1. Qt 中的属性系统(Property System)

    21 人赞同了该文章 本节内容主要讲解我对 Qt 属性系统的理解.官方文档参考 The Property System. 如何理解"属性系统"这个概念? 一般我们说一个类有什么属性 ...

  2. 【面试题】挑战10个最难回答的Java面试题(附答案)

    转自:https://mp.weixin.qq.com/s/Kd-2qkDfaokHU7d2nfsE6w 1.为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Jav ...

  3. spring boot纯注解开发模板

    简介 spring boot纯注解开发模板 创建项目 pom.xml导入所需依赖 点击查看源码 <dependencies> <dependency> <groupId& ...

  4. Linux系统的内核编译

    <1>给虚拟机分配2048M内存 <2>配置高可用yum源 <3>下载软件 <1>安装内核源码包 根据依赖性提示,安装对应的包 下载并安装软件包(3个) ...

  5. sublime text build system automatic ctrl/cmd+B自动选择 python2 或 python3

    背景 我同时安装了 python2 和 python3 时,python 指向 python2,python3 才是 python3 默认情况下,在 Sublime 内 Ctrl/Cmd + B 运行 ...

  6. 云原生学习筑基 ~ 组网必备知识点 ~ DNS服务

    @ 目录 一.为啥写这篇文章? 二.DNS的作用 三.域 四.DNS工作原理 五.搭建DNS服务器 5.1.Bind 5.2.系统环境准备 5.3.安装 5.4.查看bind的相关文件 5.5.查看b ...

  7. AWS使用ALB负载均衡遇到的问题

    文章原文 问题描述 ALB 负载均衡 RGC-Dev-ALB.xxx.cn-north-1.elb.amazonaws.com.cn 解析到2个IP 54.223.xxx.xx和52.81.xxx.x ...

  8. JQ动画

    /* //基本 show([s,[e],[fn]]) 显示元素 hide([s,[e],[fn]]) 隐藏元素 //滑动 slideDown([s],[e],[fn]) 向下滑动 slideUp([s ...

  9. Python - 导入的位置

    导入的是什么 导入是将 Python 的一些功能函数放到当前的脚本中使用 不导入的功能无法直接在当前脚本使用(除了 python 自带的内置函数) Python 有很多第三方功能,假设想要使用,都必须 ...

  10. [源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块

    [源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块 目录 [源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块 0x00 摘要 0x01 前言 0x02 ...