@lijiang

Sculpting in time

Do one thing and do it well.
Every story has a beginning and an end.

人工神经网络的反向传播-梯度下降算法

Backpropagation in Artificial Neural Network

1-Minute Read

关于人工神经网络

人工神经网络模型判断手写数字

我们首先在Mathematica中徒手打造一个人工神经网络,然后对该神经网络进行训练,最后用训练得到的模型来判断图片上的手写数字是多少。

trainingData = ResourceData["MNIST", "TrainingData"];
testData = ResourceData["MNIST", "TestData"];
net = NetInitialize@NetChain[{
    FlattenLayer[],
    LinearLayer[500],
    ElementwiseLayer["Sigmoid"],
    LinearLayer[100],
    ElementwiseLayer["Sigmoid"],
    LinearLayer[10],
    SoftmaxLayer[]},
   "Input" -> 
    NetEncoder[{"Image", {12, 12}, "ColorSpace" -> "Grayscale"}],
   "Output" -> NetDecoder[{"Class", Range[0, 9]}]]

NetEncoder告诉我们输入的单通道12*12的图像 NetDecoder告诉我们我们的神经网络模型最后输出的是一个分类,类别分别是0-9中的一个数字 网络层的模型为:

  1. FlattenLayer[] 图像中的像素数据即两纬数据排列成一纬数据做为输入
  2. LinearLayer[500] 第一层线性层,输出数据为500个,限定函数为Sigmoid
  3. LinearLayer[100] 第二层线性层,输出数据为100个,限定函数为Sigmoid
  4. LinearLayer[10] 最后一层输出,因为我们需要有10个分类,所以这里设定是10,限定函数为 Softmax

ann-1

神经网络层形象的展示如下:

MNIST-Network

训练数据标记,左边是实际的手写数字,右边是对应标签

RandomSample[trainingData, 10]

ann-2

在未对模型进行训练前,使用随机的权重来判断图片,我们可以确定错误率接近100%

mode1-error-1

对模型进行训练

trained = 
 NetTrain[net, trainingData, ValidationSet -> testData, 
  MaxTrainingRounds -> 50 ]

training-1 training-2

从以上图表中我们大致可以看出正确率已经接近97%

再次预测上述图片,模型已经可以正确预测给出的图片数字为6

mode2

measurements = ClassifierMeasurements[trained, testData]

运行 measurements[“Accuracy”] 我们可以得到模型的正确率为98.02%

模型中识别出错比较高的图片数字见下图:

accuracy-1

训练得到的模型在推演中的混淆矩阵如下图所示:

ConfusionMatrixPlot-MNIST-ANN

神经网络中的反向传播推导

我们首先推导含有一个隐藏层的反向传播

ANN-One-Hidden-Layer

对于反向传播中最重要的一个知识点就是链式求导法则,以下推理中我们首先假定不存在隐藏层和限定函数。

info1

info2

info3

info4

info5

以上考虑的是神经网络没有隐藏层存在,且无限定函数,现在考虑网络中存在限定函数g,用来抑制神经元的输出。

info6

info7

info8

info9

info10

从以上推论中我们可以知道反向传播中使用的方法就是链式求导法则,在反向传播中递归的修正每一层权重值,使得E接近局部极小值。

以上的推论和作图全部在Mathematica中完成,Notebook在这里下载

Recent Posts

Categories

About

Keep thinking, Stay curious
Always be sensitive to new things