什么是 multi-layer perceptron model,
多层感知机(Multi-Layer Perceptron,简称MLP)是一种前馈人工神经网络模型,它包含一个或多个隐藏层。每一层都由多个神经元组成,这些神经元与下一层的每个神经元相连接。每个连接都有一个权重,这些权重在训练过程中会不断更新,以最小化预测输出和实际输出之间的差距。
MLP的基本结构包括三个主要部分:
在MLP中,每个神经元通常会对输入进行加权求和,然后通过一个非线性激活函数,如Sigmoid、Tanh或ReLU函数,来产生输出。激活函数的引入是为了增加网络的非线性能力,使得网络能够学习和模拟复杂的函数映射。
MLP的训练过程通常使用反向传播算法(Backpropagation)和梯度下降(Gradient Descent)或其变体来调整网络中的权重。在反向传播过程中,首先会计算输出层的误差,然后将这个误差反向传播到前面的层,从而逐层计算每个神经元的误差梯度。这些梯度就是用来更新连接权重的依据。
MLP可以解决多种不同类型的问题,包括分类、回归和序列预测等。然而,对于某些特定类型的数据,如图像、序列和文本数据,通常会使用更专门化的神经网络架构(例如卷积神经网络CNN,循环神经网络RNN),因为这些架构可以更好地利用数据的内在结构。
Sigmoid 函数举个简单例子
Sigmoid函数是一种广泛使用的激活函数,其数学表达式为:
其中 ( e ) 是自然对数的底数约等于2.71828,( x ) 是函数的输入。
Sigmoid函数的一个重要特性是它能够将任意值的输入映射到(0, 1)区间内,这使得它在早期的神经网络中常被用于二分类问题的输出层,输出可以被解释为概率。
来举一个简单的例子,假设我们有一个输入值 ( x = 1 ),我们想计算Sigmoid函数的输出。
首先,我们按照公式计算:
所以,当输入 ( x = 1 ),Sigmoid函数的输出大约是 ( 0.73106 ),这个值介于0和1之间。
Sigmoid函数的图像是一个S形的曲线,随着输入值增大,输出值逼近于1;随着输入值减小,输出值逼近于0。当输入值是0时,Sigmoid函数的输出是0.5。因其S形特点,Sigmoid函数也常被称为S型生长曲线。
简要介绍 反向传播算法
反向传播算法(Backpropagation)是一种用于训练人工神经网络的核心算法,特别是在多层感知机(MLP)的训练中得到了广泛的应用。该算法使用梯度下降法来最小化网络的损失函数,即减少网络预测输出与实际输出之间的差异。
反向传播算法包含两个主要的阶段:前向传播和反向传播。
前向传播(Forward Propagation):
反向传播(Backward Propagation):
反向传播算法的关键在于准确计算损失函数对每个权重的偏导数,这样就可以知道如何调整权重以减少损失。此过程中的梯度计算通常通过自动微分技术(例如,计算图和反向传播)来实现。
反向传播算法使得深度学习模型能够通过反复迭代训练数据,逐渐学习到如何减少预测误差,从而提高模型的性能。这一算法的提出和实现是深度学习能够成功解决复杂问题的关键因素之一。
举一个最简单的利用反向传播算法神经网络的例子
让我们来看一个非常简单的神经网络例子,它只包含一个输入层、一个含有一个神经元的隐藏层和一个输出层。这个网络将被用来实现一个简单的二元逻辑运算——逻辑非(NOT)。
逻辑非运算的真值表如下:
输入 (x) | 输出 (y) |
---|---|
0 | 1 |
1 | 0 |
这个网络的结构如下:
我们初始化权重和偏置为随机值,然后开始训练过程。
前向传播(Forward Propagation):
计算损失(Loss Calculation):
我们可以使用二元交叉熵损失函数来计算损失,它在二分类问题中很常用。
反向传播(Backward Propagation):
其中,( \alpha ) 是学习率,一个小的正数。
重复步骤:
重复以上的前向传播和反向传播步骤多次(即多个训练迭代),每次使用真值表中的数据。
经过足够的训练迭代后,神经网络的权重和偏置将调整为能够接近地模拟逻辑非运算的值。例如,当输入 x 是 0,网络应该输出接近 1 的值;而当输入 x 是 1,网络应该输出接近 0 的值。
可以用 ascii 画一张示意图不
当然可以。以下是一个简化的单个神经元的神经网络示意图,它用于实现上述逻辑非(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
传播回输入层。在每一步中,我们都会使用梯度下降法来更新 w1
、w2
、b1
和 b2
以减小损失函数的值。
为什么需要 偏置
偏置(bias)在神经网络中起着非常重要的作用。考虑一个没有偏置的神经元,其输出是输入特
为什么需要 偏置
偏置(bias)在神经网络中起着非常重要的作用。考虑一个没有偏置的神经元,其输出是输入特征的加权和通过激活函数的结果。如果没有偏置,无论权重如何调整,当所有输入都为零时,神经元的输出将始终为零。偏置的引入允许神经元即使在所有输入都是零的情况下也能有非零的输出。
偏置的主要作用包括:
偏移激活函数: 偏置允许激活函数沿输入轴移动,这意味着神经元可以在不同的输入值下被激活。这种移动能力是非常必要的,因为它给予神经网络更大的灵活性去捕捉数据中的模式。
增加表达能力: 如果没有偏置,即使是多层网络也只能学习到通过原点的决策边界。偏置增加了模型的表达能力,使得神经网络可以学习到更复杂的函数。
打破对称性: 在训练开始时,如果所有权重都初始化为相同的值,网络中的每个神经元将计算相同的输出。偏置的存在确保即使权重开始时相同,神经元也能够学习不同的特征。
处理无输入的情况: 在某些情况下,输入可能为零或不存在(例如稀疏数据)。偏置确保即便在这种情况下,神经网络仍然可以产生非零的输出,并且能够继续学习和工作。
因此,偏置是神经网络中不可缺少的一部分,它提供了额外的自由度,增强了网络对数据的建模能力。在实践中,每个神经元通常都会有一个偏置项。
首先计算输出层误差:( \delta_2 = (\hat{y} - y) \cdot \sigma'(\hat{y}) ),其中 ( y ) 是期望输出,( \sigma' ) 是Sigmoid函数的导数
输入层误差为什么是这么计算?y 是这么来的
在反向传播算法中,计算输出层误差的方式是基于损失函数(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 ) 的计算是为了衡量神经网络预测输出与实际目标值之间的差异,并通过这个误差来适当调整网络权重,以减少未来预测的误差。
计算隐藏层的误差:( \delta_1 = (w_2 \cdot \delta_2) \cdot \sigma'(a_1) )。
这个原理又是什么
计算隐藏层的误差 ( \delta_1 ) 是反向传播算法中的关键步骤之一。这一步骤的目的是为了确定隐藏层的神经元对最终输出误差贡献了多少,以便我们可以据此更新这些神经元的权重。
在这个过程中,我们使用链式法则来传播误差。输出层的误差 ( \delta_2 ) 已经被计算出来了,它反映了输出层神经元的激活值 ( a_2 )(即预测值 ( \hat{y} ))如何影响损失函数。为了计算隐藏层的误差 ( \delta_1 ),我们需要考虑两件事:
权重的影响: 输出层的误差 ( \delta_2 ) 是通过权重 ( w_2 ) 从输出层传播回隐藏层的。因此,我们需要用 ( w_2 ) 乘以 ( \delta_2 ) 来表示隐藏层神经元输出 ( a_1 ) 对输出误差的直接影响。
激活函数的导数: 隐藏层的神经元使用了激活函数(如Sigmoid函数),激活函数的导数 ( \sigma'(a_1) ) 反映了激活函数在 ( a_1 ) 处的变化率。这个导数告诉我们,隐藏层神经元的加权输入(即其激活函数的输入)如何影响神经元的输出 ( a_1 )。
因此,隐藏层的误差 ( \delta_1 ) 被计算为:
这个公式可以这样理解:
通过计算 ( \delta_1 ),我们可以更新连接输入层和隐藏层之间的权重,使得网络的预测输出更接近实际输出,从而减少整体的损失。这就是使用反向传播算法逐层更新神经网络权重的基本原理。