想象你是一名洞穴探险家,面前是一条望不到头的隧道,只有入口处透进一束光。如果只凭手电筒一步步往前摸,你对每一段路的判断都只能依赖身后走过的痕迹——前方是岔路还是断崖,你一无所知。更麻烦的是,笔记越写越厚,前面几页的字迹已经开始模糊。但如果这时,一位伙伴从隧道另一端逆向出发,你们每走一段就停下交换一次笔记,情况就完全不同了:隧道里每一寸地方,你们都同时知道“来路”和“去路”。BiLSTM(双向长短时记忆网络)干的就是这件事——让两个 LSTM 相向而行,把前向与后向的信息融合起来,让序列中每一个位置都拥有完整的上下文视野。这篇文章将带你走进 BiLSTM 的内部结构,看懂它如何解决单向模型的“近视”问题,以及如何在命名实体识别、情感分析等任务中发挥威力。

岗位关联

学懂 BiLSTM,你就掌握了序列建模的核心武器。无论是 NER、情感分析还是文本分类,双向信息融合都能显著提升效果,这也是 NLP 工程师面试中必考的高频考点。

目录
  1. 可视化演示
  2. RNN的困境
  3. LSTM三门机制
  4. 双向网络结构
  5. BiLSTM计算
  6. 单向LSTM对比
  7. 序列标注应用
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示BiLSTM前向/后向LSTM双向隐状态拼接架构、LSTM三门控机制(遗忘/输入/输出)及NER序列标注应用,切换模式理解双向上下文融合原理。

本节配有交互动效(进入视口后自动加载,约 3KB)。

BiLSTM双向架构与隐状态融合 前向LSTM按时间正序处理x1→xT,后向LSTM逆序处理xT→x1,每个时刻拼接双向隐状态[→h;←h]获得2倍维度表示 双向信息融合使每个时间步同时拥有过去和未来上下文,显著提升序列标注和分类任务的表示能力 h_t = [→h_t ; ←h_t] | output = 2×d_h per step BiLSTM通过双向LSTM并行处理实现全序列上下文的信息融合

RNN的困境

想象你作为一名探险家,独自走进一条幽深的隧道。手电筒照亮脚下,你每走一步就把见闻记在笔记本上:第 1 米是碎石,第 2 米是滴水……可走到第 50 米,前方的黑暗里到底是岔路还是断崖,你只能凭直觉猜。更糟的是,笔记本越写越厚,前面几页的字迹已经开始模糊。这就是“单向行走加记忆模糊”的双重困境。

这种“走一步看一步”的结构,正是循环神经网络 RNN 的写照。RNN 从左到右逐词读取句子,把上一个时刻的隐藏状态 \(h_{t-1}\) 和当前词 \(x_t\) 一起压缩进当前状态 \(h_t\),相当于把“已经看过的内容”摘要成一张纸条,递给下一个时刻继续加工。

用数学语言表达,RNN 的每个时间步做一次这样的变换:

探险家面对的第二个麻烦是“看不见前方”:\(h_t\) 只编码了 \(x_1\) 到 \(x_t\) 的信息,对 \(x_{t+1}\) 之后的“未来”一无所知。要解决这两个问题,探险家需要两样东西:一个能长期保存关键信息的“记忆背包”,以及一位从另一端走来的伙伴。前者是 LSTM,后者便是 BiLSTM 的后向层。

