什么是 multi-layer perceptron model,

2023-12-14by@tim&@ChatGPT.Model: gpt-4
tim

什么是 multi-layer perceptron model,

Avatar
Avatar

多层感知机(Multi-Layer Perceptron,简称MLP)是一种前馈人工神经网络模型,它包含一个或多个隐藏层。每一层都由多个神经元组成,这些神经元与下一层的每个神经元相连接。每个连接都有一个权重,这些权重在训练过程中会不断更新,以最小化预测输出和实际输出之间的差距。

MLP的基本结构包括三个主要部分:

  1. 输入层(Input Layer):接收输入数据。
  2. 隐藏层(Hidden Layers):一个或多个层,用来提取输入数据的特征和模式。隐藏层的复杂性和数量可以根据实际问题的需求来确定。
  3. 输出层(Output Layer):产生最终的预测结果。

在MLP中,每个神经元通常会对输入进行加权求和,然后通过一个非线性激活函数,如Sigmoid、Tanh或ReLU函数,来产生输出。激活函数的引入是为了增加网络的非线性能力,使得网络能够学习和模拟复杂的函数映射。

MLP的训练过程通常使用反向传播算法(Backpropagation)和梯度下降(Gradient Descent)或其变体来调整网络中的权重。在反向传播过程中,首先会计算输出层的误差,然后将这个误差反向传播到前面的层,从而逐层计算每个神经元的误差梯度。这些梯度就是用来更新连接权重的依据。

MLP可以解决多种不同类型的问题,包括分类、回归和序列预测等。然而,对于某些特定类型的数据,如图像、序列和文本数据,通常会使用更专门化的神经网络架构(例如卷积神经网络CNN,循环神经网络RNN),因为这些架构可以更好地利用数据的内在结构。

tim

Sigmoid 函数举个简单例子

Avatar
Avatar

Sigmoid函数是一种广泛使用的激活函数,其数学表达式为:

σ(x)=11+ex\sigma(x) = \frac{1}{1 + e^{-x}}

其中 ( e ) 是自然对数的底数约等于2.71828,( x ) 是函数的输入。

Sigmoid函数的一个重要特性是它能够将任意值的输入映射到(0, 1)区间内,这使得它在早期的神经网络中常被用于二分类问题的输出层,输出可以被解释为概率。

来举一个简单的例子,假设我们有一个输入值 ( x = 1 ),我们想计算Sigmoid函数的输出。

首先,我们按照公式计算:

σ(1)=11+e1\sigma(1) = \frac{1}{1 + e^{-1}}

σ(1)=11+1e\sigma(1) = \frac{1}{1 + \frac{1}{e}}

σ(1)=11+12.71828\sigma(1) = \frac{1}{1 + \frac{1}{2.71828}}

σ(1)=11+0.36788\sigma(1) = \frac{1}{1 + 0.36788}

σ(1)=11.36788\sigma(1) = \frac{1}{1.36788}

σ(1)0.73106\sigma(1) \approx 0.73106

所以,当输入 ( x = 1 ),Sigmoid函数的输出大约是 ( 0.73106 ),这个值介于0和1之间。

Sigmoid函数的图像是一个S形的曲线,随着输入值增大,输出值逼近于1;随着输入值减小,输出值逼近于0。当输入值是0时,Sigmoid函数的输出是0.5。因其S形特点,Sigmoid函数也常被称为S型生长曲线。

tim

简要介绍 反向传播算法

Avatar
Avatar

反向传播算法(Backpropagation)是一种用于训练人工神经网络的核心算法,特别是在多层感知机(MLP)的训练中得到了广泛的应用。该算法使用梯度下降法来最小化网络的损失函数,即减少网络预测输出与实际输出之间的差异。

反向传播算法包含两个主要的阶段:前向传播和反向传播。

  1. 前向传播(Forward Propagation):

    • 在这个阶段,输入数据通过神经网络从输入层经过隐藏层,一直传播到输出层。
    • 每个神经元接收到输入后,会将其加权求和,再通过一个非线性激活函数以产生该神经元的输出。
    • 最终,在输出层产生一个预测结果。
  2. 反向传播(Backward Propagation):

    • 一旦得到了输出层的预测结果,就会计算损失函数,损失函数衡量了预测结果与实际结果之间的差异。
    • 接着,这个损失会被用于计算输出层神经元的误差信号,这个误差信号表示了损失相对于每个输出神经元激活函数输入的导数。
    • 然后,误差信号被反向传播回网络,通过链式法则和微分,计算出隐藏层中每个神经元的误差信号。
    • 在每一层,误差信号被用来计算损失相对于神经元权重的梯度。
    • 最终,这些梯度用于更新权重,通常使用梯度下降法或其变体,以此使损失函数的值减小。

反向传播算法的关键在于准确计算损失函数对每个权重的偏导数,这样就可以知道如何调整权重以减少损失。此过程中的梯度计算通常通过自动微分技术(例如,计算图和反向传播)来实现。

