神经网络的直观理解

--使用一个手写数字识别的例子来理解神经网络。

一张图片有28x28的像素块,根据像素块的灰度值不同,可排列成不同的数字。

这里,我们把神经网络的第一层理解成一个装有数字的容器,数字代表对应像素的灰度值。0表示纯黑,1表示纯白,我们把这种数字称为“激活值”。

image-20230224192154924

我们把中间的称为隐藏层,暂时看做一个黑箱,具体后面说明。

神经网络的最后一层,十个神经元分别代表0到9这十个数字,他们的值也属于0到1之间,表示对应数字的可能性。

神经网络在运行时,上一层的激活值将决定下一层的激活值,所以神经网络的核心机制在于上一层的激活值是怎样通过运算,算出下一层的激活值的。从某种程度上讲,它模仿的是生物中神经元组成的神经网络,某些神经元的激发会促使另一些神经元的激发。

image-20230224192022612

如果在网络中输入层的784个神经元处,输入了784个代表输入图像各像素的灰度值,那么这层激活值的图案会让下层的激活值产生某些特殊的图案。机器是如何识别数字的呢?在这里将数字拆分成了多个小的图案,让第一个隐藏层识别较简单的线条,第二个隐藏层识别更复杂的圆圈或者直线,最后给出接近这个数字的概率。

神经网络2-小白菜博客
神经网络2-小白菜博客
image-20230224192504204

放大关注第二层中的一个神经元,它能够正确识别处图像中的这块区域是否存在一条边。现在我们就需要知道这个网络的参数,如何调整参数才能让它表示这种图案。我们需要给这个神经元和第一层所有神经元之间的每一条连线都赋上一个权重值,然后然后拿起第一层所有的激活值和他们对应的权重值一起,算出他们的加权和。

神经网络2-小白菜博客
image-20230225153501235

在一张图像里,我们把权重值看做一个表格,把正的标记成绿色,把负的标记成红色,颜色越暗就大致表示它的权重接近于0。

image-20230225153814058

现在如果我们如果把关注区域的权重赋予正值,把其他所有权重赋为0,这样一来,对所有的像素值取加权和,就只会累加我们关注的区域的像素值了。此时,如果你真的想识别出这里是否存在一条边,只需要给周围一圈的像素赋予负的权重,这样当中间的像素亮,周围的像素暗时,加权和就能达到最大。

image-20230225154050706

这样计算的加权和是任意值,但在网络上我们需要激活值都处于0~1之间,所以自然地把这个加权和输入到某个函数进行压缩,这里使用之前学习的Sigmoid函数。但有时即使加权和大于0时,我们也不想把神经元点亮,可能只有当和大于某个值时,例如10,才让它激发,此时就需要一个加偏置项,保证不能随便激发。

总而言之,权重告诉你这个第二层的神经元关注什么样的像素图案,偏置则告诉你加权和得有多大才能让神经元的激发有意义。

image-20230225154914578

我们才说了第二层的一个神经元,但这一层的每个神经元都会和第一层全部的784个神经元相连接,这784个神经元每个都带有一个权重,而第二层的每个神经元都会在计算自己的加权和后加上自己的偏置,再通过Sigmoid函数压缩输出自己的激活值。其它层也是这样互相连接的,所以整个神经网络存在着很多的权重参数以及偏置参数。

为了方便观察以及编程实现,我们把某一层所有的激活值统一成列向量,再把这一层和下一层间所有的权重放到一个矩阵中。把偏置也放入一个列向量中,与激活向量和权重矩阵相乘的结果相加,最后用Sigmoid包装,就得到了下层的激活值,它也是一个列向量。

image-20230225160712085

在此之前,我们把神经元看做数字的容器,实际上神经元中装着的值是取决于你的输入图像的,所以把神经元看做一个函数才更加准确。它输入的是上层所有神经元的输出,而它的输出是一个0~1的值。不过这个函数及其复杂,用了大量的权重和偏置参数来识别特殊图案,又要不停地用到矩阵乘法和Sigmoid函数映射运算。那么神经网络是如何通过调整得到合适的权重和偏置呢?

答案其实就是梯度下降法,通过学习不断地缩小代价函数,使之最终达到局部最小值,此时我们就获得了合适的权重参数和偏置参数。但是问题又来了,由于参数的维度过大,使用梯度下降时,梯度十分复杂,很难计算。于是,我们就引入了反向传播算法(BP算法),可以更简单地计算出梯度。

注:对于梯度下降的补充

函数的梯度为学习率乘以代价函数的偏导数,它指出了函数最陡的增长方向,那么负梯度就指出了最快的下降方向。这个梯度向量的长度代表最陡的坡有多陡,我们在神经网络里利用反向传播算法要求的就是负梯度的梯度向量。

image-20230225221839623