ht=tanh⁡(Whhht−1+Wxhxt+bh)\displaystyle h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t + b_h)
这个公式说明:当前状态 \(h_t\) 是由上一步状态与当前输入共同“搅拌”出来的。但信息经过多次压缩后,早期内容在反向传播中不断衰减,梯度趋近于零,模型就“记不住”太久之前的事了。
  1. 当前隐藏状态 \(h_t\)t 时刻模型输出的“工作笔记”,浓缩了从开头到 t 的全部已读信息,是传给下游任务的核心特征。
    ht\displaystyle h_t
  2. 上一时刻状态 \(h_{t-1}\)t 之前所有输入留下的摘要,相当于探险家走到第 t-1 米时的笔记本目录。
    ht−1\displaystyle h_{t-1}
  3. 当前输入 \(x_t\)t 时刻进入模型的词向量,比如“小明”这个词的数字化表示,是此刻新看到的路段。
    xt\displaystyle x_t
  4. 权重矩阵与偏置\(W_{hh}\) 整理历史摘要,\(W_{xh}\) 整理当前输入,两者相加后再加偏置 \(b_h\),完成一次“加权汇总”。
    Whhht−1+Wxhxt+bh\displaystyle W_{hh} h_{t-1} + W_{xh} x_t + b_h
  5. 激活函数 tanh把汇总结果压到 -1 到 1 之间,维持数值稳定,避免中间结果爆炸。
    tanh⁡(⋅)\displaystyle \tanh(\cdot)

LSTM三门机制

给探险家升级装备:一个能装下重要物资的背包,外加三道闸门。遗忘门检查背包里哪些东西已经没用了,果断扔掉;输入门决定新发现的东西哪些值得装进背包;输出门则决定日记本上写什么给别人看。有了这套装置,走了 100 米后,出发时最关键的那张地图依然完好无损。

LSTM 正是这样设计的。它在 RNN 的基础上引入一条“记忆传送带”——记忆细胞 \(C_t\),用遗忘门 \(f_t\)、输入门 \(i_t\)、输出门 \(o_t\) 三个阀门控制信息的流入、保留与流出。每个门都经过 sigmoid 激活,输出 0 到 1 之间的“开合度”:接近 1 表示完全放行,接近 0 表示彻底关闭。

ft=σ(Wf⋅[ht−1,xt]+bf)\displaystyle f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)

Ct=ft⊙Ct−1+it⊙C~t\displaystyle C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t

ht=ot⊙tanh⁡(Ct)\displaystyle h_t = o_t \odot \tanh(C_t)

1. 遗忘门 \(f_t\):看上一状态与当前输入,输出一个 0 到 1 的系数,决定旧记忆 \(C_{t-1}\) 保留多少。背包里没用的石块,就在这里被扔出去。

ft=σ(Wf⋅[ht−1,xt]+bf)\displaystyle f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)

2. 输入门 \(i_t\) 与候选记忆:输入门决定新信息写入多少,候选记忆 \(\tilde{C}_t\) 是由当前输入提炼出的“待装包物资”。

it=σ(Wi⋅[ht−1,xt]+bi),C~t=tanh⁡(WC⋅[ht−1,xt]+bC)\displaystyle i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i), \quad \tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)

3. 记忆细胞更新:旧记忆乘遗忘门,新候选乘输入门,两者相加得到最新背包内容 \(C_t\),这是 LSTM 的核心公式。

Ct=ft⊙Ct−1+it⊙C~t\displaystyle C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t

4. 输出门 \(o_t\):决定背包里哪些信息可以展示给外界。

ot=σ(Wo⋅[ht−1,xt]+bo)\displaystyle o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)

5. 隐藏状态输出:把记忆细胞的内容用 tanh 压到 -1 到 1,再乘输出门,得到传给下一步的隐藏状态 \(h_t\)。

ht=ot⊙tanh⁡(Ct)\displaystyle h_t = o_t \odot \tanh(C_t)

三道闸门用“乘法”这种温柔的方式调节记忆:遗忘门接近 0 就清空旧记忆,输入门接近 1 就吸收新信息。于是探险家走到隧道深处时,背包里仍装着出发时的关键物资——这就是 LSTM 缓解梯度消失的秘密。

双向网络结构

现在,隧道的另一头响起了脚步声——一位伙伴从出口逆向走来。你们约定:每经过一个标记点就记下自己的观察,最终在中间会合并交换全部笔记。从此,隧道里每一段路都有两份说明:一份来自入口方向的视角,一份来自出口方向的视角。

BiLSTM 就是“两位相向而行的 LSTM”。同一个输入序列 \(x_1, x_2, \dots, x_n\) 分别用正序喂给前向 LSTM、逆序喂给后向 LSTM。前向状态 \(\overrightarrow{h}_t\) 编码“从句首到 t”的信息,后向状态 \(\overleftarrow{h}_t\) 编码“从句尾到 t”的信息。

