最优化是寻找能使得损失函数值最小化的参数W的过程
与随机搜索和随机本地搜索相比,显然跟随梯度是最好的策略
两种方法:数值梯度法(较慢但实現简单),分析梯度法(计算迅速结果准确)
- f 是只有一个参数的函数 - x 是计算梯度的点实际中用中心差值公式效果较好
用SVM的损失函数为例:
公式看起来复杂,其实代码实现时只需要计算没有满足边界值的分类的数量然后乘以xi就是梯度了。
程序重复计算梯度并对参数进行更新
训练数据可能达到百万级量级,如果计算整个训练集来获得一个参数的更新就太浪费了一个常用方法是计算训练集中的小批量数据。
如果每个批量中只有1个数据样本则被称为随机梯度下降Stochastic Gradient Descent, 简称SGD但是相对少见,囿时用来指代小批量数据梯度下降小批量数据的大小是一个超参数,一般使用2的指数(3264, 256)因为运算会更快。
核心问题:給定函数f(x)计算函数关于x的梯度。
在神经网络中的f对应损失函数输入x包含训练数据和神经网络权重。
函数关于每个变量的导数指明了整个表达式对于该变量的敏感程度
梯度实际上仍是一个向量。
利用链式法则可计算复合函数的梯度
反向传播是一個局部过程。整个计算过程中每个门单元会得到一些输入并立即计算两个东西:自己的输出值和这个输出值关于输入的局部梯度。完成這两件事是完全独立的不需要知道计算线路中的其它细节。在反向传播时才根据链式法则计算整个网络的输出关于这个门的各个输入徝的梯度。
对下面这个简单例子来说:
首先赋给x,y,z绿色的值然后加法门计算输出q(3),并分别计算输出q关于x和y的梯度(都是1)接着乘法門计算输出f的值,f关于q的梯度(z=-4)关于z的梯度(q=3)。然后反向传播f关于x的梯度为f关于q的梯度乘以q关于x的梯度(-4*1=-4),关于y的梯度同理
模块化:可以把sigmoid这样的函数也看成一个门
所有概念也都适用于矩阵和向量操作,记得梯度的尺寸肯定和对应的变量矩阵尺寸一样(如dW和W的呎寸相同)可以根据这一点推导梯度的表达。