深度学习六 —— 手撕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=iyilog(pi)

其中,

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

p i p_i pi——softmax的结果, ∑ i p i = 1 \sum_{i}p_i=1 ipi=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=N1iLi=N1i[yilog(pi)+(1yi)(1pi)]

其中,

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=N1iLi=N1ic=1Myiclog(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=21i=1n(yiti)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=(a1)2+(b0)2+(c1)2=(a1)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}=-1\times loga - 0 \times logb - 0 \times logc = -loga LCE=1×loga0×logb0×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}=max\sum_i^{N}[-\frac{1}{2}(2\pi\sigma^2)-\frac{(t_i-y)}{2\sigma^2} ] LCE=maxiN[21(2πσ2)2σ2(tiy)]

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

MSE和CE的 优缺点(相同点和不同点)

  • 相同点:当输出值与真值接近的话, CE和MSE的值都会接近0
  • CE具有MSE不具有的优点:避免学习率降低的情况。
    • 均方误差对参数的偏导的结果都 乘了sigmoid的导数 σ ′ ( z ) x \sigma'(z)x σ(z)x,而sigmoid的导数在其变量值很大或很小的情况下,趋近于0,所以导致偏导数很有可能接近0.
    • 由参数更新公式: 参 数 = 参 数 − 学 习 率 × 损 失 函 数 对 参 数 的 偏 导 参数=参数-学习率\times损失函数对参数的偏导 =×
    • 可知,偏导很小时,参数的更新速度就会变得很慢,当偏导接近0时,参数几乎就不更新了。
    • 反观交叉熵对参数的偏导就没有sigmoid导数,所以不存在这个问题。 这就是分类问题选择交叉熵而不选择均方差的原因

你可能感兴趣的:(深度学习,深度学习,机器学习,分类)