机器学习(深度学习)Softmax和Sigmoid函数

文章目录

      • (1)相关背景
      • (2)softmax激活函数应用于多分类
      • (3) sigmoid激活函数应用于多标签分类

Softmax和Sigmoid函数理解

(1)相关背景

  • sigmoidsoftmax是神经网络输出层使用的激活函数,分别用于两类判别和多类判别。binary cross-entropycategorical cross-entropy是相对应的损失函数。
  • 对应的激活函数和损失函数相匹配,可以使得error propagation的时候,每个输出神经元的“误差”(损失函数对输入的导数)恰等于其输出与ground truth之差。
  • Sigmoid 将一个实数映射到 (0,1) 的区间,可以用来做二分类。Sigmoid 在特征相差比较复杂或是相差不是特别大时效果比较好。Sigmoid不适合用在神经网络的中间层,因为对于深层网络,sigmoid 函数反向传播时,很容易就会出现梯度消失的情况(在 sigmoid 接近饱和区时,变换太缓慢,导数趋于 0,这种情况会造成信息丢失),从而无法完成深层网络的训练。所以Sigmoid主要用于对神经网络输出层的激活。如下图所示为函数以及对应的函数曲线:
    机器学习(深度学习)Softmax和Sigmoid函数_第1张图片
    机器学习(深度学习)Softmax和Sigmoid函数_第2张图片
  • 在训练时,一般将softmax用于多类分类,而sigmoid用于多标签分类之中,对于图像处理而言,网络模型抽取图像特征的结构基本相同,只是根据不同的任务改变全连接层后的输出层。

σ i ( z ) = e z i ∑ j = 1 m e z i {\sigma _i}(z) = \frac{{{e^{{z_i}}}}}{{\sum\limits_{j = 1}^m {{e^{{z_i}}}} }} σi(z)=j=1meziezi

∑ i = 1 J σ i ( z ) = 1 \sum\limits_{i = 1}^J {{\sigma _i}(z)} = 1 i=1Jσi(z)=1
机器学习(深度学习)Softmax和Sigmoid函数_第3张图片

机器学习(深度学习)Softmax和Sigmoid函数_第4张图片

(2)softmax激活函数应用于多分类

      假设神经网络模型的最后一层的全连接层输出的是一维向量

 logits=[1,2,3,4,5,6,7,8]

这里假设总共类别数量为8,使用softmax分类器完成多类分类问题,并将损失函数设置为categorical_crossentropy损失函数,用Tensorflow实现:

tf.argmax(tf.softmax(logits))

用keras实现为:

keras.activations.softmax(x, axis=-1)

      首先用softmaxlogits转换成一个概率分布,然后取概率值最大的作为样本的分类 。softmax的主要作用其实是在计算交叉熵上,将logits转换成一个概率分布后再来计算,然后取概率分布中最大的作为最终的分类结果,这就是将softmax激活函数应用于多分类中。

(3) sigmoid激活函数应用于多标签分类

      sigmoid一般不用来做多类分类,而是用来做二分类,它是将一个标量数字转换到[0,1]之间,如果大于一个概率阈值(一般是0.5),则认为属于某个类别,否则不属于某个类别。这一属性使得其适合应用于多标签分类之中,在多标签分类中,大多使用交叉熵(binary_crossentropy)损失函数。本质上其实就是针对logits中每个分类计算的结果分别作用一个sigmoid分类器,分别判定样本是否属于某个类别同样假设,神经网络模型最后的输出是这样一个向量

logits=[1,2,3,4,5,6,7,8]

就是神经网络最终的全连接的输出。这里假设总共有8个分类。
用tensorflow实现:

tf.sigmoid(logits)

      sigmoid应该会将logits中每个数字都变成[0,1]之间的概率值,假设结果为

  [0.03,0,6, 0.2, 0.5, 0.09, 0.1, 0.7, 0.1]

然后设置一个概率阈值,比如0.4,如果概率值大于0.4,则判定类别符合,那么该输入样本则会被判定为类别2、类别4以及类别7。即一个样本具有多个标签。
      需要注意的是:将sigmoid激活函数应用于多标签分类时,其损失函数应设置为binary_crossentropy(交叉熵);

你可能感兴趣的:(深度学习,机器学习,损失函数,人工智能,神经网络)