目录
深度学习之前的网络
机器学习
几何学
特征工程
总结
深度卷积神经网络的突破的两个关键因素
数据
ImageNet(2010)
硬件
90年:数据量和计算能力发展的均匀且都不大的时候——神经网络
00年:内存不错、算力也不错,数据有增加但是规模还不算多的时候——核方法
10年以后:计算量更多了,可以构造更加深的网络了——又回到了神经网络
AlexNet
兴起的原因
网络架构
更多细节
复杂度
总结
代码实现 AlexNet
QA
深度学习之前的网络
机器学习
在2000年的时候,机器学习里面最火的、最主流的算法绝对是——核方法
什么是核方法呢?
1.特征提取
2.选择核函数来计算相关性——通过核函数计算之后就会变成一个凸优化的问题
说人话就是:如何判断在高维空间里面两个点是如何相关的
- 线性模型的话可以做内积
- 通过核方法的话可以变换整个空间,把这个空间拉成我们想要的样子
3.凸优化问题
线性模型就是一个凸优化问题——所以它可以有一个很好的理论解,可以把显式解写出来
4.漂亮的定理
因为是凸优化,所以可以拥有比较好的定理
整个核方法最大的特色就是:有一套完整的泛函数学定理,用来计算
- 模型的复杂度
- 在xxx情况下会发生xxx事情
这也是在2000年的时候核方法可以替代掉神经网络,称为当时机器学习最主流的算法的原因
哪怕到现在SVM仍然被积极的使用,因为它确实对参数不怎么敏感(不太需要调参)
几何学
目前为止我们讲的神经网络多为卷积神经网络,卷积神经网络(特别是2d卷积神经网络)通常是用在图片上面,也就是计算机视觉。
在2000年左右,计算机视觉关心的问题大多都是从几何学那边迁移过来的
几何学的核心思想:
1.特征抽取
2.描述几何(例如多相机)
将整个计算机视觉的问题描述为几何问题,例如:三个相机拍照,通过相机的位置来还原3D的情况
3.(非)凸优化
如果有很好的模型,可以把问题表示为一个很好的凸优化函数
4.漂亮定理
同样的,因为应用了凸优化,所以可以拥有很好的定理证明;
一些特殊的非凸优化的问题,也有一些定理
几何方法的特点就是:如果定理的假设(比如对整个世界做了一个比较简单的物理模型的假设)满足,效果会非常好(这现在仍然是很多学科在做的工作)
特征工程
其实在计算机视觉里面,最重要的是特征工程——就是对一张图片怎么去抽取特征
我们现在神经网络是直接把原始像素输入进模型,但是如果同样直接把原始像素输入进SVM,效果会非常非常差。所以在过去的很多年,计算机视觉的研究者就怎么抽取图像特征这方面提出了非常多的算法:
- SIFT
去抽取各个方向、各个角度的小向量来描述这个图片
- SURF
如果特征工程抽取的特征非常好的话,后面用一个非常简单的多分类模型就可以达到很好的效果(例如SVM)。
总结
在深度学习之前,整个计算机视觉大家其实不那么关心机器学习的模型是什么样子,关键在于如何去做特征提取,即原始图片如何去抽取特征使得机器学习更容易去学习。所以当时整个计算机视觉就是针对不一样的问题来抽取不一样的特征。
深度卷积神经网络的突破的两个关键因素
数据
ImageNet(2010)
和MNIST数据集相比:(类多了100倍,样本多了1000倍)
- 不再是黑白灰度图而变为彩色图片
- 大小也从28 x 28升级为 469 x 387(google图像搜索大小)
- 样本数从 60K 到 1.2M
- 类别从 9类 到 1000类(ImageNet竞赛数据大小)
因为有了这么大的数据集,才能用更深的网络去抽取特征,因为包含许多特征的深度模型需要大量的有标签数据,才能显著优于基于凸优化的传统方法(如线性方法和核方法)
硬件
在过去60年里面硬件的发展趋势如下图所示:
第一行:数据集大小
第二行:内存大小
第三行:计算能力
从图里面可以看出
从70年到20年,数据大小方面,容量大概增加了1000倍;而计算能力因为GPU的兴起,突飞猛进了10000倍。所以计算能力的增长远超于数据量的增长,因为这种差异,导致了不同年点模型的区别。
90年:数据量和计算能力发展的均匀且都不大的时候——神经网络
因为神经网络相对于是一种比较便宜的模型框架,虽然计算量比较大,但是内存要求不是很高
00年:内存不错、算力也不错,数据有增加但是规模还不算多的时候——核方法
原因有三:①简单②理论完备③跑得动:真的能把核矩阵算出来,相较于计算能力也是一个适中的消耗
10年以后:计算量更多了,可以构造更加深的网络了——又回到了神经网络
虽然数据长得没那么块,但是我计算量比以前翻了几十倍,那么就可以更多的挖掘数据里面的信息,也就是说去构造更加深的网络,用计算去换取目标的精度
PS:说不定再过十年核方法又回来了哈哈哈,我们已经处在了神经网络的第二个十年里面了。第一个神经网络也就只兴起了十年多,然后就去造芯片了....
AlexNet
掀起当下这波深度学习热潮的模型
兴起的原因
-
AlexNet赢得了2012年ImageNet竞赛
-
更深更大的LeNet:在架构上其实没太根本的区别
-
主要改进:
-
丢弃法(Dropout):做模型的控制,因为模型更大了,用丢弃法来做模型的正则
-
ReLU:跟Sigmoid比,ReLU梯度更大,而且在零点的一阶导更好一些,可以支撑更深的模型
-
MaxPooling:使得输出值比较大,梯度比较大,训练会更容易一些
-
-
计算机视觉方法论的改变:LeNet人们还认为它只是个机器学习的模型,而AlexNet增大了几十倍,由量变引起了质变,把人们之前对于计算机视觉的观念改变了。如下图所示:
在AlexNet之前,人们的兴趣和重点都放在人工特征提取这块,来研究如何把人对问题的理解转换为标准的机器学习的数值;
而AlexNet除了最后一层可以理解成Softmax回归来计算概率,之前的所有层都可以理解成模型在自己学习特征,每一个CNN的通道都在独立的学习特征,最后使得Softmax可以很好的进行分类。这样做的好处是:
- 构造CNN相对来说很简单,不需要了解太多计算机视觉的专业知识
- 更容易跨到不同的问题或学科上面去解决
网络架构
在AlexNet的第一层,卷积窗口的形状是11×11,96的通道数,步长为4
- 由于ImageNet中大多数图像的宽和高比MNIST图像的多10倍以上,因此,需要一个更大的卷积窗口来捕获目标。
- 从6——>96的通道数,表明图片尺寸变大了,包含了更多的通道数,想在第一层就尝试识别出来
- 步长为4是受当时算力限制,如果步长不为4的话后面计算量会变得太大
第二层中的卷积窗口形状被缩减为 5×5,填充 2,输出通道 256;然后是 3×3,填充 1。
- 填充(pad)为 2 即使得输入输出尺寸一样
- 通道数AlexNet直接拉到 256,比LeNet的 16 翻了十几倍:同样 AlexNet 还是希望能识别更多的模式在这一层,所以使用了更大的输出通道
- AlexNet 比 LeNet 多了三个连续的 384 通道的卷积层,最后做一次池化层
此外,在第一层、第二层和第五层卷积层之后,加入窗口形状为 3×3、步幅为 2 的最大汇聚 MaxPooling 层。
- LeNet池化层是2 x 2且步长也为2,即不重叠的;
- 而AlexNet是3 x 3步长为2,会存在一定程度的重叠;
- 相同的是两个模型都选择在池化层将数据量减半(2步长)
在最后一个卷积层后有两个全连接层,分别有4096个输出。 这两个巨大的全连接层拥有将近1GB的模型参数。
- 因为 AlexNet 所用的数据集 ImageNet 有1000类的输出类别,所以需要一个巨大的全连接来支撑
由于早期GPU显存有限,原版的AlexNet采用了双数据流设计,使得每个GPU只负责存储和计算模型的一半参数。 幸运的是,现在GPU显存相对充裕,所以现在很少需要跨GPU分解模型。
更多细节
- 激活函数从Sigmoid变为ReLU(减缓梯度消失,ReLU在正向指标上面梯度总是为1,零点处一阶导数为1,更容易数值稳定)
ReLU激活函数使训练模型更加容易。 当sigmoid激活函数的输出非常接近于0或1时,这些区域的梯度几乎为0,因此反向传播无法继续更新一些模型参数。 相反,ReLU激活函数在正区间的梯度总是1。 因此,如果模型参数没有正确初始化,sigmoid函数可能在正区间内得到几乎为0的梯度,从而使模型无法得到有效的训练。
- 隐藏全连接层后加入了丢弃层(两个4096之后)
- 数据增强:AlexNet觉得10000张图片不够大,包括但不仅限于:随机截取、随机改变亮度、随即调整色温....用这样的变种改善卷积对于光照、位置的敏感程度;这样的操作也可以降低模型记住数据的能力(过拟合)
复杂度
参数个数:AlexNet 比 LeNet 多了10倍
但是考虑到 ImageNet 数据集比 MNIST大了不止10倍的情况下这个参数量不算大了
FLOP(前向传播需要的浮点计算数): AlexNet 比 LeNet 贵了250倍
这个是真的区别很大!!虽然参数只多了 10 倍,但是因为卷积神经网络所有参数都是乘在一起的,所以导致最后计算量根本不在一个层级上面
虽然但是,这个AlexNet在现在看已经是一个很便宜的神经网络了哈哈哈
总结
-
AlexNet的架构与LeNet相似,但使用了更多的卷积层和更多的参数来拟合大规模的ImageNet数据集。
-
今天,AlexNet已经被更有效的架构所超越,但它是从浅层网络到深层网络的关键一步。
-
尽管AlexNet的代码只比LeNet多出几行,但学术界花了很多年才接受深度学习这一概念,并应用其出色的实验结果。这也是由于缺乏有效的计算工具。
-
Dropout、ReLU 和 数据增强 是提升计算机视觉任务性能的其他关键步骤。
代码实现 AlexNet
import torch
from torch import nn
from d2l import torch as d2lnet = nn.Sequential(# 这里使用一个11*11的更大窗口来捕捉对象。# 同时,步幅为4,以减少输出的高度和宽度。# 另外,输出通道的数目远大于LeNetnn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),# 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2),# 使用三个连续的卷积层和较小的卷积窗口。# 除了最后的卷积层,输出通道的数量进一步增加。# 在前两个卷积层之后,汇聚层不用于减少输入的高度和宽度nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2), # 到此为止是所有的卷积单元(4D->4D)nn.Flatten(),# 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合nn.Linear(6400, 4096), nn.ReLU(),nn.Dropout(p=0.5), # 丢弃概率0.5,即有一半的概率把输出置0nn.Linear(4096, 4096), nn.ReLU(),nn.Dropout(p=0.5),# 最后是输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000nn.Linear(4096, 10))
上面代码最后一层卷积输出应该是384,但由于改了这个后面线性层的输入也要改所以懒得算了.....SORRY
因为这段代码跑的是Fashion-MNIST数据集,所以最后一个mlp输出的类别是10,如果跑ImageNet的话应该是1000
构造一个单通道数据,来观察每一层输出的形状
X = torch.randn(1, 1, 224, 224)
for layer in net:X=layer(X)print(layer.__class__.__name__,'output shape:\t',X.shape)
QA
1、ImageNet是否已经成为历史了?
绝对没有!!虽然是一个十年前的数据集,但是它还是绝大多数论文来证明自己效果好的数据集。毕竟当时构造的时候也是花了差不多100万美金...当时都是手动标的数据
2、为什么2000年的时候神经网络会被核方法代替
①当时的硬件,深的学不动,浅的效果一般
②核方法理论更漂亮,学术界还是更喜欢理论一些
3、其他学习资料里面,AlexNet 会提到里面的 Local Response Normalization 没太懂
没啥用的东西,其实一个网络模型提出,不会去深究里面到底是什么模块起作用了,就是觉得哦好用,发布之后后面的人会一个个模块去研究尝试什么东西是好用的,这个LRM模块后面实验做下来发现没啥用,不懂也没关系
4、为什么AlexNet最后要有两个相同的全连接Dense(4096) ?一个行吗?
密集层(Dense Layer)是深度学习中常用的一种神经网络层,也被称为全连接层(Fully Connected Layer)或线性层(Linear Layer)。
还真不行!你可以自己试一试。效果会差,因为前面的卷积把特征抽的不够好不够深,所以需要两个巨大的全连接层来稳固。
5、为什么 LeNet 不属于深度卷积神经网络
那帮搞深度学习的人,最厉害的不是调参什么的,其实最厉害的是包装——取名大师。老学术了... deep 就是它们想出来的一个很适合市场的词。神经网络在 Attention 和 Transformer 之前没有什么很新的东西。