CS231n 卷积神经网络与计算机视觉 3 最优化与随机梯度下降
2016-05-25 17:21
836 查看
上节中我们已经接触到了图像识别中的两部分score function和 loss function,这节将会引入对loss function的优化求解,也就是optimization。为了求解loss function我们首先将loss function 可视化
这里左侧是以个方向的变化情况,纵坐标是loss值,右侧是两个方向变化得到的loss值(蓝色代表小的loss),左侧和中间是在一个数据上得到的loss,最右侧是在100个样本中得到的loss之后取的平均值。
我们可以这样解释loss function的分段线性:
假设我们有三个样本,使用svm分类,分类器只有一个参数w,那么我们可以得到三个样本的loss 函数:
L0=L1=L2=L=max(0,wT1x0−wT0x0+1)+max(0,wT2x0−wT0x0+1)max(0,wT0x1−wT1x1+1)+max(0,wT2x1−wT1x1+1)max(0,wT0x2−wT2x2+1)+max(0,wT1x2−wT2x2+1)(L0+L1+L2)/3
他们的可视化为:
由上图可以看出当处于右侧碗装图线的底部的时候对应的参数可以有较小的loss值,也就是可以比较好的得到预测的结果。上图是一维数据的展示,多维的会更加复杂。
从上面我们可以近似的看出求解参数的最终loss function可能近似于一个凸优化的问题(Stanford 凸优化教程http://stanford.edu/~boyd/cvxbook/),但是如果我们如果改变score function f可能就会得到非凸的优化求解问题(神经网络中的优化问题不再是一个凸优化问题)。
对于上面展示的loss function的分段性质,我们知道他只是局部可微的,似乎不能使用以往求解优化问题使用的梯度下降法,其实依然可以使用subgradient (http://www.docin.com/p-719979816.html)的方法,下面的称呼的梯度下降法也包括subgradient。
1. 随机选择,也就是靠运气随便选,最终选择一个表现较好的。比只选择一次要好些,这就是迭代进行多次的好处。文中准确率为15.5%,比随机一次理论的10%多一点,对于这样一个brain-dead random search solution已经不错了
2. 随机局部搜索。这个要好一点,准确率21.4%,他的思想是先随机给定一个参数,然后再这个参数附近使用不同的方向随机计算,选择表现好的方向,不断迭代,文中的结果是迭代了1000次步长为0.0001的结果。
3. 跟着梯度走。上面第二种方法我们可以看出有了一个正确的方向很重要,它不断摸索找到了比较好的方向,结果得到了提升,其实我们可以不用像他这么辛苦不断摸索,直接计算梯度得到一个好的方向(偏导),然后跟着这个方向去找最佳值。
df(x)dx=limh →0f(x+h)−f(x)h
及
df(x)dx=limh →0f(x+h)−f(x−h)2h
后者效果更好,因为将其展开之后可以发现他的精度更高。
另外对w进行更新时,还涉及到更新的步长W_new = W - step_size * df ,文中列出了不同步长下得到的损失函数的大小:
步长较大时计算快,但是容易错过最优解,步长小的时候收敛慢但是结果往往比较好。
这种方法中h一般要近似于0,但是一般只近似选取10^-5左右
Li=∑j≠yi[max(0,wTjxi−wTyixi+Δ)]
L相对于w的导数如下:
∇wyiLi=−⎛⎝∑j≠yi1(wTjxi−wTyixi+Δ>0)⎞⎠xi
∇wjLi=1(wTjxi−wTyixi+Δ>0)xi
其中,1()表示在()内为真时方程为1否则为0,这样上面第一个求导公式的含义是统计分类错误的数量乘以x,第二个是如果第j类分类错误,那么损失函数相对于他的参数的梯度就是x,为什么这么理解呢?
对w求导,这时候只认为w是变量其他都是看做常数,那么他对于L的偏导就是上面的式子了。
问题:为什么说这种方法error-prone 呢?
文中说The analytic gradient is exact, fast to compute but more error-prone since it requires the derivation of the gradient with math. Hence, in practice we always use the analytic gradient and then perform a gradient check, in which its implementation is compared to the numerical gradient.也就是说在人工推导的求导公式的时候容易出错,而且这样出错不容易被察觉是否真的错误,因此需要梯度检查。
优化 optimization
梯度计算
数值法numerical gradient
解析法 Computing the gradient analytically with Calculus
梯度下降
总结
a high-dimensional optimization landscape
SVM cost function is piece-wise linear and bowl-shaped.
iterative refinement
finite difference approximation
step size (or the learning rate)
numerical gradient,analytic gradient
Gradient Descent algorithm .
Visualizing the loss function
一般来说在图像处理的时候我们结果的数据都是多维的,前面CIFAR-10 的图片有3072维,一共10类,那么我们需要的参数就有30730个数据(表忘了还有b噢),显然无法将这么多维数据直接可视化,我们的方法是:先随机选一个初始的参数向量(30730个参数),然后给定一个变化的方向,每次沿这个方向变化一点就可以得到沿这个方向变化的所有参数的表现情况(一维可视化L(W+aW1)),如果我们给定了两个变化的方向,就可以在二维平面将其可视化(L(W+aW1+bW2)),如下图:这里左侧是以个方向的变化情况,纵坐标是loss值,右侧是两个方向变化得到的loss值(蓝色代表小的loss),左侧和中间是在一个数据上得到的loss,最右侧是在100个样本中得到的loss之后取的平均值。
我们可以这样解释loss function的分段线性:
假设我们有三个样本,使用svm分类,分类器只有一个参数w,那么我们可以得到三个样本的loss 函数:
L0=L1=L2=L=max(0,wT1x0−wT0x0+1)+max(0,wT2x0−wT0x0+1)max(0,wT0x1−wT1x1+1)+max(0,wT2x1−wT1x1+1)max(0,wT0x2−wT2x2+1)+max(0,wT1x2−wT2x2+1)(L0+L1+L2)/3
他们的可视化为:
由上图可以看出当处于右侧碗装图线的底部的时候对应的参数可以有较小的loss值,也就是可以比较好的得到预测的结果。上图是一维数据的展示,多维的会更加复杂。
从上面我们可以近似的看出求解参数的最终loss function可能近似于一个凸优化的问题(Stanford 凸优化教程http://stanford.edu/~boyd/cvxbook/),但是如果我们如果改变score function f可能就会得到非凸的优化求解问题(神经网络中的优化问题不再是一个凸优化问题)。
对于上面展示的loss function的分段性质,我们知道他只是局部可微的,似乎不能使用以往求解优化问题使用的梯度下降法,其实依然可以使用subgradient (http://www.docin.com/p-719979816.html)的方法,下面的称呼的梯度下降法也包括subgradient。
优化 optimization
有这么几种优化策略:1. 随机选择,也就是靠运气随便选,最终选择一个表现较好的。比只选择一次要好些,这就是迭代进行多次的好处。文中准确率为15.5%,比随机一次理论的10%多一点,对于这样一个brain-dead random search solution已经不错了
2. 随机局部搜索。这个要好一点,准确率21.4%,他的思想是先随机给定一个参数,然后再这个参数附近使用不同的方向随机计算,选择表现好的方向,不断迭代,文中的结果是迭代了1000次步长为0.0001的结果。
3. 跟着梯度走。上面第二种方法我们可以看出有了一个正确的方向很重要,它不断摸索找到了比较好的方向,结果得到了提升,其实我们可以不用像他这么辛苦不断摸索,直接计算梯度得到一个好的方向(偏导),然后跟着这个方向去找最佳值。
梯度计算
计算梯度有两种方法一种是数值方法numerical gradient,它计算比较慢,精度低但是比较容易;另一种是解析方法analytic gradient,它快速准确但是容易犯错。数值法numerical gradient
这种方法有两种计算梯度的计算公式:df(x)dx=limh →0f(x+h)−f(x)h
及
df(x)dx=limh →0f(x+h)−f(x−h)2h
后者效果更好,因为将其展开之后可以发现他的精度更高。
另外对w进行更新时,还涉及到更新的步长W_new = W - step_size * df ,文中列出了不同步长下得到的损失函数的大小:
original loss: 2.200718 # for step size 1.000000e-10 new loss: 2.200652 # for step size 1.000000e-09 new loss: 2.200057 # for step size 1.000000e-08 new loss: 2.194116 # for step size 1.000000e-07 new loss: 2.135493 # for step size 1.000000e-06 new loss: 1.647802 # for step size 1.000000e-05 new loss: 2.844355 # for step size 1.000000e-04 new loss: 25.558142 # for step size 1.000000e-03 new loss: 254.086573 # for step size 1.000000e-02 new loss: 2539.370888 # for step size 1.000000e-01 new loss: 25392.214036
步长较大时计算快,但是容易错过最优解,步长小的时候收敛慢但是结果往往比较好。
这种方法中h一般要近似于0,但是一般只近似选取10^-5左右
解析法 Computing the gradient analytically with Calculus
文中说以svm的损失函数为例,假设只有一个参数,第i张图片的损失函数如下:Li=∑j≠yi[max(0,wTjxi−wTyixi+Δ)]
L相对于w的导数如下:
∇wyiLi=−⎛⎝∑j≠yi1(wTjxi−wTyixi+Δ>0)⎞⎠xi
∇wjLi=1(wTjxi−wTyixi+Δ>0)xi
其中,1()表示在()内为真时方程为1否则为0,这样上面第一个求导公式的含义是统计分类错误的数量乘以x,第二个是如果第j类分类错误,那么损失函数相对于他的参数的梯度就是x,为什么这么理解呢?
对w求导,这时候只认为w是变量其他都是看做常数,那么他对于L的偏导就是上面的式子了。
问题:为什么说这种方法error-prone 呢?
文中说The analytic gradient is exact, fast to compute but more error-prone since it requires the derivation of the gradient with math. Hence, in practice we always use the analytic gradient and then perform a gradient check, in which its implementation is compared to the numerical gradient.也就是说在人工推导的求导公式的时候容易出错,而且这样出错不容易被察觉是否真的错误,因此需要梯度检查。
梯度下降
运用梯度迭代的方法寻求最优解又叫做梯度下降法,如果运用全部的样本进行计算那么每次计算都要考虑所有的样本,显然会影响效率,而且有时候也没有必要运用全部的数据来计算,所以在此基础上由批量地图下降法和小批量地图下降法及随机梯度下降法。Mini-batch gradient descent用的比较多,可以取得批量有256 128 64 32等 (2的指数形式计算比较快),Stochastic Gradient Descent (SGD)(也成为online gradient descent)相对用的比较少,有时候也称Mini-batch gradient descent为sgd。总结
Visualizing the loss function优化 optimization
梯度计算
数值法numerical gradient
解析法 Computing the gradient analytically with Calculus
梯度下降
总结
a high-dimensional optimization landscape
SVM cost function is piece-wise linear and bowl-shaped.
iterative refinement
finite difference approximation
step size (or the learning rate)
numerical gradient,analytic gradient
Gradient Descent algorithm .
相关文章推荐
- 自组织特征映射神经网络(SOM)
- wireshark抓TCP包
- android org.apache.http.*找不到
- spring mvc配置,可以理解为映射机制,即http url和action代码之间的关系的配置
- 网络流
- Android 同步网络时间
- Volley的基本用法 使用Volley加载网络图片
- HTTP协议缓存策略深入详解之etag妙用
- 基于HTTP在互联网传输敏感数据的消息摘要、签名与加密方案
- Erlang gen_tcp相关问题汇编索引
- Linux网络管理之net-tools VS iproute2
- HTTP状态码
- http-关于application/x-www-form-urlencoded等字符编码的解释说明
- php 使用tcpdf库输出pdf
- http错误404.17 错误代码 0x80070032 问题解决
- OKHttp 请求库
- okhttpUtils 框架的理解
- VirtualBox ubuntu server内外网皆通的网络连接设置
- jpeg图片接收显示测试上位机[串口 网络 摄像头上位机软件 开源]
- TCP协议三次握手、四次挥手