CS231n学习笔记——优化、梯度
多元情况下生成的导数叫做梯度,所以梯度是偏导数组成的向量,有和x一样的形状。梯度中的每个元素表示每个相关方向上函数的斜率。
计算梯度的方法——有限差分
在参数W的每一项做一点微小的改变(0.0001),观察loss的变化情况,然后计算出针对这一项的偏导数。以此类推直到算出整个梯度。但是在神经元数量很大时,这种数值导数的梯度计算方法非常慢,所以在应用中优先使用解析导数,即提前计算出梯度的表达式,然后利用梯度表达式直接算出梯度。
即使如此,数值梯度还有有很大用处的,比如它经常用来debug你的程序,即在程序中使用解析梯度,但是用数值梯度来验证解析梯度代码是否正确,这叫做梯度检查。
关于数值导数与解析导数在这引用别人的讲解
图片来自:http://bbs.keinsci.com/thread-1169-1-1.html
在程序中的梯度下降代码非常简短:
其中step_size学习步长(也叫做learning rate)是一个超参数,表示每次更新权重参数时, 向梯度减小的方向前进的距离,也就是利用每一步的梯度值来决定参数改变的方向。
但是当数据集样本很大时,每次计算梯度可能要经过上百万次计算,时间很慢。但是计算损失函数的公式是线性可加的,如图,所以可以每次更新梯度都使用随机的一小部分数据集来计算,也就是随机梯度下降SGD,每次取minibatch个数据来估算误差总和和梯度。
图像特征
在神经网络大规模运用之前(非线性分类器不发达的时候),做图片分类的步骤是先计算图片的特征表述,将特征表述作为输入源输入线性分类器,这样图片特征就变成线性可分的了。比如颜色直方图特征可以判断图片大体的颜色分布,方向梯度直方图对图片边缘特征敏感。
而到了卷积神经网络时代,就不必提前处理特征了,而是直接从数据中学习特征,自己寻找合适的特征。