精华内容
下载资源
问答
  • 机器学习中的数学——优化技术:参数初始化策略
    千次阅读
    2022-03-10 20:19:47

    有些优化算法本质上是非迭代的,只是求解一个解点。有些其他优化算法本质上是迭代的,但是应用于这一类的优化问题时,能在可接受的时间内收敛到可接受的解,并且与初始值无关。深度学习训练算法通常没有这两种奢侈的性质。深度学习模型的训练算法通常是迭代的,因此要求使用者指定一些开始迭代的初始点。此外,训练深度模型是一个足够困难的问题,以至于大多数算法都很大程度地受到初始化选择的影响。初始点能够决定算法是否收敛,有些初始点十分不稳定,使得该算法会遭遇数值困难,并完全失败。当学习收敛时,初始点可以决定学习收敛得多块,以及是否收敛到一个代价高或低的点。此外,差不多代价的点可以具有区别极大的泛化误差,初始点也可以影响泛化。

    现代的初始化策略是简单的、启发式的。设定改进的初始化策略是一项困难的任务,因为神经网络优化至今还未被很好地理解。大多数初始化策略基于在神经网络初始化时实现一些很好的性质。然而,我们并没有很好地理解这些性质中的哪些会在学习开始进行后的哪些情况下得以保持。进一步的难点是,有些初始点从优化的观点看或许是有利的,但是从泛化的观点看是不利的。我们对于初始点如何影响泛化的理解是相当原始的,几乎没有提供如何选择初始点的任何指导。

    也许完全确知的唯一特性是初始参数需要在不同单元间“破坏对称性”。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。如果它们具有相同的初始参数,然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。即使模型或训练算法能够使用随机性为不同的单元计算不同的更新(例如使用Dropout的训练),通常来说,最好还是初始化每个单元使其和其他单元计算不同的函数。这或许有助于确保没有输入模式丢失在前向传播的零空间中,没有梯度模式丢失在反向传播的零空间中。每个单元计算不同函数的目标促使了参数的随机初始化。我们可以明确地搜索一大组彼此互不相同的基函数,但这经常会导致明显的计算代价。例如,如果我们有和输出一样多的输入,可以使用Gram-Schmidt正交化于初始的权重矩阵,保证每个单元计算彼此非常不同的函数。在高维空间上使用高熵分布来随机初始化,计算代价小并且不太可能分配单元计算彼此相同的函数。

    通常情况下,我们可以为每个单元的偏置设置启发式挑选的常数,仅随机初始化权重。额外的参数(例如用于编码预测条件方差的参数)通常和偏差一样设置为启发式选择的常数。我们几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。高斯或均匀分布的选择似乎不会有很大的差别,但也没有被详尽地研究。然而,初始分布的大小确实对优化过程的结果和网络泛化能力都有很大的影响。更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元。它们也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重太大,那么会在前向传播或反向传播中产生爆炸的值。在循环网络中,很大的权重也可能导致混沌(对于输入中很小的扰动非常敏感,导致确定性前向传播过程表现随机)。在一定程度上,梯度爆炸问题可以通过梯度截断来缓解(执行梯度下降步骤之前设置梯度的阈值)。较大的权重也会产生使得激活函数饱和的值,导致饱和单元的梯度完全丢失。这些竞争因素决定了权重的理想初始大小。

    关于如何初始化网络,正则化和优化有着非常不同的观点。优化观点建议权重应该足够大以成功传播信息,但是正则化希望其小一点。诸如随机梯度下降这类对权重较小的增量更新,趋于停止在更靠近初始参数的区域(不管是由于卡在低梯度的区域,还是由于触发了基于过拟合的提前终止准则)的优化算法倾向于最终参数应接近于初始参数。在某些模型上,提前终止的梯度下降等价于权重衰减。在一般情况下,提前终止的梯度下降和权重衰减不同,但是提供了一个宽松的类比去考虑初始化的影响。我们可以将初始化参数 θ \theta θ θ 0 \theta_0 θ0类比于强置均值为 θ 0 \theta_0 θ0的高斯先验 p ( θ ) p(\theta) p(θ)。从这个角度来看,选择 θ 0 \theta_0 θ0接近0是有道理的。这个先验表明,单元间彼此互不交互比交互更有可能。只有在目标函数的似然项表达出对交互很强的偏好时,单元才会交互。此外,如果我们初始化 θ 0 \theta_0 θ0为很大的值,那么我们的先验指定了哪些单元应互相交互,以及它们应如何交互。

    有些启发式方法可用于选择权重的初始大小。一种初始化 m m m个输入和 n n n输出的全连接层的权重的启发式方法是从分布 W i , j ∼ U ( − 1 m , 1 m ) W_{i, j}\sim U(-\frac{1}{\sqrt{m}}, \frac{1}{\sqrt{m}}) Wi,jU(m 1,m 1)中采样权重,而Glorot andBengio建议使用标准初始化(Normalized Initialization):
    W i , j ∼ U ( − 6 m + n , 6 m + n ) W_{i, j}\sim U(-\frac{6}{\sqrt{m+n}}, \frac{6}{\sqrt{m+n}}) Wi,jU(m+n 6,m+n 6)

    后一种启发式方法初始化所有的层,折衷于使其具有相同激活方差和使其具有相同梯度方差之间。这假设网络是不含非线性的链式矩阵乘法,据此推导得出。现实的神经网络显然会违反这个假设,但很多设计于线性模型的策略在其非线性对应中的效果也不错。

    Saxe等人推荐初始化为随机正交矩阵,仔细挑选负责每一层非线性缩放或增益因子 g g g。他们得到了用于不同类型的非线性激活函数的特定缩放因子。这种初始化方案也是启发于不含非线性的矩阵相乘序列的深度网络。在该模型下,这个初始化方案保证了达到收敛所需的训练迭代总数独立于深度。

    增加缩放因子 g g g将网络推向网络前向传播时激活范数增加,反向传播时梯度范数增加的区域。Sussillo表明,正确设置缩放因子足以训练深达1000层的网络,而不需要使用正交初始化。这种方法的一个重要观点是,在前馈网络中,激活和梯度会在每一步前向传播或反向传播中增加或缩小,遵循随机游走行为。这是因为前馈网络在每一层使用了不同的权重矩阵。如果该随机游走调整到保持范数,那么前馈网络能够很大程度地避免相同权重矩阵用于每层的梯度消失与爆炸问题。

    可惜,这些初始权重的最佳准则往往不会带来最佳效果。这可能有三种不同的原因。首先,我们可能使用了错误的标准——它实际上并不利于保持整个网络信号的范数。其次,初始化时强加的性质可能在学习开始进行后不能保持。最后,该标准可能成功提高了优化速度,但意外地增大了泛化误差。在实践中,我们通常需要将权重范围视为超参数,其最优值大致接近,但并不完全等于理论预测。

    数值范围准则的一个缺点是,设置所有的初始权重具有相同的标准差,例如 1 m \frac{1}{\sqrt{m}} m 1,会使得层很大时每个单一权重会变得极其小。Martens提出了一种被称为稀疏初始化(Sparse Initialization)的替代方案,每个单元初始化为恰好有 k k k个非零权重。这个想法保持该单元输入的总数量独立于输入数目 m m m,而不使单一权重元素的大小随 m m m缩小。稀疏初始化有助于实现单元之间在初始化时更具多样性。但是,获得较大取值的权重也同时被加了很强的先验。因为梯度下降需要很长时间缩小“不正确”的大值,这个初始化方案可能会导致某些单元出问题,例如Maxout单元有几个过滤器,互相之间必须仔细调整。

    如果计算资源允许,将每层权重的初始数值范围设为超参数通常是个好主意,如随机搜索,挑选这些数值范围。是否选择使用密集或稀疏初始化也可以设为一个超参数。作为替代,我们可以手动搜索最优初始范围。一个好的挑选初始数值范围的经验法则是观测单个小批量数据上的激活或梯度的幅度或标准差。如果权重太小,那么当激活值在小批量上前向传播于网络时,激活值的幅度会缩小。通过重复识别具有小得不可接受的激活值的第一层,并提高其权重,最终有可能得到一个初始激活全部合理的网络。如果学习在这点上仍然很慢,观测梯度的幅度或标准差可能也会有所帮助。这个过程原则上是自动的,且通常计算量低于基于验证集误差的超参数优化,因为它是基于初始模型在单批数据上的行为反馈,而不是在验证集上训练模型的反馈。由于这个协议很长时间都被启发式使用,最近Mishkin and Matas更正式地研究了该协议。

    目前为止,我们关注在权重的初始化上。幸运的是,其他参数的初始化通常更容易。设置偏置的方法必须和设置权重的方法协调。设置偏置为零通常在大多数权重初始化方案中是可行的。存在一些我们可能设置偏置为非零值的情况:

    • 如果偏置是作为输出单元,那么初始化偏置以获取正确的输出边缘统计通常是有利的。要做到这一点,我们假设初始权重足够小,该单元的输出仅由偏置决定。这说明设置偏置为应用于训练集上输出边缘统计的激活函数的逆。例如,如果输出是类上的分布,且该分布是高度偏态分布,第 i i i类的边缘概率由某个向量 c c c的第 i i i个元素给定,那么我们可以通过求解方程 softmax ( b ) = c \text{softmax}(b)=c softmax(b)=c来设置偏置向量 b b b。这不仅适用于分类器,也适用于其它的模型,例如自编码器和玻尔兹曼机。这些模型拥有输出类似于输入数据x的网络层,非常有助于初始化这些层的偏置以匹配 x x x上的边缘分布。
    • 有时,我们可能想要选择偏置以避免初始化引起太大饱和。例如,我们可能会将ReLU的隐藏单元设为0.1而非0,以避免ReLU在初始化时饱和。尽管这种方法违背不希望偏置具有很强输入的权重初始化准则。例如,不建议使用随机游走初始化。
    • 有时,一个单元会控制其他单元能否参与到等式中。在这种情况下,我们有一个单元输出 u u u,另一个单元 h ∈ [ 0 , 1 ] h\in[0,1] h[0,1],那么我们可以将 h h h视作门,以决定 u h ≈ 1 uh\approx1 uh1还是 u h ≈ 0 uh≈0 uh0。在这种情形下,我们希望设置偏置 h h h,使得在初始化的大多数情况下 h ≈ 1 h\approx 1 h1。否则, u u u没有机会学习。例如,Jozefowicz等人提议设置LSTM模型遗忘门的偏置为1。

    另一种常见类型的参数是方差或精确度参数。例如,我们用以下模型进行带条件方差估计的线性回归:
    p ( y ∣ x ) = N ( y ∣ x T x + b , 1 β ) p(y|x)=N(y|x^Tx+b, \frac{1}{\beta}) p(yx)=N(yxTx+b,β1)

    其中 β \beta β是精确度参数。通常我们能安全地初始化方差或精确度参数为1。另一种方法假设初始权重足够接近零,设置偏置可以忽略权重的影响,然后设定偏置以产生输出的正确边缘均值,并将方差参数设置为训练集输出的边缘方差。

    除了这些初始化模型参数的简单常数或随机方法,还有可能使用机器学习初始化模型参数。我们还可以用无监督模型训练出来的参数来初始化监督模型。我们也可以在相关问题上使用监督训练。即使是在一个不相关的任务上运行监督训练,有时也能得到一个比随机初始化具有更快收敛率的初始值。这些初始化策略有些能够得到更快的收敛率和更好的泛化误差,因为它们编码了模型初始参数的分布信息。其他策略显然效果不错的原因主要在于它们设置参数为正确的数值范围,或是设置不同单元计算互相不同的函数。

    更多相关内容
  • 公众号标题:神经网络中的优化方法之学习率衰减和动态梯度方向 引言 神经网络中的网络优化和正则化问题介绍主要分为一,二...无论是神经网络还是机器学习都会存在很多的超参数,在神经网络中,常见的超参数有: 网...

    转载请注明出处:https://thinkgamer.blog.csdn.net/article/details/101033047
    博主微博:http://weibo.com/234654758
    Github:https://github.com/thinkgamer
    公众号:搜索与推荐Wiki


    引言

    神经网络中的网络优化和正则化问题介绍主要分为一,二,三,四篇进行介绍。

    • 第一篇包括
      • 网络优化和正则化概述
      • 优化算法介绍
    • 第二篇包括
      • 参数初始化
      • 数据预处理
      • 逐层归一化
    • 第三篇包括
      • 超参数优化
    • 第四篇包括
      • 网络正则化

    无论是神经网络还是机器学习都会存在很多的超参数,在神经网络中,常见的超参数有:

    • 网络结构:包括神经元之间的连接关系,层数,每层的神经元数量,激活函数的类型等
    • 优化参数:包括优化方法,学习率,小批量样本数量
    • 正则化系数

    超参数优化(Hyperparamter Optimization) 主要存在两方面的困难:

    • 超参数优化是一个组合优化问题,无法像一般参数那样通过梯度优化的方法来求解,也没有一种通用的优化方法
    • 评估一组超参数配置时间代价很高,从而导致一些优化算法(比如时间演化算法)在超参数优化中难以应用

    对于超参数的设置,一般有三种比较简单的优化方法,人工搜索,网格搜素,随机搜索


    网格搜索

    网格搜索(grid search)是一种通过尝试所有超参数的组合来寻找一组合适的超参数组合的方法。如果参数是连续,可以将其离散化。比如“学习率”,我们可以根据经验选取几个值: α ∈ 0.01 , 0.1 , 0.5 , 1.0 \alpha \in {0.01, 0.1, 0.5, 1.0} α0.01,0.1,0.5,1.0

    一般而言,对于连续的超参数,不能采用等间隔的方式进行划分,需要根据超参数自身的特点进行离散化。

    网格搜索根据不同的参数组合在测试集上的表现,选择一组最优的参数作为结果。

    随机搜索

    不同超参数对模型的影响不同,有的超参数(比如正则项系数)对模型的影响有限,有的超参数(比如学习率)对模型的影响比较大,这时候采用网格搜索就会在影响不大的超参数上浪费时间。

    一种在实践中比较有效的方法是对超参数进行随机组合(比如不太重要的参数进行随机抽取,重要的参数可以按照网格搜索的方式选择),选择表现最好的参数作为结果,这就是随机搜索(random search)

    网格搜索和随机搜索没有利用超参数之间的相关性,即如果模型的超参数组合比较类似,其模型的性能表现也是比较接近的,这时候网格搜索和随机搜索就比较低效。下面介绍两种自适应的超参数优化方法:贝叶斯优化和动态资源分配。


    动态资源分配

    在超参数优化中,每组超参数配置的评估代价很高,如果我们可以在较早的阶段就估计出该组超参数效果就比较差,然后提前终止该组参数的测试,从而将更多的资源留给其他。这个问题可以归结为多臂赌博机问题的一个泛化问题,即最优臂问题(best-arm problem),即在给定有限次数的情况下,如何获取最大收益。

    动态资源分配的一种有效方法是逐层减半(successive halving),将超参数优化看作是一种非随机的最优臂问题。该方法出自2015年的一篇论文,论文下载地址为:https://arxiv.org/pdf/1502.07943.pdf

    假设要尝试N组超参数配置,总共可利用的摇臂资源次数为B,我们可以通过 T = [ l o g 2 N ] − 1 T= [log_2N]-1 T=[log2N]1轮逐次减半的方法来选取最优的配置,具体计算过程如下:

    逐次减半

    在逐次减半方法中,N的设置十分重要,如果N越大,得到最佳配置的机会也越大,但每组配置分配到的资源就越少,这样早期的评估结果可能不准确,反之,如果N越小,每组超参数配置的评估就会越准确,但也有可能无法得到最优的参数配置。因此如何设置N是评估“利用-探索”的一个关键因素,一种改进的方法是:HyperBrand方法,通过尝试不同的N来寻找最优的参数配置。对应的论文下载地址为:https://openreview.net/pdf?id=ry18Ww5ee


    贝叶斯优化

    贝叶斯优化背后的思想

    贝叶斯优化(Bayesian optimization)是一种自适应的超参数优化方法,根据当前已经试验的超参数组合,来预测下一个可能带来最大收益的组合。

    对于同一个算法来讲,不同的超参数组合其实是对应不同的模型,而贝叶斯优化可以帮助我们在众多模型中寻找性能最优的模型,虽然我们可以使用交叉验证的思想寻找更好的超参数组合,但是不知道需要多少样本才能从一系列候选模型中选择出最优的模型。这就是为什么贝叶斯优化能够减少计算任务加速优化过程的进程,同样贝叶斯优化不依赖于人为猜测需要样本量的多少,这种优化计算是基于随机性和概率分布得到的。


    简单来说,当我们把第一条样本送到模型中的时候,模型会根据当前的样本点构建一条直接,当把第二天样本送到模型中的时候,模型将结合这两个点并从前面的线出发绘制一条修正的线,当输送第三个样本的时候,模型绘制的就是一条非线性曲线,当样本数据增加时,模型所结合的曲线就会变得更多,这就像统计学里的抽样定理,即我们从样本参数出发估计总体参数,且希望构建出的估计量与总体参数相合,无偏估计。


    下图为非线性目标函数曲线图,对于给定的目标函数,在输送了所有的观察样本之后,它将搜寻到最大值,即寻找令目标函数最大的参数(arg max)。
    非线性目标函数曲线图
    我们的目标并不是使用尽可能多的样本去完全推断未知的目标函数,而是希望能求得使目标函数最大化的参数,所以我们将注意力从曲线上移开,当目标函数组合能提升曲线形成分布时,其就可以称为采集函数(Acquisition funtion),这就是贝叶斯优化背后的思想。(灰色区域部分参考:https://www.jiqizhixin.com/articles/2017-08-18-5)

    时序模型优化

    一种常用的贝叶斯优化方法为时序模型优化(Sequential Model-Based Optimization,SMBD),假设超参数优化的函数f(x)服从高斯过程,则 p ( f ( x ) ∣ x ) p(f(x)|x) p(f(x)x)为一个正态分布。贝叶斯优化过程是根据已有的N组实验结果 H = x n , y n , n ∈ ( 1 , N ) H={x_n,y_n}, n\in(1,N) H=xn,yn,n(1,N) y n y_n yn f ( x n ) f(x_n) f(xn)的观测值)来建模高斯过程,并计算 f ( x ) f(x) f(x)的后验分布 p ( f ( x ) ∣ x , H ) p(f(x)|x,H) p(f(x)x,H)

    为了使得 p ( f ( x ) ∣ x , H ) p(f(x)|x,H) p(f(x)x,H)接近其真实分布,就需要对样本空间进行足够多的采样,但是超参数优化中每一个样本的生成成本都很高,需要使用尽可能少的样本来使得 p θ ( f ( x ) ∣ x , H ) p_\theta(f(x)|x,H) pθ(f(x)x,H)接近于真实分布。因此需要定义一个收益函数(Acquisition funtion) α ( x , H ) \alpha (x, H) α(x,H)来判断一个样本能否给建模 p θ ( f ( x ) ∣ x , H ) p_\theta(f(x)|x,H) pθ(f(x)x,H)提供更多的收益。收益越大,其修正的高斯过程会越接近目标函数的真实分布。

    收益函数的定义有很多方式,一个常用的是期望改善(Expected Improvement,EI)。假设 y ∗ = m i n { y n , 1 ≤ n ≤ N } y^* = min \left \{ y_n, 1 \leq n \leq N \right \} y=min{yn,1nN}是当前已有样本中的最优值,期望改善函数为:
    E I ( x , H ) = ∫ − ∞ + ∞ m a x ( y ∗ − y , 0 ) p ( y ∣ x , H ) d y EI(x, H) = \int_{-\infty }^{ +\infty } max (y^* - y, 0) p(y|x, H) dy EI(x,H)=+max(yy,0)p(yx,H)dy
    期望改善是定义一个样本 x x x在当前模型 p ( f ( x ) ∣ x , H ) p(f(x)|x,H) p(f(x)x,H)下, f ( x ) f(x) f(x)超过最好结果 y ∗ y^* y的期望。除了期望改善函数之外,收益函数还有其他函数的定义,比如改善概率(Probability Of Improvement),高斯过程置信上界(GP Up Confidence Bound,GP-UCB)等。

    时序模型优化过程如下所示:
    时序模型优化过程

    贝叶斯优化的缺点是高斯建模过程需要计算矩阵的逆,时间复杂度为 O ( n 3 ) O(n^3) O(n3),因此不能很好的处理高维过程,深层神经网络的参数一般比较多,需要更加高效的高斯过程建模,也有一些方法将时间复杂度从 O ( n 3 ) O(n^3) O(n3)降到了 O ( n ) O(n) O(n)

    至此,超参数优化部分已经介绍完成,这里并没有对超参数优化进行实现,有很多Python库已经对其进行了封装,感兴趣的可以关注下,另外贝叶斯优化在日常实践中用的比较多但是不太好理解,可以多看几遍,对比一些文章什么看下理解下。


    【技术服务】,详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

    扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!

    展开全文
  • 神经网络参数优化方法

    万次阅读 多人点赞 2018-10-23 14:05:42
    著名: 本文是从 Michael Nielsen的电子书Neural Network and Deep Learning的深度学习那一章的卷积神经网络参数优化方法的一些总结和摘录,并不是我自己的结论和做实验所得到的结果。我想Michael的实验结果更...

     

    转载自:https://www.cnblogs.com/bonelee/p/8528863.html

    著名: 本文是从 Michael Nielsen的电子书Neural Network and Deep Learning深度学习那一章的卷积神经网络的参数优化方法的一些总结和摘录,并不是我自己的结论和做实验所得到的结果。我想Michael的实验结果更有说服力一些。本书在github上有中文翻译的版本,

    前言

    最近卷积神经网络(CNN)很火热,它在图像分类领域的卓越表现引起了大家的广泛关注。本文总结和摘录了Michael Nielsen的那本Neural Network and Deep Learning一书中关于深度学习一章中关于提高泛化能力的一些概述和实验结果。力争用数据给大家一个关于正则化增加卷积层/全连接数弃权技术拓展训练集等参数优化方法的效果。 
    本文并不会介绍正则化弃权(Dropout)池化等方法的原理,只会介绍它们在实验中的应用或者起到的效果,更多的关于这些方法的解释请自行查询。

    mnist数据集介绍

    本文的实验是基于mnist数据集合的,mnist是一个从0到9的手写数字集合,共有60,000张训练图片,10,000张测试图片。每张图片大小是28*28大小。我们的实验就是构建一个神经网络来高精度的分类图片,也就是提高泛化能力。

    提高泛化能力的方法

    一般来说,提高泛化能力的方法主要有以下几个:

    • 正则化
    • 增加神经网络层数
    • 使用正确的代价函数
    • 使用好的权重初始化技术
    • 人为拓展训练集
    • 弃权技术 
      下面我们通过实验结果给这些参数优化理论一个直观的结果

    1. 普通的全连接神经网络的效果

    我们使用一个隐藏层,包含100个隐藏神经元,输入层是784,输出层是one-hot编码的形式,最后一层是Softmax层。训练过程采用对数似然代价函数,60次迭代,学习速率η=0.1,随机梯度下降的小批量数据大小为10,没有正则化。在测试集上得到的结果是97.8%

     

    2.使用卷积神经网络 — 仅一个卷积层

    输入层是卷积层,5*5的局部感受野,也就是一个5*5的卷积核,一共20个特征映射。最大池化层选用2*2的大小。后面是100个隐藏神经元的全连接层。结构如图所示 
    CNN结构

    在这个架构中,我们把卷积层和chihua层看做是学习输入训练图像中的局部感受野,而后的全连接层则是一个更抽象层次的学习,从整个图像整合全局信息。也是60次迭代,批量数据大小是10,学习率是0.1。

    经过三次运行取平均后,准确率是98.78%,这是相当大的改善。错误率降低了1/3,。卷积神经网络开始显现威力。

    3.使用卷积神经网络 — 两个卷积层

    我们接着插入第二个卷积-混合层,把它插入在之前的卷积-混合层和全连接层之间,同样的5*5的局部感受野,2*2的池化层。

    这一次,我们拥有了99.06%的准确率。

    4.使用卷积神经网络 — 两个卷积层+线性修正单元(ReLU)+正则化

    上面我们使用的Sigmod激活函数,现在我们换成线性修正激活函数ReLU 
    f(z)=max(0,z)

    ,我们选择60个迭代期,学习速率η=0.03, ,使用L2正则化,正则化参数λ=0.1

    这一次,我们获得了99.23%的准确率,超过了S型激活函数的99.06%. ReLU的优势是max(0,z)

    中z取最大极限时不会饱和,不像是S函数,这有助于持续学习。

    5.使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集

    拓展训练集数据的一个简单方法是将每个训练图像由一个像素来代替,无论是上一个像素,下一个像素,或者左右的像素。其他的方法也有改变亮度,改变分辨率,图片旋转,扭曲,位移等。 
    我们把50,000幅图像人为拓展到250,000幅图像。使用第4节一样的网络,因为我们是在训练5倍的数据,所以减少了过拟合的风险。

    这次的到了99.37的训练正确率。

    6.使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层

    继续上面的网络,我们拓展全连接层的规模,300个隐藏神经元和1000个神经元的额精度分别是99.46%和99.43%. 
    我们插入一个额外的全连接层

    这次取得了99.43%的精度。拓展后的网络并没有帮助太多。

    7.使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+拓展数据集+继续插入额外的全连接层+弃权技术

    弃权的基本思想就是在训练网络时随机的移除单独的激活值,使得模型对单独的依据丢失更为强劲,因此不太依赖于训练数据的特质。我们尝试应用弃权技术到最终的全连接层(不是在卷基层)。这里,减少了迭代期的数量为40个,全连接层使用1000个隐藏神经元,因为弃权技术会丢弃一些神经元。Dropout是一种非常有效有提高泛化能力,降低过拟合的方法!

    使用弃权技术,的到了99.60%的准确率。

    8.使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层+弃权技术+组合网络

    组合网络类似于随机森林或者adaboost的集成方法,创建几个神经网络,让他们投票来决定最好的分类。我们训练了5个不同的神经网络,每个都大到了99.60%的准去率,用这5个网络来进行投票表决一个图像的分类。 
    采用这个方法,达到了99.67%的准确率。

    总结

    卷积神经网络 的一些技巧总结如下:

    1. 使用卷积层极大地减小了全连接层中的参数的数目,使学习的问题更容易
    2. 使用更多强有力的规范化技术(尤其是弃权和卷积)来减小过度拟合,
    3. 使用修正线性单元而不是S型神经元,来加速训练-依据经验,通常是3-5倍,
    4. 使用GPU来计算
    5. 利用充分大的数据集,避免过拟合
    6. 使用正确的代价函数,避免学习减速
    7. 使用好的权重初始化,避免因为神经元饱和引起的学习减速

     

    CNN超参数优化和可视化技巧详解

    转自:https://zhuanlan.zhihu.com/p/27905191

    在深度学习中,有许多不同的深度网络结构,包括卷积神经网络(CNN或convnet)、长短期记忆网络(LSTM)和生成对抗网络(GAN)等。

    在计算机视觉领域,对卷积神经网络(简称为CNN)的研究和应用都取得了显著的成果。CNN网络最初的诞生收到了动物视觉神经机制的启发,目前已成功用于机器视觉等领域中。

    技术博客Towards Data Science最近发布了一篇文章,作者Suki Lau。文章讨论了在卷积神经网络中,该如何调整超参数以及可视化卷积层。

    为什么用卷积神经网络?

    首先,我们想要计算机具有什么能力呢?

    当我们看到一只猫跳上窗台或在沙发上睡觉时,我们的潜意识会认出它是一只猫。

    我们希望计算机也能完成这项任务,即将图像输入后,找出其独有的特征,最终输出该图像的类别信息。

    卷积神经网络可以完成这项任务。

    何为卷积神经网络?

    先谈定义,卷积神经网络是一种特殊的神经网络,其中至少包含一个卷积层。在典型的CNN网络结构中,输入一张图像,经由一系列卷积层、非线性激活层、池化层和全连接层后,可输出相应的类别标签。

    卷积神经网络的特别之处在于加入了卷积层。

    在经典的神经网络中,整张图片会被传入网络中来训练各网络层权值。当输入为简单居中的图像时,如Mnist手写数字图,网络识别效果较优,但是当输入变为更为复杂多变的图像时,如跳上窗户的小猫,此时网络识别效果不佳甚至无法辨识。

    加入更多隐含层学习输入图像的抽象特征,可能会有所帮助,但是这样会增加神经元的数目,大大增加训练所需的计算资源和占用过多的内存,这是不切实际的。

    而CNN识别目标的过程,是先寻找诸如边缘、线段和曲线等相关低级特征,然后使用多个卷积层来构建更多抽象的高级特征。

    在卷积层的学习过程中,CNN网络通过共享多个卷积核(或特征检测器)的权值,来学习每张图片的局部信息,并用于构建抽象特征图谱。卷积核共享特性大大降低了训练网络所需的参数量。

    由于经过训练的检测器可以通过卷积层重复用来组合地检测图片中的抽象特征,因此卷积神经网络更适用于复杂的图像识别任务。

    超参数调整

    在深度神经网络中,调整超参数组合并非易事,因为训练深层神经网络十分耗时,且需要配置多个参数。

    接下来,我们简单列举几个影响CNN网络的关键超参数。

    学习率

    学习率是指在优化算法中更新网络权重的幅度大小。

    学习率可以是恒定的、逐渐降低的、基于动量的或者是自适应的,采用哪种学习率取决于所选择优化算法的类型,如SGD、Adam、Adagrad、AdaDelta或RMSProp等算法。

    优化策略这方面的内容可参阅量子位之前编译过的“一文看懂各种神经网络优化算法:从梯度下降到Adam方法”。

    迭代次数

    迭代次数是指整个训练集输入到神经网络进行训练的次数。当测试错误率和训练错误率相差较小时,可认为当前的迭代次数是合适的,否则需继续增大迭代次数,或调整网络结构。

    批次大小

    在卷积神经网络的学习过程中,小批次会表现得更好,选取范围一般位于区间[16,128]内。

    还需要注意的是,CNN网络对批次大小的调整十分敏感。

    激活函数

    激活函数具有非线性,理论上可以使模型拟合出任何函数。通常情况下,rectifier函数在CNN网络中的效果较好。当然,可以根据实际任务,选择其他类型的激活函数,如Sigmoid和Tanh等等。

    隐含层的数目和单元数

    增加隐含层数目以加深网络深度,会在一定程度上改善网络性能,但是当测试错误率不再下降时,就需要寻求其他的改良方法。增加隐含层数目也带来一个问题,即提高了训练该网络的计算成本。

    当网络的单元数设置过少时,可能会导致欠拟合,而单元数设置过多时,只要采取合适的正则化方式,就不会产生不良影响。

    权重初始化

    在网络中,通常会使用小随机数来初始化各网络层的权重,以防止产生不活跃的神经元,但是设置过小的随机数可能生成零梯度网络。一般来说,均匀分布方法效果较好。

    Dropout方法

    作为一种常用的正则化方式,加入Dropout层可以减弱深层神经网络的过拟合效应。该方法会按照所设定的概率参数,在每次训练中随机地不激活一定比例的神经单元。该参数的默认值为0.5。

    手动调整超参数是十分费时也不切实际。接下来介绍两种搜索最优超参数的常用方法。

    网格搜索和随机搜索

    网格搜索是通过穷举法列出不同的参数组合,确定性能最优的结构。随机搜索是从具有特定分布的参数空间中抽取出一定数量的候选组合。

    网格搜索方法也需要制定策略,在初始阶段最好先确定各超参数值的大概范围。可以先尝试在较小迭代次数或较小规模的训练集上进行大步幅的网格搜索。然后在下个阶段中,设置更大的迭代次数,或是使用整个训练集,实现小幅精确定位。

    虽然在许多机器学习算法中,通常会使用网格搜索来确定超参数组合,但是随着参数量的增大,训练网络所需的计算量呈指数型增长,这种方法在深层神经网络的超参数调整时效果并不是很好。

    有研究指出,在深度神经网络的超参数调整中,随机搜索方法比网格搜索的效率更高,具体可参考文末中的“随机搜索在超参数优化中的应用”。

    当然,可根据神经网络的理论经验,进行超参数的手动调整在一些场景下也是可行的。

    可视化

    我们可以通过可视化各个卷积层,来更好地了解CNN网络是如何学习输入图像的特征。

    可视化有两种直接方式,分别是可视化激活程度可视化相关权重。在网络训练过程中,卷积层的激活情况通常会变得更为稀疏和具有局部特性。当不同输入图像的激活图都存在大片未激活的区域,那么可能是设置了过高的学习率使得卷积核不起作用,导致产生零激活图像。

    性能优良的神经网络通常含有多个明显而平滑的卷积器,且没有任何干扰特征。若在权重中观察到相关干扰特征,可能原因是网络未被充分训练,或是正则化强度较低导致了过拟合效应。

     

    神经网络参数优化--基于CNN的验证

    转自:https://ziyubiti.github.io/2016/11/20/cnnpara/

      当使用多层更深的隐藏层全连接网络时,参数量会变得非常巨大,达到数十亿量级;而采用CNN结构,则可以层间共享权重,极大减小待训练的参数量;同时可采用二维卷积,保留图像的空间结构信息;采用池化层,进一步减少参数计算。
      一般来说,提高泛化能力的方法主要有: 正则化、增加神经网络层数、改变激活函数与代价函数、使用好的权重初始化技术、人为扩展训练集、弃权技术。
      下面以MNIST为例,结合CNN、Pooling、Fc结构,通过不同的网络结构变化,给这些参数优化理论一个直观的验证结果。

    CNN不同网络结构性能比较CNN不同网络结构性能比较

      可以看出:
      1、使用L2正则化,dropout技术,扩展数据集等,有效缓解过拟合,提升了性能;
      2、使用ReLU,导数为常量,可以缓解梯度下降问题,并加速训练;
      3、增加Conv/Pooling与Fc层,可以改善性能。(我自己实测也是如此)
      
      Note:
      1、网络并非越深越好,单纯的Conv/Pooling/Fc结构,增加到一定深度后由于过拟合性能反而下降。
      2、网络结构信息更重要,如使用GoogleNet、ResNet等。

    知乎上的讨论:

    转自:https://www.zhihu.com/question/41631631

    训练技巧对深度学习来说是非常重要的,作为一门实验性质很强的科学,同样的网络结构使用不同的训练方法训练,结果可能会有很大的差异。这里我总结了近一年来的炼丹心得,分享给大家,也欢迎大家补充指正。

    参数初始化。

    下面几种方式,随便选一个,结果基本都差不多。但是一定要做。否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题。

    下面的n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)*0.5

    Xavier初始法论文:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

    He初始化论文:https://arxiv.org/abs/1502.01852

    • uniform均匀分布初始化: w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])
      • Xavier初始法,适用于普通激活函数(tanh,sigmoid):scale = np.sqrt(3/n)
      • He初始化,适用于ReLU:scale = np.sqrt(6/n)
    • normal高斯分布初始化: w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0
      • Xavier初始法,适用于普通激活函数 (tanh,sigmoid):stdev = np.sqrt(n)
      • He初始化,适用于ReLU:stdev = np.sqrt(2/n)
    • svd初始化:对RNN有比较好的效果。参考论文:https://arxiv.org/abs/1312.6120

    数据预处理方式

    • zero-center ,这个挺常用的. X -= np.mean(X, axis = 0) # zero-center X /= np.std(X, axis = 0) # normalize
    • PCA whitening,这个用的比较少.

    训练技巧

    • 要做梯度归一化,即算出来的梯度除以minibatch size
    • clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15
    • dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显(实测sgd比adam好).因此可能的话,建议一定要尝试一下。 dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:http://arxiv.org/abs/1409.2329
    • adam,adadelta等,在小数据上,我这里实验的效果不如sgd, sgd收敛速度会慢一些,但是最终收敛后的结果,一般都比较好。如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。
    • 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.1. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。2. 输入0均值,sigmoid函数的输出不是0均值的。
    • rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.
    • word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果.
    • 尽量对数据做shuffle
    • LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.
    • Batch Normalization据说可以提升效果,不过我没有尝试过,建议作为最后提升模型的手段,参考论文:Accelerating Deep Network Training by Reducing Internal Covariate Shift
    • 如果你的模型包含全连接层(MLP),并且输入和输出大小一样,可以考虑将MLP替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动,详细介绍请参考论文: http://arxiv.org/abs/1505.00387
    • 来自@张馨宇的技巧:一轮加正则,一轮不加正则,反复进行。

    Ensemble

    Ensemble是论文刷结果的终极核武器,深度学习中一般有以下几种方式

    • 同样的参数,不同的初始化方式
    • 不同的参数,通过cross-validation,选取最好的几组
    • 同样的参数,模型训练的不同阶段,即不同迭代次数的模型。
    • 不同的模型,进行线性融合. 例如RNN和传统模型.

     

    其实我发现现在深度学习越来越成熟,调参工作比以前少了很多,绝大多数情况自己设计的参数都不如教程和框架的默认参数好,不过有一些技巧我一直都在用的

    (1)relu+bn。这套好基友组合是万精油,可以满足95%的情况,除非有些特殊情况会用identity,比如回归问题,比如resnet的shortcut支路,sigmoid什么的都快从我世界里消失了

    (2)dropout 。分类问题用dropout ,只需要最后一层softmax 前用基本就可以了,能够防止过拟合,可能对accuracy提高不大,但是dropout 前面的那层如果是之后要使用的feature的话,性能会大大提升(例如max pool进入fc,实测发现加BN效果非常明显)

    (3)数据的shuffle 和augmentation 。这个没啥好说的,aug也不是瞎加,比如行人识别一般就不会加上下翻转的,因为不会碰到头朝下的异型种

    (4)降学习率。随着网络训练的进行,学习率要逐渐降下来,如果你有tensorboard,你有可能发现,在学习率下降的一瞬间,网络会有个巨大的性能提升,同样的fine-tuning也要根据模型的性能设置合适的学习率,比如一个训练的已经非常好的模型你上来就1e-3的学习率,那之前就白训练了,就是说网络性能越好,学习率要越小

    (5)tensorboard。以前不怎么用,用了之后发现太有帮助,帮助你监视网络的状态,来调整网络参数

    (6)随时存档模型,要有validation 。这就跟打游戏一样存档,把每个epoch和其对应的validation 结果存下来,可以分析出开始overfitting的时间点,方便下次加载fine-tuning

    (7)网络层数,参数量什么的都不是大问题,在性能不丢的情况下,减到最小

    (8)batchsize通常影响没那么大,塞满卡就行,除了特殊的算法需要batch大一点

    (9)输入减不减mean归一化在有了bn之后已经不那么重要了

    上面那些都是大家所知道的常识,也是外行人觉得深度学习一直在做的就是这些很low的东西,其实网络设计(关键!!!实测发现对于acc影响极大!)上博大精深,这也远超过我的水平范畴,只说一些很简单的

    (1)卷积核的分解。从最初的5×5分解为两个3×3,到后来的3×3分解为1×3和3×1,再到resnet的1×1,3×3,1×1,再xception的3×3 channel-wise conv+1×1,网络的计算量越来越小,层数越来越多,性能越来越好,这些都是设计网络时可以借鉴的

    (2)不同尺寸的feature maps的concat,只用一层的feature map一把梭可能不如concat好,pspnet就是这种思想,这个思想很常用

    (3)resnet的shortcut确实会很有用,重点在于shortcut支路一定要是identity,主路是什么conv都无所谓,这是我亲耳听resnet作者所述

    (4)针对于metric learning,对feature加个classification 的约束通常可以提高性能加快收敛

     

     

     

    补充一点,adam收敛虽快但是得到的解往往没有sgd+momentum得到的解更好,如果不考虑时间成本的话还是用sgd吧。
    再补充一个rnn trick,仍然是不考虑时间成本的情况下,batch size=1是一个很不错的regularizer, 起码在某些task上,这也有可能是很多人无法复现alex graves实验结果的原因之一,因为他总是把batch size设成1。。。

     

     

    没做过CNN,RNN,调过连续值DNN,以下经验仅限于CTR
    1.样本要足够随机
    2.样本要做归一化
    3.激活函数要视样本输入选择
    4.minibatch很重要,几百到几千是比较合适的(很大数据量的情况下)
    5.learning rate很重要,可以直接用adagrad or adadelta,省去一些麻烦,然后把冲量调到0.9以上
    6.权重初始化,可用高斯分布乘上一个很小的数

     

     

     

    小白一枚,在这里总结一下我在试验中观察到的现象(必然有理解错误的地方):
    1. Adam收敛速度的确要快一些,可是结果总是不如其他优化算法,如果很看重结果不在乎速度还是用其他的试试。
    2. Dropout的放置位置以及大小非常重要,求大神能分享经验.....
    3. Relu并不是一定比Tanh好,如果不太懂的话,用的不合适,可能会导致梯度消失?(不知道是不是网络结构问题,为什么一用relu梯度一会儿就变成Nan)
    4. pretrain 的 Embedding在训练中不调优泛化能力要更好一些,调优的话参数会增加好多啊。
    另:心得体会
    1. 深度学习真是一门实验科学,很多地方解释不了为什么好,为什么不好。
    2.如果你机器配置很不到位,也没有人带你,毕业设计千万别选深度学习,天天愁,好坑啊。

     

     

     

    最近在看 Karpathy 的 cs231n, 还没看完, 不过过程中总结了一下他提到的一些技巧:

    关于参数: 

    • 通常情况下, 更新参数的方法默认用 Adam 效果就很好
    • 如果可以载入全部数据 (full batch updates), 可以使用 L-BFGS


    Model Ensembles:

    • 训练多个模型, 在测试时将结果平均起来, 大约可以得到 2% 提升.
    • 训练单个模型时, 平均不同时期的 checkpoints 的结果, 也可以有提升.
    • 测试时可以将测试的参数和训练的参数组合起来:

     

    分享几个常用的trick:
    1.增加每个step的轮数
    2.early stop
    3.用小一些的学习率warmup
    4.回退到更大的学习率
    5.nesterov momentum sgd 
    6.搜索初始学习率

     

    1.better initialization helps a lot

    2.use minibatch and choose batch_size(must)

    3.use batch_norm &dropout

    4.use adam

    5.plot the learning rate curve

    6.plot the loss curve.

    7.lstm &gru are almost always better than sample RNN

    8.use better framework(like tensorflow with tensorboard)

    9.find hyper parameters used most often in paper

    10 pray

     

     

    cnn的调参主要是在优化函数、embedding的维度还要残差网络的层数几个方面。

    1. 优化函数方面有两个选择:sgd、adam,相对来说adam要简单很多,不需要设置参数,效果也还不错。
    2. embedding随着维度的增大会出现一个最大值点,也就是开始时是随维度的增加效果逐渐变好,到达一个点后,而后随维度的增加,效果会变差。
    3. 残差网络的层数与embedding的维度有关系,随层数的增加,效果变化也是一个凸函数。

    另外还有激活函数,dropout层和batchnormalize层的使用。激活函数推荐使用relu,dropout层数不易设置过大,过大会导致不收敛,调节步长可以是0.05,一般调整到0.4或者0.5就可找到最佳值。

    以上是个人调参的一些经验,可供参考。

     

    1.无论是cnn还是rnn,batch normalization都有用,不一定结果提高几个点,收敛快多了
    2.数据初始时normalize得好,有时候直接提高2个点,比如cifar10,转到yuv下normalize再scn
    3.loss不降了lr就除10
    4. google的inception系列按它论文里说的永远无法复现

     

     

     

    如何训练深度神经网络?老司机的 15 点建议

      

    导语:印度深度学习专家 Rishabh Shukla 对开发深度神经网络的经验总结。

    本文为印度深度学习专家、创业者 Rishabh Shukla 在 GitHub 上发表的长博文,总结了他过去的开发经验,旨在给新入门的开发者提供指导。雷锋网做了不改变原意的编译。

    在深度学习领域,为了高效训练深度神经网络,有些实践方法被过来人强烈推荐。

    在这篇博文中,我会覆盖几种最常使用的实践方法,从高品质训练数据的重要性、超参数(hyperparameters)到更快创建 DNN(深度神经网络) 原型模型的一般性建议。这些推荐方法中的大多数,已被学术界的研究所证实,并在论文中展示了相关实验、数学证据,比如 Efficient BackProp(Yann LeCun et al.) 和 Practical Recommendations for Deep Architectures(Yoshua Bengio)

    1. 训练数据

    许多 ML 开发者习惯把原始训练数据直接扔给 DNN——为什么不这么做呢?既然任何 DNN (大多数人的假设)仍然能够给出不错的结果,不是吗?但是,有句老话叫“给定恰当的数据类型,一个简单的模型能比复杂 DNN 提供更好、更快的结果”。虽然这有一些例外,但在今天,这句话仍然没有过时。因此,不管你是在计算机视觉( CV),自然语言处理(NLP)还是统计建模(Statistical Modelling)等领域,想要对原始数据预处理,有几个方法可以得到更好的训练数据:

    • 获取越大的数据库越好。DNN 对数据很饥渴,越多越好。

    • 去除所有包含损坏数据的训练样本,比如短文字,高度扭曲的图像,假输出标签,包含许多虚值(null values)的属性。

    • Data Augmentation(数据扩张)——生成新样例。以图像为例,重新调节,增加噪声等等。

    2. 选择恰当的激励函数(activation function)

    激励函数是所有神经网络的核心部分之一。

    激励函数把渴望已久的非线性(non-linearity)加入了模型。多年来,Sigmoid 函数 一直是多数人倾向的选择。但是,Sigmoid 函数不可避免地存在两个缺陷:1. 尾部  sigmoids 的饱和,进一步导致梯度消失。2. 不以 0 为中心(输出在 0 到 1 之间)。

    一个更好的替代选择是 Tanh 函数。数学上来说,Tanh 只是调整、平移过的 Sigmoid 函数:tanh(x) = 2*sigmoid(x) - 1。虽然 Tanh 仍旧存在梯度消失的缺陷,但好消息是:Tanh 以 0 为中心。因此,把 Tanh 作为激励函数能更快地收敛(converge)。我发现使用 Tanh 通常比 Sigmoid 效果更好。

    你还可以探索其他选择,比如 ReLU, SoftSign 等等。对于一些特定任务, 它们能够改善上述问题。

    3. 隐藏单元和隐层(Hidden Units and Layers)的数量

    保留超出最优数量的隐藏单元,一般是比较保险的做法。这是因为任何正则化方法( regularization method)都会处理好超出的单元,至少在某种程度上是这样。在另一方面,保留比最优数量更少的隐藏单元,会导致更高的模型欠拟合(underfitting)几率。

    另外,当采用无监督预训练的表示时(unsupervised pre-trained representations,下文会做进一步解释),隐藏单元的最优数目一般会变得更大。因此,预训练的表示可能会包含许多不相关信息(对于特定任务)。通过增加隐藏单元的数目,模型会得到所需的灵活性,以在预训练表示中过滤出最合适的信息。

    选择隐层的最优数目比较直接。正如 Yoshua Bengio 在  Quora 中提到的:

    “你只需不停增加层,直到测试误差不再减少。”

    4. 权重初始化 (Weight Initialization)

    永远用小的随机数字初始化权重,以打破不同单元间的对称性(symmetry)。但权重应该是多小呢?推荐的上限是多少?用什么概率分布产生随机数字?

    当使用 Sigmoid 激励函数时,如果权重初始化为很大的数字,那么 sigmoid 会饱和(尾部区域),导致死神经元(dead neurons)。如果权重特别小,梯度也会很小。因此,最好是在中间区域选择权重,比如说那些围绕平均值均衡分布的数值。

    幸运的是,已经有许多关于初始权重合适取值的研究。这对于高效的收敛非常重要。为初始化均衡分布的权重,均匀分布(uniform distribution )或许是最好的选择之一。另外,就像论文中所展示的(Glorot and Bengio, 2010),有更多输入连接(fan_in)的单位,应该有相对更小的权重。

    多亏这些十分透彻的试验,现在我们已经有了经过检验的公式,可以直接用来权重的初始化。

    比如说在  ~ Uniform(-r, r) 提取的权重,对于 tanh 激励  r=sqrt(6/(fan_in+fan_out));对于 sigmoid 激励 r=4*(sqrt(6/fan_in+fan_out)) 。fan_in 是上一层的大小, 而 fan_out 是下一层的。

    5. 学习率

    这或许是最重要的超参数之一,调节着学习过程。如果学习率设置得太小,你的模型很可能需要 n 年来收敛。设置得太大,再加上不多的初始训练样本,你的损失可能会极高。一般来说,0.01 的学习率比较保险

    相比固定学习率,在每个周期、或每几千个样例后逐渐降低学习率是另一个选择。虽然这能更快地训练,但需要人工决定新的学习率。一般来说,学习率可以在每个周期后减半。几年前,这种策略十分普遍。

    幸运的是,我们现在有了更好的、基于动能(momentum based)的方法,来调整学习率。这取决于误差函数的曲率。另外,既然有些参数有更快、或更慢的学习速率;它或许能帮助我们针对模型中的单独参数,设定不同的学习率。

    最近有大量关于优化方法的研究,导致了自适应学习率(adaptive learning rates)。目前我们有许多选择,从老式动能方法( Momentum Method ),到  Adagrad、Adam (个人最爱)、 RMSProp 等等。;类似于 Adagrad 或 Adam 的方法,能替我们省去人工选择初始学习率的麻烦;给定合适的时间,模型会开始平滑地收敛。当然,选择一个特别合适的初始学习率仍然能起到帮助作用。

    6. 超参数调参:扔掉网格搜索,拥抱随机搜索

    网格搜索(Grid Search )在经典机器学习中十分普遍。但它在寻找 DNN 的最优超参数方面一点也不高效。这主要是由于 DNN 尝试不同超参数组合所耗费的时间。随着超参数不断增长,网格搜索需要的计算性能会指数级增长

    有两种解决办法:

    1. 取决于你之前的经验,你可以人工对部分常见超参数调参,比如学习率、隐层数目。

    2. 采用随机搜索(random search),或者随机采样代替网格搜索,来选择最优超参数。

    超参数组合通常在期望范围之内、从均匀分布中被选择出来。加入之前获得的知识来进一步缩小搜寻空间,也是有可能的(比如,学习率不应该太大也不应该太小)。大家发现,随机搜索比网格搜索高效地多。

    7. 学习方法

    随机梯度下降( Stochastic Gradient Descent )的老方法也许对于 DNN 不是那么有效率(有例外)。最近,有许多研究聚焦于开发更灵活的优化算法,比如 Adagrad、Adam,、AdaDelta,、RMSProp 等等。在提供自适应学习率之外,这些复杂的方法还对于模型的不同参数使用不同的学习率,通常能有更平滑的收敛。把这些当做超参数是件好事,你应该每次都在训练数据的子集上试试它们。

    8. 权重的维度保持为 2 的幂

    即便是运行最先进的深度学习模型,使用最新、最强大的计算硬件,内存管理仍然在字节(byte)级别上进行。所以,把参数保持在 64, 128, 512, 1024 等 2 的次方永远是件好事。这也许能帮助分割矩阵和权重,导致学习效率的提升。当用 GPU 运算,这变得更明显。

    9. 无监督预训练(Unsupervised Pretraining )

    不管你进行的是 NLP(自然语言处理)、计算机视觉还是语音识别等任务,无监督预训练永远能帮助你训练监督、或其他无监督模型:NLP 中词向量就(Word Vectors)无所不在;你可以用 ImageNet 的数据库,使用无监督方式对你的模型预训练,或是对于两个类别的监督分类;或是更大频域的音频样本,来在扬声器消崎模型(speaker disambiguation model)中使用该信息。

    10. Mini-Batch(小批量) 对比随机学习(Stochastic Learning)

    训练一个模型的主要目的是学习合适的参数,即产生输入到输出的最优映射。这些参数利用每个训练样本进行调参,不管你决定使用 batch, mini-batch 还是随机学习。当采用随机学习方法时,学习每个训练样本后权重的梯度都会进行调参,向梯度加入噪音(随机学习中“随机”的由来)。这样做的结果十分理想,比如说,训练中加入的噪音使得模型更不容易过拟合

    但是,随机学习方法也许效率不高。如今的计算设备有非常可观的运算能力,随机学习很可能会浪费其中的一大部分。如果我们能计算矩阵相乘,那么为什么要限制自己,重复单个矢量组之间的乘法呢?因此,为了更高的吞吐率和更快的学习,我推荐使用 mini-batch 而不是随机学习。

    但是,选择适当的 batch 规模同样重要。所以我们能保留一些噪音(相比大规模 batch),与此同时更高效地利用计算性能。一般来说,包含  16 个到 128 个样例的 batch(2 的幂)是不错的选择。通常,一旦你发现了更重要的超参数(通过随机搜索或是人工搜索),batch 规模就会确性下来。但是,有些场景中模型得到训练数据流(比如网络学习),那么采用随机学习就是不错的选择。

    11. 打乱训练样本

    这来自于信息理论(Information Theory)——“学习到一件不太可能发生的事却发生了,比学习一件很可能发生的事已经发生,包含更多的信息。”同样的,把训练样例的顺序随机化(在不同周期,或者 mini-batch),会导致更快的收敛。如果模型看到的很多样例不在同一种顺序下,运算速度会有小幅提升。

    12. 使用 Dropout 正则化

    如果有数百万的参数需要学习,正则化就是避免 DNN 过拟合的必须手段。你也可以继续使用 L1/L2 正则化,但 Dropout 是检查 DNN 过拟合的更好方式(雷锋网按:Dropout 是指随机让网络某些隐层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分,但是它的权重会保留下来)。执行 Dropout 很容易,并且通常能带来更快地学习。0.5 的默认值是一个不错的选择,当然,这取决于具体任务。如果模型不太复杂,0.2 的 Dropout 值或许就够了。

    在测试阶段,Dropout 应该被关闭,权重要调整到相应大小。只要对一个模型进行 Dropout 正则化,多一点训练时间,误差一定会降低。

    13. 周期 / 训练迭代次数

    “对深度学习模型进行多个周期的训练,会得到更好的模型”——我们经常听到这句话。但多少周期才是“多”呢?其实,这里有一个简单的策略:继续按照一个固定的样例数或者周期训练模型,比如两万个样例或者一个周期。在每批样例之后,比较测试误差(test error)和训练误差(train error),如果它们的差距在缩小,那么继续训练。另外,记得在每批训练之后,保存模型的参数,所以训练好之后你可以从多个模型中做选择。

    14. 可视化

    训练深度学习模型有上千种出差错的方式。我猜大家都遇到过这样的场景:模型已经训练了几个小时或者好几天,然而在训练完成之后,才意识到某个地方出问题了。为了不让你自己神经错乱,一定要对训练过程作可视化处理。比较显而易见的措施是保存或打印损失值、训练误差、测试误差等项目的日志。

    在此之外,一个很好的措施是采用可视化库(visualization library ),在几个训练样例之后、或者周期之间,生成权重柱状图。这或许能帮助我们追踪深度学习模型中的一些常见问题,比如梯度消失与梯度爆发(Exploding Gradient)。

    15. 使用支持 GPU 和自动微分法 (Automatic Differentiation)的库

    谢天谢地,对于快速创建原型模型,我们已经有了相当不错的库,比如 Theano, Tensorflow, Keras 等等。几乎所有这些深度学习库支持 GPU 计算和自动微分法。所以,你不需要深入研究核心 GPU 编程技术(除非你想——这绝对很有意思)。你也不需要写自己的微分代码——在非常复杂的模型上这相当费劲(但若需要,你应该有能力去做)。 Tensorflow还提供了分布式计算的支持——如果你是土豪的话.

    展开全文
  • 贝叶斯优化: 一更好的超参数调优方式

    万次阅读 多人点赞 2018-10-08 13:24:03
    本文受 浅析 Hinton 最近提出的 Capsule 计划 启发,希望以更通俗的方式推广机器学习算法,让数学基础和编程能力的人能够乐享其中。 目前人工智能和深度学习越趋普及,大家可以使用开源的Scikit-learn、...

    简介

    本文受 浅析 Hinton 最近提出的 Capsule 计划 启发,希望以更通俗的方式推广机器学习算法,让有数学基础和编程能力的人能够乐享其中。

    目前人工智能和深度学习越趋普及,大家可以使用开源的Scikit-learn、TensorFlow来实现机器学习模型,甚至参加Kaggle这样的建模比赛。那么要想模型效果好,手动调参少不了,机器学习算法如SVM就有gamma、kernel、ceof等超参数要调,而神经网络模型有learning_rate、optimizer、L1/L2 normalization等更多超参数可以调优。

    很多paper使用一个新的模型可以取得state of the art的效果,然后提供一组超参数组合方便读者复现效果,实际上这些超参数都是“精挑细选”得到的,背后有太多效果不好的超参数尝试过程被忽略,大家也不知道对方的超参数是如何tune出来的。因此,了解和掌握更好的超参数调优方法在科研和工程上是很有价值的,本文将介绍一种更好的超参数调优方式,也就是贝叶斯优化(Bayesian Optimization),以及开源调参服务Advisor的使用介绍。

    超参数介绍

    首先,什么是超参数(Hyper-parameter)?这是相对于模型的参数而言(Parameter),我们知道机器学习其实就是机器通过某种算法学习数据的计算过程,通过学习得到的模型本质上是一些列数字,如树模型每个节点上判断属于左右子树的一个数,或者逻辑回归模型里的一维数组,这些都称为模型的参数。

    那么定义模型属性或者定义训练过程的参数,我们称为超参数,例如我们定义一个神经网络模型有9527层网络并且都用RELU作为激活函数,这个9527层和RELU激活函数就是一组超参数,又例如我们定义这个模型使用RMSProp优化算法和learning rate为0.01,那么这两个控制训练过程的属性也是超参数。

    显然,超参数的选择对模型最终的效果有极大的影响。如复杂的模型可能有更好的表达能力来处理不同类别的数据,但也可能因为层数太多导致梯度消失无法训练,又如learning rate过大可能导致收敛效果差,过小又可能收敛速度过慢。

    那么如何选择合适的超参数呢,不同模型会有不同的最优超参数组合,找到这组最优超参数大家会根据经验、或者随机的方法来尝试,这也是为什么现在的深度学习工程师也被戏称为“调参工程师”。根据No Free Lunch原理,不存在一组完美的超参数适合所有模型,那么调参看起来是一个工程问题,有可能用数学或者机器学习模型来解决模型本身超参数的选择问题吗?答案显然是有的,而且通过一些数学证明,我们使用算法“很有可能”取得比常用方法更好的效果,为什么是“很有可能”,因为这里没有绝对只有概率分布,也就是后面会介绍到的贝叶斯优化。

    自动调参算法

    说到自动调参算法,大家可能已经知道了Grid search(网格搜索)、Random search(随机搜索),还有Genetic algorithm(遗传算法)、Paticle Swarm Optimization(粒子群优化)、Bayesian Optimization(贝叶斯优化)、TPE、SMAC等。

    这里补充一个背景,机器学习模型超参数调优一般认为是一个黑盒优化问题,所谓黑盒问题就是我们在调优的过程中只看到模型的输入和输出,不能获取模型训练过程的梯度信息,也不能假设模型超参数和最终指标符合凸优化条件,否则的话我们通过求导或者凸优化方法就可以求导最优解,不需要使用这些黑盒优化算法,而实际上大部分的模型超参数也符合这个场景。其次是模型的训练过程是相对expensive的,不能通过快速计算获取大量样本,我们知道DeepMind用增强学习模型DQN来打Atari游戏,实际上每一个action操作后都能迅速取得当前的score,这样收集到大量样本才可以训练复杂的神经网络模型,虽说我们也可以用增强学习来训练超参数调优的模型,但实际上一组超参数要训练一个模型需要几分钟、几小时、几天甚至几个月的时间,无法快速获取这么多样本数据,因此需要有更“准确和高效”的方法来调优超参数。

    像遗传算法和PSO这些经典黑盒优化算法,我归类为群体优化算法,也不是特别适合模型超参数调优场景,因为需要有足够多的初始样本点,并且优化效率不是特别高,本文也不再详细叙述。

    目前业界用得比较多的分别是Grid search、Random search和Bayesian Optimization。网格搜索很容易理解和实现,例如我们的超参数A有2种选择,超参数B有3种选择,超参数C有5种选择,那么我们所有的超参数组合就有2 * 3 * 5也就是30种,我们需要遍历这30种组合并且找到其中最优的方案,对于连续值我们还需要等间距采样。实际上这30种组合不一定取得全局最优解,而且计算量很大很容易组合爆炸,并不是一种高效的参数调优方法。

    业界公认的Random search效果会比Grid search好,Random search其实就是随机搜索,例如前面的场景A有2种选择、B有3种、C有5种、连续值随机采样,那么每次分别在A、B、C中随机取值组合成新的超参数组合来训练。虽然有随机因素,但随机搜索可能出现效果特别差、也可能出现效果特别好,在尝试次数和Grid search相同的情况下一般最值会更大,当然variance也更大但这不影响最终结果。在实现Random search时可以优化,过滤随机可能出现过的超参数组合,不需要重复计算。

    实际上Grid search和Random search都是非常普通和效果一般的方法,在计算资源有限的情况下不一定比建模工程师的个人经验要好,接下来介绍的Bayesian Optimization就是“很可能”比普通开发者或者建模工程师调参能力更好的算法。首先贝叶斯优化当然用到了贝叶斯公式,这里不作详细证明了,它要求已经存在几个样本点(同样存在冷启动问题,后面介绍解决方案),并且通过高斯过程回归(假设超参数间符合联合高斯分布)计算前面n个点的后验概率分布,得到每一个超参数在每一个取值点的期望均值和方差,其中均值代表这个点最终的期望效果,均值越大表示模型最终指标越大,方差表示这个点的效果不确定性,方差越大表示这个点不确定是否可能取得最大值非常值得去探索。因此实现贝叶斯优化第一步就是实现高斯过程回归算法,并且这里可以通过类似SVM的kernel trick来优化计算,在后面的开源项目Advisor介绍中我们就使用Scikit-learn提供的GaussianProgressRegressor,最终效果如下图,在只有3个初始样本的情况下我们(通过100000个点的采样)计算出每个点的均值和方差。

    从曲线可以看出,中间的点均值较大,而且方差也比较大,很有可能这个点的超参数可以训练得到一个效果指标好的模型。那为什么要选均值大和方差大的点呢?因为前面提到均值代表期望的最终结果,当然是越大越好,但我们不能每次都挑选均值最大的,因为有的点方差很大也有可能存在全局最优解,因此选择均值大的点我们成为exploritation(开发),选择方差大的点我们称为exploration(探索)。那么究竟什么时候开发什么时候探索,并且开发和探索各占多少比例呢?不同的场景其实是可以有不同的策略的,例如我们的模型训练非常慢,只能再跑1组超参数了,那应该选择均值较大的比较有把握,如果我们计算力还能可以跑1000次,那么就不能放弃探索的机会应该选择方差大的,而至于均值和方差比例如何把握,这就是我们要定义的acquisition function了。acquisition function是一个权衡exploritation和exploration的函数,最简单的acquisition function就是均值加上n倍方差(Upper condence bound算法),这个n可以是整数、小数或者是正数、负数,更复杂的acquisition function还有Expected improvement、Entropy search等等。在原来的图上加上acquisition function曲线,然后我们求得acquisition function的最大值,这是的参数值就是贝叶斯优化算法推荐的超参数值,是根据超参数间的联合概率分布求出来、并且均衡了开发和探索后得到的结果。

    因此如果我们使用贝叶斯优化,那么我们下一个点就取中间偏左的点,使用这个点代表的超参数来训练模型,并且得到这个模型在这住超参数组合下的效果指标。有了新的指标,贝叶斯优化模型的样本就从3个变成了4个,这样可以重新计算超参数之间的后验概率分布和acquisition function,效果如下图。

    从均值和方差曲线看出,目前右边的点均值不低,并且方差是比较大,直观上我们认为探索右边区域的超参数是“很可能”有价值的。从acquisition function曲线我们也可以看出,右边的点在考虑了开发和探索的情况下有更高的值,因此我们下一个超参数推荐就是右边星号的点。然后我们使用推荐的超参数继续训练,得到新的模型效果指标,加入到高斯过程回归模型里面,得到新的均值-方差曲线和acquisition function曲线。

    通过不断重复上述的步骤,我们的曲线在样本极少的情况下也可以毕竟最终真实的曲线。当然上面的图是在一个黑盒优化问题上模拟的,因此我们知道真实的曲线形状,现实的机器学习模型的超参数间不一定能画出完整的曲线,但通过符合联合高斯概率分布的假设,还有高斯过程回归、贝叶斯方程等数学证明,我们可以从概率上找到一个“很可能”更好的超参数,这是比Grid search或者Random search更有价值的方法。

    注意,前面提到的Bayesian Optimization等超参数优化算法也是有超参数的,或者称为超超参数,如acquisition function的选择就是可能影响超参数调优模型的效果,但一般而言这些算法的超超参数极少甚至无须调参,大家选择业界公认效果比较好的方案即可。

    Google Vizier

    前面已经介绍了Grid search、Random search和Bayesian Optimization等算法,但并不没有完,因为我们要使用这些自动调参算法不可能都重新实现一遍,我们应该关注于自身的机器学习模型实现而直接使用开源或者易用的调参服务。

    近期Google就开放了内部调参系统Google Vizier的论文介绍,感兴趣可以在这里阅读paper https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46180.pdf

    与开源的hyperopt、optunity不同,Vizier是一个service而不是一个library,也就是算法开发者不需要自己部署调参服务或者管理参数存储,只需要选择合适的调参算法,如贝叶斯优化,然后Vizier就会根据模型的一些历史指标推荐最优的超参数组合给开发者,直接使用这些超参数会比自己瞎猜或者遍历参数组合得到的效果更好。当然开发者可以使用Vizier提供的Algorithm Playground功能实现自己的自动调参算法,还有内置一些EarlyStopAlgorithm也可以提前发现一些“没有前途”的调优任务提前结束剩下计算资源。

    目前Google Vizier已经支持Grid search、Random search已经改良过的Bayesian optimization,为什么是改良过的呢?前面提到贝叶斯优化也需要几个初始样本点,这些样本点一般通过随机搜索要产生,这就有冷启动的代价了,Google将不同模型的参数都归一化进行统一编码,每个任务计算的GaussianProcessRegressor与上一个任务的GaussianProcessRegressor计算的残差作为目标来训练,对应的acquisition function也不是简单的均值乘以n倍方差了,这相当于用了迁移学习模型的概念,从paper的效果看基本解决了冷启动的问题,这个模型被称为(Stacked)Batch Gaussian Process Bandit。

    Google Vizier除了实现很好的参数推荐算法,还定义了Study、Trial、Algorithm等非常好的领域抽象,这套系统也直接应用到Google CloudML的HyperTune subsystem中,开发者只需要写一个JSON配置文件就可以在Google Cloud上自动并行多任务调参了。

    Advisor开源项目

    Google Vizier是目前我看过最赞的超参数自动调优服务,可惜的是它并没有开源,外部也只有通过Google CloudML提交的任务可以使用其接口,不过其合理的基础架构让我们也可以重现一个类似的自动调参服务。

    Advisor就是一个Google Vizier的开源实现,不仅实现了和Vizier完全一致的Study、Trial、Algorithm领域抽象,还提供Grid search、Random search和Bayesian optimization等算法实现。使用Advisor很简单,我们提供了API、SDK、Web以及命令行等多种访问方式,并且已经集成Scikit-learn、XGBoost和TensorFlow等开源机器学习框架,基本只要写一个Python函数定义好模型输入和指标就可以实现任意的超参数调优(黑盒优化)功能。

    Advisor使用Python实现,基于Scikit-learn的GPR实现了贝叶斯优化等算法,也欢迎更多开发者参与,开源地址 tobegit3hub/advisor 。

    Advisor在线服务

    hypertune.cn 是我们提供的在线超参数推荐服务,也是体验Advisor调参服务的最好入口,在网页上我们就可以使用所有的Grid search、Random search、Bayesian optimization等算法功能了。

    首先打开 http://hypertune.cn , 目前我们已经支持使用Github账号登录,由于还没有多租户权限隔离因此不需要登录也可以访问全局信息。在首页我们可以查看所有的Study,也就是每一个模型训练任务的信息,也可以在浏览器上直接创建Study。

    这里需要用户定义Study configuration,也就是模型超参数的search space,和Google Vizier一样我们支持Double、Integer、Discrete和Categorical四种类型的超参数定义,基本涵盖了数值型、字符串、连续型以及离散型的任意超参数类别,更详细的例子如下图。

    定义好Study好,我们可以进入Study详情页,直接点击“Generate Suggestions”按钮生成推荐的超参数组合,这会根据用户创建Study选择的调参算法(如BayesianOptimization)来推荐,底层就是基于Scikit-learn实现的联合高斯分布、高斯过程回归、核技巧、贝叶斯优化等算法实现。

    当然我们也可以使用Grid search、Random search等朴素的搜索算法,生成的Trial就是使用的该超参数组合的一次运行,默认是没有objective value的,我们可以在外部使用该超参数进行模型训练,然后把auc、accuracy、mean square error等指标在网页上回填到参数推荐服务,下一次超参数推荐就会基于已经训练得到模型数据,进行更优化、权衡exploritation和exploration后的算法推荐。对于Eearly stop算法,我们还需要每一步的性能指标,因此用户可以提供Training step以及对应的Objective value,进行更细化的优化。

    除了提供在网页上集成推荐算法,我们也集成了Scikit-learn、XGBoost和TensorFlow等框架,在命令行只要定义一个函数就可以自动实现创建Study、获取Trial以及更新Trial metrics等功能,参考 https://github.com/tobegit3hub/advisor/tree/master/examples 。对于贝叶斯优化算法,我们还提供了一维特征的可视化工具,像上面的图一样直观地感受均值、方差、acquisition function的变化,参考 https://github.com/tobegit3hub/advisor/tree/master/visualization 。

    总结

    本文介绍了一种更好的超参数调优方法,也就是贝叶斯优化算法,并且介绍了Google内部的Vizier调参服务以及其开源实现Advisor项目。通过使用更好的模型和工具,可以辅助机器学习工程师的建模流程,在学术界和工业界取得更多、更大的突破。

    如果你有更好的超参数推荐算法,不妨留言,我们有能力实现并且让更多人用上 :)

    展开全文
  • 贝叶斯优化神经网络参数The purpose of this work is to optimize the neural network model hyper-parameters to estimate facies classes from well logs. I will include some codes in this paper but for a ...
  • 积神经网络(CNN)的参数优化方法

    千次阅读 2020-12-22 12:42:57
    http://blog.csdn.net/u010900574/article/details/51992156著名:本文是从 Michael Nielsen的电子书Neural Network and Deep Learning的深度学习那一章的卷积神经网络参数优化方法的一些总结和摘录,并不是我自己...
  • 基于PyTorch深度学习框架用简单快捷的方式搭建出复杂的神经网络模型,同时让模型参数优化方法趋于高效。如同使用PyTorch中的自动梯度方法一样,在搭建复杂的神经网络模型的时候,我们也可以使用PyTorch中已定义的...
  • 使用Optuna进行超参数优化

    千次阅读 2021-11-03 10:36:27
    参数优化是一项艰巨的任务。 但是使用 Optuna 等工具可以轻松应对。 在这篇文章中,我将展示如何使用 Optuna 调整 CatBoost 模型的超参数。 Optuna 的超参数调整可视化 超参数 常规参数是在训练期间通过机器学习...
  • [机器学习] 超参数优化介绍

    万次阅读 多人点赞 2019-04-18 10:47:53
    如果方式可以帮助工程师找到最优的参数组合,那一定大有裨益,贝叶斯超参优化就是其中的一。如果是单单罗列公式,可能会显得乏味,就用一些思考带上公式为大家分享。 目前在研究Automated Machine Learning...
  • 卷积神经网络(CNN)的参数优化方法

    万次阅读 多人点赞 2019-06-08 19:32:17
    积神经网络参数优化方法——调整网络结构是关键!!!你只需不停增加层,直到测试误差不再减少. 著名:本文是从 Michael Nielsen的电子书Neural Network and Deep Learning的深度学习那一章的卷积神经网络参数...
  • 二是优化参数的方法。线性回归就是想让各个样本点离画出来的直线的平均距离尽可能短。而逻辑回归则不是算平均距离。它是用概率来优化的。优化方法叫做极大似然法。还是不懂要优化什么参数?和怎么优化的?看下面的:...
  • 卷积神经网络参数优化策略(一)

    千次阅读 2020-05-14 11:20:53
    力争用数据给大家一个关于正则化,增加卷积层/全连接数,弃权技术,拓展训练集等参数优化方法的效果。 提高泛化能力的方法,一般来说,提高泛化能力的方法主要以下几个: 正则化 增加神经网络层数 使用正确的代价...
  • 算法模型自动超参数优化方法!

    千次阅读 2020-12-22 19:57:32
    什么是超参数?学习器模型中一般有两参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter)。还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(...
  • 本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下:1、EXPLAIN做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。下面来个简单的示例,标注(1、2、3、4、5)我们要重点关注的数据:type列,连接类型。一个...
  • Hyperopt 参数优化

    万次阅读 多人点赞 2018-08-28 20:02:03
    Hyperopt(Hyper-parameter Optimization)用于模型选择和参数优化参数选择在训练模型时是一个很关键的部分。然而存在这样的问题,一方面参数选择背后包含着一定的数学原理,对于新手来说难上手;另一方面,一个...
  • Mysql参数优化对于不同的网站,及在线量等,以及机器硬件的配置都关系,优化不可能一次性完成,需要不断的观察以及调试,才可能的得到最佳的效果 Mysql参数优化对于不同的网站,及在线量等,以及机器硬件的配置...
  • 参数优---贝叶斯优化及其改进(PBT优化

    千次阅读 多人点赞 2020-01-08 21:14:34
    自动机器学习超参数调整(贝叶斯优化)—介绍了例子 贝叶斯优化(Bayesian Optimization)深入理解 贝叶斯优化(BayesianOptimization) 简介 所谓优化,实际上就是一个求极值的过程,数据科学的很多时候就是求极值...
  • 史上最强Tomcat8性能优化

    万次阅读 多人点赞 2019-10-25 15:33:32
    文章目录授人以鱼不如授人以渔目的服务器资源Tomcat配置优化Linux环境安装运行Tomcat8AJP连接执行器(线程池)3运行模式部署测试用的web项目查看服务器信息部署web应用使用Apache JMeter进行性能测试下载安装修改...
  • java 传递参数两种方式

    万次阅读 多人点赞 2015-10-19 15:39:28
    Java中没有指针,所以也没有引用传递了,仅仅值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能  值传递:方法调用时,实际参数把它的值传递给对应...
  • Tomcat 调优及 JVM 参数优化

    千次阅读 2019-06-28 16:06:48
    目录 ...4、常见的 Java 内存溢出以下三 Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你。对于操作系统优化来说,是尽...
  • 在本文的前部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三不同的机器学习模型并比较了它们的性能。 在第2部分中,我们看到使用随机森林和...
  • 算法介绍神经网络是一运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一特定的输出函数,称为激励函数(activation function)。每个节点间的连接都代表一个对于通过该连接信号的加权值,称...
  • sql优化常用的几方法

    千次阅读 2022-02-16 15:31:55
    本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 1、EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。 下面来个简单的示例,标注(1、2、3、4、5)我们要重点关注的数据: type列,...
  • A Machine learning model has two types of tunable parameter : 机器学习模型具有两种可调参数: · Model parameters ·型号参数 · Model hyperparameters ·模型超参数 source) 源 ) Model parameters are ...
  • MySQL数据库优化的八方式(经典必看)

    万次阅读 多人点赞 2019-03-13 15:48:28
    MySQL数据库优化的八方式(经典必看) 引言: 关于数据库优化,网上不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿...
  • 第七章 网络优化与正则化

    千次阅读 2020-02-07 21:13:22
    网络优化与正则化网络优化网格优化的难点网络结构多样性高维变量的非凸优化优化算法小批量梯度下降批量大小选择学习率调整学习率衰减学习率预热...梯度估计修正参数初始化数据预处理逐层归一化超参数优化网络正则化总结...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 258,134
精华内容 103,253
关键字:

网络优化参数一般有两种类型