h→t=LSTM→(x1,x2,…,xt)\displaystyle \overrightarrow{h}_t = \overrightarrow{\mathrm{LSTM}}(x_1, x_2, \dots, x_t)

h←t=LSTM←(xn,xn−1,…,xt)\displaystyle \overleftarrow{h}_t = \overleftarrow{\mathrm{LSTM}}(x_n, x_{n-1}, \dots, x_t)

ht=[h→t;h←t]\displaystyle h_t = [\overrightarrow{h}_t; \overleftarrow{h}_t]

1. 前向隐藏状态:前向 LSTM 从句子开头出发,走到位置 t 时携带的是左侧全部信息,符号 \(\overrightarrow{h}_t\) 表示“向右看”。

h→t=LSTM→(x1,x2,…,xt)\displaystyle \overrightarrow{h}_t = \overrightarrow{\mathrm{LSTM}}(x_1, x_2, \dots, x_t)

2. 后向隐藏状态:后向 LSTM 从句子结尾出发,倒着走到位置 t 时携带的是右侧全部信息,符号 \(\overleftarrow{h}_t\) 表示“向左看”。

h←t=LSTM←(xn,xn−1,…,xt)\displaystyle \overleftarrow{h}_t = \overleftarrow{\mathrm{LSTM}}(x_n, x_{n-1}, \dots, x_t)

3. 拼接操作:分号表示把两个向量首尾相接,得到新的向量 \(h_t\)。若每个方向隐藏维度是 d,拼接后维度就是 2d。

ht=[h→t;h←t]\displaystyle h_t = [\overrightarrow{h}_t; \overleftarrow{h}_t]

注意,前向和后向是两套完全独立的参数,不共享权重。拼接得到的 \(h_t\) 才是每个位置最终的“合订笔记”,也是下游任务真正使用的特征。

BiLSTM计算

两位探险家虽然相向而行,但路上并不互相牵制。前向那位照自己的节奏走,后向那位照自己的节奏走,互不等待,最后才把笔记合订。这在计算机里意味着:前向、后向两个 LSTM 可以并行计算,互不阻塞。

从计算图看,BiLSTM 的前向传播相当于跑两个独立的 LSTM:一个沿时间正向展开,一个沿时间反向展开。每个位置 t 获得两个 d 维状态,拼接后变成 2d 维向量,这个拼接向量就是下游任务看到的“完整特征”。把综合特征接到任务头上,就得到每个位置的输出:

yt=softmax(Wy⋅[h→t;h←t]+by)\displaystyle y_t = \mathrm{softmax}(W_y \cdot [\overrightarrow{h}_t; \overleftarrow{h}_t] + b_y)

1. 拼接特征:位置 t 的前向与后向状态拼接成 2d 维向量,这是整个 BiLSTM 的“合订笔记”。

[h→t;h←t]\displaystyle [\overrightarrow{h}_t; \overleftarrow{h}_t]

2. 线性映射:权重矩阵 \(W_y\) 把 2d 维特征映射到标签类别数,偏置 \(b_y\) 调整偏移。

Wy⋅[h→t;h←t]+by\displaystyle W_y \cdot [\overrightarrow{h}_t; \overleftarrow{h}_t] + b_y

3. softmax 归一化:把每个类别的分数变成概率,所有类别概率之和为 1。

softmax(⋅)\displaystyle \mathrm{softmax}(\cdot)

4. 输出概率:\(y_t\) 中最大概率对应的标签就是该位置的预测结果,比如"B-PER"代表人名开头。

yt\displaystyle y_t

合订笔记的质量取决于两本原始笔记都足够好。这也是为什么工程上常用 BiLSTM 提取特征后再接任务头,既拿到双向上下文,又保持结构简洁。

单向LSTM对比

假如任务要求探险家“边走边向营地对讲机汇报当前位置”,他还能等后向伙伴吗?显然不行——后向伙伴还没走到他这段路呢!此时,单向的“因果性”反而成了优势:只能依赖已经发生的信息,绝不偷看未来。

