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 。这个公式可以看成 vt 近似等于 1/(1-β) 个数据的平均值,比如β = 0.9,则近似可以看成是10个数据的平均值。展开来看,vt = (1-β)*θt + (1-β)*β*θt-1 + (1-β)*β2*θt + ...(1-β)*βn*θt ,权重指数衰减。(为什么近似等于1/(1-β) 个数据的平均值?NG解释说,如果β接近1,β1/(1-β)≈1/e=0.37,0.37的权重已经很小了,所以说近似等于 1/(1-β) 个数据的平均值。)
指数加权平均的一大好处是可以迭代计算,占内存很小。相比之下,如果记录过去n个数值,然后算平均数,显然耗内存很多。
偏差矫正:偏差产生的原因是头部缺数据,造成求得的指数加权平均比较小。偏差矫正的公式是 vt / (1 - βt),注意这里是计算完vt后矫正,而不是在迭代过程中实时矫正。直观地说,如果β大,比如0.98,则需要平均更多的数据,于是1 - βt更小,从而把 vt 放大。
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*α0 / sqrt(epoch_num);α = k*α0 / sqrt(t),t是迭代次数;还有分段离散衰减的。
NG说学习率衰减并不是他优先考虑的东西,他优先还是选一个好一些的固定的α。
7. 深度学习中的局部最优:
传统的理解中,局部最优是要避免的。但是在深度学习优化的问题里(比如有2万个参数,或者说在2万维的空间),梯度为0的点往往并不是局部最优,而是鞍点。NG说:我们对低纬度空间的大部分直觉不能应用到高纬度空间中。所以深度学习的优化中,并不担心陷入局部最优,而是担心在平稳段(导数在很大的区域都接近0)优化变慢。Momentum、RMSprop、Adam等算法可以加速对平稳段的优化。
转载于:https://www.cnblogs.com/zonghaochen/p/7791763.html
deeplearning.ai 改善深层神经网络 week2 优化算法相关推荐
- [DeeplearningAI笔记]改善深层神经网络_优化算法2.1_2.2_mini-batch梯度下降法
觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1 mini-batch gradient descent mini-batch梯度下降法 我们将训练数据组合到一个大的矩阵中 \(X=\b ...
- 深层神经网络与优化算法
深层神经网络与优化算法 为什么使用深层网络 对于人脸识别等应用,神经网络的第一层从原始图片中提取人脸的轮廓和边缘,每个神经元学习到不同边缘的信息:网络的第二层将第一层学得的边缘信息组合起来,形成人脸的 ...
- deeplearning.ai 改善深度神经网络(正则化、优化、mini-batch等)附代码作业答案
一.初始化 1.为什么神经网络的所有参数不能全部初始化为0>? 若w初始化为0 ,很可能导致模型失效,无法收敛.也就是说如果我们初始将所有的w初始化为0,那么进行前向传播时每一层得到的值都是一样 ...
- 吴恩达deeplearning.ai系列课程笔记+编程作业(6)第二课 改善深层神经网络-第二周:优化算法 (Optimization algorithms)
第二门课 改善深层神经网络:超参数调试.正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning, Regularization and ...
- 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法(作业:优化方法)
文章目录 1. 梯度下降 2. mini-Batch 梯度下降 3. 动量 4. Adam 5. 不同优化算法下的模型 5.1 Mini-batch梯度下降 5.2 带动量的Mini-batch梯度下 ...
- 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法
文章目录 1. Mini-batch 梯度下降 2. 理解 mini-batch 梯度下降 3. 指数加权平均数 4. 理解指数加权平均数 5. 指数加权平均的偏差修正 6. 动量Momentum梯度 ...
- 02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架(作业:TensorFlow教程+数字手势预测)
文章目录 1. 探索TensorFlow库 1.1 线性函数 1.2 计算 sigmoid 1.3 计算损失函数 1.4 One_Hot 编码 1.5 用0,1初始化 2. 用TensorFlow建立 ...
- 02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架
文章目录 1. 调试处理 2. 为超参数选择合适的范围 3. 超参数调试的实践 4. 归一化网络的激活函数 5. 将 Batch Norm 拟合进神经网络 6. Batch Norm 为什么奏效 7. ...
- 02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面
文章目录 1. 训练,验证,测试集 2. 偏差,方差 3. 机器学习基础 4. 正则化 5. 为什么正则化预防过拟合 6. dropout(随机失活)正则化 7. 理解 dropout 8. 其他正则 ...
最新文章
- 微软宣布正式开源 Azure IoT Edge 边缘计算服务
- 第十五届智能车竞赛芯片选型浅析
- 对四象限法则的一点思考
- 第三方控件DevExpress的TreeList绑定XML文件
- [汇编语言]实验五:编写,调试具有多个段的程序
- mybatis缓存二级缓存_MyBatis缓存与Apache Ignite的陷阱
- 不知道密码导出oracle数据库,Oracle数据库密码重置、导入导出库命令示例应用
- 推荐一篇关于多租户Multi-Tenant数据架构的文章
- android bitmap大小计算,android 之Bitmap 内存大小计算
- Android小说阅读器案例
- 【Unity3D基础2-2】认识Unity3D引擎
- MySQL Workbench 6.3CE 汉化及使用教程(转载)
- 渗透测试全套教程(从原理到实战)
- MES系统的选择需重点考虑哪些方面?
- 【报告分享】2021潮购人群洞察报告-巨量算数(附下载)
- vs 搭建团队项目服务器,tfs中如何创建团队项目及如何操作团队项目
- 【概率入门(一)】排列组合?我们再来捋一捋
- 华硕 ROG Win11.21H2 x64极速精简优化专业版
- 2021年4月品牌精选海报合集
- 程序员V.S.编程语言:你上“贼船”了吗?
热门文章
- 卡方线性趋势检验_SPSS:趋势卡方检验
- spring的钩子_高级java开发必须掌握的Spring接口——SmartLifecycle
- c语言中的break和continue
- C++多线程快速入门(五)简单线程池设计
- 为什么两层3*3卷积核效果比1层5*5卷积核效果要好?
- 【神经网络八股扩展】:数据增强
- 多叉树的前序遍历_二叉树的非递归遍历的思考
- 不支持对系统目录进行即席更新_「目录」让你的文档结构一目了然
- 2016_shengyang_onsite
- UVA 10588—— Queuing at the doctors