神经网络损失函数
2018, AUG 3
顾名思义,从标题就能知道损失函数(Loss function)一定就是来计算神经网络在训练中的损失的。
以下是百度百科的通俗定义,在统计学中损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关,如费用或者设备的损失)程度的函数。
说完了定义那到了举例时间了:主要拿Softmax loss来分析
Softmax:
这里的K也就是我们分类的类别。然后这个函数是怎么用的呢,我们可以简单的举一个分类的例子来看下。假设我们输入一张猫的图片,并且有3个类别,得到三个未标准化(unnormalized)的对数(Log)概率分别是3.1, 4.3, -0.6:
类别\图片 | 猫.img | 未标准化的概率(exp) | 概率 |
---|---|---|---|
猫 | 3.1 | ||
狗 | 4.3 | ||
猪 | -0.6 |
概率计算公式:
如果我们让这些分数表示属于不同类别的概率,不同类别的概率中有一个是正确的,所以我们想要使正确分类的概率的对数最大,根据损失函数我们要是负的正确分类概率的对数最小,所以正确分类的对数要高,那么负的就要很低,使用log里面的值,就是这组数据正确分类的Softmax值,它占的比重越大,这个样本的Loss也就越小,可以看下面程序的输出便知道
类别\图片 | 猫.img | 未标准化的概率(exp) | 概率 |
---|---|---|---|
猫 | 3.1 | 22.2 | 0.23 |
狗 | 4.3 | 73.7 | 0.76 |
猪 | -0.6 | 0.55 | 0.01 |
对softmax的结果计算cross entropy loss:
import numpy as np
x = np.array([3.1, 4.3, -0.6])
y = []
p = []
for i in range(len(x)):
y.append(np.exp(x[i]))
for i in range(len(x)):
p.append(np.exp(x[i])/sum(y))
print("1.输入的图片属于猫-狗-猪类的得分:", x)
print("2.经过e^x处理后猫-狗-猪的分数:", y)
print("3.图片属于某猫-狗-猪类的概率:", p)
print("4.占的比重越大,样本的Loss也就越小 = ", -np.log(p))
print("5.loss = ", -np.log(p[0]))
1.输入的图片属于猫-狗-猪类的得分: [ 3.1 4.3 -0.6]
2.经过e^x处理后猫-狗-猪的分数: [22.197951281441636, 73.69979369959579, 0.5488116360940265]
3.图片属于某猫-狗-猪类的概率: [0.23015804876852072, 0.7641516326203891, 0.005690318611090187]
4.占的比重越大,样本的Loss也就越小 = [1.46898904 0.26898904 5.16898904]
5.loss = 1.4689890374923653
输出第四点只是为了让大家更直观的理解为什么占比(也就是概率)越大,样本loss越小。因为我们输入的是猫的图片,所以,我们最后的损失值也就是对应猫所在的那个,也是就最后的loss = 1.46.......