单向 LSTM 的输出严格遵循因果约束:t 时刻的状态只依赖 \(x_1\) 到 \(x_t\),这使它天然适配流式场景:语音识别、实时翻译、增量序列预测。而 BiLSTM 必须读完整句才能输出,属于离线模型。用偏导可以严格表达这种“未来不可见”:

∂ht∂xt+k=0(k>0)\displaystyle \frac{\partial h_t}{\partial x_{t+k}} = 0 \quad (k > 0)

1. 偏导含义:\(\frac{\partial h_t}{\partial x_{t+k}}\) 衡量未来输入 \(x_{t+k}\) 变化时,当前状态 \(h_t\) 会受到多大影响。

∂ht∂xt+k\displaystyle \frac{\partial h_t}{\partial x_{t+k}}

2. 等于零:说明单向 LSTM 的 \(h_t\) 与未来词完全无关,这是因果模型的严格保证。

=0\displaystyle = 0

3. 未来位置限定:条件 \(k > 0\) 表示只看“尚未读到”的未来位置,这是单向模型的信息边界。

k>0\displaystyle k > 0

选择单向还是双向,本质是选择“边走边报”还是“探完再报”。如果任务允许看到完整句子再输出(离线 NER、文本分类、机器翻译的编码器),双向几乎总是更好;如果必须实时流式输出,就只能在单向模型或受限延迟的双向变体中取舍。

序列标注应用

探险团进入一条布满弯道和积水的隧道,总指挥要求:给每一段路贴上一张属性标签,“入口”“弯道”“积水”“出口”。得益于两位探险家的双重笔记,每段路的判断都有了左右两侧的证据,错贴标签的概率大大降低。

序列标注是 BiLSTM 的主战场,典型任务包括命名实体识别(NER)、词性标注(POS)、分句和关键词抽取。标准做法是把 BiLSTM 每个位置的拼接状态 \(h_t\) 送入输出层,得到该位置属于各类标签的分数。但逐位置独立 softmax 会忽略标签之间的顺序约束,比如人名实体标签 I-PER 不能直接跟在地点标签 B-LOC 后面。

实践中因此常用 BiLSTM-CRF:在 BiLSTM 之上叠加一个 CRF 层,用转移矩阵 \(T\) 建模相邻标签的合法性,对整条标签序列打分:

score(x,y)=∑t=1n(ϕt(yt)+Tyt−1,yt)\displaystyle \mathrm{score}(x, y) = \sum_{t=1}^{n} \left( \phi_t(y_t) + T_{y_{t-1}, y_t} \right)

1. 发射分数 \(\phi_t(y_t)\):由 BiLSTM 的拼接状态经过线性层得到,代表位置 t 的词在特征上“像”标签 \(y_t\) 的程度。

ϕt(yt)=Wyht+by\displaystyle \phi_t(y_t) = W_y h_t + b_y

2. 转移分数 \(T_{y_{t-1}, y_t}\):标签从 \(y_{t-1}\) 跳到 \(y_t\) 的代价,由可学习的转移矩阵 \(T\) 提供,约束标签顺序。

Tyt−1,yt\displaystyle T_{y_{t-1}, y_t}

3. 逐位置累加:把每个位置的发射分数和相邻转移分数全部加起来,得到整条标签序列的总分。

∑t=1n(ϕt(yt)+Tyt−1,yt)\displaystyle \sum_{t=1}^{n} \left( \phi_t(y_t) + T_{y_{t-1}, y_t} \right)

BiLSTM 负责“看”,CRF 负责“定规矩”。二者结合,标签序列既充分利用了双向上下文,又保证了全局合法性——这也是经典 NER 系统长期的主力架构。

AI 应用场景

命名实体识别(NER)

阶段:特征抽取与模型训练

解决的问题:传统基于规则和词典的方法难以覆盖新词、简称和跨行业术语;单向 LSTM 只能看左侧上下文,判断“苹果”是水果还是公司时容易出错。BiLSTM 让每个词同时看到左右两侧的信息,实体边界与类型判断更准确。

