神经网络原理可视化解析器,是一个面向深度学习与新一代人工智能,以图形化界面用于教学目的的简单神经网络交互式演示项目,它非常强大地可视化了神经网络的训练过程。通过直观的交互式演示与实验,让教研人员与学习者高效的掌握神经网络背后的核心思想,并在短时间内对神经网络工作原理以及核心概念具备深刻的认知。
本演示项目通过神经网络可视化解析器来了解神经网络的原理,通过对源数据进行训练以达到对数据进行分类的目的(分为正、 负两类) 。 本实验会从什么是神经网络、 数据选取、 特征选取、 隐藏层可视化、 输出结果、 参数调整、 激活函数等全方面来展示进行网络神经需要哪些操作。
神经网络的背景知识
1. 什么是神经网络?
神经网络是通过计算机程序从数据中进行学习的一项技术。它是基于目前我们对人脑工作方式的理解而产生的(注意, 这里说是基于, 是因为人脑是一个非常复杂的神经网络, 而人工神经网络实际上是我们对人脑工作过程的理解的一种非常简化的表示) 。 首先, 我们需要创建一堆具有互联系的神经元, 这些神经元可以互相传送信息。 然后, 我们想用这个网络去解决一个问题。 我们并不指望网络一下子就找到问题的正确答案, 它可以不断的去自我调适, 每一次可以增强神经元之间导致输出正确的连接, 并削弱那些导致输出不正确的连接。
2. 什么是神经元?
我们来看一个最最简化的图片。 本质上来说, 它是这个样子的。

里面那个大圆圈圈就是一个神经元, 其中的 f(·), 我们称之为激活函数。 它的输入, 例如上图, 就是所有输入 xi 乘以相应权重 wji 的总和。
3. 什么是激活函数?
顾名思义, 就是激活那个神经元的函数。 再说清楚一点, 例如一个阶跃函数(如下图的例子) 就可以是一个激活函数, 一旦它的输入到达一个值, 它的输出就蹦到上面那个值去,实现『激活』, 完成量变到质变的过程。

4. 网络是如何自我调整的?
如下图中的『Error』, 这就是一个反向传播的过程。 我们说网络的『自我调适』, 就是指通过这一次的输出和正确输出的差值, 来矫正下一次的输入。 那么如何矫正呢? 就是用的梯度下降算法。 梯度下降, 你可以这么理解, 在你面前有 3 个滑梯, 一个 30 度, 一个 60 度,最后一个是 90 度。 如果想最快到达地面, 那一定会选择 90 度的那个滑梯。 这个选择的过程, 就可以称为梯度下降算法。

操作栏
在页面的顶部有操作栏, 这里可以开始和停止任务, 设置相关参数等。 从左到右分别是 ——
- 训练的开关
- 迭代次数
- 学习率
- 激活函数
- 正则化
- 正则化率
- 问题的类型

1. 训练的开关
可以重置训练、 开始训练、 以步为单位执行训练
2. 迭代次数
这里显示当前训练迭代了多少次, 一次迭代表示把所有的训练数据处理了一遍。
3. 学习率
决定每一步学习的步长。 这个和梯度学习有关。 运用梯度下降算法进行优化时, 在梯度项前会乘以一个系数, 这个系数就叫学习率。 学习率如果太小函数收敛很慢, 太大则可能无法找到极值, 甚至函数无法收敛。一个在实践中选择学习率的办法是先把学习速率设置为 0.01, 然后观察 Testing and Training Loss 的走向, 如果 Loss 一直在变小, 那你可以逐步地调大学习速率。 如果 Loss 在变大或者走向多变, 那就得减小学习速率。 经过一番尝试之后, 你可以大概确定学习速率的合适的值。

4. 问题类型
在此提供了两种问题类似: 分类(离散化问题) 和回归(连续性问题)。
数据源
在进行神经网络的第一步是要选择数据源, 在可视化解析器中针对分类问题提供了 4 种不同形态的数据, 分别是圆形、 异或、 高斯和螺旋。

