Posts
2026
风险也不是一个数字:波动率、最大回撤和 VaR 到底在衡量什么?
在收益率那篇里,同样赚了 10%,可能来自完全不同的路径。要继续比较,就得知道风险指标各自省略了什么。
从 RNN / LSTM / GRU 到早期 Attention:为什么“压缩历史”最终变成了“按需读取”
·5738 words·12 mins
上一篇《从 RNN 到 LSTM,再到 GRU》把 gate 机制理了一遍:LSTM / GRU 把 recurrent state 的信息流变成了可学习的动态控制,决定什么写入、什么保留、什么暴露。写到那里,我以为 RNN 这条线差不多收尾了。
翻到 2017 年的简历,我才想起自己还做过一个游戏
很多项目随着工作年限增加,会自然从简历里消失,这很正常。但从简历里消失,不代表这些事情没有发生过。
从 RNN 到 LSTM,再到 GRU:循环网络真正改变的是什么?
·3008 words·7 mins
最近复习 RNN、LSTM 和 GRU,我把它们的状态更新公式放在一起看。有一处值得单独想想:candidate 和 input gate 最后只是相乘,为什么要分成两组参数来学?从这个问题往回看,才能看清几个 gate 各自控制了什么。
把 RNN 沿时间展开之后:理解 BPTT 与梯度传播
复习 RNN 的 backward 时,我关注的是参数共享:同一份 weight 在多个 timestep 被使用,各处产生的梯度最后怎么汇到它上面?把时间展开成计算图之后,这件事就可以用普通的 chain rule 来算。
从局部线性化到 RNN:理解 Jacobian 连乘
·3036 words·7 mins
最近在重拾一些深度学习基础,发现了一个很有意思的视角。
以前在看 RNN(Recurrent Neural Network)的长距离梯度传播公式时,总能看到一堆 Jacobian 矩阵的连乘,比如 \(\frac{\partial h_T}{\partial h_0} = J_T J_{T-1} \dots J_1\)。
从一次训练集群卡顿,理解 Linux Overcommit
·7429 words·15 mins
起因 # 最近偶然看到一篇文章,里面提到一个 Linux 和 Windows 的差异:在 Linux 下,即使机器实际上没有足够的物理内存,一个很大的 malloc 仍然可能成功返回。而 Windows 对 committed memory 的管理要严格得多,类似的 allocation 更容易被直接拒绝。
从 Token ID 到 Dense Vector:Embedding 到底在做什么
起因 # 最近在继续 CS336 和 MIT 6.S191。
Next-Token Prediction:语言模型的训练目标从哪来
·3560 words·8 mins
起因 # 上一篇把 RNN 拆成了两层:state transition 和 output projection。State transition 维护 hidden state,output projection 从 hidden state 中映射出当前任务需要的预测结果。
重新理解 RNN:Hidden State、Output 和 Prediction 的区别
·3174 words·7 mins
起因 # 最近在复习 MIT 6.S191 的 RNN 部分,看到下面这张 slide 时停了一下。
从 Forward 到 Optimizer:再看一遍 Training Loop
起因 # CS336 的 training loop 里,loss.backward() 和 optimizer.step() 挨在一起。前者计算 gradient,后者更新 parameter;但 gradient 存在哪里、什么时候清零、optimizer 还维护什么状态,需要分开看。于是结合 MIT 6.S191 的 Lecture 1,把一次训练迭代重新过了一遍。
从推理到训练:模型调度中的显存约束
·2607 words·6 mins
推理任务能放下,为什么训练任务放不下 # 上一篇讨论了模型调度中的 Capacity Constraint:一组模型到底能不能同时放进一张 GPU。
从 CS336 到 ML Infra:理解 Arithmetic Intensity、Accelerator Intensity,以及 Compute Bound / Memory Bound
·6012 words·12 mins
起因 # 这是 CS336 系列的又一篇。