具体案例:在金融新闻“小米发布了新款手机”中,BiLSTM-CRF 能利用右侧“发布了新款手机”判断“小米”是机构名而非人名,准确输出 B-ORG / I-ORG 标签序列。

方面级情感分析

阶段:文本理解与细粒度情感分类

解决的问题:句子“屏幕很惊艳但续航一般”中,“屏幕”是正面评价、“续航”是负面评价,类别随目标词变化。BiLSTM 把目标词左右两侧的情感词都编码进隐藏状态,让每个方面词获得局部双向语境。

具体案例:电商评论平台对每个商品属性(屏幕、续航、拍照)分别输出情感极性,形成细粒度口碑报告,帮助厂商定位产品短板。

词性标注与文本分类

阶段:文本预处理与基础特征

解决的问题:一词多性现象普遍,例如“苹果”在“苹果树”中偏向名词义项。BiLSTM 结合整句双向上下文,为每个词输出词性标签,作为下游句法分析和分类任务的基础特征。

具体案例:新闻语料流水线中,先用 BiLSTM 做词性标注、再抽取名词短语,把结果输入文本分类模型,整体准确率比单纯使用词向量提升明显。

Python 演示

python41 行
import torchimport torch.nn as nn  class BiLSTMTagger(nn.Module):    def __init__(self, vocab_size, tag_size, embed_dim=16, hidden_dim=32):        super().__init__()        self.embed = nn.Embedding(vocab_size, embed_dim)        self.lstm = nn.LSTM(embed_dim, hidden_dim, bidirectional=True, batch_first=True)        self.fc = nn.Linear(hidden_dim * 2, tag_size)     def forward(self, x):        emb = self.embed(x)      # (B, T, embed_dim)        out, _ = self.lstm(emb)  # (B, T, 2 * hidden_dim)        logits = self.fc(out)    # (B, T, tag_size)        return logits  def train_step(model, x, y, optimizer, criterion):    model.train()    optimizer.zero_grad()    logits = model(x)    loss = criterion(logits.reshape(-1, logits.size(-1)), y.reshape(-1))    loss.backward()    optimizer.step()    return loss.item()  if __name__ == "__main__":    torch.manual_seed(0)    model = BiLSTMTagger(vocab_size=30, tag_size=5)    optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)    criterion = nn.CrossEntropyLoss()    x = torch.randint(0, 30, (4, 8))   # 4 句话, 每句 8 个词    y = torch.randint(0, 5, (4, 8))    # 每个词一个标签    for epoch in range(5):        loss = train_step(model, x, y, optimizer, criterion)        print("epoch", epoch + 1, "loss=%.4f" % loss)    with torch.no_grad():        pred = model(x).argmax(dim=-1)    print("预测标签序列:", pred[0].tolist())
目的:用 PyTorch 实现一个最简 BiLSTM 序列标注器,随机生成小批量词序列与标签,训练 5 轮后输出每个词的预测标签,演示双向 LSTM 的完整前向与训练流程。
  1. self.lstm = nn.LSTM(embed_dim, hidden_dim, bidirectional=True, batch_first=True)一行代码开启双向:PyTorch 自动创建前向与后向两个独立 LSTM 并把输出拼接。
  2. self.fc = nn.Linear(hidden_dim * 2, tag_size)双向拼接后维度翻倍,线性层把 2 倍隐藏维度映射到标签类别数。
  3. out, _ = self.lstm(emb)返回每个时间步的拼接隐藏状态,形状为 (B, T, 2 * hidden_dim)。
  4. logits.reshape(-1, logits.size(-1))把 (B, T, tag_size) 展平成 (B*T, tag_size),以便对每个词独立计算交叉熵损失。
  5. model(x).argmax(dim=-1)在标签维度上取概率最大的下标,得到每个位置的预测标签序列。

常见误区

误区“BiLSTM 能利用未来信息,那做实时语音识别肯定很合适,每个字一出来就能识别出来。”

