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

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

 

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。

  具体算法:

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

  对于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越大,减少了噪音,也减少了正则化效果。

 

def random_mini_batches(X, Y, mini_batch_size = 64, seed = 0):"""Creates a list of random minibatches from (X, Y)Arguments:X -- input data, of shape (input size, number of examples)Y -- true "label" vector (1 for blue dot / 0 for red dot), of shape (1, number of examples)mini_batch_size -- size of the mini-batches, integerReturns:mini_batches -- list of synchronous (mini_batch_X, mini_batch_Y)"""np.random.seed(seed)            # To make your "random" minibatches the same as oursm = X.shape[1]                  # number of training examplesmini_batches = []# Step 1: Shuffle (X, Y)permutation = list(np.random.permutation(m))shuffled_X = X[:, permutation]shuffled_Y = Y[:, permutation].reshape((1,m))# Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case.num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionningfor k in range(0, num_complete_minibatches):mini_batch_X = shuffled_X[:, k*mini_batch_size : (k+1)*mini_batch_size]mini_batch_Y = shuffled_Y[:, k*mini_batch_size : (k+1)*mini_batch_size]mini_batch = (mini_batch_X, mini_batch_Y)mini_batches.append(mini_batch)# Handling the end case (last mini-batch < mini_batch_size)if m % mini_batch_size != 0:mini_batch_X = shuffled_X[:, (k+1)*mini_batch_size : m-1]mini_batch_Y = shuffled_Y[:, (k+1)*mini_batch_size : m-1]mini_batch = (mini_batch_X, mini_batch_Y)mini_batches.append(mini_batch)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等算法可以加速对平稳段的优化。

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/zonghaochen/p/7791763.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gcc汇编汇编语言_什么是汇编语言?

