导航:首页 > 源码编译 > 神经网络超参数优化算法

神经网络超参数优化算法

发布时间:2022-09-19 20:31:53

⑴ 贝叶斯神经网络

通过优化的标准神经网络训练(从概率的角度来看)等同于权重的最大似然估计(MLE)。由于许多原因,这往往是不能令人满意的 —— 使用 MLE 会忽略在适当的权重值中可能存在的任何不确定性,即无法正确评估训练数据中的不确定性,从实际的角度来看,这种类型的训练容易出现过拟合现象。

对此的一个解决方案是引入正则化(从贝叶斯的角度来看,这相当于在权重上引入先验)。如果我们可以通过规范模型来解决过度自信决策和防止模型过度拟合的问题,那为什么我们需要贝叶斯神经网络?答案是: 当前神经网络架构中缺少预测中的不确定性度量,但贝叶斯神经网络将其纳入其中 。BNN 在特定环境中很重要,特别是当我们非常关心不确定性时,贝叶斯方法自然地解释了参数估计中的不确定性,并且可以将这种不确定性传播到预测中。

深度神经网络已成功应用于许多领域,包括非常敏感的领域,如医疗保健,安全性,欺诈性交易等等。这些领域在很大程度上依赖于模型的预测准确性,甚至一个过度自信的决策也可能导致一个大问题。此外,这些领域具有非常不平衡的数据集(百万个交易中的一个是欺诈性交易,百分之五的癌症检测结果是阳性,不到百分之一的电子邮件是垃圾邮件),容易导致该模型过度拟合。

从概率论的角度来看,使用单点估计权重以进行分类是不合理的。而贝叶斯神经网络对于过拟合更加鲁棒,并且可以从小数据集中轻松学习。 贝叶斯方法将其参数以概率分布的形式表示以提供不确定性估计;同时,通过使用先验概率分布的形式来表示参数,训练期间在许多模型上计算平均值,这给网络提供了正则化效果,从而防止过度拟合

在标准神经网络中,权重由单个点表示。 而贝叶斯神经网络以分布形式表示权重,如下图所示:

即使使用少量参数,在贝叶斯神经网络中推断后验模型也是一项艰巨的任务,因此通常使用后验模型的近似值,变分推理是一种流行的方法。人们将使用简单的变分分布(例如高斯分布)对后验进行模拟,并尝试调整分布的参数使其尽可能接近真实的后验 —— 通过最小化这种简单变分分布和真实后验之间的 KL 散度来完成。

但是用于逼近 BNN 后验的变分方法在计算上可能相当昂贵,因为使用近似分布会大大增加模型参数的数量,但不会大幅增加模型容量。例如,使用 BNN 后验近似的高斯分布,模型参数的数量增加了一倍,但报告了与使用丢失的传统方法相同的预测性能。 这使得该方法在实践中不适合与 CNN 一起使用,因为参数数量的增加太昂贵。

关于神经网络权重的精确贝叶斯推断是难以处理的,因为参数的数量非常大,并且神经网络的函数形式不适合精确积分。 因此,我们用变分概率分布 q θ (w | D) 逼近难以处理的真实后验概率分布 p(w | D),它包括高斯分布的性质 μ∈ℝ d 和 σ∈ℝ d ,表示为 N(θ | μ,σ²),其中 d 是定义概率分布的参数总数。 这些高斯变分后验概率分布的形状由它们的方差 σ² 确定,表示每个模型参数的不确定性估计。

在观察数据之前定义先验概率分布,一旦观察到数据(训练数据),学习就发生并且分布变换为后验分布。 利用概率论从数据中学习构成了贝叶斯学习的基础。贝叶斯定理如下:

P(θ | x) 为后验概率,也是我们想要计算的;P(θ) 为先验概率,在训练数据之前就是已知的;P(x | θ) 为可能性,显示了数据分布;P(x) 为证据,我们只能通过对所有可能的模型值积分来计算其值:

这使得问题变得棘手,因此我们采用变分近似来找到近似贝叶斯后验分布。

首先,我们的原始目标是,需要根据已有数据推断需要的分布 p;当 p(下图中黄色区域)不容易表达,不能直接求解时,可以尝试用变分推断的方法, 即,寻找容易表达和求解的分布 q(下图中红线和绿线构成的区域),当 q 和 p 的差距很小的时候,q 就可以作为 p 的近似分布,成为输出结果了。例如,我们用 q θ (w | D) 来近似 p(w | D)。首先注意 q θ (w | D) 的表达,其中 w 是变量,θ 是后验概率分布 q 的参数。所以在构造 q 的时候也分两步:第一,概率分布的选择;第二,参数的选择。第一步,我们在选择 q 的概率分布时,通常会直观选择 p 可能的概率分布,这样能够更好地保证 q 和 p 的相似程度。例如高斯混合模型中,原始假设 p 服从高斯分布,则构造的 q 依然服从高斯分布。之后,我们通过改变 θ,使得 q 不断逼近 p。

我们希望尽可能接近真正的分布,这可以通过最小化两者之间的 Kullback-Liebler(KL)散度来做到这一点。然而 KL 的表达式中依然有一部分不可求的后验概率,这个问题仍然是棘手的,所以用到了 ELBO:

但是由于积分的存在,这个公式仍然难以解决。此时,我们可以从近似函数 q θ (w | D) 中进行采样,因为从近似函数中采样权值要比真正的后验函数 p(w | D) 更容易。这样得到容易计算的函数:

这些采样权值 w 被用于神经网络的反向传播,学习后验分布。

贝叶斯建模中,存在两种类型的不确定:偶然不确定性和认知不确定性。

可以通过在模型参数或模型输出上放置概率分布来估计不确定性 。通过在模型的权重上放置先验分布,然后尝试捕获这些权重在给定数据的情况下变化多少来模拟认知不确定性。另一方面,通过在模型的输出上放置分布来模拟偶然不确定性。

传统神经网络常使用反向传播来训练。对于 BNN,其自然地解释了参数估计中的不确定性,并且可以将这种不确定性传播到预测结果中;此外,对参数值进行取平均而不是仅选择单点估计值使得模型不易出现过拟合。因此,对 BNN 参数的训练也需要特殊的训练方法,Bayes by Backprop 就是其中一种(它也是一种变分推断)。

Bayes by Backprop 用来学习神经网络权重的概率分布。它是一种变分推理方法,用于学习神经网络权重 w ~ q θ (w | D) 的后验分布,可以在反向传播中对权重 w 进行采样。整个方法可归纳如下:

由于参数数目较大,所以需要对模型权重进行适当的修剪。模型修剪减少了深度神经网络的各种连接矩阵中的稀疏性,从而减少了模型中有价值的参数的数量。模型修剪的整个想法是减少参数的数量而不会损失模型的准确性。最常用的修剪模型的方法是将低贡献权重映射到零并减少整体非零值权重的数量,可以通过训练大型稀疏模型并进一步修剪来实现。

(这部分内容摘自 一个例子搞清楚 先验分布/后验分布/似然估计 )

给定一些数据样本 x,假定我们知道样本是从某一种分布中随机取出的,但我们不知道这个分布具体的参数 θ。

