用来描述两个分布之间的距离
E = − ∑ i y i l o g ( p i ) E=-\sum_{i}y_ilog(p_i) E=−i∑yilog(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=N1i∑Li=−N1i∑−[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预测为正类的概率。
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=N1i∑Li=−N1i∑c=1∑Myiclog(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的预测概率
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))
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=1∑n(yi−ti)2
其中,
y i y_i yi——网络输出
t i t_i ti——真值
n n n——数据维度。
def mean_squared_error(y, t):
"""
:param y: numpy array
:param t: numpy array
:return:
"""
return 0.5 * np.sum(y, t)
回归问题通常对每一个输出结果都十分关注
,比如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}=-1\times loga - 0 \times logb - 0 \times logc = -loga LCE=−1×loga−0×logb−0×logc=−loga
由上述结果可以看出,交叉熵损失函数只与正确的预测结果有关
,而平方误差损失则还与错误的分类有关,该损失除了让正确的结果尽可能变大,还会让错误的结果尽可能变得平均。但是实际在CE Loss中,后面两个调整都失效了,但是对于回归问题,这个调整就很重要,因此回归问题中交叉熵并不适用。
平方函数损失函数假设服从高斯分布,而高斯分布实际上是一个连续的变量,并不是一个离散的变量。如果假设结果变量服从均值为 μ \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=maxi∑N[−21(2πσ2)−2σ2(ti−y)]
除去与 y y y无关的项目,最后剩下的就是平方损失函数的形式。