这里是 alex 的算法技术日志,偏工程实践与个人理解。
记录推荐系统、机器学习、大语言模型与 AI Agent 等方向的学习笔记与落地思考;从真实问题出发,慢慢沉淀。
这里是 alex 的算法技术日志,偏工程实践与个人理解。
记录推荐系统、机器学习、大语言模型与 AI Agent 等方向的学习笔记与落地思考;从真实问题出发,慢慢沉淀。
本文是对 Causal Inference and Machine Learning(在线书)两处内容的学习摘记: Randomized controlled trials — Regression adjustment(第 17 章的 17.3/17.4) Causal trees and forests(第 24 章的 24.0/24.1) 2026-04-21:RCT 中的回归调整(17.3 / 17.4) 1)用回归估计 ATE:为什么在 RCT 下成立 在随机对照试验(RCT)中,若直接做线性回归(最简形式): Y = α + τ·D + ε 在随机分配成立时,D 的回归系数 τ 可以作为 ATE 的无偏估计。 2)引入协变量:主要是提升精度(precision) 在 RCT 中把预处理协变量 X 加进回归,往往不是为了解决混淆(随机化已经在设计上解决),而是为了降低方差、提高估计精度。 常见做法(至少两类): 分组建模:对控制组与处理组分别建模,再组合得到效应估计 单一模型 + 交互项:在同一回归里同时放入 X 与 D·X(交互项) 如果不包含交互项,当处理效应存在异质性(不同人群的效应不同)时,估计可能会偏离我们希望的估计目标或产生不合适的加权。 3)标准误:使用 robust standard error 书中建议方差/标准误使用 robust standard error(异方差稳健)来估计。 4)协变量中心化(centering) 回归里引入协变量时,一个常见实践是先对协变量做中心化,让其期望为 0(例如 (X \leftarrow X - \mathbb{E}[X]) 或减去样本均值),便于解释主效应项并在包含交互项时提升数值稳定性。 ...
本文是对 Causal Inference and Machine Learning(在线书)第 16 章 Counterfactual Framework 一节的读书笔记,对应 Counterfactual Framework — causalmlbook.com。偏概念串讲:把原书从「什么叫因果问题」到「为什么不能用两组均值直接当 ATE」这条线捋清;具体估计方法(matching、IPW、双稳健等)书里后文还会展开,此处只记框架与记号。 1. 「能谈因果」与可操纵性(manipulability) 原书强调:仅凭两组结果不同或变量与结果相关,不能自然推出因果;混淆、遗漏变量、选择机制等都会驱动观测差异。 更关键的一点是:因果陈述往往针对的是可以施加的干预(treatment / policy)。若某个特征在科学或伦理意义上无法被「操纵」(例如单纯说「年龄本身」或「性别本身」直接造成收入差异),就不宜把它当成可干预的处理去谈「处理效应」——观测差异更可能来自结构因素、混淆或未观测变量。书中用年龄举例:不能直接下结论「更老导致收入更低」;但若讨论的是可实施的干预(例如为年长员工提供特定培训或设备),则可以讨论该干预对结果的因果效应。 2. 潜在结果(Rubin Causal Model, RCM)——记号一层纸 对个体 i: 记号 含义 处理变量 D_i 是否接受处理(书中常用 0/1;也可推广到多值) 潜在结果 Y_i(1), Y_i(0) 若接受 / 未接受处理时,理论上会出现的结果 观测结果 Y_i 实际只看到其中一个世界 观测结果与潜在结果的关系(一致性写法的一种紧凑形式): Y_i = D_i · Y_i(1) + (1 - D_i) · Y_i(0) 基本困难:对每个人而言,Y_i(1) 与 Y_i(0) 不能同时观测到——未发生的那一侧就是反事实(counterfactual),因果推断在数学上很像「带系统缺失的反事实填坑问题」。 3. RCM 里我常记的一条:可忽略性(ignorability) 条件可忽略性(unconfoundedness / conditional independence)可写成: ( Y_i(1), Y_i(0) ) ⊥ D_i | X_i (读作:在给定 X_i 的条件下,潜在结果与是否处理独立。) ...
本文聚焦 Spinning Up 里 Simplest Policy Gradient 一节对应的思路与参考实现,偏读书笔记:不从零推导 MDP / 回报等基础定义;若对符号或 RL 总览不熟,建议先看 Spinning Up 前两节的入门材料。原文对策略梯度有一段「把 Return 的梯度改写成对策略参数的梯度」的推导,并用到几处常见的等价变形(为什么要这样变形还可后续再补全)。 原文在讲什么(整体逻辑) 推导:说明 Return 的梯度如何变成 策略(policy)参数上的梯度(中间有几步技巧性的改写)。 实现:给出最简可运行示例;下面把代码里容易混淆的几块单独拎出来对照。 1. train_one_epoch、epoch、episode 分别是什么? 示例脚本 1_simple_pg.py 里的命名如下(外层循环变量也叫 epoch): 概念 含义(结合示例代码) Episode 一条完整轨迹:从 env.reset() 开始,每步 step,直到 done=True;结束时用整条轨迹的 reward 得到 R(τ),并把该标量赋给这条轨迹上每一步的权重。 train_one_epoch() 一次「采样 + 一次梯度更新」:内部用 while True 不断与环境交互,把每一步的 obs / act 等放进 batch;当 len(batch_obs) > batch_size(默认 5000)时停止采样,随后对当前这批数据 算一次 compute_loss、backward、optimizer.step()。中间通常会跨过多个 episode。 外层 epoch(epochs=50) 训练共进行 50 轮:每一轮调用一次 train_one_epoch(),即「再采一批数据 → 再更新一次策略」。 串联理解:多个 episode 在时间上前后相接,共同填满一个 batch(按时间步计数,直到超过 batch_size)→ train_one_epoch 末尾 更新一次参数 → 外层再重复下一轮。 ...