因为给定样本 x 后, p(x) 会在 θ 空间上为一个定值,和 θ 的大小没有关系,所以可以省略分母 p(x)。 可化简为:

p(x) 相当于是一个归一化项,整个公式就表示为: Posterior∝(Likelihood∗Prior)(后验概率 正比于 先验概率 ∗ 似然函数)

需要一提的是,对贝叶斯 CNN 而言,不仅在卷积层中将概率分布置于权重上,还要求在全连接层中将概率分布置于权重上。

假设权重的变分后验概率分布 q θ (w ijhw | D) = N(μ ijhw ,α ijhw μ 2 ijhw )(其中,i 和 j 分别对应输入和输出层数,h 和 w 分别对应过滤器的高度和宽度),那么卷积公式被重定义为:

其中,ε j ~ N(0,1),A i 为过滤器在第 i 层要卷积的部分,b j 为相应的第 j 层的激活值,∗ 为卷积操作,⊙ 为元素乘法(component-wise multiplication)。

对 CNN 的权重应用概率分布而非单点值,并且要在反向传播时更新变分后验概率分布 q θ (w | D),关键在于过滤器会执行两次卷积操作(在单点预测的 CNN 中只执行一次卷积)。

从前面的公式我们看到,卷积操作的输出 b 是期望 μ ijhw 和方差 α ijhw μ 2 ijhw 的函数,因此我们可以分别计算出 μ ijhw 和 α ijhw μ 2 ijhw 的值,从而可以得到一个高斯概率分布。方法就是执行两次卷积操作:第一次,我们将 b 视为通过频率推理更新的 CNN 的输出,将单点估计值解释为变分后验概率分布的期望;第二次,我们将得到方差。通过这种方式,我们确保每个卷积操作只更新一个参数(第一次为 μ ijhw ,第二次为 α ijhw ),这与通过频率推断更新的 CNN 完全相同。

实际上,当我们执行第一次卷积操作,我们得到的是 q θ (w | D) 的最大后验概率,而第二次卷积操作则是得出权重 w 偏离了最大后验概率多少。另外,为了加速计算,确保方差 α ijhw μ 2 ijhw 为非零正数,并提到准确度,我们学习 logα ijhw 并使用 Softplus 激活函数。

在分类任务中,我们关注的是 P D (y* | x*);对于贝叶斯神经网络,其被表示为:

在 Bayes by Backprop 中,q θ (w | D) ~ N(w | μ, σ 2 ),而 θ = {μ, σ} 在数据集 D = {x i , y i } n i=1 的训练中学习得到。由于分类问题多是离散的,因此:

其中,Σ c f(x c ∗ | w) = 1,C 为总类数。通过从 q θ (w | D) 取样,可以获得期望值的无偏估计:

T 为样本数量。这个估计值允许我们评估预测值的不确定性,因此称为预测方差,用 Var q 表示:

这个值可以进一步分为偶然不确定性和认知不确定性:

由于贝叶斯 CNN 中的权重都由期望和方差来表示其分布,因此,相较于单点估计 CNN,贝叶斯 CNN 的参数数量翻了一倍。为了使贝叶斯 CNN 参数数量等于传统 CNN,可以使 BCNN 的过滤器数目减半。

另一种模型修剪的技术是对每层的权重使用 L1 归一化。通过 L1 归一化,我们使各模型层中的权重向量变得非常稀疏,即大部分矩阵元素变得接近零;同时,剩余的非零元素则捕获数据的最重要特征。我们设置一个阈值,如果该值低于阈值,则使权重为零。通过只保留非零权重,可以减少模型的参数数量,而不会影响模型的整体性能。

看了一些国内的论文,将贝叶斯应用于 BP 神经网络优化,往往是利用贝叶斯定理寻找最优神经网络参数,以解决神经网络权值易陷入局部最优的问题,同时也能解决神经网络过拟合。其中心思想在于: 根据给定的先验分布,利用贝叶斯定理考察神经网络参数的不确定性,从样本数据中,获得网络结构的后验概率,那么,使得该后验概率最大化的网络参数即为所需的最优参数 (我认为这其实是 MAP 而非贝叶斯估计)。最优参数定义为:

为方便计算,对后验概率取对数得到:

假设先验概率分布 p(w) 满足高斯分布:

则有:

上式中,似然函数部分对应于目标函数中的适应度函数,而先验概率部分对应于正则项,因此我们可以通过确定先验概率得到正则项,从而对神经网络的目标函数进行优化,进而有效控制网络规模,提高网络泛化能力。

后验分布是人们在获得样本数据 D 之后对参数 w 的一种调整。 贝叶斯把上一步得到的后验分布信息储存起来,在将来做推测时,上一步的后验信息就成为了先验信息 ,这样持续数次操作之后,样本数据的预测结果会一直进行调整,最后对参数估计的结果精确度更高。

神经网络中最重要的两个性能参数就是权值和阈值,而这两个参数的分布情况受到了目标函数中超参数的控制,但一般的算法不能确定超参数的取值。可以利用贝叶斯定理来求取目标函数的超参数,并且要求达到自主调节超参数取值的目标,并且通过持续的调整最后找到最优的取值,相应的确定 BP 神经网络的最优权值和阈值。

⑵ 百度知道

为了训练的需要,要不然会出差错

1. 背景介绍

近些年来,随着Siri的走红,类似Siri、搜狗语音助手这样利用语音实现控制,语义理解的系统开始大量涌现。而语音识别系统作为这类系统的入口,很大程度上决定了这类应用的质量。没有一个好的语音识别系统做支撑,再好的助手也只能干瞪眼。

与此同时,随着微信的发展,越来越多的用户反馈,在多种场合下不方便收听语音,需要将语音转换成文字。许多微信公众号也表示需要将语音识别成文字,以便进一步的处理。在此形势下,提高我司现有语音识别系统的准确率成为了迫切的任务。

之前主流的语音识别系统都是采用HMM-GMM技术。近些年来,随着深度神经网络(Deep neural network)技术的的发展,越来越多的系统采用HMM-DNN技术。这项技术把描述特征发射概率的模型从混合高斯模型(GMM)替换为深度神经网络(DNN),从而使系统的错误率下降了20%~30%。

2. 相关产品

当前市场上的采用DNN技术的主要竞品有讯飞的相关产品,包括讯飞语音输入法和讯飞口讯等产品、以及某互联网公司的输入法等。

科大讯飞是当前语音行业的领航者,在语音行业有十几年的历史,在Siri推出前就已经推出了讯飞语音输入法等产品,在数据积累方面具有其他公司无法比拟的优势。而行业内另一家互联网公司则是声称国内最早将DNN技术应用到语音识别产品中的公司。

3. 技术介绍

3.1 深度神经网络

为了描述神经网络,我们先介绍最简单的神经网络,该神经网络只由一个神经元构成,如图1所示。

图1 神经元
图1所示的神经元接受3个输入,x1,x2,x3,和一个偏置+1, 其输出为

其中Wi 为xi在输入中的权重。函数f(x)被称作激活函数。

图2. 神经网络

神经网络将许多个单一的神经元连接在一起,如图2所示。神经网络最左边的一层叫做输入层,最右的一层叫做输出层。中间节点组成的一层叫做隐藏层.

3.2 深度神经网络在声学模型中的应用

