动手学习深度学习Task3+Task4+Task5

Task03:过拟合、欠拟合及其解决方案;梯度消失、梯度爆炸;循环神经网络进阶(1天)
Task04:机器翻译及相关技术;注意力机制与Seq2seq模型;Transformer(1天)
Task05:卷积神经网络基础;leNet;卷积神经网络进阶(1天)
因为我的方向是自然语言处理所以接下来重点记录下任务3和任务4

Task03:

过拟合与欠拟合

训练数据集,模型复杂度和误差之间的关系


image.png

导致原因:训练数据不足,模型太过于复杂/简单。
解决办法:加数据量,权重衰减,丢弃法。

权重衰减

权重衰减等价于 范数正则化(regularization)。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。

丢弃法:

丢弃法除了可以防止过拟合,还能让模型学到多样的数据,提升模型性能,加快收敛速度。
让我们对之前多层感知机的神经网络中的隐藏层使用丢弃法,一种可能的结果如图所示,其中h2和h5被清零。这时输出值的计算不再依赖h2和h5,在反向传播时,与这两个隐藏单元相关的权重的梯度均为0。由于在训练中隐藏层神经元的丢弃是随机的,即h1...h5都有可能被清零,输出层的计算无法过度依赖h1...h5中的任一个,从而在训练模型时起到正则化的作用,并可以用来应对过拟合。在测试模型时,我们为了拿到更加确定性的结果,一般不使用丢弃法


梯度消失和爆炸

造成的原因:Sigmoid激活函数饱和区,网络层数过多,梯度呈指数级变化
解决的办法:好的参数初始化,非饱和的激活函数(Relu),批量规范化,LSTM,梯度阶段。

考虑环境因素

协变量偏移

这里我们假设,虽然输入的分布可能随时间而改变,但是标记函数,即条件分布P(y∣x)不会改变。虽然这个问题容易理解,但在实践中也容易忽视。

想想区分猫和狗的一个例子。我们的训练数据使用的是猫和狗的真实的照片,但是在测试时,我们被要求对猫和狗的卡通图片进行分类。
显然,这不太可能奏效。训练集由照片组成,而测试集只包含卡通。在一个看起来与测试集有着本质不同的数据集上进行训练,而不考虑如何适应新的情况,这是不是一个好主意。不幸的是,这是一个非常常见的陷阱。
统计学家称这种协变量变化是因为问题的根源在于特征分布的变化(即协变量的变化)。数学上,我们可以说P(x)改变了,但P(y∣x)保持不变。尽管它的有用性并不局限于此,当我们认为x导致y时,协变量移位通常是正确的假设。

标签偏移

当我们认为导致偏移的是标签P(y)上的边缘分布的变化,但类条件分布是不变的P(x∣y)时,就会出现相反的问题。当我们认为y导致x时,标签偏移是一个合理的假设。例如,通常我们希望根据其表现来预测诊断结果。在这种情况下,我们认为诊断引起的表现,即疾病引起的症状。有时标签偏移和协变量移位假设可以同时成立。例如,当真正的标签函数是确定的和不变的,那么协变量偏移将始终保持,包括如果标签偏移也保持。有趣的是,当我们期望标签偏移和协变量偏移保持时,使用来自标签偏移假设的方法通常是有利的。这是因为这些方法倾向于操作看起来像标签的对象,这(在深度学习中)与处理看起来像输入的对象(在深度学习中)相比相对容易一些。
病因(要预测的诊断结果)导致 症状(观察到的结果)。
训练数据集,数据很少只包含流感p(y)的样本。
而测试数据集有流感p(y)和流感q(y),其中不变的是流感症状p(x|y)。

概念偏移

另一个相关的问题出现在概念转换中,即标签本身的定义发生变化的情况。这听起来很奇怪,毕竟猫就是猫。的确,猫的定义可能不会改变,但我们能不能对软饮料也这么说呢?事实证明,如果我们周游美国,按地理位置转移数据来源,我们会发现,即使是如图所示的这个简单术语的定义也会发生相当大的概念转变。


