神经网络常用损失函数Loss Function

深度学习神经网络常用损失函数

    • 损失函数--Loss Function
        • 1. MSE--均方误差损失函数
        • 2. CEE--交叉熵误差损失函数
        • 3. mini-batch版交叉熵误差损失函数

损失函数–Loss Function

  • 损失函数
  是用来度量模型的预测值与真实值的差异(损失值)程度的一类运算函数,是衡量神经网络性能“恶劣程度”的指标。是一个非负实值函数,损失函数计算值越小 ,模型性能越好
1. MSE–均方误差损失函数
均方误差(MSE,Mean Squared Error):
  即目标变量与预测值之间距离平方之和,度量样本点到回归曲线的距离,通过最小化平方损失使样本点可以更好地拟合回归曲线

数学公式

M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 {MSE={1\over n} \sum_{i=1}^n{(y_i - \hat y_i)^2}} MSE=n1i=1n(yiy^i)2
y i {y_i} yi是真实值, y ^ i {\hat y_i} y^i预测值

  1. MSE 通常用于回归问题的损失函数
  2. 计算成本低,无参数
  • 实现代码
import numpy as np
def mean_squared_error(y, t):
	# y神经网络的输出,t监督数据
    return 0.5*np.sum((y - t)**2)

if __name__ == '__main__':
    # 正确值为6
    y = np.array([0.01, 0.05, 0.08, 0.21, 0.52, 0.012, 0.6, 0.04, 0.12, 0.09])
    # 6的位置
    t = np.array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0])
    # 错误值(9)
    t1 = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
    print("--" * 30)
    print("预测正确时的均方误差:", mean_squared_error(y, t), "(值越小越好)")
    print("预测错误时的均方误差:", mean_squared_error(y, t1), "(损失值增大了)")
    print("--" * 30)
2. CEE–交叉熵误差损失函数

  熵在不同的学科中所涉及不同的方面(物理学:热力学第二定律熵增原理;经济学:信息熵、条件熵、联合熵等;哲学:泛熵),总的来说熵就是混乱,混乱程度的表述

信息熵:描述信息发生的平均不确定性程度(信息量的期望)
   信息论之父 C. E. Shannon 在 1948 年发表的论文“通信的数学理论( A Mathematical Theory of Communication )”中指出,任何信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关,香农认为“信息是用来消除随机不确定性的东西”。即基本作用就是消除人们对事物的不确定性,信息熵就越高,信息量(混乱度)越大(我们需要把它弄清楚所需的信息量就越大)。
交叉熵误差损失函数(CrossEntropy Loss):
   在机器学习和神经网络深度学习中表示真实概率分布与预测概率分布之间的差异。衡量同一个随机变量中的两个不同概率分布的差异程度。
   在深度学习中交叉熵误差损失函数的值越小,训练的模型拟合效果就越好。

  1. 可以真实的反应出真实结果和预测结果的误差
  2. 交叉熵误差函数和激活函数softmax、sigmoid(的复合函数是凸函数
    即存在全局最优解)

数学公式

H ( p , q ) = − ∑ i = 1 n p ( x i )   l o g   p ( x i ) {H(p,q)=- \sum_{i=1}^n{p(x_i)\ log\ p(x_i)}} H(p,q)=i=1np(xi) log p(xi)
q ( x i ) {q(x_i)} q(xi)(非真实分布)要传递的信息, p ( x i ) {p(x_i)} p(xi)(真实分布)传递信息的方式
神经网络(机器学习)中 E = − ∑ i y i l o g ( y ^ i ) {E=- \sum_{i}{y_i log( \hat y_i)}} E=iyilog(y^i)

  • 实现代码
import numpy as np
def cross_entropy_error(y, t):
    # 为了防止出现负无限大的-inf,需要加上一个微小值(1e-7十的负七次方)
    delta = 1e-7
    return -np.sum(t * np.log(y + delta))

if __name__ == '__main__':
    # 正确值为6(one-hot独热编码表示)
    y = np.array([0.01, 0.05, 0.08, 0.21, 0.52, 0.012, 0.6, 0.04, 0.12, 0.09])
    # 6的位置
    t = np.array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0])
    # 错误值(9)
    t1 = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
    print("正确时的交叉熵误差:", cross_entropy_error(y, t))
    print("错误时的交叉熵误差:", cross_entropy_error(y, t1))
    print("--" * 30)
数学期望
各信息量乘其发生概率
求和
系统信息量期望值

注: y的值越接近1,预测结果和真实分类结果越接近;交叉熵误差越接近0, 即误差越小,两个概率分布越接近,拟合结果越好

3. mini-batch版交叉熵误差损失函数
mini-batch版交叉熵误差损失函数:
  不仅适用于one-hot格式的监督数据(one-hot表示中t为0的元素的交叉熵误差也为0,因此针对这些元素的计算可以忽略),且适用于其他数据。当 y的维度为1时,即求单个数据的交叉熵误差(需要改变数据的形状)。
np.arange(batch_size):生成一个从0到batch_size-1的数组
y[np.arange(batch_size), t]:获取各个数据的正确解标签对应的神经网络的输出

  • 实现代码
import numpy as np
def Mini_cross_entropy_error(y, t):
    # 确保仅有一组数据
    if y.ndim == 1:
        # 将一维数组的第一维转化到第二维
        y = y.reshape(1, y.size)
        t = t.reshape(1, t.size)
    # 个数相同则获取最值
    if y.size == t.size:
        # 获取正确值标签
        t = t.argmax(axis=1)
    # 获取(转化后)第一维,表示数据组数
    batch_size = y.shape[0]
    return -np.sum(t * np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size


if __name__ == '__main__':
    # one-hot数据
    y_one_hot = np.array([[0, 0, 0, 0.99, 0, 0, 0, 0.1, 0, 0],
                          [0, 0, 0.1, 0.8, 0, 0, 0, 0.99, 0, 0]])
    t_one_hot = np.array([[0, 0, 0, 1, 0, 0, 0, 0, 0, 0], 
                          [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])
    result_one_hot = Mini_cross_entropy_error(y_one_hot, t_one_hot)
    print("损失值:", result_one_hot)
    
    # 一般数据
    y = np.array([[0, 0, 0, 0.9, 0, 0, 0, 0.1, 0, 0],
                  [0, 0, 0.1, 0.8, 0, 0, 0, 0.9, 0, 0]])
    t = np.array([[1, 5, 2, 8, 2, 3, 6, 5, 4, 3], 
                  [3, 6, 5, 4, 1, 2, 6, 9, 4, 2]])
    result = Mini_cross_entropy_error(y, t_one_hot)
    print("损失值:", result)/ batch_size

你可能感兴趣的:(神经网络,机器学习,深度学习)