类神经网络优化技巧(李宏毅老师系列)

自学参考:
视频课
课件+资料
笔记

一、General Guidance

1.训练过程

在这里插入图片描述

(1)写出一个有未知参数θ的函式(函数)function
(2)确定损失函数loss,来判断函式的参数θ的好坏
(3)优化optimization,得到使得loss最小的参数θ*

2.如何得到好的model

在这里插入图片描述

  • 分析训练数据上损失loss on training data
    • loss on training data过大
      可能的原因有两种:

      • model bias
        所有的function集合set太小了,没有包含任何一个有效的function,可以让我们的loss变低。类似于,你在努力地大海捞针,但是从一开始就捞错海了。
        解决:重新设计一个model,更复杂的、更有弹性的、有未知参数的、需要更多特征的~类似于,重新选到那个有针的海域做基础先
        在这里插入图片描述
      • optimize
        可能卡在了局部最小值/鞍点local minima的地方,没办法找到一个真正让loss很低的参数。类似于又在大海捞针,确实捞对了有针的海域,但是技术不行捞不到
        在这里插入图片描述
      • 如何区分以上两种原因:
        • start from shallower networks (or other models),which are easier to train
          看到一个之前没做过的问题,可以先跑一些较小的,比较浅的network,甚至用一些不是deep learning的方法,来找到比较容易做optimize,避免optimization失败的问题
        • if deeper networks do not obtain smaller loss on training data, then there is optimization issue
          当发现更深的model反而比浅的model训练损失更大,说明优化有问题。eg:在这里插入图片描述
    • loss on training data较小时,分析测试数据上的损失loss on testing data

      • 训练数据上的损失小,测试数据上的损失大
        可能的两个原因:
        • 过拟合overfitting
          当model的自由度很大时,可能会出现训练数据表现好,而测试数据表现差
          在这里插入图片描述

          • 解决方法:
            • 增加训练集
              既然model的弹性大,也许数据样本多一些就能增加限制
              data augmentation:根据对该问题的理解,从已有的数据中,创造出新的合理的数据
              在这里插入图片描述

            • 增加限制
              在这里插入图片描述

            • less parameters(如神经元的数量) ,sharing parameters模型共用参数

            • early stopping

            • regularization

            • dropout

        • mismatch

二、局部最小值local minima和鞍点saddle point

  • critical point:梯度为0的点
    当loss没法再下降时,可能是因为卡在了critical point上
    • local minima
      可能无路可走
    • saddle point
      旁边还是有路走的

在这里插入图片描述

  • 判断方法:
    • 考察θ附近loss的梯度
    • 泰勒展开
    • 海瑟矩阵H

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 所有特征值eigen value都是正的,H是正定矩阵positive definite,则为local minima
  • 所有eigen value都是负的,H是negative definite,则为local maxima
  • eigen value有正有负,则为saddle point
    例如:
    在这里插入图片描述
    当走到鞍点时,可利用H的特征向量确定参数的更新方向

在这里插入图片描述

  • local minima 比saddle point少得多
    在这里插入图片描述
    Loss在一个维度很高的空间中,往往只会遇到鞍点而几乎不会遇到局部极小值点
    ⇒从上图可以看出,正特征值的数目最多只占所有特征值的60%,这就说明剩余40%-50%的维度都仍然“有路可走”

三、批次batch和动量momentum

