神经网络:交互式练习#
本页、节要点:
- 参数与超参数:权重、偏置是参数,改动它们会直接改变这一次的计算结果;隐藏层层数、神经元个数、学习率、激活函数是超参数,它们决定模型学什么。
- 前馈推理:这个网络的计算是单向流动的,新加一层只会影响它之后的节点。
- ReLU 的截断性:ReLU(0) 与 ReLU(-5) 的输出都是 0,所以节点值没变并不等于底层计算没变。
- 损失(loss):练习 2 用测试损失与训练损失两个数字,衡量模型拟合得够不够好。
通过接下来的两个练习,让我们把神经网络拆开看个究竟。先看参数与超参数的改动如何影响网络的预测,再动手训练一个神经网络,让它自己学会拟合非线性数据。
练习 1:亲手拨一个 ReLU 网络#
下面的组件按这样一套配置搭好了一个神经网络:
输入层有 3 个神经元,初始取值分别是 0.00、0.00、0.00。
隐藏层有 4 个神经元。
输出层有 1 个神经元。
隐藏层的所有节点,以及输出节点,都使用 ReLU 激活函数。
先花点时间熟悉一下网络的初始设置(注意:暂时不要点 ▶️ 和 >| 这两个按钮),然后完成组件下面的两个任务。
任务 1:输出会是正数、负数,还是 0?#
神经网络的三个输入特征,取值都是 0.00。点开网络里的每个节点,看看初始化之后的参数值。在按下运行(▶️)按钮之前,先回答这个问题:
你认为最终会得到什么样的输出值:正数、负数,还是 0?
A. 输出为正数
B. 输出为负数
C. 输出为 0
现在点一下网络上方的运行(▶️)按钮,看着隐藏层和输出节点上的数值一个个被填上。你上面的答案对吗?
任务 2:多插一层,谁会跟着变?#
在动手改网络之前,先回答这个问题:
假如在第一层隐藏层之后再加一层隐藏层,给这层放 3 个节点,输入和权重、偏置参数全都保持原样,那么哪些节点的计算会受到影响?
A. 网络里除输入节点以外的所有节点
B. 只有第一层隐藏层里的节点
C. 只有输出节点
现在按下面的步骤,把神经网络改成多一层隐藏层:
点一下「1 hidden layer」(1 个隐藏层)这行文字左边的 + 按钮,在输出层之前插入一层新的隐藏层。
点一下新隐藏层上方的 + 按钮两次,给这一层再加 2 个节点。
你上面的答案对吗?
任务 3:改一个权重,波及到谁?#
点一下网络图里第一层隐藏层中从上往下数的第二个节点。在改动网络配置之前,先回答这个问题:
假如把权重 $w_{12}$(显示在第一个输入节点 $x_1$ 下方)的值改掉,那么对某些输入来说,哪些节点的计算可能会受到影响?
A. 没有节点
B. 第一层隐藏层的第二个节点、第二层隐藏层的所有节点,以及输出节点
C. 第一层隐藏层的所有节点、第二层隐藏层,以及输出层
现在,点进权重 $w_{12}$ 的输入框,把它的值改成 5.00,按回车。观察网络图上的变化。
你的答案对吗?验证的时候要当心:如果一个节点的取值没变,是不是就意味着它底层的计算也没变?
练习 2:让神经网络自己学会拟合非线性数据#
在「类别型数据」模块的特征交叉练习里,你是手工构造特征交叉来拟合非线性数据的。现在换成神经网络,看看它能不能在训练过程中自己学会拟合非线性数据。
你的任务: 配置一个神经网络,让它把下图中的橙色点和蓝色点分开,在训练数据和测试数据上都把损失压到 0.2 以下。
指示: 在下面的交互式组件里:
修改神经网络的超参数,可以先拿下面这几种配置来试:
点网络图里 HIDDEN LAYERS(隐藏层)标题左侧的 + 和 - 按钮,增减隐藏层。
点某一隐藏层列上方的 + 和 - 按钮,增减这一层的神经元。
在图上方的 Learning rate(学习率)下拉框里换一个新的学习率。
在图上方的 Activation(激活)下拉框里换一个新的激活函数。
点图上方的运行(▶️)按钮,用刚才设定的参数训练神经网络模型。
观察训练推进过程中模型拟合数据的可视化效果,同时盯住 Output(输出)区域里的 Test loss(测试损失)和 Training loss(训练损失)。
如果模型在测试数据和训练数据上的损失都没能降到 0.2 以下,点 reset 重置,然后换一组配置,重复第 1–3 步。如此反复,直到跑出你满意的结果。
MLWM: 练习 2 里的几个开关,其实就是深度学习最常调的那几组超参数——隐藏层数、每层神经元数、学习率、激活函数;系统性的调参思路可以参见「深度学习超参数:交叉验证与调参方法」。激活函数本身怎么把线性网络掰成非线性模型,参见「激活函数原理:Sigmoid、Tanh、ReLU 与 LeakyReLU」;训练阶段这些参数又是怎么被一步步调出来的,参见「反向传播与梯度下降:梯度消失与爆炸的解决方法」。
关键术语:
- 测试损失(Test loss)
- 训练损失(Training loss)