吴恩达深度学习课程五:自然语言处理 第一周:循环神经网络 (五)门控循环单元 GRU
<p>此分类用于记录吴恩达深度学习课程的学习笔记,目前已完结,点击进入全集目录<br>课程相关信息链接如下:</p>
<ol>
<li>原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai</li>
<li>github课程资料,含课件与笔记:吴恩达深度学习教学资料</li>
<li>课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案</li>
</ol>
<p>本篇为第五课的第一周内容,1.9的内容以及一些相关基础的补充。</p>
<hr>
<p>本周为第五课的第一周内容,与 CV 相对应的,这一课所有内容的中心只有一个:<strong>自然语言处理(Natural Language Processing,NLP)</strong>。<br>
应用在深度学习里,它是专门用来进行<strong>文本与序列信息建模</strong>的模型和技术,本质上是在全连接网络与统计语言模型基础上的一次“结构化特化”,也是人工智能中<strong>最贴近人类思维表达方式</strong>的重要研究方向之一。<br>
<strong>这一整节课同样涉及大量需要反复消化的内容,横跨机器学习、概率统计、线性代数以及语言学直觉。</strong><br>
语言不像图像那样“直观可见”,更多是抽象符号与上下文关系的组合,因此<strong>理解门槛反而更高</strong>。<br>
因此,我同样会尽量补足必要的背景知识,尽可能用比喻和实例降低理解难度。<br>
本篇的内容关于<strong>门控循环单元 GRU</strong>,它通过改变 RNN 的隐藏层,来缓解 RNN 的梯度消失问题。</p>
<h1 id="1-什么是-grugated-recurrent-unit">1. 什么是 GRU(Gated Recurrent Unit)?</h1>
<p>在前面的内容里中我们已经提到过:RNN 的核心机制,是<strong>把历史信息压缩进一个不断传递的隐藏状态中</strong>。<br>
结果就是我们已经分析过的结论:<strong>信息一旦隔得太远,就会在反复的线性变换和非线性映射中被不断稀释</strong>。<br>
在反向传播时就体现为梯度越来越小,最终几乎传不回去,导致“开头被遗忘”,这就是 RNN 的<strong>长距离依赖问题</strong>。<br>
显然,这并不是改善训练技巧可以解决的问题,而是 RNN 本身的结构造成的限制,自然而然地就引出了 NLP 领域的新问题 :<strong>如何缓解 RNN 的长距离依赖问题? 即如何让模型“记得更久一些”?</strong></p>
<p>于是,在 2014 年发表的一篇论文: On the Properties of Neural Machine Translation: Encoder–Decoder Approaches 中,提出了<strong>一种带有门控机制的循环单元结构</strong>,即后来被称为 <strong>GRU(Gated Recurrent Unit)</strong> 的模型。<br>
该工作首次在 Encoder–Decoder 框架下系统性地引入 <strong>“更新门”和“重置门”</strong>,通过对隐藏状态的信息流进行选择性控制,从结构层面缓解了传统 RNN 在长序列建模中面临的困难。<br>
同年的另一篇论文:Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling对其实际效果进行了系统评估。实验结果证明了其优越的性能,这也使其迅速成为实际 NLP 系统中广泛采用的基础循环单元之一。</p>
<p>出现了很多没见过的名词,别担心,下面我们就来详细展开。</p>
<h2 id="11-gru-的解题思路">1.1 GRU 的解题思路</h2>
<p>首先,面对”如何让模型记得更久一些”的问题,GRU给出的答案是:</p>
<blockquote>
<p>既然记不住全部,那我能不能<strong>只记重要的?</strong></p>
</blockquote>
<p>这是什么意思?回忆一下 普通 RNN 是如何进行记忆的:</p>
<p></p><div class="math display">\[新输入来了\rightarrow旧状态所有信息参与计算\rightarrow得到一个带有新输入信息的新隐藏状态
\]</div><p></p><p>我们已经很熟悉这个过程了:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260109204330405-1786363129.png" alt="image.png" loading="lazy"></p>
<p><strong>但是,实际上,在真实语言中,我们并不是这样处理信息的。</strong><br>
举个例子:</p>
<blockquote>
<p>“我昨天去北京出差,<br>
在路上遇到了一个多年未见的朋友,<br>
<strong>他</strong>现在在……”</p>
</blockquote>
<p>当你看到“他”的时候:</p>
<ul>
<li>你<strong>不需要</strong>记住“北京”,“昨天”。</li>
<li>但你<strong>必须</strong>记住“朋友”。</li>
<li>换句话说,当前时刻的理解,并不依赖于全部历史内容,而只依赖于<strong>与当前判断相关的信息。</strong></li>
</ul>
<p>再概括来讲,人脑在处理序列信息时,隐含着一个非常重要的能力:<strong>选择性记忆</strong>。<br>
而 GRU 的设计,正是将这种“取舍能力”,通过门控结构的形式,<strong>显式地引入到 RNN 的隐藏层更新过程中</strong>。<br>
简单展开一下,GRU 并没有改变 RNN 的整体框架:</p>
<ul>
<li>仍然是时间步 <span class="math inline">\(t = 1, 2, \dots\)</span></li>
<li>仍然有输入 <span class="math inline">\(x^{<t>}\)</span></li>
<li>仍然有隐藏状态 <span class="math inline">\(a^{<t>}\)</span></li>
</ul>
<p><strong>它真正改变的,只有一件事:在“旧状态 → 新状态”的过程中,加了两道可学习的“门”。</strong> 就是我们下面要说的 <strong>“更新门”和“重置门”</strong>。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260109204331014-1253999462.png" alt="image.png" loading="lazy"></p>
<h2 id="12-gru-的更新门update-gate">1.2 GRU 的更新门(Update Gate)</h2>
<p>第一道门,叫 <strong>更新门(Update Gate)</strong>。<br>
它负责回答的问题是:</p>
<blockquote>
<p>“当前这一步,我要<strong>保留多少过去的记忆</strong>?”</p>
</blockquote>
<p>也就是说:</p>
<ul>
<li>更新门开得越大 → 旧状态保留得越多</li>
<li>更新门关得越紧 → 当前输入对隐藏状态的影响越大</li>
</ul>
<p>总结来说,更新门衡量的是:<strong>“这条历史信息,值不值得继续往后传?”</strong><br>
这一设计直接解决了 RNN 的一个问题:普通 RNN 每一步都会用新输入强行覆盖旧隐藏状态,<br>
长期信息容易被逐步稀释,而更新门让模型可以<strong>选择性保留重要历史信息</strong>。</p>
<p>我们回到之前的例子:</p>
<blockquote>
<p>“我昨天去北京出差,<br>
在路上遇到了一个多年未见的朋友,<br>
<strong>他</strong>现在在……”</p>
</blockquote>
<p>在生成“他”对应的隐藏状态时:</p>
<ul>
<li>更新门会让模型<strong>保留“朋友”这个关键信息</strong>,因为它对理解代词至关重要</li>
<li>同时,更新门会<strong>削弱“昨天”“北京”等不相关信息</strong>的影响</li>
</ul>
<p><strong>于是,通过更新门,模型可以自动判断哪些历史值得继续传递,哪些可以淡化。</strong><br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260109204331774-762429605.png" alt="image.png" loading="lazy"><br>
其实,这种思路和我们之前在优化算法部分介绍的 指数加权平均 很相似:旧状态像过去的平均值,更新门控制“平均时的新权重”,让重要信息得到保留。</p>
<h2 id="13-gru-的重置门reset-gate">1.3 GRU 的重置门(Reset Gate)</h2>
<p>第二道门,叫 <strong>重置门(Reset Gate)</strong>。<br>
它关心的不是“保留多少旧信息”,而是:</p>
<blockquote>
<p>“在生成新信息时,我要<strong>参考多少过去的历史</strong>?”</p>
</blockquote>
<p>可以把它想象成 <strong>选择记忆开关</strong>:</p>
<ul>
<li>当历史信息相关 → 重置门值接近 1 → 历史参与计算</li>
<li>当历史信息不相关 → 重置门值接近 0 → 模型“暂时忘掉过去”</li>
</ul>
<p>这个设计是为了应对语言序列中的一类常见情况:句子突然换话题、上下文跳转很大等<strong>前面的内容对当前判断几乎没帮助</strong>的情况。</p>
<p>还是这个例子:</p>
<blockquote>
<p>“我昨天去北京出差,<br>
在路上遇到了一个多年未见的朋友,<br>
<strong>他</strong>现在在……”</p>
</blockquote>
<p>当生成“他”对应的新隐藏状态时:</p>
<ul>
<li>重置门会让模型<strong>只关注“朋友”这个历史信息</strong></li>
<li>忽略“昨天”、“北京”等与当前代词关系不大的信息<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260109204332322-610422982.png" alt="image.png" loading="lazy"><br>
只看概念和例子, 你可能会觉得:<strong>更新门和重置门好像是一个作用啊?</strong><br>
实际上,这绝非冗余设计,我们展开看看:</li>
</ul>
<h2 id="14-更新门和重置门">1.4 更新门和重置门</h2>
<p>实际上,更新门关注的是 <strong>“旧状态在下一步隐藏状态中保留多少”</strong>,它是一种<strong>全局记忆控制</strong>,关注的是“<strong>以后</strong>”。<br>
而重置门关注的是 <strong>“在生成当前新隐藏状态时,历史信息是否被参考”</strong>,它是一种<strong>局部选择性</strong>,关注的是“<strong>现在</strong>”。</p>
<table>
<thead>
<tr>
<th>门</th>
<th>功能</th>
<th>控制对象</th>
<th>比喻</th>
</tr>
</thead>
<tbody>
<tr>
<td>更新门</td>
<td>记忆持续</td>
<td>上一隐藏状态整体传递</td>
<td>决定哪些历史要带到下一步,就像水龙头调节水流量</td>
</tr>
<tr>
<td>重置门</td>
<td>记忆使用</td>
<td>当前候选隐藏状态计算</td>
<td>决定本步是否参考历史,就像选择性翻阅笔记</td>
</tr>
</tbody>
</table>
<p>最终,<strong>更新门</strong>负责“信息能延续多远” ,<strong>重置门</strong>负责“信息在当前是否参与生成”。<br>
两道门结合,使 GRU 能够<strong>在长序列中保留重要历史信息,同时在必要时灵活忘掉无关历史</strong>,实现“更好、更有用的记忆”。</p>
<p>现在,了解了 GRU 的基本原理后,我们来看看如何实现 GRU 吧。</p>
<h1 id="2-如何实现-gru-">2. 如何实现 GRU ?</h1>
<p><strong>这里需要提前说明一点,如果你看了原视频,会发现吴恩达老师并没有过多提及重置门,而是用一个新概念:“记忆细胞” 来进行讲解。实际上,记忆细胞是之后的 LSTM 中的概念,因为 GRU 可以看作是 LSTM 的简化形式,因此同样可以使用,但个人感觉不正式引入的前提下并不好理解,最终还是选择使用 GRU 本身的概念来进行这部分内容,在下一篇 LSTM 的介绍中再正式引入记忆细胞。</strong></p>
<p>在理解了 GRU 的核心思想和两道门的作用之后,我们可以进一步探讨<strong>如何在实际模型中实现 GRU</strong>。实现上,其实并不复杂,本质上仍是<strong>对普通 RNN 的隐藏状态更新增加了门控计算</strong>。下面我们按逻辑逐步展开。</p>
<h2 id="21-计算重置门">2.1 计算重置门</h2>
<p>在 GRU 的实现逻辑中,对于当前步新隐藏状态的计算,<strong>第一步是计算重置门</strong>。<br>
<strong>重置门</strong> <span class="math inline">\(r^{\langle t \rangle}\)</span> 决定了历史隐藏状态 <span class="math inline">\(a^{\langle t-1 \rangle}\)</span> 在生成当前<strong>候选</strong>隐藏状态 <span class="math inline">\(\tilde{a}^{\langle t \rangle}\)</span> 时被参考的比例。<br>
来具体演示一下这个过程:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260109204329605-853092304.png" alt="image.png" loading="lazy"><br>
计算公式为:</p>
<p></p><div class="math display">\[r^{\langle t \rangle} = sigmoid\big( W_{xr} x^{\langle t \rangle} + W_{ar} a^{\langle t-1 \rangle} + b_r \big)
\]</div><p></p><p>你可以比较明显的发现,实际上重置门就是一个使用 <span class="math inline">\(sigmoid\)</span> 激活函数的全连接层,最终的激活值,也就是重置门值会被 <span class="math inline">\(sigmoid\)</span> 压缩到 <span class="math inline">\(0\sim1\)</span> 之间。用来表示一种<strong>权重</strong>:</p>
<ul>
<li>当 <span class="math inline">\(r^{\langle t \rangle} \approx 1\)</span> 时,第 <span class="math inline">\(i\)</span> 个隐藏单元会<strong>充分参考历史信息</strong>。</li>
<li>当 <span class="math inline">\(r^{\langle t \rangle} \approx 0\)</span> 时,第 <span class="math inline">\(i\)</span> 个隐藏单元会 <strong>“忘掉”历史信息</strong>,只依赖当前输入生成<strong>候选隐藏状态</strong>。</li>
</ul>
<p>什么叫<strong>候选隐藏状态</strong>?这就是我们的下一步内容。</p>
<h2 id="22-计算候选隐藏状态">2.2 计算候选隐藏状态</h2>
<p>在计算完重置门 <span class="math inline">\(r^{\langle t \rangle}\)</span> 后,下一步是生成 <strong>候选隐藏状态</strong> <span class="math inline">\(\tilde{a}^{\langle t \rangle}\)</span>,它表示<strong>当前步的新信息</strong>,结合了当前输入 <span class="math inline">\(x^{\langle t \rangle}\)</span> 和经过重置门处理后的历史隐藏状态 <span class="math inline">\(a^{\langle t-1 \rangle}\)</span>。<br>
同样,我们在上一步的基础上进行演示:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260109204330627-116417863.png" alt="image.png" loading="lazy"></p>
<p>摆出公式如下:</p>
<p></p><div class="math display">\[\tilde{a}^{\langle t \rangle} = \tanh\Big( W_{xa} x^{\langle t \rangle} + W_{aa} ( r^{\langle t \rangle} \odot a^{\langle t-1 \rangle} ) + b_a \Big)
\]</div><p></p><p>其中<span class="math inline">\(r^{\langle t \rangle} \odot a^{\langle t-1 \rangle}\)</span>是指<strong>逐元素乘</strong>,这是将重置门作用于历史隐藏状态。<br>
你会发现,这时我们得到的候选隐藏状态 <span class="math inline">\(\tilde{a}^{\langle t \rangle}\)</span> 就是是<strong>当前步的“新记忆”</strong>,它既包含当前输入信息 <span class="math inline">\(x^{\langle t \rangle}\)</span>,也包含<strong>经过选择性过滤的历史信息</strong> <span class="math inline">\(r^{\langle t \rangle} \odot a^{\langle t-1 \rangle}\)</span>。</p>
<p>到这里,你可能觉得已经实现一些优化了,但 GRU 告诉你:<strong>这还不够好</strong>。</p>
<h2 id="23-计算更新门">2.3 计算更新门</h2>
<p>在生成候选隐藏状态 <span class="math inline">\(\tilde{a}^{\langle t \rangle}\)</span> 后,下一步是计算 <strong>更新门</strong> <span class="math inline">\(z^{\langle t \rangle}\)</span>。<br>
而更新门的作用是:<strong>决定历史隐藏状态 <span class="math inline">\(a^{\langle t-1 \rangle}\)</span> 与候选隐藏状态 <span class="math inline">\(\tilde{a}^{\langle t \rangle}\)</span> 在最终隐藏状态 <span class="math inline">\(a^{\langle t \rangle}\)</span> 中的融合比例</strong>。<br>
我们继续进行演示:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260109204331403-214888700.png" alt="image.png" loading="lazy"><br>
看完演示,我想一个问题已经呼之欲出了:<strong>更新门和重置门看起来就是把一个东西算了两遍啊?这么做的意义是什么?我直接把重置门值拿来用不行吗?</strong><br>
这就涉及到二者在模型中所承担的<strong>语义作用</strong>:</p>
<ul>
<li>更新门用来记录<strong>全局</strong>中的重要记忆,它<strong>直接</strong>影响最终输出,同样梯度也直接影响它。</li>
<li>重置门用来保存<strong>局部</strong>记忆,确保使用信息符合当前步需求,它通过候选状态<strong>间接</strong>影响最终输出,因此梯度对它的作用就没有那么“长期”。</li>
</ul>
<p><img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260109204603575-461036544.png" alt="image.png" loading="lazy"><br>
因此:<strong>二者不能参数共享,而是一定要有独立的参数,以此通过反向传播实现二者的语义作用。</strong><br>
同时要说明的是,我们这里演示的是逻辑上的计算顺序,你会发现二者的计算并不存在先后限制,因此在实际应用中可以同步计算二者。<br>
公式表示为:</p>
<p></p><div class="math display">\[z^{\langle t \rangle} = sigmoid\big( W_{xz} x^{\langle t \rangle} + W_{az} a^{\langle t-1 \rangle} + b_z \big)
\]</div><p></p><p>其中,<span class="math inline">\(sigmoid\)</span> 函数将输出压缩到 <span class="math inline">\(\)</span>,表示融合比例:</p>
<ul>
<li>当 <span class="math inline">\(z^{\langle t \rangle}_i \approx 1\)</span> 时,第 <span class="math inline">\(i\)</span> 个隐藏单元会<strong>更多保留历史信息</strong>。</li>
<li>当 <span class="math inline">\(z^{\langle t \rangle}_i \approx 0\)</span> 时,第 <span class="math inline">\(i\)</span> 个隐藏单元会<strong>更多采纳候选隐藏状态 <span class="math inline">\(\tilde{a}^{\langle t \rangle}\)</span> 的新信息</strong>。</li>
</ul>
<p>最后,我们<strong>将用更新门将历史隐藏状态与候选隐藏状态融合</strong>,得到最终隐藏状态 <span class="math inline">\(a^{\langle t \rangle}\)</span>。</p>
<h2 id="24-计算最终隐藏状态">2.4 计算最终隐藏状态</h2>
<p>在前面的步骤中,我们已经得到了三样关键量:</p>
<ul>
<li>上一时刻的隐藏状态 <span class="math inline">\(a^{\langle t-1 \rangle}\)</span>(<strong>历史记忆</strong>)</li>
<li>当前步生成的候选隐藏状态 <span class="math inline">\(\tilde{a}^{\langle t \rangle}\)</span>(<strong>新记忆</strong>)</li>
<li>控制二者融合比例的更新门 <span class="math inline">\(z^{\langle t \rangle}\)</span></li>
</ul>
<p>现在,GRU 要做的最后一件事,就是<strong>将“历史记忆”和“新记忆”按更新门的指示进行融合</strong>,从而得到当前时刻的最终隐藏状态 <span class="math inline">\(a^{\langle t \rangle}\)</span>,就像这样:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260112213001812-1703265568.png" alt="image" loading="lazy"><br>
最终的计算公式为:</p>
<p></p><div class="math display">\[a^{\langle t \rangle} = z^{\langle t \rangle} \odot a^{\langle t-1 \rangle} + (1 - z^{\langle t \rangle}) \odot \tilde{a}^{\langle t \rangle}
\]</div><p></p><p>同样其中 <span class="math inline">\(\odot\)</span> 表示<strong>逐元素乘</strong>。<br>
这个公式本身就非常直观,它表达的正是更新门的语义含义:</p>
<ul>
<li><span class="math inline">\(z^{\langle t \rangle}\)</span> 决定了<strong>历史信息保留的比例</strong></li>
<li><span class="math inline">\(1 - z^{\langle t \rangle}\)</span> 决定了<strong>新信息写入的比例</strong></li>
</ul>
<p>也就是说:</p>
<ul>
<li>当 <span class="math inline">\(z^{\langle t \rangle}_i \approx 1\)</span> 时, 第 <span class="math inline">\(i\)</span> 个隐藏单元几乎<strong>直接复制上一时刻的状态</strong>,信息得以长期延续。</li>
<li>当 <span class="math inline">\(z^{\langle t \rangle}_i \approx 0\)</span> 时, 第 <span class="math inline">\(i\)</span> 个隐藏单元主要采用<strong>当前步生成的新信息</strong>。</li>
</ul>
<p>同时,如果任务类型需要,我们也可以根据得到的隐藏状态输出当前步的预测结果。</p>
<h2 id="25-小结">2.5 小结</h2>
<p>至此,一个 GRU 单元在时间步 <span class="math inline">\(t\)</span> 的完整计算流程就结束了,完整顺序是这样的:</p>
<ol>
<li><strong>计算重置门</strong> <span class="math inline">\(r^{\langle t \rangle}\)</span> → 用于调节历史隐藏状态在生成候选隐藏状态 <span class="math inline">\(\tilde{a}^{\langle t \rangle}\)</span> 时的参考程度:</li>
</ol>
<p></p><div class="math display">\[ r^{\langle t \rangle} = sigmoid(W_{xr} x^{\langle t \rangle} + W_{ar} a^{\langle t-1 \rangle} + b_r)
\]</div><p></p><ol start="2">
<li><strong>计算候选隐藏状态</strong> <span class="math inline">\(\tilde{a}^{\langle t \rangle}\)</span> → 使用当前输入 <span class="math inline">\(x^{\langle t \rangle}\)</span> 和重置门调节后的历史信息 :</li>
</ol>
<p></p><div class="math display">\[ \tilde{a}^{\langle t \rangle} = \tanh(W_{x\tilde{a}} x^{\langle t \rangle} + W_{a\tilde{a}} (r^{\langle t \rangle} \odot a^{\langle t-1 \rangle}) + b_{\tilde{a}})
\]</div><p></p><ol start="3">
<li><strong>计算更新门</strong> <span class="math inline">\(z^{\langle t \rangle}\)</span> → 决定历史信息与新候选状态在最终隐藏状态中的融合比例:</li>
</ol>
<p></p><div class="math display">\[ z^{\langle t \rangle} =sigmoid(W_{xz} x^{\langle t \rangle} + W_{az} a^{\langle t-1 \rangle} + b_z)
\]</div><p></p><ol start="4">
<li><strong>计算最终隐藏状态</strong> <span class="math inline">\(a^{\langle t \rangle}\)</span> → 使用更新门进行加权融合:</li>
</ol>
<p></p><div class="math display">\[ a^{\langle t \rangle} = z^{\langle t \rangle} \odot a^{\langle t-1 \rangle} + (1 - z^{\langle t \rangle}) \odot \tilde{a}^{\langle t \rangle}
\]</div><p></p><p>综合来看,GRU 缓解长距离依赖问题的方式可以概括为一句话:<strong>通过更新门建立“可复制的长期记忆通路”,通过重置门实现“按需使用的局部历史选择”,从结构上同时保护了信息和梯度的长期传递。</strong><br>
它并不是“记忆更强”,而是<strong>更聪明地决定什么时候记、什么时候用、什么时候不动</strong>。<br>
而且,你会发现 RGU 中同样有残差的思想:<br>
从结构视角看,GRU 的更新门在时间维度上实现了一种“<strong>可学习的残差连接</strong>”:当更新门接近 1 时,隐藏状态几乎被原样复制,使信息与梯度能够跨越多个时间步稳定传播,这与 ResNet 通过恒等映射缓解深层网络退化问题在思想上是一致的。</p>
<h1 id="3-总结">3. 总结</h1>
<table>
<thead>
<tr>
<th>概念</th>
<th>原理</th>
<th>比喻</th>
</tr>
</thead>
<tbody>
<tr>
<td>GRU 的核心思想</td>
<td>不再“全部记住”,而是通过门控机制选择性地记忆与使用历史信息</td>
<td>记笔记时只标重点,而不是全文背诵</td>
</tr>
<tr>
<td>更新门(Update Gate)</td>
<td>控制上一时刻隐藏状态在当前隐藏状态中保留的比例,直接决定最终输出</td>
<td>水龙头:决定旧记忆“流”到下一步的多少</td>
</tr>
<tr>
<td>重置门(Reset Gate)</td>
<td>控制历史信息在生成当前候选隐藏状态时是否被参考</td>
<td>翻笔记:这一步要不要看以前的内容</td>
</tr>
<tr>
<td>候选隐藏状态</td>
<td>在重置门调节下,由当前输入与部分历史信息生成的新记忆</td>
<td>当前这一步新写下的草稿想法</td>
</tr>
<tr>
<td>最终隐藏状态</td>
<td>使用更新门在旧隐藏状态与候选隐藏状态之间进行加权融合</td>
<td>在“照抄旧稿”和“采用新稿”之间做权衡</td>
</tr>
<tr>
<td>更新门 vs 重置门</td>
<td>更新门决定信息能“走多远”,重置门决定信息“现在用不用”</td>
<td>一个管未来,一个管当下</td>
</tr>
<tr>
<td>门不共享参数的原因</td>
<td>二者承担不同语义角色,通过反向传播分别学习“长期保留”和“局部使用”的策略</td>
<td>长期计划和临时决策不能用同一套标准</td>
</tr>
<tr>
<td>梯度传播机制</td>
<td>更新门接近 1 时,隐藏状态近似复制,梯度可跨时间步稳定传播</td>
<td>给梯度修了一条高速公路</td>
</tr>
<tr>
<td>GRU 与残差思想</td>
<td>在时间维度上引入“可学习的恒等映射”,避免每一步都强制更新</td>
<td>ResNet 的 skip connection,沿时间轴展开</td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/Goblinscholar/p/19463351
頁:
[1]