精华内容
下载资源
问答
  • 小白都能看懂的softmax详解

    万次阅读 多人点赞 2018-09-02 23:35:37
    1.softmax初探 在机器学习尤其是深度学习中,softmax是个非常常用而且比较重要的函数,尤其在多分类的场景中使用广泛。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。 ...

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
    经常有同学私信或留言询问相关问题,V号bitcarmanlee。github上star的同学,在我能力与时间允许范围内,尽可能帮大家解答相关问题,一起进步。

    1.softmax初探

    在机器学习尤其是深度学习中,softmax是个非常常用而且比较重要的函数,尤其在多分类的场景中使用广泛。他把一些输入映射为0-1之间的实数,并且归一化保证和为1,因此多分类的概率之和也刚好为1。
    首先我们简单来看看softmax是什么意思。顾名思义,softmax由两个单词组成,其中一个是max。对于max我们都很熟悉,比如有两个变量a,b。如果a>b,则max为a,反之为b。用伪码简单描述一下就是 if a > b return a; else b
    另外一个单词为soft。max存在的一个问题是什么呢?如果将max看成一个分类问题,就是非黑即白,最后的输出是一个确定的变量。更多的时候,我们希望输出的是取到某个分类的概率,或者说,我们希望分值大的那一项被经常取到,而分值较小的那一项也有一定的概率偶尔被取到,所以我们就应用到了soft的概念,即最后的输出是每个分类被取到的概率。

    2.softmax的定义

    首先给一个图,这个图比较清晰地告诉大家softmax是怎么计算的。
    这里写图片描述
    (图片来自网络)

    假设有一个数组V,ViV_i表示V中的第i个元素,那么这个元素的softmax值为:
    Si=eijejS_i = \frac{e^i}{\sum_j e^j}
    该元素的softmax值,就是该元素的指数与所有元素指数和的比值。

    这个定义可以说很简单,也很直观。那为什么要定义成这个形式呢?原因主要如下。
    1.softmax设计的初衷,是希望特征对概率的影响是乘性的。
    2.多类分类问题的目标函数常常选为cross-entropy。即L=ktklnP(y=k)L = -\sum_k t_k \cdot lnP(y=k),其中目标类的tkt_k为1,其余类的tkt_k为0。
    在神经网络模型中(最简单的logistic regression也可看成没有隐含层的神经网络),输出层第i个神经元的输入为ai=dwidxda_i = \sum_d w_{id} x_d
    神经网络是用error back-propagation训练的,这个过程中有一个关键的量是L/αi\partial L / \partial \alpha_i。后面我们会进行详细推导。

    3.softmax求导

    前面提到,在多分类问题中,我们经常使用交叉熵作为损失函数
    Loss=itilnyiLoss = - \sum_i t_i lny_i
    其中,tit_i表示真实值,yiy_i表示求出的softmax值。当预测第i个时,可以认为ti=1t_i = 1。此时损失函数变成了:
    Lossi=lnyiLoss_i = -lny_i
    接下来对Loss求导。根据定义:
    yi=eijejy_i = \frac{e^i}{\sum_j e^j}
    我们已经将数值映射到了0-1之间,并且和为1,则有:
    eijej=1jiejjej\frac{e^i}{\sum_j e^j} = 1 - \frac{\sum_{j \neq i} e^j}{\sum_j e^j}

    接下来开始求导
    Lossii=lnyii=(lneijej)i=1eijej(eijej)i=jejei(1jiejjej)i=jejei(jiej)(1jej)i=jejjiejeiei(jej)2=jiejjej=(1eijej)=yi1{\begin{aligned} \frac{\partial Loss_i}{\partial _i} & = - \frac{\partial ln y_i}{\partial _i} \\ & = \frac{\partial (-ln \frac{e^i}{\sum_j e^j}) }{\partial _i} \\ & = - \frac {1}{ \frac{e^i}{\sum_j e^j}} \cdot \frac{\partial (\frac{e^i}{\sum_j e^j})}{ \partial_i} \\ & = -\frac{\sum_j e^j}{e^i} \cdot \frac{\partial (1 - \frac{\sum_{j \neq i} e^j}{\sum_j e^j}) } {\partial_i} \\ & = -\frac{\sum_j e^j}{e^i} \cdot (- \sum _ {j \neq i}e^j ) \cdot \frac{\partial( \frac {1} {\sum_j e^j} ) } { \partial _i} \\ &= \frac { \sum_j e^j \cdot \sum_{j \neq i} e^j} {e^i } \cdot \frac { - e^i} { (\sum_j e^j) ^ 2} \\ & = -\frac { \sum_{j \neq i} e^j } { \sum_j e^j } \\ & = -(1 - \frac{ e ^ i } { \sum_j e^j } ) \\ & = y_i - 1 \end{aligned}}

    上面的结果表示,我们只需要正想求出yiy_i,将结果减1就是反向更新的梯度,导数的计算是不是非常简单!

    上面的推导过程会稍微麻烦一些,特意整理了一下,结合交叉熵损失函数,整理了一篇新的内容,看起来更直观一些。
    交叉熵损失函数(Cross Entropy Error Function)与均方差损失函数(Mean Squared Error)

    4.softmax VS k个二元分类器

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

    参考文献:
    1.https://www.zhihu.com/question/40403377
    2.http://deeplearning.stanford.edu/wiki/index.php/Softmax回归

    展开全文
  • Softmax

    千次阅读 2020-01-13 12:36:27
    Softmax函数概述 soft version of max 大的越来越大,小的越来越小 Softmax常与crossentropy(交叉熵)搭配连用 上图中假设有三个输出,分别是2.0,1.0和0.1,如果将数值转换成概率的话,我们希望概率最大的值...

    Softmax函数概述

    • soft version of max
    • 大的越来越大,小的越来越小

      Softmax常与crossentropy(交叉熵)搭配连用

    上图中假设有三个输出,分别是2.0,1.0和0.1,如果将数值转换成概率的话,我们希望概率最大的值作为预测的label。即我们希望将最大值2.0所对应的索引作为相应的label输出,那么如何作为probilities输出呢?

    sigmoid函数可以将input压缩到[0,1]的范围,但是对于分类问题来说,我们不仅要求概率范围是[0,1],还要求所有的概率和为1,即pi=1\sum p_i = 1

    为了解决此类问题,就有了Softmax函数,具体的函数表达式为
    S(yi)=eyijeyj S(y_i) = \frac{e^{y_i}}{\sum_j e^{y_j}}

    另外有一点要注意,Softmax具有差距放大功能,例如原来2.0和1.0是两倍关系,经过Softmax压缩后,变为0.7和0.2,增大到3.5倍关系

    Softmax求导

    对Softmax函数进行求导,首先写出其函数表达式
    pi=eaik=1Neak p_i = \frac{e^{a_i}}{\sum_{k=1}^Ne^{a_k}}

    根据除法求导法则,若f(x)=g(x)h(x)f(x)=\frac{g(x)}{h(x)},则f(x)=g(x)h(x)h(x)g(x)h2(x)f'(x) = \frac{g'(x)h(x)-h'(x)g(x)}{h^2(x)}

    i=ji=j

    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\nabl…

    iji\neq j
    KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\nabl…

    对以上求导过程进行总结
    piaj={pi(1pj)i=jpjpiij \frac{\nabla p_i}{\nabla{a_j}}=\begin{cases}p_i(1-p_j) & i = j \cr -p_j*p_i &i \neq j\end{cases}
    需要注意的一点是,由于pjp_jpjp_j均在[0,1][0,1]范围内,故pi(1pj)>0p_i(1-p_j)>0pipj<0-p_i*p_j<0

    下面使用代码举例

    import torch
    import torch.nn.functional as F
    a = torch.rand(3, requires_grad=True) # dim=1, len=3 tensor
    p = F.softmax(a, dim=0)# 需要指定进行sfotmax操作的dim维度
    print('softmax:', p)
    torch.autograd.grad(p[0],[a], retain_graph=True)
    # 注意Loss必须是长度为1的值,由于p是dim=1,len=3的值,因此取必须取p中的一个
    

    输出softmax: tensor([0.2732, 0.3780, 0.3489], grad_fn=<SoftmaxBackward>)
    (tensor([ 0.1985, -0.1033, -0.0953]),)

    这里进行了p0ai\frac{\nabla p_0}{\nabla{a_i}}的操作,由于aa[0,2][0,2]的tensor,所以返回了一个131*3的tensor。并且仔细观察会发现,当i=0i=0时,梯度信息为正

    参数retain_graph=True需要解释一下。由于PyTorch在求导一次之后,就会将这个图的梯度信息清除掉,如果第二次再求导,就会报错。但如果写上这个参数,就可以保留梯度信息,就能再求一次导

    展开全文
  • softmax

    2020-08-25 17:20:25
    softmax 向量计算 dim softmax 实例分类 softmax 损失函数 交叉熵 极大似然估计 softmax 函数本身具有 把值压缩到0,1 之间,结果具有归一,放大,散列 效果。这个过程也可以看成是求 概率的过程。 softmax计算得出...

    softmax 向量计算 dim

    在这里插入图片描述

    softmax 实例分类

    softmax 损失函数 交叉熵 极大似然估计

    softmax 函数本身具有 把值压缩到0,1 之间,结果具有归一,放大,散列 效果。这个过程也可以看成是求 概率的过程。
    softmax计算得出概率 送入交叉熵公式概率中或极大似然估计
    softmax的 损失函数 可以用 交叉熵来表达 也可以用极大似然估计来描述,二者结果一样
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,523
精华内容 6,209
关键字:

softmax