驿长 發表於 2026-1-13 22:37:00

吴恩达深度学习课程五:自然语言处理 第一周:循环神经网络 (七)双向 RNN 与深层 RNN

<p>此分类用于记录吴恩达深度学习课程的学习笔记,目前已完结,点击进入全集目录<br>
课程相关信息链接如下:</p>
<ol>
<li>原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai</li>
<li>github课程资料,含课件与笔记:吴恩达深度学习教学资料</li>
<li>课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案</li>
</ol>
<p>本篇为第五课的第一周内容,1.11到1.12的内容,同时也是本周理论部分的最后一篇。</p>
<hr>
<p>本周为第五课的第一周内容,与 CV 相对应的,这一课所有内容的中心只有一个:<strong>自然语言处理(Natural Language Processing,NLP)</strong>。<br>
应用在深度学习里,它是专门用来进行<strong>文本与序列信息建模</strong>的模型和技术,本质上是在全连接网络与统计语言模型基础上的一次“结构化特化”,也是人工智能中<strong>最贴近人类思维表达方式</strong>的重要研究方向之一。<br>
<strong>这一整节课同样涉及大量需要反复消化的内容,横跨机器学习、概率统计、线性代数以及语言学直觉。</strong><br>
语言不像图像那样“直观可见”,更多是抽象符号与上下文关系的组合,因此<strong>理解门槛反而更高</strong>。<br>
因此,我同样会尽量补足必要的背景知识,尽可能用比喻和实例降低理解难度。<br>
本篇的内容关于<strong>双向 RNN 与深层 RNN</strong>,是对基础 RNN 结构的一些补充。</p>
<h1 id="1-双向-rnnbidirectional-rnn">1. 双向 RNN(Bidirectional RNN)</h1>
<p>在前面对 <strong>RNN、GRU 与 LSTM</strong> 的讨论中,我们始终默认了一个前提:<strong>序列只能沿时间轴单向展开,模型在当前时刻只能利用已经出现的历史信息。</strong></p>
<p>这种设定在一些简单任务中是合理的,但在大量<strong>序列理解与标注任务</strong>中,却隐藏着一个结构性限制:<strong>当前时刻的语义或状态,往往同时依赖于过去和未来的上下文信息。</strong><br>
举个课程里的例子:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260113211513804-150472822.png" alt="image.png" loading="lazy"><br>
于是,问题出现了:<strong>如果未来信息才是判定当前状态的重要依据,该怎么办?</strong></p>
<p>正是在这样的背景下,<strong>双向 RNN(Bidirectional Recurrent Neural Networks)</strong> 被提出。<br>
早在 <strong>1997 年</strong>,<strong>Bidirectional Recurrent Neural Networks</strong> 这篇论文中就指出:对于序列标注与整体理解任务,仅依赖过去上下文会造成信息利用上的先天不足,因此有必要在模型结构层面<strong>同时建模正向与反向的时间依赖关系</strong>。</p>
<p>需要强调的是,双向 RNN 并不是一种新的循环单元设计。<br>
它并不改变 RNN、LSTM 或 GRU 内部的计算形式,而是通过在时间维度上引入<strong>前向与后向两条独立的状态传播链路</strong>,使模型在每一个时间步都能够融合<strong>历史与未来的上下文信息</strong>。</p>
<p>也正因为这种“结构独立于单元”的特性,双向 RNN 可以自然地与 LSTM、GRU 结合,形成 <strong>Bi-LSTM、Bi-GRU</strong>,成为提升上下文建模能力的标准配置。</p>
<p>它的实现逻辑并不复杂,这里引用一张比较清晰易懂的传播图:(出处)<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260113211514563-1603287401.png" alt="image.png" loading="lazy"><br>
这样,你就会发现,同一序列被 <strong>正向(蓝色)</strong> 和 <strong>反向(绿色)</strong> 两条 RNN 同时建模,每个时间步 <span class="math inline">\(t\)</span> 都能“看到”正向的历史上下文和反向的未来上下文,最终输出 <span class="math inline">\(\hat y^{\langle t\rangle}\)</span> 由两个方向的信息共同决定。</p>
<p></p><div class="math display">\[h^{(t)}
=
\operatorname{concat}\!\left(
\overrightarrow{{h}^{(t)}},
\overleftarrow{{h}^{(t)}}
\right)
\quad \text{or} \quad
\overrightarrow{{h}^{(t)}} + \overleftarrow{{h}^{(t)}}
\]</div><p></p><p>在实践中,双向 RNN 更常采用<strong>拼接方式</strong>保留来自两个时间方向的完整信息,而<strong>逐元素相加</strong>则是一种更紧凑、但表达能力受限的折中选择。</p>
<p>最后,再打个比方:把序列比作一座<strong>要建的桥</strong>,双向 RNN 就像是两队工人从两侧同时施工并不断交流进度,确保精准,但同时,施工队伍翻倍,整体成本也随之上升。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260113211553645-1826290875.png" alt="image.png" loading="lazy"></p>
<h1 id="2-深层-rnn">2. 深层 RNN</h1>
<p>深层 RNN 的概念同样不难理解。<br>
在最开始引入 <strong>循环神经网络</strong> 时,我们说明过,默认使用<strong>单层 RNN</strong> 来进行演示:<br>
在每一个时间步 <span class="math inline">\(t\)</span>,输入 <span class="math inline">\(x^{(t)}\)</span> 经过一次循环计算,得到对应的隐藏状态 <span class="math inline">\(a^{(t)}\)</span>,并沿时间轴不断传递。</p>
<p>但从模型表达能力的角度来看,这种结构存在限制:<strong>每个时间步内部,只进行了一次非线性变换。</strong><br>
这意味着,无论序列本身有多复杂,在“同一时刻”对输入信息的处理深度都是有限的。<br>
到这里,就和之前的全连接、卷积网络相通了:<br>
<strong>如果我们希望模型在每一个时间步上,也具备类似深度前馈网络、卷积网络那样的层级表达能力,该怎么办?</strong><br>
答案自然就是:<strong>在时间维度之外,再引入层级维度。</strong></p>
<p>在深层 RNN 中,循环结构不再只有一层,而是<strong>在同一时间步上堆叠多层 RNN 单元</strong>。<br>
它的传播图是这样的:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260113211513339-2004923823.png" alt="image.png" loading="lazy"><br>
关于深度的逻辑和之前都是相同的,深层 RNN 通过在同一时间步上的堆叠,让模型可以进行更复杂的非线性变换,<strong>增强了其表达能力</strong>。但同样也会增加计算成本,<strong>带来梯度问题与过拟合风险</strong>,这些都是我们的老生常谈了。</p>
<p>于此同时,和双向 RNN 类似,<strong>深层结构同样独立于具体的循环单元设计</strong>。而且在工程实践中,<strong>深度、方向性和门控机制往往是可以同时叠加的</strong>,例如:</p>
<ul>
<li>多层 Bi-LSTM</li>
<li>多层 Bi-GRU</li>
</ul>
<p>我们把各个组件组合或创新,便形成了深度学习 NLP 中纷繁复杂的诸多模型。</p>
<p>最后,如果继续沿用前面的比喻:<br>
<strong>双向 RNN</strong> 像是从桥的两端同时施工。<br>
那么 <strong>深层 RNN</strong> 更像是: 每一个施工点上,不只是铺一层路面,而是<strong>一层层打地基、加结构、再铺表层。</strong> 这样结构更稳、表达更强,但施工流程更复杂,成本和训练难度也随之上升。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202601/3708248-20260113211517590-653078512.png" alt="image.png" loading="lazy"></p>
<h1 id="3总结">3.总结</h1>
<table>
<thead>
<tr>
<th>概念</th>
<th>原理</th>
<th>比喻</th>
</tr>
</thead>
<tbody>
<tr>
<td>双向 RNN(Bidirectional RNN)</td>
<td>在时间维度上引入<strong>正向和反向两条独立状态链路</strong>,每个时间步同时利用过去和未来上下文信息。适用于序列标注与整体理解任务。可以与 RNN/LSTM/GRU 结合,形成 Bi-RNN、Bi-LSTM、Bi-GRU。</td>
<td>序列比作桥,两队工人从两端同时施工并交流进度,确保精准,但施工队伍翻倍,成本增加。</td>
</tr>
<tr>
<td>深层 RNN(Deep RNN)</td>
<td>在同一时间步上<strong>堆叠多层 RNN 单元</strong>,增加每个时间步内部的非线性表达能力,从而增强模型的表示能力。可与门控机制和双向结构叠加,形成多层 Bi-LSTM、Bi-GRU 等。</td>
<td>每个施工点上不是只铺一层路面,而是<strong>一层层打地基、加结构、再铺表层</strong>,结构更稳、表达更强,但施工流程复杂,成本和训练难度增加。</td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/Goblinscholar/p/19479253
頁: [1]
查看完整版本: 吴恩达深度学习课程五:自然语言处理 第一周:循环神经网络 (七)双向 RNN 与深层 RNN