平面内的数据分为蓝色和黄色两类。 蓝色代表正值、 黄色代表负值。 每一种形态的数据都会生成 500 个数据点进行训练和测试。接下来我们使用分类把这两种数据进行分类。可以看出螺旋形态的数据分类是难度最高的。 同时我们可以为数据进行灵活的配置, 可以调节噪声、 训练数据和测试数据比例和批处理大小。
1. 选择数据源
在左侧数据部分可以选择这 4 种数据形态中的某一种, 在此选择圆形。

2. 设置训练数据和测试数据比例
可以设置训练数据和测试数据比例。 指在总数据集中, 拿出多少作为训练数据集。 训练数据指用这些数据来调适网络, 测试数据指用这些数据来验证网络的效果如何。 训练数据+测试数据=总数据量在左侧可以找到『训练数据集比例』。在此我们设置 80% 的数据用于训练, 剩余 20% 的数据用于测试。
3. 设置噪声
可以设置噪声, 噪声是在数据中人为的设置一些污点数据。 在此我们先不添加噪声
4. 设置批处理大小
我们可以设置批处理大小来调整一次处理的数据量大小。 在此我们设置为 10。上述三项属性设置如下图所示:

特征
1. 选择特征
在此一共提供了 7 种特征:
X1、 X2、 X12、 X22、 X1X2、 sin(X1)、 sin(X2)。

X1 代表横轴坐标值, X2 代表纵轴坐标值
X1 可以看成以横坐标分布的数据特征, X2 是以纵坐标分布的数据特征, X12 和 X22 是非负的抛物线分布, X1X2 是双曲抛物面分布, sin(X1) 和 sin(X2) 正弦分布。 我们的目标就是通过这些特征的分布组合将两类数据(蓝色和黄色) 区分开, 这就是训练的目的。
在此我们选择 X1、 X2、 X12、 X22。

2. 添加神经元和隐藏层
我们可以设置多个隐藏层, 也可以为一个隐藏层设置多个神经元。 一般来讲, 隐含层越多, 衍生出的特征类型也就越丰富, 对于分类的效果也会越好, 但不是越多越好, 层数多了训练的速度会变慢, 同时收敛的效果不一定会更好。在此我们设置一个隐藏层, 三个神经元。

3. 权重
在隐含层(HIDDEN LAYERS) 中, 层与层之间的线条颜色由连接神经元之间的权重决定。蓝色代表权重为正, 橙色代表权重为负。 位于连接线右边的神经元的输入值, 由位于连接线左边神经元的输出值及相应连接线的权重、 以及激活函数来决定。

输出
在输出这里我们可以动态的看到 Test loss 和 Training loss 来评估模型的好坏。 最理想的情况是两个 Loss 都逐渐变小, 说明模型越来越准确。 如果 Training Loss 减小而 Testing Loss 增大, 可能我们就过拟合(Overfit)了。Loss 翻译过来是损失。 简单的说就是预测值和实际值之间的差别。 损失越小,表示模型预测结果越准确,这种模型就越好。同时可以显示测试数据, 以查看测试的数据的分布是否和结果是一致的。

运行
1. 设置好以后就可以运行了。 如下点击开始按钮就可以开始了。当迭代到 50 次左右的时候, 训练已经收敛的相当不错了(0.001) 。当迭代到 200 多的时候, 损失降低到 0 了。 这意味着识别数据的能力达到了 100%。

2. 当我们降低一些特征时候再进行训练试试, 这时只选择前两个特征。

点击运行, 当训练到 50 左右的时候损失率还在 0.2 多。当训练到 200 多的时候, 损失率还在 0.015 左右。当训练到 1500 次的时候, 损失率还在 0.002 左右。由此可以看出, 增加特征有助于训练的速度。

3. 当我们在增加一个隐藏层的时候看看效果, 现在我们在 4 个特征的基础上增加了一个隐藏层。当训练到 120 多的时候, 损失率降到了 0。当我们增加 3 个隐藏层的时候, 98 次左右损失率降到了 0。当我们增加到 6 个隐藏层的时候, 则需要 140 左右损失率才降低到了 0。这说明增加隐藏层可以加快训练, 但是不是越多越好, 加的越多可能起到反作用。

借助该平台,我们不需要太过艰深的数学知识,就能理解神经网络的工作原理,能让高校教研人员与学生,在浏览器中运行的真实的神经网络,并且可以让学生点击按钮和调整参数,从而了解它是怎么工作的。