gcc汇编汇编语言Assembly Language is the interface between higher level languages (C, Java, etc) and machine code (binary). For a compiled language, the compiler transforms higher level code into assembly language code.汇编语言是高级语言(C &#xff0c;Java等…

铺装s路画法_数据管道的铺装之路

铺装s路画法Data is a key bet for Intuit as we invest heavily in new customer experiences: a platform to connect experts anywhere in the world with customers and small business owners, a platform that connects to thousands of institutions and aggregates fin…

leetcode421. 数组中两个数的最大异或值(贪心算法)

给你一个整数数组 nums &#xff0c;返回 nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 。 进阶&#xff1a;你可以在 O(n) 的时间解决这个问题吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;nums [3,10,5,25,2,8] 输出&#xff1a;28 解…

IBM推全球首个5纳米芯片:计划2020年量产

IBM日前宣布&#xff0c;该公司已取得技术突破&#xff0c;利用5纳米技术制造出密度更大的芯片。这种芯片可以将300亿个5纳米开关电路集成在指甲盖大小的芯片上。 IBM推全球首个5纳米芯片 IBM表示&#xff0c;此次使用了一种新型晶体管&#xff0c;即堆叠硅纳米板&#xff0c;将…

drop sql语句_用于从表中删除数据SQL Drop View语句

drop sql语句介绍 (Introduction) This guide covers the SQL statement for dropping (deleting) one or more view objects.本指南介绍了用于删除(删除)一个或多个视图对象SQL语句。 A View is an object that presents data from one or more tables.视图是显示来自一个或多…

async 和 await的前世今生 (转载)

async 和 await 出现在C# 5.0之后&#xff0c;给并行编程带来了不少的方便&#xff0c;特别是当在MVC中的Action也变成async之后&#xff0c;有点开始什么都是async的味道了。但是这也给我们编程埋下了一些隐患&#xff0c;有时候可能会产生一些我们自己都不知道怎么产生的Bug&…

项目案例:qq数据库管理_2小时元项目:项目管理您的数据科学学习

项目案例:qq数据库管理Many of us are struggling to prioritize our learning as a working professional or aspiring data scientist. We’re told that we need to learn so many things that at times it can be overwhelming. Recently, I’ve felt like there could be …

react 示例_2020年的React Cheatsheet(+真实示例)

react 示例Ive put together for you an entire visual cheatsheet of all of the concepts and skills you need to master React in 2020.我为您汇总了2020年掌握React所需的所有概念和技能的完整视觉摘要。 But dont let the label cheatsheet fool you. This is more than…

leetcode 993. 二叉树的堂兄弟节点

在二叉树中&#xff0c;根节点位于深度 0 处&#xff0c;每个深度为 k 的节点的子节点位于深度 k1 处。 如果二叉树的两个节点深度相同&#xff0c;但 父节点不同 &#xff0c;则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root &#xff0c;以及树中两个…

Java之Set集合的怪

工作中可能用Set比较少&#xff0c;但是如果用的时候&#xff0c;出的一些问题很让人摸不着头脑&#xff0c;然后我就看了一下Set的底层实现&#xff0c;大吃一惊。 ###看一个问题 Map map new HashMap();map.put(1,"a");map.put(12,"ab");map.put(123,&q…

为mysql数据库建立索引

前些时候&#xff0c;一位颇高级的程序员居然问我什么叫做索引&#xff0c;令我感到十分的惊奇&#xff0c;我想这绝不会是沧海一粟&#xff0c;因为有成千上万的开发者&#xff08;可能大部分是使用MySQL的&#xff09;都没有受过有关数据库的正规培训&#xff0c;尽管他们都为…

查询数据库中有多少个数据表_您的数据中有多少汁?

查询数据库中有多少个数据表97%. That’s the percentage of data that sits unused by organizations according to Gartner, making up so-called “dark data”.97 &#xff05;。 根据Gartner的说法&#xff0c;这就是组织未使用的数据百分比&#xff0c;即所谓的“ 暗数据…

记录一个Python鼠标自动模块用法和selenium加载网页插件的设置

写爬虫&#xff0c;或者网页自动化&#xff0c;让程序自动完成一些重复性的枯燥的网页操作&#xff0c;是最常见的需求。能够解放双手&#xff0c;空出时间看看手机&#xff0c;或者学习别的东西&#xff0c;甚至还能帮朋友亲戚减轻工作量。 然而&#xff0c;网页自动化代码编写…

和css3实例教程_最好CSS和CSS3教程

和css3实例教程级联样式表(CSS) (Cascading Style Sheets (CSS)) CSS is an acronym for Cascading Style Sheets. It was first invented in 1996, and is now a standard feature of all major web browsers.CSS是层叠样式表的缩写。 它于1996年首次发明&#xff0c;现在已成…

leetcode 1442. 形成两个异或相等数组的三元组数目(位运算)

给你一个整数数组 arr 。 现需要从数组中取三个下标 i、j 和 k &#xff0c;其中 (0 < i < j < k < arr.length) 。 a 和 b 定义如下&#xff1a; a arr[i] ^ arr[i 1] ^ … ^ arr[j - 1] b arr[j] ^ arr[j 1] ^ … ^ arr[k] 注意&#xff1a;^ 表示 按位异…

数据科学与大数据技术的案例_作为数据科学家解决问题的案例研究

数据科学与大数据技术的案例There are two myths about how data scientists solve problems: one is that the problem naturally exists, hence the challenge for a data scientist is to use an algorithm and put it into production. Another myth considers data scient…

AJAX, callback,promise and generator

AJAX with jQuery $.ajax({url:??,type:??,data:??,success: function(){??} //callback,error:function(jqXHR,textStatus,error){??} })think about what AJAX wants from human , AJAX asks questions : tell Me By Which Way You Want To Do Things : —— GET …

Spring-Boot + AOP实现多数据源动态切换

2019独角兽企业重金招聘Python工程师标准>>> 最近在做保证金余额查询优化&#xff0c;在项目启动时候需要把余额全量加载到本地缓存&#xff0c;因为需要全量查询所有骑手的保证金余额&#xff0c;为了不影响主数据库的性能&#xff0c;考虑把这个查询走从库。所以涉…

css 幻灯片_如何使用HTML,CSS和JavaScript创建幻灯片

css 幻灯片A web slideshow is a sequence of images or text that consists of showing one element of the sequence in a certain time interval.网络幻灯片是一系列图像或文本&#xff0c;包括在一定时间间隔内显示序列中的一个元素。 For this tutorial you can create a…

leetcode 1738. 找出第 K 大的异或坐标值

本文正在参加「Java主题月 - Java 刷题打卡」&#xff0c;详情查看 活动链接 题目 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j < b < n 的元素…