公式:
a1=a2=g(z)=1+e−z11−a1=P(y=1∣x)=P(y=0∣x)
(Softmax 翻译 分类器,不一定正确)
通用公式:
zj=aj=wj⋅x+bj, j=1,⋯,N∑k=1Nezkezj=P(y=j∣x)
举例 - 设有四种分类:
先定义四个逻辑回归公式:z1=w1⋅x+b1z2=w2⋅x+b2z3=w3⋅x+b3z4=w4⋅x+b4 然后可求得四种概率分别:a1=ez1+ez2+ez3+ez4ez1=P(y=1∣x)a2=ez1+ez2+ez3+ez4ez2=P(y=2∣x)a3=ez1+ez2+ez3+ez4ez3=P(y=3∣x)a4=ez1+ez2+ez3+ez4ez4=P(y=4∣x)相加为1
y=0/1
Loss函数:
Loss=−yloga1−(1−y)log(1−a1)
由于y>0
Loss函数:
Loss(a1,⋯,aN,y)= ⎩⎨⎧−loga1−loga2 ⋮−logaNif y=1if y=2 ⋮if y=N
先区分以下两个概念,不要混淆
- 多类分类(Multiiclass Classification)(Softmax输出?)
- 像是之前的例子,例如手写体的数字识别(选择0~9),输出y
- 输出:y=[P1,P2,⋯,Pn],∑P=1
- 多标签分类(Multi-label Classification)
- 我们需要同时检测多个物品的多个类别,例如在一个图像中判断哪些是人哪些是小车哪些是巴士
繁琐的做法是建立三个神经网络,分别是找小车、巴士、人。但一般来说,更好的做法是只训练一个模型,就能去分辨这三种东西 - 输出:y=[P1,P2,⋯,Pn],∀P⊂[0,1]
之前的神经网络的输出层都是只有一个单元,而多分类神经网络的输出层是Softmax输出,Softmax层也称Softmax激活函数,最后的输出是一个向量。
除了这个区别以外,其他的和之前的神经网络训练基本相同
"""
注意:代码仅供演示,不要抄,后面会学更好的处理方式
"""
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
# 1. 定义模型、定义层与激活函数
model = Sequential([ # 比如我们的两个隐藏层使用ReLU,最后的输出层使用Softmax
Dense(units=25, activation='relu'),
Dense(units=25, activation='relu'),
Dense(units=10, activation='softmax'),
])
# 2. 定义Loss和Cost
from tensorflow.keras.losses import SparseCategoricalCrossentropy
model.compile(loss = SparseCategoricalCrossentropy())
# 3. 最优化、模型训练
model.fit(X,Y,epochs=100)
Softmax回归,也叫多分类模型。在该路径中还有部分相关的笔记:../02. 高级学习算法/02. 多分类模型(Softmax).md
不过这部分笔记被我复制了一遍到上去了
到目前为止,我们讲到过的分类的例子都使用了二分分类,那如果我们有多种可能的类型的话呢?
有一种logistic回归的一般形式,叫做Softmax回归,能让你在试图识别多种分类中的某一分类时做出预测
比如:
你不单需要识别猫,而是想识别猫,狗和小鸡。
我把猫加做类1,狗为类2,小鸡是类3。
如果不属于以上任何一类,就分到“其它”或者说“以上均不符合”这一类,我把它叫做类0。
如图

