李沐dl笔记
vgg
内存占用大,推理慢(深),但效果好
卷积层参数小,全连接层最大问题是参数太大过拟合
所以最后一层全连接是很大的问题
大参数还有内存 bound 的问题
NiN
用卷积层替代全连接
两个 1*1 卷积无 padding, stride1 起全连接的作用(只做通道混合)
每个卷积后面跟两个全连接作为 NiN block
交替使用 NiN 块和 stride = 2 的 maxpooling 逐步减小高宽和增大通道数
最后使用全局平均池化得到输出(通道数 = 分类个数)
打印结构:
for layer in net:
X = layer(X)
print(layer.__class__.__name__, "output shape:\t", X.shape)
超级宽的 hidden layer: 非常容易过拟合
泛化性提高-> 收敛变慢
全连接的方案: 非常强, 收敛很快
GoogLeNet
inception 块: 不做选择, 全都要
output = output1 + o2 + o3 + o4
o1 = conv1x1
o2 = conv1x1 + conv3x3, padding 1
o3 = conv1x1 + conv3x3, padding 1 + conv5x5, padding 2
o4 = 3x3 maxpool, padding 1
四条路径从不同层面抽取信息, 在输出通道合并 concatenation
四条路径分配不同的通道数(你认为那种模式哪个通道的信息更重要)
降低通道数来控制模型复杂度
googlenet 5 段, 9 个 inception 块
不降低维数的 1x1 卷积就是通道融合
第一个 stage 总是把通道数拉上去, 高宽减下去, 先筛选出足够多的特征
v2: batch normalization
v3: 5x5-> 3x3, 5x5-> 1x7+7x1(单长和单宽)
v4: 残差连接
优点是模型参数少, 计算复杂度低
批量归一化
损失出现在最后, 后面的层训练快
反向传播: loss 在顶层, 数据在最底部, 底部的层(前面的层)训练慢, 底部层一变, 所有都得跟着变
导致离 loss 近的后面层需要重新学习多次, 导致收敛变慢
有没有方法让学习前面层的时候避免变化后面层?
批量归一化: 将分布固定, 来让输出模式稳定一些, 固定小批量的均值和方差
正则化, 将数据分布固定为 正态分布, 数据的修改只是在变化正态分布的超参数, 限制变化不要太剧烈
对于全连接, 作用 在激活函数前面, 作用在特征维度
对卷积, 作用在通道维
效果太好了, 原始论文觉得是减少内部协变量转移, 后续发现 可能就是等效于在每个小批量里面加入噪音来控制模型, 均值近似于随机偏移, 方差近似于随机缩放
因此没必要和丢弃混合使用
加速收敛(模式更稳定之后可以把 lr 调得更大), 但一般不改变模型精度
根据内存挑 batch size, 不能太大也不能太小, 然后调学习率和 epoch
ResNet
残差的重要性不必多言
深网络必有残差思想
新硬件
DSP 主要做数字计算处理长指令, FPGA 可编程阵列
工具链质量良莠不齐, 一次 "编译" 需要很久
AI ASIC: Google TPU eg
核心 systolic array, 专门做大矩阵乘法 2d 计算单元(PE)阵列, 卷积换成矩阵乘法
一般的矩阵乘: 切开和填充匹配 SA 大小
批量输入来降低延时, 其他硬件单元来处理别的 NN 操作子, 例如激活层