最优化Optimization
最优化是寻找能使得损失函数值最小化的参数W的过程。
策略#1:一个差劲的初始方案:随机搜索
策略#2:随机本地搜索
策略#3:跟随梯度
(比较简单不再赘述)
梯度计算
梯度公式:
1. 数值梯度法(慢and简单,不适合大规模数据)
根据上面的公式计算梯度。
举个例子实际应用,例如计算权重空间某些随机点上CIFAR-10的损失函数的梯度。
先计算一个随机权重向量的梯度,梯度告诉了我们损失函数在每个维度上的斜率,于是规定不同步长后,更新权重向量的位置,重新计算损失函数。
# 查看不同步长的效果
for step_size_log in [-10, -9, -8, -7, -6, -5,-4,-3,-2,-1]:
step_size = 10 ** step_size_log
W_new = W - step_size * df # 权重空间中的新位置
loss_new = CIFAR10_loss_fun(W_new)
print 'for step size %f new loss: %f' % (step_size, loss_new)
步长:梯度指明了函数在哪个方向是变化率最大的,但是没有指明在这个方向上应该走多远。
2. 分析梯度法(快and易错)
在实际操作时常常将分析梯度法的结果和数值梯度法的结果作比较,以此来检查其实现的正确性,这个步骤叫做梯度检查。
其中是一个示性函数,如果括号中的条件为真,那么函数值为1,如果为假,则函数值为0。在代码实现的时候比较简单:只需要计算没有满足边界值的分类的数量(因此对损失函数产生了贡献),然后乘以Xi就是梯度了。
梯度下降
概念:程序重复地计算损失函数的梯度然后对参数进行更新
# 普通的梯度下降
while True:
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += - step_size * weights_grad # 进行梯度更新
小批量数据梯度下降(Mini-batch gradient descent):
随机梯度下降(Stochastic Gradient Descent 简称SGD)
(没细讲)
笔记参考来源:https://zhuanlan.zhihu.com/p/21930884