深度神经网络则是层数较多的神经网络。虽然神经网络很早之前就已经提出,但因为计算量的问题,神经网络的层数一直无法提升。近年来随着神经网络理论的进一步发展和计算能力的不断提高,特别是GPU的出现,才使得深度神经网络得以发挥其威力。

图3. 使用DNN作为声学模型[1]

图3说明了DNN是如何替代GMM应用到声学模型中的。图3中上半部分是HMM的结构,HMM的结构和转移概率是HMM-GMM模型训练的结果。图3中间部分是描述了一个DNN,这个DNN模型来决定HMM的发射概率。通常情况下这个DNN模型的层数不会小于5层,每层大概数千个神经元组成。图3中的下半部分是DNN模型的输入,需要注意的是DNN模型的输入是多帧特征,而不是GMM模型中一帧。在识别语音的过程中,一小段语音都会被提取成上图中所对应的Observation,并根据HMM中的状态计算发射概率(也就是跟不同的发音比较相似度),选择发射概率最大路径作为最终的结果。

图4. DNN声学模型的训练流程

图4说明了DNN声学模型的训练流程。在训练DNN模型之前,我们首先训练出一个HMM-GMM模型来做强制对齐(forced alignment)。强制对齐的结果作为DNN训练的样本提交GPU上训练DNN模型,这个过程包含了两部分,首先是基于GPU的Pretrain,使神经网络有一个好的起点。然后使用BP算法对神经网络进行Fine Tuning,得到最终的模型。

3.3 DNN训练与识别系统的工程优化

DNN网络具有数据巨大的参数需要学习,每一层网络都有数百万的参数,而下一层网络的输入又是上一层网络的输出,通常情况下训练一个3.2节中所述的声学模型需要近两千个CPU内核运行近一个月。此外,由于声学模型所用到的DNN较为特殊:每一层的一个神经元都依赖上一层的所有神经元,因此,如果把模型不同层次切分到不同的服务器上分别进行训练的话,会带来巨大的网络开销,使系统实际上不可用,因此我们在训练DNN的过程中使用了GPU,并通过不断的优化,使得训练速度相比单台服务器有近两千倍的速度提高,从而使DNN模型的训练成为现实。

此外,为了使DNN模型可以应用到线上的服务中,我们对DNN在CPU上的计算也做了优化,在几乎不影响准确率的情况下,将计算速度提升了将近10倍。

4. 实验结果

通过DNN模型的应用,我们语音识别系统的字错误率下降了40%左右,根据第三方的测试已经超过网络,并有望追上讯飞。

⑶ 机器学习的超参数是什么

机器学习的超参数是什么
自从接触了机器学习后,在很多地方如书籍和文献中经常会看到有一类参数叫超参数(hyperparameter),其中提超参数最多的地方是在支持向量机(SVM)和深度学习(Deep Learning)中,比如支持向量机中的松弛因子:

上式中的C就是松弛因子,这个参数在支持向量机中不像参数W那样,可以通过优化学习得到。还有深度学习中的超参数,如学习率(Learning Rate),在训练深度网络时,这个学习率参数需要提前指定,比如最近设为0.09等。
那么问题来了,到底什么是超参数(hyperparameter)?在很多教材和文献中都是默认你理解超参数的定义的。如果不知道超参数的定义的话,有些文献中的话可能不好理解,比如在机器学习中,尤其是在支持向量机中,为什么有些文献要把数据集分割成训练集,验证集和测试集,而不是直接分割为训练集和测试集?只有理解了何谓超参数,才会明白某些文献中这样分割的道理。
什么是超参数呢?先来看一下超参数的学院风定义:在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。
超参数的通俗定义:超参数也是一种参数,它具有参数的特性,比如未知,也就是它不是一个已知常量。一种手工可配置的设置,需要为它根据已有或现有的经验指定“正确”的值,也就是人为为它设定一个值,它不是通过系统学习得到的。
下面主要看看超参数在机器学习中的定义及示例:
在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数。 相反,其他参数的值通过训练得出。
超参数:
1. 定义关于模型的更高层次的概念,如复杂性或学习能力。
2. 不能直接从标准模型培训过程中的数据中学习,需要预先定义。
3. 可以通过设置不同的值,训练不同的模型和选择更好的测试值来决定
超参数的一些示例:
1. 树的数量或树的深度
2. 矩阵分解中潜在因素的数量
3. 学习率(多种模式)
4. 深层神经网络隐藏层数
5. k均值聚类中的簇数

⑷ 优化算法

  SGD算法中的一个关键参数是学习率。之前,我们介绍的SGD使用固定的学习率。在实践中,有必要随着时间的推移逐渐降低学习率,因此我们将第 k 步迭代的学习率记作 ϵ k 。
  这是因为SGD中梯度估计引入的噪声源(m 个训练样本的随机采样)并不会在极小点处消失。相比之下,当我们使用批量梯度下降到达极小点时,整个代价函数的真实梯度会变得很小,之后为 0,因此批量梯度下降可以使用固定的学习率。保证SGD收敛的一个充分条件是

  若 ϵ 0 太大,学习曲线将会剧烈振荡,代价函数值通常会明显增加。温和的振荡是良好的,容易在训练随机代价函数(例如使用Dropout的代价函数)时出现。如果学习率太小,那么学习过程会很缓慢。如果初始学习率太低,那么学习可能会卡在一个相当高的代价值。通常,就总训练时间和最终代价值而言,最优初始学习率会高于大约迭代 100 次左右后达到最佳效果的学习率。因此,通常最好是检测最早的几轮迭代,选择一个比在效果上表现最佳的学习率更大的学习率,但又不能太大导致严重的震荡。

  虽然随机梯度下降仍然是非常受欢迎的优化方法,但其学习过程有时会很慢。动量方法 (Polyak, 1964) 旨在加速学习,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。动量的效果如图8.5所示

  受 Nesterov 加速梯度算法 (Nesterov, 1983, 2004) 启发,提出了动量算法的一个变种。这种情况的更新规则如下:

  其中参数 α 和 ϵ 发挥了和标准动量方法中类似的作用。Nesterov 动量和标准动量之间的区别体现在梯度计算上。Nesterov 动量中,梯度计算在施加当前速度之后。因此,Nesterov 动量可以解释为往标准动量方法中添加了一个校正因子。完整的Nesterov动量算法如算法3.2所示

  初始点能够决定算法是否收敛,有些初始点十分不稳定,使得该算法会遭遇数值困难,并完全失败。当学习收敛时,初始点可以决定学习收敛得多快,以及是否收敛到一个代价高或低的点。此外,差不多代价的点可以具有区别极大的泛化误差,初始点也可以影响泛化。
  也许完全确知的唯一特性是初始参数需要在不同单元间 ‘‘破坏对称性’’。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。如果它们具有相同的初始参数,然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。即使模型或训练算法能够使用随机性为不同的单元计算不同的更新(例如使用Dropout的训练),通常来说,最好还是初始化每个单元使其和其他单元计算不同的函数。这或许有助于确保没有输入模式
