这个专栏主要是想和大家分享一下深度学习的基础知识,主要是以吴恩达老师深度学习课程内容作为基础,并补充了很多其他内容希望让整体内容更加容易理解和系统化。如果想要了解具体专栏里面有什么内容的话,可以看一看我们专栏的目录,在目录里面还说明了小伙伴的分工,这些内容都是所有小伙伴们一起努力完成的,有希望和我们一起学习的的小伙伴也可以加入我们啊。另外我们还将内容以书籍的形式放到了github上,之后还会陆续上传源码实现等其他内容。我们还会分享深度学习-论文阅读专栏、强化学习-基础知识专栏、强化学习-任务阅读专栏,也欢迎大家关注。可能会有很多错漏,希望大家批评指正!还是那句话,不要高估一年的努力,也不要低估十年的积累,与君共勉!
3. 损失函数
3.1 定义
对当前输出y和训练样本的预期值之间的误差的计算,进而用于修正函数的各种参数(如前面线性回归中的w和z)。
损失函数也常被称为误差函数。
损失函数的计算结果越小说明参数越准确。
3.2 常见的损失函数
L1 Loss:
-
基本形式:计算预测值与目标值的绝对差值
L = ∑ i = 1 n ∣ y i − y ^ i ∣ L=\sum_{i=1}^{n}\left|y_{i}-\hat{y}_{i}\right| L=i=1∑n∣yi−y^i∣ -
pytorch实现:
torch.nn.L1Loss(reduction='mean')
关于参数
reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。
-
适用场景:
L1 Loss能处理数据中的异常值。这或许在那些异常值可能被安全地和有效地忽略的研究中很有用。如果需要考虑任一或全部的异常值,那么最小绝对值偏差是更好的选择(对比L2 Loss)。
-
优缺点:
优点:鲁棒
缺点:不稳定解、可能多个解
MSE Loss:
-
基本形式:计算预测值和目标值的差值的平方
L = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 L=\frac{1}{N} \sum_{i=1}^{N}\left(y_{i}-\hat{y}_{i}\right)^{2} L=N1i=1∑N(yi−y^i)2 -
pytorch实现:
torch.nn.MSELoss(reduction='mean')
关于参数
reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。
-
适用场景:
适合作为回归问题的损失函数,比如房价预测,销量预测,流量预测等。
-
优缺点:
优点:各点都连续光滑,方便求导,具有较为稳定的解
缺点:不是特别稳健,当差值过大时梯度会非常大,可能导致梯度爆炸
Cross Entropy Loss:
-
基本形式:二分类问题与多分类问题的形式略有区别,但是本质是一样的(二分类是多分类的一个特例)
L = − [ y log y ^ + ( 1 − y ) log ( 1 − y ^ ) ] L=-[y \log \hat{y}+(1-y) \log (1-\hat{y})] L=−[ylogy^+(1−y)log(1−y^)]L = − ∑ i = 1 N y i log y ^ L=-\sum_{i=1}^N y_i \log \hat{y} L=−i=1∑Nyilogy^
首先理解二分类时如何工作:标签 y ∈ { 0 , 1 } y\in\{0,1\} y∈{0,1},因此 y = 1 or ( 1 − y ) = 1 y=1 \space\text{or}\space (1-y)=1 y=1 or (1−y)=1。当y=1时,该损失函数变为:
当y=0时,该损失函数变为:
因为 y ^ ∈ [ 0 , 1 ] \hat y \in[0,1] y^∈[0,1],因此 − log y ^ ∈ [ 0 , + ∞ ] -\log \hat y \in[0,+\infty] −logy^∈[0,+∞],所以最终结果是 y ^ \hat y y^离 y y y误差越大,损失函数越大。多分类同样分析。
-
pytorch实现:
torch.nn.CrossEntropyLoss(weight=None,ignore_index=-100, reduction='mean')
关于参数
weight: weight(Tensor, optional),自定义的每个类别的权重。必须是长为C的Tensor。
ignore_index(int, optional),设置一个目标值, 该目标值会被忽略, 从而不会影响到输入的梯度。
reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。
-
适用场景:
适合分类任务,无论是二分类还是多分类。比如逻辑回归和神经网络。常与softmax激活函数一起使用。
-
优缺点:
优点:求导简单,导数之与输出值和真实值的差距有关,收敛更快
缺点:在类别过多时计算量过大(比如语言模型中,一个词典包含成千上万个类别)
KL散度Loss:
KL散度又叫相对熵,与交叉熵的关系有 K L D ( p ∥ q ) = C E ( p , q ) − H ( p ) KLD(p\|q)=CE(p,q)-H(p) KLD(p∥q)=CE(p,q)−H(p),其中 p p p是真实分布, C E CE CE是交叉熵,信息熵 H ( p ) = p log ( p ) H(p)=p\log(p) H(p)=plog(p)。
-
基本形式:
L = − ∑ y log ( y ^ ) − ( − ∑ y log ( y ) ) L=-\sum y \log (\hat y)-\left(-\sum y \log (y)\right) L=−∑ylog(y^)−(−∑ylog(y)) -
pytorch实现:
torch.nn.KLDivLoss(reduction='mean')
关于参数
reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。
-
适用场景:
KL 散度可用于衡量不同的连续分布之间的距离,在连续的输出分布的空间上(离散采样)上进行直接回归时很有效。
-
优缺点:
Huber Loss:
又叫平滑L1损失(Smooth L1 Loss)。
-
基本形式:
L = 1 n ∑ i z i L=\frac{1}{n} \sum_{i} z_{i} L=n1i∑zi
其中
z i = { 0.5 ( y i − y ^ i ) 2 , if ∣ y i − y ^ i ∣ < 1 ∣ y i − y ^ i ∣ − 0.5 , otherwise z_{i}=\left\{\begin{array}{ll} 0.5\left(y_{i}-\hat y_{i}\right)^{2}, & \text { if }\left|y_{i}-\hat y_{i}\right|<1 \\ \left|y_{i}-\hat y_{i}\right|-0.5, & \text { otherwise } \end{array}\right. zi={0.5(yi−y^i)2,∣yi−y^i∣−0.5, if ∣yi−y^i∣<1 otherwise
如下图,看了就能明白为什么叫平滑L1了: -
pytorch实现:
torch.nn.SmoothL1Loss(reduction='mean')
关于参数
reduction: none(不使用约简)、mean(返回loss和的平均值)、sum(返回loss的总和)。默认mean。
-
适用场景:
适合处理回归问题。
-
优缺点:
优点:在零点也可微,并且在误差很小时梯度也会减小,方便收敛
缺点:对于数据中异常值的敏感性要差一些
3.3 成本函数
a.定义:即一个训练集中所有样本的损失函数输出值 σ σ σ的平均值,用于衡量当前模型的参数的准确性。平均值越小,参数越准确。
b.公式:
J
(
ω
,
b
)
=
1
m
∑
i
=
1
m
σ
(
y
^
(
i
)
,
y
(
i
)
)
=
−
1
m
∑
i
=
1
n
[
y
(
j
)
log
y
^
(
i
)
+
(
1
−
y
)
log
(
1
−
y
^
(
j
)
)
]
J(\omega, b)=\frac{1}{m} \sum_{i=1}^{m} σ\left(\hat{y}^{(i)}, y^{(i)}\right)=-\frac{1}{m} \sum_{i=1}^{n}\left[y^{(j)} \log \hat{y}^{(i)}+\left(1-y\right) \log \left(1-\hat{y}^{(j)}\right) \right]
J(ω,b)=m1i=1∑mσ(y^(i),y(i))=−m1i=1∑n[y(j)logy^(i)+(1−y)log(1−y^(j))]
损失函数与成本函数的区别:
损失函数(Loss function)是定义在单个训练样本上的,也就是就算一个样本的误差,比如我们想要分类,就是预测的类别和实际类别的区别,是一个样本的哦,用L表示
代价函数(Cost function)是定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均,有没有这个平均其实不会影响最后的参数的求解结果。