目录
一、概念
多分类问题是指将输入样本映射到多个输出类别中的问题。在机器学习中,通常使用监督学习算法进行多分类问题的解决,其中输入数据包括特征和标签,标签是由多个类别中的一种或多种组成的。
常见的多分类算法有:逻辑回归、决策树、支持向量机、朴素贝叶斯、神经网络等。
多分类问题任然是一个分类问题,因为y只能取少量的离散类别而不是任何数字。
二、Softmax回归算法
1、定义
其中为第i个节点的输出值,C为输出节点的个数,即分类的类别个数。通过Softmax函数就可以将多分类的输出值转换为范围在[0, 1]和为1的概率分布。
softmax回归,也称为多项逻辑回归,是一种用于多分类问题的监督学习算法。该算法输出每个类别的概率,最终选择概率最高的类别作为预测结果。
softmax回归的主要目标是学习一个线性模型,在该模型的基础上使用softmax函数将线性输出转换为概率分布。具体来说,softmax函数将每个类别的线性得分转化为概率分布,使得所有的概率值都为正且加起来等于1。因此,softmax回归的预测结果是一个概率向量,每个元素表示属于该类别的概率。
notes:
如果应用n等于2的Softmax回归,那么只有两个可能的输出类别,那么Softmax回归最终计算的结果与逻辑回归基本相同。参数最终会有点不同,但最终会简化为逻辑回归模型。
Softmax回归模型是逻辑回归的推广。
2、特点
引入指数函数的优点:
使用指数形式的Softmax函数能够将差距大的数值距离拉的更大。
在深度学习中通常使用反向传播求解梯度进而使用梯度下降进行参数更新的过程,而指数函数在求导的时候比较方便。
引入指数函数的缺点:
指数函数的曲线斜率逐渐增大虽然能够将输出值拉开距离,但是也带来了缺点,当值非常大的话,计算得到的数值也会变的非常大,数值可能会溢出。
3、代价函数
Softmax函数的代价函数通常使用交叉熵代价函数(Cross Entropy)。
设 为正确类别的概率,
为预测的类别概率。则交叉熵代价函数的形式为:
其中 表示类别的数量。
交叉熵代价函数的含义是,将所有正确类别的概率的对数与其相应的预测概率相乘并求和,然后取相反数。这个过程可以用来衡量预测的概率与实际情况的偏差,即误差大小。优化算法的目标就是最小化代价函数,从而让预测的概率更接近实际情况,提高模型的准确性。
notes:
代价函数是所有损失函数的平均。
鼓励把一个单独的特征给放大,同时缩小其他的,让那一个更突出。
我们的预测如果是y=1的时候,就需要y=1的概率尽可能地大,而log这个函数是一个单调函数,前面加一个负数就是值要尽可能的小,这样就把概率和Loss函数串联起来了。
二、神经网络的Softmax输出
1、示例
输出结果:
该例子是用10个类别识别从数字0到9的神经网络。将其改为有10个softmax输出单元。给定输入和
和
的情况下,此神经网络的前向传播的计算方式与之前完全相同。计算输出层的激活,即
。计算
到
,然后计算
到
,这是y对第一个到第十个标签的可能性的估计。
notes:
Softmax层有时也称为Softmax激活函数,与目前看到的其他,如Sigmoid函数,相比,它在一方面有点不寻常,那就是当查看Sigmoid函数时,a1是z1的函数,a2是z2的函数且仅是z2。换句话说,为了获得激活值,我们可以将激活函数(sigmoid)应用于z1和z2等等,以获得a1或a2等等,但是对于Softmax激活函数来说,请注意a1是z1、z2和z3一直到z10的函数,因此,这些激活值中的每一个都取决于z的所有值。
计算a1到a10,它是同时从z1一直到z10的函数。
2、在TensorFlow中使用Softmax激活函数
# 第一步,告诉tensorflow将三层依次串在一起 指定模型
import tensorflow sa tf
from tensorflow.keras import Sequnential
from tensorflow.keras.layers import Dense
model = Sequential([
Dense(units=25, activation='relu')
Dense(units=15, activation='relu')
Dense(units=10, activation='softmax') #10个输出标签
])
# 第二步,指定损失函数 和代价函数
from tensorflow.keras.losses import SparseCategoricalCrossentropy
model.compile(loss= SparseCategoricalCrossentropy()) #稀疏分类交叉熵函数
# Sparse Categorical 仍然是将y分类,Sparse 是指y只能取0-9这10个值之一
# 第三步,训练数据,最小化代价函数J
model.fit(X, Y, epochs=100)
上面这种写法是对的,可以计算出结果,但是不够好,因为这相当于分步计算,结果会有些偏差
3、Softmax的改进实现
结果误差:
计算机只有有限的内存来存储每个数字,在这种情况下称为浮点数,这取决于如何计算
的值,结果可能会有或多或少的数字舍入误差。
虽然第2节中计算softmax代价函数的方法是正确的,但是有一种不同的公式可以减少这些数值的舍入误差,从而在TensorFlow中实现更准确的计算。
先用逻辑回归来说明改进策略:
对于逻辑回归,当计算给定示例的损失函数时,需要先计算此输出激活a,然后计算loss损失值。对于逻辑回归,这可以正常工作,而且通常数值舍入误差还不错。(Original loss)
但是事实证明,如果允许TensorFlow不必计算a作为中间过渡项,将a这个表达式直接放入loss表达式中,然后TensorFlow可以重新排列这个表达式中的项,并用一种在数值上更准确的方法来计算这个loss函数。
原来的过程就像坚持计算一个中间值(Original loss),但是通过在loss函数中直接指定这个a的表达式作为loss函数,为计算提供了更大的灵活性。
代码所做的是将输出层设置为仅使用线性激活函数,并将激活函数放到这个交叉熵损失中,相当于直接把激活函数g(z)带入到损失函数中。
notes:
当将BinaryCrossEntropy函数中的参数设置为from_logits=True时,可以确保模型输出的未经处理的logits会被正确处理,避免了在处理概率时可能会出现的信息损失。
对于Softmax中的改进:
和逻辑回归一样,在loss函数中,我们将a的计算过程直接带入loss函数。使得TensorFlow可以重新排列并以精确的数值方式计算这个值。
事实证明,通过重新排列可以避免其中一些非常小或非常大的数字。
在代码中,输出层变成'linear',仅计算到
,然后在loss函数中计算整个的损失,之所以是linear是因为下面设定为True之后,softmax不再单独计算,只在计算loss时嵌入内部一起计算了,这样输出层只会输出z的值,不在带有softmax的计算。SparseCategoricalCrossEntropy本来就是用来进行多分类的loss算法。
4、多标签问题
多标签问题是指一个数据点可以被分配到多个标签中的一个或多个。比如在文本分类中,一篇文章可能同时被分到多个类别,如体育、娱乐、政治等;在图像分类中,一张图片可能有多个标签,如动物、植物、人物等。多标签问题是机器学习中常见的问题之一。解决多标签问题的方法有很多,包括二分类方式、多分类方式、基于回归的方法等等。
示例:
对于识别图像中是否有汽车、公交车和行人,这种情况下,y的目标实际上是三个数字的向量。
建立一个神经网络来解决这个问题时,可以有两种方式:
1)、将其视为3个完全独立的机器学习问题
建立一个神经网络来检测有没有汽车,第二个检测公交车,第三个检测行人
2)、训练一个神经网络,同时来检测汽车,公交车和行人
notes:
多类分类和多标签分类有时会相互混淆。
多类分类问题和多标签分类问题之间的区别在于,多类分类问题是指将每个数据点分到K个类别中的一个(K个类别互斥),而多标签分类问题是指将每个数据点分配到K个标签中的一个或多个(K个标签不互斥)。