2012年,对人工智能来说是不平凡的一年,AlexNet赢得了当年的ImgeNet挑战赛,这件在当时看似平常的事却引起了全世界的关注,因为它是第一个赢得该赛事的神经网络模型,从此,人工智能开始由传统机器学习向深度学习过渡。
AlexNet赢得挑战赛后,辛顿和另两位作者立刻成立了DNN Research Inc,并最终以4400万美元的价格拍卖给谷歌。除了谷歌,其它所有的科技公司也都加入到了这场科技界的军备竞赛中,包括远在大洋彼岸的百度,它是这次竞拍的主要发起人。
严格意义上讲,AlexNet并不是第一个神经网络模型,而是Yann LeCun在1998年提出的LeNet,但当时由于算力不足和缺少数据,所以并没有得到广泛应用,在AlexNet赢得比赛后,Yann LeCun也是连夜开会进行复盘总结(为什么不是LeNet?)。虽然LeNet没有成为第一个受到关注的神经网络模型,鉴于他的贡献,Yann LeCun和辛顿后来都被授予了图灵奖。
12年后的今天,深度学习已经成为主流,神经网络在CV,NLP等领域得到广泛应用,CNN和Transformer模型架构也是遍地开花,更幸运的是,我们在开发AI应用过程中,到处都是好用的工具和框架,但这有时也成了一种幸福的烦恼。
各种算子是如何实现?
数据是如何组织?
计算是如何并行化?
主机和GPU如何传输数据?
反向传播怎么计算梯度?
我们对这些细节知之甚少。
在2012年,AlexNet可没那么幸运,当时没有任何成熟的深度学习框架可用于模型训练或者推理。一切只能从零开始,我们在AlexNet另一个作者Alex Krizhevsky主页上找到了AlexNet的源代码,作者使用CUDA/C++从零开始实现模型训练和推理过程。
项目主页:https://code.google.com/archive/p/cuda-convnet/
源代码:https://github.com/ulrichstern/cuda-convnet
这份代码为我们学习神经网络背后的原理提供了一个捷径。
项目主要由Python和C++代码组成,Python用于组织和处理数据,C++则实现了各种算子、网络结构、前向计算和反向传播以及调用CUDA进行并行计算。并通过Python/C API实现C++代码操作Python对象。
定义网络结构
AlexNet通过配置文件构造网络结构,配置文件中每一个[]都代表网络结构中的一层,data代表输入层,conv代表卷积层,pool代表池化层,fc代表全连接层,每一层通过后面的配置项指定了输入、输出等属性。neuron指定激活函数。
在源代码中采用C++面向对象的思想,每一个概念都对应一个类。
编译
训练
代码编译完成后,通过下面代码就可以开始模型训练。