如何读技术书更有收获(译文)
本文译自 LLMs-from-scratch 仓库中的 Recommendations for Getting the Most Out of a Technical Book。 原文版权归 Sebastian Raschka 所有,仓库采用 Apache License 2.0。译文保留原意,并按中文阅读习惯做了少量表达调整。
下面这些建议,是我以前回答读者“怎样才能从《Build a Large Language Model (From Scratch)》这类技术书里学到更多”时整理过的一些笔记。
我自己读技术书时,也会采用类似的方法。它不是一套放之四海皆准的公式,但可以作为一个有用的起点。
对于这本书,我强烈建议按顺序读,因为每一章都会依赖前一章的内容。具体到每一章,我推荐按下面几个步骤来读。
1. 第一次阅读:离线读
第一次读时,我建议先从头到尾把这一章读完,暂时不要写代码。这个阶段的目标,是先建立整体图景。
最好离开电脑来读这一遍。纸质书很适合;如果使用电子设备,也尽量选一个不会分心的设备,比如没有浏览器、社交媒体和邮件干扰的阅读器。
我个人会同时读纸质书和电子墨水屏。虽然我从 2018 年起就一直使用电子墨水屏,也总是尽量多在上面阅读,但我仍然能明显感觉到,纸质书更容易让我集中注意力。这也是为什么遇到特别难、或者我真的想深入理解的论文时,我有时会把它们打印出来。
我的建议是:第一次阅读控制在一次简短、专注的 20 分钟左右。尽量减少干扰,不要过度思考,也不要卡在细节上。
遇到困惑或有意思的地方,可以做标注或高亮,但这个阶段先不要查资料。我建议只是读, 不要运行任何代码。第一遍的目的,是理解大框架。
2. 第二次阅读:带着代码读
第二次读时,我建议把章节里的代码亲手敲出来并运行一遍。直接复制代码当然很有诱惑力,因为重新输入确实费事;但我读其他技术书时发现,手动敲代码通常会迫使我更认真地思考代码,而不是只是扫一眼。
如果跑出来的结果和书里不同,我会先检查这本书对应的 GitHub 仓库,并尝试运行仓库里的代码。如果结果仍然不同,我会继续排查是否和包版本、随机种子、CPU/CUDA 环境等因素有关。假如这些都查过之后还是没弄明白,向作者提问也不是坏事:可以通过图书论坛、 公开 GitHub 仓库的 issues 或 discussions;实在不行,再考虑邮件。
3. 做练习
完成第二次阅读,并且已经重新输入和运行过代码之后,通常就是做练习的好时机。练习很适合巩固理解,也适合在一个半结构化的问题里动手尝试。如果某道题确实太难,看解答没有问题。不过我仍然建议,先认真尝试一遍。
4. 回顾笔记,并继续探索
读完章节、运行过代码、做过练习之后,我建议回到前两次阅读时留下的高亮和批注,看看是否还有不清楚的地方。
这时也很适合查找额外参考资料,或者快速搜索一下,把仍然悬而未决的问题弄清楚。即使所有内容都已经说得通,围绕自己感兴趣的主题再多读一点,也不会有什么坏处。
到这个阶段,也可以把有用的想法、代码片段等内容写下来,或整理到你常用的笔记工具里。
5. 把想法用进一个项目
前面几个步骤主要是在吸收知识。接下来,可以看看能不能把某一章里的某些内容用到你自己的项目里。也可以以书中的代码为起点,做一个小项目。如果需要灵感,可以看看附加材料;那些基本上都是我为了满足自己的好奇心而做的小项目。
举个例子,当你读完多头注意力机制,并实现了一个 LLM 之后,你可能会好奇:使用 grouped-query attention(分组查询注意力)的模型表现如何?RMSNorm 和 LayerNorm 到底会带来多大差异?类似的问题还有很多。
也可能有一些更小的细节,能在你自己的项目里派上用场。例如,有时真正有用的恰好是一个很小的发现:显式调用 torch.mps.manual_seed(seed),和只使用
torch.manual_seed(seed) 相比,到底会不会产生差异?
不过最终,我总是希望把学到的东西真正用起来。这可能是使用某一章的核心概念,也可能只是用到阅读过程中顺手学到的小细节。比如,哪怕只是确认在自己的项目里显式调用
torch.mps.manual_seed(seed),是否真的比只调用 torch.manual_seed(seed) 多做了什么。
补充想法
当然,上面这些都不是固定规则。如果某个主题你已经非常熟悉,或者内容本身很简单,而你读这本书主要是为了获取后面章节的某些信息,那么略读这一章也完全可以,毕竟没有必要浪费时间。
另外,对于那些没有代码的章节,比如作为导论的第 1 章,跳过和代码相关的步骤当然也是合理的。
希望这些建议有帮助。祝阅读和学习顺利。