深度学习基础之-3.4神经网络多分类

分类函数 - Softmax

为什么叫做Softmax?

假设输入值是:[3,1,-3],如果取max会变成:[1,0,0],这符合我们的分类需要。但是max操作本身不可导,无法用在反向传播中,所以加了个"soft"来模拟max的行为。

公式

a j = e z j ∑ i = 1 m e z i = e z j e z 1 + e z 2 + ⋯ + e z m a_j = \frac{e^{z_j}}{\sum\limits_{i=1}^m e^{z_i}}=\frac{e^{z_j}}{e^{z_1}+e^{z_2}+\dots+e^{z_m}} aj=i=1meziezj=ez1+ez2++ezmezj

上式中:

  • z j z_j zj是对第 j 的分类原始值(即矩阵运算的结果,假设j=1,上图中 z 1 = w 11 x 1 + w 12 x 2 + b 1 z_1=w_{11}x_1+w_{12}x_2+b1 z1=w11x1+w12x2+b1
  • z i z_i zi是参与分类计算的每个类别的原始值(即矩阵运算的结果,上图中 z i = w i 1 x 1 + w i 2 x 2 + b i z_i=w_{i1}x_1+w_{i2}x_2+bi zi=wi1x1+wi2x2+bi
  • m是总的分类数
  • a j a_j aj是对第 j 项的计算结果

假设j=1,m=3,上式为:

a 1 = e z 1 e z 1 + e z 2 + e z 3 a_1=\frac{e^{z_1}}{e^{z_1}+e^{z_2}+e^{z_3}} a1=ez1+ez2+ez3ez1

在这里插入图片描述

也就是说把接收到的输入归一化成一个每个分量都在 ( 0 , 1 ) (0,1) (0,1)之间并且总和为一的一个概率函数。在上图中, A 1 + A 2 + A 3 = 1 A1+A2+A3=1 A1+A2+A3=1

分类的方式是:看A1/A2/A3三者谁的比重最大,就算是那一类。比如A1=0.6, A2=0.1, A3=0.3,则这个样本就算是第一类了。

用一张图来形象说明这个过程:

在这里插入图片描述

当输入的数据 [ z 1 , z 2 , z 3 ] [z_1,z_2,z_3] [z1,z2,z3] [ 3 , 1 , − 3 ] [3,1,-3] [3,1,3]时,按照图示过程进行计算,可以得出输出的概率分布是 [ 0.88 , 0.12 , 0 ] [0.88,0.12,0] [0.88,0.12,0]

试想如果我们并没有这样一个softmax的过程而是直接根据[3,1,-3]这样的输出,而我们期望得结果是[1,0,0]这样的概率分布结果,那传递给网络的信息是什么呢?

其实[3,1,-3]这一组数字和[1,0,0]是不可比的,就好像用1公里的“1”和1毫米的“1”去比,虽然它们都是长度单位。它先归一化所有输入数据到[0,1]之间,然后再和标签值[1,0,0]去比,一是可比了,二是知道要抑制或鼓励的幅度。

从继承关系的角度来说,softmax函数可以视作sigmoid的一个扩展,比如我们来看一个二分类问题,

A 1 = e z 1 e z 1 + e z 2 = 1 1 + e z 2 − z 1 A_1 = \frac{e^{z_1}}{e^{z_1} + e^{z_2}} = \frac{1}{1 + e^{z_2 - z_1}} A1=ez1+ez2ez1=1+ez2z11

是不是和sigmoid的函数形式非常像?比起原始的sigmoid函数,softmax的一个优势是可以用在多分类的问题中。另一个好处是在计算概率的时候更符合一般意义上我们认知的概率分布,体现出物体属于各个类别相对的概率大小。

正向计算

神经网络计算(如果是多层的话,只考虑最后一层的计算)
(1) z i = w x i + b z_i = wx_i+b \tag{1} zi=wxi+b(1)

分类计算
(2) a j = e z j ∑ i = 1 m e z i = e z j e z 1 + e z 2 + ⋯ + e z m a_j = \frac{e^{z_j}}{\sum\limits_{i=1}^m e^{z_i}}=\frac{e^{z_j}}{e^{z_1}+e^{z_2}+\dots+e^{z_m}} \tag{2} aj=i=1meziezj=ez1+ez2++ezmezj(2)

损失函数计算
(3) J ( w , b ) = − ∑ i = 1 m ∑ j = 1 n y i j log ⁡ a i j J(w,b) =- \sum_{i=1}^m \sum_{j=1}^n y_{ij} \log a_{ij} \tag{3} J(w,b)=i=1mj=1nyijlogaij(3)

m是样本数,n是类别数。在交叉熵函数一节有详细介绍。

反向传播

((结合损失函数的整体反向传播公式)) ∂ J ∂ z j = a j − y j \frac{\partial{J}}{\partial{z_j}} = a_j-y_j \tag{(结合损失函数的整体反向传播公式)} zjJ=ajyj()
Softmax函数自身的求导
由于Softmax涉及到求和,所以有两种情况:

  • 求输出项 a 1 a_1 a1对输入项 z 1 z_1 z1的导数,此时: j = 1 , i = 1 , i = j j=1, i=1, i=j j=1,i=1,i=j,可以扩展到i, j为任意相等值
  • 求输出项 a 2 或 a 3 a_2或a_3 a2a3对输入项 z 1 z_1 z1的导数,此时: j = 2 或 3 , i = 1 , i ≠ j j=2或3, i=1, i \neq j j=23,i=1,i̸=j,可以扩展到i, j为任意不等值

Softmax函数的分子:因为是计算 a j a_j aj,所以分子是 e z j e^{z_j} ezj

Softmax函数的分母: ( 为了方便简写成 ∑ ) ∑ i = 1 m e z i = e z 1 + ⋯ + e z j + ⋯ + e z m = ∑ \sum\limits_{i=1}^m e^{z_i} = e^{z_1} + \dots + e^{z_j} + \dots +e^{z_m} = \sum \tag{为了方便简写成$\sum$} i=1mezi=ez1++ezj++ezm=(便)

i = j i=j i=j时(比如输出分类值a1对z1的求导),求 a j a_j aj z i z_i zi的导数,此时分子上的 e z j e^{z_j} ezj要参与求导。参考基本数学导数公式33:
∂ a j ∂ z i = ∂ ∂ z i ( e z j / ∑ ) \frac{\partial{a_j}}{\partial{z_i}} = \frac{\partial{}}{\partial{z_i}}(e^{z_j}/\sum) ziaj=zi(ezj/) ( 因为 z i = z j ) = ∂ ∂ z j ( e z j / ∑ ) = \frac{\partial{}}{\partial{z_j}}(e^{z_j}/\sum) \tag{因为$z_i=z_j$} =zj(ezj/)(zi=zj) = e z j ∑ − e z j e z j ( ∑ ) 2 =\frac{e^{z_j}\sum-e^{z_j}e^{z_j}}{(\sum)^2} =()2ezjezjezj = e z j ∑ − ( e z j ) 2 ( ∑ ) 2 =\frac{e^{z_j}}{\sum} - \frac{(e^{z_j})^2}{(\sum)^2} =ezj()2(ezj)2 (4) = a j − a j 2 = a j ( 1 − a j ) = a_j-a^2_j=a_j(1-a_j) \tag{4} =ajaj2=aj(1aj)(4)

i ≠ j i \neq j i̸=j时(比如输出分类值a1对z2的求导,j=1, i=2), a j a_j aj z i z_i zi的导数,分子上的 z j 与 i z_j与i zji没有关系,求导为0,分母的求和项中 e z i e^{z_i} ezi要参与求导。同样是公式33,因为分子 e z j e^{z_j} ezj e z i e^{z_i} ezi求导的结果是0:
∂ a j ∂ z i = − ( ∑ ) ′ e z j ( ∑ ) 2 \frac{\partial{a_j}}{\partial{z_i}}=\frac{-(\sum)'e^{z_j}}{(\sum)^2} ziaj=()2()ezj 求和公式对 e z i e^{z_i} ezi的导数 ( ∑ ) ′ (\sum)' (),除了 e z i e^{z_i} ezi项外,其它都是0: ( ∑ ) ′ = ( e z 1 + ⋯ + e z i + ⋯ + e z m ) ′ = e z i (\sum)' = (e^{z_1} + \dots + e^{z_i} + \dots +e^{z_m})'=e^{z_i} ()=(ez1++ezi++ezm)=ezi 所以: (5) ∂ a j ∂ z i = − ( ∑ ) ′ e z j ( ∑ ) 2 = − e z j e z i ( ∑ ) 2 = − e z j ∑ e z j ∑ = − a i a j \frac{\partial{a_j}}{\partial{z_i}}=\frac{-(\sum)'e^{z_j}}{(\sum)^2}=-\frac{e^{z_j}e^{z_i}}{{(\sum)^2}}=-\frac{e^{z_j}}{{\sum}}\frac{e^{z_j}}{{\sum}}=-a_{i}a_{j} \tag{5} ziaj=()2()ezj=()2ezjezi=ezjezj=aiaj(5)

用具体数值举例
i = j = 1 i = j = 1 i=j=1

∂ a 1 ∂ z 1 = a 1 ( 1 − a 1 ) {\partial a_1 \over \partial z_1}=a_1(1-a_1) z1a1=a1(1a1)

这和Sigmoid的导数一样,这也是可以预期的,可以看作是单路前传计算,即 a 1 a_1 a1只依赖于 z 1 z_1 z1

i = 1 , j = 2 i = 1,j = 2 i=1j=2
∂ a 1 ∂ z 1 = − a 1 a 2 {\partial a_1 \over \partial z_1}=-a_1 a_2 z1a1=a1a2

结合损失函数的整体反向传播公式

看上图,我们要求Loss值对Z1的偏导数。和以前的Sigmoid函数不同,那个函数是一个z对应一个a,所以反向关系也是一对一。而在这里,a1的计算是有z1,z2,z3参与的,a2的计算也是有z1,z2,z3参与的,即所有a的计算都与前一层的z有关,所以考虑反向时也会比较复杂。

先从Loss的公式看, J = − ( y 1 l n a 1 + y 2 l n a 2 + y 3 l n a 3 ) J=-(y_1lna_1+y_2lna_2+y_3lna_3) J=(y1lna1+y2lna2+y3lna3),a1肯定与z1有关,那么a2,a3是否与z1有关呢?

再从Softmax函数的形式来看: a 1 = e z 1 ∑ i e z i = e z 1 e z 1 + e z 2 + e z 3 a_1=\frac{e^{z_1}}{\sum_i e^{z_i}}=\frac{e^{z_1}}{e^{z_1}+e^{z_2}+e^{z_3}} a1=ieziez1=ez1+ez2+ez3ez1 a 2 = e z 2 ∑ i e z i = e z 2 e z 1 + e z 2 + e z 3 a_2=\frac{e^{z_2}}{\sum_i e^{z_i}}=\frac{e^{z_2}}{e^{z_1}+e^{z_2}+e^{z_3}} a2=ieziez2=ez1+ez2+ez3ez2 a 3 = e z 3 ∑ i e z i = e z 3 e z 1 + e z 2 + e z 3 a_3=\frac{e^{z_3}}{\sum_i e^{z_i}}=\frac{e^{z_3}}{e^{z_1}+e^{z_2}+e^{z_3}} a3=ieziez3=ez1+ez2+ez3ez3 无论是a1,a2,a3,都是与z1相关的,而不是一对一的关系,所以,想求Loss对Z1的偏导,必须把Loss->A1->Z1, Loss->A2->Z1,Loss->A3->Z1,这三条路的结果加起来。于是有了如下公式:

∂ J ∂ z i = ∂ J ∂ a 1 ∂ a 1 ∂ z i + ∂ J ∂ a 2 ∂ a 2 ∂ z i + ∂ J ∂ a 3 ∂ a 3 ∂ z i \frac{\partial{J}}{\partial{z_i}}= \frac{\partial{J}}{\partial{a_1}}\frac{\partial{a_1}}{\partial{z_i}} + \frac{\partial{J}}{\partial{a_2}}\frac{\partial{a_2}}{\partial{z_i}} + \frac{\partial{J}}{\partial{a_3}}\frac{\partial{a_3}}{\partial{z_i}} ziJ=a1Jzia1+a2Jzia2+a3Jzia3 = ∑ j ∂ J ∂ a j ∂ a j ∂ z i =\sum_j \frac{\partial{J}}{\partial{a_j}}\frac{\partial{a_j}}{\partial{z_i}} =jajJziaj

你可以假设上式中 i = 1 , j = 3 i=1,j=3 i=1j=3,就完全符合我们的假设了,而且不失普遍性。

前面说过了,因为Softmax涉及到各项求和,A的分类结果和Y的标签值分类是否一致,所以需要分情况讨论:

∂ a j ∂ z i = { a j ( 1 − a j ) , i = j   − a i a j , i ≠ j   \frac{\partial{a_j}}{\partial{z_i}} = \begin{cases} a_j(1-a_j), & i = j \ -a_ia_j, & i \neq j \end{cases}\ ziaj={aj(1aj),i=j aiaj,i̸=j 

因此, ∂ J ∂ z i \frac{\partial{J}}{\partial{z_i}} ziJ应该是 i = j 和 i ≠ j i=j和i \neq j i=ji̸=j两种情况的和:

i = j 时 , J 通 过 A 1 对 Z 1 求 导 ( 或 者 是 通 过 A 2 对 Z 2 求 导 ) i = j时,J通过A1对Z1求导(或者是通过A2对Z2求导) i=jJA1Z1A2Z2
(6) ∂ J ∂ z i = ∂ J ∂ a j ∂ a j ∂ z i = − y j a j a j ( 1 − a j ) = y j ( a j − 1 ) = y i ( a i − 1 ) \frac{\partial{J}}{\partial{z_i}} = \frac{\partial{J}}{\partial{a_j}}\frac{\partial{a_j}}{\partial{z_i}}=-\frac{y_j}{a_j}a_j(1-a_j)=y_j(a_j-1)=y_i(a_i-1) \tag{6} ziJ=ajJziaj=ajyjaj(1aj)=yj(aj1)=yi(ai1)(6)

i ≠ j , J 通 过 A 2 + A 3 对 Z 1 求 导 i \neq j,J通过A2+A3对Z1求导 i̸=jJA2+A3Z1
(7) ∂ J ∂ z i = ∂ J ∂ a j ∂ a j ∂ z i = ∑ j m ( − y j a j ) ( − a j a i ) = ∑ j m ( y j a i ) = a i ∑ y j \frac{\partial{J}}{\partial{z_i}} = \frac{\partial{J}}{\partial{a_j}}\frac{\partial{a_j}}{\partial{z_i}}=\sum_j^m(-\frac{y_j}{a_j})(-a_ja_i)=\sum_j^m(y_ja_i)=a_i\sum{y_j} \tag{7} ziJ=ajJziaj=jm(ajyj)(ajai)=jm(yjai)=aiyj(7)

如果不好理解的话,就拆开上面的公式,假设求J通过a2/a3对z1的导数:

∂ J ∂ z 1 = ∂ J ∂ a 2 ∂ a 2 ∂ z 1 + ∂ J ∂ a 3 ∂ a 3 ∂ z 1 \frac{\partial{J}}{\partial{z_1}}=\frac{\partial{J}}{\partial{a_2}}\frac{\partial{a_2}}{\partial{z_1}}+\frac{\partial{J}}{\partial{a_3}}\frac{\partial{a_3}}{\partial{z_1}} z1J=a2Jz1a2+a3Jz1a3 因为: ∂ J ∂ a 2 = − y 2 a 2 \frac{\partial{J}}{\partial{a_2}}=-\frac{y_2}{a_2} a2J=a2y2 ∂ a 2 ∂ z 1 = − a 2 a 1 \frac{\partial{a_2}}{\partial{z_1}}=-a_2a_1 z1a2=a2a1 ∂ J ∂ a 3 = − y 3 a 3 \frac{\partial{J}}{\partial{a_3}}=-\frac{y_3}{a_3} a3J=a3y3 ∂ a 3 ∂ z 1 = − a 3 a 1 \frac{\partial{a_3}}{\partial{z_1}}=-a_3a_1 z1a3=a3a1 所以: ∂ J ∂ z 1 = ( − y 2 a 2 ) ( − a 2 a 1 ) + ( − y 3 a 3 ) ( − a 3 a 1 ) = y 2 a 1 + y 3 a 1 = a 1 ( y 2 + y 3 ) = a i ∑ j ≠ i y j \frac{\partial{J}}{\partial{z_1}} = (-\frac{y_2}{a_2})(-a_2a_1)+(-\frac{y_3}{a_3})(-a_3a_1)=y_2a_1+y_3a_1=a_1(y_2+y_3)=a_i\sum_{j\neq i}y_j z1J=(a2y2)(a2a1)+(a3y3)(a3a1)=y2a1+y3a1=a1(y2+y3)=aij̸=iyj

把两种情况加起来:

∂ J ∂ z i = y i ( a i − 1 ) + a i ∑ j ≠ i y j \frac{\partial{J}}{\partial{z_i}} = y_i(a_i-1)+a_i\sum_{j \neq i}y_j ziJ=yi(ai1)+aij̸=iyj = − y i + a i y i + a i ∑ j ≠ i y j =-y_i+a_iy_i+a_i\sum_{j \neq i}y_j =yi+aiyi+aij̸=iyj = − y i + a i ( y i + ∑ j ≠ i y j ) =-y_i+a_i(y_i+\sum_{j \neq i}y_j) =yi+ai(yi+j̸=iyj) = − y i + a i ∑ j y j =-y_i + a_i\sum_jy_j =yi+aijyj = − y i + a i ∗ 1 =-y_i + a_i*1 =yi+ai1 (8) = a i − y i =a_i-y_i \tag{8} =aiyi(8)

因为 y j y_j yj是取值[1,0,0]或者[0,1,0]或者[0,0,1]的,这三者用 ∑ \sum 加起来,就是[1,1,1],在矩阵乘法运算里乘以[1,1,1]相当于什么都不做,就等于原值。

我们惊奇地发现,最后的反向计算过程就是: a i − y i a_i-y_i aiyi,假设当前样本的 a i = [ 0.3 , 0.6 , 0.1 ] a_i=[0.3, 0.6, 0.1] ai=[0.3,0.6,0.1],而 y i = [ 1 , 0 , 0 ] y_i=[1, 0, 0] yi=[1,0,0],则: a i − y j = [ 0.3 , 0.6 , 0.1 ] − [ 1 , 0 , 0 ] = [ − 0.7 , 0.6 , 0.1 ] a_i - y_j = [0.3,0.6,0.1]-[1,0,0]=[-0.7,0.6,0.1] aiyj=[0.3,0.6,0.1][1,0,0]=[0.7,0.6,0.1]

其含义是,样本预测第二类,但实际是第一类,所以给第一类-0.7的惩罚值,反向传播给神经网络。

后面对 z = w x + b z=wx+b z=wx+b的求导,与二分类一样,不再赘述。

神经网络的线性多分类工作原理

在这里插入图片描述
假设第一类的概率最大
假设一共有三类,红色为1,绿色为2,蓝色为3,那么Softmax的形式应该是:
a j = e z j ∑ i = 1 3 e z i = e z j e z 1 + e z 2 + z 3 a_j = \frac{e^{z_j}}{\sum\limits_{i=1}^3 e^{z_i}}=\frac{e^{z_j}}{e^{z_1}+e^{z_2}+^{z_3}} aj=i=13eziezj=ez1+ez2+z3ezj
如果判定一个点属于第一类,则有:
(2.1) a 1 > a 2 , 且 : a 1 > a 3 a_1 > a2 , 且: a_1 > a_3 \tag{2.1} a1>a2,:a1>a3(2.1)
由于Softmax的特殊形式,分母都一样,所以只比较分子就行了。而分子是一个自然指数,输出值域大于零且单调递增,所以只比较指数就可以了,因此,公式2.1等同于下式:

(2.2) z 1 > z 2 , 且 : z 1 > z 3 z_1 > z_2 , 且: z_1 > z_3 \tag{2.2} z1>z2,:z1>z3(2.2)

把z的公式引入:

(2.3) z 1 = w 11 ⋅ x 1 + w 12 ⋅ x 2 + b 1 z_1 = w_{11} \cdot x_1 + w_{12} \cdot x_2 + b1 \tag{2.3} z1=w11x1+w12x2+b1(2.3) (2.4) z 2 = w 21 ⋅ x 1 + w 22 ⋅ x 2 + b 2 z_2 = w_{21} \cdot x_1 + w_{22} \cdot x_2 + b2 \tag{2.4} z2=w21x1+w22x2+b2(2.4) (2.5) z 3 = w 31 ⋅ x 1 + w 32 ⋅ x 2 + b 3 z_3 = w_{31} \cdot x_1 + w_{32} \cdot x_2 + b3 \tag{2.5} z3=w31x1+w32x2+b3(2.5)

如果满足公式2.2,则:

(2.6) w 11 ⋅ x 1 + w 12 ⋅ x 2 + b 1 > w 21 ⋅ x 1 + w 22 ⋅ x 2 + b 2 w_{11} \cdot x_1 + w_{12} \cdot x_2 + b1 > w_{21} \cdot x_1 + w_{22} \cdot x_2 + b2 \tag{2.6} w11x1+w12x2+b1>w21x1+w22x2+b2(2.6) (2.7) w 11 ⋅ x 1 + w 12 ⋅ x 2 + b 1 > w 31 ⋅ x 1 + w 32 ⋅ x 2 + b 3 w_{11} \cdot x_1 + w_{12} \cdot x_2 + b1 > w_{31} \cdot x_1 + w_{32} \cdot x_2 + b3 \tag{2.7} w11x1+w12x2+b1>w31x1+w32x2+b3(2.7)

变形金刚:

(2.8) ( w 12 − w 22 ) x 2 > ( w 21 − w 11 ) x 1 + ( b 2 − b 1 ) (w_{12} - w_{22})x_2 > (w_{21} - w_{11})x_1 + (b2 - b1) \tag{2.8} (w12w22)x2>(w21w11)x1+(b2b1)(2.8)

(2.9) ( w 12 − w 32 ) x 2 > ( w 31 − w 11 ) x 1 + ( b 3 − b 1 ) (w_{12} - w_{32})x_2 > (w_{31} - w_{11})x_1 + (b3 - b1) \tag{2.9} (w12w32)x2>(w31w11)x1+(b3b1)(2.9)

我们先假设:

(2.10) w 12 > w 22 > w 32 w_{12} > w_{22} > w_{32} \tag{2.10} w12>w22>w32(2.10)

所以公式2.8,2.9左侧的系数都大于零,两边同时除以系数:

(2.11) x 2 > w 21 − w 11 w 12 − w 22 x 1 + b 2 − b 1 w 12 − w 22 x_2 > {w_{21} - w_{11} \over w_{12} - w_{22}}x_1 + {b2 - b1 \over w_{12} - w_{22}} \tag{2.11} x2>w12w22w21w11x1+w12w22b2b1(2.11)

(2.12) x 2 > w 31 − w 11 w 12 − w 32 x 1 + b 3 − b 1 w 12 − w 32 x_2 > {w_{31} - w_{11} \over w_{12} - w_{32}} x_1 + {b3 - b1 \over w_{12} - w_{32}} \tag{2.12} x2>w12w32w31w11x1+w12w32b3b1(2.12)

简化:

(17) y > W 1 ⋅ x + B 1 y > W_1 \cdot x + B_1 \tag{17} y>W1x+B1(17)

(18) y > W 2 ⋅ x + B 2 y > W_2 \cdot x + B_2 \tag{18} y>W2x+B2(18)

也就是说在图中画两条直线,所有红点都同时在蓝线1和绿线2这两条直线的上方,如下图所示:
在这里插入图片描述
假设第二类的概率最大
同理计算可得:
在这里插入图片描述
假设第三类的概率最大
同理计算可得:
在这里插入图片描述
三种结果综合起来可得:
在这里插入图片描述
我们在 w 32 &lt; w 22 &lt; w 12 w_{32} &lt; w_{22} &lt; w_{12} w32<w22<w12假设条件下,得到了上面这张图,如果换一个假设条件如 w 32 &gt; w 22 &gt; w 12 w_{32} &gt; w_{22} &gt; w_{12} w32>w22>w12,三根线的大致位置还是这样,只不过斜率会有些变化。比如上图中的红线,现在是下方向左斜,换了条件后,有可能变成下方向右斜,整体的大于小于关系不会发生混乱

Softmax函数的Python实现

第一种,直截了当按照公式写:

def Softmax1(x):
    e_x = np.exp(x)
    v = np.exp(x) / np.sum(e_x)
    return v

这个可能会发生的问题是,当x很大时,np.exp(x)很容易溢出,因为是指数运算。所以,有了下面这种改进的代码:

def Softmax2(Z):
    shift_Z = Z - np.max(Z)
    exp_Z = np.exp(shift_Z)
    A = exp_Z / np.sum(exp_Z)
    return A

测试一下:

Z = np.array([3,0,-3])
print(Softmax1(Z))
print(Softmax2(Z))

两个实现方式的结果一致:

[0.95033021 0.04731416 0.00235563]
[0.95033021 0.04731416 0.00235563]

为什么一样呢?从代码上看差好多啊!我们来证明一下:

假设有3个值a,b,c,并且a在三个数中最大,则b所占的Softmax比重应该这样写:

P ( b ) = e b e a + e b + e c P(b)=\frac{e^b}{e^a+e^b+e^c} P(b)=ea+eb+eceb

如果减去最大值变成了a-a,b-a,c-a,则b’所占的Softmax比重应该这样写:

P ( b ′ ) = e b − a e a − a + e b − a + e c − a P(b&#x27;) = \frac{e^{b-a}}{e^{a-a}+e^{b-a}+e^{c-a}} P(b)=eaa+eba+ecaeba = e b / e a e a / e a + e b / e a + e c / e a =\frac{e^b/e^a}{e^a/e^a+e^b/e^a+e^c/e^a} =ea/ea+eb/ea+ec/eaeb/ea = e b e a + e b + e c = \frac{e^b}{e^a+e^b+e^c} =ea+eb+eceb 所 以 : P ( b ) = = P ( b ′ ) 所以:P(b) == P(b&#x27;) P(b)==P(b)

Softmax2的写法对一个一维的向量或者数组是没问题的,如果遇到Z是个MxN维(M,N>1)的矩阵的话,就有问题了,因为np.sum(exp_Z)这个函数,会把MxN矩阵里的所有元素加在一起,得到一个标量值,而不是相关列元素加在一起。

所以应该这么写:

def Softmax(Z):
    shift_z = Z - np.max(Z)
    exp_z = np.exp(shift_z)
    #s = np.sum(exp_z)
    s = np.sum(exp_z, axis=0)
    A = exp_z / s
    return A

axis=0这个参数非常非常重要,因为如果输入Z是单样本的预测值话,如果是分三类,则应该是个3x1的数组,如果:

Z = [ 3 , 1 , − 3 ] Z = [3, 1, -3] Z=[3,1,3]

e z = [ 1 , 0.135 , 0.002 ] e^z = [1, 0.135, 0.002] ez=[1,0.135,0.002]

s = 1.138 s = 1.138 s=1.138

A = [ 0.879 , 0.119 , 0.002 ] A = [0.879, 0.119, 0.002] A=[0.879,0.119,0.002]

但是,如果是批量训练,假设每次用两个样本,则:

Z = [ [ 3 , 1 , − 3 ] [ 1 , − 3 , 3 ] ] Z = [[3, 1, -3][1, -3, 3]] Z=[[3,1,3][1,3,3]]

e z = [ [ 1 , 0.135 , 0.002 ] [ 0.135 , 0.002 , 1 ] ] e^z = [[1, 0.135, 0.002][0.135, 0.002, 1]] ez=[[1,0.135,0.002][0.135,0.002,1]]

s = [ [ 1.138 ] [ 1.138 ] ] s = [[1.138][1.138]] s=[[1.138][1.138]]

A = [ [ 0.879 , 0.119 , 0.002 ] [ 0.119 , 0.002 , 0.879 ] ] A = [[0.879, 0.119, 0.002][0.119, 0.002, 0.879]] A=[[0.879,0.119,0.002][0.119,0.002,0.879]]

其中,A是包含两个样本的softmax结果,每个数组里面的三个数字相加为1。

如果s = np.sum(exp_z),没有axis=0参数,则:

Z = [ [ 3 , 1 , − 3 ] [ 1 , − 3 , 3 ] ] Z = [[3, 1, -3][1, -3, 3]] Z=[[3,1,3][1,3,3]]

e z = [ [ 1 , 0.135 , 0.002 ] [ 0.135 , 0.002 , 1 ] ] e^z = [[1, 0.135, 0.002][0.135, 0.002, 1]] ez=[[1,0.135,0.002][0.135,0.002,1]]

s = 2.276 s = 2.276 s=2.276

A = [ [ 0.439 , 0.059 , 0.001 ] [ 0.059 , 0.001 , 0.439 ] ] A = [[0.439, 0.059, 0.001][0.059, 0.001, 0.439]] A=[[0.439,0.059,0.001][0.059,0.001,0.439]]

A虽然仍然包含两个样本,但是变成了两个样本所有的数字相加为1,这不是softmax的本意,softmax只计算一个样本中的数据。

https://github.com/microsoft/ai-edu/blob/master/B-教学案例与实践/B6-神经网络基本原理简明教程/07.1-多分类函数.md
https://github.com/microsoft/ai-edu/blob/master/B-教学案例与实践/B6-神经网络基本原理简明教程/07.2-线性多分类原理.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值