cs231n 课程笔记 学习笔记#002

最优化

原文:http://cs231n.github.io/optimization-1/

参考翻译:https://zhuanlan.zhihu.com/p/21360434?refer=intelligentunit

最优化是寻找能使得损失函数值最小化的参数W的过程。

与随机搜索和随机本地搜索相比,显然跟随梯度是最好的策略。

梯度计算

两种方法:数值梯度法(较慢但实现简单),分析梯度法(计算迅速结果准确)

数值梯度法:

公式:

代码:

def eval_numerical_gradient(f, x):
    '''
    - f 是只有一个参数的函数
    - x 是计算梯度的点   
    '''
    fx = f(x)
    grad = np.zeros(x.shape)
    h = 0.00001

    it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
    while not it.finished:
        ix = it.multi_index
        old_value = x[ix]
        x[ix] = old_value + h
        fxh = f(x) # compute f(x+h)
        x[ix] = old_value # 存到前一个值中(重要)

        grad[ix] = (fxh - fx) / h
        it.iternext()

       return grad

实际中用中心差值公式效果较好。

分析梯度法

用SVM的损失函数为例:

对进行微分得到:

公式看起来复杂,其实代码实现时只需要计算没有满足边界值的分类的数量,然后乘以xi就是梯度了。

对于的梯度是:

梯度下降

程序重复计算梯度并对参数进行更新。

小批量数据梯度下降

训练数据可能达到百万级量级,如果计算整个训练集来获得一个参数的更新就太浪费了,一个常用方法是计算训练集中的小批量数据。

如果每个批量中只有1个数据样本,则被称为随机梯度下降Stochastic Gradient Descent, 简称SGD。但是相对少见,有时用来指代小批量数据梯度下降。小批量数据的大小是一个超参数,一般使用2的指数(32,64, 256),因为运算会更快。

反向传播

原文:http://cs231n.github.io/optimization-2/

参考翻译:https://zhuanlan.zhihu.com/p/21407711?refer=intelligentunit

核心问题:给定函数f(x),计算函数关于x的梯度。

在神经网络中的f对应损失函数,输入x包含训练数据和神经网络权重。

理解梯度

函数关于每个变量的导数指明了整个表达式对于该变量的敏感程度。

梯度实际上仍是一个向量。

利用链式法则可计算复合函数的梯度。

理解反向传播

反向传播是一个局部过程。整个计算过程中,每个门单元会得到一些输入并立即计算两个东西:自己的输出值和这个输出值关于输入的局部梯度。完成这两件事是完全独立的,不需要知道计算线路中的其它细节。在反向传播时,才根据链式法则计算整个网络的输出关于这个门的各个输入值的梯度。

对下面这个简单例子来说:cs231n 课程笔记 学习笔记#002_第1张图片

首先赋给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的尺寸相同)。可以根据这一点推导梯度的表达。

你可能感兴趣的:(机器学习)