MLP手写数字识别
多层感知器(MLP)实现对手写数字的识别
Q:什么是MLP?
A: 多层感知器(Multilayer Perceptron, MLP)是一种前馈人工神经网络模型,它由多个节点层组成,每个节点都使用某种非线性激活函数。它代表了人工神经网络的一个基础形式,并且是许多更复杂神经网络架构的基础。理解MLP与神经网络之间的关系有助于更好地了解它们在机器学习和人工智能中的角色。
Q:什么又是神经网络?
A: 神经网络是一类模仿生物神经系统工作方式的计算模型。它们由大量相互连接的人工神经元组成,这些神经元可以处理信息并作出决策或预测。神经网络能够从数据中学习复杂的模式,并被广泛应用于各种任务,如图像识别、自然语言处理、语音识别等。
引言
下图(如图1.1),是三个字迹歪斜,超低分辨率的“3”,但我们可以轻松地识别它们。即使每个图中的像素值是大相径庭的,我们大脑皮层中的某块处理视觉的区域也能够将它们处理成相同的信息。
图1.1
为了让计算机也能拥有与我们类似的“视觉”,可以借鉴人脑中神经元相互连接的结构,应用“神经网络”这一计算模型来达到我们的目的。MLP作为神经网络家族的一员,因其强大的处理能力,成为了理解和实践神经网络概念的重要工具。接下来,我们将通过介绍“手写数字识别”这一经典的案例,带你挖掘MLP的强大功能,领略神经网络之美!
MLP的结构
下图2.1是一个28x28的像素矩阵。对于每个像素,我们都可以用一个介于0-255之间的数去描述它的灰度值,255代表纯白,0代表纯黑。将这个数写入对应的像素中,我们就得到了由28x28个灰度值组合而成的矩阵。然后,我们将每个值除以255归一化至0到1之间,这个矩阵即是我们数字识别程序的输入值。
图2.1
接下来我们将矩阵各行拼接为一列,引入神经网络中。原图中每个像素的灰度值就是神经网络第一层中神经元里的输入值。在网络的最后一层,我们设置10个神经元,它们分别代表0到9这10个数字。这10个神经元对应的值也在0-1之间,表示系统认为输入的图像对应该数字的可能性。这10个值即是我们整个程序的输出,它们之间的最大者也就是我们识别的结果。
至于图2.2里中间的两层,我们称之为“隐含层”,它们负责处理识别数字的具体工作。而MLP神经网络处理信息的核心机制就在于,上一层的输出值经过一定的运算,得到下一层的输入值,以此类推,不断进行下去,直到得到最后一层的输出。某种程度上讲,它就是模仿的生物中神经元组成的网络。
图2.2
层与层之间的计算
上文我们提到“MLP神经网络处理信息的核心机制在于,上一层的值经过一定的运算,得到下一层的值”。那么,这种运算是如何实现的呢?我们以图中第一层到第二层的运算来说明这个问题。
对于第二层中的某个神经元(如上图),它的输出值由上一层的784个神经元的输出值决定。我们不妨设计,让第二层的这个神经元能够识别出上图中白色区域内是否存在一条边。显然,第一层中不同像素的灰度值对白色区域内的边的存在与否的影响不尽相同,处于该区域内的像素对边存在与否的影响必然大于其他像素。也就是说,不同区域的像素对该神经元的输出值的影响权重不同。为了由第一层神经元的输出值得到第二层的输出值,我们为第一层的每个神经元到第二层的这个神经元之间设置一个权重,记为:
则由第一层所有激活值计算第二层的第一个公式为:
其中是第一层神经元的输出值,b为该神经元的偏置值。通过对权重的操控,我们便能使该神经元聚焦于我们想要的区域了(我们甚至可以给周围的其他区域赋上负的权重,以此来增加准确性)。然而,这样的加权和可以是任意大小,我们只需用一个适当的函数将其范围压缩到0-1之间即可。比如,我们可以使用Sigmoid函数,它的解析式如下:
介绍完一个神经元后,我们继续推广。实际上,第二层每一个神经元都会和第一层的784个神经元相连,即每个神经元各带784个权重。后面的每一个神经元与前一层的神经元之间也是如此。同样地,从第二层开始,每个神经元自带一个偏置值。
假设我们的神经网络有两层隐藏层,每个隐藏层都有16个神经元。如此,经过简单的计算,我们便可以得出一共需要13002个参数,计算式如下:
由以上介绍,读者不难看出,当我们建立一个MLP神经网络时,那些巨量的参数才是灵魂。他们决定了我们模型的质量,也就是判断数字的准确率。
事实上,我们不妨把整个神经网络看作一个函数,图片(即灰度值矩阵)是这个函数的输入,最终模型预测的数字是它的输出。这种视角让我们离实际程序的实现更进了一步。
参数的获取——梯度下降法
现在,摆在我们面前最大的问题是,参数的数量如此之庞大,我们不可能一个个去手动设置,但参数却对整个模型的准确率至关重要。因此,我们介绍一种数学方法——梯度下降法来训练计算机“自己”找到合适的参数。
我们想要这么一种算法:给这个模型一大堆训练数据(包括手写数字图像以及它们代表的数字),算法会根据训练数据调整这13002个参数,以提高模型的性能。
首先,我们要设计一种函数,用以评价当前13002个参数组成的网络的识别性能的优劣。假设在一开始,我们完全随机的初始化所有的权重与偏置值(可想而知,此时效果会很差),输入用于训练的图片后,网络会输出0-9一共10个数对应的概率。假设这张图片代表的是“3”,那么理想情况下,我们希望最后一层中“3”对应神经元得到的输出值为1,其余都为0(但这几乎不可能)。
接下来,我们用这10个神经元的实际输出值与理想输出值作差,取平方,再求和,得到一个平方和。我们为了训练网络,会输入许多图片与其表示的数,便会得到许多平方和。通过这个平方和,我们便可以衡量当前参数的识别效果与理想状态的差距,我们称这个和为这套参数的“代价(cost)”,而这种求代价的计算方法,我们称之为“代价函数(cost function)”。其数学表达为:
(其中xi指数字i对应神经元的实际输出值,ai为i对应神经元的理想输出值)
在代价函数中,该13002个参数作为函数的自变量,输入的图片只是参数,因变量是“代价”。为了得到最为合适的参数,我们要找到代价函数的全局最小值,然而常为局部最小值。如此,寻找合适参数的问题便被转化为了一个纯粹的“求多元函数极值”的数学问题。
可对于代价函数这么一个13002元的函数,我们处理起来比较陌生,那么,让我们类比到二元函数中。
输入空间可以想象为XY平面,代价函数则是平面上方的曲面。对于XY平面上的任意一点,我们想要知道,它往哪个方向移动,代价函数的减小最快。这一点,我们可以用多元函数的梯度来解决。(在这里并不想深究详细的数学方法,读者只需知道,我们有办法计算出这么一个负梯度向量,它指向了函数下降最快的方向,负梯度向量的模长还可以衡量代价函数在这个方向上下降得具体有多“陡”)
有了这些介绍,让我们再回到13002元的代价函数。若绘制图像,它将是13003维的,我们无法想象出它的形状,但我们可以用数学去描述它(计算出它在某一点的负梯度向量)。我们将13002个参数(也即是代价函数的13002个输入)放入一个列向量中(下图中左边的向量),而得到的负梯度向量也是13002元的(下图中右边的向量)。显然,负梯度向量中的每个值都在告诉我们输入向量的这一项是该调大还是调小,其绝对值的大小更告诉我们改变哪个参数值对“代价值”的影响更大。若将两个向量相加,则相当于我们由起始点向代价函数下降最快的方向“走”了一小步。反复循环这个过程,我们就不断地向局部或全局最小值点移动(神经网络的参数就在不断改变,网络的性能就在这个过程中不断改善)。足够多次重复后,得到的点对应的输入就是我们想要的参数了。
梯度的计算—反向传播算法
到现在为止,我们并不了解梯度是如何计算的。因此,我们在这里简要谈谈一种计算梯度的经典方法:反向传播算法。
反向传播(Backpropagation)算法是训练神经网络时最常用的算法之一,它用于计算梯度。该算法通过将输出误差从输出层向输入层逐层反馈,来计算各层之间的梯度流,从而达到减少预测误差的目的。
以下是反向传播算法的主要步骤:
前向传播:首先,输入数据通过神经网络的输入层进入,并且按照当前的参数向前传递到隐藏层和输出层。在每一层,都会进行线性变换(与权重相乘)和非线性激活函数的处理。最终,在输出层产生预测值。
计算损失:比较网络的预测值与实际的目标值,使用某种代价函数来衡量两者之间的差异。
反向传播误差:这是整个算法的核心部分。基于链式法则,从输出层开始,逐步计算每个权重对总损失的影响,即计算损失函数关于各个权重的梯度。这一步骤中,需要计算的是偏导数,它指示了权重应该如何被调整以最小化代价函数。
权重更新:根据计算出的梯度以及选定的学习率,利用优化算法(如随机梯度下降法)来更新网络中的所有权重。学习率决定了每次迭代时权重更新的步伐大小。如果学习率太大,可能会导致权重更新过快而无法收敛;如果太小,则可能使收敛速度变得非常慢。
重复过程:上述步骤会不断重复,直到满足某些停止条件为止,比如达到预定的最大迭代次数或是代价函数的变化低于某个阈值。
✦
•
✦
小结
简而言之,MLP通过调整这些权重和偏置,不仅可以用以识别图像,还可以被训练用来解决回归问题。训练过程通常采用反向传播算法结合某种形式的梯度下降方法来进行优化。尽管结构相对简单,但MLP已经在许多领域展现了强大的能力,例如图像识别、自然语言处理等领域中的初步应用。
然而,随着更复杂模型的发展,比如卷积神经网络(CNNs)对于视觉任务以及循环神经网络(RNNs)对于序列数据处理的优势日益显现,MLP的应用范围有所受限。神经网络的变种非常之多,近年来对于这些变种的研究更呈现出爆发的态势。我们所介绍的MLP案例,不过是最为基础的版本,相当于神经网络中的“Hello World”。
它虽然并不复杂,但已经为我们打开了新世界的大门。学习神经网络,我们才能够更好地理解AI,运用AI,乘上AI迅速发展的时代东风,迈向无限可能的未来!
参考文献:
【【官方双语】深度学习之神经网络的结构 Part 1 ver 2.0-哔哩哔哩】 https://b23.tv/Mq8KJwY
【【官方双语】深度学习之梯度下降法 Part 2 ver 0.9 beta-哔哩哔哩】 https://b23.tv/TkedcXQ
【【官方双语】深度学习之反向传播算法 上/下 Part 3 ver 0.9 beta-哔哩哔哩】 https://b23.tv/3IXHapb
文稿 | 科协学术部 周子明 陈卓凡 王邦源
罗济洲 赵一凡 喻祖源 戴昊轩
排版 | 科协外宣部 朱彦霖 谭刘畅 李响 张有怡
审核 | 周文昊