正解BiLSTM 的“未来”是整句层面的——后向 LSTM 必须先把整句话读完,才能给每个位置算出状态。实时流式场景中未来词还没出现,后向层根本无法计算。语音识别等在线任务仍需单向 LSTM,或使用带有限延迟窗的双向变体。

为何常见:把“模型内部能看到未来”与“系统能即时响应”混为一谈,忽略了后向计算对完整输入的依赖。

误区“双向 LSTM 不就是把同一个模型反过来再跑一遍吗?参数应该是一样的,最后把两份结果加起来。”

正解前向、后向是两套完全独立的参数,互不共享。融合方式默认是拼接(concat)而非求和,拼接后维度翻倍,两个方向的信息得以完整保留;求和会丢失部分信息,只在少数变体中出现。

为何常见:直觉上认为“同一个模型的两个方向”,再加上“融合”一词容易让人联想到加法。

误区“LSTM 加了门控,BiLSTM 又有了双向,超长文本随便处理,根本不会梯度消失。”

正解门控机制只是“缓解”了梯度衰减,记忆细胞的容量仍然有限。序列超过数百步,早期信息仍会被逐渐冲淡。工程上还需配合梯度裁剪、注意力机制或 Transformer 来处理真正超长的依赖。

为何常见:把“缓解”等同于“根治”,忽略了门控的线性更新路径也有信息容量上界。

误区“BiLSTM 参数量是 LSTM 的两倍,训练一轮的时间一定是单向的两倍。”

正解参数量确实约翻倍,但前向与后向两个 LSTM 的计算彼此独立,在 GPU 上可以并行执行,训练墙钟时间通常接近单向,并不严格翻倍。真正翻倍的是需要“读完整个序列才能输出”的推理延迟。

为何常见:把“计算量”与“墙钟时间”画等号,忽略了现代硬件的并行能力。

误区“BiLSTM 这么强,序列标注任务直接接个 softmax 就是 SOTA,不用管标签之间的约束。”

正解相邻标签有强约束,例如 BIO 标注中 I-PER 不能跟在 B-LOC 后面。逐位置独立 softmax 会输出非法标签序列,实践中的经典方案是 BiLSTM-CRF,用转移矩阵显式建模标签间依赖,解码时保证全局合法。

为何常见:只关注 BiLSTM 的特征抽取能力,忽略了结构化预测中解码层的必要性。

面试题

Q1. BiLSTM 将前向与后向 LSTM 的隐藏状态拼接后,输出维度是多少?

单选题 · easy

  • A.与单向 LSTM 的完全相同
  • B.为单向 LSTM 的两倍大小← 正确答案
  • C.为单向 LSTM 的一半大小
  • D.与词向量的维度完全一致

答案:B。BiLSTM 默认的融合方式是拼接(concat),前向、后向各自输出 d 维,拼成 2d 维,因此是单向 LSTM 的两倍。A 忽略了维度翻倍,C 方向反了,D 混淆了词向量维度与隐藏维度。

Q2. BiLSTM 中,前向 LSTM 与后向 LSTM 的参数关系是?

单选题 · easy

  • A.两套参数完全共享一套
  • B.前向与后向部分共享
  • C.两套参数完全相互独立← 正确答案
  • D.后向参数继承前向参数

答案:C。前向 LSTM 和后向 LSTM 是两套独立的参数,各自学习不同方向的语言规律。共享参数会破坏两个方向表达信息的独立性,因此 C 正确,其余选项均与 BiLSTM 的设计相悖。

Q3. 下列哪种任务不适合直接使用 BiLSTM?

单选题 · easy

  • A.离线文本情感分类分析
  • B.离线命名实体识别任务
  • C.实时语音流式的识别任务← 正确答案
  • D.文本蕴含关系的判断任务

答案:C。BiLSTM 的后向层需要读完整句才能计算,属于离线模型。实时语音流式识别要求每个语音帧到达后立刻输出,未来输入不可得,因此不适合直接使用 BiLSTM,应改用满足因果性的单向模型。

Q4. 单向 LSTM 在 t 时刻的隐藏状态主要编码了什么信息?

