sgd

优化器,sgd,adam等

£可爱£侵袭症+ 提交于 2019-11-27 13:39:39
https://zhuanlan.zhihu.com/p/32230623 首先定义:待优化参数: ,目标函数: ,初始学习率 。 而后,开始进行迭代优化。在每个epoch : 计算目标函数关于当前参数的梯度: 根据历史梯度计算一阶动量和二阶动量: , 计算当前时刻的下降梯度: 根据下降梯度进行更新: sgd: 先来看SGD。SGD没有动量的概念,也就是说: 代入步骤3,可以看到下降梯度就是最简单的 SGD缺点:下降速度慢,而且可能会在沟壑的两边持续震荡,停留在一个局部最优点。 SGD with Momentum sgd引入一阶动量,为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些 t时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定 0.9 AdaGrad 怎么样去度量历史更新频率呢?那就是二阶动量——该维度上,迄今为止所有梯度值的平方和: 我们再回顾一下步骤3中的下降梯度: 可以看出,此时实质上的学习率由 变成了 ,这也是为什么叫自适应学习率 这一方法在稀疏数据场景下表现非常好。但也存在一些问题:因为 是单调递增的,会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。 AdaDelta / RMSProp 由于AdaGrad单调递减的学习率变化过于激进

Adam与SGD

一世执手 提交于 2019-11-27 13:39:06
本文转载自「机器学习炼丹记」,搜索「julius-ai」即可关注。 原文链接: 小象 (一)一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了。 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了,这出来的口味可是千差万别。火小了夹生,火大了易糊,火不匀则半生半糊。 机器学习也是一样,模型优化算法的选择直接关系到最终模型的性能。有时候效果不好,未必是特征的问题或者模型设计的问题,很可能就是优化算法的问题。 说到优化算法,入门级必从 SGD 学起,老司机则会告诉你更好的还有 AdaGrad / AdaDelta,或者直接无脑用 Adam。可是看看学术界的最新 paper,却发现一众大神还在用着入门级的 SGD,最多加个 Momentum 或者 Nesterov,还经常会黑一下Adam。比如 UC Berkeley 的一篇论文就在 Conclusion 中写道: Despite the fact that our experimental evidence demonstrates that adaptive methods are not advantageous for machine learning, the Adam algorithm remains

精简版SGD理解随机梯度下降过程

北慕城南 提交于 2019-11-27 10:36:42
1 #精简版SGD 2 def SGD(self, training_data, epochs, mini_batch_size, eta,): 3 n = len(training_data) 4 # 进行epochs次主循环来计算weights和biases 5 for j in xrange(epochs): 6 # 每个主循环走一遍所有训练数据,并shuffle一下提供好的随机性 7 random.shuffle(training_data) 8 # 对于每个计算随机梯度的具体事件,设置一个mini_batch,用这mini_batch_size个样本来计算随机梯度 9 mini_batches = [ 10 training_data[k:k+mini_batch_size] 11 for k in xrange(0, n, mini_batch_size)] 12 # 计算随机梯度,更新weights和biases,eta是学习率 13 for mini_batch in mini_batches: 14 self.update_mini_batch(mini_batch, eta) 知乎上看到一个直观的解释... 链接:https://www.zhihu.com/question/43673341/answer/730181826 涉及到的基础概念有批数量,迭代次数

梯度下降法

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-26 13:55:00
目录 梯度下降法 一、什么是梯度下降? 二、简单线性回归中使用梯度下降法 三、多元线性回归算法中使用梯度下降法 四、梯度下降算法的向量化 五、梯度下降法 1、批量梯度下降法 2、随机梯度下降 3、mini-batch Gradient Descent 4、scikit-learn中封装实现sgd 六、关于梯度的调试 我是尾巴 梯度下降法 梯度下降法,是一种基于搜索的最优化方法,最用是最小化一个损失函数。 一、什么是梯度下降? ​ 机器学习算法都需要最大化或最小化一个函数,这个函数被称为"目标函数",其中我们一般把最小化的一类函数,称为"损失函数"。它能根据预测结果,衡量出模型预测能力的好坏。在求损失函数最小化的过程中使用梯度下降法。 $\frac{dJ(\theta)}{d\theta}$ ​ 在直线方程中,倒数代表斜率,在曲线方程中,倒数代表切线的斜率。倒数代表着参数theta单位变化时,损失函数J相应的的变化。通过上面图中的点可以发现,改点的导数为负值,所以随着参数theta的增加,损失函数J减小,因此导数从某种意义上还可以代表方向,对应着损失函数J增大的方向。 $-\eta\frac{dJ(\theta)}{d\theta}$ ​ 综上,如果最小化一个函数,我们就需要得到导数再取个负数,并且再乘以一个系数,这个系数通常叫做步长或者叫学习率(Learning rate, Lr)

机器学习之分类

只愿长相守 提交于 2019-11-26 13:47:25
本次使用的数据集是比较经典的mnist数据集。它有着 70000 张规格较小的手写数字图片,由美国的高中生和美国人口调查局的职员手写而成。这相当于机器学习当中的“Hello World”,人们无论什么时候提出一个新的分类算法,都想知道该算法在这个数据集上的表现如何。机器学习的初学者迟早也会处理 MNIST 这个数据集。接下来就是进行数据集的读取工作。 加载数据 机器学习的初学者迟早会接触Minist这个数据集,sklearn提供很多辅助函数用于下载流行的数据集 fetch_mldata 出错修改方式 下载文件 https://github.com/amplab/datascience-sp14/raw/master/lab7/mldata/mnist-original.mat 创建一个文件夹:datasets或mldata,将下载好的mnist-original.mat文件放在这个文件夹之中。 fetch_mldata('MNIST original', data_home="datasets"),data_home参数即为从本地导入数据的地址。 from sklearn.datasets import fetch_mldata mnist = fetch_mldata('MNIST original', data_home="sample_data") mnist X, y =

梯度下降法(BGD & SGD & Mini-batch SGD)

耗尽温柔 提交于 2019-11-26 10:29:41
梯度下降法(Gradient Descent) 优化思想:用当前位置的负梯度方向作为搜索方向,亦即为当前位置下降最快的方向,也称“最速下降法”。越接近目标值时,步长越小,下降越慢。 如下图所示,梯度下降不一定能找到全局最优解,可能寻找到的是局部最优解。(当损失函数是凸函数时,梯度下降得到的解一定是全局最优解,因为凸函数的极小值即为最小值) 梯度下降法 批量梯度下降法(Batch Gradient Descent,BGD) :在更新参数时,BGD根据batch中的所有样本对参数进行更新。 θ为参数,x为每个样本的n个特征值 为了简化表示,增加特征x_0=1 损失函数J,m为一个batch中的样本数 参数更新,α为步长 上式展开即为,其中α和1/m均为常数,可用一个常数表示 随机梯度下降法(Stochastic Gradient Descent,SGD): 和BGD的原理类似,区别在于每次随机选取一个样本j求梯度。 对于训练速度来说,SGD每次仅仅采用一个样本来迭代,训练速度很快,而BGD在样本量很大的时候,训练速度不能让人满意。 对于准确度来说,SGD仅仅用一个样本决定梯度方向,导致解很有可能不是最优。 对于收敛速度来说,由于SGD一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。 SGD 小批量梯度下降法(Mini-batch Gradient Desent