batch

  • epoch:所有的batch看过一遍,叫做一个epoch
    在这里插入图片描述

  • shuffle:每个epoch开始前,都重新分配一次batch,则每一次epoch的batch都不一样

  • small batch VS large batch

    • 基本现象
      在这里插入图片描述
      左边的large batch case,必须把所有20个emamples都看完后,参数才能够update一次
      ⇒large batch情况下蓄力时间长,但威力大
      右边的small batch case,只需一个样本数据就能update一次参数,但会比较noisy,故update的方向曲曲折折。
      ⇒small batch情况下冷却时间短,但是较为“不准”
      ⇒其实noisy的gradient反而能够帮助training
      在这里插入图片描述

    • 考虑“并行计算”左边( large BatchSize)并不一定时间比较长
      在这里插入图片描述
      如图示呀,batch size从1到1000所需要的时间几乎是一样的;
      增加到10000乃至增加到60000时,一个batch所耗费的时间才随着batch size的增加而增长地较为显著。
      ⇒分析,有GPU可以做并行运算,则1000个examples所花费时间并非1个example的1000倍;
      GPU平行运算的能力还是有其限度的,当batch size真的很大时,GPU在跑完一个batch计算出gradient所花费的时间,会随着batch size的增加而逐渐增长
      对总时间的影响:在这里插入图片描述
      基于并行运算的加成,实际上当batch size小的时候,跑完一个epoch花费时间要比batch size大的时候多;反之,batch size大的时候,跑完一个epoch花费时间反而较少
      batch size 小的时候,update的次数大大增加

    • 总结①:使用small batchsize时,更新参数时会有noisy⇒有利于训练
      不同的batch求得的loss略有不同,可避免卡在local minima
      在这里插入图片描述

    • 总结②:使用small batchsize可以避免overfitting
      在这里插入图片描述
      一种解释
      在这里插入图片描述
      在一个峡谷里的loca minima是坏的minima;在一个平原上的loca minima是好的minima
      ⇒把training的loss向右平移,对于盆地里的minima而言,在training和testing上的结果不会差太多;对于峡谷里的minima,一差就可能天差地别
      ⇒large batchsize倾向于走到峡谷里,small batchsize倾向于走到盆地里。
      因为small batchsize有很多的loss,每次的update方向都不太一样,若峡谷非常窄,可能一不小心就跳走了;large batchsize按照规定update很可能走到一个小峡谷里。

    • batchsize是一个需要调整的参数,会影响训练速度和优化效果
      在这里插入图片描述

momentum

在这里插入图片描述

  • 一般的梯度下降vanilla gradient descent:只考虑梯度的方向,向反方向移动

vanilla /vəˈnɪlə/
n.香草,香草制品
adj.香草味的;无特色的,普通的;[计算机]原版的

在这里插入图片描述

  • gradient descent + momentum:综合了 梯度+前一步的方向
    在这里插入图片描述
    另一个方向解读,所谓的momentum,update的方向不只考虑了现在的gradient,而是考虑过去所有gradient总和
    在这里插入图片描述

四、自动调整学习率

