2018-06-04 15:34

内容列表：

• 简介
• 损失函数可视化
• 最优化
• 策略#1：随机搜索
• 策略#2：随机局部搜索
• 策略#3：跟随梯度
• 梯度计算
• 使用有限差值进行数值计算
• 微分计算梯度
• 梯度下降
• 小结

简介

1. 基于参数的评分函数。该函数将原始图像像素映射为分类评分值（例如：一个线性函数）。
2. 损失函数。该函数能够根据分类评分和训练集图像数据实际分类的一致性，衡量某个具体参数集的质量好坏。损失函数有多种版本和不同的实现方式（例如：Softmax或SVM）。

最优化 Optimization

 1# 假设X_train的每一列都是一个数据样本（比如3073 x 50000） 2# 假设Y_train是数据样本的类别标签（比如一个长50000的一维数组） 3# 假设函数L对损失函数进行评价 4bestloss = float("inf") # Python assigns the highest possible float value 5for num in xrange(1000): 6  W = np.random.randn(10, 3073) * 0.0001 # generate random parameters 7  loss = L(X_train, Y_train, W) # get the loss over the entire training set 8  if loss < bestloss: # keep track of the best solution 9    bestloss = loss10    bestW = W11  print 'in attempt %d the loss was %f, best %f' % (num, loss, bestloss)12# 输出:13# in attempt 0 the loss was 9.401632, best 9.40163214# in attempt 1 the loss was 8.959668, best 8.95966815# in attempt 2 the loss was 9.044034, best 8.95966816# in attempt 3 the loss was 9.278948, best 8.95966817# in attempt 4 the loss was 8.857370, best 8.85737018# in attempt 5 the loss was 8.943151, best 8.85737019# in attempt 6 the loss was 8.605604, best 8.60560420# ... (trunctated: continues for 1000 lines)

1# 假设X_test尺寸是[3073 x 10000], Y_test尺寸是[10000 x 1]2scores = Wbest.dot(Xte_cols) # 10 x 10000, the class scores for all test examples3# 找到在每列中评分值最大的索引（即预测的分类）4Yte_predict = np.argmax(scores, axis = 0)5# 以及计算准确率6np.mean(Yte_predict == Yte)7# 返回 0.1555

 1W = np.random.randn(10, 3073) * 0.001 # 生成随机初始W 2bestloss = float("inf") 3for i in xrange(1000): 4  step_size = 0.0001 5  Wtry = W + np.random.randn(10, 3073) * step_size 6  loss = L(Xtr_cols, Ytr, Wtry) 7  if loss < bestloss: 8    W = Wtry 9    bestloss = loss10  print 'iter %d loss is %f' % (i, bestloss)

梯度计算

 1def eval_numerical_gradient(f, x): 2  """  3 一个f在x处的数值梯度法的简单实现 4 - f是只有一个参数的函数 5 - x是计算梯度的点 6 """  7  fx = f(x) # 在原点计算函数值 8  grad = np.zeros(x.shape) 9  h = 0.0000110  # 对x中所有的索引进行迭代11  it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])12  while not it.finished:13    # 计算x+h处的函数值14    ix = it.multi_index15    old_value = x[ix]16    x[ix] = old_value + h # 增加h17    fxh = f(x) # 计算f(x + h)18    x[ix] = old_value # 存到前一个值中 (非常重要)19    # 计算偏导数20    grad[ix] = (fxh - fx) / h # 坡度21    it.iternext() # 到下个维度22  return grad

1# 要使用上面的代码我们需要一个只有一个参数的函数2# (在这里参数就是权重)所以也包含了X_train和Y_train3def CIFAR10_loss_fun(W):4  return L(X_train, Y_train, W)5W = np.random.rand(10, 3073) * 0.001 # 随机权重向量6df = eval_numerical_gradient(CIFAR10_loss_fun, W) # 得到梯度

 1loss_original = CIFAR10_loss_fun(W) # 初始损失值 2print 'original loss: %f' % (loss_original, ) 3# 查看不同步长的效果 4for step_size_log in [-10, -9, -8, -7, -6, -5,-4,-3,-2,-1]: 5  step_size = 10 ** step_size_log 6  W_new = W - step_size * df # 权重空间中的新位置 7  loss_new = CIFAR10_loss_fun(W_new) 8  print 'for step size %f new loss: %f' % (step_size, loss_new) 9# 输出:10# original loss: 2.20071811# for step size 1.000000e-10 new loss: 2.20065212# for step size 1.000000e-09 new loss: 2.20005713# for step size 1.000000e-08 new loss: 2.19411614# for step size 1.000000e-07 new loss: 2.13549315# for step size 1.000000e-06 new loss: 1.64780216# for step size 1.000000e-05 new loss: 2.84435517# for step size 1.000000e-04 new loss: 25.55814218# for step size 1.000000e-03 new loss: 254.08657319# for step size 1.000000e-02 new loss: 2539.37088820# for step size 1.000000e-01 new loss: 25392.214036

梯度下降

1# 普通的梯度下降2while True:3  weights_grad = evaluate_gradient(loss_fun, data, weights)4  weights += - step_size * weights_grad # 进行梯度更新

1# 普通的小批量数据梯度下降2while True:3  data_batch = sample_training_data(data, 256) # 256个数据4  weights_grad = evaluate_gradient(loss_fun, data_batch, weights)5  weights += - step_size * weights_grad # 参数更新

小结

• 将损失函数比作了一个高维度的最优化地形，并尝试到达它的最底部。最优化的工作过程可以看做一个蒙着眼睛的徒步者希望摸索着走到山的底部。在例子中，可见SVM的损失函数是分段线性的，并且是碗状的。

• 提出了迭代优化的思想，从一个随机的权重开始，然后一步步地让损失值变小，直到最小。

• 函数的梯度给出了该函数最陡峭的上升方向。介绍了利用有限的差值来近似计算梯度的方法，该方法实现简单但是效率较低（有限差值就是h，用来计算数值梯度）。

• 参数更新需要有技巧地设置步长。也叫学习率。如果步长太小，进度稳定但是缓慢，如果步长太大，进度快但是可能有风险。

• 讨论权衡了数值梯度法和分析梯度法。数值梯度法计算简单，但结果只是近似且耗费计算资源。分析梯度法计算准确迅速但是实现容易出错，而且需要对梯度公式进行推导的数学基本功。因此，在实际中使用分析梯度法，然后使用梯度检查来检查其实现正确与否，其本质就是将分析梯度法的结果与数值梯度法的计算结果对比。

• 介绍了梯度下降算法，它在循环中迭代地计算梯度并更新参数。

- END -

{{panelTitle}}

{{item.creationTime | formatDateTime}}
{{ritem.creationTime | formatDateTime}}

{{ritem.contents?ritem.contents:'没有填写内容'}}

{{item.creationTime | formatDateTime}}
{{ritem.creationTime | formatDateTime}}

{{ritem.contents?ritem.contents:'没有填写内容'}}