2.3 如何系统调节超参数

1 哪些是超参数

在训练大型模型时,超参数的选择是一件比较复杂的事情。
红色最重要,其次是橙色,再次是紫色
在这里插入图片描述

1.1 超参数选择策略

  1. 在一些时候我们不知道哪个超参数更重要的时候,我们往往随机试验一些超参数的数值,并变化的调节这些超参数的数值,我们就可以发现哪个最重要了,但是我们调节的时候不要使用均匀变换各个超参数的数值,而要在一定范围内随机生成,这样可以更快找到哪个超参数更重要。
  2. 另一个搜索哪个超参数更重要的方法就是从粗糙到精细的策略。比如发现在蓝色框框里的三个点取值有很好的训练效果,那么我们就在该框框里进行进一步搜索。
    在这里插入图片描述

1.2 为超参数选择合适的范围

当我们要在[0.0001, 1]之间寻找合适的学习率α时,我们如果均匀的在[0.0001, 1]区间生成随机数,那么我们花在[0.1, 1]之间的搜索资源高达90%,而花在[0.0001, 0.1]之间的搜索资源只有10%,我们更好的搜索方法是使用log尺度:
在这里插入图片描述
通过代码实现:

r = -4 * np.rando.rand() #随机生成[-4, 0]的随机数
alpha = 10**r

同理,如果我们的超参数β的待试验区间是[0.9, 0.999],我们可以在1-β上进行log尺度划分
在这里插入图片描述
这样可以让我们令花在[0.9, 0.99]和[0.99, 0.999]之间的资源一样多。
这样做的理由是有时候超参数在特定区间的变化值对模型影响很大,比如当β在[0.9000, 0.9005]之间变化时,指数加权平均的基本还是10个历史样本,但是当β在[0.9990, 0.9995]之间变化时,指数加权平均的就是1000个或者2000个历史样本。

1.3 两种不同的超参数搜索流派

1.3.1 边训练边修改参数

这种情况适用于CPU或者GPU资源不充足时的训练情况,第一天训练初始化参数,第一天末觉得不错,就修改一个参数,第二天如果还不错,就继续修改新的参数,直到有一天参数修改后模型变差了,我们就把参数退回到前一天的状态,即每天都更新参数:
在这里插入图片描述

1.3.1 以不同参数同时训练模型

在这里插入图片描述
每个颜色的线代表一组超参数的选择。

2 归一化网络的激活函数

2.1 Batch Normalization

对于logistics回归我们一般对输入特征x进行归一化,令椭圆形的代价函数变成近圆形,加快学习速度:
在这里插入图片描述
对于多层神经网络,每一层都有其对应的输入a[l],我们也要归一化每一层的激活函数z[l],来加快对应层的w和b的训练速度。注意,我们一般归一化z,而不是a。
常规的normalization会令每个隐藏单元的平均值为0,方差为1,但是我们有时候希望隐层单元有不同的分布,所以我们这么做:
在这里插入图片描述
其中γ和β是学习得到的,通过梯度下降算法,和其他参数学习过程一样。其作用是人为的设置z的平均值和方差(令z[i]的均值和方差固定)。
在tensorflow中可以用一行代码实现:

tf.nn.batch-normalization

batch normalization一般和mini-batches一起使用
在这里插入图片描述
X{i}表示一个batch。
值得注意的是我们在对z进行归一化时,所加的常数项b都被平均掉了,其实们在梯度下降时不需要更新参数b,直接将b设置为0就可以:
在这里插入图片描述
梯度下降的参数只有:w、γ和β:
在这里插入图片描述
在这里插入图片描述

2.2 B-N 能够加速训练的原理

第一的原理就是令代价函数等高线近圆形分布,很直观。
第二个原理是可以令权重比网络更之后或更深层。
比如我们训练一个猫咪分类器,希望分类器能识别出猫猫,但是我们的训练集中只有黑猫,而测试集中有各种颜色的猫,显然训练集中学习到的特征类似于测试集中样本特征的一个子集,我们希望我们的分类边界如绿色线所示:
在这里插入图片描述
这种数据集特征改变的情况叫做:covariate shift以往的模型中,如果这种情况发生,我们一般要重新训练我们的学习算法。但是通过Batch Normalization的方法,我们可以在输入特征x改变的情况下,通过γ和β将每个隐层的输入分布控制在一个确定的范围内,即令均值和方差不发生大的波动,这样神经网络之后的几层就有更坚实的基础。
也就当前一层学习改变后,后一层受的影响较小,即削弱了前一层参数对后一层的作用和联系。
同时B-N还有些许的正则化效果,并且引入了一定噪声,这一特点与dropout类似,但是不要将B-N作为正则化以减轻过拟合的措施。

3 Softmax回归

用于多分类中,使用softmax作为激活函数,输出的分类是概率值,若一共要分为4类,则输出神经元有4个,每个神经元的代表分为该类的概率,且所有神经元输出和为1。其计算过程如下:
在这里插入图片描述
在这里插入图片描述
与使用Sigmoid或者ReLu作为激活函数的分类器不同的是,我们最后一层以向量输入,以向量输出。
Hardmax分类器不会输出每类的概率,只会把最高概率的类输出为1,其余为0.
当分类数量为2时,Softmax就变成了logistics回归。
训练Softmax分类器的代价函数为:
在这里插入图片描述

4 TensorFlow示例代码

import numpy as np
import tensorflow.compat.v1 as tf                                # 声明使用tensorflow 1 的语法
tf.disable_v2_behavior()                                         # 声明使用tensorflow 1 的语法

coefficients = np.array([[1], [-20], [25]])                      # 初始化训练数据
w = tf.Variable([0], dtype=tf.float32)                           # 定义变量
x = tf.placeholder(tf.float32, [3,1])
cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]                        # 定义代价函数
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)   # 设定学习率为0.01,最小化cost
init = tf.global_variables_initializer()                         #-这三行代码时初始化代码,必须有
session = tf.Session()                                           #-这三行代码时初始化代码,必须有
session.run(init)                                                #-这三行代码时初始化代码,必须有
print(session.run(w))

for i in range(1000):
    session.run(train, feed_dict={x:coefficients})              # 将coefficients载入到x中,迭代1000次
print(session.run(w))
# 我们只需定义算法框架,反向传播梯度下降tensorflow自己会求
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值