这一周的主题是优化算法。

1.  Mini-batch:

  上一门课讨论的向量化的目的是去掉for循环加速优化计算,X = [x(1) x(2) x(3) ... x(m)],X的每一个列向量x(i)是一个样本,m是样本个数。但当样本很多时(比如m=500万),向量化依然不能解决问题。所以提出了mini-batch的概念(Batch是指对整个样本都操作,mini-batch指只对所有样本的子集进行操作)。把若干样本合并成一个mini-batch,比如这里选择1000,X{1} = [x(1) x(2) ... x(1000)],X{2} = [x(1001) x(1002) ... x(2000)],等等。则我们一共有5000个mini-batch,此时 X = [X{1} X{2} ... X{5000}]。同样的,把输出Y也做这样的操作,得到 Y = [Y{1} Y{2} ... Y{5000}] 。

  Notation:x(i)表示第i个样本,z[l]表示第l层的z值,X{t}表示第t个mini-batch。

  具体算法:

  1. repeat { #不断重复迭代优化
  2. for t = 1, ..., 5000 { #对于普通的batch处理手段,遍历一次样本更新一次参数。而在mini-batch的方法中,遍历一次样本更新了5000次参数。
  3. Forward prop on X{t} #用向量化的手段依次处理每一个mini-batch
  4. Z[1] = W[1]X{t} + b[1]
  5. A[1] = g[1](Z[1])
  6. .
  7. .
  8. .
  9. A[l] = g[l](Z[l])
  10. Compute cost J = 1/1000*(∑L(y_hat(i), y(i)))+ 正则化项
  11. Back prop to compute gradients with respect to J{t} (using X{t}, Y{t})
  12. W[l] = W[l] - αdW[l], b[l] = b[l] - αdb[l]
  13. }
  14. } 

  对于batch处理方式来说,cost function J随着优化的进行是越来越小的,单调递减。而对于mini-batch的处理方式来说,则是震荡着下降,或者说下降的曲线夹杂了噪音。

  一个超参数是mini-batch的大小,size。如果size = m,则意味着就是batch gradient descent,用整个数据集训练。如果size = 1,则是stochastic gradient descent,每个样本都是独立的mini-batch。前者的问题是每次迭代的计算太费时,后者的问题是随机性太严重,效率过于低下,失去了向量化带来的加速计算效果。mini-batch的大小介于两者之间,能获得平衡的效果,一方面有向量化的加速效果,另一方面又不需要计算全部样本。关于mini-batch的大小,NG的建议:1)如果小数据集(少于2000),直接使用batch方法;2)一般的mini-batch大小是64~512,考虑到CPU/GPU的内存存储方式,2的幂的大小算得更快。不用担心mini-batch的大小不能整除样本数的问题,最后一个样本就少一点没事。也有人用1024,但不常见。这是一个超参数,所以NG建议多尝试几个不同的2的幂,找个最好的。mini-batch越大,减少了噪音,也减少了正则化效果。

  1. def random_mini_batches(X, Y, mini_batch_size = 64, seed = 0):
  2. """
  3. Creates a list of random minibatches from (X, Y)
  4.  
  5. Arguments:
  6. X -- input data, of shape (input size, number of examples)
  7. Y -- true "label" vector (1 for blue dot / 0 for red dot), of shape (1, number of examples)
  8. mini_batch_size -- size of the mini-batches, integer
  9.  
  10. Returns:
  11. mini_batches -- list of synchronous (mini_batch_X, mini_batch_Y)
  12. """
  13.  
  14. np.random.seed(seed) # To make your "random" minibatches the same as ours
  15. m = X.shape[1] # number of training examples
  16. mini_batches = []
  17.  
  18. # Step 1: Shuffle (X, Y)
  19. permutation = list(np.random.permutation(m))
  20. shuffled_X = X[:, permutation]
  21. shuffled_Y = Y[:, permutation].reshape((1,m))
  22.  
  23. # Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case.
  24. num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionning
  25. for k in range(0, num_complete_minibatches):
  26. mini_batch_X = shuffled_X[:, k*mini_batch_size : (k+1)*mini_batch_size]
  27. mini_batch_Y = shuffled_Y[:, k*mini_batch_size : (k+1)*mini_batch_size]
  28. mini_batch = (mini_batch_X, mini_batch_Y)
  29. mini_batches.append(mini_batch)
  30.  
  31. # Handling the end case (last mini-batch < mini_batch_size)
  32. if m % mini_batch_size != 0:
  33. mini_batch_X = shuffled_X[:, (k+1)*mini_batch_size : m-1]
  34. mini_batch_Y = shuffled_Y[:, (k+1)*mini_batch_size : m-1]
  35. mini_batch = (mini_batch_X, mini_batch_Y)
  36. mini_batches.append(mini_batch)
  37.  
  38. return mini_batches

  

