建议先阅读我之前的深度学习博客,掌握一定的深度学习前置知识后再阅读本文,链接如下:

带你从入门到精通——深度学习(一. 深度学习简介和PyTorch入门)-CSDN博客

带你从入门到精通——深度学习(二. PyTorch中的类型转换、运算和索引)-CSDN博客

带你从入门到精通——深度学习(三. PyTorch中张量的形状重塑、拼接和自动微分)-CSDN博客

目录

四. 神经网络的概念、激活函数和参数初始化

4.1 神经网络的概念        

4.2 激活函数

4.2.1 激活函数的概念

4.2.2 sigmoid函数

4.2.3 tanh函数

4.2.4 ReLU函数

4.2.5 softmax函数

4.2.6 其他常见激活函数

4.3 参数初始化

4.3.1 基础初始化方法

4.3.2 kaiming初始化和xavier初始化


四. 神经网络的概念、激活函数和参数初始化

4.1 神经网络的概念        

        人工神经网络(Artificial Neural Network,ANN)是一种模仿生物神经网络结构和功能的计算模型,简称神经网络(Neural Network,NN)

        单个神经元的网络结构如下:

        单个神经元结构的最终输出的是经过激活函数后的各个输入xi的加权和

        多个神经元便构成了如下的神经网络结构:

        神经网络中信息从输入节点开始向前移动,通过隐藏节点,最终移动到输出节点,因此神经网络的基本架构为:输入层(即输入x的一层)、输出层(即输出y的一层)、隐藏层(输入层和输出层之间皆为隐藏层),这种网络结构也被称为全连接(full connected,FC)网络

        全连接网络的特点如下:

        1. 同一层的神经元之间没有连接。

        2. 第N层的每个神经元与第N - 1层的所有神经元相连(这也是全连接的含义),每一个连接都有一个自己的权重值(包含w系数和b系数)

        3. 第N - 1层神经元的输出就是第N层神经元的输入。

4.2 激活函数

4.2.1 激活函数的概念

        激活函数用于对神经网络每层的输出数据进行变换,为整个神经网络注入了非线性因素,使得神经网络可以逼近任意函数,加强了神经网络对复杂问题的拟合能力。

        而如果不使用激活函数,整个神经网络虽然看起来复杂,但究其本质依然属于一种线性模型,证明如下:

4.2.2 sigmoid函数

        在机器学习的逻辑回归章节有该函数的详解介绍,这里只做简要概括。

        sigmoid函数一般用于二分类任务的输出层,对于sigmoid函数来说,当输入值< -6 或者 > 6时,任何的输入值得到的激活值都是差不多的,这样会丢失部分的信息,因此该函数的有效区间为(-6,6),并且sigmoid函数容易出现梯度消失现象。

4.2.3 tanh函数

        tanh函数也叫双曲正切函数,它是一种奇函数,能够将输入值映射到(-1,1)之间,适用于浅层神经网络的隐藏层,其函数表达式和导数表达式如下:

             

        tanh函数的函数图像与导数图像如下:

        由上图可知tanh函数的有效区间为(-3,3), 与Sigmoid相比,tanh的梯度相对较大,使得其收敛速度要比sigmoid函数快,能够减少有效迭代次数,但使用tanh函数作为激活函数同样也有梯度消失的风险。

4.2.4 ReLU函数

        ReLU函数适用于神经网络的隐藏层,其表达式如下:

        ReLU函数的函数图像和导数图像如下:

        ReLU函数将小于0的值映射为 0,而大于0的值则保持不变,使得它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率。

        当x < 0时,ReLU函数的导数为0,而当x > 0时,ReLU函数的导数恒为1,因此ReLU能够在x > 0时保持梯度不衰减,从而缓解梯度消失问题,然而,随着训练的推进,部分输入会落入小于0区域,导致其对应权重无法更新,这种现象被称为神经元死亡问题或者ReLU函数的死区问题

        ReLU函数是目前最常用的激活函数,其优势如下:

        1. 相对于sigmoid函数和tanh函数来说求导更为方便,在反向传播求参数的梯度时,计算量相对较小。

        2. 能够缓解梯度消失问题。

        3. ReLU函数会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

4.2.5 softmax函数

        softmax函数常用于多分类任务中,它是二分类任务的常用激活函数sigmoid在多分类任务中的推广,目的是将多分类的结果以概率的形式展现出来,其函数表达式如下:

        softmax函数能够将网络输出的logits(逻辑值)映射为值域在(0,1)之间的概率值,我们可以选取概率值最大的类别作为最终的预测类别。

        注意:softmax函数的所有输出值的总和必定为1(满足概率的性质)。

4.2.6 其他常见激活函数

        其他常见激活函数如下表所示:

        注意:神经网络的隐藏层通常优先选择ReLU激活函数;回归问题通常选择identity激活函数,即y = x的恒等映射。

        注意:Leaky RuLU中的α为一个超参数,通常选择0.01;PReLU(Parametric Leaky ReLU)中的α为一个可学习的参数;RReLU(Randomized Leaky ReLU)中的α在训练时从均匀分布中随机采样,即,而在预测时固定为训练时的均值,即

4.3 参数初始化

4.3.1 基础初始化方法

        均匀分布初始化:初始网络参数从区间为[0,1]的均匀分布中抽样获得,api为:torch.nn.init.uniform_(param,low,up)。

        正态分布初始化:初始网络参数从均值为0,标准差为1的高斯分布中抽样获得,api为:torch.nn.init.normal_(param,mean,std)。

        全0初始化:将初始网络参数全部初始化为0,api为:torch.nn.init.zeros_(param)。

        全1初始化:将初始网络参数全部初始化为1,api为:torch.nn.init.ones_(param)。

        固定值初始化:将初始网络参数全部初始化为某个固定值,api为:torch.nn.init.constant_(param,val)。

4.3.2 kaiming初始化和xavier初始化

        全0、全1以及固定值初始化方法会将所有参数初始化为相同值,这些初始化方法会使得参数具有对称性,而kaiming初始化和xavier初始化能够打破参数的对称性。

        kaiming初始化,也称HE初始化,该初始化方法分为正态分布的kaiming初始化和均匀分布的kaiming初始化。

        正态分布的kaiming初始化:初始网络参数从均值为0,标准差为的高斯分布中抽样获得,其中n为输入神经元的个数,api为:torch.nn.init.kaiming_normal_(param)。

        均匀分布的kaiming初始化:初始网络参数从区间为的均匀分布中抽样获得,其中n为输入神经元的个数,api为:torch.nn.init.kaiming_uniform_(param),可以取到区间的左右端点。

        xavier初始化,该初始化方法也分为正态分布的xavier初始化和均匀分布的xavier初始化。

        正态分布的xavier初始化: 初始网络参数从均值为0,标准差为的高斯分布中抽样获得,其中n为输入神经元和输出神经元个数之和,api为:torch.nn.init.xavier_normal_(param)。

        均匀分布的xavier初始化:初始网络参数从区间为的均匀分布中抽样获得,其中n为输入神经元和输出神经元个数之和,api为:torch.nn.init.xavier_uniform_(param),可以取到区间的左右端点。 

        注意:在使用PyTorch框架构建网络模型时,每个网络层的参数都有默认的初始化方法,通常默认使用xavier初始化。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