丢失在前向传播的零空间中,没有梯度模式丢失在反向传播的零空间中。每个单元计算不同函数的目标促使了参数的随机初始化。我们可以明确地搜索一大组彼此互不相同的基函数,但这经常会导致明显的计算代价。例如,如果我们有和输出一样多的输入,我们可以使用 Gram-Schmidt 正交化于初始的权重矩阵,保证每个单元计算彼此非常不同的函数。在高维空间上使用高熵分布来随机初始化,计算代价小并且不太可能分配单元计算彼此相同的函数。
  通常情况下,我们可以为每个单元的偏置设置启发式挑选的常数,仅随机初始化权重。额外的参数(例如用于编码预测条件方差的参数)通常和偏置一样设置为启发式选择的常数。
  我们几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。高斯或均匀分布的选择似乎不会有很大的差别,但也没有被详尽地研究。然而,初始分布的大小确实对优化过程的结果和网络泛化能力都有很大的影响。
  更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元。它们也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重太大,那么会在前向传播或反向传播中产生爆炸的值。在循环网络中,很大的权重也可能导致混沌(chaos)(对于输入中很小的扰动非常敏感,导致确定性前向传播过程表现随机)。在一定程度上,梯度爆炸问题可以通过梯度截断来缓解(执行梯度下降步骤之前设置梯度的阈值)。较大的权
重也会产生使得激活函数饱和的值,导致饱和单元的梯度完全丢失。这些竞争因素决定了权重的理想初始大小。
  也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重太大,那么会在前向传播或反向传播中产生爆炸的值。在循环网络中,很大的权重也可能导致混沌(chaos)(对于输入中很小的扰动非常敏感,导致确定性前向传播过程表现随机)。在一定程度上,梯度爆炸问题可以通过梯度截断来缓解(执行梯度下降步骤之前设置梯度的阈值)。较大的权重也会产生使得激活函数饱和的值,导致饱和单元的梯度完全丢失。这些竞争因素决定了权重的理想初始大小。
  有些启发式方法可用于选择权重的初始大小。一种初始化 m 个输入和 n 输出的全连接层的权重的启发式方法是从分布 U(−1/√ m ,
1/√ m ) 中采样权重,而 Glorot and Bengio 建议使用标准初始化

  后一种启发式方法初始化所有的层,折衷于使其具有相同激活方差和使其具有相同梯度方差之间。这假设网络是不含非线性的链式矩阵乘法,据此推导得出。现实的神经网络显然会违反这个假设,但很多设计于线性模型的策略在其非线性对应中的效果也不错。
  数值范围准则的一个缺点是,设置所有的初始权重具有相同的标准差,例如1/√ m ,会使得层很大时每个单一权重会变得极其小。Martens (2010) 提出了一种被称为稀疏初始化(sparse initialization)的替代方案,每个单元初始化为恰好有 k 个非零权重。这个想法保持该单元输入的总数量独立于输入数目 m,而不使单一权重元素的大小随 m 缩小。稀疏初始化有助于实现单元之间在初始化时更具多样性。但是,获得较大取值的权重也同时被加了很强的先验。因为梯度下降需要很长时间缩小 ‘‘不正确’’ 的大值,这个初始化方案可能会导致某些单元出问题,例如maxout单元有几个过滤器,互相之间必须仔细调整。

  Delta-bar-delta 算法 (Jacobs, 1988) 是一个早期的在训练时适应模型参数各自学习率的启发式方法。该方法基于一个很简单的想法,如果损失对于某个给定模型参数的偏导保持相同的符号,那么学习率应该增加。如果对于该参数的偏导变化了符号,那么学习率应减小。当然,这种方法只能应用于全批量优化中。

  AdaGrad 算法,如算法8.4所示,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根 (Duchi et al., 2011)。具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。

  在凸优化背景中,AdaGrad 算法具有一些令人满意的理论性质。然而,经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。AdaGrad在某些深度学习模型上效果不错,但不是全部。

  RMSProp 算法 (Hinton, 2012) 修改 AdaGrad 以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。AdaGrad旨在应用于凸问题时快速收敛。当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一个局部是凸碗的区域。AdaGrad 根据平方梯度的整个历史收缩学习率,可能使得学习率在达到这样的凸结构前就变得太小了。RMSProp 使用指数衰减平均以丢弃遥远过去的历史,使其能够在找到凸碗状结构后快速收敛,它就像一个初始化于该碗状结构的 AdaGrad 算法实例。
  RMSProp 的标准形式如算法8.5所示,结合 Nesterov 动量的形式如算法8.6所示。相比于 AdaGrad,使用移动平均引入了一个新的超参数ρ,用来控制移动平均的长度范围。经验上,RMSProp 已被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。

  Adam (Kingma and Ba, 2014) 是另一种学习率自适应的优化算法,最好被看作结合 RMSProp 和具有一些重要区别的动量的变种。首先,在 Adam 中,动量直接并入了梯度一阶矩(指数加权)的估计。将动量加入 RMSProp 最直观的方法是将动量应用于缩放后的梯度。结合缩放的动量使用没有明确的理论动机。其次,Adam 包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计(算法8.7)。RMSProp 也采用了(非中心的)二阶矩估计,然而缺失了修正因子。因此,不像 Adam,RMSProp 二阶矩估计可能在训练初期有很高的偏置。Adam 通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。

  目前,最流行并且使用很高的优化算法包括 SGD、具动量的 SGD、RMSProp、具动量的 RMSProp、AdaDelta 和 Adam。

⑸ 神经网络的超参数

初始参数无所谓,激活函数就用logsitc或者sigmoid都可以,模拟乘法应该不难吧

⑹ 神经网络中自适应的梯度下降优化算法(二)

Adagrad算法可以针对不同的参数自适应的采用不同的更新频率,对低频出现的特征采用低的更新率,对高频出现的特征采用高的更新率,因此,对于稀疏的数据它表现的很好,很好的提升了SGD的鲁棒性,在Google的通过Youtube视频识别猫的神经网络训练中有很好的表现。

梯度更新规则:

g(t,i)表示在t时刻目标函数对θ(i)的偏导数。SGD的每个参数的更新过程如下:

Adagrad的每个参数更新过程如下:

G(t)是一个对角矩阵,对角线上的每个元素是t时刻前所有θ(i)的梯度的平方和。ε通常取值在1e-8量级,它的存在是为了避免除数为0。一个有趣的现象是,如果没有平方根操作,算法的表现就非常糟糕。

Adagrad的主要缺点是,它的分母是平方梯度的累积,它的值会一直增加,最终导致学习率衰减到非常小,从而使得学习算法无法进行下去。

TensorFlow实现:

tf.train.AdagradOptimizer(learning_rate, initial_accumulator_value=0.1, use_locking=False, name='Adagrad')

Adadelta算法主要解决Adagrad的缺陷,它不再累加过去所有的梯度,而是仅累积过去固定个数的梯度。

Adadelta不是采用平方梯度的简单累加,而是采用 历史 平方梯度的衰减的平均。

γ通常等于0.9

分母相当于梯度的均方根(root mean squared, RMS),即将所有值平方求和,求其均值,再开平方,就得到均方根值。

梯度更新规则:

将学习率η设置为

,我们就不需要提前设定学习率。

RMSprop是Geoff Hinton提出的一种自适应学习率的方法,它与Adadelta方法都是为了解决Adagrad学习率急剧下降问题的。它与Adadelta方法是一致的。

