【Keras之父】高级DL最佳实践

      Sequential模型假设网络只有一个输入和一个输出,而且网络是层的线性堆叠。既有元数据,文本描述还有图像,如何才能同时使用这三种数据呢???一种朴素的做法:训练三个独立的模型,然后对三者的预测做加权平均。但是此方法会存在模型提取的信息可能存在冗余。更好的方法是使用一个可以同时查看所有可用的输入模态的模型,从而联合学习一个更加精确的数据模型。其多输入模型如下:

同样,有些任务需要预测输入数据的多个目标属性。多输出模型如下:

此外许多最新开发的你神经架构要求非线性的网络拓扑结构,即网络结构为有向无环图。例如Inception系列网络依赖于Inception模块类图如下:

 

残差连接(residual connection):最早出现于ResNet系列网络—微软,是指将前面的输出张量与后面的输出张量相加,从而将前面的表示重新注入下游数据流中,这有助于防止信息处理流程中的信息损失。

           以上是三个重要的使用案例(多输入模型多输出模型和类图模型)。Keras中的Sequential模型是无法实现,另一种更加通用、更加灵活的使用Keras的方式:函数式API(functionalAPI):可以直接操作张量,也可以把层当作函数来使用,接收张量并返回张量。对比如下:

=========================================================

1.多输入模型:这种模型会在某一时刻用一个可以组合多个张量的层将不同的输入分支合并,张量组合方式可能是相加、连接等,例如问答模型。

model = Model([text_input, question_input], answer)

model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['acc'])------实例化网络model

训练这个模型有2个可用的API

1.可以向模型输入一个由Numpy数组组成的列表

2.可以输入一个将输入名称映射为Numpy数组的字典。只有输入具有名称时才能使用后一种方法。

model.fit([text, question], answers, epochs=10, batch_size=128)  -->第一种

model.fit({'text': text, 'question': question}, answers,epochs=10,batch_size=128)

 

2.多输出模型

训练这种模型需要能够对网络的各个头指定不同的损失函数,例如,年龄预测是标量回归任务,而性别预测是二分类任务,二者需要不同的训练过程。但是梯度下降要求将一个标量最小化,所以为了能够训练模型,必须将这些损失合并为单个标量合并不同损失最简单的方法就是对所有损失求和。在 Keras 中,可以在编译时使用损失组成的列表或字典来为不同输出指定不同损失,然后将得到的损失值相加得到一个全局损失,并在训练过程中将这个损失最小化。

【注意】严重不平衡的损失贡献会导致模型表示针对单个损失值最大的任务优先进行优化, 而不考虑其他任务的优化。为了解决这个问题,可以为每个损失值对最终损失的贡献分配 不同大小的重要性。如果不同的损失值具有不同的取值范围,那么这一方法尤其有用。比如, 用于年龄回归任务的均方误差(MSE)损失值通常在 3~5 左右,而用于性别分类任务的交叉熵损失值可能低至 0.1。在这种情况下,为了平衡不同损失的贡献,可以让交叉熵损失的权重取 10,而 MSE 损失的权重取 0.5

 

3.多输出模型

Keras 中的神经网络可以是层组成的任意有向无环图(directed acyclic graph)-- 即这些图不能有循环,张量x不能称为生成x的某一层输入,唯一允许的处理循环(即循环连接)是循环层的内部循环。2个著名的组件是Inception模块和残差连接

3.1 Inception

Inception是模块的堆叠,这些模块看起来像是小型的独立网络,被分为多个并行分支。Inception模块最基本的形式:包含3~4个分支,首先是一个1*1的卷积,然后是一个3*3的卷积,最后将所得到的特征连接在一起。这种设置有助于网络分别学习空间特征和逐通道的特征,比联合学习这两种特征更加有效。

卷积能够在输入张量的每一个方块周围提取空间图块,并对所有图块应用相同的变换。极端的情况就是提取的图块只包含一个方块,这时等价于让每个方块向量经过一个Dense层:逐点卷积---它计算得到的特征能够将输入张量通道中的信息混合在一起,但不会将跨空间的信息混合在一起(因为它每一次只查看一个方块)。Inception3架构如下:

Xception(extreme inception),是一种卷积神经网络架构,将分别进行通道特征学习与空间特征学习的想法推向逻辑上的极端,并将 Inception 模块替换为深度可分离卷积,其中包括一个逐深度卷积(即一个空间卷积,分别对每个输入通道进行处理)和后面的一个逐点卷积(即一个 1×1 卷积)。这个深度可分离卷积实际上是 Inception 模块的一种 极端形式,其空间特征和通道特征被完全分离。Xception的参数个数与 Inception V3大致相同, 但因为它对模型参数的使用更加高效,所以在 ImageNet以及其他大规模数据集上的运行性能更好,精度也更高。

