Bi-LSTM 模型介绍
1 课程概览
本课介绍 Bi-LSTM(双向 LSTM)模型。Bi-LSTM 不改变 LSTM 本身的任何结构,只是做两次:从左到右和从右到左,将得到的张量结果进行拼接。
2 核心概念与定义
- Bi-LSTM:双向 LSTM,Bidirectional LSTM。
- 双向:从左到右和从右到左两次处理。
- 拼接:将两次处理的结果拼接起来。
3 模型与算法详解
Bi-LSTM 的核心思想
不改变 LSTM 结构,做两次。
- 不改变 LSTM 本身的任何结构(遗忘门、输入门、细胞状态、输出门)
- 做两次:从左到右和从右到左
- 将得到的张量结果进行拼接
处理流程
以"我爱中国"为例。
第一次(从左到右):
我 → 爱 → 中 → 国
第二次(从右到左):
国 → 中 → 爱 → 我
拼接:
[左到右的结果, 右到左的结果]
拼接示例
假设隐藏层维度是 3。
| 方向 | 结果 |
|---|---|
| 左到右 | [h1, h2, h3] |
| 右到左 | [h1', h2', h3'] |
| 拼接后 | [h1, h2, h3, h1', h2', h3'](6 维) |
从右到左的传递
文本顺序不变,只是处理顺序反向。
- 从右到左传:先传"中国",再传"爱",再传"我"
- 但文本顺序不变:还是"我爱中国"
- 拼接时:中国的结果和中国的结果拼接
4 数学原理与推导
Bi-LSTM
$$\overrightarrow{h_t} = \text{LSTM}{\text{forward}}(x_t, \overrightarrow{h{t-1}})$$
$$\overleftarrow{h_t} = \text{LSTM}{\text{backward}}(x_t, \overleftarrow{h{t+1}})$$
$$h_t = [\overrightarrow{h_t}, \overleftarrow{h_t}]$$
其中:
- $\overrightarrow{h_t}$ 是前向隐藏状态
- $\overleftarrow{h_t}$ 是反向隐藏状态
- $h_t$ 是拼接后的隐藏状态
5 代码示例
import torch
import torch.nn as nn
# 创建 Bi-LSTM 模型
bilstm = nn.LSTM(
input_size=5,
hidden_size=6,
num_layers=1,
batch_first=True,
bidirectional=True # 双向
)
# 输入数据
input_data = torch.randn(1, 4, 5) # [batch_size, seq_len, input_size]
# 初始隐藏状态和细胞状态
h0 = torch.zeros(2, 1, 6) # [num_layers*2, batch_size, hidden_size]
c0 = torch.zeros(2, 1, 6) # [num_layers*2, batch_size, hidden_size]
# 前向传播
output, (hn, cn) = bilstm(input_data, (h0, c0))
print(f"输入: {input_data.shape}")
print(f"输出: {output.shape}") # [1, 4, 12](6*2=12)
print(f"隐藏状态: {hn.shape}") # [2, 1, 6]
代码说明
| 代码 | 说明 |
|---|---|
bidirectional=True | 启用双向 |
hidden_size=6 | 隐藏层维度 |
output.shape | [1, 4, 12],12 = 6*2 |
6 重难点与易错提醒
- ❗重点:Bi-LSTM 不改变 LSTM 结构,只是做两次。
- ❗重点:从左到右和从右到左两次处理,结果拼接。
- ❗重点:拼接后维度翻倍。
- ⚠️易错:从右到左传时,文本顺序不变,只是处理顺序反向。
7 课堂问答精选
Q1:Bi-LSTM 是什么?
A:Bi-LSTM(双向 LSTM)不改变 LSTM 本身的任何结构,只是做两次:从左到右和从右到左,将得到的张量结果进行拼接。
Q2:Bi-LSTM 如何处理"我爱中国"?
A:第一次从左到右:我→爱→中→国;第二次从右到左:国→中→爱→我。然后将两次的结果拼接。
Q3:拼接后维度如何变化?
A:拼接后维度翻倍。例如隐藏层维度是 6,拼接后是 12。
8 本课小结
- Bi-LSTM 不改变 LSTM 结构,只是做两次。
- 从左到右和从右到左两次处理,结果拼接。
- 拼接后维度翻倍。
9 延伸思考
- LSTM 的代码如何实现?
- GRU 模型是什么?