自然语言处理中的循环神经网络与序列到序列模型
立即解锁
发布时间: 2025-09-01 00:55:12 阅读量: 2 订阅数: 32 AIGC 

# 自然语言处理中的循环神经网络与序列到序列模型
## 1. 循环神经网络(RNN)的反向传播与梯度问题
在RNN的反向传播阶段,细胞状态 \( c_t \) 在遗忘门 \( f_t \) 的帮助下,可以缓解梯度消失/爆炸问题。通过链式法则计算两个连续步骤的偏导数 \( \frac{\partial c_t}{\partial c_{t - 1}} \),根据公式 \( c_t = f_t \odot c_{t - 1} \oplus i_t \odot c_t' \),其偏导数近似为 \( \frac{\partial c_t}{\partial c_{t - 1}} \approx f_t \)。对于非连续步骤,有 \( \frac{\partial c_t}{\partial c_{t - k}} = \frac{\partial c_t}{\partial c_{t - 1}} \frac{\partial c_{t - 1}}{\partial c_{t - 2}} \cdots \frac{\partial c_{t - k + 1}}{\partial c_{t - k}} \approx \prod_{j = 1}^{k} f_{t - j + 1} \)。
如果遗忘门的值接近1,梯度信息可以几乎不变地通过网络状态传递。虽然 \( f_t \) 使用sigmoid激活函数,信息流仍会受到sigmoid激活函数特有的梯度消失问题影响,但与常规RNN中的梯度不同, \( f_t \) 在每个时间步都有不同的值,因此不是几何级数,梯度消失效应不太明显。
## 2. 门控循环单元(GRU)
GRU是2014年提出的一种循环块,作为对LSTM的改进。GRU单元通常具有与LSTM相似或更好的性能,但参数和操作更少。
### 2.1 GRU单元的结构
- **单一隐藏状态**:与经典RNN类似,GRU单元有一个单一的隐藏状态 \( h_t \),可以看作是LSTM隐藏状态和细胞状态的组合。
- **两个门**:
- **更新门 \( z_t \)**:结合了LSTM的输入门和遗忘门。根据网络输入 \( x_t \) 和前一个隐藏状态 \( h_{t - 1} \),决定丢弃哪些信息并包含哪些新信息。公式为 \( z_t = \sigma(W_z x_t + U_z h_{t - 1}) \)。
- **重置门 \( r_t \)**:使用前一个隐藏状态 \( h_{t - 1} \) 和网络输入 \( x_t \) 来决定传递多少前一个状态。公式为 \( r_t = \sigma(W_r x_t + U_r h_{t - 1}) \)。
- **候选状态 \( h_t' \)**: \( h_t' = \tanh(W x_t + U(r_t \odot h_{t - 1})) \)。
- **GRU输出 \( h_t \)**:在时间t的GRU输出 \( h_t \) 是前一个输出 \( h_{t - 1} \) 和候选输出 \( h_t' \) 的逐元素和,公式为 \( h_t = z_t \odot h_{t - 1} \oplus (1 - z_t) \odot h_t' \)。
### 2.2 GRU单元的特点
由于更新门允许我们同时遗忘和存储数据,它直接应用于前一个输出 \( h_{t - 1} \) 和候选输出 \( h_t' \)。
### 2.3 RNN的实际局限性
虽然可以借助LSTM或GRU单元解决梯度消失和爆炸问题,但RNN仍存在另外两个局限性:
- **无法并行化**:RNN的内部状态在序列的每个元素之后更新,新元素需要提前处理所有前面的元素,因此RNN序列处理不能并行化,无法利用GPU的并行计算能力。
- **序列长度限制**:所有前面序列元素的信息总结在一个单一的隐藏细胞状态中,RNN无法直接访问历史序列元素,只能依赖细胞状态。实际上,RNN(即使是LSTM或GRU)能有效处理的序列最大长度约为100个元素。
## 3. 使用LSTM实现文本分类
### 3.1 数据集
使用Large Movie Review Dataset(IMDb)进行情感分析,该数据集包含25000条训练评论和25000条测试评论,每条评论都有一个二进制标签,指示是正面还是负面。
### 3.2 模型组件
- **词嵌入**:序列中的每个单词被其嵌入向量替换,这些嵌入可以用word2vec生成。
- **LSTM单元**:词嵌入作为输入馈送到LSTM单元。
- **全连接层**:LSTM单元的输出 \( h_t \) 作为输入馈送到具有两个输出单元和softmax的全连接层,softmax输出表示评论为正面(1)或负面(0)的概率。
- **最终输出**:序列最后一个元素的输出作为整个序列的结果。
### 3.3 实现步骤
1. **定义设备**:
```python
import torch
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
```
2. **定义分词器**:
```python
from torchtext.data.utils import get_tokenizer
tokenizer = get_tokenizer('basic_english')
```
3. **构建词汇表**:
```python
from torchtext.datasets import IMDB
from torchtext.vocab import build_vocab_from_iterator
def yield_tokens(data_iter):
for _, text in data_iter:
yield tokenizer(text)
vocabulary = build_vocab_from_iterator(
yield_tokens(IMDB(split='train')),
specials=["<unk>"])
vocabulary.set_default_index(vocabulary["<unk>"])
```
4. **定义批量处理函数**:
```python
def collate_batch(batch):
labels, samples, offsets = [], [], [0]
for (_label, _sample) in batch:
labels.append(int(_label) - 1)
processed_text = torch.tensor(
vocabulary(tokenizer(_sample)),
dtype=torch.int64)
samples.append(processed_text)
offsets.append(processed_text.size(0))
labels = torch.tensor(
labels,
dtype=torch.int64)
offsets = torch.tensor(
offsets[:-1]).cumsum(dim=0)
samples = torch.cat(samples)
return labels, samples, offsets
```
5. **定义LSTM模型**:
```python
class LSTMModel(torch.nn.Module):
def __init__(self, vocab_size, embedding_size, hidden_size, num_classes):
```
0
0
复制全文
相关推荐