单选题 · mid

  • A.从 t 到句子结尾的完整信息
  • B.从句子开头到 t 的历史信息← 正确答案
  • C.仅包含 t 时刻当前词的信息
  • D.全句所有词的随机组合信息

答案:B。单向 LSTM 从左到右读取,t 时刻的隐藏状态 \(h_t\) 由 \(x_1\) 到 \(x_t\) 逐步累积而来,编码的是左侧历史信息。A 描述的是后向层的作用,C 忽略了历史累积,D 与模型的计算机制不符。

Q5. 关于 BiLSTM 双向信息的融合方式,下列说法正确的有?

多选题 · mid

  • A.常把前向与后向状态做拼接← 正确答案
  • B.也有变体采用加权求和融合← 正确答案
  • C.拼接之后特征维度会直接翻倍← 正确答案
  • D.融合之后特征维度保持不变

答案:ABC。标准 BiLSTM 采用拼接,维度从 d 变成 2d,因此 C 对、D 错;加权求和是合法但非主流的融合变体,B 对。A 是标准做法,正确。

Q6. 为什么词性标注与 NER 等任务用 BiLSTM 通常优于单向 LSTM?

单选题 · mid

  • A.双向结构的参数量相对更少
  • B.词的标注依赖左右两侧上下文← 正确答案
  • C.双向模型不需要训练数据支撑
  • D.单向模型无法学习任何特征

答案:B。判断一个词是“名词”还是“动词”、是“人名”还是“地名”,往往需要同时参考它左侧和右侧的词。BiLSTM 通过后向层把右侧信息编码进来,因此标注效果更好。A、C 说法错误,D 过于绝对。

Q7. 关于 BiLSTM 的训练过程,下列说法正确的有?

多选题 · mid

  • A.前向层与后向层可以并行计算← 正确答案
  • B.反向传播需要累积两个方向的梯度← 正确答案
  • C.前向层与后向层共享同一权重
  • D.每个位置同时依赖两方向的隐藏状态← 正确答案

答案:ABD。前向、后向是两个独立的 LSTM,前向计算互不依赖,可以并行,A 对;反向传播时两个方向各自回传梯度并更新各自的参数,B 对;参数完全独立,C 错;每个位置的输出拼接了两个方向的隐藏状态,D 对。

Q8. 在支持并行计算的 GPU 上,BiLSTM 完成一次全序列前向计算的时间与单向 LSTM 相比?

单选题 · hard

  • A.一定是单向的两倍以上时间
  • B.接近单向的时间且可以并行← 正确答案
  • C.与序列长度的平方成正比关系
  • D.与待预测的标签类别数成正比

答案:B。BiLSTM 总计算量约为单向的两倍,但前向与后向两个 LSTM 互不依赖,GPU 上可同时计算,墙钟时间接近单向。C 混淆了复杂度,D 描述的是输出层而非序列计算。

Q9. BiLSTM 相比单向 LSTM 的改进与代价,下列说法正确的有?

多选题 · hard

  • A.可以利用未来的上下文信息← 正确答案
  • B.参数量大约增加一倍左右← 正确答案
  • C.彻底解决了长距离依赖难题
  • D.不适合因果流式输出的场景← 正确答案

答案:ABD。后向层把未来信息编码进当前状态,A 对;两套独立参数使参数量约翻倍,B 对;门控只是缓解而非根治长距离依赖,C 过于绝对;因果场景要求输出不依赖未来,BiLSTM 不满足,D 对。

Q10. 在 BiLSTM-CRF 序列标注中,CRF 层相对逐位置 softmax 的核心优势是什么?

单选题 · extreme

  • A.可以有效降低模型的整体参数量
  • B.显式建模标签之间的转移约束← 正确答案
  • C.可以完全替代 BiLSTM 的特征抽取
  • D.可以避免对标注数据做任何预处理

答案:B。CRF 引入可学习的转移矩阵,显式约束标签顺序,如 I-PER 不能紧跟 B-LOC,保证输出序列全局合法。softmax 逐位置独立,无法建模这种约束。A、C、D 均与 CRF 的实际作用不符。