📅  最后修改于: 2023-12-03 14:50:11.814000             🧑  作者: Mango
交叉熵是分类问题中经常使用的成本函数,可以用来衡量模型的预测值与实际值之间的差异。下面介绍在分类中使用的交叉熵成本函数,以及如何在神经网络中实现交叉熵成本函数。
对于一个二分类问题,令 $y \in {0, 1}$ 表示真实标签,$p$ 表示模型预测的标签为 1 的概率,交叉熵成本函数的表达式为:
$$J = - y \log(p) - (1 - y) \log(1 - p)$$
当 $y=1$ 时,$J=-\log(p)$,此时真实标签为 1,模型预测的标签也应该为 1,$-\log(p)$ 表示预测错误的代价,它随着预测概率 p 的减小而增大。
当 $y=0$ 时,$J=-\log(1-p)$,此时真实标签为 0,模型预测的标签也应该为 0,$-\log(1-p)$ 表示预测错误的代价,它随着预测概率 1-p 的减小而增大。
我们可以将二分类问题的交叉熵成本函数推广到多分类问题。假设有 K 个类别,令 $y_k$ 表示真实标签的 one-hot 编码,即 $y_k \in {0, 1}^K$,而 $p_k$ 表示模型预测的标签为第 k 类的概率,这时我们可以使用 softmax 函数将 $p$ 转化为概率分布。交叉熵成本函数的表达式为:
$$J = -\frac1n \sum_{i=1}^n \sum_{k=1}^K y_{i, k} \log(p_{i, k})$$
其中,$n$ 表示样本数量,$y_{i,k}$ 表示第 i 个样本的真实标签属于第 k 类的概率(one-hot 编码),$p_{i,k}$ 表示第 i 个样本被预测为属于第 k 类的概率。式子中的 $-\log(p_{i,k})$ 表示某个样本预测错误的代价。
在神经网络中,我们可以使用 softmax 激活函数和交叉熵成本函数来进行分类。假设有一个全连接神经网络,最后一层使用 softmax 激活函数,我们可以使用以下代码实现交叉熵成本函数。
import numpy as np
# 计算交叉熵成本函数
def cross_entropy(y, a):
# y: 真实标签,形状为 (m, K),m 为样本数量,K 为类别数
# a: 模型预测的标签,形状为 (m, K),每一行为该样本各个类别的预测概率
n = y.shape[0]
J = -np.sum(y * np.log(a)) / n
return J
我们可以将该函数作为损失函数传递给模型进行训练,下面是使用 Keras 框架的示例代码。
from keras.models import Sequential
from keras.layers import Dense
# 构建全连接神经网络模型
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
# 编译模型
model.compile(loss=cross_entropy, optimizer='sgd')
# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=32)
在以上代码中,我们使用 cross_entropy 函数作为损失函数传递给模型进行训练,训练的目标是最小化该损失函数。