深度学习之Softmax损失函数 python实现

损失函数
损失函数(loss function,也叫代价函数,cost function)用来评价模型输出的分值向量的好坏,分值向量与真实标签之间的差异越大,损失函数值就越大,反之则越小。
真实类别所对应的分值应当取最高分值,分值的绝对大小不能用来直接作出判断,一般使用相对大小或所占比例来判断,例如SVM损失函数采用相对大小来判断,本文的softmax则是采用所占比例来判断。
softmax损失函数
定义:

softmax损失函数.png

其中,i表示第i个样本,yi表示第i个样本的label,现在我们来解释这个公式。

假设我们的模型输出为s=(s1,s2,s3,s4,....,sk),这些模型输出可能为负数,所以无法之间计算各自所占的比例。那我们就需要一个映射函数,将这些输出映射为可计算的比例的向量。

(1)根据我们所学的数学知识,有许多函数都可以将这些值映射为正数,比如绝对值函数,平方函数都可以,但是在这里考虑到之后还要计算占比,这个映射函数必须是单调递增而且在实数范围内恒大于0。指数函数刚好满足上诉所有性质。

e指数函数.png

(2)通过e指数函数很容易计算出模型输出分量的所占比例,并且这些分量比例都是取开区间(0,1)的值,所有比例之和为1。

(3)真实类别所占的比例应当取最高分值并且越高越好。换句话说,当真实类别所占比例趋近于 0 时,损失函数值应该趋近于无穷大,当真实类别所占比例趋近于 1 时,损失函数值应该趋近于 0 ,并且损失函数的输入是(0,1)中的值。负对数函数刚好满足这些条件。

负对数函数.png

上诉三点刚好可以构建出我们现在所用的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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容