pytorch(1)-激活函数sigmoid、损失函数MSE,CrossEntropyLoss

1.激活函数

全连接网络又叫多层感知器,多层感知器的基本单元神经元是模仿人类神经元兴奋与抑制机制,对其输入进行加权求和,若超过某一阈值则该人工神经元输出为1,否则输出为0。即 原初的激活函数为阶跃函数。由于,sigmoid函数便于求导,便于求导。(因为要优化w,所以要求激活函数应该连续,能够对权重w可求导)。所以实际应用使用的激活函数为sigmoid函数。
小结激活函数的特点: 连续的光滑函数,便于求导。
在这里插入图片描述
在这里插入图片描述
sigmoid函数阶跃函数的平滑近似。

2.损失函数

神经网络中的损失函数用于衡量网络输出期望输出的之间的差距。当神经网络用于多类别分类时,一般采用 one-hot向量进行编码。

如神经网络用于MNIST手写数字的识别,每张图片输入网络后,将输出一个10维的向量Y,10维向量的第k维可以看成是该图片是数字k的概率,那么,这张图片最有可能是输出最大维数对应的数字。

损失函数是用于衡量差距的,换一句话说,当网络输出与期望输出越接近时,损失函数值应该越小。并且当网络输出==期望输出时,损失函数应该为0,也就是说,损失函数具有非负性。小结损失函数的两点特性:
(1).网络输出与期望输出越接近时,损失函数值应该越小;
(2)损失函数具有非负性
只要满足以上两点约束的函数都能设计成损失函数,在实际应用中,一个设计良好的损失函数可能会引发一场新的研究热潮。因此,损失函数的设计也是神经网络研究中一块重要的内容。

本文以下总结常用的一些损失函数,并且,附上pytorch相应实例函数。

2.1均方误差损失函数

在这里插入图片描述
来自官网的解释:求的是网络输出向量x目标向量y 之间的均方差,每一维度的求差、求平方、求和、求平均。如果将reduction=‘sum’,那么只到求和,不求平均。

均方误差损失函数使用例子:

loss = nn.MSELoss()
input = torch.randn(3, 10, requires_grad=True)
target = torch.randn(3, 10)
output = loss(input, target)
output.backward()

损失函数输入数据格式要求(3为minibatch的大小):Input: (3, 10),Target: (3, 10)
网络最后一层输出采用sigmoid函数作为激活函数。

2.2交叉熵损失函数

交叉熵概念源于信息论, 用于衡量估计模型概率分布真实概率分布之间的差异,随机变量X~p(n),q(n) 为p(n) 的近似概率分布,则随机变量X与模型 q 之间的交叉熵为:
H ( X , q ) = n p ( n ) l o g q ( n ) H(X,q)=-\sum_np(n)logq(n)
通过数学推导可得,交叉熵=随机变量的熵+真实分布与模型分布的差距
H ( X , q ) = H ( X ) + D ( p q ) H(X,q)=H(X)+D(p||q)

其中, D ( p q ) D(p||q) 为相对熵, H ( X ) H(X) 为随机变量的熵。因为,在同一随机变量的前提下(H(X)相同),真实分布与模型分布的差距(即相对熵 D ( p q ) D(p||q) )越小,则交熵越小。也就是说, 交叉熵满足 损失函数的两条特性。所以可以采用交叉熵作为损失函数。

交叉熵衡量的是两个两个概率分布之间的差距,所以,全连接网络的最后一层输出应该采用softmax() 函数,将输出转化为概率分布;期望输出(标签向量)采用onehot编码。网络最后一层的加权输出向量 x x 通过 s o f t m a x ( ) softmax() 激活后:
s o f t m a x ( z ) k = e x k i e x i softmax(z)_k=\frac{e^{x_k}}{\sum_ie^{x_i} }\\
计算网络输出目标输出之间的交叉熵
L o s s ( z , l a b e l ) = H ( z , l a b e l ) = l o g e x j i e x i Loss(z,label)=H(z,label)=-log\frac{e^{x_j}}{\sum_ie^{x_i} }
其中, j j 为l l a b e l label 中为1 的维度,也就是,待检测目标所属的类别。

因为,上面两个式子可以化简,直接取最后的结果:

L o s s ( x , l a b e l ) = l o g e x j i e x i Loss(x,label)=-log\frac{e^{x_j}}{\sum_ie^{x_i}}

所以,在pytorch 中**CrossEntropyLoss()**函数的输入为:最后一层全连接的加权输出向量(不经过softmax()激活),和期望输出的onehot编码中为1的位置(类别标号,是一个标量,如手写数字识别,真实数字8的标号为7)。
在这里插入图片描述
交叉差熵损失函数使用例子:

loss = nn.CrossEntropyLoss()
input = torch.randn(3, 10), requires_grad=True) #minibatch=3,即3行,每一行为一个10维向量
target = torch.empty(3, dtype=torch.long).random_(10) # 1行,3列,每一列的数字为0-10之间的整数
output = loss(input, target)
output.backward()

2.3 NLLLoss()

同时,pytorch 还提供了nn.LogSoftmax()与NLLLoss()的组合,实现交叉熵损失函数。此时,网络的最后一层加权输出,要经过nn.LogSoftmax()进行激活;
NLLLoss()使用例子:

m = nn.LogSoftmax(dim=1)
loss = nn.NLLLoss()
#input is of size N x C = 3 x 5
input = torch.randn(3, 5, requires_grad=True)
#each element in target has to have 0 <= value < C
target = torch.tensor([1, 0, 4])
output = loss(m(input), target)
output.backward()

在这里插入图片描述
在这里插入图片描述

官网文档连接(英文):https://pytorch.org/docs/stable/nn.html

猜你喜欢

转载自blog.csdn.net/sinat_40624829/article/details/89819040