momentum

What's different about momentum gradient update in Tensorflow and Theano like this?

三世轮回 提交于 2019-12-05 08:10:46
I'm trying to use TensorFlow with my deep learning project. Here I need implement my gradient update in this formula : I have also implement this part in Theano, and it came out the expected answer. But when I try to use TensorFlow's MomentumOptimizer , the result is really bad. I don't know what is different between them. Theano: def gradient_updates_momentum_L2(cost, params, learning_rate, momentum, weight_cost_strength): # Make sure momentum is a sane value assert momentum < 1 and momentum >= 0 # List of update steps for each parameter updates = [] # Just gradient descent on cost for param

深度学习各种优化函数详解

寵の児 提交于 2019-12-05 07:39:12
深度学习各种优化函数详解 深度学习中有众多有效的优化函数,比如应用最广泛的SGD,Adam等等,而它们有什么区别,各有什么特征呢?下面就来详细解读一下 一、先来看看有哪些优化函数 BGD 批量梯度下降 所谓的梯度下降方法是无约束条件中最常用的方法。假设f(x)是具有一阶连续偏导的函数,现在的目标是要求取最小的f(x) : min f(x) 核心思想:负梯度方向是使函数值下降最快的方向,在迭代的每一步根据负梯度的方向更新x的值,从而求得最小的f(x)。因此我们的目标就转变为求取f(x)的梯度。 当f(x)是凸函数的时候,用梯度下降的方法取得的最小值是全局最优解,但是在计算的时候,需要在每一步(xk处)计算梯度,它每更新一个参数都要遍历完整的训练集,不仅很慢,还会造成训练集太大无法加载到内存的问题,此外该方法还不支持在线更新模型。其代码表示如下: for i in range(nb_epochs): params_grad = evaluate_gradient(loss_function, data, params) params = params - learning_rate * params_grad 1 2 3 我们首先需要针对每个参数计算在整个训练集样本上的梯度,再根据设置好的学习速率进行更新。 公式表示如下: 假设h(theta)是我们需要拟合的函数,n表示参数的个数

加速神经网络训练 (Speed Up Training)

早过忘川 提交于 2019-12-05 06:45:50
怎样加速神经网络的训练过程: 1.SGD 2.Momentum 3.AdaGrad 4.RMSProp 5.Adam 1.Stochastic Gradient Descent (SGD) 所以, 最基础的方法就是 SGD 啦, 想像红色方块是我们要训练的 data, 如果用普通的训练方法, 就需要重复不断的把整套数据放入神经网络 NN训练, 这样消耗的计算资源会很大. 我们换一种思路, 如果把这些数据拆分成小批小批的, 然后再分批不断放入 NN 中计算, 这就是我们常说的 SGD 的正确打开方式了. 每次使用批数据, 虽然不能反映整体数据的情况, 不过却很大程度上加速了 NN 的训练过程, 而且也不会丢失太多准确率.如果运用上了 SGD, 你还是嫌训练速度慢, 那怎么办? 没问题, 事实证明, SGD 并不是最快速的训练方法, 红色的线是 SGD, 但它到达学习目标的时间是在这些方法中最长的一种. 我们还有很多其他的途径来加速训练. Momentum 更新方法 大多数其他途径是在更新神经网络参数那一步上动动手脚,传统的参数W的更新是把原始的W累加上一个负的学习率(;learning rate)乘以校正值(dx),这种方法可能 会让学习过程变得曲折无比,看起来像喝醉的人回家时,摇摇晃晃走了很多弯路。 所以把这个人从平底放到一个斜坡上,只要他往下坡的方向走一点点,由于向下的惯性

Overflow Scrolling on Android doesn't work?

半腔热情 提交于 2019-12-03 09:12:26
yupp, I'm one of these guys who want to develop mobile apps with HTML5. On Android and iOS. Sounds crazy I know. Sadly I have a problem... I have a classic app with a footer and header and a content which should be scrollable. On iOS this works fantastic! The header and footer have "position: fixed" to top/bottom and the content uses native scrolling momentum with "-webkit-overflow-scrolling: touch;". I know that "-webkit-overflow-scrolling: touch;" isn't available on Android, but this property is not only ignored, scrolling doesn't work at all! So please can anyone tell me how to get "native"

Gradient Descent with Momentum

匿名 (未验证) 提交于 2019-12-03 00:40:02
在Batch Gradient Descent及Mini-batch Gradient Descent, Stochastic Gradient Descent(SGD)算法中,每一步优化相对于之前的操作,都是独立的。每一次迭代开始,算法都要根据更新后的Cost Function来计算梯度,并用该梯度来做Gradient Descent。 Momentum Gradient Descent相较于前三种算法,虽然也会根据Cost Function来计算当前的梯度,但是却不直接用此梯度去做Gradient Descent。而是赋予该梯度一个权值,并综合考虑之前N次优化的梯度,得到一个加权平均的移动平均值(Weighted Moving Average),并以此来作为Gradient Descent的参数。 这里使用Exponential Moving Average(EMA)来计算该加权平均值,公式为: dW为本次计算出的梯度值,beta是衰减因子。如果将上式展开,可以得到: 根据β值的大小,可以得出大致纳入考虑范围的步数为1/(1-β),β值越大,步数约多,反之则窗口约窄。 EMA算法的优点: 1.EMA会减小算法的震荡 2.在实现上也非常有效率,比起Simple Moving Average,EMA所用的存储空间小,并且每次迭代中使用一行代码即可实现。 不过

TensorFlow三种常用的优化器

