• 梯度下降


    梯度下降算法

    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)
      
  • 相关阅读:
    python学习手册笔记——14.迭代器和解析
    安装完Pydev却无法创建Python工程
    Android自动化学习笔记之Robotium:学习官网实例
    Android自动化学习笔记:获取APK包名的几种方法
    Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
    Android自动化学习笔记之MonkeyRunner:MonkeyRunner的录制和回放
    Android自学笔记:Git下载源代码
    Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例
    Android自动化学习笔记之MonkeyRunner:用Eclipse执行MonkeyRunner脚本
    Android自动化学习笔记之MonkeyRunner:MonkeyRunner环境搭建
  • 原文地址:https://www.cnblogs.com/Dean0731/p/12044007.html
Copyright © 2020-2023  润新知