一、神经网络
1.神经网络
-
定义:人工神经网络(Artificial Neural Network,ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的计算模型。人脑可以看作是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。
-
神经网络中信息只向一个方向移动,即从输入节点向前移动,通过隐藏节点,再向输出节点移动。其中基本部分是:
- 输入层:即输入x的那一层
- 输出层:即输出y的那一层
- 隐藏层:输入层和输出层之间都是隐藏层
-
特点:
- 同一层神经网络之间没有连接
- 第N层的每个神经元和第N-1层的所有神经元相连,这就是全连接神经网络(full connected,fc)
- 第N-1层神经元的输出就是第N层神经元的输入
- 每个连接都有一个权重值(w系数和b系数)
2.激活函数
- 激活函数用于对每层的输出数据(加权和数据)进行变换,进而为整个网络注入了非线性因素。此时,神经网络就可以拟合各种曲线
- 没有引入非线性因素的网络等价于使用一个线性模型来拟合
- 通过给网络输出增加激活函数,实现引入非线性因素,使得网络模型可以逼近任意函数,提升网络对复杂问题的拟合能力
(1)sigmiod函数
-
公式:f(x)=11+e−xf(x) = \frac{1}{1+e^{-x}}f(x)=1+e−x1
-
求导公式:KaTeX parse error: {equation} can be used only in display mode.
-
缺点:当神经网络的激活处于0, 1位置时,其梯度几乎为0,容易导致梯度消失,此时网络参数将更新极其缓慢,或者无法更新
-
一般来说,sigmoid网络在5层之类就会产生梯度消失现象。而且,该激活函数并不是以0为中心,所以在实践中很少使用这种激活函数,sigmoid函数一般只用于二分类的输出层
(2)tanh激活函数
- 公式:f(x)=1−e−2x1+e−2xf(x) = \frac{1-e^{-2x}}{1+e^{-2x}}f(x)=1+e−2x1−e−2x
- 求导公式:KaTeX parse error: {equation} can be used only in display mode.
- 其输出值域是(-1, 1),值域范围更大,使之更适合于神经网络的输入层和隐藏层
- 与sigmoid相比,它是以0为中心的,且梯度相对于sigmoid大,使得其收敛速度要比sigmoid快,减少迭代次数,但当输入值较大时,会导致梯度消失的问题
- 使用时:可在隐藏层使用tanh函数,在输出层使用sigmoid函数
(3)ReLU激活函数
-
是目前使用最多的一种激活函数
-
公式:f(x)=max(0,x)f(x)=max(0, x)f(x)=max(0,x)
-
求导公式:KaTeX parse error: {equation} can be used only in display mode.
-
激活函数将小于0的值映射为0,而大于0的值则保持不变,它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率
-
当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0的区域,导致对应权重无法更新,这种现象被称为“神经元死亡”
-
ReLU是目前最常用的激活函数。与sigmoid相比,ReLU的优势是:采用sigmoid函数,计算量大(指数运算),反向传播球误差梯度时,计算量相对大,而采用ReLU激活函数,整个过程的计算量节省很多。sigmoid函数反向传播时,很容易出现梯度消失的情况,从而无法完成深度网络的训练。ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性(网络变得简单),并且减少了参数的相互依存关系,缓解了过拟合问题的发生
(4)Softmax函数
-
softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率形式呈现出来
-
公式:softmax(zi)=ezi∑jejzsoftmax(z_i)=\frac{e^{z_i}}{\sum_je^z_j}softmax(zi)=∑jejzezi
- ziz_izi:输出层中每个神经元加权和(logits)
-
Softmax就是将网络输出logits通过softmax函数,就映射成为(0,1)的值,而这些值的累和为1,那么我们将它理解成概率,选取概率最大(也就是值对应最大的节点),作为我们的预测目标类别
(5)激活函数的选择方法
对于隐藏层
- 优先选择ReLU激活函数
- 如果ReLU效果不好,那么尝试其他激活,如Leaky ReLU等
- 如果你使用了ReLU,需要注意一下Dead ReLU问题,避免出现大的梯度导致过多的神经元死亡
- 少使用sigmoid激活函数,可以尝试使用tanh激活函数
对于输出层
- 二分类问题选择sigmoid激活函数
- 多分类问题选择softmax激活函数
- 回归问题选择identity激活函数(恒等激活)
3.参数初始化
优先选择kaiming和xavier初始化方式
(1)初始化www
- 均匀分布初始化:权重参数初始化从区间均匀随机取值。即在(−1d,1d)(-\frac{1}{\sqrt d}, \frac{1}{\sqrt d})(−d1,d1)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量
- 正态分布初始化:随机初始化从均值为0,标准差是1的高斯分布中取样,使用一些很小的值对参数W进行初始化
(2)初始化bbb
- 全0初始化:将神经网络中的所有权重参数初始化为0
- 全1初始化:将神经网络中的所有权重参数初始化为1
- 固定值初始化:将神经网络中的所有权重参数初始化为某个固定值
(3)初始化方法改进
- kaiming初始化,也叫做HE初始化
- HE初始化分为正态分布的HE初始化,均匀分布的HE初始化
- 正态分布的HE初始化:stddev=2fan_instddev = \sqrt{\frac{2}{fan\_in}}stddev=fan_in2
- 均匀分布的HE初始化:从[-limit, limit]中的均匀分布中抽取样本,limit是6fan_in\sqrt{\frac{6}{fan\_in}}fan_in6
- fan_infan\_infan_in输入神经元个数
- HE初始化分为正态分布的HE初始化,均匀分布的HE初始化
- xavier初始化,也叫做Glorot初始化
- Glorot初始化分为正态分布的xavier初始化,均匀分布的xavier初始化
- 正态化的xavier初始化:stddev=2fan_in+fan_outstddev=\sqrt{\frac{2}{fan\_in+fan\_out}}stddev=fan_in+fan_out2
- 均匀分布的Xavier初始化:从[-limit, limit]中的均匀分布中抽取样本,limit是6fan_in+fan_out\sqrt{\frac{6}{fan\_in+fan\_out}}fan_in+fan_out6
- fan_infan\_infan_in是输入神经元个数,fan_outfan\_outfan_out是输出的神经元个数
- Glorot初始化分为正态分布的xavier初始化,均匀分布的xavier初始化
4.神经网络搭建和参数计算
(1)模型搭建
- 在pytorch中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法
- _init\_ 方法中定义网络中的层结构,主要是全连接层,并进行初始化
- forward方法,在实例化模型的时候,底层会自动调用该函数。该函数中可以定义学习率,为初始化定义的layer传入数据等。
(2)网络参数量的统计方法
- 统计每一层中的权重w和偏置b的数量
from torchsummary import summary
……
summary(my_modelll, input_size=(3, ), batch_size = 8)for name, para in my_model.named_parameters():print(name)print(para)
5.神经网络优缺点
- 优点
- 精度高,性能优于其他机器学习方法,甚至在某些领域超过了人类
- 可以近似任意的非线性函数随之计算机硬件的发展
- 近年来在学界和业界受到了热捧,有大量的框架和库可调
- 缺点
- 黑箱,很难解释模型是怎么工作的
- 训练时间长,需要大量的算力
- 网络结构复杂,需要调整超参数
- 小数据集上表现不佳,容易发生过拟合