R14.md · 可读全文
这里保留原文的中文、公式标记、代码和链接。可直接交给 Agent 读取,也可选取下方原文复制。此入口返回 HTML;原始 .md / .py 文件仍保留,完整候选包同时包含 UTF-8 原件。
# R14 · 状态每步改变,更新规则只学一套
R13的固定窗口会丢掉较早词。如果这些词还影响后续预测,就需要另一条信息通路。本页用两次递推检查:上一轮的结果怎样参与当前计算?
<span id="r14-b0"></span>
## 状态 b0
完整句子仍在上方,先只计算“我”这一更新;从给定h₀=0出发,结果暂留问号。
<span id="r14-b1"></span>
## 状态 b1
将E(我)送入规则,h₁结果揭示。先核对线性相加,再看tanh逐分量作用。
<span id="r14-b2"></span>
## 状态 b2
保留h₁、换入“昨天”,得到h₂。比较两步使用的不变参数与变化状态:第二步没有重新从零开始。
## 公式与算例详情
RNN 把“已读过什么”放进一个随输入变化的状态。一个常见的简单 RNN 更新是
$$h_t=\tanh(W_hh_{t-1}+W_xe_t+b),\qquad e_t=E(x_t).$$
$e_t\in\mathbb R^{d_x}$ 是当前 token 的 embedding,$h_t\in\mathbb R^{d_h}$ 是状态;$W_x\in\mathbb R^{d_h\times d_x}$、$W_h\in\mathbb R^{d_h\times d_h}$ 与 $b\in\mathbb R^{d_h}$ 是参数。tanh 对每个分量分别作用。在同一次前向处理里,参数不因位置变化;换了输入与旧状态,输出当然可以变化。训练更新参数,推理更新状态,两者不是同一件事。
以下暂略BOS,从该句开头取“我/昨天”前两项;“给了”的第三步续算见R15。取一个未训练的二维例子:$W_x=I_2$、$W_h=0.5I_2$、$b=0$、$h_0=(0,0)$。规定 $E(我)=(1,0)$、$E(昨天)=(0,1)$。于是
$$h_1=\tanh((1,0))=(0.761594,0),$$
$$h_2=\tanh((0.380797,1))=(0.363399,0.761594).$$
第二步必须用第一步的状态;不能每次都重新从 $h_0$ 开始。两条坐标只是构造数值,不代表“人物维”“时间维”等真实语义轴。真实 embedding 和递推参数由任务损失共同学习。
参考解释:CS224N 2026 RNNLM,PDF 物理 p23–25;CS231n Lecture 7 的递推单元与时间展开。
原课页采用记录:[M09 状态更新与参数共享](sources.html#M09)。页码均按PDF物理页计。
### 继续学习
[本页自学核对](lecture.html#read-R14):从指定零初态复算“我/昨天”两步;整理成 h₁、h₂,并注明本例略去 BOS。
若仍把变化状态当成每步不同参数,可进入[《状态在流动,梯度可以停在边界》](https://codingai-lec05.pages.dev/course/knowledge/recurrent-state-and-credit.html);动手时打开[LAB01](https://deepnote.com/workspace/ise3309jingao-5ba66b0a-4283-4f5a-ae06-3f68d3201e99/project/Fall-26-Lecture-05-841ec8e7-e352-4840-b628-d3742b03d6d0/notebook/LAB-01-ec403d28cc2c400ba661cd270588669f?utm_content=ec403d28cc2c400ba661cd270588669f&utm_source=openai&utm_medium=mcp&utm_campaign=openaimcp&utm_term=get_notebook)的“C · 共享参数的梯度到底加了几次?”:沿门禁日志检查前向状态更新,再在共享梯度小例核对同一参数的多次贡献。 状态模型训练另见[实验路线B](experiments.html#experiment-B)。