SGD、Momentum、AdaGrad、RMSProp和Adam的区别
2022吴恩达机器学习Deeplearning.ai 优化方法

  • training stuck ≠ small gradient
    即loss不再下降时,未必说明此时到达critical point,梯度可能还很大
    在这里插入图片描述
  • 鉴于使用“固定的”学习率,即使在“凸面体”的优化,都会让优化的过程非常艰难,故考虑使用“客制化”学习率
    • 较小的学习率:梯度较小时几乎难以移动
    • 较大的学习率:loss在山谷的两端震荡不会下降
      在这里插入图片描述
  • 客制化梯度:不同的参数大小需要不同的学习率
    在这里插入图片描述
    根据参数的当前实际情况,调整 σ i t \sigma^t_i σit的大小,实现对 θ i \theta_i θi的更新。
    • 基本原则
      • 某一个方向上gradient的值很小,非常平坦
        ⇒学习率调大些
      • 某一个方向上非常的陡峭,坡度很大
        ⇒学习率调小些
    • σ \sigma σ的方法:均方根Root Mean Square
      • Adagrad(考虑之前所有的梯度大小)
        把本次和之前计算出的所有梯度 求均方根
        gradient都比较大, σ \sigma σ就比较大,在update时参数update的量就比较小
        缺点:不能“实时”考虑梯度的变化情况
        在这里插入图片描述
        在这里插入图片描述

      • RMSProp(调整“当前步”梯度与“历史”梯度的重要性
        添加参数 α \alpha α,越大说明过去的梯度信息越重要

        • α \alpha α设很小趋近于0,就代表这一步算出的gᵢ相较于之前算出来的gradient而言比较重要
        • α \alpha α设很大趋近于1,就代表这一步算出的gᵢ较不重要,之前算出来的gradient比较重要
          在这里插入图片描述
      • Adam=RMSProp + Momentum(最常用)
        使用Pytorch中预设的参数就能够得到较好的结果
        在这里插入图片描述

  • learning rate scheduling:让learning rate和训练时间有关
    learning rate decay:随着训练参数不断地update,η越来越小
    在这里插入图片描述
  • warm up:让learning rate先变大再变小
    还没有数学上的解释
    σ \sigma σ指示某一个方向它到底有多陡/多平滑,这个统计的结果,要看得够多笔数据以后才精准,所以一开始我们的统计是不精准的。一开始learning rate比较小,是让它探索收集一些有关error surface的情报,在这一阶段使用较小的learning rate,限制参数不会走的离初始的地方太远;等到 σ \sigma σ统计得比较精准以后再让learning rate慢慢爬升。
  • 总结:
    • 使用动量,考虑过去的梯度的大小和方向
    • 引入 σ \sigma σ,考虑到过去的梯度的大小
      在这里插入图片描述


  • batch normalization:把崎岖的山铲平
    在这里插入图片描述

  • 现象:不同的参数发生变化,引起的loss function变化程度不同
    ⇒受“不同维度输入值的差异”的影响
    在这里插入图片描述
    在这里插入图片描述
    x1的值很小时,当参数w1有一个很小的变化,对y的影响很小,从而对loss的影响也较小;反之,x2的值很大时,当参数w2有一个同样大小的变化,对y的影响则大得多,从而对loss的影响较大。
    故不同维度的输入值,大小的scale差距很大,就可能产生在不同方向上,斜率、坡度非常不同的error surface。

  • 解决:feature normalization(给不同的dimension同样的数值范围)

    • 做完normalize以后,这个dimension上的数值就会平均是0,方差variance会是1,则这一排数值的分布会在0的上下
    • 对每一个dimension都做一样的normalization,会发现所有feature不同dimension的数值都在0上下,可能就可以制造一个较好的error surface。
      在这里插入图片描述
  • 在deep learning中,每一层都需要一次normalization
    x ~ \tilde{x} x~经过 W 1 W_1 W1矩阵后, a , z a,z a,z数值的分布各维度仍然有很大的差异,要 train 第二层的参数 W 2 W_2 W2,也会有困难。需要对 a 或者 z a或者z a或者z进行Normalization。

    • 如果你选择的是 Sigmoid,那可能比较推荐对 z 做 Feature Normalization,因Sigmoid 在 0 附近斜率比较大,所以如果你对 z 做 Feature Normalization,把所有的值都挪到 0 附近,算 gradient 的时候,算出来的值会比较大
    • 一般而言, normalization要放在 activation function 之前或之后都是可以的
      在这里插入图片描述

五、损失函数

希望模型输出的y和class编号越接近越好
在这里插入图片描述

  • class间的关系:

    • class间有某种关系
      例如根据身高等数据预测是几年级的小学生,一年级和二年级比较接近,一年级和三年级比较没有关系
    • class间没有特定的关系
      假设错误
  • 独热编码:任何两个分类间的距离都相同
    在这里插入图片描述

  • Classification with softmax
    经过计算后:

    • 输出值范围0~1
    • 输出值的和为1
    • 原本大的值和小的值之间的差距变大
      softmax的输入称为logit
      在这里插入图片描述
      在这里插入图片描述
  • loss of classifcation
    在这里插入图片描述

  • 优化目标:减小 y ^ \hat{y} y^ y ′ y' y之间的差距 e e e
    衡量方法有mse,cross-entropy等
    使用mse时,左上角位置的loss很大但是梯度平坦,难以优化
    使用cross-entorpy更容易收敛
    ⇒改变loss函数也会影响training(数学证明)
    在这里插入图片描述
    在这里插入图片描述

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值