人工神经网络ANN

本文用于解释最基础的神经网络-感知机的原理,它是后续 CNN、RNN 的基础,CNN 只是在感知机的概念加入“局部连接”的思想,每个局部执行的还是加权和;RNN 只是给每个隐藏层加一个隐状态

本文按照:感知机->多层感知机->全连接层->人工神经网络的步骤去理解 Linear 层

什么是感知机 (Perceptron)?

  • 一种用于单类别分类监督学习的算法,输入一组特征向量,然后通过一组等长权重计算线性加权和,最后通过判别函数输出结果。如果使用以下判别函数,则是一个二元分类器

f(x)=sign(wx+b)={+1x01x<0f(x)=\operatorname{sign}(w * x+b)=\left\{\begin{array}{ll} +1 & x \geq 0 \\ -1 & x<0 \end{array}\right.

  • 感知机模拟的是人的神经细胞,单个神经细胞有 2 种状态,激活与不激活,当信号总量超过某个阈值时,该神经细胞处于激活状态,否则不激活,激活时向其他连接的神经元传递信息

一个感知机包含等于输入数据长度的权重 w 和 1 个偏置 b(因为输出是 1),所谓感知,就是利用权重对所有输入进行加权和操作。接下来同时使用多个感知机去感知输入,就构成“单层感知机 (SLP)”

什么是单层感知机 (SLP)?

  • 所谓单层感知机,就是由感知机组成的一层网络,没有多层感知机的 hidden layer,每个感知机连接都连接所有输入,注意:感知机本身可以理解为只有 1 个节点的单层感知机

除了在单层使用多个感知机外,还可以使用多层感知机,每层感知机的输入是前一层前一层感知机的输出,由此出现“多层感知机 (MLP)”

什么是多层感知机 (MLP)?

  • 将多个单层感知机堆叠起来,其中每个感知机机与所有输入或者所有感知机输出连接,输入层与输出层之间的所有层是隐藏层

  • MLP 至少由 3 层感知机组成,即输入层、隐藏层、输出层

感知机、单层感知机、多层感知机的区别?

  • 人工神经网络(ANN)-20230408150310
  • 感知机 (Perceptron):左图是一个 2 输入的感知机模型,经过参数加权累加和后,其值在一个平面
  • 单层感知机 (SLP):中图是一个 2 输入、包含 3 个输出节点的单层感知机,经过参数加权累加和后输出,输出是超平面
  • 多层感知机 (MLP):多个单层感知机组成,至少包括 1 层隐藏层,输出结果是多个多个超平面的组合
  • 感知机无论叠加多少层,只要没使用非线性激活函数,其结果都是线性可分的,无法处理非线性问题

但是使用任意个、任意层感知机都是线性函数 Wx+bWx+b 的线性叠加,其处理的问题都是线性可分的,但是对于线性不可分问题无法解决

什么是线性可分?

  • 线性可分:计算所有样本的凸包,如果凸包内值包含 1 个类别,就是线性可分,本质就是数据可以被有限个超平面区分,在 2D 数据上就是被有限个直线做划分
  • 线性不可分:计算所有样本的凸包,如果凸包内值包含 2 个类别以上,则是非线性可分

日常构建网络时,都是使用 torch.Linear 去构建全连接层,它和感知机是什么关系呢,实际上它是确定输入维度、输出维度的单层感知机

什么是全连接层 (Fully Connected Layer)?

  • 其实就是单层的感知机,任意一个感知机都与所有输入连接形成,定义时需要指定输入数据维度和感知机数量,其中感知机的数量等于输出的维度
  • 参数量:每个感知机都与输入一一相连,加上偏置,共用参数 Paramlinear =Cin ×Cout +Cout \mathrm{Param}_{\text {linear }}=C_{\text {in }} \times C_{\text {out }}+C_{\text {out }}
  • 计算量:全连接层的每个输出需要经过 CinC_{in} 的乘法和加法运算,没考虑 bias 需要减1,FLOPlinear =(2×Cin )×Cout ×BatchsizeF L O P_{\text {linear }}=(2 \times C_{\text {in }}) \times C_{\text {out }} \times Batchsize
  • Pytorch 可以使用接口快速定义该层
    1
    2
    3
    x=torch.randn([1,2])
    fc = torch.nn.Linear(in_features = 2, out_features = 3)
    y=fc(x) // y=[1,3]

单层感知机加上激活函数,就可以构建人工神经网络 (ANN)

什么是人工神经网络 (ANN) ?

  • ANN 其实就是在多层感知器的基础上引入"非线性"激活函数,使得 ANN 可以模拟函数逼近器的作用,用于学习数据特征
  • 缺点:1)随着图像大小的增加,可训练参数增多;2)会丢失图像的空间特征;3)处理序列数据无法记忆历史信息
  • Pytorch 可以堆叠多层的"FC+relu"层实现
    1
    2
    3
    4
    x=torch.randn([1,2])
    fc = torch.nn.Linear(in_features = 2, out_features = 3)
    y=fc(x) // y=[1,3]
    y=torch.nn.functional.relu(y)

参考:

  1. ANN人工神经网络 - machine-learning-notes
  2. Multilayer perceptron - Wikipedia
  3. 线性可分 与线性不可分 - Amazing_Man - 博客园
  4. transformer为什么有利于并行计算? - 知乎