2. 指数加权平均(指数加权移动平均):

  vt = βvt-1 + (1-β)θt 。这个公式可以看成 v近似等于 1/(1-β) 个数据的平均值,比如β = 0.9,则近似可以看成是10个数据的平均值。展开来看,vt = (1-β)*θt  + (1-β)*β*θt-1  + (1-β)*β2t  + ...(1-β)*βnt ,权重指数衰减。(为什么近似等于1/(1-β) 个数据的平均值?NG解释说,如果β接近1,β1/(1-β)≈1/e=0.37,0.37的权重已经很小了,所以说近似等于 1/(1-β) 个数据的平均值。)

  指数加权平均的一大好处是可以迭代计算,占内存很小。相比之下,如果记录过去n个数值,然后算平均数,显然耗内存很多。

  偏差矫正:偏差产生的原因是头部缺数据,造成求得的指数加权平均比较小。偏差矫正的公式是 v/ (1 - βt),注意这里是计算完vt后矫正,而不是在迭代过程中实时矫正。直观地说,如果β大,比如0.98,则需要平均更多的数据,于是1 - βt更小,从而把 v放大。

3. Momentum (Gradient descent with momentum)

  这种方法几乎总是比标准的梯度下降快。基本想法是:用梯度的指数加权平均数来更新权重。如果优化的问题有大的condition number,则优化过程中,会在一个方向剧烈震荡。这导致我们只能选用小的学习率,降低了优化的速度。如果学习率大,很容易就发散了。我们希望的是在震荡的方向上迭代步长小一点,而在没有震荡的方向上迭代步长大一点。指数加权平均的做法在震荡方向上把数据正负抵消了,所以得到很小的数,而在没有震荡的方向上则持续增加。物理的直观解释是想象一个小球从碗的边沿滚下去,梯度是它的加速度,momentum是它的速度,β是和摩擦力相关的量。相比于标准的梯度下降,当前迭代只与当前梯度相关,而momentum的方法把当前迭代和过往梯度也联系起来。

  具体算法:

  vdW = 0, vdb = 0

  对于每一步的迭代:

    计算当前mini-batch的梯度dW, db。

    vdW = βvdW + (1-β)dW  # NG解释说也有的教材写成 vdW = βvdW + dW,他自己不喜欢这种,因为更难调参数,调β的时候,会再需要调α。

    vdb = βvdb + (1-β)db

    W = W - αvdW, b = b- αvdb

  α和β是超参数,不过经验上看β取0.9是非常不错的。一般人们不用偏差矫正,因为通过初始阶段后就无偏了。

4. RMSprop(Root mean square prop): NG说这个方法最开始是Geoffrey Hinton在coursera的课上提出来的。

  具体算法:

  SdW = 0, Sdb = 0

  对于每一步的迭代:

    计算当前mini-batch的梯度dW, db。

    SdW = βSdW + (1-β)dW2   # dW2是把向量的每个元素各自平方。

    Sdb = βvdb + (1-β)db2

    W = W - αdW/(sqrt(SdW)+ε), b = b- αdb/(sqrt(Sdb)+ε) # 分母加上ε为了防止除以0的情况,ε可以随便设一个很小的数,比如e-8

  直观地解释:对于震荡的优化方向,S值会比较大,从而更新参数时步长会比较小,从而消除震荡。

5. Adam(Adaptive moment estimation):将Momentum和RMSprop结合起来。

  具体算法: 

  vdW = 0,SdW = 0 vdb = 0,Sdb = 0

  对于每一步的迭代:

    计算当前mini-batch的梯度dW, db。

    vdW = β1vdW + (1-β1)dW,vdb = β1vdb + (1-β1)db  # β1对应Momentum。

    SdW = β2SdW + (1-β2)dW2 , Sdb = β2vdb + (1-β2)db2  # β2对应RMSprop。

    vdW_corrected = vdW / (1 - β1t),vdb_corrected = vdb / (1 - β1t),

    SdW_corrected = SdW / (1 - β2t),Sdb_corrected = Sdb / (1 - β2t),

    W = W - αvdW_corrected / (sqrt(SdW_corrected)+ε), b = b - αvdb_corrected / (sqrt(Sdb_corrected)+ε)

  超参数:α需要调试,β1可以设为0.9,β2可以设为0.999,ε可以设为e-8。一般大家都只调α,另外几个就按照默认值。

  Adam非常非常牛逼,默认选项。

6. 学习率衰减(Learning rate decay):

  1 epoch的意思是遍历一次数据集。

  一种典型的decay方法:α = α0 / (1+decay_rate*epoch_num),decay_rate是另一个需要调的超参数。

  其他decay方法:α = 0.95epoch_numα0;α = k*α/ sqrt(epoch_num);α = k*α/ sqrt(t),t是迭代次数;还有分段离散衰减的。

  NG说学习率衰减并不是他优先考虑的东西,他优先还是选一个好一些的固定的α。

7. 深度学习中的局部最优:

  传统的理解中,局部最优是要避免的。但是在深度学习优化的问题里(比如有2万个参数,或者说在2万维的空间),梯度为0的点往往并不是局部最优,而是鞍点。NG说:我们对低纬度空间的大部分直觉不能应用到高纬度空间中。所以深度学习的优化中,并不担心陷入局部最优,而是担心在平稳段(导数在很大的区域都接近0)优化变慢。Momentum、RMSprop、Adam等算法可以加速对平稳段的优化。

 

