KNN
优缺点:
Nearest Neighbor分类器易于理解,实现简单。其次,算法的训练不需要花时间,因为其训练过程只是将训练集数据存储起来。
测试要花费大量时间计算,因为每个测试图像需要和所有存储的训练图像进行比较,在实际应用中,我们关注测试效率远远高于训练效率。
图像都是高维度数据(他们通常包含很多像素),而高维度向量之间的距离通常是反直觉的。这些图片的排布更像是一种颜色分布函数,或者说是基于背景的,而不是图片的语义主体。意思是距离度量相比于主题,更看重背景,因为背景所占的面积比较大,比如一个狗和一个青蛙,背景都是一样的情况下,KNN的距离可以说是很小了。
线性回归
y=Wx+b
以一个10*10的图片,共有12各类的实例来说明:
W为12*100的矩阵,x为100*1的向量,b为12*1的向量。
W共有12行,分别对应12类,每一行和图片向量相乘后加上对应的b得到的结果是该图片属于该类的score,可以将这个过程用KNN的角度来看,每一行的参数可以看作是一个图片的向量,计算过程看作是计算实例图片和该图片的偏差,偏差小的话,得分就高,即相似度就高。不同的是KNN是计算和所有图片的误差,而线性回归是计算和训练好的一张图片的误差。
教程中将训练好的参数可视化之后的结果:
汽车呈现红色,是因为训练集中的红色车比较多;船呈现蓝色是因为船一般都是在海上,大部分船的图片都呈现蓝色。马的图像像是有好几个头的马,这是因为训练集中马的朝向不确定造成的。
多类支持向量机损失 Multiclass Support Vector Machine Loss
就是要保证不正确类别的分数要比正确类别的分数高出一定程度(阈值dota),相应的,只要满足上述情况,损失函数就为零,不能衡量分类到底有多么正确。
正则化(Regularization)
满足多类支持向量机损失为零的参数W并不唯一,若W满足。则n倍的W仍满足,n为大于一的整数。为了解决这个,加入正则化损失,通常是所有参数的平方和。这样还可以增强模型的泛化能力。
softmax分类器
e的x次方和能会很大,会导致不稳定情况出现,如某一类所占的比重特别大,为了避免这种情况,可以将最后的预测结果全部减去最大的预测结果,即使预测结果的最大值为零。e的负数次方都很小,这样可以增加模型的稳定性。
SVM和softmax比较
可以将SVM和softmax用于计算损失函数,但当分类的类别十分多时:
属性分类问题
当一个样本的标签并不只是一个,而是多个;或者可以是一个,也可以是多个的数目不固定情况时,怎么分类呢?可以针对每一个标签训练一个分类器
回归问题
回归问题的损失函数一般用L1或者L2范式来表示,就是所有样本预测的值和标签值的差距情况(L1和L2两种方法)之和。回归问题的损失函数相较于分类问题的损失函数一般都不是很稳定,想想看回归下输入对应的输出有无穷多个,输入稍微变一下,输出就变,这样噪声干扰就比较明显;而分类时,一个范围内的输入对应着一个输出。当实际应用是,我们应该优先考虑问题能不能转化为分类问题,如果实在不行在考虑回归。
最优化
由于max操作,损失函数中存在一些不可导点(kinks),这些点使得损失函数不可微,因为在这些不可导点,梯度是没有定义的。但是次梯度(subgradient)依然存在且常常被使用。在本课中,我们将交换使用次梯度和梯度两个术语。
斜率是函数在某一点的瞬时变化率。梯度是函数的斜率的一般化表达,它不是一个值,而是一个向量。在输入空间中,梯度是各个维度的斜率组成的向量(或者称为导数derivatives)。对一维函数的求导公式如下:
当函数有多个参数的时候,我们称导数为偏导数。而梯度就是在每个维度上偏导数所形成的向量。
BP:
对signmoid进行模块化求梯度:
这里先对signmoid函数进行求导,得到的导数之后,按理说应该带入输入求其导数的值,这里直接化简成(1-signmoid)*signmoid了,这里就直接代入结果来求其导数的值了。求出之后,这里代入signmoid的值为w0*x0+w1*x1+w2。再对其中的每个w进行求导,求出其对应的导数。
矩阵化计算的步骤:
例如:一个训练实例的维度为225维,共有100个实例,分类数有10类。那么:W 10*225;X 225*100;D 10*1
上面示例中dD代表计算得到的梯度,其size和W一样,因为梯度就是参数的梯度啊。这里重点在最后两步。
在不同分支的梯度要相加:如果变量x,y在前向传播的表达式中出现多次,那么进行反向传播的时候就要非常小心,使用+=而不是=来累计这些变量的梯度(不然就会造成覆写)。这是遵循了在微积分中的多元链式法则,该法则指出如果变量在线路中分支走向不同的部分,那么梯度在回传的时候,就应该进行累加。
机器学习中的BP算法:
这里以只有一个隐层的神经网络为例来计算BP算法。上述流程是一个样本的BP计算梯度算法。
式子中a1,a2,a3代表三层网络每层的输出值,z1,z2,z3代表每层的输入值,其中第一层的输入和输出是一样的。
神经网络算法
signmoid缺点:
relu的优缺点:
初始化
训练过程中的检查调整
神经网络笔记3(上)
1 梯度检查
1.1#绝对误差
梯度检查的目的就是检查计算的梯度和实际的梯度是不是一样的,我们通常就是将求导计算的梯度和进行比较,要计算这个式子就要计算两次网络的前向传播。其中h通常设置为一个足够小的数,实践中近似设为1e-5,通常假设如果该值小于某一阈值,就可以假设梯度计算正确。但是仔细想想,这个思路是有问题的,什么问题都是相对的,要是梯度比阈值大很多时可以这样理解,要是梯度本来就很小呢?甚至和阈值差不多大小,这种情况下就不能认为梯度计算没问题。
1.2相对误差
这时可以使用相对误差来比较,公式:,将两个梯度差值除以两个中较大的那个数,这是就可以观察相对误差,比绝对误差靠谱点。通常分母取两个的任意一个就可,也可以取两者的和,这样可防止其中一个为零的情况,还需要注意两个都为零的情况。在实践中:
1.3 使用双精度
一个常见的错误是使用单精度浮点数来进行梯度检查。这样会导致即使梯度实现正确,相对误差值也会很高(比如1e-2)。在我的经验而言,出现过使用单精度浮点数时相对误差为1e-2,换成双精度浮点数时就降低为1e-8的情况。
1.4 保持在浮点数的有效范围
把原始的解析梯度和数值梯度数据打印出来,就是要保证梯度在有效的范围内,不能太过小或大。
1.5 目标函数的不可导点(kinks)
由于激活函数Relu和SVM分类等函数的关系,模型中会出现很多的不可导的点,这时就要有针对的检查,针对:max(x,y)这种情况的,可以检查f(x-h)和f(x+h)之间有没有跨过不可导的点,这是需要利用前向传播中的相关数据与其进行比较。
1.6 使用少量数据点
意思就是不用都检查,选取代表性的数据样本检查就可以。
1.7 谨慎设置步长h
在实践中h并不是越小越好,因为当h特别小的时候,就可能就会遇到数值精度问题。有时候如果梯度检查无法进行,可以试试将h调到1e-4或者1e-6,然后突然梯度检查可能就恢复正常。
1.8 在操作的特性模式中梯度检查
有一点必须要认识到:梯度检查是在参数空间中的一个特定(往往还是随机的)的单独点进行的。即使是在该点上梯度检查成功了,也不能马上确保全局上梯度的实现都是正确的。还有,一个随机的初始化可能不是参数空间最优代表性的点,这可能导致进入某种病态的情况,即梯度看起来是正确实现了,实际上并没有。例如,SVM使用小数值权重初始化,就会把一些接近于0的得分分配给所有的数据点,而梯度将会在所有的数据点上展现出某种模式。一个不正确实现的梯度也许依然能够产生出这种模式,但是不能泛化到更具代表性的操作模式,比如在一些的得分比另一些得分更大的情况下就不行。为了安全起见,最好让网络学习(“预热”)一小段时间,等到损失函数开始下降的之后再进行梯度检查。在第一次迭代就进行梯度检查的危险就在于,此时可能正处在不正常的边界情况,从而掩盖了梯度没有正确实现的事实。
1.9 不要让正则化吞没数据
正则化吞没数据的意思是指正则化的程度太大了,导致数据误差在总误差中所占的比重过小。这时应该将数据损失和正则化损失单独检查,进行梯度检查时应该将正则化损失设为零,检查完成后再单独检查正则化误差。对于正则化的单独检查可以是修改代码,去掉其中数据损失的部分,也可以提高正则化强度,确认其效果在梯度检查中是无法忽略的,这样不正确的实现就会被观察到了。
1.10 记得关闭随机失活(dropout)和数据扩张(augmentation)
在进行梯度检查时,记得关闭网络中任何不确定的效果的操作,比如随机失活,随机数据扩展等。不然它们会在计算数值梯度的时候导致巨大误差。关闭这些操作不好的一点是无法对它们进行梯度检查(例如随机失活的反向传播实现可能有错误)。因此,一个更好的解决方案就是在计算f(x+h)和f(x-h)前强制增加一个特定的随机种子,在计算解析梯度时也同样如此。
1.11 检查少量的维度
在实际中,梯度可以有上百万的参数,在这种情况下只能检查其中一些维度然后假设其他维度是正确的。注意的是,不能随机地选取一些数据,有些数据比如偏置数据在总数据量中所占的比重很小,而检查时也应该考虑到。
2 学习之前:合理性检查的提示与技巧
2.1 寻找特定情况的正确损失值
还没训练网络时,网络就相当于瞎猜的概率,这是可以知道个大致的损失情况,需要来进行下验证。如果没有看到期望的损失值,那初始化的过程中就有问题。
2.2 提高正则化强度时导致损失值变大
理论上,提高正则化损失函数会增大,如果实际上损失函数不增大,那么模型就是有问题的。
2.3 对小数据子集过拟合
在进行正式的训练之前,先用一批小数据进行训练,看看能不能拟合,损失函数能不能降到零。如果成功拟合则再进行正式的训练,如不拟合,模型就有问题。
3 学习过程的检查
3.1 主要是绘制各种图表:
损失函数随周期(epochs)的变化图
训练集和验证集的损失随周期(epochs)的变化图
第一层可视化:
左边可视化的图像噪声比较多,特征提取效果不好;右边的特征提取效果比较理想。
还有两种可用的监督学习过程的方法是:权重更新比例和每层的激活数据及梯度分布
3.2 权重更新比例
权重中更新值的数量和全部值的数量之间的比例。注意:是更新的,而不是原始梯度(比如,在普通sgd中就是梯度乘以学习率)。需要对每个参数集的更新比例进行单独的计算和跟踪。一个经验性的结论是这个比例应该在1e-3左右。如果更低,说明学习率可能太小,如果更高,说明学习率可能太高。
就是更新的部分占总体的比例应该是在1e-3左右,比例低说明学习率偏小,高的话说明学习率又太高
3.3 每层的激活数据及梯度分布
就是在每一层之后输出激活后的值并绘制其梯度分布。用来检查其工作情况,如果梯度分布有任何怪异现象,就说明有问题了。如使用tanh的神经元,输出应该是在[-1,1]之间,如果输出的都为正或都为负,说明有问题。