神经网络——损失函数

概念

神经网络的学习通过某个指标表示现在的状态。然后以这个指标为基准,寻找最优权重参数。神经网络的学习中所用的指标称为损失函数(loss function)。这个损失函数可以使用任意函数, 但一般用均方误差交叉熵误差等。
损失函数是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。 以“性能的恶劣程度”为指标可能会使人感到不太自然,但是如果给损失函数乘上一个负值,就可以解释为“在多大程度上不坏”, 即“性能有多好”。

均方误差

在这里插入图片描述
上面的公式中,yk是表示神经网络的输出,tk表示监督数据,k表示数据的维数。以0~9手写数字识别为例,神经网络softmax函数的输出y是:

y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0] 

由于softmax函数的输出可以理解为概率,因此上例表示“0”的概率是0.1,“ 1”的概率是0.05,“ 2”的概率是0.6 等。
t是监督数据,将正确解标签设为1,其他均设为0。假设该案例的t值为:
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
这里,标签“2”为 1, 表示正确解是“2”。(将正确解标签表示为1,其他标签表示为0的表示方法称为one-hot表示。)
均方误差会计算神经网络的输出和正确解监督数据的各个元素之差的平方,再求总和。则python实现代码为:

def mean_squared_error(y, t):      
    return 0.5 * np.sum((y-t)**2)

假设该案例的正确解为2,即:

 t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

1)第一种情况:

 y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0] 

此时,标签为2的概率为0.6. 则计算的损失函数结果为:
loss1 = mean_squared_error(np.array(y1), np.array(t))
loss1 = 0.097500000000000031
2)第二种情况:

y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0] 

此时,标签为7的概率最高,为0.6.此时计算损失函数的结果是:
loss2 = mean_squared_error(np.array(y2), np.array(t))
loss2 = 0.59750000000000003
比较两个损失函数结果,第一个例子的损失函数的值更小,表示结果数据和监督数据之间的误差较小。即,均方误差显示第一个例子的输出结果与监督数据更加吻合。

交叉熵误差

在这里插入图片描述
log表示以e为底数的自然对数(log e)。 yk是神经网络的输出,tk是正确解标签。
因为 tk中只有正确解标签的索引为1,其他均为0(one-hot表示)。 因此,式实际上只计算对应正确解标签的输出的自然对数。交叉熵误差的值是由正确解标签所对应的输出结果决定的。

在这里插入图片描述

如上图所示,x等于1时,y为0;随着x向0靠近,y逐渐变小。因此,正确解标签对应的输出越大,损失函数的值越接近0。python实现代码如下:

def cross_entropy_error(y, t):       
    delta = 1e-7    
    return -np.sum(t * np.log(y + delta))

同上述案例,假设正确解为2,即:

 t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

1)第一种情况:

 y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0] 

此时,标签为2的概率为0.6. 则计算的损失函数结果为:
loss1 = cross_entropy_error(np.array(y1), np.array(t))
loss1 = 0.51082545709933802
2)第二种情况:

  y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0] 

此时,标签为7的概率最高,为0.6.此时计算损失函数的结果是:
loss2 = cross_entropy_error(np.array(y2), np.array(t))
loss2 = 2.3025840929945458
比较两个损失函数结果,第一个例子的损失函数的值更小,表示结果数据和监督数据之间的误差较小。即,交叉熵误差显示第一个例子的输出结果与监督数据更加吻合。

参考:深度学习入门–基于python的理论与实现(Deep learning from scratch)

### SNN中的损失函数 在Siamese神经网络(Siamese Neural Networks, SNN)中,常用的损失函数主要分为对比损失(Contrastive Loss)[^1] 和三元组损失(Triplet Loss)[^1]。 #### 对比损失 (Contrastive Loss) 对比损失用于衡量一对输入样本之间的相似度。如果两个输入属于同一类别,则希望它们在网络输出空间的距离尽可能小;反之则距离应较大。具体定义如下: 设\(d\)表示两输入特征向量间的欧氏距离,\(y\)为标签(相同类别的样本标记为0,不同类别标记为1),那么对比损失可以表达为: \[L(y,d)=\begin{cases} d^2 & \text{if } y=0 \\ (\max(margin-d, 0))^2 & \text{if } y=1 \end{cases}\] 其中`margin`是一个超参数,用来控制当样本不属于同一个类别时最小期望距离。 ```python def contrastive_loss(d, y, margin=1.0): return torch.mean((1-y) * torch.pow(d, 2) + y * torch.pow(torch.clamp(margin - d, min=0.0), 2)) ``` #### 三元组损失 (Triplet Loss) 不同于仅考虑成对数据的对比损失,三元组损失引入了一个额外的负样本来构建训练样本集——即对于每一个正样本,不仅需要找到一个来自同一个人的不同图像作为正样本,还需要找到来自其他人的图片作为负样本。其目的是拉近同类样本间距离的同时推远异类样本间距。形式化描述如下: 给定锚点(anchor),正样本(positive),以及负样本(negative),令 \(a,p,n\)分别代表这三种类型的嵌入(embedding),则有: \[ L(a, p, n) = max(\|f(a)-f(p)\|^2-\|f(a)-f(n)\|^2+\alpha ,0)\] 这里\(\alpha>0\)同样作为一个边界值来确保即使是最难区分的情况也能保持一定间隔。 ```python import tensorflow as tf def triplet_loss(y_true, embeddings, alpha=0.2): anchor, positive, negative = embeddings[0],embeddings[1],embeddings[2] pos_dist = tf.reduce_sum(tf.square(anchor - positive), axis=-1) neg_dist = tf.reduce_sum(tf.square(anchor - negative), axis=-1) basic_loss = pos_dist - neg_dist + alpha loss = tf.maximum(basic_loss, 0.0) return tf.reduce_mean(loss) ``` 通过上述两种方式之一或者组合使用,能够有效地导SNN学习到具有判别性的特征表示,在诸如人脸识别、签名验证等领域取得了良好的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值