deeplearning.ai 改善深层神经网络 week2 优化算法 听课笔记的更多相关文章

  1. deeplearning.ai 改善深层神经网络 week2 优化算法

    这一周的主题是优化算法. 1.  Mini-batch: 上一门课讨论的向量化的目的是去掉for循环加速优化计算,X = [x(1) x(2) x(3) ... x(m)],X的每一个列向量x(i)是 ...

  2. 改善深层神经网络_优化算法_mini-batch梯度下降、指数加权平均、动量梯度下降、RMSprop、Adam优化、学习率衰减

    1.mini-batch梯度下降 在前面学习向量化时,知道了可以将训练样本横向堆叠,形成一个输入矩阵和对应的输出矩阵: 当数据量不是太大时,这样做当然会充分利用向量化的优点,一次训练中就可以将所有训练 ...

  3. Coursera Deep Learning笔记 改善深层神经网络:优化算法

    笔记:Andrew Ng's Deeping Learning视频 摘抄:https://xienaoban.github.io/posts/58457.html 本章介绍了优化算法,让神经网络运行的 ...

  4. [DeeplearningAI笔记]改善深层神经网络_优化算法2.6_2.9Momentum/RMSprop/Adam优化算法

    Optimization Algorithms优化算法 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.6 动量梯度下降法(Momentum) 另一种成本函数优化算法,优化速度一般快于标准 ...

  5. [DeeplearningAI笔记]改善深层神经网络_优化算法2.3_2.5_带修正偏差的指数加权平均

    Optimization Algorithms优化算法 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.3 指数加权平均 举个例子,对于图中英国的温度数据计算移动平均值或者说是移动平均值( ...

  6. deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch正则化和程序框架 听课笔记

    这一周的主体是调参. 1. 超参数:No. 1最重要,No. 2其次,No. 3其次次. No. 1学习率α:最重要的参数.在log取值空间随机采样.例如取值范围是[0.001, 1],r = -4* ...

  7. deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面 听课笔记

    1. 应用机器学习是高度依赖迭代尝试的,不要指望一蹴而就,必须不断调参数看结果,根据结果再继续调参数. 2. 数据集分成训练集(training set).验证集(validation/develop ...

  8. deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch Normalization和程序框架

    这一周的主体是调参. 1. 超参数:No. 1最重要,No. 2其次,No. 3其次次. No. 1学习率α:最重要的参数.在log取值空间随机采样.例如取值范围是[0.001, 1],r = -4* ...

  9. deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面

    1. 应用机器学习是高度依赖迭代尝试的,不要指望一蹴而就,必须不断调参数看结果,根据结果再继续调参数. 2. 数据集分成训练集(training set).验证集(validation/develop ...

随机推荐

  1. 《金领简历:敲开苹果、微软、谷歌的大门》【PDF】下载

    <金领简历:敲开苹果.微软.谷歌的大门>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196331 内容简介 <金领简历:敲开 ...

  2. 《Netty5.0架构剖析和源码解读》【PDF】下载

    <Netty5.0架构剖析和源码解读>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062545 内容简介 Netty 是个异步的 ...

  3. Bat脚本命令说明

    命名参考 使用方式如果不知道如何使用就到cmd窗口键入help 命名名 例如:"help del" 命令名 注释 ASSOC 显示或修改文件扩展名关联. ATTRIB 显示或更改文 ...

  4. TCP/IP----基本知识

    就以这篇文章为起点,开始自己的学习计算机网络之路.这些仅是我个人之言,如有差错,希望读者能够逐一指出,在下不胜感激. 首先,我们需要知道一些关于网络的基本知识. 网络中的关系大多为拓扑结构.那么,何为 ...

  5. Android 开发,你遇上 Emoji 头疼吗?

    在 Android 中,如果需要使用的到 Emoji 表情,你会发现在某些设备上,有一些 Emoji 表情会被以豆腐块 "☐" 的形式显示,这是因为当前设备并不支持这个 Emoji ...

  6. android操作系统在itop4412开发板上的烧写

    ITOP4412启动模式: 1.EMMC启动模式:拨码开关1-3为011 2.SD卡启动模式:拨码开关1-3为100uboot:初始化内存控制器,访问存储器,把操作系统内核从存储器读取出来放到内存中, ...

  7. js知识点记录

    1.for...in:用于遍历数组或对象的属性. for(var prop in obj){console.log(obj[prop])}; 该循环遍历对于对象属性是无序的,可能是因为obj本来就是无 ...

  8. Android 7.1 ActivityManagerService 屏幕旋转流程分析 (四)

    四.Activity的更新(旋转) sendNewConfiguration()会调用到ActivityManagerService的updateConfiguration()来update Conf ...

  9. Node.js 蚕食计划(三)—— Express 启航

    如果看过上一篇<Node.js 蚕食计划>,就会发现手动搭建一个 web 服务器还是比较繁琐 而 express 就是一个可以极大地提高开发效率的 web 开发框架 一.创建项目 在 ex ...

  10. Python中的单例模式的几种实现方式的优缺点及优化

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...