assignment2内容有:利用numpy实现Fully-connected Neural Network(forward和backpropagation)、BatchNormalization和Dropout、利用numpy实现Convolutional Networks的卷积层、池化层的朴素版本以及最后熟悉pytorch
Fully-connected Neural Network
这一部分与assignment1中一样,实现用于CIFAR-10分类的两层全连接神经网络;不过不同点在于,实现方式更为模块化,便于更为方便的组装不同规模的神经网络。
Affine layer
Affine layer的forward pass:
而其backward pass:
这就是Affine layer的前向和反向过程,而在实现过程中,由与图片的格式是3 x 32 x 32,因此在forward pass过程需要对
展开成向量的形式;而在backward过程中,要将向量reshape回3 x 32 x 32。
ReLU layer
ReLU layer的forward pass:
ReLU layer的作用是激活函数,实现非线性的映射。而其backward pass:
loss function
和assignment1的线性分类器类似,对于每张输入图片经过神经网络后,最后得到一个10维向量代表属于每一类的得分。而神经网络的训练也与线性分类器的类似,定义优化的目标loss function,然后运用梯度下降法来迭代更新网络的参数。
Update rules
这一部分,主要是完成一些用于训练模型的优化方法:SGD + momentum、RMSProp和Adam
SGD + momentum
和SGD相比,SGD+momemtum每次迭代不仅仅是通过梯度来更新参数,引入了类似物理中速度(velocity)的概念来更新参数。其具体更新过程:
是一个hyperparameter,通常会设为0.99;而
会初始化为0。和SGD相比,SGD + momentum的更新速度会更快,并且不容易陷入到鞍面中。关于momentum还有一种改进方法是Nesterov Momentum。
RMSProp and Adam
上述的优化方法,对于learning_rate每次迭代都几乎是一个固定的值,即便可以利用一些退火方法来随着迭代过程降低learning_rate;可是learning_rate还是一个hyperparameter,需要作为调参进行考虑。而RMSProp and Adam是一种自适应learning_rate优化方法,虽然仍然需要调整一些超参数,但是和原本仅调整learning_rate相比,难度没有那么大。
Adagrad的更新过程:
RMSProp的更新过程:
Adam的更新过程:
Adam有点像RMSProp+momemtum,是当前训练网络时,会首选的一种优化方法。
Batch Normalization
Batch Normalization
对于机器学习方法来说,如果输入数据是由不相关的特征、其数学特征是均值为0,方差为1;这样的话模型会较为容易训练。对于神经网络来说,随着模型深度增加,隐藏层的值会变得不相关并其均值也不再为0、方差也不为1。并且随着网络训练过程,各隐藏层的特征分布也会发生偏移。这两者都会导致模型训练变得更为困难。
batch normalization是一种让模型更容易训练的方法。在训练过程中,通过每次对隐藏层输出的每个特征进行归一化操作,以此来克服隐藏层特征分布的偏移。
batch normalization的具体公式如下:
简单来说,就是计算输入样本数据各个维度的均值与方差,然后对数据各个维度进行归一化,最后进行一个线性变换。batch normalization的反向推导公式不难,这里不作详细解释。
需要注意的是,batch normalization在测试过程中,使用的均值与方差是在训练过程中记录下来的,即:
每一次迭代时,都会记录当前batch的均值与方差,然后通过上述公式记录起来,做为测试过程中进行batch normalization的均值与方差。
batch normalization也比较依赖所选用的batch_size的大小,若所包含的batch_size过小,容易给模型带来较严重的偏差。
Layer Normalization
当batch_size过小时,layer normalization是替代的方法之一;batch normalization是对数据的每个维度进行归一化,而layer normalization是用每条数据自身的均值与方差,针对每条数据本身进行归一化。过程与上述batch normalization类似,并且无需记录训练过程中所用到的均值与方差。
Dropout
dropout是一种降低模型过拟合的一种方法,在训练过程中,会随机丢弃一些网络的连接(令对应的隐藏层输出值为0),来减少模型过拟合的现象。关于dropout的原理,有种解释是,这与模型集成类似,随机丢弃一些网络的连接,这使得在训练时是训练了很多子网络结构,然后后续测试过程中,使用的是整个网络,就像把之前的训练的子网络集成起来。
在实现上,只需生成一个和隐藏层结果同样大小的mask矩阵,mask的内容是根据概率所得到的0-1值,然后将mask与隐藏层结果进行元素乘,这样就是dropout的大概实现。
小结
assignment2的第一部分,主要是关注于如何模块化实现全连接神经网络,通过对搭建网络时,所需要的一些affine Layer和ReLU Layer模块化实现,继而再后续搭建网络时,可以更为方便地实现网络;其次就是介绍一些优化方法和batch normalization,来更为简单容易地训练网络;最后就是介绍了dropout,一种类似模型集成的方法,从而降低模型过拟合现象。
网友评论