前言
最近在学深度学习基础,想通过博客记录一些概念,从而达到总结和加深印象的目的。学习的书籍是《动手学深度学习》,对书本内容感兴趣的同学可以访问动手学深度学习
误差
训练误差和泛化误差
训练误差:模型在训练数据集上表现出的误差。
泛化误差:模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来表示。
误差计算:损失函数。
举例说明:让我们以高考为例来直观地解释训练误差和泛化误差这两个概念。训练误差可以认为是做往年高考试题(训练题)时的错误率,泛化误差则可以通过真正参加高考(测试题)时的答题错误率来近似。假设训练题和测试题都随机采样于一个未知的依照相同考纲的巨大试题库。如果让一名未学习中学知识的小学生(未训练好的模型)去答题,那么测试题和训练题的答题错误率可能很相近。但如果换成一名反复练习训练题的高三备考生(训练完毕的模型)答题,即使在训练题上做到了错误率为0,也不代表真实的高考成绩会如此。
机器学习模型应关注降低泛化误差。
模型选择
验证数据集
验证数据集:进行模型选择时,预留一部分在训练数据集和测试数据集以外的数据。
K
K
K折交叉验证:改善当训练数据不够用时,预留大量的验证数据显得太奢侈情况的方法
欠拟合和过拟合
欠拟合:指模型无法得到较低的训练误差
过拟合:指模型的训练误差远小于它在测试数据集上的误差
模型复杂度:
应选择复杂度合适的模型并避免使用过少的训练样本
权重衰减:等价于
L
2
L_2
L2 范数正则化(regularization)。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。
权重衰减可以通过优化器中的weight_decay
超参数来指定。
丢弃法:除权重衰减以外,深度学习模型常常使用丢弃法来应对过拟合问题
卷积神经网络
卷积:一般来说,假设输入形状是
n
h
∗
n
w
n_h*n_w
nh∗nw,卷积核窗口形状是
k
h
∗
k
w
k_h*k_w
kh∗kw,那么输出形状将会是
(
n
h
−
k
h
+
1
)
∗
(
n
w
−
k
w
+
1
)
(n_h-k_h+1)*(n_w-k_w+1)
(nh−kh+1)∗(nw−kw+1)
填充:一般来说,如果在高的两侧一共填充
p
h
p_h
ph行,在宽的两侧一共填充
p
w
p_w
pw列,那么输出形状将会是
(
n
h
−
k
h
+
p
h
+
1
)
∗
(
n
w
−
k
w
+
p
w
+
1
)
(n_h-k_h+p_h+1)*(n_w-k_w+p_w+1)
(nh−kh+ph+1)∗(nw−kw+pw+1)
很多情况下,我们会设置
p
h
=
k
h
−
1
p_h=k_h-1
ph=kh−1和
p
w
=
k
w
−
1
p_w=k_w-1
pw=kw−1来使输入和输出具有相同的高和宽。
步幅:一般来说,当高 上步幅为
s
h
s_h
sh,宽上步幅为
s
w
s_w
sw时,输出形状为
⌊
(
n
h
−
k
h
+
p
h
+
s
h
)
/
s
h
⌋
∗
⌊
(
n
w
−
k
w
+
p
w
+
s
w
)
/
s
w
⌋
\lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor * \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor
⌊(nh−kh+ph+sh)/sh⌋∗⌊(nw−kw+pw+sw)/sw⌋。如果设置
p
h
=
k
h
−
1
p_h=k_h-1
ph=kh−1和
p
w
=
k
w
−
1
p_w=k_w-1
pw=kw−1,那么输出形状将简化为
⌊
(
n
h
+
s
h
−
1
)
/
s
h
⌋
∗
⌊
(
n
w
+
s
w
−
1
)
/
s
w
⌋
\lfloor(n_h+s_h-1)/s_h\rfloor * \lfloor(n_w+s_w-1)/s_w\rfloor
⌊(nh+sh−1)/sh⌋∗⌊(nw+sw−1)/sw⌋。