匿名 (未验证) 提交于 2019-12-03 00:22:01
简介 目前TensorFlow支持11种不同的经典优化器(参考 TensorFlow API tf.train文档 ) tf.train.Optimizer tf.train.GradientDescentOptimizer tf.train.AdadeltaOptimizer tf.train.AdagtadOptimizer tf.train.AdagradDAOptimizer tf.train.MomentumOptimizer tf.train.AdamOptimizer tf.train.FtrlOptimizer tf.train.ProximalGradientDescentOptimizer tf.train.ProximalAdagradOptimizer tf.train.RMSProOptimizer 介绍三种常用优化器 tf.train.GradientDescentOptimizer 、 tf.train.MomentumOptimizer、 tf.train.AdamOptimizer 1. tf.train.GradientDescentOptimizer 这个优化器主要实现的是 梯度下降算法 __init__( learning_rate, use_locking=False, name='GradientDescent' ) learning

卷积神经网络 + 机器视觉:L7_进阶梯度下降_正则化_迁移学习 (斯坦福课堂)

匿名 (未验证) 提交于 2019-12-03 00:19:01
完整的视频课堂链接如下: https://www.youtube.com/watch?v=_JB0AO7QxSA&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv&index=7 完整的视频课堂投影片连接: http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture7.pdf 前一课堂笔记连结: 卷积神经网络 + 机器视觉: L6_初始化_激励函数_BN_梯度下降 (斯坦福课堂) Menu this round Fancier Optimization Regularization Transfer Learning 如果一个神经网络模型中,我们把学习效率 learning rate 总是调的很低,理论上只要时间允许的情况下,结果也总是可以达到预期的。但是现实很骨感,在迅速变迁的时代,学得不够快的模型又怎么能够满足以效率著称的科技公司们的胃口呢?因此必须有一个更好的办法加速这个学习过程,更快的找到 Hyperparameter 才行。 虽然前面说的 Gradient Descent 理论上很完美,总是沿着梯度不断下滑,到最后就可以找到最小值,但是实际过程中越多维度越容易造成的坑坑巴巴路面总是让 GD 的路径扭来扭去,不直接快速的滑到低谷里,因此这边即将介绍一些方法来改进这个缺陷。 最简单的 GD

【PyTorch】PyTorch中的梯度累加

匿名 (未验证) 提交于 2019-12-03 00:13:02
PyTorch中在反向传播前为什么要手动将梯度清零? - Pascal的回答 - 知乎 https://www.zhihu.com/question/303070254/answer/573037166 这种模式可以让梯度玩出更多花样,比如说梯度累加(gradient accumulation) 传统的训练函数,一个batch是这么训练的: for i,(images,target) in enumerate(train_loader): # 1. input output images = images.cuda(non_blocking=True) target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True) outputs = model(images) loss = criterion(outputs,target) # 2. backward optimizer.zero_grad() # reset gradient loss.backward() optimizer.step() 获取loss:输入图像和标签,通过infer计算得到预测值,计算损失函数; optimizer.zero_grad() 清空过往梯度; loss.backward() 反向传播, 计算当前梯度 ;

pytorch adam 源码

匿名 (未验证) 提交于 2019-12-02 23:51:01
关于优化函数的调整 拆下包: https://ptorch.com/docs/1/optim class torch.optim.Optimizer(params, defaults) 所有优化的基类. 参数: params (iterable) ―― 可迭代的Variable 或者 dict。指定应优化哪些变量。 defaults-(dict):包含优化选项的默认值的dict(一个参数组没有指定的参数选项将会使用默认值)。 load_state_dict(state_dict) 加载optimizer状态 参数: state_dict (dict) ―― optimizer的状态。应该是state_dict()调用返回的对象。 state_dict() 将优化器的状态返回为一个dict。 它包含两个内容: state - 持有当前optimization状态的dict。它包含了 优化器类之间的不同。 param_groups - 一个包含了所有参数组的dict。 step(closure) 执行单个优化步骤(参数更新)。 不同的优化算子 参考:莫烦大神视频,传送门不给直接百度搜就好; 首先给出基本的四种更换优化算子的代码: SGD 就是随机梯度下降 opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR) momentum

梯度下降优化算法综述与PyTorch实现源码剖析

匿名 (未验证) 提交于 2019-12-02 23:45:01
现代的机器学习系统均利用大量的数据,利用梯度下降算法或者相关的变体进行训练。传统上,最早出现的优化算法是SGD,之后又陆续出现了AdaGrad、RMSprop、ADAM等变体,那么这些算法之间又有哪些区别和联系呢?本文试图对比的介绍目前常用的基于一阶梯度的优化算法,并给出它们的(PyTorch)实现。 SGD 随机梯度下降法(Stochastic Gradient Descent,SGD)是对传统的梯度下降算法(Gradient Descent,GD)进行的一种改进。在应用GD时,我们需要对整个训练集进行一次反向传播计算梯度后再进行参数更新,对系统的计算能力和内存的需求较高,而SGD在计算梯度更新参数时刚好相反,每次只使用整个训练集中的一个样本,因此具有更快地计算速度和较少的内存占用。同时,因为每次只使用一个样本更新参数,使得参数更新更加频繁,更新的参数间具有更高的方差,损失函数会朝不同的方向有较大的波动,这有助于发现新的极值点,避免优化器陷入一个局部极值点。但是也由于这种频繁的震荡,出现了一种折中的方法,即小批量(mini-batch)梯度下降法,每次只取训练集中一个batch的样本进行梯度的计算与参数更新,一般batch的大小为4的倍数。原始SGD的更新法则如下: θ = θ η θ J ( θ ) (1) 传统的SGD在训练的过程中主要存在以下几个问题: