第2次课改善深层神经网络:超参数优化、正则化以及优化
来源:互联网 发布:mac模拟人生2中文 编辑:程序博客网 时间:2024/06/01 08:20
1. 调试处理
超参数重要性排序
- 学习速率(learning rate)
α - 动量权重
β=0.9 ,隐藏层节点数,mini-batch size - 层数,learning rate decay
- Adam优化算法的参数
β1=0.9, β2=0.999, ϵ=10−8 一般不改
调参方法
- 网格搜索,使用参数较少的情况
随机选择,该方法较优,原因是对于一个具体问题,不清楚哪个参数比较重要,而网格搜索是各个参数地位是平等的
- 先确定一个大致的参数区间,然后再细致搜索
2. 为超参数选择合适的范围
一个例子 - 隐藏层节点数nx 和层数L
- 隐藏层节点数,随机选择50-100个
- 层数,可以随机选择2-4,也可以网格搜索
另一个例子 - 学习速率α
- 问题:选择一个可能下界0.0001和一个上界1,在[0.0001,1]中随机取点,由于尺寸不对称,小的数字被取到的概率小
- 解决方法:把区间划分成4个部分,[0.0001,0.001], [0.001,0.01], [0.01,0.1], [0.1,1],然后在4个区间内随机取点,也就是对其取对数
- 示例代码:
python
r = -4*np.random.rand()
alpha = 10**r
最后一个例子 - 动量权重β
- 问题:和学习速率一样,[0.9,0.999]之间不能均匀取值
- 解决方法:通过
1−β 到[0.001,0.1],然后用学习速率的方法进行对数取值 - 原因:
11−β 之后,0.9到0.9005不敏感,但是0.999到0.9995很敏感,对结果的影响大,所以需要在接近1的地方密集取值
3. 超参数训练实践 - Pandas vs. Caviar鱼子酱(analogy)
调整参数的方法 - 看计算能力
- Pandas - 计算能力不够的时候,边训练边调整参数
- Caviar - 同时尝试多种参数组合进行模型训练
4. 正则化网络的激活函数
- Batch Norm,对隐藏层节点激活函数输入或者输出进行归一化
Batch Norm
归一化输入可以加快训练速度
Batch Norm是对隐藏层进行归一化操作
有两个版本的Batch Norm:
1. (Default)对节点激活函数的输入
2. 对节点的输出
算法步骤
Given some intermediate values in NN
z(1), ... ,z(m) μ=1m∑iz(i) σ2=1m∑i(zi−μ)2 z(i)norm=z(i)−μσ2+ϵ√ - 分母加上
ϵ 是为了防止分母太小,保证算法稳定性
- 分母加上
z~(i)=γz(i)norm+β - 为了不让隐藏层节点激活函数的输入都是均值为0方差为1,其中
γ,β 都是模型的学习参数,可以用梯度下降或者其他方法来更新这两个参数的值,也可以设置成固定值
- 为了不让隐藏层节点激活函数的输入都是均值为0方差为1,其中
- Use
z~(i) to be the input of activate function
如果
γ=σ2+ϵ−−−−−√,β=μ ,那么z(i)=z~(i)
5. 将Batch Nrom拟合进神经网络
一个完整的网络
一个节点
- X通过w和b进行求和得到z
- z通过
γ[1],β[1] 参数和BatchNorm操作得到z~[1] - 用激活函数计算节点的输出
一些注意点
- 参数
β 和上一节中的不是一个参数 γ[l],β[l] 和w,b等价,可以用梯度下降进行更新,也可以用优化方法进行优化加快学习- tf.nn.batch-normalization框架实现,不需要自己手动实现,但是要理解做法
- 因为归一化要减去均值,所以偏置b就没有用了,删掉,
β 有相似的作用 γ[l],β[l] 的维度是(n[l] , 1)
6. Batch Norm为什么奏效
通过归一化操作,把尺度不一的输入限定在相同的量纲下,从而加快学习速度
Covariate shift
- 定义:已经学习了x到y的映射,如果x的分布改变了,需要重新训练学习算法。
对于一个多层的神经网络,把第二层的输出当作输入,有一个
Batch Norm和regularization正则化
使用mini-batch,在每个mini-batch上计算均值方差进行归一化。会给隐藏层的激活函数带来噪声,产生类似于dropout的效果。因为添加的噪声很小,只有轻微的正则化效果
和dropout一起使用获得更好的正则化效果,mini-batch size越大,正则化效果越弱,Batch Norm的正则化效果只是小的副作用,不是其主要功能。
7. 测试时的Batch Norm
训练的做法
分别对每个mini-batch进行归一化处理
测试的做法
测试的时候需要对样本逐个处理样本
使用指数加权平均来估计均值和方差,也可以使用其他方法
X{1}−>μ{1}[l] X{2}−>μ{2}[l] X{3}−>μ{3}[l] μ{1}[l],μ{2}[l],μ{3}[l]−>μ
对于
8. Softmax回归
- logistic回归的一般形式,用于多分类问题
问题描述
给定一个图像,判断是猫还是狗还是鸟还是其他,总共个有4类,C=4
网络描述
第L层有4个节点,分别代表P(cat|X), P(dog|X), P(bird|X), P(other|X),和为1
L层的Activation function:
a[L]=ez[L]∑Cj=1ez[L]j - 先计算
ez ,然后归一化
- 先计算
输入一个向量,输出一个同样大小的向量
9. 训练一个Sofrmax分类器
和hard max相反,hard max是输出0,1,其中输入最大的是1,其他都是0
损失函数和成本函数
y = [0,1,0,0]
神经网络是使损失函数最小,134项都为0,也就是使
- 成本函数
J(w[1],b[1]...)=1m∑i=1ml(y^(i),y(i))
在程序中输出是水平放的矩阵
Softmax的反向传播
梯度
10. 深度学习框架
框架列表
Caffe/Caffe2, CNTK, DL4J, Keras, Lasagne, mxnet, PaddlePaddle, Tensorflow, Theano, Torch
选择依据
- 开发应用变成的难易程度
- 运行速度
- 是否开源以及是否有好的开源管理
11. Tensorflow
优化目标:
J(w)=w2−10w+25 代码
导包
import numpy as npimport tensorflow as tf
一些设置
# 把w初始化为0,w是TensorFlow变量w = tf.Variable(0, dtype=tf.float32)# 定义损失函数# cost = tf.add(tf.add(w**2, tf.multiply(-10., w)),25)cost = w**2 - 10*w + 25 # 重载了简单的运算,比如平方乘法加减# 定义train为学习算法,用梯度下降法是损失函数最小化train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # learning_rate=0.01
惯用写法,初始化
init = tf.global_varibales_initializer()session = tf.Session()session.run(init) # 初始化全局变量print(session.run()) # 让Tensorflow评估一个变量
- 也可以用下面的写法
with tf.session as session: session.run(init) print(session.run())
- 也可以用下面的写法
运行梯度下降法
# 运行一步梯度下降seesion.run(train)print(session.run(w)) # 评估一下w的值,输出它# 运行1000次梯度下降for i in range(1000): session.run(train)print(session.rumn(w))
有数据集的情况
coefficients = np.array([1.], [10.], [25.])# 把w初始化为0,w是TensorFlow变量w = tf.Variable(0, dtype=tf.float32)# 训练集,这个例子中只有x,定义为(3,1)的数组x = tf.placeholder(tf.float32, [3,1])# 定义损失函数cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]# 定义train为学习算法,用梯度下降法优化算法使损失函数最小化,也可以使用AdamOptimizertrain = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # learning_rate=0.01init = tf.global_varibales_initializer()session = tf.Session()session.run(init) # 初始化全局变量print(session.run()) # 让Tensorflow评估一个变量# 运行一步梯度下降seesion.run(train, feed_dict={x:coefficients})print(session.run(w)) # 评估一下w的值,输出它# 运行1000次梯度下降for i in range(1000): session.run(train, feed_dict={x:coefficients})print(session.rumn(w))
- cost function
python
cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]
graph LRx00-->l1((*))w1[w]-->w*ww*w-->l1x10-->l2((*))w2[w]-->l2l1-->l3((+))x20-->l3l2-->l3l3-->cost
- 定义了前向传播,框架会自动进行反向传播
课程地址
http://mooc.study.163.com/course/deeplearning_ai-2001281003?tid=2001391036#/info
- 第2次课改善深层神经网络:超参数优化、正则化以及优化
- 第2次课改善深层神经网络:超参数优化、正则化以及优化
- 2, 改善深层神经网络:超参数调试、正则化以及优化
- 改善深层神经网络:超参数调试、正则化以及优化——优化算法(2-2)
- DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week1深度学习的实用层面
- 改善深度神经网络:超参数调试、正则化以及优化——深度学习的实践方面(2-1)
- 改善深度神经网络:超参数调试、正则化以及优化(理论)——超参数调试、Batch正则化和程序框架(2-3)
- 改善深层神经网络:超参数调节(第一周)笔记
- DeepLearing学习笔记-改善深层神经网络(第三周- 超参数调试、正则化)
- Coursea吴恩达《优化深度神经网络》课程笔记(3)超参数调试、正则化以及优化
- DeepLearing学习笔记-改善深层神经网络(第一周作业-2-正则化)
- [DeeplearningAI笔记]改善深层神经网络_优化算法2.1_2.2_mini-batch梯度下降法
- [DeeplearningAI笔记]改善深层神经网络_优化算法2.6_2.9Momentum/RMSprop/Adam优化算法
- 吴恩达 改善深层神经网络 第一周
- 改善深层神经网络第一周-Initialization
- 改善深层神经网络第一周-Regularization
- 改善深层神经网络第一周-Gradient Checking
- Coursera吴恩达《优化深度神经网络》课程笔记(3)-- 超参数调试、Batch正则化和编程框架
- 梁胜博士亲解Rancher 2.0:K8s之上的Rancher魔法
- Andriod全盘扫描指定文件并动态显示到列表上
- Apache FTPServer本地部署FTP服务
- ububtu 16.04 一些配置
- sql优化:Exists、IN的取舍
- 第2次课改善深层神经网络:超参数优化、正则化以及优化
- 删除文件夹下的所有文件
- 面向对象设计-----属性类型 读取属性特性
- win32 dll中使用cstring
- 乐视云 API
- OpenBLAS项目与矩阵乘法优化 | AI 研习社
- js/jQuery的小方法
- 浅谈中文域名
- 直播+风口来临,首富之子悄然布局,又将成就一大批千万富翁!