向前传播 forward pass
在机器学习中,输入的feature, 通过预测模型,输出预测值,此过程称之为向前传播;
向后传播 backward pass
为了将预测与真实值的产值减小,需要根据差值,更新模型中的参数,此过程称之为向后传播;
评分函数 Score function
- 原始图像数据到类别分值的映射;
- 也就是向前传播时,使用的模型函数;
损失函数 Loss function/代价函数Cost function/目标函数Objective
- 用来量化预测分类标签的得分与真实标签之间一致性的.
- 也就是衡量,我们对结果的不满意度;
- 评分函数输出结果与真实结果之间差异越大,损失函数输出越大;
- 损失函数的具体形式多种多样;
- 损失函数基于向前传播和向后传播之间,起到承上启下的作用;
- 承上:接收模型的预测值;
- 启下:计算预测值与真实值的差值,为反向传播提供输入数据;
线性分类器 Linear Classification
- 通过对原始数据进行处理,得到一个分类的分值;
- 例如,最简单的线性分类
- 其中,W表示权重(Weights),b表示偏差(bias vector)
- 参数W和b是可控制改变的。我们的目标就是通过设置这些参数,使得计算出来的分类分值情况和训练集中图像数据的真实类别标签相符。
- 一个实际的例子:
- 上述函数的一个二维抽象:
- 以红色的汽车分类器为例,红线表示空间中汽车分类分数为0的点的集合,红色的箭头表示分值上升的方向。
- 所有红线右边的点的分数值均为正,且线性升高。红线左边的点分值为负,且线性降低。
- 从上面可以看到,W的每一行都是一个分类类别的分类器。
- 对于这些数字的几何解释是:如果改变其中一行的数字,会看见分类器在空间中对应的直线开始向着不同方向旋转。
- 而偏差b,则允许分类器对应的直线平移。
- 需要注意的是,如果没有偏差,无论权重如何,在xi=0时分类分值始终为0。这样所有分类器的线都不得不穿过原点。
多类支持向量机损失 Multiclass Support Vector Machine Loss
- 常用的一种损失函数
- 其核心思想是,在正确分类上的得分始终比不正确分类上的得分高出一个边界值Δ, 也就是value_right - value_wrong >= Δ;
- 例如,第i个数据中包含图像xi的像素和代表正确类别的标签yi, 分值简写为s。针对第j个类别的得分就是第j个元素:sj=f(xi,W)j。其SVM损失函数如下:
- 实际例子:假设有3个分类,并且得到了分值s=[13,−7,11]。其中第一个类别是正确类别,即yi=0。同时假设Δ是10;
- 第一部分,为0, 第二部分,为8;
- 虽然正确分类分值13>不正确分类11, 但还是比Δ(10)小,分差只有2, 所以损失值为8;
- 因为不满足>=Δ, 所以此时开始计算损失值;
- 如果没有这些情况,损失值为0;(因为预测正确的,一定是最高分)
- 具象化:
- 多类SVM“想要”正确类别的分类分数比其他不正确分类类别的分数要高,而且至少高出delta的边界值。
- 如果其他分类分数进入了红色的区域,甚至更高,那么就开始计算损失。
- Δ的说明:
- 超参数Δ和λ看起来是两个不同的超参数,但实际上他们一起控制同一个权衡:即损失函数中的数据损失和正则化损失之间的权衡。
- 不同分类分值之间的边界的具体值(比如Δ=1或Δ=100)从某些角度来看是没意义的,因为权重自己就可以控制差异变大和缩小
- 真正的权衡是我们允许权重能够变大到何种程度(通过正则化强度λ来控制)。
折叶损失(hinge loss)
- max(0,−)函数
平方折叶损失SVM--L2-SVM
-
它使用的是max(0,−)2,将更强烈(平方地而不是线性地)地惩罚过界的边界值;
正则化(Regularization)
- 为了解决损失函数的模糊性问题;
- 所谓的模糊性问题,指的是如果W能够正确分类所有数据,即对于每个数据,损失值都是0,囊二这个W的任意>1的倍数,也同样满足;
- 正则化惩罚(regularization penalty), R(w);
- 最常用的正则化惩罚是L2范式:
- 有了regularization penalty之后, 完整的SVM损失函数可以表示为:
- 展开后:
- N是训练集的数据量。
- 现在正则化惩罚添加到了损失函数里面,并用超参数λ来计算其权重。
- 其中最好的性质就是对大数值权重进行惩罚,可以提升其泛化能力,因为这就意味着没有哪个维度能够独自对于整体分值有过大的影响。
- 实际例子:
- 假设输入向量x=[1,1,1,1],两个权重向量w1=[1,0,0,0],w2=[0.25,0.25,0.25,0.25]。
- 根据公式,权重1的L2 penalty是1, 权重2的L2 penalty是0.25;
- 因此,根据L2惩罚来看,w2更好,因为它的正则化损失更小。
- 从直观上来看,这是因为w2的权重值更小且更分散。既然L2惩罚倾向于更小更分散的权重向量,这就会鼓励分类器最终将所有维度上的特征都用起来,而不是强烈依赖其中少数几个维度。
- 最后,因为正则化惩罚的存在,不可能在所有的例子中得到0的损失值,这是因为只有当W=0的特殊情况下,才能得到损失值为0。
- 这一效果将会提升分类器的泛化能力,并避免过拟合。
超参数(hyperparameter)
超参数
则是在算法运行之前手动设置的参数,用于控制模型的行为和性能
。- 这些超参数的选择会影响到模型的
训练速度、收敛性、容量和泛化能力
等方面。- 例如,
学习率、迭代次数、正则化参数、隐藏层的神经元数量
等都是常见的超参数。
- learning rate;
- momentum;
- number of layers
- hiddden nodes;
- regularization parameters
- initial weights
- 等等
超参数的选择
通常是一个试错的过程,需要根据经验和领域知识进行调整。
过拟合
- 过拟合是指训练误差和测试误差之间的差距太大。
- 换句换说,就是模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差。
- 模型对训练集"死记硬背"(记住了不适用于测试集的训练集性质或特点),没有理解数据背后的规律,泛化能力差。
Softmax分类器
- 它的损失函数与SVM的损失函数不同。
- 在Softmax分类器中,函数映射f(xi;W)=Wxi保持不变,但将这些评分值视为每个分类的未归一化的对数概率,并且将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。
- SVM和softmax的区别:
- SVM的最终的损失值是1.58,Softmax的最终的损失值是0.452,但要注意这两个数值没有可比性。只在给定同样数据,在同样的分类器的损失值计算中,它们才有意义。
- Softmax分类器为每个分类提供了“可能性”;
- SVM的计算是无标定的,而且难以针对所有分类的评分值给出直观解释。
- Softmax分类器则不同,它允许我们计算出对于所有分类标签的可能性。
- 例如:
- 针对给出的图像,SVM分类器可能给你的是一个[12.5, 0.6, -23.0]对应分类“猫”,“狗”,“船”。
- 而softmax分类器可以计算出这三个标签的”可能性“是[0.9, 0.09, 0.01],这就让你能看出对于不同分类准确性的把握。
- 可能性是一个相对的值,因为可能性分布的集中或离散程度是由正则化参数λ直接决定的
最优化 Optimization
- 最优化是寻找能使得损失函数值最小化的参数W的过程
- 损失函数可以量化某个具体权重集W的质量。而最优化的目标就是找到能够最小化损失函数值的W ;
- 最优化的一般方式:
- 一个差劲的初始方案:随机搜索;
- 核心思路,迭代优化:对一个权重矩阵集W取优,使其损失值稍微减少。那么问题的难度就大大降低了。换句话说,我们的方法从一个随机的W开始,然后对其迭代取优,每次都让它的损失值变得更小一点。
- 随机本地搜索
- 第一个策略可以看做是每走一步都尝试几个随机方向,如果某个方向是向山下的,就向该方向走一步。这次我们从一个随机W开始,然后生成一个随机的扰动δW ,只有当W+δW的损失值变低,我们才会更新。
- 这个比策略一好,但是依然过于浪费计算资源。
- 跟随梯度
- 前两个策略中,我们是尝试在权重空间中找到一个方向,沿着该方向能降低损失函数的损失值。其实不需要随机寻找方向,因为可以直接计算出最好的方向;
- 这个方向就是损失函数的梯度(gradient);
learning rate
- 梯度指明了函数在哪个方向是变化率最大的,但是没有指明在这个方向上应该走多远;
- 选择步长(也叫作学习率)将会是神经网络训练中最重要(也是最头痛)的超参数设定之一
梯度下降法
- 梯度下降使用整个训练数据集来计算梯度,因此它有时也被称为批量梯度下降;
- 在大规模的应用中(比如ILSVRC挑战赛),训练数据可以达到百万级量级。如果像这样计算整个训练集,来获得仅仅一个参数的更新就太浪费了。
随机梯度下降法
如果使用梯度下降法(批量梯度下降法),那么每次迭代过程中都要对 n个样本进行求梯度,所以开销非常大,随机梯度下降的思想就是随机采样一个样本 J(xi)来更新参数,那么计算开销就从 O(n)下降到 O(1) 。
小批量梯度下降法
- 随机梯度下降虽然提高了计算效率,降低了计算开销,但是由于每次迭代只随机选择一个样本,因此随机性比较大,所以下降过程中非常曲折;
- 所以,样本的随机性会带来很多噪声,我们可以选取一定数目的样本组成一个小批量样本,然后用这个小批量更新梯度,这样不仅可以减少计算成本,还可以提高算法稳定性。