AI Coding 越方便,我越想重新手写一遍
重新学习深度学习
最近在学习深度学习相关的内容,工作中也搭建过一些上层的大模型应用,但是我一直对这个黑盒内部的实现比较感兴趣,但由于这块涉及微积分、线性代数这些数学内容,所以我之前学习的时候感觉云里雾里。
最近一段时间我决定静下心来好好学习下,我的目标是能从头动手训练一个简单的模型,逐步建立对深度学习训练机制,同时包括了解大模型原理。
从 How 回到 Why
有人可能就问为啥这么 “心血来潮”?我其实也不是所谓的心血来潮或者焦虑,而是因为我最近又读了一遍我编程入门时看过的一篇文章:《编程入门》—— 追求事物的本质。
文章里的这句话一直在我脑袋里回响,很难不让自己对自我进行反思,它提醒我的其实很简单:不要只停留在会用,不要只停留在 How,要不断追问 Why。
我刚开始学编程时也这样。会调几个库,照着教程做出一个页面,就觉得自己好像懂了。但问题稍微复杂一点,就会发现自己其实没那么懂,也很容易急躁。
文章里还讲了萧老师身上的故事:他早年学编程、物理时,只是在记公式,直到后来通过一堂课看见电学和相对论之间的联系,才突然意识到:原来过去很多东西只是会算,并不是真的理解。
我最近读了一遍后,感觉这件事对我影响还挺大的,也是对我的一个提醒。
因为我回想自己刚开始学编程的时候,其实也是这样走过来的。那时候我手写过简易版 Spring,包括数据库、操作系统、汇编语言这些东西。那些东西不一定能直接拿去生产用,但它们帮我建立了一个很重要的习惯:不要只停留在事物表面。
后来工作中主要做数据同步中间件,接触各种数据库。我也延续了这个习惯。遇到新数据库、同步原理、异常报错,我会尽量去看源码、看日志、看底层机制。因为很多时候,只停留在 API 层面,判断是轻浮的。
AI Coding 的不安
但进入 AI 时代之后,我明显感觉自己变懒了。
尤其是 AI Coding 出现以后,很多代码不需要自己一行一行写了。描述需求,生成代码,改一改,好像就完成了。效率确实提高了,但我也有一种说不出来的不安:
- 我是不是越来越少亲手思考了?
- 我是不是越来越少认真阅读代码了?
- 我是不是越来越习惯待在上一层了?
不要永远只待在上一层
以前我们说,计算机世界是一层一层搭起来的:
产品 → 框架 / 库 → 编程语言 → 运行时 / 操作系统 → 机器码 / 汇编 → 门电路 → 电路
抽象当然重要,不然我们不可能写复杂系统。但我也越来越感觉到,如果一直只待在最上面,时间久了可能真的会忘记下面那几层到底在干什么。
现在 AI Coding 又在 “写代码” 这件事上面加了一层:
产品需求 → AI 生成代码 → 框架 / 编程语言 → 运行时 → 操作系统 → 硬件
AI 让我们更容易得到结果,但也可能让我们更容易忘记结果是怎么来的。
文章里还有一个观点很适合放到今天来看:如果学习者只接触预先构建好的 “发动机和组件”,却不理解它们构造的原理,那么将来在真正构建东西、诊断问题时,就会无从下手。
以前的 “预制组件” 可能是框架、库、脚手架。
现在新的 “预制组件” 可能就是 AI 直接生成出来的代码。
我不是反对用 AI。事实上我现在也天天用 AI。只是现在代码能跑了,但我发现自己解释不清楚它为什么这么写,心里会有点虚。问题不在于 AI 帮我写了代码,而在于我不能只接受结果,却不再追问背后发生了什么。
从 micrograd 学习训练过程
micrograd 很小,使用上也很简单,当然它不能替代 PyTorch,但就是因为它足够小,反而能把自动微分、计算图、反向传播、梯度更新这些训练闭环里很核心的东西暴露出来,让初学者更好理解。
以前我知道神经网络训练大概是前向计算、计算 loss、反向传播、梯度下降、更新参数。但说实话,这些词之前对我来说更多只是停留在概念层面,因为它们本身比较抽象,我也没有真正用笔推导一遍。
这次学习的时候我特意补了一些数学知识,做了挺多练习以便让我更好地写代码,从最原始的偏导数再到神经网络,这很像文章里说的那种学习方式:学习复杂技术,不能只在最上层做项目,也不能只在最底层啃理论。真正有效的方式,是在自顶向下和自底向上之间来回走。
自顶向下的项目实践,给人兴趣和正反馈。
自底向上的基础学习,给人长期的判断力。
只做项目,人容易变成拼组件。
只啃理论,人又容易失去动力。
真正的学习应该是:做一个东西,然后向下追问它为什么成立;理解一层原理之后,再回到上层做更复杂的东西。
亲手拆开一个东西
所以我现在给自己定了个比较笨的办法:AI 可以用,但重要的代码至少要自己读一遍;遇到关键概念,不能只问“怎么调 API”,还要问一句“它到底在算什么”。可以站在上一层做事,但不能永远只待在上一层。
以前我可能会觉得,AI 越强,底层理解就越不重要。但现在我反而觉得不是这样。AI 能很快给我一段看起来没问题的代码,我更需要知道它到底对不对。
这次静下心来学习 micrograd 对我来说,就是重新训练这种技术直觉。
它提醒我:不要只追求 “能跑”。 还要追问:为什么能跑?哪里可能跑错?如果错了,我怎么证明它错了?如果对了,我又怎么解释它为什么对?
这可能就是我现在重新学习深度学习的真正原因,是为了重新找回那种感觉:
亲手拆开一个东西,看见它内部怎么转,然后再带着这种理解回到更大的系统里。