乐趣区

关于机器学习:MindSpore损失函数nnSoftmaxCrossEntropyWithLogits-解析

  1. 对于 Softmax 机器学习中有一个经典的办法:逻辑回归 (Logistic Regression)。它属于一种有监督学习(Supervised Learning) 办法。逻辑回归输入的范畴为 0 - 1 的值,示意概率,并根据概率的大小将样本归类,其中包含二分类问题与多分类问题。二分类逻辑回归模型输入一个值,该值用于示意样本属于其中一类的概率,多分类逻辑回归模型的输入后果为所有类别的概率分布。在多分类深度神经网络中,在输入层加上 Softmax,使得输入后果为 0~1 的向量,合为 1,示意一种概率分布。此时概率最大的项作为分类预测的类别。Softmax 便是沿用了逻辑回归的办法。

    具体内容可参考:二分类逻辑回归与多分类逻辑回归的公式推导。2. 穿插熵穿插熵(Cross Entropy)实质上是用来掂量两个概率分布的相似性:“… the cross entropy is the average number of bits needed to encode data coming from a source with distribution p when we use model q …”— Page 57, Machine Learning: A Probabilistic Perspective, 2012. 穿插熵能够用来评估两个概率事件 P 和 Q 的相似性计算,公式如下 H(P,Q) = – \sum_x^X P(x) * log(Q(x))H(P,Q)=–x∑X​P(x)∗log(Q(x))3. 分类工作损失函数分类工作的损失函数,就是计算输入后果的预测分类与给定标签的误差,该误差越小越好。简略来说,对于二分类工作,如果给定的标签是 1,则模型的输入值越靠近 1 越好;若标签为 0,则模型输入值越靠近于 0 越好。换句话说,若标签为 1,则最大化概率 P(y_i =1)P(yi​=1)。穿插熵 (Cross Entropy) 能够掂量两个概率分布之间的间隔的,Softmax 能把所有转换成概率分布。那么天然二者一起应用能够用于分类工作的损失函数。依据穿插熵的定义,因为一个样本只有一个标签,即给定标签只存在一个 P(x)=1P(x)=1,其余值为 0,不难得出穿插熵损失函数计算公式:loss(x, c) = -log(\frac{e^{x_c}}{\sum_j^ne^{x_j}}) = -x_c + log({\sum_j^ne^{x_j}})loss(x,c)=−log(∑jn​exj​exc​​)=−xc​+log(j∑n​exj​)其中,n 示意分类标签的个数,x 为长度 n 的向量,示意预测每个标签的概率值,c 是实在标签对应的编号地位,取值范畴[0,n-1]。4. nn.SoftmaxCrossEntropyWithLogits 的应用 SoftmaxCrossEntropyWithLogits 接口就是分类工作的穿插熵损失函数实现,接口参数阐明见官网文档。上面介绍如何应用 SoftmaxCrossEntropyWithLogits。sparse=Fasle,示意输出参数 labels 与输出参数 shape 雷同,给出了每个 label 对应的值。from mindspore import Tensor, nn
    import numpy as np
    import mindspore
    x = Tensor(np.array([[1, 2, 3]]),mindspore.float32)
    y1 = Tensor(np.array([[0, 1, 0]]), mindspore.float32)
    loss_false = nn.SoftmaxCrossEntropyWithLogits(sparse=False)

print(“x shape:”, x.shape)
print(“y1 shape:”, y1.shape)
out1 = loss_false(x, y1)

print(“sparse false:”, out1)

def softmax_cross_entropy(x, c):

exps = np.exp(x)
return -x + np.log(np.sum(exps))

x = np.array([1,2,3])
c = 1
out3 = softmax_cross_entropy(x, c)
print(“numpy:”, out3)
输入后果如下 x shape: (1, 3)
y1 shape: (1, 3)
sparse false: [1.4076059]
numpy: 1.4076059644443801
sparse=true 时,输出 y 是一维,示意真标签对应的地位 from mindspore import Tensor, nn
import numpy as np
import mindspore

x = Tensor(np.array([[1, 2, 3]]),mindspore.float32)
y2 = Tensor(np.array([1]), mindspore.int32) # 编号 1 标签为真
loss_true = nn.SoftmaxCrossEntropyWithLogits(sparse=True)
print(“x shape:”, x.shape)
print(“y2 shape:”, y2.shape)
out2 = loss_true(x, y2)
print(“sparse true:”, out2)
输入后果:x shape: (1, 3)
y2 shape: (1,)
sparse true: [1.4076059]
总结:1、因为数据批处理的起因,接口参数 logits 只反对二维输出,第一维度示意的是 batch size;2、sparse 参数取不同的值,对输出 labels 的 shape 和 type 有不同的要求;3、reduction 参数能够指定利用于输入后果的计算形式,例如求均值、求和等。

退出移动版