CS231n学习笔记

线性分类器与损失函数

上一节课讲的是有关于图像分类的问题,并介绍可KNN算法,这一节课中讲的是更强大的算法用来解决图像分类问题。线性分类器由两部分组成,一个是评分函数用来表示将图像数据映射到类别分数。比如有猫狗车三类,通过简单的SVM可以得到三类的分数,然后选择较高的一项。 还有一部分是损失函数,得到分类标签与真实标签是否一致性的分数,有多种计算方法,损失函数也是非常重要的,可以转化为一个最优化问题。

在线性分类函数中,权重W和偏置b都是可以控制改变的,我们一般随机取权重W,并且一般都很小,以至于评分都为0(此时还可以拿来预估损失值,若与真实得到的偏差较大,可能哪里出错),然后我们可以通过训练数据来学习到参数w,b。

损失函数还有正则化的应用。可以通过正则化惩罚来抑制大数值的权重。 我们可以通过调节(浪大)的值,将该值减小则是减小了惩罚增加了其拟合能力,相反的增大则提升其泛化能力。其中的超参数的设置其实没有意义,如我上面讲的,我们主要通过调节(浪大)的值

反向传播

在不同分支的梯度在回传时要相加。 损失函数应该考虑分类正确的情况和分类错误的情况。 矩阵相乘的梯度是比较有难度得,我们可以从矩阵的shape来解决。梯度的大小肯定是跟权重W的矩阵大小相同。所以我们可以从矩阵乘法入手,来让维度对上。

神经网络

激活函数优缺点
sigmoid和tanh函数的共同缺点:梯度依旧可能饱和,这样梯度就无法在网络中传播的。饱和指得就是在接近-1,1时的梯度接近于0。 sigmoid函数缺点二,由于它得出的数据都在0,1之间不是关于原点对称。如果X不是关于原点对称,W的梯度正负依赖于梯度f的正负,所以权重w的梯度要么全正要么全负,若是训练数据不关于原点对称,那么他的收敛速度回非常慢。所以希望能有关于原点对称的输入和输出。

研究初始化也是一个很好的研究方向
预处理中常见的错误,我们不能先计算整个数据集图像的平均值,然后减去平均值再分为,训练集/验证集/测试集。而是先分为三个集,只是从训练集中求得平均值,然后各个集中的图像减去这个平均值。

我们可以先用一个小测试集,可以是20个,十个,一个,来测试神经网络能否正常运行。

训练一个神经网络:

对权值的初始化非常重要。初始化为非常小的权重W,会造成梯度弥散,即梯度变得非常小。

利用小批量数据对实现进行梯度检查,还要注意各种错误。

进行合理性检查,确认初始损失值是合理的,在小数据集上能得到100%的准确率。

在训练时,跟踪损失函数值,训练集和验证集准确率,如果愿意,还可以跟踪更新的参数量相对于总参数量的比例(一般在1e-3左右),然后如果是对于卷积神经网络,可以将第一层的权重可视化。

梯度更新的推荐的两个更新方法是SGD+Nesterov动量方法,或者Adam方法。

随着训练进行学习率衰减。比如,在固定多少个周期后让学习率减半,或者当验证集准确率下降的时候。

使用随机搜索(不要用网格搜索)来搜索最优的超参数。分阶段从粗(比较宽的超参数范围训练1-5个周期)到细(窄范围训练很多个周期)地来搜索。

进行模型集成来获得额外的性能提高。

检查整个学习过程

训练神经网络中应该跟踪多个重要的数值

第一个跟踪的是损失函数。过低的学习率导致算法的改善是线性的。高一些的学习率会看起来呈几何指数下降,更高的学习率会让损失值很快下降,但是接着就停在一个不好的损失值上(绿线)。这是因为最优化的“能量”太大,参数在混沌中随机震荡,不能最优化到一个很好的点上。而且如果损失函数的损失值噪音很大(比如震荡,一上一下。),那么可能是批数量太小了。

从验证集准确率和训练集准确率图像:如果两者分离的有点远那么可能过拟合,可以通过增大正则化强度和收集更多的数据。 如果两者如影随形,说明你的模型的容量还不够大,增加参数数量让模型容量更大一些。

你可能感兴趣的:(CS231n学习笔记)