人工神经网络(ANN)
神经网络:
什么是神经网络:
一种模仿生物神经网络结构和功能的计算模型。
它由多个互相连接的人工神经元(节点)构成,可以用于处理和学习复杂的数据模式,尤其适合解决非线性问题。
人脑可以看做一个生物神经网络,由众多神经元连接而成。各个神经元传递复杂的电信号,树突接收输入信号,经过处理,通过轴突输出信号。
神经网络构成:
神经网络由多个神经元组成,构建神经网络就是在构建神经元。
神经网络中的信息只向一个方向移动,即从输入节点向前移动,再向输出节点移动。
其中基础部分:
-
输入层:即输入x的那一层(图像,文本,声音等)。每个输入特征对应一个神经元。输入层将数据传递给下一层的神经元。
-
隐藏层:神经网络的深度通常由隐藏层的数量决定,隐藏层的神经元通过加权和激活函数处理输入,并将结果传递到下一层。
-
输出层:即输出y的那一层。输出层的神经元根据神经网络的任务,生成最终的预测结果。
特点是:
-
同一层的神经元之间没有连接;
-
第n层的每个神经元跟第n+1层的所有神经元相连,这就是全连接神经网络;
-
全连接神经网络接收的样本数据是二维的,数据在每层之间需要以二维的形式传递;
-
第n-1层的输出就是第n层的输入;
-
每个连接都有一个权重值(w系数和b系数)
神经网络内部状态值和激活值:
每个神经元工作时,前向传播产生:内部状态值和激活值; 反向传播时产生:激活值梯度和内部状态值梯度。
-
内部状态值:神经元接收到输入、历史信息及网络内部的权重计算结果(z = wx + b)。
-
激活值:激活函数对内部状态值进行非线性变换后得到的结果(a = f(z))。
通过控制每个神经元的内部状态值、激活值的大小;每层内部状态值、激活值的方差可以让整个神经网络工作的更好。
激活函数:
什么是激活函数:
用于对每层的输出数据进行变换,进而为整个网络注入了非线性因素(神经网络可以拟合各种曲线,提升对复杂问题的拟合能力)。
-
如果不使用激活函数,整个网络在本质上相当于一种线性模型;
-
通过给网络输出增加激活函数,实现引入非线性因素,使得网络模型可以逼近任意函数,提升网络对复杂问题的拟合能力。
常见激活函数:
- sigmoid激活函数:
激活函数公式:
激活函数求导公式:
sigmoid的函数图像、导数图像如下:
-
sigmoid函数可以将任意的输入映射到(0,1)之间。
-
当输入值在(-∞,-6)U(6,+∞)时,输入任何值得到的激活值都是差不多的,这样会丢失部分的信息。只有在[-6,6]之间才会有明显差异,在[-3,3]之间才会有较好效果。
-
sigmoid网络在5层之内就会产生梯度消失现象,该激活函数不以0为中心,一般只用于二分类的输出层。
- tanh激活函数:
激活函数公式:
激活函数求导公式:
Tanh的函数图像、导数图像如下:
-
tanh函数将输入映射到(-1,1)之间。
-
当输入值在(-∞,-3)U(3,+∞)时将映射到-1或1,因为其导数范围(0,1),这里导数值近似0,同样会造成梯度消失。
-
以0点为中心,收敛速度比sigmoid要快,减少迭代次数,一般在隐藏层使用。
3.ReLU激活函数:
激活函数公式:
激活函数求导公式:
ReLU 的函数图像、导数图像如下:
-
将小于0的值映射为0,而大于0的值保持不变,更加重视正信号,忽略负信号,模型运算更简单,能够提高模型效率;
-
当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题;
-
随着模型训练的推进,部分输入会落入小于0区域,导致对应权重无法更新,这种现象称为“神经元真死亡”;
ReLU是目前最常用的激活函数,与sigmoid相比的优势:
采用sigmoid函数,计算量大,反向传播求误差梯度时,计算量相对大;采用ReLU激活函数,整个过程计算量节省很多。
sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络训练;采用ReLU激活函数,当输入的值>0时,梯度为1,不会出现梯度消失的情况。
ReLU会使部分神经元输出为0,造成网络稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题。
4.SoftMax激活函数:
用于多分类过程,它是二分类sigmod在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。
激活函数公式:
将网络输出的logits通过softmax函数映射成(0,1)的值,而这些值的累和为1(满足概率的性质),选取概率最大的节点,作为预测目标类别。
如何选择激活函数
-
对于隐藏层:
1.优先选择ReLU激活函数;
2.ReLU效果不好,深度Leaky ReLU;
3.使用ReLU,注意Dead ReLU,避免出现0梯度从而导致神经元死亡;
4.少使用sigmoid函数,深度使用tanh函数。
-
对于输出层:
1.二分类问题选择sigmoid函数
2.多分类问题选择softmax函数
3.回归问题选择使用identity激活函数
初始化参数
构建网络后,网络中的参数需要初始化,需要初始化的参数主要有权重和偏置,偏置一般初始为0,对权重的初始化更重要。
参数初始化的作用:
-
防止梯度消失或爆炸
-
提高收敛速度
-
保持对称性破除
常见参数初始化方法:
随机初始化uniform_()、
正态分布初始化normal_()、
全0初始化zeros_()、
全1初始化ones_()、
固定值初始化constant_()、
kaiming初始化kaiming_uniform_(随机)/kaiming_normal_(正态)、
xavier初始化xavier_uniform_(随机)/xavier_normal_(正态)
1.随机初始化:
均匀分布初始化:权重参数初始化从区间均匀随机取值,默认(0, 1)。
2.正态分布初始化:随机初始化从均值为0,标准差是1 的高斯分布中取样,使用一些很小的值对参数w进行初始化
优点:能有效打破对称性
缺点:随机选择范围不当可能导致梯度问题
适用场景:浅层网络或低复杂度模型。隐藏层1-3层,总层数不超过5层。
3.全0初始化:将神经网络中的所有权重参数初始化为0
优点:实现简单
缺点:无法打破对称性,所有神经元更新方向相同,无法有效训练
适用场景:几乎不使用,仅用于偏置项的初始化
4.全1初始化:将神经网络中的所有权重参数初始化为1
优点:实现简单
缺点:无法打破对称性,所有神经元更新方向相同,无法有效训练;会导致激活值在网络中呈指数增长,容易出现梯度爆炸
适用场景:测试或调试(验证神经网络能否正常前向/反向传播);特殊模型结构(某些稀疏网络/特定的网络中需要手动设置参数为1 );偏置初始化(偶尔将偏置安化为小的正值0.1,很少使用1)
5.固定值初始化:将神经网络中的所有权重参数初始化为某个固定值
优点:实现简单
缺点:无法打破对称性,所有神经元更新方向相同,无法有效训练;初始权重过大/小可能导致梯度爆炸/消失
适用场景:测试或调试
6.kaiming初始化(HE初始化):专为ReLU和其变体设计,考虑到ReLU的特性,对输入维度进行收缩
正态分布和均匀分布
- 正态分布:
w权重值从均值为0, 标准差为std中随机采样,std = sqrt(2 / fan_in);
std值越大,w权重值离均值0分布相对较广,计算得到的内部状态值有较大的正值或负值。
- 均匀分布:
它从[-limit,limit] 中的均匀分布中抽取样本, limit = sqrt(6 / fan_in)。
fan_in:输入神经元的个数,当前接受的来自上层的神经元数量。
优点:适合ReLU,能保持梯度稳定
缺点:对非ReLU效果一般
适用场景:深度网络(10层及以上),使用ReLU、Leaky ReLU激活函数
7.xavier初始化(Glorot初始化):根据网络输入和输出的维度自动选择权重范围,使输入和输出的方差相同
正态分布和均匀分布
- 正态分布:
w权重值从均值为0, 标准差为std中随机采样,std = sqrt(2 / (fan_in + fan_out));
std值越小,w权重值离均值0分布相对集中,计算得到的内部状态值有较小的正值或负值。
- 均匀分布:
[-limit,limit] 中的均匀分布中抽取样本, limit = sqrt(6 / (fan_in + fan_out))
fan_in:输入神经元的个数,当前接受的来自上层的神经元数量;
fan_out:输出神经元个数,当前层输出的神经元的数量,也就是当前层会传递给下一层的神经元的数量。
优点:适用于Sigmoid、Tanh 等激活函数,解决梯度消失问题
缺点:对 ReLU 等激活函数表现欠佳
适用场景:深度网络(10层及以上),使用 Sigmoid 或 Tanh 激活函数