Loading article...
__ __ _ _ ___ ____ _____ | \/ | \ | |_ _/ ___|_ _| | |\/| | \| || |\___ \ | | | | | | |\ || | ___) || | |_| |_|_| \_|___|____/ |_|
MNIST 手写数字识别问题被视作机器学习领域的 "Hello, World"。我们将从零开始手撸一个神经网络(不使用深度学习框架),来解决这个经典问题。该模型包含:卷积层、激活函数层、全连接层。
卷积层是神经网络的核心组件之一。它通过矩阵计算来扫描输入数据,从而提取出有用的特征。想象一下用一个小窗口在图片上滑动,每次计算窗口内的数值,这就是卷积的基本原理。
卷积核(Kernel)在输入矩阵上滑动,每次覆盖一个 3×3 的区域
将卷积核与对应位置的输入值逐个相乘,然后求和,得到一个输出值
不同的卷积核可以提取不同的特征。例如,横向边缘检测器能够识别图像中的横向笔画
激活函数的作用是引入非线性变换,使神经网络能够学习复杂的模式。ReLU(Rectified Linear Unit)是最常用的激活函数之一,它将所有负数变为 0,保留正数不变。
通过 ReLU 激活函数,我们抑制了负值(可能是噪声),保留了正值(可能是有用的特征)。这种选择性的信息过滤,让神经网络能够更好地识别复杂模式。
全连接层将前面提取的所有特征进行加权求和,最终输出对每个数字(0-9)的预测得分。得分最高的数字就是模型的预测结果。
每个数字都有自己专属的权重组。模型通过学习,让正确数字的权重组能够产生更高的得分。在这个例子中,数字 7 的得分是 0.91,远高于其他数字,所以模型预测这个图像是数字 7。
训练模型本质上是一个反馈调节的过程。通过不断计算、评估、调整参数,模型逐步提升识别准确率。
损失函数用来衡量模型预测结果与真实结果之间的差距。差距越大,损失值越高。我们的目标是通过训练让损失值不断降低。
通过求导数(梯度),我们可以知道该如何调整模型参数才能降低损失。梯度指向损失增加最快的方向,我们反方向调整参数,就能让损失下降。
优化器根据梯度来更新模型的权重参数。每次训练(epoch)后,权重都会朝着降低损失的方向调整一点点。经过多轮训练,模型的准确率不断提升。
我们从零实现了一个手写数字识别的神经网络。通过卷积层提取特征,激活函数引入非线性,全连接层输出预测,最后用梯度下降训练模型。虽然这只是一个简单的网络,但它包含了深度学习的核心思想:用数据驱动的方式,让机器自动学习特征和模式。