mlp
这是一个非常令人兴奋的模块,因为我们将许多内容整合在一起,并训练了一个多层感知器(MLP)作为n-gram语言模型,遵循Bengio等人2003年的论文《神经概率语言模型》。
我们有多个并行实现,它们都能得到完全相同的结果,但实现方式截然不同:
- C版本,完整地列出了所有单独的操作。
- numpy版本,增加了数组抽象。操作现在被分组为作用于数组的函数,但前向和后向传播仍需手动完成。
- PyTorch版本,增加了自动微分引擎。PyTorch的Tensor对象看起来就像numpy中的数组,但在底层,PyTorch会像我们在micrograd中看到的那样跟踪计算图。用户指定前向传播,然后当他们对损失调用
backward()
时,PyTorch会计算梯度。
PyTorch提供的主要服务变得清晰可见:
- 它提供了一个高效的
Array
对象,就像numpy那样,只不过PyTorch称之为Tensor
,而且一些API(莫名其妙地)有些不同。本模块未涉及的是,PyTorch Tensor可以移动到不同的设备(如GPU),大大加快所有计算。 - 它提供了一个自动微分引擎,记录Tensor的计算图,并为你计算梯度。
- 它提供了
nn
库,将Tensor操作组打包成预构建的层和损失函数,这些在深度学习中很常见。
通过我们的努力,我们将获得比在ngram
模块中看到的更低的验证损失,而且参数明显更少。然而,我们在训练时也付出了更高的计算成本(我们基本上是将数据集压缩到模型参数中),在推理时也在某种程度上如此。
待办事项:
- 调整超参数,使其不那么糟糕,我只是随意设置的。(目前看到验证损失为2.06,回想基于计数的4-gram为2.11)
- 合并C版本,使三个主要版本(C、numpy、PyTorch)保持一致
- 为本模块制作精美的图表
许可证
MIT