3.2 残差连接

残差连接(residual connection)是一种常见的类图网络组件。残差连接解决了困扰所有大规模深度学习模型的两个共性问题: 梯度消失和表示瓶颈。通常来说,向任何多于10层的模型中添加残差连接,都可能会有所帮助。

残差连接是让前面某层的输出作为后面某层的输入,从而在序列网络中有效地创造了一条捷径。前面层的输出没有与后面层的激活连接在一起,而是与后面层的激活相加(这里假设两个激活的形状相同)。如果它们的形状不同,可以用一个线性变换将前面层的激活改变成目标形状(例如,这个线性变换可以是不带激活的Dense 层; 对于卷积特征图,可以是不带激活 1×1 卷积)。

~~~~~~~~~~~DL的表示瓶颈~~~~~~~~~~~~~~

    在 Sequential模型中,每个连续的表示层都构建于前一层之上,这意味着它只能访问前一层激活中包含的信息。如果某一层太小(比如特征维度太低),那么模型将会受限于该层激活中能够塞入多少信息。

可以通过类比信号处理来理解这个概念:假设有一条包含一系列操作的音频处理流水线,每个操作的输入都是前一个操作的输出,如果某个操作将信号裁剪到低频范围(比如 0~15 kHz),那么下游操作将永远无法恢复那些被丢弃的频段。任何信息的丢失都是永久性的残差连接可以将较早的信息重新注入到下游数据中,从而部分解决了DL模型的这一问题。

~~~~~~~~~~~DL的梯度消失~~~~~~~~~~~~~

反向传播是用于训练深度神经网络的主要算法,其工作原理是将来自输出损失的反馈信号向下传播到更底部的层。如果这个反馈信号的传播需要经过很多层,那么信号可能会变得非常微弱,甚至完全丢失,导致网络无法训练,被称为梯度消失(vanishing gradient)。

深度网络中存在这个问题,在很长序列上的循环网络也存在这个问题。在这两种情况下, 反馈信号的传播都必须通过一长串操作。LSTM 层是如何在循环网络中解决这个问题的:它引入了一个携带轨道(carry track),可以在与主处理轨道平行的轨道上传播信息。残差连接在前馈深度网络中的工作原理与此类似,但它更加简单:它引入了一个纯线性的信息携带轨道,与主要的层堆叠方向平行,从而有助于跨越任意深度的层来传播梯度。

【层复用】

如何通过多次调用相同的层实例或模型实例,在不同的处理分支之间重复使用层或模型的权重。

        1.共享层权重:函数式API还有一个重要的特性:能够多次重复使用一个层实例

    2.模型作为层:实际上,可以将模型看作“更大的层”。Sequential 类和 Model 类都是如此。这意味着可以在一个输入张量上调用模型,并得到一个输出张量。y = model(x)

如果模型具有多个输入张量和多个输出张量,那么应该用张量列表来调用模型。y1, y2 = model([x1, x2])

训练模型时,不知道需要多少轮才能得到最佳验证损失。处理这个问题的更好方法是:当观测到验证损失不再改善时就停止训练。回调函数callback是在调用fit时传入模型的一个对象(即实现特定方法的类实例),它在训练过程中的不同时间点都会被模型调用。它可以访问关于模型状态与性能的所有可用数据,还可以采取行动:中断训练、保存模型、加载一组不同的权重或改变模型的状态。

TensorBoardTensorFlow的可视化框架,其主要的用途是在训练过程中帮助以可视化的方法监控模型内部发生的一切。如果监控了除模型最终损失之外的更多信息,那么可以更清楚地了解模型做了什么、没做什么并且能够更快的取得进展。具有一下技巧:

1.在训练过程中以可视化的方式监控指标

2.将模型架构可视化

3.将激活和梯度的直方图可视化

4.以三维的形式研究嵌入

========================================================

【高级架构模式】

1.批标准化:用于让ML学习模型看到的不同样本彼此之间更加相似,这有助于模型的学习与对新数据的泛化。最常见的数据标准形式为:将数据减去其平均值使其中心为0,然后将数据除以其标准差为1。这种分布属于正态分布。

