之前在https://blog.csdn.net/fengbingchun/article/details/123955067 介绍过SGD(Mini-Batch Gradient Descent(MBGD),有时提到SGD的时候,其实指的是MBGD)。这里介绍下自适应梯度优化算法。

      AdaGrad:全称Adaptive Gradient,自适应梯度,是梯度下降优化算法的扩展。AdaGrad是一种具有自适应学习率的梯度下降优化方法。它使参数的学习率自适应,对不频繁的参数执行较大的更新,对频繁的参数执行较小的更新(It adapts the learning rate to the parameters, performing larger updates for infrequent and smaller updates for frequent parameters)。因此,它非常适合处理稀疏数据。AdaGrad可大大提高SGD的鲁棒性。如下图所示,截图来自:https://arxiv.org/pdf/1609.04747.pdf

      在SGD中,我们每次迭代对所有参数进行更新,因为每个参数使用相同的学习率。而AdaGrad在每个时间步长(every time step)对每个参数使用不同的学习率。在SGD和MBSD中,对于每个权值(each weight)或者说对于每个参数(each parameter),学习率的值都是相同的。但是在AdaGrad中,每个权值都有不同的学习率。在现实世界的数据集中,一些特征是稀疏的(大部分特征为零,所以它是稀疏的),而另一些则是密集的(dense,大部分特征是非零的),因此为所有权值保持相同的学习率不利于优化。

      AdaGrad的主要优点之一是它消除了手动调整学习率的需要AdaGrad在迭代过程中不断调整学习率,并让目标函数中的每个参数都分别拥有自己的学习率。大多数实现使用学习率默认值为0.01,开始设置一个较大的学习率。

      AdaGrad的主要弱点是它在分母中累积平方梯度:由于每个添加项都是正数,因此在训练过程中累积和不断增长。这反过来又导致学习率不断变小并最终变得无限小,此时算法不再能够获得额外的知识即导致模型不会再次学习。Adadelta算法旨在解决此缺陷。

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

1.在原有枚举类Optimization的基础上新增AdaGrad:

enum class Optimization {BGD, // Batch Gradient DescentSGD, // Stochastic Gradient DescentMBGD, // Mini-batch Gradient DescentSGD_Momentum, // SGD with MomentumAdaGrad // Adaptive Gradient
};

2.为了每次运行与SGD产生的随机初始化权值相同,这里使用std::default_random_engine

template<typename T>
void generator_real_random_number(T* data, int length, T a, T b, bool default_random)
{// 每次产生固定的不同的值std::default_random_engine generator;std::uniform_real_distribution<T> distribution(a, b);for (int i = 0; i < length; ++i)data[i] = distribution(generator);
}

3.为了对数据集每次执行shuffle时结果一致,这里有std::random_shuffle调整为std::shuffle:

//std::srand(unsigned(std::time(0)));
//std::random_shuffle(random_shuffle_.begin(), random_shuffle_.end(), generate_random); // 每次执行后random_shuffle_结果不同
std::default_random_engine generator;
std::shuffle(random_shuffle_.begin(), random_shuffle_.end(), generator); // 每次执行后random_shuffle_结果相同

4.calculate_gradient_descent函数:

void LogisticRegression2::calculate_gradient_descent(int start, int end)
{switch (optim_) {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,多次执行每种配置,最终结果都相同。在它们学习率及其它配置参数相同的情况下,AdaGrad耗时为16秒,而SGD仅为7秒;但AdaGrad的识别率为100%,SGD的识别率为99.89%。

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

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

  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. 手撕深度学习中的优化器

    深度学习中的优化算法采用的原理是梯度下降法,选取适当的初值params,不断迭代,进行目标函数的极小化,直到收敛.由于负梯度方向时使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新params的 ...

最新文章

  1. 第24讲 | 比特币专题(一)历史与货币
  2. linux:apt的源
  3. 听说你想去大厂看学妹,带你看看京东软件产品经理面经
  4. 从零开始学springboot笔记(二)-Spring boot返回json数据(中文无乱码)
  5. C#来创建和读取XML文档 [转]
  6. android 遍历所有view,Android 算法:遍历ViewGroup找出所有子View
  7. 华云数据升级发布“信创云基座“ 用“全芯全栈”支持“信创强国”
  8. 蒂森电梯服务器显示4480,成都电梯豪宅市场分析专题报告.docx
  9. android 菜单隐藏了,隐藏一些导航菜单菜单项 – Android
  10. mysql 主从同步 阻塞_如何解决主从数据库同步延迟问题?
  11. c++删除数组中重复元素_leetcode 数组中重复的数字
  12. 【数学建模】模糊综合评价模型
  13. linux低级格式化工具下载,U盘低格工具(Rmprepusb)
  14. dedecms5.7(织梦)源码解析之程序安装补全篇
  15. 漫步者蓝牙只有一边有声音_为什么我蓝牙耳机只有一边有声音?
  16. Python人工智能基础到实战课程-北方网视频
  17. 一文搞定贷款利息计算
  18. 鞋之语告诉你如何开好一个新式洗鞋店
  19. 进入IT行业-开启头秃之旅
  20. Google Chrome 主题下载站 分享

热门文章

  1. 显卡驱动导致的屏保运行假死
  2. 什么是跨域、为什么要跨域、怎么解决跨域
  3. 分布式文件与分布式存储系统学习总结(持续更新)
  4. MpCmdRun恶意文件下载
  5. (matlab实现)sigmoid函数和tanh函数以及ReLU函数
  6. Python: NumPy中的多维数组ndarray
  7. 这么爆炸的计算机考研,谁还在意国家线?
  8. 电子邮件营销的优缺点有哪些?
  9. Window7 iis設定出錯0x8007000d
  10. 糖尿病的虾青素+胰岛素疗法 (转)