订阅专栏
神经网络是深度学习中最重要的一类模型,本文来讲解一下神经网络基础。
一、基本概念
神经网络的基本构成
输入层
图中粉色的部分(input layer)是输入层,输入层在神经网络中主要起到输入数据的作用,是一个神经网络的入口。
隐藏层
图中蓝色的部分(hidden layer)是隐藏层,我们叫他为隐藏层因为我们并不能够在训练样本中观测到他们的值,隐藏层的主要作用是把输入数据的特征,经过隐藏层中激活函数的计算,抽象到另一个维度空间,来展现其更抽象化的特征,这些特征能更好的进行线性划分,隐藏层可以有一层也可以有多层,同时每一层神经元(图中每个白色的圆)的个数也可多可少。
输出层
图中绿色的部分(ouput layer)是输出层,输出层同样也会通过一个激活函数将经过多层(或者一层)隐藏层计算过的数据再次经过计算得到我们预期的输出,通常使用softmax函数。
网络层数
网络层数也就是我们通常说的几层神经网络,在计算网络层数时,我们只需计算参与了计算的层数(也就是隐藏层和输出层的层数),例如上图有两层隐藏层和一层输出层,我们就可以把该神经网络的层数记做三层。
激活函数
激活函数是我们添加在计算层的函数,在计算层中每一层都会将前一层的输入数据通过激活函数的计算转化为新的输入数据输入给下一层进行计算,常用的激活函数有sigmoid、Tanh、ReLu、leaky ReLu、Maxout、Softmax等。
二、前馈神经网络
神经网络中最简单最朴素的神经网络我们称之为前馈神经网络,该神经网络中,各神经元从输入层开始接收前一级的输入,并输入到下一层,直至输出,整个网络中无反馈,可用一个有向无环图来表示。
通常我们说的前馈神经网络有两种:一种叫Back Propagation Networks——反向传播网络(BP网络),一种叫RBF Network——径向基函数神经网络。
BP网络的主要思想在于对结果进行前向传播,对误差采用反向传播,在反向传播的过程中通过最优化各层神经元的输入权值以及偏置,使得神经网络的输出尽可能地接近期望输出,以达到训练(或者学习)的目的。
RBF网络的基本思想是:用RBF作为隐单元的“基”构成隐含层空间,这样就可以将输入矢量直接映射到隐空间,而不需要通过权连接。当RBF的中心点确定以后,这种映射关系也就确定了。而隐含层空间到输出空间的映射是线性的,即网络的输出是隐单元输出的线性加权和,此处的权即为网络可调参数。其中,隐含层的作用是把向量从低维度的p映射到高维度的h,这样低维度线性不可分的情况到高维度就可以变得线性可分了,主要就是核函数的思想。
由于过程比较复杂本文不对两种网络进行推导。
三、深度学习中的正则化
什么是正则化?
在机器学习中,许多策略被显式地设计来减少测试误差(可能会以增大训练误差为代价),这些策略被统称为正则化,是一种旨在减少泛化误差而不是训练误差的对学习算法的修改。在深度学习的背景下,大多数正则化策略是对估计进行正则化,以偏差的增加换取方差的减少。
说一下常用的正则化方法(本文给出理解,不做具体推导)
1、参数范数惩罚
(1)L2参数正则化
L2正则化(岭回归)在深度学习中通常用于权重衰减,通过向损失函数添加一个正则项12∥w∥2212‖w‖22使得权重更接近于原点(在原来的损失函数基础上加上权重参数的平方和)。
(2)L1参数正则化
L1正则化要我们在原始的代价函数后面加上一个L1正则化项。即全部权重w的绝对值的和。
2、数据集增强
数据集增强是一种最简单,也很常用的正则化方法,该方法主要是要求我们在数据集上下功夫。
一种数据增强的方法是去加大数据集,但是在我们的数据集很有限的时候这种方法并不能很好的解决问题,此时我们就可以用有限的数据产生更多的等价数据来达到数据增强的目的,举个例子:
当我们在使用图片的数据集时,可能并不能获得很多高质量的数据,此时我们就想到去将现有的图片进行一些变换(如翻转、随机裁剪、旋转等操作)来得到更多的图片,就像下面这样:
通过此类方法我们就能够将原有的数据数量扩大一定的倍数从而达到了数据增强的目的。
3、噪声添加
对于部分模型来说,在输入中添加一些方差极小的噪声等价于对权重施以权重惩罚,通常情况下注入噪声远比简单地收缩参数强大,噪声被添加到隐藏单元时会更加强大。
4、Dropout
当一个神经网络的结构过于复杂(有很多的隐藏层,每层都有很多的神经元)时,我们的模型就很容易产生过拟合的现象,为了防止这种现象的发生,产生了一种常用的正则化方法——Dropout。
Dropout的工作流程如下:
(1)首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变;
(2)然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b);
(3) 然后继续重复这一过程:
恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)。
从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
不断重复这一过程。
对于如何停止一半的神经元,我们在使用激活函数的时候,给出一定的概率使得经过激活函数计算后的结果为0即可。