Image Name

如果我们要建立一个机器翻译系统,分布P(y∣x)可能因我们的位置而异。这个问题很难发现。另一个可取之处是P(y∣x)通常只是逐渐变化。

循环神经网络进阶

GRU

RNN存在的问题:梯度较容易出现衰减或爆炸(BPTT)
⻔控循环神经⽹络:捕捉时间序列中时间步距离较⼤的依赖关系


image.png
image.png

• 重置⻔有助于捕捉时间序列⾥短期的依赖关系;
• 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。
Pytorch简洁实现:
gru_layer = nn.GRU(input_size=vocab_size, hidden_size=num_hiddens)

LSTM

长短期记忆long short-term memory :
遗忘门:控制上一时间步的记忆细胞 输入门:控制当前时间步的输入
输出门:控制从记忆细胞到隐藏状态
记忆细胞:⼀种特殊的隐藏状态的信息的流动


image.png

pytorch简洁实现:
lstm_layer = nn.LSTM(input_size=vocab_size, hidden_size=num_hiddens)

深度循环神经网络

层数变深捕捉更多的信息,ELMO论文发现,不同层具有不同的信息,可以将不同层的隐藏层权值相加。


image.png

双向循环神经网络

为了捕捉上下文的信息,出现双向循环神经网络


image.png

Task4

机器翻译相关技术

端到端的模型
encoder:输入到隐藏状态
decoder:隐藏状态到输出



Sequence to Sequence模型


image.png

Beam Search
简单greedy search:
image.png

维特比算法:选择整体分数最高的句子(搜索空间太大) 集束搜索:
image.png

bleu:
由于各N-gram统计量的精度随着阶数的升高而呈指数形式递减,所以为了平衡各阶统计量的作用,对其采用几何平均形式求平均值然后加权,再乘以长度惩罚因子,得到最后的评价公式:

image

BLEU的原型系统采用的是均匀加权,即Wn=1/N 。N的上限取值为4,即最多只统计4-gram的精度。

注意力机制和Seq2seq模型

可以把注意力机制看成一种池化方法,他将解码层当前时间步的前一步的隐藏层对于encoder每一个的隐藏层求注意力得分,这个注意力得分是隐藏层的加权时的权值,然后把加权后的隐藏层连接当前解码器时间步的词向量作为输入。注意力的求法有很多种。

image.png

Transformer

最新的GPT,BERT都是基于transformer的解码器/编码器构造的,使NLP各项性能大大提升。

在之前的章节中,我们已经介绍了主流的神经网络架构如卷积神经网络(CNNs)和循环神经网络(RNNs)。让我们进行一些回顾:

  • CNNs 易于并行化,却不适合捕捉变长序列内的依赖关系。
  • RNNs 适合捕捉长距离变长序列的依赖,但是却难以实现并行化处理序列。
    为了整合CNN和RNN的优势,[Vaswani et al., 2017] 创新性地使用注意力机制设计了Transformer模型。该模型利用attention机制实现了并行化捕捉序列依赖,并且同时处理序列的每个位置的tokens,上述优势使得Transformer模型在性能优异的同时大大减少了训练时间。
  1. Transformer blocks:将seq2seq模型重的循环网络替换为了Transformer Blocks,该模块包含一个多头注意力层(Multi-head Attention Layers)以及两个position-wise feed-forward networks(FFN)。对于解码器来说,另一个多头注意力层被用于接受编码器的隐藏状态。
  2. Add and norm:多头注意力层和前馈网络的输出被送到两个“add and norm”层进行处理,该层包含残差结构以及层归一化。
  3. Position encoding:由于自注意力层并没有区分元素的顺序,所以一个位置编码层被用于向序列元素里添加位置信息。


    image.png

    因为之前一直使用transformer做很多任务,比较熟悉,所以这里不做过多的记录。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容