之前在https://blog.csdn.net/fengbingchun/article/details/124766283 介绍过深度学习中的优化算法AdaGrad,这里介绍下深度学习的另一种优化算法Adadelta。论文名字为:《ADADELTA: AN ADAPTIVE LEARNING RATE METHOD》,论文地址:https://arxiv.org/pdf/1212.5701.pdf

      Adadelta一种自适应学习率方法,是AdaGrad的扩展,建立在AdaGrad的基础上,旨在减少其过激的、单调递减的学习率。Adadelta不是积累所有过去的平方梯度,而是将积累的过去梯度的窗口限制为某个固定大小。如下图所示,截图来自:https://arxiv.org/pdf/1609.04747.pdf

     

使用Adadelta,我们甚至不需要设置默认学习率这一超参数,因为它已从更新规则中消除,它使用参数本身的变化率来调整学习率。

      Adadelta可被认为是梯度下降的进一步扩展,它建立在AdaGrad和RMSProp的基础上,并改变了自定义步长的计算(changes the calculation of the custom step size),进而不再需要初始学习率超参数

      Adadelta旨在加速优化过程,例如减少达到最优值所需的迭代次数,或提高优化算法的能力,例如获得更好的最终结果。

      最好将Adadelta理解为AdaGrad和RMSProp算法的扩展。Adadelta是RMSProp的进一步扩展,旨在提高算法的收敛性并消除对手动指定初始学习率的需要。

      与RMSProp一样,Adadelta为每个参数计算平方偏导数的衰减移动平均值。关键区别在于使用delta的衰减平均值或参数变化来计算参数的步长。(The decaying moving average of the squared partial derivative is calculated for each parameter, as with RMSProp. The key difference is in the calculation of the step size for a parameter that uses the decaying average of the delta or change in parameter.)

      以上内容主要参考:https://machinelearningmastery.com

      以下是与AdaGrad不同的代码片段:

      1.在原有枚举类Optimizaiton的基础上新增Adadelta:

enum class Optimization {BGD, // Batch Gradient DescentSGD, // Stochastic Gradient DescentMBGD, // Mini-batch Gradient DescentSGD_Momentum, // SGD with MomentumAdaGrad, // Adaptive GradientRMSProp, // Root Mean Square PropagationAdadelta // an adaptive learning rate method
};

      2.calculate_gradient_descent函数:

