过拟合、欠拟合及其解决方案
1.过拟合、欠拟合的概念
2.权重衰减
3.丢弃法
模型选择、过拟合和欠拟合
训练误差和泛化误差
训练误差:模型在训练数据集上表现出的误差。
泛化误差:模型在任意一个测试数据样本上表现出的误差的期望。
模型选择
验证数据集
除训练集和测试集之外的数据。目的是为了从训练误差估计泛化误差。
k折交叉验证
把原始训练数据集分割成k个不重合的子数据集,然后做k次模型训练和验证。每一次我们使用一个子数据集验证模型,并使用其他k-1个子数据集来训练模型。在这k次训练和验证中,每次用来验证模型的子数据集都不同。最后对这k次训练误差和验证误差分别求平均。
过拟合和欠拟合
欠拟合(underfitting):模型无法得到较低的训练误差
过拟合(overfitting):模型训练误差远小于在测试数据集上的误差
模型复杂度
给定一个由标量数据特征x和对应的标量标签y组成的训练数据集,多项式函数拟合的目标是找一个k阶多项式
来近似y。在上式中, 𝑤𝑘 是模型的权重参数, 𝑏 是偏差参数。与线性回归相同,多项式函数拟合也使用平方损失函数。特别地,一阶多项式函数拟合又叫线性函数拟合。
给定训练数据集,模型复杂度和误差之间的关系:
权重衰减
方法
权重衰减等价于L2范数正则化。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。
L2范数正则化(regularization)
公式:其中 𝑤1,𝑤2 是权重参数, 𝑏 是偏差参数,样本 𝑖 的输入为 𝑥(𝑖)1,𝑥(𝑖)2 ,标签为 𝑦(𝑖) ,样本数为 𝑛 。将权重参数用向量 𝑤=[𝑤1,𝑤2] 表示,带有 𝐿2 范数惩罚项的新损失函数为
其中超参数 𝜆>0 。当权重参数均为0时,惩罚项最小。当 𝜆 较大时,惩罚项在损失函数中的比重较大,这通常会使学到的权重参数的元素较接近0。当 𝜆 设为0时,惩罚项完全不起作用。上式中 𝐿2 范数平方 |𝑤|2 展开后得到 𝑤21+𝑤22 。 有了 𝐿2 范数惩罚项后,在小批量随机梯度下降中,我们将线性回归一节中权重 𝑤1 和 𝑤2 的迭代方式更改为
可见, 𝐿2 范数正则化令权重 𝑤1 和 𝑤2 先自乘小于1的数,再减去不含惩罚项的梯度。因此, 𝐿2 范数正则化又叫权重衰减。权重衰减通过惩罚绝对值较大的模型参数为需要学习的模型增加了限制,这可能对过拟合有效。
丢弃法
假设一个隐藏层输入个数为4,隐藏单元个数为5,且隐藏单元hi(i=1,2,3,4,5)的计算表达式为:ℎ𝑖=𝜙(𝑥1𝑤1𝑖+𝑥2𝑤2𝑖+𝑥3𝑤3𝑖+𝑥4𝑤4𝑖+𝑏𝑖)
这里𝜙 是激活函数,𝑥1,…,𝑥4是输入,隐藏单元𝑖的权重参数为𝑤1𝑖,…,𝑤4𝑖,偏差参数为𝑏𝑖。使用丢弃法时,该层的隐藏单元将有一定概率被丢弃。设丢弃概率为p,具体来说,设随机变量 𝜉𝑖 为0和1的概率分别为 𝑝 和 1−𝑝 。使用丢弃法时我们计算新的隐藏单元 ℎ′𝑖
由于𝐸(𝜉𝑖)=1−𝑝 ,因此
即丢弃法不改变其输入的期望值。让我们对之前多层感知机的神经网络中的隐藏层使用丢弃法,一种可能的结果如图所示,其中 ℎ2 和 ℎ5 被清零。这时输出值的计算不再依赖 ℎ2 和 ℎ5 ,在反向传播时,与这两个隐藏单元相关的权重的梯度均为0。由于在训练中隐藏层神经元的丢弃是随机的,即 ℎ1,…,ℎ5 都有可能被清零,输出层的计算无法过度依赖 ℎ1,…,ℎ5 中的任一个,从而在训练模型时起到正则化的作用,并可以用来应对过拟合。在测试模型时,我们为了拿到更加确定性的结果,一般不使用丢弃法
梯度消失和梯度爆炸
当神经网络的层数较多时,模型的数值稳定性容易变差。
Xavier随机初始化
假设某全连接层的输入个数为a,输出个数为b,Xavier随机初始化将使该层中权重参数的每个元素都随机采样于均匀分布
它的设计主要考虑到,模型参数初始化后,每层输出的方差不该受该层输入个数影响,且每层梯度的方差也不该受该层输出个数影响。
协变量偏移
虽然输入的分布可能随时间而改变,但是标记函数,即条件分布(y|x)不会改变。
标签偏移
当真正的标签函数是确定的和不变的,那么协变量偏移将始终保持,包括如果标签偏移也保持。当标签偏移和协变量偏移保持不变时,使用来自标签偏移假设的方法通常是有利的。因为这些方法倾向于操作看起来像标签的对象。
概念偏移
标签本身的定义发生变化。
循环神经网络进阶
GRU
RNN存在的问题:梯度较容易出现衰减或爆炸(BPTT)
门控循环神经网络:捕捉时间序列中时间步距离较大的依赖关系
GRU:
1.重置门有助于捕捉时间序列里短期的依赖关系
2.更新门有助于捕捉时间序列里长期的依赖关系
LSTM
长短期记忆(long short-term memory)
遗忘门:控制上一时间步的记忆细胞
输入门:控制当前时间步的输入
输出门:控制从记忆细胞到隐藏状态
记忆细胞:一种特殊的隐藏状态的信息的流动
深度循环神经网络
双向循环神经网络
机器翻译及相关技术
机器翻译(MT):将一段文本从一种语言自动翻译为另一种语言,用神经网络解决这个问题通常称为神经机器翻译(NMT)。 主要特征:输出是单词序列而不是单个单词。 输出序列的长度可能与源序列的长度不同。
Encoder-Decoder
encoder:输入到隐藏状态
decoder:隐藏状态到输出
Sequence to Sequence模型
模型:
具体结构:
其中在训练过程中,Encoder使用的是rnn里面的LSTM模型。损失函数用的是SequenceMask函数,其中SequenceMask函数有三个输入量,分别是X,X_len,value,输入X之后,乘一个张量,张量长度为X_len,值为value。
Beam Search
在进行decoder时,一般采用贪心算法,但是这只是寻求局部最优解。或者是维特比算法,通过将所有单词进行连接,求得整体分数最高的句子,但是这样会使得搜索空间太大,耗费大量资源。所以我们使用一种方法较集束搜索,在选择第一个单词时,选择置信比最高的两个来进行搜索。如下图:注意力机制与Seq2seq模型
注意力机制
Attention 是一种通用的带权池化方法,输入由两部分构成:询问(query)和键值对(key-value pairs)。 𝐤𝑖∈ℝ𝑑𝑘,𝐯𝑖∈ℝ𝑑𝑣 . Query 𝐪∈ℝ𝑑𝑞 , attention layer得到输出与value的维度一致 𝐨∈ℝ𝑑𝑣 . 对于一个query来说,attention layer 会与每一个key计算注意力分数并进行权重的归一化,输出的向量 𝑜 则是value的加权求和,而每个key计算的权重与value一一对应。
为了计算输出,我们首先假设有一个函数 𝛼 用于计算query和key的相似性,然后可以计算所有的 attention scores 𝑎1,…,𝑎𝑛 by
𝑎𝑖=𝛼(𝐪,𝐤𝑖).
我们使用softmax函数,获得注意力权重:
𝑏1,…,𝑏𝑛=softmax(𝑎1,…,𝑎𝑛)
最终输出的就是value的加权求和:𝐨=∑𝑏𝑖𝐯𝑖.
不同的attetion layer的区别在于score函数的选择。
点积注意力
通过计算query和key转置的乘积来计算attention_score,通常还会除去减少计算出来的score对维度d的依赖性,如下:多层感知机注意力
在多层感知机中,我们首先将query and keys 投影到Rh。为了更具体,我们将可以学习的参数做如下映射 𝐖𝑘∈ℝℎ×𝑑𝑘 , 𝐖𝑞∈ℝℎ×𝑑𝑞 , and 𝐯∈ℝℎ . 将score函数定义:
然后将key 和 value 在特征的维度上合并(concatenate),然后送至 a single hidden layer perceptron 这层中 hidden layer 为 ℎ and 输出的size为 1 .隐层激活函数为tanh,无偏置.
总结
注意力层显式地选择相关的信息
注意层的内存由键-值对组成,因此它的输出接近于键类似于查询的值
引入注意力机制的Seq2seq模型
将注意机制添加到sequence to sequence 模型中,以显式地使用权重聚合states。下图展示encoding 和decoding的模型结构,在时间步为t的时候。此刻attention layer保存着encodering看到的所有信息——即encoding的每一步输出。在decoding阶段,解码器的 𝑡 时刻的隐藏状态被当作query,encoder的每个时间步的hidden states作为key和value进行attention聚合. Attetion model的输出当作成上下文信息context vector,并与解码器输入 𝐷𝑡 拼接起来一起送到解码器
下图展示了seq2seq机制的所以层的关系,下面展示了encoder和decoder的layer结构:
解码器
我们添加了一个MLP注意层,它的隐藏大小与解码器中的LSTM层相同。然后我们通过从编码器传递三个参数来初始化解码器的状态:
the encoder outputs of all timesteps:encoder输出的各个状态,被用于attetion layer的memory部分,有相同的key和values
the hidden state of the encoder’s final timestep:编码器最后一个时间步的隐藏状态,被用于初始化decoder 的hidden state
the encoder valid length: 编码器的有效长度,借此,注意层不会考虑编码器输出中的填充标记(Paddings)
在解码的每个时间步,我们使用解码器的最后一个RNN层的输出作为注意层的query。然后,将注意力模型的输出与输入嵌入向量连接起来,输入到RNN层。虽然RNN层隐藏状态也包含来自解码器的历史信息,但是attention model的输出显式地选择了enc_valid_len以内的编码器输出,这样attention机制就会尽可能排除其他不相关的信息。
Transformer
卷积神经网络
二维卷积层
二维互相关运算
二维互相关(cross-correlation)运算的输入是一个二维输入数组和一个二维核(kernel)数组,输出也是一个二维数组,其中核数组通常称为卷积核或过滤器(filter)。卷积核的尺寸通常小于输入数组,卷积核在输入数组上滑动,在每个位置上,卷积核与该位置处的输入子数组按元素相乘并求和,得到输出数组中相应位置的元素。图1展示了一个互相关运算的例子,阴影部分分别是输入的第一个计算区域、核数组以及对应的输出。
二维卷积层
二维卷积层将输入和卷积和做互相关运算,并加上一个标量偏置来得到输出。
特征图和感受野
二维卷积层输出的二维数组可以看作是输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map)。影响元素 𝑥 的前向计算的所有可能输入区域(可能大于输入的实际尺寸)叫做 𝑥 的感受野(receptive field)。
以二维互相关运算图为例,输入中阴影部分的四个元素是输出中阴影部分元素的感受野。我们将图中形状为 2×2 的输出记为 𝑌 ,将 𝑌 与另一个形状为 2×2 的核数组做互相关运算,输出单个元素 𝑧 。那么, 𝑧 在 𝑌 上的感受野包括 𝑌 的全部四个元素,在输入上的感受野包括其中全部9个元素。可见,我们可以通过更深的卷积神经网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征。
填充和步幅
填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素),下图
里我们在原输入高和宽的两侧分别添加了值为0的元素。
如果原输入的高和宽是 𝑛ℎ 和 𝑛𝑤 ,卷积核的高和宽是 𝑘ℎ 和 𝑘𝑤 ,在高的两侧一共填充 𝑝ℎ 行,在宽的两侧一共填充 𝑝𝑤 列,则输出形状为:
(𝑛ℎ+𝑝ℎ−𝑘ℎ+1)×(𝑛𝑤+𝑝𝑤−𝑘𝑤+1)
我们在卷积神经网络中使用奇数高宽的核,比如 3×3 , 5×5 的卷积核,对于高度(或宽度)为大小为 2𝑘+1 的核,令步幅为1,在高(或宽)两侧选择大小为 𝑘 的填充,便可保持输入与输出尺寸相同。
步幅:在互相关运算中,卷积核在输入数组上滑动,每次滑动的行数与列数即是步幅(stride)。此前我们使用的步幅都是1,下图展示了在高上步幅为3、在宽上步幅为2的二维互相关运算。
一般来说,当高上步幅为𝑠ℎ,宽上步幅为𝑠𝑤时,输出形状为:
⌊(𝑛ℎ+𝑝ℎ−𝑘ℎ+𝑠ℎ)/𝑠ℎ⌋×⌊(𝑛𝑤+𝑝𝑤−𝑘𝑤+𝑠𝑤)/𝑠𝑤⌋
如果𝑝ℎ=𝑘ℎ−1,𝑝𝑤=𝑘𝑤−1,那么输出形状将简化为⌊(𝑛ℎ+𝑠ℎ−1)/𝑠ℎ⌋×⌊(𝑛𝑤+𝑠𝑤−1)/𝑠𝑤⌋。更进一步,如果输入的高和宽能分别被高和宽上的步幅整除,那么输出形状将是(𝑛ℎ/𝑠ℎ)×(𝑛𝑤/𝑠𝑤)。
当𝑝ℎ=𝑝𝑤=𝑝时,我们称填充为𝑝;当𝑠ℎ=𝑠𝑤=𝑠时,我们称步幅为𝑠。
多输入通道和多输出通道
之前的输入和输出都是二维数组,但真实数据的维度经常更高。例如,彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是 ℎ 和 𝑤 (像素),那么它可以表示为一个 3×ℎ×𝑤 的多维数组,我们将大小为3的这一维称为通道(channel)维。
多输入通道
卷积层的输入可以包含多个通道,如下图则是一个含2个输入通道的二维互相关计算的例子。
多输出通道
卷积层的输出也可以包含多个通道,设卷积核输入通道数和输出通道数分别为 𝑐𝑖 和 𝑐𝑜 ,高和宽分别为 𝑘ℎ 和 𝑘𝑤 。如果希望得到含多个通道的输出,我们可以为每个输出通道分别创建形状为 𝑐𝑖×𝑘ℎ×𝑘𝑤 的核数组,将它们在输出通道维上连结,卷积核的形状即 𝑐𝑜×𝑐𝑖×𝑘ℎ×𝑘𝑤 。
对于输出通道的卷积核,我们提供这样一种理解,一个 𝑐𝑖×𝑘ℎ×𝑘𝑤 的核数组可以提取某种局部特征,但是输入可能具有相当丰富的特征,我们需要有多个这样的 𝑐𝑖×𝑘ℎ×𝑘𝑤 的核数组,不同的核数组提取的是不同的特征。
1*1卷积层
1*1卷积层可以通过改变通道数来获得输出的通道数,如下图:
卷积层与全连接层的对比
二维卷积层经常用于处理图像,与此前的全连接层相比,它主要有两个优势:
一是全连接层把图像展平成一个向量,在输入图像上相邻的元素可能因为展平操作不再相邻,网络难以捕捉局部信息。而卷积层的设计,天然地具有提取局部信息的能力。
二是卷积层的参数量更少。不考虑偏置的情况下,一个形状为 (𝑐𝑖,𝑐𝑜,ℎ,𝑤) 的卷积核的参数量是 𝑐𝑖×𝑐𝑜×ℎ×𝑤 ,与输入图像的宽高无关。假如一个卷积层的输入和输出形状分别是 (𝑐1,ℎ1,𝑤1) 和 (𝑐2,ℎ2,𝑤2) ,如果要用全连接层进行连接,参数数量就是 𝑐1×𝑐2×ℎ1×𝑤1×ℎ2×𝑤2 。使用卷积层可以以较少的参数数量来处理更大的图像。
池化
二维池化层
池化层主要用于缓解卷积层对位置的过度敏感性。同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出,池化层直接计算池化窗口内元素的最大值或者平均值,该运算也分别叫做最大池化或平均池化。图6展示了池化窗口形状为 2×2 的最大池化。
二维平均池化的工作原理与二维最大池化类似,但将最大运算符替换成平均运算符。池化窗口形状为 𝑝×𝑞 的池化层称为 𝑝×𝑞 池化层,其中的池化运算叫作 𝑝×𝑞 池化。
池化层也可以在输入的高和宽两侧填充并调整窗口的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的工作机制一样。
在处理多通道输入数据时,池化层对每个输入通道分别池化,但不会像卷积层那样将各通道的结果按通道相加。这意味着池化层的输出通道数与输入通道数相等。
LeNet
LeNet模型
LeNet模型分为卷积层快和全连接层块两个部分
卷积层块里的基本单位是卷积层后接平均池化层:卷积层用来识别图像里的空间模式,如线条和物体局部,之后的平均池化层则用来降低卷积层对位置的敏感性。
卷积层块由两个这样的基本单位重复堆叠构成。在卷积层块中,每个卷积层都使用 5×5 的窗口,并在输出上使用sigmoid激活函数。第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。
全连接层块含3个全连接层。它们的输出个数分别是120、84和10,其中10为输出的类别个数。
深度卷积神经网络(AlexNet)
机器学习的特征提取:手工定义的特征提取函数
神经网络的特征提取:通过学习得到数据的多级表征,并逐级表示越来越抽象的概念或模式。
AlexNet
特征:
1.8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。
2.将sigmoid激活函数改成了更加简单的ReLU激活函数。
3.用Dropout来控制全连接层的模型复杂度。
4.引入数据增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。
使用重复元素的网络(VGG)
VGG:通过重复使⽤简单的基础块来构建深度模型。
Block:数个相同的填充为1、窗口形状为 3×3 的卷积层,接上一个步幅为2、窗口形状为 2×2 的最大池化层。
卷积层保持输入的高和宽不变,而池化层则对其减半。
网络中的网络(NiN)
LeNet、AlexNet和VGG:先以由卷积层构成的模块充分抽取 空间特征,再以由全连接层构成的模块来输出分类结果。
NiN:串联多个由卷积层和“全连接”层构成的小⽹络来构建⼀个深层⽹络。
⽤了输出通道数等于标签类别数的NiN块,然后使⽤全局平均池化层对每个通道中所有元素求平均并直接⽤于分类。
1×1卷积核作用:
1.放缩通道数:通过控制卷积核的数量达到通道数的放缩。
2.增加非线性。1×1卷积核的卷积过程相当于全连接层的计算过程,并且还加入了非线性激活函数,从而可以增加网络的非线性。
3.计算参数少
NiN重复使⽤由卷积层和代替全连接层的1×1卷积层构成的NiN块来构建深层⽹络。
NiN去除了容易造成过拟合的全连接输出层,而是将其替换成输出通道数等于标签类别数 的NiN块和全局平均池化层。
NiN的以上设计思想影响了后⾯⼀系列卷积神经⽹络的设计。
GoogleNet
由Inception基础块组成。
Inception块相当于⼀个有4条线路的⼦⽹络。它通过不同窗口形状的卷积层和最⼤池化层来并⾏抽取信息,并使⽤1×1卷积层减少通道数从而降低模型复杂度。
可以⾃定义的超参数是每个层的输出通道数,我们以此来控制模型复杂度。
完整模型结构如下: