深度学习——人工神经网络(ANN)

208 阅读9分钟

人工神经网络(ANN)

神经网络:

什么是神经网络:

一种模仿生物神经网络结构和功能的计算模型

它由多个互相连接的人工神经元(节点)构成,可以用于处理和学习复杂的数据模式,尤其适合解决非线性问题。

人脑可以看做一个生物神经网络,由众多神经元连接而成。各个神经元传递复杂的电信号,树突接收输入信号,经过处理,通过轴突输出信号。

image.png

神经网络构成:

神经网络由多个神经元组成,构建神经网络就是在构建神经元。

image.png

神经网络中的信息只向一个方向移动,即从输入节点向前移动,再向输出节点移动。

其中基础部分:

  • 输入层:即输入x的那一层(图像,文本,声音等)。每个输入特征对应一个神经元。输入层将数据传递给下一层的神经元。

  • 隐藏层:神经网络的深度通常由隐藏层的数量决定,隐藏层的神经元通过加权激活函数处理输入,并将结果传递到下一层。

  • 输出层:即输出y的那一层。输出层的神经元根据神经网络的任务,生成最终的预测结果。

特点是:

  • 同一层的神经元之间没有连接;

  • 第n层的每个神经元跟第n+1层的所有神经元相连,这就是全连接神经网络

  • 全连接神经网络接收的样本数据是二维的,数据在每层之间需要以二维的形式传递;

  • 第n-1层的输出就是第n层的输入;

  • 每个连接都有一个权重值(w系数和b系数)

image.png

神经网络内部状态值和激活值:

每个神经元工作时,前向传播产生:内部状态值激活值; 反向传播时产生:激活值梯度内部状态值梯度

  • 内部状态值:神经元接收到输入、历史信息及网络内部的权重计算结果(z = wx + b)。

  • 激活值:激活函数对内部状态值进行非线性变换后得到的结果(a = f(z))。

通过控制每个神经元的内部状态值、激活值的大小;每层内部状态值、激活值的方差可以让整个神经网络工作的更好。

image.png

激活函数:

什么是激活函数:

用于对每层的输出数据进行变换,进而为整个网络注入了非线性因素(神经网络可以拟合各种曲线,提升对复杂问题的拟合能力)。

  • 如果不使用激活函数,整个网络在本质上相当于一种线性模型;

  • 通过给网络输出增加激活函数,实现引入非线性因素,使得网络模型可以逼近任意函数,提升网络对复杂问题的拟合能力。

常见激活函数:

  1. sigmoid激活函数:

激活函数公式:

image.png

激活函数求导公式:

image.png

sigmoid的函数图像、导数图像如下:

image.png

  • sigmoid函数可以将任意的输入映射到(0,1)之间。

  • 当输入值在(-∞,-6)U(6,+∞)时,输入任何值得到的激活值都是差不多的,这样会丢失部分的信息。只有在[-6,6]之间才会有明显差异,在[-3,3]之间才会有较好效果。

  • sigmoid网络在5层之内就会产生梯度消失现象,该激活函数不以0为中心,一般只用于二分类的输出层。

  1. tanh激活函数:

激活函数公式:

image.png

激活函数求导公式:

image.png

Tanh的函数图像、导数图像如下:

image.png

  • tanh函数将输入映射到(-1,1)之间。

  • 当输入值在(-∞,-3)U(3,+∞)时将映射到-1或1,因为其导数范围(0,1),这里导数值近似0,同样会造成梯度消失。

  • 以0点为中心,收敛速度比sigmoid要快,减少迭代次数,一般在隐藏层使用。

3.ReLU激活函数:

激活函数公式:

image.png

激活函数求导公式:

image.png

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

image.png

  • 将小于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在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。

激活函数公式:

image.png

image.png

将网络输出的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激活函数

image.png

初始化参数

构建网络后,网络中的参数需要初始化,需要初始化的参数主要有权偏置,偏置一般初始为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 激活函数