多层感知机与softmax层——动手学习深度学习pytorch版
本系列是基于亚马逊李沐老师的教材《动手学习深度学习》,以及 李沐老师对应的视频教程内容展开。但是李沐老师课程中使用的深度学习框架是MXNet,其实选择什么框架并不是重点,重点应该是其中的内容。课程既然叫动手学习深度学习,那当然要动手操作。用MXNet重复一遍教材内容并没有很好的学习效果,另外,我本身还是更喜欢使用pytorch框架,因此,希望将该教材的内容用pytorch实现一遍,并学习相关的知识内容。希望能给其他喜欢pytorch的读者一些帮助。 代码开源供学习使用,如引用请注明出处,谢谢。
1. 内容简介
在“线性回归”章节的内容中,我们介绍了如何实现一个属于自己的线性层,并用自己简单生成的数据集进行了验证,了解了一些有关深度学习训练和pytorch框架的基本知识。在本篇内容中,我们将使用更接近现实情况的数据集,并搭建一个更复杂的神经网络,来完成一个分类问题。
1.1 数据集介绍
使用的数据集是Fashion_MNIST,该数据集共有70000个样本,60000个样本作为训练集,10000个样本作为测试集。70000个样本中,总共包含10种类别的常见物品(见下图)。每张图片的尺寸是28*28的,所以我们可以将图片张开成为1×784的一维向量,作为我们网络的输入。网络的输出就是1×10的向量,向量中的每个元素都可以理解为属于每个种类的预测概率,比如向量的第一个元素代表输入图像属于pullover类别的概率。
1.2 多层感知机(MLP,Multilayer Perceptron)介绍
多层感知机其实就是多个线性层叠加起来的网络,这里我们以两个线性层叠加为例子。第一个线性层的输入就是图像像素个数,也就是784,每个像素都代表输入样本的一个特征,如下图的 x 1 − x 784 x_1-x_{784} x1−x784。非输入和输出的层为我们称为隐藏层,如下图的 z 1 − z n z_1-z_{n} z1−zn,其中这里的n取1000。然后,经过第一个线性层的计算后,输入数据应当从784个特征转化成了1000个特征,再将这1000个特征输入到第二个线性层中,第二个线性层输出维度为10,代表每个类别的概率。具体结构图如下:
注意到上图中有几个特点:
- 图中每个结点可以当作一个神经元。每层的输入神经元和所有的输出神经元都有一条线连着,每条线上都有一个权值 W i j W_{ij} Wij,表示输入的第i个神经元与输出的第j个神经元的权值系数。另外,每个输出神经元都配有一个偏置系数 b j b_j bj。所以,一个输出神经元对应所有输入神经元的结构,就是我们在“线性回归”里使用的简单线性层。这里只是把线性层的输出神经元个数变成了n个。那么,对应于每个输出神经元 z i z_i zi,其计算公式为:
z j = x × W : , j z_j = x×W_{:,j} zj=x×W:,j
其中,x是输入向量, W : , j W_{:,j} W:,j是W矩阵第j列的列向量。
- 在隐藏层的神经元中,除了 z i z_i zi外,还有 a i a_i ai,是什么呢? a i a_i ai是 z i z_i zi经过激活函数激活后的数值,假设激活函数是 σ ( x ) \sigma(x) σ(x),那么就有:
a i = σ ( z i ) a_i=\sigma(z_i) ai=σ(zi)
常用的激活函数在下文中会介绍。这里说明一下为什么要激活函数,因为如果不使用激活函数,那么其实上述网络的输出就是 y = ( x × W + b ) × W ′ + b ′ ⇔ y = x × W n e w + b n e w y=(x×W+b)×W'+b' \Leftrightarrow y=x×W_{new}+b_{new} y=(x×W+b)×W′+b′⇔y=x×Wnew+bnew,也就是说,无论你叠多少层线性层,如果不加激活函数,那么其实和只有一层线性层是等价的。而加入了激活函数后,通常激活函数是非线性的,所以就有:
y = σ ( x × W + b ) × W ′ + b ′ y=\sigma(x×W+b)×W'+b' y=σ(x×W+b)×W′+b′
这样,整个网络的映射就具备了非线性能力,不再等价于普通的线性层了。注意,最后一层线性层的输出通常就不需要激活函数激活了,对于分类问题,会使用下文提到的Softmax层进行归纳总结。 - 图中所有的 W i j , W i ′ j ′ , b j , b j ′ W_{ij},W_{i'j'},b_{j},b_{j'} Wij,Wi′j′,bj,bj′都是网络的参数,都是需要进行训练更新的。
1.3 激活函数
激活函数其实种类特别特别多,有时间再专门介绍各种激活函数的特点及对比。这里就介绍最基本的三种:
1).Sigmoid函数
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1