损失函数
损失函数是在机器学习和深度学习中用于衡量模型预测输出与真实标签之间差异的函数。它是优化算法的核心部分,通过最小化损失函数来调整模型的参数,以使模型的预测结果更加准确。
常见的损失函数有很多种,下面举例说明两种常见的损失函数:
① 均方误差(Mean Squared Error,MSE):均方误差是用于回归问题的损失函数。它计算预测值与真实值之间的平方差,并求取平均值作为最终的损失值。例如,对于一个线性回归模型,我们可以使用均方误差来衡量其预测结果与真实标签之间的差异。
假设有一组样本数据 {(x1, y1), (x2, y2), …, (xn, yn)},其中 xi 是输入特征,yi 是对应的真实标签。模型给出的预测结果为 ŷi。则均方误差可以表示为:
M
S
E
=
(
1
/
n
)
∗
∑
(
y
i
−
y
^
i
)
2
MSE = (1/n) * ∑(yi - ŷi)^2
MSE=(1/n)∗∑(yi−y^i)2
② 交叉熵损失(Cross-Entropy Loss):交叉熵损失通常用于分类问题,尤其是在使用 softmax 函数进行多类别分类时。它计算预测概率分布与真实标签之间的差异。例如,对于一个图像分类模型,我们可以使用交叉熵损失来衡量模型预测的类别概率分布与真实标签的差异。
假设有一组样本数据 {(x1, y1), (x2, y2), …, (xn, yn)},其中 xi 是输入特征,yi 是对应的真实标签的 one-hot 编码形式(例如,[1, 0, 0] 表示第一类)。模型给出的预测结果为 ŷi,表示每个类别的概率分布。则交叉熵损失可以表示为:
C
r
o
s
s
−
E
n
t
r
o
p
y
L
o
s
s
=
−
∑
(
y
i
∗
l
o
g
(
y
^
i
)
)
Cross-Entropy Loss = -∑(yi * log(ŷi))
Cross−EntropyLoss=−∑(yi∗log(y^i))
这里的 log 表示自然对数。
激活函数
激活函数是在神经网络中使用的一种非线性函数,用于给神经元引入非线性特性,从而增强神经网络的表达能力。
常见的激活函数有以下几种:
- Sigmoid函数:将输入值映射到0~1之间,具有连续可导和可微的性质。公式为 f(x) = 1 / (1 + exp(-x))。
- ReLU函数:修正线性单元函数,将负数部分设定为0,保留正数部分。公式为 f(x) = max(0, x)。
- LeakyReLU函数:对ReLU函数进行改进,将负数部分设定为一个小的斜率,而不是0,避免了死 亡ReLU现象。公式为 f(x) = max(0.01x, x)。
- Tanh函数:将输入值映射到-1~1之间,具有连续可导和可微的性质。公式为 f(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))。
- Softmax函数:一种归一化的指数函数,用于多分类问题,可以将输出值映射到0~1之间,并且所有输出值的和为1。公式为 f(x) = exp(x) / sum(exp(x))。
举例说明,假设我们有一个神经元的输入为x=2,则应用以上激活函数后的输出结果分别为:
Sigmoid函数:f(x) = 0.880797
ReLU函数:f(x) = 2
LeakyReLU函数:f(x) = 2
Tanh函数:f(x) = 0.964028
Softmax函数:f(x) = 0.2
向量化
在机器学习中,向量化的操作通常使用线性代数库(python中)完成。下面举例说明一下向量化的操作过程。
假设我们有一个包含 50000 个样本的数据集,每个样本有 100 个特征。我们想要计算每个样本的预测值,使用以下公式进行计算:
y
(
i
)
=
w
T
x
(
i
)
+
b
y^{(i)} =w^Tx^{(i)} + b
y(i)=wTx(i)+b
其中
w
w
w是一个包含100个权重参数的向量,
x
(
i
)
x^{(i)}
x(i)是一个包含 100 个特征的向量,b 是偏置项。如果我们使用传统的循环方式来计算,需要对每个样本进行单独的计算,代码如下:
import numpy as np
# 数据集大小:50000 个样本,每个样本包含 100 个特征
X = np.random.rand(50000, 100)
# 权重向量和偏置项
w = np.random.rand(100)
b = 0.5
# 预测值数组
predictions = np.zeros(50000)
# 循环计算预测值
for i in range(50000):
predictions[i] = np.dot(w, X[i]) + b
上述代码中,我们对每个样本单独进行了计算,因此运行速度非常慢。现在我们可以使用向量化的方法来优化这段代码,将所有的计算都转化为矩阵和向量的操作,代码如下:
import numpy as np
# 数据集大小:50000 个样本,每个样本包含 100 个特征
X = np.random.rand(50000, 100)
# 权重向量和偏置项
w = np.random.rand(100)
b = 0.5
# 预测值数组
predictions = np.dot(X, w) + b
上述代码中,使用了 NumPy 的 dot() 函数来计算矩阵乘积,将所有的样本都放在一个矩阵中进行操作,从而实现了向量化。这种方法比循环方式更快,因为它利用了底层的线性代数库进行高效的并行计算。