反向传播算法使得深度学习模型能够通过反复迭代训练数据,逐渐学习到如何减少预测误差,从而提高模型的性能。这一算法的提出和实现是深度学习能够成功解决复杂问题的关键因素之一。

tim

举一个最简单的利用反向传播算法神经网络的例子

Avatar
Avatar

让我们来看一个非常简单的神经网络例子,它只包含一个输入层、一个含有一个神经元的隐藏层和一个输出层。这个网络将被用来实现一个简单的二元逻辑运算——逻辑非(NOT)。

逻辑非运算的真值表如下:

输入 (x) 输出 (y)
0 1
1 0

这个网络的结构如下:

  • 输入层:只有一个输入单元 x。
  • 隐藏层:只有一个神经元,使用Sigmoid激活函数。设隐藏层的权重为 w1,偏置为 b1。
  • 输出层:只有一个输出单元,使用Sigmoid激活函数。设输出层的权重为 w2,偏置为 b2。

我们初始化权重和偏置为随机值,然后开始训练过程。

前向传播(Forward Propagation):

  1. 输入值 x 传递给隐藏层的神经元。
  2. 计算隐藏层的激活:( a_1 = \sigma(w_1 \cdot x + b_1) ),其中 ( \sigma ) 是Sigmoid函数。
  3. 隐藏层的输出 ( a_1 ) 作为输入传递给输出层。
  4. 计算输出层的激活(即最终输出):( \hat{y} = \sigma(w_2 \cdot a_1 + b_2) )。

计算损失(Loss Calculation):

我们可以使用二元交叉熵损失函数来计算损失,它在二分类问题中很常用。