void LogisticRegression2::calculate_gradient_descent(int start, int end)
{switch (optim_) {case Optimization::Adadelta: {int len = end - start;std::vector<float> g(feature_length_, 0.), p(feature_length_, 0.);std::vector<float> z(len, 0.), dz(len, 0.);for (int i = start, x = 0; i < end; ++i, ++x) {z[x] = calculate_z(data_->samples[random_shuffle_[i]]);dz[x] = calculate_loss_function_derivative(calculate_activation_function(z[x]), data_->labels[random_shuffle_[i]]);for (int j = 0; j < feature_length_; ++j) {float dw = data_->samples[random_shuffle_[i]][j] * dz[x];g[j] = mu_ * g[j] + (1. - mu_) * (dw * dw); // formula 10float alpha = (eps_ + std::sqrt(p[j])) / (eps_ + std::sqrt(g[j]));float change = alpha * dw;p[j] = mu_ * p[j] +  (1. - mu_) * (change * change); // formula 15w_[j] = w_[j] - change;}b_ -= (eps_ * dz[x]);}}break;case Optimization::RMSProp: {int len = end - start;std::vector<float> g(feature_length_, 0.);std::vector<float> z(len, 0), dz(len, 0);for (int i = start, x = 0; i < end; ++i, ++x) {z[x] = calculate_z(data_->samples[random_shuffle_[i]]);dz[x] = calculate_loss_function_derivative(calculate_activation_function(z[x]), data_->labels[random_shuffle_[i]]);for (int j = 0; j < feature_length_; ++j) {float dw = data_->samples[random_shuffle_[i]][j] * dz[x];g[j] = mu_ * g[j] + (1. - mu_) * (dw * dw); // formula 18w_[j] = w_[j] - alpha_ * dw / (std::sqrt(g[j]) + eps_);}b_ -= (alpha_ * dz[x]);}}break;case Optimization::AdaGrad: {int len = end - start;std::vector<float> g(feature_length_, 0.);std::vector<float> z(len, 0), dz(len, 0);for (int i = start, x = 0; i < end; ++i, ++x) {z[x] = calculate_z(data_->samples[random_shuffle_[i]]);dz[x] = calculate_loss_function_derivative(calculate_activation_function(z[x]), data_->labels[random_shuffle_[i]]);for (int j = 0; j < feature_length_; ++j) {float dw = data_->samples[random_shuffle_[i]][j] * dz[x];g[j] += dw * dw;w_[j] = w_[j] - alpha_ * dw / (std::sqrt(g[j]) + eps_);}b_ -= (alpha_ * dz[x]);}}break;case Optimization::SGD_Momentum: {int len = end - start;std::vector<float> change(feature_length_, 0.);std::vector<float> z(len, 0), dz(len, 0);for (int i = start, x = 0; i < end; ++i, ++x) {z[x] = calculate_z(data_->samples[random_shuffle_[i]]);dz[x] = calculate_loss_function_derivative(calculate_activation_function(z[x]), data_->labels[random_shuffle_[i]]);for (int j = 0; j < feature_length_; ++j) {float new_change = mu_ * change[j] - alpha_ * (data_->samples[random_shuffle_[i]][j] * dz[x]);w_[j] += new_change;change[j] = new_change;}b_ -= (alpha_ * dz[x]);}}break;case Optimization::SGD:case Optimization::MBGD: {int len = end - start;std::vector<float> z(len, 0), dz(len, 0);for (int i = start, x = 0; i < end; ++i, ++x) {z[x] = calculate_z(data_->samples[random_shuffle_[i]]);dz[x] = calculate_loss_function_derivative(calculate_activation_function(z[x]), data_->labels[random_shuffle_[i]]);for (int j = 0; j < feature_length_; ++j) {w_[j] = w_[j] - alpha_ * (data_->samples[random_shuffle_[i]][j] * dz[x]);}b_ -= (alpha_ * dz[x]);}}break;case Optimization::BGD:default: // BGDstd::vector<float> z(m_, 0), dz(m_, 0);float db = 0.;std::vector<float> dw(feature_length_, 0.);for (int i = 0; i < m_; ++i) {z[i] = calculate_z(data_->samples[i]);o_[i] = calculate_activation_function(z[i]);dz[i] = calculate_loss_function_derivative(o_[i], data_->labels[i]);for (int j = 0; j < feature_length_; ++j) {dw[j] += data_->samples[i][j] * dz[i]; // dw(i)+=x(i)(j)*dz(i)}db += dz[i]; // db+=dz(i)}for (int j = 0; j < feature_length_; ++j) {dw[j] /= m_;w_[j] -= alpha_ * dw[j];}b_ -= alpha_*(db/m_);}
}

      执行结果如下图所示:测试函数为test_logistic_regression2_gradient_descent,多次执行每种配置,最终结果都相同。图像集使用MNIST,其中训练图像总共10000张,0和1各5000张,均来自于训练集;预测图像总共1800张,0和1各900张,均来自于测试集。在AdaGrad中设置学习率为0.01,eps为1e-8及其它配置参数相同的情况下,AdaGrad耗时为17秒;在Adadelta中设置eps为1e-3时,Adadelta耗时为26秒;它们的识别率均为100%。

GitHub: https://github.com/fengbingchun/NN_Test

深度学习中的优化算法之Adadelta相关推荐

  1. 深度学习中的优化算法串讲

    Datawhale原创 作者:谢文睿,Datawhale成员 寄语:优化算法是一个超参数,一个优化算法不是适合所有损失函数的,没有哪个优化算法是绝对的好或绝对的坏,是要根据损失函数判断的 本文对深度学 ...

  2. 深度学习中的优化算法之Adam

    之前在https://blog.csdn.net/fengbingchun/article/details/124909910 介绍过深度学习中的优化算法Adadelta,这里介绍下深度学习的另一种优 ...

  3. 深度学习中的优化算法之RMSProp

    之前在https://blog.csdn.net/fengbingchun/article/details/124766283 中介绍过深度学习中的优化算法AdaGrad,这里介绍下深度学习的另一种优 ...

  4. 深度学习中的优化算法与实现

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 GiantPandaCV导语:这篇文章的内容主要是参考 沐神的mxnet/gluon视频中,Aston ...

  5. 深度学习中的优化算法之MBGD

    之前在https://blog.csdn.net/fengbingchun/article/details/75351323 介绍过梯度下降,常见的梯度下降有三种形式:BGD.SGD.MBGD,它们的 ...

  6. 深度学习中的优化算法之BGD

    之前在https://blog.csdn.net/fengbingchun/article/details/75351323 介绍过梯度下降,常见的梯度下降有三种形式:BGD.SGD.MBGD,它们的 ...

  7. 深度学习中的优化算法之NAG

    之前在https://blog.csdn.net/fengbingchun/article/details/124648766 介绍过Momentum SGD,这里介绍下深度学习的另一种优化算法NAG ...

  8. 深度学习中的优化算法之带Momentum的SGD

    之前在https://blog.csdn.net/fengbingchun/article/details/123955067介绍过SGD(Mini-Batch Gradient Descent(MB ...

  9. 深度学习中的优化算法之AdaGrad

          之前在https://blog.csdn.net/fengbingchun/article/details/123955067 介绍过SGD(Mini-Batch Gradient Des ...

  10. 2.2)深度学习笔记:优化算法

    目录 1)Mini-batch gradient descent(重点) 2)Understanding mini-batch gradient descent 3)Exponentially wei ...