梯度更新规则

超参数设定值:

Hinton建议设定γ=0.9, 学习率η=0.001。

TensorFlow实现:

tf.train.RMSPropOptimizer.__init__(learning_rate, decay, momentum=0.0, epsilon=1e-10, use_locking=False, name='RMSProp')

Adam也是对不同的参数自适应设置不同的学习率。它对 历史 梯度和 历史 平方梯度同时采用指数梯度衰减(exponentially decaying average)。

梯度更新规则

Adam作者观察到,如果m(t)和v(t)初始化为零向量,并且衰减率很小时(比如β1和β2都非常接近于1时),在开始的迭代中,m(t)和v(t)总是向零偏移,所以需要做偏移校正。

然后用校正后的值进行梯度更新:

Adam作者建议β1=0.9,β2=0.999,ε=10^{-8}

,在实践中,Adam比其它算法的效果要好。

TensorFlow实现:

tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')

Adam更新规则中的梯度缩放与 历史 梯度的L2范数成反比。

我们可以把这个规则泛化到Lp范数。

当p值增大的时候,Lp的值往往会变得不稳定,所以在实践中L1和L2使用的比较普遍。但是Adamax作者发现L∞可以收敛到一个稳定值。

然后我们可以采用u(t)代替

来更新Adam中的梯度。

同时u(t)不需要做零偏校正。默认取值建议:

⑺ 机器学习中的参数与超参数之间的区别

机器学习中的参数与超参数之间的区别
机器学习中的模型参数和模型超参数在作用、来源等方面都有所不同,而模型超参数常被称为模型参数,这样,很容易对初学者造成混淆。本文给出了模型参数和模型超参数的定义,并进行了对比,指出了二者本质上的区别:模型参数是模型内部的配置变量,可以用数据估计模型参数的值;模型超参数是模型外部的配置,必须手动设置参数的值。
我们在做研究的时候,会碰到很多术语。有时,在不同的研究领域还会出现同样名称的术语。比如,统计学、经济学中经常使用的“模型参数”和“模型超参数”,在机器学习中也同样存在。
机器学习领域中的“模型参数”“模型超参数”在作用、来源等方面都有所不同,初学者如果对二者没有明确的认识,学习起来往往会比较吃力,尤其是那些来自统计学和经济学领域的初学者们。
为了让大家在应用机器学习时,对“参数模型”和“超参数模型”有一个清晰的界定,在这篇文章中,我们将具体讨论这两个术语。
首先,我们来看一下“参数”是什么?
参数作为模型从历史训练数据中学到的一部分,是机器学习算法的关键 。
统计学中的“参数”:
在统计学中,你可以假设一个变量的分布,比如高斯分布。高斯分布的两个参数分别是平均值(μ)和标准差(sigma)。这在机器学习中是有效的,其中这些参数可以用数据估计得到并用作预测模型的一部分。
编程中的“参数”:
编程中可以将参数传递给函数。在这种情况下,参数是一个函数参数,可以有一个值范围。在机器学习中,您正在使用的具体模型就是函数,需要参数才能对新数据进行预测。
“参数”和“模型”有什么关系?
根据经典的机器学习文献,可以将模型看作假设,而参数是根据特定的数据集对假设进行的具体调整。
模型是否具有固定或可变数量的参数,决定了模型是“参数”模型或“非参”模型。
什么是模型参数?
简单来说,模型参数就是模型内部的配置变量,可以用数据估计它的值。
具体来讲,模型参数有以下特征:
进行模型预测时需要模型参数。
模型参数值可以定义模型功能。
模型参数用数据估计或数据学习得到
模型参数一般不由实践者手动设置。
模型参数通常作为学习模型的一部分保存。
通常使用优化算法估计模型参数,优化算法是对参数的可能值进行的一种有效搜索。
模型参数的一些例子包括:
人造神经网络中的权重。
支持向量机中的支持向量。
线性回归或逻辑回归中的系数。
什么是模型超参数?
模型超参数是模型外部的配置,其值不能从数据估计得到。
具体特征有:
模型超参数常应用于估计模型参数的过程中。
模型超参数通常由实践者直接指
模型超参数通常可以使用启发式方法来设置。
模型超参数通常根据给定的预测建模问题而调整。
怎样得到它的最优值: 对于给定的问题,我们无法知道模型超参数的最优值。但我们可以使用经验法则来探寻其最优值,或复制用于其他问题的值,也可以通过反复试验的方法。
模型超参数的一些例子包括:
训练神经网络的学习速率。
支持向量机的C和sigma超参数。
k邻域中的k。
“模型参数”和“模型超参数”
二者的联系:
当针对特定问题调整机器学习算法时,例如在使用网格搜索或随机搜索时,你将调整模型或命令的超参数,以发现一个可以使模型预测最熟练的模型参数。许多模型中重要的参数无法直接从数据中估计得到。例如,在K近邻分类模型中...这种类型的模型参数被称为调整参数,因为没有可用的分析公式来为其计算一个合适的值。
区分:
模型超参数通常被称为模型参数,这种叫法很容易让人产生误解。解决这个问题的一个很好的经验法则如下:如果你必须手动指定一个“模型参数”,那么它可能就是一个模型超参数。
总结
读完这篇文章可以了解模型参数和模型超参数的明确定义和区别。
总而言之,模型参数是从数据中自动估计的,而模型超参数是手动设置的,并用于估计模型参数的过程。

⑻ 卷积神经网络参数解析

(1)现象:

        (1-1)一次性将batch数量个样本feed神经网络,进行前向传播;然后再进行权重的调整,这样的一整个过程叫做一个回合(epoch),也即一个batch大小样本的全过程就是一次迭代。

        (1-2)将训练数据分块,做成批(batch training)训练可以将多个训练数据元的loss function求和,使用梯度下降法,最小化 求和后的loss function ,进而对神经网络的参数进行优化更新

(2)一次迭代:包括前向传播计算输出向量、输出向量与label的loss计算和后向传播求loss对权重向量 w 导数(梯度下降法计算),并实现权重向量 w 的更新。

(3)优点:

        (a)对梯度向量(代价函数对权值向量 w 的导数)的精确估计,保证以最快的速度下降到局部极小值的收敛性;一个batch一次梯度下降;

        (b)学习过程的并行运行;

        (c)更加接近随机梯度下降的算法效果;

        (d)Batch Normalization 使用同批次的统计平均和偏差对数据进行正则化,加速训练,有时可提高正确率 [7]

(4)现实工程问题:存在计算机存储问题,一次加载的batch大小受到内存的影响;

(5)batch参数选择:

        (5-1)从收敛速度的角度来说,小批量的样本集合是最优的,也就是我们所说的mini-batch,这时的batch size往往从几十到几百不等,但一般不会超过几千

        (5-2)GPU对2的幂次的batch可以发挥更佳的性能,因此设置成16、32、64、128...时往往要比设置为整10、整100的倍数时表现更优

    (6)4种加速批梯度下降的方法 [8] :

        (6-1)使用动量-使用权重的 速度 而非 位置 来改变权重。

        (6-2)针对不同权重参数使用不同学习率。

        (6-3)RMSProp-这是Prop 的均方根 ( Mean Square ) 改进形式,Rprop 仅仅使用梯度的符号,RMSProp 是其针对 Mini-batches 的平均化版本

        (6-4)利用曲率信息的最优化方法。

