采样softmax(Sampled softmax )

采样softmax(Sampled softmax ),第1张

原文: https://www.tensorflow.org/extras/candidate_sampling.pdf

假设有一个单分类问题。训练集中的每个样本 包含一个上下文和一个目标类。将给定上下文 时,目标类为 写作概率

我们使用函数 产生softmax logits,即对数化的概率:

其中 是一个不依赖 的函数。

在完整的softmax训练中,对于每个训练样本 ,都需要对所有的分类 计算 。如果分类集L非常大,该 *** 作将变得非常昂贵。

而在“Sampled Softmax”中,对于每个训练样本 ,我们根据一个选定的抽样函数 来选择一个小的采样分类集 ,其中的每一个分类 都以概率 独立的存在:

我们创建一个候选集 ,联合了目标分类和采样的分类集:

我们的训练任务是计算出,在给定候选集 的条件下, 中的哪一个分类是目标分类。

对于 中的每一个分类 ,我们想要计算出当给定 和 时, 的后验概率,记作 :

应用贝叶斯法则:

现在,来计算 ,我们注意到要使这发生, 可能在也可能不在 中, 一定包含 中所有的其它(除 外)元素,并且不包含任何不在 中的元素,

因此:

是一个不依赖于y的函数,所以:

这些是应该输入softmax分类器的相对logits,用于预测 中的哪一个候选类才是真正的分类。

既然我们试图训练函数 来拟合 ,我们用神经网络中的层输出表示 ,然后减去 ,将结果传入一个softmax分类器来预测哪个候选是真正的分类。

从分类输出中反向传播梯度到F,这就是我们所要的。

参考: https://baijiahao.baidu.com/s?id=1636737136973859154&wfr=spider&for=pc

在一个最近的一个项目中,发现自己对sigmoid函数和softmax函数的概念和用法比较模糊,特地做一下总结

假设一张图片丢进一个神经网络(例如resnet50),最后的输出为一个向量,如[-0.5, 1.2, -0.1, 2.4],分别对应四中不同的标签.

Sigmoid函数或Softmax函数可以将分类器的原始输出值映射为概率。那么什么时候用到sigmoid,什么时候用softmax呢?

下图显示了将前馈神经网络的原始输出值(蓝色)通过Sigmoid函数映射为概率(红色)的过程:

然后采用Softmax函数重复上述过程:

如图所示,Sigmoid函数和Softmax函数得出不同结果。

原因在于,Sigmoid函数会分别处理各个原始输出值,因此其结果相互独立,概率总和不一定为1,如图0.37 + 0.77 + 0.48 + 0.91 = 2.53。

相反,Softmax函数的输出值相互关联,其概率的总和始终为1,如图0.04 + 0.21 + 0.05 + 0.70 = 1.00。因此,在Softmax函数中,为增大某一类别的概率,其他类别的概率必须相应减少

Sigmoid函数如下所示(注意e):

在该公式中,σ表示Sigmoid函数,σ(zj)表示将Sigmoid函数应用于数字Zj。 “Zj”表示单个原始输出值,如-0.5。 j表示当前运算的输出值。如果有四个原始输出值,则j = 1,2,3或4。在前面的例子中,原始输出值为[-0.5,1.2,-0.1,2.4],则Z1 = -0.5,Z2 = 1.2,Z3 = -0.1,Z4 = 2.4。

所以,

Z2,Z3、Z4 的计算过程同上。

由于Sigmoid函数分别应用于每个原始输出值,因此可能出现的输出情况包括:所有类别概率都很低一种类别的概率很高但是其他类别的概率很低,多个或所有类别的概率都很高。

下图为Sigmoid函数曲线:

Sigmoid =多标签分类问题=多个正确答案=非独占输出(例如胸部X光检查、住院)

构建分类器,解决有多个正确答案的问题时,用Sigmoid函数分别处理各个原始输出值 。

Softmax函数的分母综合了原始输出值的所有因素,这意味着,Softmax函数得到的不同概率之间相互关联。

Softmax函数表述如下:

除分母外,为综合所有因素,将原始输出值中的e ^ thing相加,Softmax函数与Sigmoid函数差别不大。换言之,用Softmax函数计算单个原始输出值(例如Z1)时,不能只计算Z1,分母中的Z1,Z2,Z3和Z4也应加以计算,如下所示:

区分手写数字时,用Softmax函数处理原始输出值,如要增加某一示例被分为“8”的概率,就要降低该示例被分到其他数字(0,1,2,3,4,5,6,7和/或9)的概率。

Softmax =多类别分类问题=只有一个正确答案=互斥输出(例如手写数字,鸢尾花)

构建分类器,解决只有唯一正确答案的问题时,用Softmax函数处理各个原始输出值。

你好,下面是一个keras的softmax分类器+自编码器的python代码。你需要安装最新的theano1.0.4才可以跑。

import os

os.environ['KERAS_BACKEND'] = 'theano'

import keras

from keras.datasets import mnist

from keras.models import Model

from keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, UpSampling2D

batch_size = 128

num_classes = 10

epochs = 12

# input image dimensions

img_rows, img_cols = 28, 28

# Data 

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1).astype('float32') / 255

x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1).astype('float32') / 255

y_train = keras.utils.to_categorical(y_train, num_classes)

y_test = keras.utils.to_categorical(y_test, num_classes)

# Convolutional Encoder

input_img = Input(shape=(img_rows, img_cols, 1))

conv_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)

pool_1 = MaxPooling2D((2, 2), padding='same')(conv_1)

conv_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool_1)

pool_2 = MaxPooling2D((2, 2), padding='same')(conv_2)

conv_3 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool_2)

encoded= MaxPooling2D((2, 2), padding='same')(conv_3)

# Classification

flatten = Flatten()(encoded)

fc = Dense(128, activation='relu')(flatten)

softmax = Dense(num_classes, activation='softmax', name='classification')(fc)

# Decoder

conv_4 = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)

up_1 = UpSampling2D((2, 2))(conv_4)

conv_5 = Conv2D(8, (3, 3), activation='relu', padding='same')(up_1)

up_2 = UpSampling2D((2, 2))(conv_5)

conv_6 = Conv2D(16, (3, 3), activation='relu')(up_2)

up_3 = UpSampling2D((2, 2))(conv_6)

decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same', name='autoencoder')(up_3)

model = Model(inputs=input_img, outputs=[softmax, decoded])

model.compile(loss={'classification': 'categorical_crossentropy', 

                    'autoencoder': 'binary_crossentropy'},

              optimizer='adam',

              metrics={'classification': 'accuracy'})

model.fit(x_train, 

          {'classification': y_train, 'autoencoder': x_train},

          batch_size=batch_size,

          epochs=epochs,

          validation_data= (x_test, {'classification': y_test, 'autoencoder': x_test}),

          verbose=1)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8049415.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存