损失函数的优化
优化
优化是针对参数 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゚)ノ
- CNN中激活函数,优化器,损失函数的选择
- 盘点机器学习中常见的损失函数和优化算法
- Pytorch打怪路(一)pytorch进行CIFAR-10分类(3)定义损失函数和优化器
- 【PyTorch图像语义分割】3. 训练规则:损失函数、优化
- 8.2 TensorFlow实现KNN与TensorFlow中的损失函数,优化函数
- 【机器学习】【base】 之 目标函数 损失函数 优化算法
- mxnet(gluon)—— 模型、数据集、损失函数、优化子等类、接口大全
- day4_cs231n _ 损失函数与优化器
- DL-损失函数与优化
- 损失函数优化方法
- 机器学习中的优化算法、加速训练机制、损失函数、KL散度和交叉熵
- [置顶] 罗斯基白话:TensorFlow+实战系列(三)常用损失函数与参数优化
- CS231N 笔记2_损失函数和优化器
- 深度学习笔记——TensorFlow学习笔记(二)激活函数、损失函数、优化算法和正则项
- CS231n Lecture 3:损失函数和优化
- tensorflow系列1:两种方式优化损失函数
- CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
- 车牌分类任务(四、定义网络模型,损失函数,优化算法)
- Android低端设备加载大图片、优化设备加载图片
- Android开发资料:Android启动优化解析