3.1 过拟合、欠拟合及解决方案
- 训练误差(training error):模型在训练数据集上表现出的误差;
- 泛化误差(generalization error):模型在任意一个测试数据样本上表现出的误差的期望;(泛化样本是指除训练样本之外的all)
- 验证集:用于调参
- 过拟合、欠拟合如下图所示:
- L2范数正则化(regularization):在模型原损失函数加上L2范数惩罚项(权重参数W中每个元素平方和与一个正的常数的乘积)
丢弃法(只在模型训练时候才用),防止过拟合:
有P 的概率hi会被清零,1-P的概率hi会处以1-P做拉伸。P是超参数
3.2 梯度消失、梯度爆炸以及Kaggle房价预测
- 梯度消失(vanishing):0.2的30次幂
- 梯度爆炸(explosion):2的30次幂(层数很多的时候会导致)
随机初始化:
- Pytorch
torch.nn.init.normal_() #正态分布的初始化
- Xaiver随机初始化
假设某全连接层的输入个数为a,输出个数为b,Xavier随机初始化将使该层中权重参数的每个元素都随机采样于均匀分布
考虑环境因素
- 协变量偏移:使用一个数据集训练,但是用另一个数据集测试(夏季推荐的物品中出现了圣诞礼物) 特征分布的变化(即协变量的变化)。
数学上,我们可以说P(x)改变了,但P(y∣x)保持不变。尽管它的有用性并不局限于此,当我们认为x导致y时,协变量移位通常是正确的假设。 - 标签偏移:使用p训练,但是测试时使用p&q;
- 概念偏移:标签本身的定义发生变化的情况。(在整个美国大陆中soda的变化)
3.3 循环神经网络进阶
同第一次打卡的2.4(和基础整合到一篇中了)
4.1 机器翻译(MT)
将一段文本从一种语言变成另一种语言。
使用神经网络完成通常叫NMT
- 难点在于输入与输出长度不一致
text = text.replace('\xa0', ' ') #将会报错的拉丁文空格替换成普通的空格
Encoder-Decoder(中间有隐藏层的过渡)
seq2seq(使输入始终一致,加入padding)
- 把单词转化为词向量是模型结构的一部分,词向量层一般是作为网络的第一层
4.2 注意力机制
在seq2seq模型中,解码器只能隐式地从编码器的最终状态中选择相应的信息。然而,注意力机制可以将这种选择过程显式地建模。
Attention 是一种通用的带权池化方法,输入由两部分构成:询问(query)和键值对(key-value pairs)。
attention layer得到输出与value的维度一致
有两种
- Dot Product Attention
The dot product 假设query和keys有相同的维度, 通常还会除去维度𝑑的平方根,来减少计算出来的score对维度𝑑的依赖性 - Multilayer Perception Attention
将k&q映射成同维,经过tanh函数非线性化后转化为一阶的float
引入注意力机制的seq2seq
中层结构:
4.3 Transformer
- CNNs 易于并行化,却不适合捕捉变长序列内的依赖关系
- RNNs 适合捕捉长距离变长序列的依赖,但是却难以实现并行化处理序列
与4.1的seq2seq模型相似,Transformer同样基于编码器-解码器架构,其区别主要在于以下三点:
- Transformer blocks:将seq2seq模型中的循环网络替换为了Transformer Blocks,该模块包含一个多头注意力层(Multi-head Attention Layers)以及两个position-wise feed-forward networks(FFN)。对于解码器来说,另一个多头注意力层被用于接受编码器的隐藏状态。
- Add and norm:多头注意力层和前馈网络的输出被送到两个“add and norm”层进行处理,该层包含残差结构以及层归一化。
- Position encoding:由于自注意力层并没有区分元素的顺序,所以一个位置编码层被用于向序列元素里添加位置信息。
自注意力模型:
就这三个头都是它自身,一样的
多头注意力模型:
每个头都会有不同的权重矩阵等参数
Position-wise feed-forward networks(FFN)基于位置的前馈神经网络
Position-wise FFN由两个全连接层组成,他们作用在最后一维上。因为序列的每个位置的状态都会被单独地更新,所以我们称他为position-wise,这等效于一个1x1的卷积。
Add and Norm
Transformer还有一个重要的相加归一化层,它可以平滑地整合输入和其他层的输出,因此我们在每个多头注意力层和FFN层后面都添加一个含残差连接的Layer Norm层。这里 Layer Norm 是对最后一维进行计算。
层归一化可以防止层内的数值变化过大,从而有利于加快训练速度并且提高泛化性能。
h个注意头中,每个头的参数量是3dd,输出结构是hdd,所以总共的参数量是4hdd !!!*
5.1 卷积神经网络基础(CNN)
二维互相关运算(cross-correlation)
输入是一个二维输入数组和一个二维核(kernel)数组,输出也是一个二维数组,其中核数组通常称为卷积核或过滤器(filter)。
二维卷积层
将输入和卷积核做互相关运算,并加上一个标量偏置来得到输出。卷积层的模型参数包括卷积核和标量偏置。
self.weight = nn.Parameter(torch.randn(kernel_size))
#需要训练的可学习参数为nn.Parameter
- 特征图(feature map):输入在空间维度(宽和高)上某一级的表征
- 感受野(receptive field):影响元素x的前向计算的所有可能输入区域(可能大于输入尺寸)
越多层的卷积,感知野越大,可捕捉信息也越多 - 填充(padding):填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)
- 步幅(stride):每次滑动的行数与列数即是步幅(stride)
对步幅进行下取整(S是步幅、P是填充)
彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是h和w(像素),那么它可以表示为一个3 x h x w的多维数组,我们将大小为3的这一维称为通道(channel)维。
- 多输入通道
- 多输出通道
- 1x1卷积层
不改变高和宽只改变通道数 - 卷积层相比于全连接层:
- 全连接层把图像展平成一个向量,在输入图像上相邻的元素可能因为展平操作不再相邻,网络难以捕捉局部信息。而卷积层的设计,天然地具有提取局部信息的能力。
- 卷积层的参数量更少
有偏置的话就做加法,这个的参数量与输入图像的宽高无关
e.g. 256x256的RGB图像,输出有1000个神经元,全连接层的参数有256x256x3x1000+1000 = 196609000
- 池化层:池化层主要用于缓解卷积层对位置的过度敏感性。
在处理多通道输入数据时,池化层对每个输入通道分别池化,但不会像卷积层那样将各通道的结果按通道相加。这意味着池化层的输出通道数与输入通道数相等。
nn.MaxPool2d #最大池化
nn.AvgPool #平均池化
5.2 LeNet
使用全连接层的局限性:
- 图像在同一列邻近的像素在这个向量中可能相距较远。它们构成的模式可能难以被模型识别。
- 对于大尺寸的输入图像,使用全连接层容易导致模型过大。
使用卷积层的优势:
- 卷积层保留输入形状。
- 卷积层通过滑动窗口将同一卷积核与不同位置的输入重复计算,从而避免参数尺寸过大。
LeNet分为卷积层块和全连接层块两个部分
交替使用卷积层和最大池化层之后再接全连接层,进行图像分类
5.3 卷积神经网络进阶
AlexNet
- 相对固定的模型结构;
- 使用ReLU代替sigmoid;
- 使用Dropout来控制模型的复杂度;
- 引入数据增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合
使用重复元素的网络(VGG)
Block:数个相同的填充为1,窗口形状为3x3的卷积层(输入高宽不变)接上一个步幅为2,窗口形状为2x2的最大池化层(输入高宽减半)
# 每经过一个vgg_block都会使宽高减半
net.add_module("vgg_block_" + str(i+1),
vgg_block(num_convs, in_channels, out_channels))
网络中的网络(NiN)
串联多个由卷积层和“全连接”层构成的小⽹络来构建⼀个深层⽹络。
⽤了输出通道数等于标签类别数的NiN块,然后使⽤全局平均池化层对每个通道中所有元素求平均并直接⽤于分类。
1x1卷积层的作用:
- 放缩通道数;
- 增加非线性;(相当于全连接+非线性函数)
- 计算参数少;
GoogleNet
- 由Inception基础块组成。
- Inception块相当于⼀个有4条线路的子网络。它通过不同窗口形状的卷积层和最大池化层来并行抽取信息,并使用1×1卷积层减少通道数从而降低模型复杂度。
- 可以⾃定义的超参数是每个层的输出通道数,我们以此来控制模型复杂度。
完整模型结构:
其中的Global AvgPool = 最大值池化层
每经过一层,特征数都会变成二倍,map大小会除以二,提取得特征越发的高级。