(1)定义:运用梯度下降算法优化loss成本函数时,权重向量的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率η

(2)效果:

        (2-1)学习率η越小,每次迭代权值向量变化小,学习速度慢,轨迹在权值空间中较光滑,收敛慢;

        (2-2)学习率η越大,每次迭代权值向量变化大,学习速度快,但是有可能使变化处于震荡中,无法收敛;

    (3)处理方法:

        (3-1)既要加快学习速度又要保持稳定的方法修改delta法则,即添加动量项。

    (4)选择经验:

        (4-1)基于经验的手动调整。 通过尝试不同的固定学习率,如0.1, 0.01, 0.001等,观察迭代次数和loss的变化关系,找到loss下降最快关系对应的学习率。

        (4-2)基于策略的调整。

                (4-2-1)fixed 、exponential、polynomial

                (4-2-2)自适应动态调整。adadelta、adagrad、ftrl、momentum、rmsprop、sgd

    (5)学习率η的调整:学习速率在学习过程中实现自适应调整(一般是衰减)

        (5-1)非自适应学习速率可能不是最佳的。

        (5-2)动量是一种自适应学习速率方法的参数,允许沿浅方向使用较高的速度,同时沿陡峭方向降低速度前进

        (5-3)降低学习速率是必要的,因为在训练过程中,较高学习速率很可能陷入局部最小值。

参考文献:

[1]  Simon Haykin. 神经网络与机器学习[M]. 机械工业出版社, 2011.

[2]   训练神经网络时如何确定batch的大小?

[3]   学习笔记:Batch Size 对深度神经网络预言能力的影响  

[4]   机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size.  http://blog.csdn.net/u012162613/article/details/44265967

[5]   深度学习如何设置学习率 . http://blog.csdn.net/mao_feng/article/details/52902666

[6]   调整学习速率以优化神经网络训练. https://zhuanlan.hu.com/p/28893986

[7]   机器学习中用来防止过拟合的方法有哪些?

[8]   Neural Networks for Machine Learning by Geoffrey Hinton .

[9]   如何确定卷积神经网络的卷积核大小、卷积层数、每层map个数

[10]   卷积神经网络的卷积核大小、卷积层数、每层map个数都是如何确定下来的呢?

⑼ 神经网络超参数选择

深度学习模型通常由随机梯度下降算法进行训练。随机梯度下降算法有许多变形:例如 Adam、RMSProp、Adagrad 等等。这些算法都需要你设置学习率。学习率决定了在一个小批量(mini-batch)中权重在梯度方向要移动多远。

如果学习率很低,训练会变得更加可靠,但是优化会耗费较长的时间,因为朝向损失函数最小值的每个步长很小。
如果学习率很高,训练可能根本不会收敛,损失函数一直处于波动中,甚至会发散。权重的改变量可能非常大,使得优化越过最小值,使得损失函数变得更糟。

训练应当从相对较大的学习率开始。这是因为在开始时,初始的随机权重远离最优值。在训练过程中,学习率应当下降,以允许细粒度的权重更新。

参考: https://www.jiqixin.com/articles/2017-11-17-2

批次大小是每一次训练神经网络送入模型的样本数。在 合理的范围之内 ,越大的 batch size 使下降方向越准确,震荡越小,通常取值为[16,32,64,128]。

Batch_Size=全部数据集 缺点:
1) 随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
2) 以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。
Batch_Size = 1 缺点:
使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

在合理范围内,增大 Batch_Size 有何好处?
1) 内存利用率提高了,大矩阵乘法的并行化效率提高。
2) 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
3) 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。

盲目增大 Batch_Size 有何坏处?
1) 内存利用率提高了,但是内存容量可能撑不住了。
2) 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
3) Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

参考: https://blog.csdn.net/juronghui/article/details/78612653

迭代次数是指整个训练集输入到神经网络进行训练的次数,当测试错误率和训练错误率相差较小,且测试准确率趋于稳定时(达到最优),可认为当前迭代次数合适;当测试错误率先变小后变大时则说明迭代次数过大了,需要减小迭代次数,否则容易出现过拟合。

用激活函数给神经网络加入一些非线性因素,使得网络可以更好地解决较为复杂的问题。参考: https://blog.csdn.net/tyhj_sf/article/details/79932893

它能够把输入的连续实值变换为0和1之间的输出。
缺点:
1) 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
2) Sigmoid 的 output 不是0均值,使得收敛缓慢。batch的输入能缓解这个问题。

它解决了Sigmoid函数的不是zero-centered输出问题,然而梯度消失的问题和幂运算的问题仍然存在。
tanh函数具有中心对称性,适合于有对称性的二分类

虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了梯度消散问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

为了解决Dead ReLU Problem,提出了将ReLU的前半段设为 αx 而非 0 ,如 PReLU 。

1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

公式: https://www.cnblogs.com/xiaobingqianrui/p/10756046.html
优化器比较: https://blog.csdn.net/weixin_40170902/article/details/80092628

⑽ 人工神经网络概念梳理与实例演示

