机器学习速成课程的全新改进版本将于 2024 年 8 月推出。敬请期待!
首个神经网络
在本练习中,我们将训练您的第一个小神经网络。神经网络将让我们可以在不使用显式特征组合的情况下学习非线性模型。
任务 1:给定模型将两个输入特征合并为一个神经元。此模型会学习任何非线性规律吗?运行应用以确认猜测。
任务 2:尝试将隐藏层中的神经元数量从 1 增加到 2,同时尝试从线性激活更改为非线性激活(例如 ReLU)。您能否创建一个可以学习非线性的模型?它能否有效地对数据进行建模?
任务 3:使用 ReLU 等非线性激活函数,尝试将隐藏层中的神经元数量从 2 增加到 3。它能否有效地对数据进行建模?模型运行期间每次运行的质量有何不同?
任务 4:通过添加或移除隐藏层和每层的神经元,继续进行实验。此外,您还可以随时更改学习速率、正则化和其他学习设置。您可以使用的使测试损失不超过 0.177 的神经元和层的最小数量?
增加模型大小是提高拟合度,还是加快收敛速度?这会改变向良好模型收敛的频率吗?例如,尝试以下架构:
- 具有 3 个神经元的第一个隐藏层。
- 包含 3 个神经元的第二个隐藏层。
- 包含 2 个神经元的第三个隐藏层。
(答案位于练习正下方。)
点击加号图标可了解任务 1 的答案。
激活已设为线性,因此此模型无法学习任何非线性。损失非常高,我们说该模型欠拟合数据。
点击加号图标可了解任务 2 的答案。
非线性激活函数可以学习非线性模型。不过,具有 2 个神经元的单个隐藏层并不能反映此数据集中的所有非线性规律,并且即使没有噪声,损失也会很高:它仍会欠拟合数据。这些练习是不确定的,因此有些运行不会学习有效的模型,而其他运行则会得到很好的结果。最佳模型可能不具有您预期的形状!
点击加号图标可了解任务 3 的答案。
在本练习中,Playground 具有不确定性。一个具有 3 个神经元的隐藏层足以对数据集进行建模(不使用噪声),但并非所有运行都会收敛到良好的模型。
3 个神经元就足够了,因为 XOR 函数可以表示为 3 个半平面(ReLU 激活函数)的组合。通过查看神经元图像,您可以看到各个神经元的输出。在有 3 个神经元和 ReLU 激活的良好模型中,1 张图像几乎是垂直线,检测出 X1 为正值(或负值;符号可切换),1 张图像几乎带有水平线,检测 X2 的符号,还有 1 张图像沿对角线检测,用于检测其交互情况。
但是,并非所有运行都会收敛到一个好的模型。有些运行的效果优于具有 2 个神经元的模型,在这些情况下,您可能会看到重复的神经元。
点击加号图标可了解任务 4 的答案。
具有 3 个神经元的单个隐藏层可以对数据进行建模,但这没有冗余,因此在许多运行中,它实际上会损失一个神经元,并且无法学习一个好的模型。具有 3 个以上神经元的单个层具有更多的冗余,因此更有可能收敛到良好的模型。
如我们所见,只有一个 2 个神经元的隐藏层也无法对数据进行建模。如果您试用一下,可以看到输出层中的所有项都只能由这两个节点中的线组成。在这种情况下,深度网络可以比单独的隐藏层更好地为数据集建模:第二层中的单个神经元可以通过第一层中的神经元进行组合,从而为更复杂的形状(例如右象限)建模。虽然相较于仅使用第一个隐藏层时,添加第二个隐藏层仍可更好地构建数据集,但合理的做法是,向第一个层添加更多节点,使更多线作为第二层构建形状的套件的一部分。
但是,无论模型的深度如何,第一个隐藏层中具有 1 个神经元的模型都无法学会良好的模型。这是因为第一个层的输出仅沿一个维度(通常是对角线)变化,这不足以很好地模拟此数据集。之后的图层无法弥补这一点,无论复杂程度如何;输入数据中的信息已无法恢复,无法恢复。
如果我们没有拥有小型网络,而是拥有许多包含大量神经元的层,那么就这样一个简单的问题,该怎么办?正如我们所见,第一个图层能够尝试许多不同的线条斜率。第二层能够连续许多形状,而后续形状中会有很多形状。
通过允许模型通过如此多的隐藏神经元考虑如此多的形状,您已经为模型创建了足够的空间,可以轻松地开始过拟合训练集中的噪声,使这些复杂的形状与训练数据的特征而不是通用的真实情况相匹配。在此示例中,较大的模型可能有复杂的边界来匹配精确的数据点。在极端情况下,大型模型可以学习围绕一个噪点点的岛屿,这称为记住数据。允许模型大得多,您会发现它通常比只使用足够多的神经元来解决问题的更简单的模型,表现得更好。
神经网络初始化
本练习将再次使用 XOR 数据,但会观察神经网络的重复性以及初始化的重要性。
任务 1:运行给定模型四到五次。在每次试验之前,点击 Reset the network 按钮以获取新的随机初始化数据。(重置网络按钮是一个圆形重置箭头,位于“播放”按钮左侧)。让每次试验运行至少 500 步,以确保收敛。每个模型输出会收敛为何种形状?这说明了初始化在非凸优化中的作用?
任务 2:尝试添加一层和几个额外节点,让模型略微复杂一些。重复任务 1 中的试验。这会给结果带来额外的稳定性吗?
(答案位于练习正下方。)
点击加号图标可了解任务 1 的答案。
每次运行时,学习的模型都具有不同的形状。收敛的测试损失几乎从最低到最高变化了 2 倍。
点击加号图标可了解任务 2 的答案。
添加层和额外节点会产生更多可重复的结果。每次运行时,生成的模型看起来都大致相同。此外,收敛的测试损失显示运行之间的方差较小。
神经网络螺旋
此数据集呈噪音螺旋。显然,线性模型在此处会失败,但即使是手动定义的特征组合,可能也很难构建。
任务 1:仅使用 X1 和 X2 训练可以达到的最佳模型。您可以随意添加或移除层和神经元,还可以更改学习速率、正则化率和批次大小等学习设置。您可以获得的最佳测试损失是多少?模型输出表面的平滑度如何?
任务 2:即使使用神经网络,通常需要一些特征工程才能实现最佳性能。尝试添加其他乘积特征或 sin(X1) 和 sin(X2) 等其他转换。你有更好的模型吗?模型输出是否更流畅?
(答案位于练习正下方。)
点击加号图标可查看可能的答案。
以下视频详细介绍了如何在 Playground 中选择超参数,以针对可最大限度地减少测试损失的螺旋数据训练模型。