什么是神经网络
假设现在有一个28*28像素的图片,例如下图
人脑可以轻松快速识别图像中的数字是3。但是如果要写一个程序去识别图片中的数字,就非常的困难。这就涉及到了我们今天内容,神经网络。那么什么是神经网络,它又是如何工作的呢。一个简单的神经网络是这样的形式
后续我们会讨论它为什么是这样一层一层,以及图片中的数据公式是什么意思。
能够识别手写数字的神经网络是一个简单的经典例子。我们把这神经网络称为多层感知器MLP(Multilayer Perceptron)。除此之外,还有相对复杂的卷积神经网络(Convolutional Neural Network),擅长图像识别,而**长短期记忆网络(LSTM, Long Short-Term Memory)**则擅长语音识别。
基础结构
神经网络,顾名思义来源于人的大脑结构,而神经元,就是图片中的一个个圆点,我们可以暂时把它理解成一个装有0-1之间数字的容器。那么假设我们把一个像素看成一个神经元,那么一开始我们就拥有28 * 28,784个神经元。进一步,我们将像素的灰度值作为神经元中存储的数字,0是纯黑,1是纯白,这个存在神经元中的数字,我们称为激活值。那么激活值越大,则神经元越亮。
思考:现在我们常说的Token,是否可以理解为是一种激活值
Token和激活值确实有相似之处,但是激活值是一个连续的数字区间,token,也就是我们输入的文字,是个离散值。token 在语言模型中的作用,确实类似于神经网络中的激活值——它们都是信息的载体。在 Transformer 架构中,每个 token 会经过嵌入层(embedding)转换成高维向量,这个向量随后在网络各层之间传递和变换,就像激活值在前馈网络中流动一样。
这初始的784个像素构成的神经元,我们称为输入层。图片中数字的识别结果有0-9共十种。也就是神经网络的终点是10个神经元,这十个神经元内存储的也是0-1的激活值,但是表示的是图片中的数字被识别成对应数据的可能性,这十个神经元构成结果层。输入层和结果层中间则是隐含层。
假设我们有两层隐含层,每层有16个神经元,这些都是可以随意设置,取决于你所需要识别的准确性。输入层经过隐含层从而触发到结果层,整个过程就是神经网络的运行核心机制,就是上一层输入值通过怎样的计算获得下一层的激活值。某种程度上这种结构就是在模仿生物脑中的神经元组层的网络,某些神经元的触发会进一步触发另外一些神经元。
如何识别一张图片
那么我们回归到,人脑是如何识别图片的,一般来说,会通过数字特点,比如说上面一个圆下面一个圆,我们会认为是8,而9就是上面一个圆加下面一根竖线。假设我们把数字拆分出来的结构映射成0-1之间的数字,作为第二层隐含层。那么是否可以关联,第二层隐含层圆和一条直线的神经元被触发,组合就可以触发结果层的数字9。那么圆和竖线怎么被识别呢,可以进一步拆分,圆可以看作几条弧线的组合,竖线可以看作三条短线的垂直组合
这也是为什么我一开始设置两层隐含层的原因。隐含层越多数字的组成过程越长,拆分出来的数字构造元素越多则每层的神经元越多。
激活值的计算
在之前的拆分后,我们现在最重要的任务就是设计,如果将输入层的激活值转换成第一层隐含层的激活值,也就是设计一个机制,将像素识别成构成数字结构的一条条短边。
我们赋予输入层神经元与第一隐含层的每个神经元的连线一个权重值,然后我们将输入层每个神经元的激活值乘以这个权重,算出加权和。假设把正的加权值标记成绿色,负的加权值标记成红色,其他区域权重为0标记成黑色。通过这样我们就可以只累加我们关注区域的激活值
如果你想识别一条短边,则给短边周围的像素赋予负数加权值,这样当中间的像素激活值大(像素亮)周围的像素激活值小时,加权和达到最大值。不过加权和可以是任意正负值,而我们的激活值范围是0-1,因此需要一个函数进行加权和与激活值的映射。通常我们使用sigmoid作为这个映射函数
$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
这个函数将任意实数输入映射到 (0, 1) 区间,正好符合激活值的范围要求。当输入值较大时,输出接近1;当输入值较小时,输出接近0。
扩展:除了sigmoid,是否有其他映射函数
有的,其实现在大多神经网络已经不再使用sigmoid,而是使用ReLU函数(Rectified Linear Unit,线性整流函数)。函数公式也非常简单:ReLU(a) = Max(0, a)。即只有触发和不触发两种状态,正是因为其简单性,在深层神经网络模型中其表现要优于sigmoid。
但是有时候我们并不想在加权和大于0时就激活神经元,这个时候就需要偏置值,来确保只有加权和大于某个数时,神经元才被激活。现在我们有权重和偏置值,权重表示第二层神经元更关注识别什么图像,偏置值则表示加权和需要多大神经元的激活才有意义。通过这两个参数,我们得出来第二层单个神经元激活值的计算公式
而借助线性代数的矩阵乘积与和,则可以得出整个第二层神经元激活值的计算公式
在这个线性代数运算中,我们有784*16 + 16*16 + 16*10个权重参数,和16 + 16 + 10个偏置值参数。总计超13000个参数。而我们就需要调整修正这么多的参数以让最后的结果层激活值计算准确,使图片识别准确率最高。这个根据结果不断修正神经网络参数的过程,就是机器学习的过程。这个过程的细节,在后续会进一步学习。
总结
在本文中,我们学习了什么是神经网络,神经网络的结构是什么样的,以及神经网络是如何计算激活值,以及层层激活以获取最终的结果的。下一步,我们将进一步学习,神经网络是如何通过学习,调整自身以达到最优状态的。
扩展阅读
官方文档
- 动手学深度学习 - 多层感知机 - 李沐等人编写的开源深度学习教材,理论结合实践
技术博客
- 神经网络入门:从感知机到多层感知机 - CSDN 入门教程,循序渐进讲解 MLP
- 神经网络1:多层感知器-MLP - 知乎 - 图文并茂,结构清晰
实践教程
- 多层感知机(MLP)入门 - 慕课网 - 包含 Python 代码示例,适合动手实践
延伸阅读
- 神经网络快速入门:什么是多层感知器和反向传播? - 进一步了解反向传播算法