人工神经网络概念梳理与实例演示
神经网络是一种模仿生物神经元的机器学习模型,数据从输入层进入并流经激活阈值的多个节点。
递归性神经网络一种能够对之前输入数据进行内部存储记忆的神经网络,所以他们能够学习到数据流中的时间依赖结构。
如今机器学习已经被应用到很多的产品中去了,例如,siri、Google Now等智能助手,推荐引擎——亚马逊网站用于推荐商品的推荐引擎,Google和Facebook使用的广告排名系统。最近,深度学习的一些进步将机器学习带入公众视野:AlphaGo 打败围棋大师李世石事件以及一些图片识别和机器翻译等新产品的出现。
在这部分中,我们将介绍一些强大并被普遍使用的机器学习技术。这当然包括一些深度学习以及一些满足现代业务需求传统方法。读完这一系列的文章之后,你就掌握了必要的知识,便可以将具体的机器学习实验应用到你所在的领域当中。
随着深层神经网络的精度的提高,语音和图像识别技术的应用吸引了大众的注意力,关于AI和深度学习的研究也变得更加普遍了。但是怎么能够让它进一步扩大影响力,更受欢迎仍然是一个问题。这篇文章的主要内容是:简述前馈神经网络和递归神经网络、怎样搭建一个递归神经网络对时间系列数据进行异常检测。为了让我们的讨论更加具体化,我们将演示一下怎么用Deeplearning4j搭建神经网络。
一、什么是神经网络?
人工神经网络算法的最初构思是模仿生物神经元。但是这个类比很不可靠。人工神经网络的每一个特征都是对生物神经元的一种折射:每一个节点与激活阈值、触发的连接。
连接人工神经元系统建立起来之后,我们就能够对这些系统进行训练,从而让他们学习到数据中的一些模式,学到之后就能执行回归、分类、聚类、预测等功能。
人工神经网络可以看作是计算节点的集合。数据通过这些节点进入神经网络的输入层,再通过神经网络的隐藏层直到关于数据的一个结论或者结果出现,这个过程才会停止。神经网络产出的结果会跟预期的结果进行比较,神经网络得出的结果与正确结果的不同点会被用来更正神经网络节点的激活阈值。随着这个过程的不断重复,神经网络的输出结果就会无限靠近预期结果。
二、训练过程
在搭建一个神经网络系统之前,你必须先了解训练的过程以及网络输出结果是怎么产生的。然而我们并不想过度深入的了解这些方程式,下面是一个简短的介绍。
网络的输入节点收到一个数值数组(或许是叫做张量多维度数组)就代表输入数据。例如, 图像中的每个像素可以表示为一个标量,然后将像素传递给一个节点。输入数据将会与神经网络的参数相乘,这个输入数据被扩大还是减小取决于它的重要性,换句话说,取决于这个像素就不会影响神经网络关于整个输入数据的结论。
起初这些参数都是随机的,也就是说神经网络在建立初期根本就不了解数据的结构。每个节点的激活函数决定了每个输入节点的输出结果。所以每个节点是否能够被激活取决于它是否接受到足够的刺激强度,即是否输入数据和参数的结果超出了激活阈值的界限。
在所谓的密集或完全连接层中,每个节点的输出值都会传递给后续层的节点,在通过所有隐藏层后最终到达输出层,也就是产生输入结果的地方。在输出层, 神经网络得到的最终结论将会跟预期结论进行比较(例如,图片中的这些像素代表一只猫还是狗?)。神经网络猜测的结果与正确结果的计算误差都会被纳入到一个测试集中,神经网络又会利用这些计算误差来不断更新参数,以此来改变图片中不同像素的重要程度。整个过程的目的就是降低输出结果与预期结果的误差,正确地标注出这个图像到底是不是一条狗。
深度学习是一个复杂的过程,由于大量的矩阵系数需要被修改所以它就涉及到矩阵代数、衍生品、概率和密集的硬件使用问题,但是用户不需要全部了解这些复杂性。
但是,你也应该知道一些基本参数,这将帮助你理解神经网络函数。这其中包括激活函数、优化算法和目标函数(也称为损失、成本或误差函数)。
激活函数决定了信号是否以及在多大程度上应该被发送到连接节点。阶梯函数是最常用的激活函数, 如果其输入小于某个阈值就是0,如果其输入大于阈值就是1。节点都会通过阶梯激活函数向连接节点发送一个0或1。优化算法决定了神经网络怎么样学习,以及测试完误差后,权重怎么样被更准确地调整。最常见的优化算法是随机梯度下降法。最后, 成本函数常用来衡量误差,通过对比一个给定训练样本中得出的结果与预期结果的不同来评定神经网络的执行效果。
Keras、Deeplearning4j 等开源框架让创建神经网络变得简单。创建神经网络结构时,需要考虑的是怎样将你的数据类型匹配到一个已知的被解决的问题,并且根据你的实际需求来修改现有结构。
三、神经网络的类型以及应用
神经网络已经被了解和应用了数十年了,但是最近的一些技术趋势才使得深度神经网络变得更加高效。
GPUs使得矩阵操作速度更快;分布式计算结构让计算能力大大增强;多个超参数的组合也让迭代的速度提升。所有这些都让训练的速度大大加快,迅速找到适合的结构。
随着更大数据集的产生,类似于ImageNet 的大型高质量的标签数据集应运而生。机器学习算法训练的数据越大,那么它的准确性就会越高。
最后,随着我们理解能力以及神经网络算法的不断提升,神经网络的准确性在语音识别、机器翻译以及一些机器感知和面向目标的一些任务等方面不断刷新记录。
尽管神经网络架构非常的大,但是主要用到的神经网络种类也就是下面的几种。
3.1前馈神经网络
前馈神经网络包括一个输入层、一个输出层以及一个或多个的隐藏层。前馈神经网络可以做出很好的通用逼近器,并且能够被用来创建通用模型。
这种类型的神经网络可用于分类和回归。例如,当使用前馈网络进行分类时,输出层神经元的个数等于类的数量。从概念上讲, 激活了的输出神经元决定了神经网络所预测的类。更准确地说, 每个输出神经元返回一个记录与分类相匹配的概率数,其中概率最高的分类将被选为模型的输出分类。
前馈神经网络的优势是简单易用,与其他类型的神经网络相比更简单,并且有一大堆的应用实例。
3.2卷积神经网络
卷积神经网络和前馈神经网络是非常相似的,至少是数据的传输方式类似。他们结构大致上是模仿了视觉皮层。卷积神经网络通过许多的过滤器。这些过滤器主要集中在一个图像子集、补丁、图块的特征识别上。每一个过滤器都在寻找不同模式的视觉数据,例如,有的可能是找水平线,有的是找对角线,有的是找垂直的。这些线条都被看作是特征,当过滤器经过图像时,他们就会构造出特征图谱来定位各类线是出现在图像的哪些地方。图像中的不同物体,像猫、747s、榨汁机等都会有不同的图像特征,这些图像特征就能使图像完成分类。卷积神经网络在图像识别和语音识别方面是非常的有效的。
卷积神经网络与前馈神经网络在图像识别方面的异同比较。虽然这两种网络类型都能够进行图像识别,但是方式却不同。卷积神经网络是通过识别图像的重叠部分,然后学习识别不同部分的特征进行训练;然而,前馈神经网络是在整张图片上进行训练。前馈神经网络总是在图片的某一特殊部分或者方向进行训练,所以当图片的特征出现在其他地方时就不会被识别到,然而卷积神经网络却能够很好的避免这一点。
卷积神经网络主要是用于图像、视频、语音、声音识别以及无人驾驶的任务。尽管这篇文章主要是讨论递归神经网络的,但是卷积神经网络在图像识别方面也是非常有效的,所以很有必要了解。
3.3递归神经网络
与前馈神经网络不同的是,递归神经网络的隐藏层的节点里有内部记忆存储功能,随着输入数据的改变而内部记忆内容不断被更新。递归神经网络的结论都是基于当前的输入和之前存储的数据而得出的。递归神经网络能够充分利用这种内部记忆存储状态处理任意序列的数据,例如时间序列。
递归神经网络经常用于手写识别、语音识别、日志分析、欺诈检测和网络安全。
递归神经网络是处理时间维度数据集的最好方法,它可以处理以下数据:网络日志和服务器活动、硬件或者是医疗设备的传感器数据、金融交易、电话记录。想要追踪数据在不同阶段的依赖和关联关系需要你了解当前和之前的一些数据状态。尽管我们通过前馈神经网络也可以获取事件,随着时间的推移移动到另外一个事件,这将使我们限制在对事件的依赖中,所以这种方式很不灵活。
追踪在时间维度上有长期依赖的数据的更好方法是用内存来储存重要事件,以使近期事件能够被理解和分类。递归神经网络最好的一点就是在它的隐藏层里面有“内存”可以学习到时间依赖特征的重要性。
接下来我们将讨论递归神经网络在字符生成器和网络异常检测中的应用。递归神经网络可以检测出不同时间段的依赖特征的能力使得它可以进行时间序列数据的异常检测。
递归神经网络的应用
网络上有很多使用RNNs生成文本的例子,递归神经网络经过语料库的训练之后,只要输入一个字符,就可以预测下一个字符。下面让我们通过一些实用例子发现更多RNNs的特征。
应用一、RNNs用于字符生成
递归神经网络经过训练之后可以把英文字符当做成一系列的时间依赖事件。经过训练后它会学习到一个字符经常跟着另外一个字符(“e”经常跟在“h”后面,像在“the、he、she”中)。由于它能预测下一个字符是什么,所以它能有效地减少文本的输入错误。
Java是个很有趣的例子,因为它的结构包括很多嵌套结构,有一个开的圆括号必然后面就会有一个闭的,花括号也是同理。他们之间的依赖关系并不会在位置上表现的很明显,因为多个事件之间的关系不是靠所在位置的距离确定的。但是就算是不明确告诉递归神经网络Java中各个事件的依赖关系,它也能自己学习了解到。
在异常检测当中,我们要求神经网络能够检测出数据中相似、隐藏的或许是并不明显的模式。就像是一个字符生成器在充分地了解数据的结构后就会生成一个数据的拟像,递归神经网络的异常检测就是在其充分了解数据结构后来判断输入的数据是不是正常。
字符生成的例子表明递归神经网络有在不同时间范围内学习到时间依赖关系的能力,它的这种能力还可以用来检测网络活动日志的异常。
异常检测能够使文本中的语法错误浮出水面,这是因为我们所写的东西是由语法结构所决定的。同理,网络行为也是有结构的,它也有一个能够被学习的可预测模式。经过在正常网络活动中训练的递归神经网络可以监测到入侵行为,因为这些入侵行为的出现就像是一个句子没有标点符号一样异常。
应用二、一个网络异常检测项目的示例
假设我们想要了解的网络异常检测就是能够得到硬件故障、应用程序失败、以及入侵的一些信息。
模型将会向我们展示什么呢?
随着大量的网络活动日志被输入到递归神经网络中去,神经网络就能学习到正常的网络活动应该是什么样子的。当这个被训练的网络被输入新的数据时,它就能偶判断出哪些是正常的活动,哪些是被期待的,哪些是异常的。
训练一个神经网络来识别预期行为是有好处的,因为异常数据不多,或者是不能够准确的将异常行为进行分类。我们在正常的数据里进行训练,它就能够在未来的某个时间点提醒我们非正常活动的出现。
说句题外话,训练的神经网络并不一定非得识别到特定事情发生的特定时间点(例如,它不知道那个特殊的日子就是周日),但是它一定会发现一些值得我们注意的一些更明显的时间模式和一些可能并不明显的事件之间的联系。
我们将概述一下怎么用 Deeplearning4j(一个在JVM上被广泛应用的深度学习开源数据库)来解决这个问题。Deeplearning4j在模型开发过程中提供了很多有用的工具:DataVec是一款为ETL(提取-转化-加载)任务准备模型训练数据的集成工具。正如Sqoop为Hadoop加载数据,DataVec将数据进行清洗、预处理、规范化与标准化之后将数据加载到神经网络。这跟Trifacta’s Wrangler也相似,只不过它更关注二进制数据。
开始阶段
第一阶段包括典型的大数据任务和ETL:我们需要收集、移动、储存、准备、规范化、矢量话日志。时间跨度的长短是必须被规定好的。数据的转化需要花费一些功夫,这是由于JSON日志、文本日志、还有一些非连续标注模式都必须被识别并且转化为数值数组。DataVec能够帮助进行转化和规范化数据。在开发机器学习训练模型时,数据需要分为训练集和测试集。
训练神经网络
神经网络的初始训练需要在训练数据集中进行。
在第一次训练的时候,你需要调整一些超参数以使模型能够实现在数据中学习。这个过程需要控制在合理的时间内。关于超参数我们将在之后进行讨论。在模型训练的过程中,你应该以降低错误为目标。
但是这可能会出现神经网络模型过度拟合的风险。有过度拟合现象出现的模型往往会在训练集中的很高的分数,但是在遇到新的数据时就会得出错误结论。用机器学习的语言来说就是它不够通用化。Deeplearning4J提供正则化的工具和“过早停止”来避免训练过程中的过度拟合。
神经网络的训练是最花费时间和耗费硬件的一步。在GPUs上训练能够有效的减少训练时间,尤其是做图像识别的时候。但是额外的硬件设施就带来多余的花销,所以你的深度学习的框架必须能够有效的利用硬件设施。Azure和亚马逊等云服务提供了基于GPU的实例,神经网络还可以在异构集群上进行训练。
创建模型
Deeplearning4J提供ModelSerializer来保存训练模型。训练模型可以被保存或者是在之后的训练中被使用或更新。
在执行异常检测的过程中,日志文件的格式需要与训练模型一致,基于神经网络的输出结果,你将会得到是否当前的活动符合正常网络行为预期的结论。
代码示例
递归神经网络的结构应该是这样子的:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder(
.seed(123)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
.weightInit(WeightInit.XAVIER)
.updater(Updater.NESTEROVS).momentum(0.9)
.learningRate(0.005)
.gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue)
.(0.5)
.list()
.layer(0, new GravesLSTM.Builder().activation("tanh").nIn(1).nOut(10).build())
.layer(1, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
.activation("softmax").nIn(10).nOut(numLabelClasses).build())
.pretrain(false).backprop(true).build();
MultiLayerNetwork net = new MultiLayerNetwork(conf);
net.init();
下面解释一下几行重要的代码:
.seed(123)
随机设置一个种子值对神经网络的权值进行初始化,以此获得一个有复验性的结果。系数通常都是被随机的初始化的,以使我们在调整其他超参数时仍获得一致的结果。我们需要设定一个种子值,让我们在调整和测试的时候能够用这个随机的权值。
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
决定使用哪个最优算法(在这个例子中是随机梯度下降法)来调整权值以提高误差分数。你可能不需要对这个进行修改。
.learningRate(0.005)
当我们使用随机梯度下降法的时候,误差梯度就被计算出来了。在我们试图将误差值减到最小的过程中,权值也随之变化。SGD给我们一个让误差更小的方向,这个学习效率就决定了我们该在这个方向上迈多大的梯度。如果学习效率太高,你可能是超过了误差最小值;如果太低,你的训练可能将会永远进行。这是一个你需要调整的超参数。

阅读全文

与神经网络超参数优化算法相关的资料

热点内容
不适合程序员的表现 浏览:498
扣扣服务器问题怎么解决 浏览:126
手机怎么连接加密WF 浏览:329
电脑怎么在邮箱发送文件夹 浏览:803
王者荣耀服务器忙如何强制进入 浏览:26
云服务器网站怎么购买 浏览:477
linux系统记录 浏览:127
linuxusb驱动下载 浏览:34
梁特殊箍筋加密区公式 浏览:141
web应用安全pdf 浏览:47
linuxintel网卡驱动下载 浏览:217
资源解压后怎么删除 浏览:868
编程之美15种算法 浏览:147
java的图形用户界面设计 浏览:769
算数游戏源码 浏览:999
压缩机工作声音判断 浏览:985
事业单位程序员 浏览:507
易语言取相似颜色源码 浏览:773
pyodbclinux 浏览:585
vivo为什么把服务器沉到深海 浏览:460