反向传播(Backward Propagation):

  1. 首先计算输出层误差:( \delta_2 = (\hat{y} - y) \cdot \sigma'(\hat{y}) ),其中 ( y ) 是期望输出,( \sigma' ) 是Sigmoid函数的导数。
  2. 然后,计算隐藏层的误差:( \delta_1 = (w_2 \cdot \delta_2) \cdot \sigma'(a_1) )。
  3. 更新输出层权重和偏置:( w_2 = w_2 - \alpha \cdot \delta_2 \cdot a_1 ),( b_2 = b_2 - \alpha \cdot \delta_2 )。
  4. 更新隐藏层权重和偏置:( w_1 = w_1 - \alpha \cdot \delta_1 \cdot x ),( b_1 = b_1 - \alpha \cdot \delta_1 )。

其中,( \alpha ) 是学习率,一个小的正数。

重复步骤:

重复以上的前向传播和反向传播步骤多次(即多个训练迭代),每次使用真值表中的数据。

经过足够的训练迭代后,神经网络的权重和偏置将调整为能够接近地模拟逻辑非运算的值。例如,当输入 x 是 0,网络应该输出接近 1 的值;而当输入 x 是 1,网络应该输出接近 0 的值。

tim

可以用 ascii 画一张示意图不

Avatar
Avatar

当然可以。以下是一个简化的单个神经元的神经网络示意图,它用于实现上述逻辑非(NOT)运算的前向和反向传播过程。

输入层            隐藏层                 输出层
  x
  | \
  |  w1
  |    \
  |     o -- a1 -- w2 -- o -- y_hat
  |    /    (Sigmoid)         (Sigmoid)
 b1--/                      /
                        b2--/

在这个网络中:

  • x 是输入值。
  • w1 是输入层到隐藏层的权重。
  • o 代表神经元节点。
  • a1 是隐藏层神经元的激活值,经过Sigmoid函数处理。
  • w2 是隐藏层到输出层的权重。
  • b1 是隐藏层的偏置。
  • b2 是输出层的偏置。
  • y_hat 是网络的预测输出。

在反向传播过程中,误差将从 y_hat 开始,通过 w2 传播回隐藏层的神经元,然后通过 w1 传播回输入层。在每一步中,我们都会使用梯度下降法来更新 w1w2b1b2 以减小损失函数的值。

tim

为什么需要 偏置

Avatar
Avatar

偏置(bias)在神经网络中起着非常重要的作用。考虑一个没有偏置的神经元,其输出是输入特

tim

为什么需要 偏置

Avatar
Avatar

偏置(bias)在神经网络中起着非常重要的作用。考虑一个没有偏置的神经元,其输出是输入特征的加权和通过激活函数的结果。如果没有偏置,无论权重如何调整,当所有输入都为零时,神经元的输出将始终为零。偏置的引入允许神经元即使在所有输入都是零的情况下也能有非零的输出。

偏置的主要作用包括:

  1. 偏移激活函数: 偏置允许激活函数沿输入轴移动,这意味着神经元可以在不同的输入值下被激活。这种移动能力是非常必要的,因为它给予神经网络更大的灵活性去捕捉数据中的模式。

  2. 增加表达能力: 如果没有偏置,即使是多层网络也只能学习到通过原点的决策边界。偏置增加了模型的表达能力,使得神经网络可以学习到更复杂的函数。

  3. 打破对称性: 在训练开始时,如果所有权重都初始化为相同的值,网络中的每个神经元将计算相同的输出。偏置的存在确保即使权重开始时相同,神经元也能够学习不同的特征。

  4. 处理无输入的情况: 在某些情况下,输入可能为零或不存在(例如稀疏数据)。偏置确保即便在这种情况下,神经网络仍然可以产生非零的输出,并且能够继续学习和工作。

因此,偏置是神经网络中不可缺少的一部分,它提供了额外的自由度,增强了网络对数据的建模能力。在实践中,每个神经元通常都会有一个偏置项。

tim

首先计算输出层误差:( \delta_2 = (\hat{y} - y) \cdot \sigma'(\hat{y}) ),其中 ( y ) 是期望输出,( \sigma' ) 是Sigmoid函数的导数

输入层误差为什么是这么计算?y 是这么来的

Avatar
Avatar

在反向传播算法中,计算输出层误差的方式是基于损失函数(loss function)对网络输出的导数。这个过程的目标是衡量输出层的预测值(( \hat{y} ))与实际值(( y ))之间的差异,并根据这个差异来更新网络权重。

上面提到的误差项 ( \delta_2 ) 是由损失函数相对于网络输出的梯度(导数)计算而来。这里的 ( y ) 表示实际的目标输出值,它是从训练数据集中得到的标签或真实值。而 ( \hat{y} ) 是网络的预测输出,是前向传播过程中网络最后一层的输出。

( \sigma'(\hat{y}) ) 是Sigmoid激活函数的导数。Sigmoid函数 ( \sigma(x) = \frac{1}{1 + e^{-x}} ) 的导数是 ( \sigma'(x) = \sigma(x)(1 - \sigma(x)) )。对于输出层的神经元,我们需要计算损失函数对于激活函数输入的导数,以找出激活函数输出(即预测值 ( \hat{y} ))如何影响损失。

误差项 ( \delta_2 ) 可以根据不同的损失函数有不同的计算方式。对于二元交叉熵(binary cross-entropy)损失,如果我们使用Sigmoid激活函数,误差项可以简化为 ( \delta_2 = \hat{y} - y )。这是因为当我们把Sigmoid激活函数和二元交叉熵损失结合时,它们的导数计算可以互相简化。对于其他类型的损失函数,比如均方误差(mean squared error),我们则需要使用原始的链式法则来计算误差项,考虑到激活函数的导数。

总之,输出层误差 ( \delta_2 ) 的计算是为了衡量神经网络预测输出与实际目标值之间的差异,并通过这个误差来适当调整网络权重,以减少未来预测的误差。

tim

计算隐藏层的误差:( \delta_1 = (w_2 \cdot \delta_2) \cdot \sigma'(a_1) )。
这个原理又是什么

Avatar
Avatar

计算隐藏层的误差 ( \delta_1 ) 是反向传播算法中的关键步骤之一。这一步骤的目的是为了确定隐藏层的神经元对最终输出误差贡献了多少,以便我们可以据此更新这些神经元的权重。

在这个过程中,我们使用链式法则来传播误差。输出层的误差 ( \delta_2 ) 已经被计算出来了,它反映了输出层神经元的激活值 ( a_2 )(即预测值 ( \hat{y} ))如何影响损失函数。为了计算隐藏层的误差 ( \delta_1 ),我们需要考虑两件事:

  1. 权重的影响: 输出层的误差 ( \delta_2 ) 是通过权重 ( w_2 ) 从输出层传播回隐藏层的。因此,我们需要用 ( w_2 ) 乘以 ( \delta_2 ) 来表示隐藏层神经元输出 ( a_1 ) 对输出误差的直接影响。

  2. 激活函数的导数: 隐藏层的神经元使用了激活函数(如Sigmoid函数),激活函数的导数 ( \sigma'(a_1) ) 反映了激活函数在 ( a_1 ) 处的变化率。这个导数告诉我们,隐藏层神经元的加权输入(即其激活函数的输入)如何影响神经元的输出 ( a_1 )。

因此,隐藏层的误差 ( \delta_1 ) 被计算为:

δ1=(w2δ2)σ(a1)\delta_1 = (w_2 \cdot \delta_2) \cdot \sigma'(a_1)

这个公式可以这样理解:

  • ( w_2 \cdot \delta_2 ) 表示输出误差通过权重 ( w_2 ) 反向影响到隐藏层的程度。
  • ( \sigma'(a_1) ) 描述了隐藏层神经元的激活函数输出对其加权输入的敏感度。
  • 将两者相乘,我们得到了隐藏层神经元加权输入的误差梯度,这代表了隐藏层神经元的每个输入(包括偏置)需要调整的方向和幅度。

通过计算 ( \delta_1 ),我们可以更新连接输入层和隐藏层之间的权重,使得网络的预测输出更接近实际输出,从而减少整体的损失。这就是使用反向传播算法逐层更新神经网络权重的基本原理。