您的位置:首页 > 其它

损失函数的优化

2019-01-18 09:55 585 查看

优化

优化是针对参数 W 而展开的。

方法

  • 随机搜寻。
  • 梯度下降法
随机搜寻法:

  需要很多的权值(W值),然后随机采样选出W后将它们输入损失函数里,然后查看效果如何。

   Very worse!

# 假设X_train是[3273 × 50000]的每一列
# 假设Y_train是对应图像的标签名(ID array of 50000)
# 假设函数L表示损失函数

bestloss = float("inf")

for num in xrange(1000):
W = np.random.randn(10,3072) * 0.0001
loss = L(X_train, Y_train, W)
if loss < bestloss:
bestloss = loss
bestW = W
print '在第 %d 次尝试下的损失是 %f ,最佳的损失是 %f' % (num, loss, bestloss)
梯度下降法:

梯度给出了在当前点的函数的一阶线性逼近

正梯度指向函数增长最快的方向,同理,负梯度指向函数下降最快的方向。

某处的斜率就等于该点上梯度和该点单位方向向量的乘积。

梯度的计算方法:
  • 有限差分法。
  • 微积分计算法。

有限差元法:

对于一个确定的权值W,n维(n×1),损失是确定的。然后在W的第一方向上(维度)加上一个很小很小的值h,此时再计算下损失。两者之差除以那个微小的改变h就得到了梯度dW的第一个数(第一维)。重复直到将W每一方向都单独改变来计算,就得到了dW。

步骤一:

步骤二:

步骤三:

···

重复重复~~

直到算出所有行。

缺点:

每一个都需要计算,而数据量又大,需要等待千万次计算来得到梯度,效率实在太低

微积分求解法:

最后的结果是求 ▽wL:

步骤1:(就一个步骤就能算完)

优点:

计算步骤明确,也很快

# 深度学习的核心

while True:
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += -step_size * weights_grad

# 首先初始化W为随机值,只要是为真时,
# 计算损失和梯度
# 然后向梯度相反的方向走并更新权值W
步长~step——size

在梯度下降算法中,步长告诉我们每次前进的距离,在深度学习中,步长也称为学习率,是一个要在最初进行设定的超参数。

这个参数很重要,一般在建立模型中要最先确定~

梯度下降法大杂烩~

批量梯度下降法-Batch Gradient Descent(BGD)

概念:在每次迭代都选取所有的样本来更新权值W,其实就是之前的梯度下降算法~

缺点:

每次都要使用所有的样本,而训练的图片成千上万,这之间每次更新一个权值都要访问所有的图片,开销太大!

# BGD

while True:
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += -step_size * weights_grad

随机梯度下降法-Stochastic Gradient Descent(SGD)

概念:并非计算整个训练集的损失和梯度值,而是在每一次迭代中,仅仅选取一小部分训练样本记为 minibitch (按照惯例,通常取2的幂次方如32,64等个),用这个 minibitch 来计算损失和求当前位置的梯度。

缺点:

虽然解决了每次都要访问所有样本的问题,但是准确度不够,由于样本的随机性导致收敛方向变化大,不能很快收敛到局部最优解!

# SGD

while True:
data_batch = smaple_training_data(data,256)  #取256个
weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
weights += -step_size * weights_grad

带有动量的SGD-Momentum SGD

概念:保持一个不随时间变化的速度,并且将估计的梯度加到这个速度上,然后在这个速度的方向上前进,而不是在梯度的方向上前行。还有一个超参数ρ表示对前进方向的阻碍作用。实现的思想是在每一步,采用当前的速度,然后用摩擦系数ρ来对其衰减,之后将之加到梯度上。于是就实现了在速度向量的方向上前行,而不是在原始梯度向量的方向上步行。

特点:

解决了SGD在局部极小值(鞍点)时由于梯度为0而停止运动的问题。(直观理解是哪怕梯度为0,到那时仍然有一个速度,故会继续运行下去。)

# Momentum SGD

while True:
data_batch = smaple_training_data(data,256)  #取256个
weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
Velocity = rho * Velocity + weights_grad
weights += -step_size * Velocity

Nesterov动量-Nesterov Momentum

概念:是对传统Momentum方法的一种改进

基本思想如下:

从红色点开始,然后再取得的速度方向上前行,然后对这个位置的梯度进行评估,然后又回到初始点并将这两者混合起来。

对凸优化问题上有很好的理论性质

公式▼

带入后得:

SGD,SDG+Monmentum,Nesterov作用图示(o゚v゚)ノ

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: