梯度下降

梯度下降算法

  1. 梯度
    1. 函数上某一点的梯度是 向量,就是函数变化增加最快的地方。具体来说,对于函数f(x,y),在点(x0,y0)沿着梯度向量的方向 : (df/dx0,df/dy0)的转置. 可以最快速度到达最大值.
  2. 梯度下降算法
    1. 损失函数: J(w)
    2. w的梯度将是损失函数上升最快的方向,最小化loss ,反向即可 J(w_old) ---->J(w_old- k * ▽w_old的梯度)---->J(w_new)
    3. 方法 : 主要区别是每一次更新样本参数使用的样本个数是不同的
      1. 批量梯度下降
        • 使用全部数据进行参数更新
        • w = w-k * ▽J(w)
        • for i in range(nb_epochs): params_grad = evaluate_gradient(loss_function,data,params) params = params - learning_rate * pramas_grad
        • 每次更新梯度使用全部数据 ,最后梯度可为0
      2. 随机梯度下降
        • w = w - k * ▽ J(w;xi;yi)
        • 使用一个样本更新模型,速度快
        • for i in range(nb_epochs): np.random.shuffle(data) for example in data: params_grad = evalute_gradient(loss_function,example,params) params = params - leaning_rate * params_grad
        • 学习率需要逐渐减少,否则无法收敛
      3. 小批量梯度下降
        • w = w - k * ▽J(w;xi:i+m;yi:i+m) 每次更新从训练集选取m个样本学习 m小于总体个数
        • for i in range(pb_epochs): np.random.shuffle(data) for batch in get_batch(data,batch_size=50): params_grad = evalute_gradient(loss_function,batch,params) params = params - leaning_rate * params_grad
  3. 问题
    1. 合适的学习率很难找
    2. 跟新每次的学习率方式很难,需要设置阈值,跟新学习率,不能自适应数据集的特点
    3. 模型搜友的参数每次跟新都是使用相同的学习率, 对于稀疏数据等效果不好
    4. 对于非凸函数,容易陷入次忧的局部极值中
  4. 优化梯度下降
    1. SGD
    2. Momentum
      • 基于动量的算法
      • 前几次的梯度会参与到本次梯度的计算
        • 原来:w = w - learning_rate * dw
        • 现在: v = alpha * v - learning_rate *dw w = w+v
        • v 是初始速度,alpha是指数衰减系数,也叫作动量参数 常见设置为0.9
        • 理解为 上次梯度与这次相同,那么下次下降速度幅度会加大,从而加速收敛
    3. Nesterov Momentum
      • 先对参数进行估计,然后使用估计后的参数来计算误差
      • 学习率ε 初始参数 θ 初始速率v 栋梁衰减参数 α
      • 过程:
        • 从训练集中随机抽取m个样本,及他们的标签
        • 计算梯度和误差 ,跟新速度v和参数α
    4. AdaGrad
      • 自适应为各个参数分配不同的学习率
    • 需要全局学习率
    • Adadelta
    1. RMSProp
    2. Adam
  5. 学习率的设定

学习率的设定 global_step = tf.Variable(0,trainble=False) starter_learning = 0.1 # 初始学习率为0.1 # 每隔10000次学习率变为原来的0.96 learning_rate = tf.exponential_dacay(starter_learning_rate,\ global_setp,10000,0.96,staircase=True) optimizer = tf.GradientDescent(learning_rate) optimizer.minimize(...my_loss...,global_step=global_setp)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 主题配置

    ?> JavaScript 对象是被命名值的容器。值以名称:值对的方式来书写(名称和值由冒号分隔)。

    Dean0731
  • python-pandas

    Dean0731
  • 在linux运行Tensorflow代码所遇到的问题

    1,OSError: Unable to open file (file locking disabled on this file system (use H...

    Dean0731
  • 各种优化算法详解

    参考链接:https://zhuanlan.zhihu.com/p/25765735

    chenjx85
  • 深度学习: gradient diffusion (梯度弥散)

    梯度下降法(以及相关的L-BFGS算法等)在使用随机初始化权重的深度网络上效果不好的技术原因是:梯度会变得非常小。具体而言,当使用反向传播方法计算导数的时候,随...

    JNingWei
  • 从入门到头秃,2018年机器学习图书TOP10

    导读:无论是2018还是2019,都是属于AI的时代。要想在这个时代里 混口饭吃 改变世界,首先你得玩转机器学习。数据叔整理了2018年出版的机器学习重磅好书,...

    华章科技
  • 学界 | Enlitic创始人Jeremy Howard专访:我眼中的深度学习与数据科学

    提起Jeremy Howard,人工智能和大数据领域的从业者们可谓无人不知无人不晓。 他是Enlitic、FastMail、Optimal Decisions ...

    AI科技评论
  • Python数据处理之导入导出excel数据

    、Python的一大应用就是数据分析了,而数据分析中,经常碰到需要处理Excel数据的情况。这里做一个Python处理Excel数据的总结,基本受用大部分情况。...

    AntDream
  • 截断梯度

    强非线性函数往往倾向于非常大或非常小幅度的梯度。这导致的困难是,当参数梯度非常大时,梯度下降的参数更新可以将参数抛出很远,进入目标函数较大的区域,到达当前解所做...

    于小勇
  • 为什么要学会用python处理脑电数据?

    可以说随着人工智能技术的发展,Python语言也迎来了新的生机。由于Python易上手,语法简洁,工具库多等特点,Python已成为人工智能领域最流行的语言。

    脑机接口社区

扫码关注云+社区

领取腾讯云代金券