符号:
大写的C来表示你的输入会被分入的类别总个数。指示类别的数字,就是从0到C−1
在上面的例子中,我们有4种可能的类别,包括“其它”或“以上均不符合”这一类,类别序号为0、1、2、3。
神经网络的输出:
在这个例子中,我们将建立一个神经网络,其输出层有4个,或者说C个输出单元。
我们想要输出层单元的数字告诉我们这4种类型中每个的概率有多大。在输入X的情况下,这四个节点分别输出 其他、狗、猫、小鸡 的概率
输出y^是一个4×1维向量,即输出四种概率。它们加起来应该等于1。
神经网络最后一层(Softmax层)中,
前面的计算和之前一样算出z[l]:z[l]=W[l]a[L−1]+b[l]。然后你需要应用Softmax激活函数。
首先,我们要计算一个临时变量t:t=ez[l]
然后,输出a[l]:a[l]=向量t的归一化
其中,该例子中,其中z[l]、t、a[l]尺寸都是4×1
代入数值来捋一遍流程:
① 算出z[l]z[l]=52−13 ② 计算tt=ez[l]=e5e2e−1e3=148.47.40.420.1 ③ 归一化,从向量t得到向量a[l],使概率总和为1a[l]=∑j=14tiez[l]=∑j=14tit=176.3t=y^=0.8420.0420.0020.114 ④ 每一项的概率:ai[l]=∑j=14titi类0∼类3的概率:⎩⎨⎧a1[l]=176.3e5=0.842a2[l]=176.3e2=0.042a3[l]=176.3e−1=0.002a4[l]=176.3e3=0.114
一些补充:
之前,我们的激活函数都是接受单行数值输入。
相比Sigmoid和ReLu激活函数,输入一个实数,输出一个实数。
Softmax激活函数的特殊之处在于需要将所有可能的输出归一化,需要输入一个向量,输出一个向量。
比如你有两个输入x1,x2,它们直接输入到Softmax层,它可以有三四个或者更多的输出节点
比如输出有三个节点的例子(C=3)

原始输入只有x1和x2,一个个输出分类的Softmax层能够代表这种类型的决策边界
请注意这是几条线性决策边界,但这使得它能够将数据分到3个类别中
图中的颜色显示了Softmax分类器的输出的阈值,输入的着色是基于三种输出中概率最高的那种
比如有更多分类项的例子(C依次=4,5,6)

基本同理
你将更深入地了解Softmax分类,并学习如何训练一个使用了Softmax层的模型。
复习一下前面的例子
z[L]=52−13,t=e5e2e−1e3a[L]=g[L](z[L])=e5/(e5+e2+e−1+e3)e2/(e5+e2+e−1+e3)e−1/(e5+e2+e−1+e3)e3/(e5+e2+e−1+e3)=0.8420.0420.0020.114
Softmax这个名称的来源是与所谓hardmax对比。我不知道这是不是一个好名字,但至少这就是softmax这一名称背后所包含的想法,与hardmax正好相反。
hardmax:
hardmax函数会观察z的元素,然后在z中最大元素的位置放上1,其它位置放上0。即最大的元素的输出为1,其它的输出都为0。例如:
z=1000
Softmax:
与之相反,所做的从z到这些概率的映射更为温和
z=P0P1P2P3
Softmax回归或Softmax激活函数将logistic激活函数推广到C类,而不仅仅是两类,结果就是如果C=2,那么C=2的Softmax实际上变回了logistic回归。
不严格证明:
Logistic回归:g(z)=1+e−z1, g(z)⊂(0,1) Softmax回归:(C=2时)a[L]=g[L](z[L])=[ez1/(ez1+ez2)ez2/(ez1+ez2)]=[ez1(1+ez2−z1)11−a1[L]]
训练Softmax输出层的神经网络
损失
训练集中某个样本的目标输出:y真=0100a[l]=y^=0.30.20.10.4这实际上是一只猫,但却只分配到20%是猫的概率,所以在本例中表现不佳
损失函数
Logistic回归损失函数:Softmax损失函数:Loss=−ylogy^−(1−y)log(1−y^)L(y^,y)=−j=1∑4yjlogy^j(y=0,1)(y>0)
例如该例子中
∵ ∴ y1=y3=y4=0,y2=1L(y^,y)=−j=1∑4yjlogy^j=−y2logy^2=−logy^2
一些变量的尺寸
Y=[y(1)y(2)…… y(m)]=010000101000…………Y^=[y^(1)y^(2)…… y^(m)]=0.30.20.10.4…………Y和Y^都是一个4×m维矩阵
J(w[1],b[1],……)=m1i=1∑mL(y^(i),y(i))
最后我们来看一下,在有Softmax输出层时如何实现梯度下降法
dz[l]=∂z[l]∂J=y^−y 你可以用 y^ 这个C×1向量减去 y 这个C×1向量