1 人工神经网络
人工神经网络(Artificial Neural Networks, ANN)是模拟生物神经元结构的计算模型,它模仿了大脑处理信息的基本方式。人工神经网络是由大量的简单处理单元——即“神经元”——组成的网络,这些神经元通过连接权重进行交互,并能够对输入数据进行复杂的非线性变换。
1.1 工作原理
人工神经网络通过调整连接权重来学习数据中的模式。这个过程通常涉及以下几个步骤:
- 前向传播:输入数据通过网络向前传递,从输入层到输出层,经过一系列的加权和激活操作。
- 损失计算:输出层产生的结果与实际目标进行比较,得到一个误差度量,称为损失函数。
- 反向传播:通过计算损失函数相对于每个权重的梯度,然后根据这个梯度调整权重,以减小损失。
- 优化算法:如梯度下降等方法用于更新权重,目的是最小化损失函数。
1.2 人工神经网络的组成
- 神经元(Neuron):是神经网络的基本单元,类似于生物神经元的结构。
- 输入层(Input Layer):接收外部输入数据。
- 隐藏层(Hidden Layer):一个或多个,负责处理输入层传来的数据,并进行非线性变换。
- 输出层(Output Layer):输出最终结果。
1.3 数学原理
- 权重(Weight):每个神经元之间的连接都有一个权重,表示连接的强度。
- 偏置(Bias):每个神经元都有一个偏置,用于调整输出值。
- 激活函数(Activation Function):用于引入非线性因素,常见的激活函数有Sigmoid、ReLU等。
以下是神经网络的基本数学原理:
1.3.1 前向传播(Forward Propagation)
单个神经元示意图:
对于一个简单的神经元,其输出计算公式为:
a = σ ( ∑ i = 1 n w i x i + b ) a = \sigma(\sum_{i=1}^{n} w_i x_i + b) a=σ(i=1∑nwixi+b)
其中:
- a a a:神经元的输出
- σ \sigma σ:激活函数
- w i w_i wi:第 i i i个输入的权重
- x i x_i xi:第 i i i个输入
- b b b:偏置
对于多层神经网络,前向传播的过程可以表示为:
z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]} z[l]=W[l]a[l−1]+b[l]
a [ l ] = σ ( z [ l ] ) a^{[l]} = \sigma(z^{[l]}) a[l]=σ(z[l])
其中: - z [ l ] z^{[l]} z[l]:第 l l l层的线性组合
- W [ l ] W^{[l]} W[l]:第 l l l层的权重矩阵
- a [ l − 1 ] a^{[l-1]} a[l−1]:第 l − 1 l-1 l−1层的输出
- b [ l ] b^{[l]} b[l]:第 l l l层的偏置
- a [ l ] a^{[l]} a[l]:第 l l l层的输出
1.3.2 激活函数示例
Sigmoid函数:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1
ReLU函数:
ReLU ( z ) = max ( 0 , z ) \text{ReLU}(z) = \max(0, z) ReLU(z)=max(0,z)
1.4 简单示例
假设我们有一个简单的神经网络,只有一个输入层、一个隐藏层和一个输出层。输入层有一个神经元,隐藏层有两个神经元,输出层有一个神经元。激活函数使用Sigmoid。
输入层到隐藏层的计算
设输入为 x x x,隐藏层两个神经元的权重分别为 w 1 w_1 w1和 w 2 w_2 w2,偏置分别为 b 1 b_1 b1和 b 2 b_2 b2,则隐藏层的输出为:
z 1 = w 1 x + b 1 z_1 = w_1 x + b_1 z1=w1x+b1
a 1 = σ ( z 1 ) a_1 = \sigma(z_1) a1=σ(z1)
z 2 = w 2 x + b 2 z_2 = w_2 x + b_2 z2=w2x+b2
a 2 = σ ( z 2 ) a_2 = \sigma(z_2) a2=σ(z2)
隐藏层到输出层的计算
设隐藏层到输出层的权重分别为 v 1 v_1 v1和 v 2 v_2 v2,偏置为 c c c,则输出层的输出为:
z out = v 1 a 1 + v 2 a 2 + c z_{\text{out}} = v_1 a_1 + v_2 a_2 + c zout=v1a1+v2a2+c
a out = σ ( z out ) a_{\text{out}} = \sigma(z_{\text{out}}) aout=σ(zout)
这就是一个简单的人工神经网络的数学原理和计算过程。在实际应用中,神经网络的结构和参数需要通过训练数据来学习得到。
如图:
由上图我们约定以下表示。a1、a2、h1、h2…代表神经元的名字。
a 1 i a1_i a1i代表a1神经元的输入, a 1 o a1_o a1o代表a1神经元的输出。
a1与a2代表输入层,通常情况下输入层通常不包含权重和激活函数,它仅仅接收数据。
2与3是当前神经网络的输入。当2输入到a1神经元后即 a 1 i = 2 a1_i=2 a1i=2,由于a1是输入层神经元,从而变成 a 1 o = a 1 i = 2 a1_o = a1_i=2 a1o=a1i=2
当3输入到神经元后,同理,从而变成 a 2 o = a 2 i = 3 a2_o= a2_i=3 a2o=a2i=3
此时神经元分别输出 a 1 o a1_o a1o 、 a 2 o a2_o a2o。
从图中我们可以看出, a 1 o a1_o a1o 、 a 2 o a2_o a2o首先会作为隐藏层(中间那一列的神经元)的输入。
对于隐藏层神经元我们可以得到
h 1 i = a 1 o ∗ 1 + a 2 o ∗ 2 h1_i =a1_o*1+a2_o*2 h1i=a1o∗1+a2o∗2
h 1 o = σ ( h 1 i + b ) h1_o = \sigma(h1_i+ b) h1o=σ(h1i+b)
h 2 i = a 1 o ∗ 2 + a 2 o ∗ 3 h2_i =a1_o*2+a2_o*3 h2i=a1o∗2+a2o∗3
h 2 o = σ ( ( h 2 i + b ) + b ) h2_o = \sigma((h2_i+ b)+ b) h2o=σ((h2i+b)+b)
…
注意
在通常情况下,输入层通常不包含权重和激活函数,它的主要功能是接收外部输入数据并将其传递给网络的下一层次,即隐藏层。输入层的节点(或称为神经元)只是简单地持有输入数据的值,并没有进行任何计算或变换。
思考
1、你可以把其它几个神经元的输入输出写出来了吗?
2、我们如何用计算机能看懂的方式去实现计算呢?
输入层定义
给定输入向量 x = [ x 1 , x 2 ] = [ 2 , 3 ] \mathbf{x} = [x_1, x_2] = [2, 3] x=[x1