起因 # 上一篇文章理清了 latent variable 和 latent space 的概念,最后停在一个地方:
起因 # 最近在看 MIT 6.S191 Lecture 4——Generative Modeling。在这之前我对生成模型基本没什么了解,刚建立了一个很粗的认知:
上一篇只回答了"为什么不矛盾" # 上一篇文章里,我沿着一个概率问题一路追到了集合论。
起因 # 最近在补概率基础的时候,碰到一个解释:连续分布中,每一个单点的概率都是 0,但整个区间的概率可以是 1。
以前做 CV 内容审核的时候,训练数据里有大量视频。色情视频审核是一个很典型的场景——输入是一段几十秒甚至几分钟的视频,输出是一个二分类:这段视频是否包含色情内容。
最近在重新过 MIT 6.S191 Lecture 3(卷积神经网络)。2017 年刚接触 CV 那会儿,CNN 算是吃饭的家伙,每天都在调。后来精力逐渐转到 ML Infra,成天跟 GPU 显存、通信拓扑和算子优化打交道,卷积网络的很多具体细节就慢慢生疏了——写个 nn.Conv2d 时 weight 的四维形状到底怎么排、Kaiming 初始化的方差怎么推、感受野怎么算,冷不丁被问到,还得在脑子里卡壳一下。
上一篇结尾我写:Multi-Head Attention 仍然只是一个 information routing / read mechanism,一个完整的 Transformer layer 还包含 FFN、residual connection、layer normalization 等组件。
上一篇走到了一个结论:去掉 recurrence 之后,Self-Attention 必须重新获得 positional information。position 可以加进 token 的 representation,两者相加不要求后续计算无损还原,只要下游能利用其中的信息就行。
上一篇结尾我留了一个问题:一组 \(W_Q, W_K, W_V\) 只定义了一个 matching / routing space,如果不同类型的信息需求需要不同的 routing 策略,一个 space 够吗?
上一篇结尾留了三个问题:谁和我相关?相关程度是多少?我该从对方那里读什么?
之前在腾讯做过一个面向推荐场景的深度学习框架(内部叫「无量」),我当时负责其中 Serving 相关的工作。后来和朋友聊起,有人问我:把一个推荐模型部署上线,是不是就是加载模型文件,然后来一个请求做一次 forward?
起因 # 三年前我参与维护过一个多人共享的训练集群。集群上跑着各业务线的训练任务,用户通过一个队列系统提交,每个用户有自己的资源 Quota。
在Self-Attention 那篇里,去掉 recurrence 让不同位置可以并行计算。但顺序原本就编码在这条递推关系里;换成纯 self-attention 后,它由谁来表示?
上一篇《从 RNN / LSTM / GRU 到早期 Attention》结尾我留了一句话:早期的 attention 并不是为了取代 RNN 而出现的,它只是夹在 encoder–decoder 中间解决 fixed-context bottleneck;但“根据当前需求去读取一组 representation”这种机制,并不一定要依附在 RNN 上。这篇接着讲那个“另一个故事”。
上一篇《从 RNN 到 LSTM,再到 GRU》把 gate 机制理了一遍:LSTM / GRU 把 recurrent state 的信息流变成了可学习的动态控制,决定什么写入、什么保留、什么暴露。写到那里,我以为 RNN 这条线差不多收尾了。
最近复习 RNN、LSTM 和 GRU,我把它们的状态更新公式放在一起看。有一处值得单独想想:candidate 和 input gate 最后只是相乘,为什么要分成两组参数来学?从这个问题往回看,才能看清几个 gate 各自控制了什么。
复习 RNN 的 backward 时,我关注的是参数共享:同一份 weight 在多个 timestep 被使用,各处产生的梯度最后怎么汇到它上面?把时间展开成计算图之后,这件事就可以用普通的 chain rule 来算。
最近在重拾一些深度学习基础,发现了一个很有意思的视角。
以前在看 RNN(Recurrent Neural Network)的长距离梯度传播公式时,总能看到一堆 Jacobian 矩阵的连乘,比如 \(\frac{\partial h_T}{\partial h_0} = J_T J_{T-1} \dots J_1\)。
起因 # 最近偶然看到一篇文章,里面提到一个 Linux 和 Windows 的差异:在 Linux 下,即使机器实际上没有足够的物理内存,一个很大的 malloc 仍然可能成功返回。而 Windows 对 committed memory 的管理要严格得多,类似的 allocation 更容易被直接拒绝。