最新文章

  1. 应有尽有!这可能是最全的 AI 面试笔记了
  2. SAP S4HANA精华帖集锦
  3. 二元函数泰勒公式例题_考研数一对二元函数的二阶泰勒公式的要求是了解,那我们要了解到什么程度呢?会出那种类型的题呢?...
  4. 『玩具装箱TOY 斜率优化DP』
  5. 挑战练习题2.3动态规划 poj3181 Dollar Dayz 完全背包
  6. 文本文件、Excel文件上传下传
  7. 筒仓计算表格_身份反模式:联邦筒仓和意大利面条身份
  8. iframe带了token不显示_不就是登录吗,能有多复杂?sa-token带你轻松搞定多地登陆、单地登录、同端互斥登录...
  9. Smack 3.3.1 发布,Java 的 XMPP 开发包
  10. atitit.架构设计---方法调用结果使用异常还是返回值
  11. MongoDB游标操作(4)
  12. iZotope Ozone 9 Advanced for Mac(臭氧9高级版)
  13. USB Device Desctiptor 相关
  14. 数据结构与算法-进阶(五)图的实现
  15. 房地产开发项目管理浅析
  16. PC端打不开微信公众号文章、微信图片加载超缓慢的处理方法(最全的解决方法)
  17. 微信小程序实现评论多级展开收起以及点赞功能
  18. 欲取代Android的Firefox OS 的意外复兴
  19. ubuntu 查看opencv以及opencv4版本
  20. 面向95后的营销和增长,你需要知道这些( ゜- ゜)つロ 乾杯

热门文章

  1. Jmeter下载及安装方法
  2. 词法分析器java语言_Java语言词法分析器
  3. 联机侠控制台JAVA_我的世界MultiMc启动器
  4. Javashop开启全新微服务时代
  5. 换头软件测试,抖音女大十八变换脸测试
  6. 十段均衡器开源 android,十段均衡器最美人声(10段均衡器最清晰人声)
  7. 麻瓜python视频教程_Python基础教程|麻瓜编程Python Web开发工程师教程完整版_ - 极光下载站...
  8. 中国十大城市美女(经典套图)
  9. mysql手册03_索引
  10. manjaro linux vmware,Manjaro Linux处理vmware的vmmon、vmnet8、Network configuration is missing一堆问题的记录...