- 损失函数可视化
- 最优化
- 有限差值法求梯度
- 微分法求梯度:softmax为损失函数时推导
前面介绍了两部分:
1. 评分函数:将原始图像像素映射为分类评分值
2. 损失函数:根据评分函数和训练集图像数据实际分类的一致性,衡量某个具体参数集的质量好坏。
那么寻找到能使损失函数值最小化的参数的过程就是最优化 Optimization。
损失函数可视化
损失函数L可以看作是权重W的函数,在CIFAR-10中一个分类器的权重矩阵大小是[10,3073],即 L(W1,W2,....,W10) L ( W 1 , W 2 , . . . . , W 10 ) ,对其中某一个分类器 Wi W i 有3073个参数,想要得到 L L 关于
的可视化很难。
但是方法还是有的,随机生成一个权重矩阵W,并沿着此方向计算损失值, L(W+αW1) L ( W + α W 1 ) 。
总而言之,就是将高维空间压缩到二维, Wi[1,3073] W i [ 1 , 3073 ] 转换到 [1,1] [ 1 , 1 ] 然后在此基础上,画出loss关于它的值。
如果是压缩到三维,就是[1,3073]->[1,2],那么完整的loss就是这个形状的3073/2*10维的版本。
最优化Optimization
在数学上我们已经知道loss下降最快的方向就是梯度方向(gradient)。
有限差值法计算梯度
公式: df(x)dx=limh→0f(x+h)−f(x)h d f ( x ) d x = lim h → 0 f ( x + h ) − f ( x ) h
下面代码是一个输入为函数f和向量x,计算f的梯度的通用函数,它返回函数f在点x处的梯度:
def eval_numerical_gradient(f, x):
"""
一个f在x处的数值梯度法的简单实现
- f是只有一个参数的函数
- x是计算梯度的点
"""
fx = f(x) # 在原点计算函数值
grad = np.zeros(x.shape) ##
h = 0.00001
# 对x中所有的索引进行迭代
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
# 计算x+h处的函数值
ix = it.multi_index
old_value = x[ix]
x[ix] = old_value + h # 增加h