写在最前面:本博客较详细,是为了写给其他同学共同进步,有一定基础的可以作为复习~
若有问题欢迎评论。
初级模型与基础知识
最临近与KNN
最临近(Nearest Neighbor)算法思想:训练过程仅记住每一张图片,预测过程找与输入最邻近的图片,输出该图片标签。
-
如何比较“远近”?
L1距离( x + y + z x+y+z x+y+z) / L2(欧式) 距离( x 2 + y 2 + z 2 \sqrt{x^2+y^2+z^2} x2+y2+z2)
L1存在坐标依赖性(即改变坐标轴的选取,结果变化),L1距离即为二者每块pixel相减绝对值的累加求和
L2即为二者各pixel之差的平方求和后开方 -
选取L1还是L2?
当坐标有具体含义的时候,或许L1更好,需要结合具体需求并尝试。
KNN(K-Nearest Neighbors)算法思想:找到K个最近的图片,然后选取K个标签中数量最多的作为输出,从而KNN的决策边界更为平滑。
二者不在图片分类中常用,弊端:
- predict过程过长(需要遍历比较)。理想的模型应该预测即应用它的时间短,允许训练时间长。
- 距离难以反映出图片差异(部分遮挡、平移、染色等可以使距离随人调整)。
- 维度灾难:如果我们需要它有良好的效果,需指数倍的训练数据来密布高维空间里的像素
K是一个超参数(hyperparameter),如何选取超参数?
超参数
超参数的定义:无法从学习中获得,必须人为提前设置。
- 先验知识:训练集(已知标签用于训练的数据)等基本定义
如何选取?
- 直接对全部数据训练并测试,选取表现最好的超参数。
Very terrible!!! Never do this.
拿上述KNN而言,K=1时永远表现最好(因为我们的训练数据已被存储,预测时匹配到第一个临近的就是其本身)。 - 将数据集分为训练集与测试集,选取在测试集中表现最好的超参数。
看起来不错,但是实际上会导致过拟合(一句话解释过拟合:在实验数据中表现过为良好,难以适应其他未知数据) - 将数据集分为训练集、测试机与验证集,在训练集上训练,选取在验证集上表现最好的超参数,最终将这些超参数应用到测试集上,得出实验数据。
其实相比第二点,就是多了最后一步:加数据,并将后面新数据的结果作为实验结果。
【注意】测试集仅跑一次(在超参数确定完成之后),验证集跑多次(用于测试超参数是否表现良好)。 - 交叉验证(cross validation)
在小数据集中常用,深度学习中较少(由于训练对于高计算力的需求)。
将数据集分出一个测试集保留出来(用途同3),将剩余的数据分为很多折(fold),然后每一块轮流作为验证集其余作为训练集。
-
问题:一旦寻找到最优超参的时候,是否还需要对整个数据集训练(即再使用验证集、测试集作为训练)?
有时间、有计算资源、想提高准确率,可以考虑。
线性分类器
线性分类器是参数模型中的最简单的例子。
-
什么是参数模型?
f ( x , W ) f (x,W) f(x,W)中的W:参数和输入的图片X一样,需要给出,在模型判断中使用。
它可以通过学习不断更新(即不断通过对前面数据的训练获得)。
因此在测试中,我们不再需要保留之前的数据,直接通过参数可以获得模型,更有效率。(对比KNN:需要保存训练时的数据进行比较) -
整个深度学习都在考量怎么正确建立 f f f 的结构
-
X与ω相乘是最简单的结构,即是线性分类器
对于一个10分类问题,假设图片大小为 32*32,因此我们有 32*32*3 的向量,即共有 3072 的数字(3为RBG三通道)。我们将图片全部展开成一个长列向量(即3072*1的向量),需要获得一个10*1的向量(10个分类分别对应的分数),因此线性分类器的维度为:
其中W是参数,将在训练中获得;b为偏好项(bias term)
-
为什么要设置偏好项?
如果你的数据集是不平衡的,如猫比狗多,那么就给猫所对应的项增加一个偏好,它与训练数据无关。
优点:好理解,好实施
缺点:
- 只能解决决策边界为线性的数据
- 不能解决多分类问题,有几个分类就需要几个模型
- 每个分类它仅学习一个模板,出现变体之后它会取平均值来作为判断依据,效果不好
如何衡量一个参数的好坏?如何更新参数?我们需要用到损失函数。
损失函数
损失函数的目的就是给出分数,从而判断W的好坏,整个模型的损失函数为:
L
=
∑
L
i
(
f
(
x
i
,
W
)
,
y
i
)
N
L = \frac{\sum{L_i(f(x_i,W),y_i)}}{N}
L=N∑Li(f(xi,W),yi)
其中,N是输入的总数,
L
i
L_i
Li 是每一项的损失,我们即研究如何设定计算
L
i
L_i
Li,通过调整W,使得
L
i
L_i
Li 最小。
Hinge Loss 铰链损失函数
引入:多元SVM(略)
SVM中使用的损失函数:Hinge Loss 铰链损失函数
计算公式如图: