损失函数
损失函数(loss function,也叫代价函数,cost function)用来评价模型输出的分值向量的好坏,分值向量与真实标签之间的差异越大,损失函数值就越大,反之则越小。
真实类别所对应的分值应当取最高分值,分值的绝对大小不能用来直接作出判断,一般使用相对大小或所占比例来判断,例如SVM损失函数采用相对大小来判断,本文的softmax则是采用所占比例来判断。
softmax损失函数
定义:
其中,i表示第i个样本,yi表示第i个样本的label,现在我们来解释这个公式。
假设我们的模型输出为s=(s1,s2,s3,s4,....,sk),这些模型输出可能为负数,所以无法之间计算各自所占的比例。那我们就需要一个映射函数,将这些输出映射为可计算的比例的向量。
(1)根据我们所学的数学知识,有许多函数都可以将这些值映射为正数,比如绝对值函数,平方函数都可以,但是在这里考虑到之后还要计算占比,这个映射函数必须是单调递增而且在实数范围内恒大于0。指数函数刚好满足上诉所有性质。
(2)通过e指数函数很容易计算出模型输出分量的所占比例,并且这些分量比例都是取开区间(0,1)的值,所有比例之和为1。
(3)真实类别所占的比例应当取最高分值并且越高越好。换句话说,当真实类别所占比例趋近于 0 时,损失函数值应该趋近于无穷大,当真实类别所占比例趋近于 1 时,损失函数值应该趋近于 0 ,并且损失函数的输入是(0,1)中的值。负对数函数刚好满足这些条件。
上诉三点刚好可以构建出我们现在所用的softmax损失函数(这个函数是不是和交叉熵很像 →_→ )。
python code:
# coding=utf-8
import numpy as np
D = 784
K = 10
N = 128
#scores 是分值矩阵,每行代表一个样本
scores = np.random.randn(N,K)
#样本标签
y = np.random.randint(K,size=N)
#指数化
exp_score = np.exp(scores)
#求和
exp_scores_sum = np.sum(exp_score,axis=1)
#计算比例
corect_probs = exp_score[range(N),y]/exp_scores_sum
#负对数损失函数
corect_logprobs = -np.log(corect_probs)
#平均损失
data_loss = np.sum(corect_logprobs)/N