批标准化(Batch normalization)的工作原理是训练过程中在内部保存已读区每批数据均值和方差的指数移动平均值。主要效果是有助于梯度传播,类似残差链接,因此允许更深的网络。自标准化神经网络(self-normalizing neural network)使用特殊的selu激活函数和特殊的lecun_normal初始化器能够让数据通过任何Dense层之后保持数据标准化。

2.深度可分离卷积

3.残差链接

 

【超参数优化】

超参数hyper parameter:堆叠的层数、每层需要的单元或过滤器的个数、使用哪个激活函数、在某一层之后是否应该使用BatchNormalization、使用多大的dropout比率等等,这些在架构层面的参数。其过程如下:

1.选择一组超参数(自动选择)

2.构建相应的模型。

3.将模型在训练数据上拟合,并衡量其在验证数据上的最终性能。

4.选择要尝试的下一组超参数(自动选择)

5.重复上述过程。

6.最后,衡量模型在测试数据上的性能。

这个过程的关键在于给定许多组虚参数,使用验证性能的历史来选择下一组需要评估的超参数的算法,常见有:贝叶斯优化、遗传算法、简单随机搜索等。训练模型权重相对简单:在小批量数据上计算损失函数,然后用反向传播算法让权重向正确的方向移动。与此相反,更新超参数需要考虑以下2点:

1.计算反馈信号(即这组超参数在这个任务上是否得到了一个高性能的模型)的计算代价可能非常高,它需要在数据集上创建一个新模型并从头开始训练

2. 超参数空间通常由很多离散的决定组成,因而既不是连续的也不是可微的,因此通常不能在超参数空间中做梯度下降。相反,必须依赖不适用梯度的优化方法,而这些方法的效率比梯度下降要低很多。

这些挑战很困难,目前只能使用非常有限的工具来优化模型。通常情况下,随机搜索(随机选择需要评估的超参数,并重复这一过程)就是最好的解决方法,也是最简单的解决方案。Keras之父推荐使用用于超参数优化的Python—Hyperopt,其内部使用Parzen估计器的树来预测哪组超参数可能会得到很好的结果

=========================================================== 

      【注意】 在进行大规模超参数自动优化时,需要牢记验证集过拟合这个重要的问题。因为使用验证数据计算出一个信号,然后根据这个信号更新超参数,所以实际上是在验证数据上训练超参数,很快会对验证数据过拟合。 超参数自动优化是一个有潜力的领域

============================================================

【模型集成】

集成是指将一系列不同模型的预测结果汇集到一起,从而得到更好的预测结果。集成依赖于这样的假设:即对于独立训练的不同良好模型,它们变现良好可能是因为不同的原因每个模型都从略有不同的角度观察数据来做出预测,得到了“真相”的一部分但不是全部真相。

以分类问题为例,若想要将一组分类器的预测结果汇集在一起[即分类器集成(ensemble the classifiers)],最简单的方法就是将它们的预测结果取平均值作为预测结果。将分类器集成有一个更聪明的做法,即加权平均,其权重在验证数据上学习得到。通常来说,更好的分类器被赋予更大的权重,而较差的分类器则被赋予较小的权重。为了找到一组好的集成权重,可以使用随机搜索或简单的优化算法(比如Nelder-Mead方法)。

按照机器学习的术语:如果所有模型的偏差都在同一个方向上,那么集成也会保留同样的偏差。如果各个模型的偏差在不同方向上,那 么这些偏差会彼此抵消,集成结果会更加稳定、更加准确。

因此,集成的模型应该尽可能好,同时尽可能不同。这通常意味着使用非常不同的架构, 甚至使用不同类型的机器学习方法。切勿去做的事情就是对相同的网络使用不同的随机初始化多次独立训练然后集成。如果模型之间的唯一区别是随机初始化和训练数据的读取顺序,那么集成的多样性很小,与单一模型相比只会有微小的改进。

有一种方法在实践中非常有效:将基于树的方法(比如随机森林或梯度提升树)和深度神经网络进行集成。集成中的某一个模型来源于与其他模型都不相同的方法(它是正则化的贪婪森林),并且得分也远远低于其他模型。它在集成中被赋予了一个很小的权重,极大地改进了总体的集成结果,因为它和其他所有模型都完全不同, 提供了其他模型都无法获得的信息。集成不在于最佳模型有多好,而在于候选模型集合的多样性

一种在实践中非常成功的基本集成方法是宽且深(wide and deep)的模型类型, 它结合了深度学习与浅层学习。这种模型联合训练一个深度神经网络和一个大型的线性模型。 对多种模型联合训练,是实现模型集成的另一种选择。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值