栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

深度学习六 —— 手撕MSE Loss& CE Loss

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深度学习六 —— 手撕MSE Loss& CE Loss

文章目录
  • 交叉熵损失 (CE Loss)
    • 含义
    • 公式
    • 二分类交叉熵
      • 公式
      • 手撕BCE Loss
    • 多分类交叉熵
      • 公式
      • 手撕CE Loss
  • MSE Loss(均方误差损失、L2 Loss)
    • 公式
    • 手撕MSE Loss
  • MSE & CE部分理解分析
    • 回归问题为什么不使用交叉熵?
      • 1. 直观理解
      • 2. 理论分析
    • MSE和CE的 优缺点(相同点和不同点)

交叉熵损失 (CE Loss) 含义

用来描述两个分布之间的距离

公式

E = − ∑ i y i l o g ( p i ) E=-sum_{i}y_ilog(p_i) E=−i∑​yi​log(pi​)

其中,

y y y——真值,one-hot向量标签

p i p_i pi​——softmax的结果, ∑ i p i = 1 sum_{i}p_i=1 ∑i​pi​=1

二分类交叉熵 公式

E = 1 N ∑ i L i = − 1 N ∑ i − [ y i ⋅ l o g ( p i ) + ( 1 − y i ) ⋅ ( 1 − p i ) ] E=frac{1}{N}sum_{i}L_i= -frac{1}{N}sum_{i}-[y_i cdot log(p_i)+(1-y_i)cdot(1-p_i)] E=N1​i∑​Li​=−N1​i∑​−[yi​⋅log(pi​)+(1−yi​)⋅(1−pi​)]

其中,

y i y_i yi​——表示样本 i i i的真值,正样本为1,负样本为0,

p i p_i pi​——表示样本 i i i预测为正类的概率。

手撕BCE Loss
def softmax(x):
    exps = np.exp(x - np.max(x))
    return exps / np.sum(exps)
 
 
def cross_entropy_error(p, y):
    """
 
    :param p: 预测结果
    :param y: 真值的 one-hot 编码
    :return:
    """
    delta = 1e-7  # 添加一个微小值,防止负无穷(np.log(0))的情况出现
    p = softmax(p)
    return -np.sum(y * np.log(p + delta))
多分类交叉熵 公式

多分类情况就是对二分类情况的扩展,公式如下:

E = 1 N ∑ i L i = − 1 N ∑ i ∑ c = 1 M y i c l o g ( p i c ) E=frac{1}{N}sum_{i}L_i= -frac{1}{N}sum_{i}sum_{c=1}^{M}y_{ic}log(p_{ic}) E=N1​i∑​Li​=−N1​i∑​c=1∑M​yic​log(pic​)

其中,

l o g log log——以 e e e为底的自然对数( l o g e log_e loge​),

M M M——类别数量,

y i c y_{ic} yic​——符号函数(0或1),如果样本 i i i的真值等于c取1,否则取0

p i c p_{ic} pic​——观测样本i属于类别c的预测概率

手撕CE Loss
def sigmoid(x):
    return 1 / (1 + np.exp(x))
 
 
def cross_entropy_error(p, y):
    """
 
    :param p: 预测结果
    :param y: 真值的 one-hot 编码
    :return:
    """
    delta = 1e-7  # 添加一个微小值,防止负无穷(np.log(0))的情况出现
    p = sigmoid(p)
    return -np.sum(y * np.log(p + delta) + (1 - y) * np.log(1 - p + delta))
 
MSE Loss(均方误差损失、L2 Loss) 公式

E = 1 2 ∑ i = 1 n ( y i − t i ) 2 E=frac{1}{2}sum_{i=1}^{n}(y_i-t_i)^2 E=21​i=1∑n​(yi​−ti​)2

其中,

y i y_i yi​——网络输出

t i t_i ti​——真值

n n n——数据维度。

手撕MSE Loss
def mean_squared_error(y, t):
    """
 
    :param y: numpy array
    :param t: numpy array
    :return:
    """
    return 0.5 * np.sum(y, t)
MSE & CE部分理解分析 回归问题为什么不使用交叉熵? 1. 直观理解

回归问题通常对每一个输出结果都十分关注,比如MSE Loss,但是交叉熵损失只对正常分类的结果看重。

例如:对于一个多分类模型,其模型输出为 ( a , b , c ) (a, b, c) (a,b,c),而实际的真值结果为 ( 1 , 0 , 0 ) (1, 0, 0) (1,0,0)。则根据两种损失函数的定义,他们的损失函数可以分别描述为:

L M S E = ( a − 1 ) 2 + ( b − 0 ) 2 + ( c − 1 ) 2 = ( a − 1 ) 2 + b 2 + c 2 L_{MSE}=(a-1)^2+(b-0)^2+(c-1)^2=(a-1)^2+b^2+c^2 LMSE​=(a−1)2+(b−0)2+(c−1)2=(a−1)2+b2+c2

L C E = − 1 × l o g a − 0 × l o g b − 0 × l o g c = − l o g a L_{CE}=-1times loga - 0 times logb - 0 times logc = -loga LCE​=−1×loga−0×logb−0×logc=−loga

由上述结果可以看出,交叉熵损失函数只与正确的预测结果有关,而平方误差损失则还与错误的分类有关,该损失除了让正确的结果尽可能变大,还会让错误的结果尽可能变得平均。但是实际在CE Loss中,后面两个调整都失效了,但是对于回归问题,这个调整就很重要,因此回归问题中交叉熵并不适用。

2. 理论分析

平方函数损失函数假设服从高斯分布,而高斯分布实际上是一个连续的变量,并不是一个离散的变量。如果假设结果变量服从均值为 μ mu μ,方差为 σ sigma σ,那么利用最大似然估计的方法,就可以优化它的负对数似然,公式最终变为了:

L C E = m a x ∑ i N [ − 1 2 ( 2 π σ 2 ) − ( t i − y ) 2 σ 2 ] L_{CE}=maxsum_i^{N}[-frac{1}{2}(2pisigma^2)-frac{(t_i-y)}{2sigma^2} ] LCE​=maxi∑N​[−21​(2πσ2)−2σ2(ti​−y)​]

除去与 y y y无关的项目,最后剩下的就是平方损失函数的形式。

MSE和CE的 优缺点(相同点和不同点)
  • 相同点:当输出值与真值接近的话, CE和MSE的值都会接近0
  • CE具有MSE不具有的优点:避免学习率降低的情况。
    • 均方误差对参数的偏导的结果都 乘了sigmoid的导数 σ ′ ( z ) x sigma'(z)x σ′(z)x,而sigmoid的导数在其变量值很大或很小的情况下,趋近于0,所以导致偏导数很有可能接近0.
    • 由参数更新公式: 参 数 = 参 数 − 学 习 率 × 损 失 函 数 对 参 数 的 偏 导 参数=参数-学习率times损失函数对参数的偏导 参数=参数−学习率×损失函数对参数的偏导
    • 可知,偏导很小时,参数的更新速度就会变得很慢,当偏导接近0时,参数几乎就不更新了。
    • 反观交叉熵对参数的偏导就没有sigmoid导数,所以不存在这个问题。 这就是分类问题选择交叉熵而不选择均方差的原因
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/972009.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号