RNN 用于序列标注

2024年8月28日 | 阅读 7 分钟

什么是 RNN?

循环神经网络(Recurrent Neural Network),简称 **RNN**,是一种**人工神经网络**,用于处理**时间序列或序列数据**。这些深度学习技术常用于处理有序和时间相关的问题,例如语言翻译、自然语言处理(NLP)、语音识别和图像字幕生成。RNN 在多个应用中都有使用,例如**Siri、语音搜索和谷歌翻译**。循环神经网络像前馈神经网络和卷积神经网络(CNN)一样,从**训练输入**中学习。

循环神经网络在处理**自然语言处理 (NLP)** 任务方面非常高效。**序列标注**为序列中的每个元素分配标签,用于**词性标注、命名实体识别、情感分析**等目的。

RNN 由于能够保持捕捉先前时间步信息的隐藏状态,因此在处理**序列数据**方面表现出色。RNN 是序列标注的自然选择,因为它涉及为序列中的每个元素分配标签。

循环神经网络的架构

循环单元是 RNN 的基本构建块,在每个时间步接收输入并产生输出。隐藏状态充当网络的记忆,并根据当前输入和先前的隐藏状态进行更新。每个时间步的输出可用于各种目的,例如分类或进一步处理。

用于序列标注的循环神经网络

在序列标注中,根据上下文为序列中的每个元素分配一个标签。例如,在词性标注中,短语中的每个单词都会被标记其词性。

RNN 中的序列标注通常使用多对多架构,其中输入和输出序列的长度相同。然后将输入元素馈送到 RNN,每个时间步的结果用于预测该元素的标签。

让我们看看使用 RNN 进行序列标注的数学形式和实现。

数学实现

我们用 X 表示输入序列,用 Y 表示输出序列。我们可以将这些输入和输出序列表示为

X = [x1, x2, x3,……., xn]
Y = [y1, y2, y3,…….., yn]

RNN 的计算可以表示为

  • 隐藏状态更新: ht = f(ht-1, xt)
  • 输出计算: ot = g (ht)
  • 损失函数: L = ∑ loss (yt, Ot)

其中 f 表示循环单元函数,

  • g 是输出函数,
  • loss 是计算预测标签和实际标签之间差值的函数。

使用 RNN 进行序列标注的过程

让我们结合数学表达式和示例,看看使用 RNN 进行序列标注的步骤。

1. 数据准备: 第一步是准备数据集。对于序列标注,我们需要一个带标签的数据集用于训练和评估。数据集必须包含输入序列及其输出标签。例如,命名实体识别任务的数据集必须包含句子及其标签。

2. 输入和输出编码: 下一步是将输入和输出数据编码为 RNN 可接受的格式。在 NLP 中,输入通常表示为词嵌入或独热向量,而输出通常表示为数值标签或独热向量。

3. 架构: 下一步是为序列标注选择合适的 RNN 架构。长短期记忆(LSTM)和门控循环单元(GRU)是两种最常见的 RNN 架构,因为它们能够识别长期依赖关系。

4. 选择合适的 RNN 架构后,我们必须处理输入序列并生成输出序列。这个使用输入序列生成输出序列的过程称为前向传播。

我们用 X 表示输入序列,用 Y 表示输出序列。我们可以将这些输入和输出序列表示为

X = [x1, x2, x3,……., xn]
Y = [y1, y2, y3,…….., yn]

使用 LSTM 通过执行以下方程来计算隐藏状态和输出:

  • 遗忘门:ft = σ (Wf . [ht-1 , xt] + bf)
  • 输入门:it = σ (Wi . [ht-1 , xt] + bi)
  • 候选状态:C = tanh (Wc [h, x] + bc)
  • 更新的单元状态:Ct = ft ⊙ Ct-1 + it ⊙ C
  • 输出门:Ot = (Wo [ht-1, xt] + b0)
  • 隐藏状态:ht = Ot ⊙ tanh (c)
  • 输出:Ot = g (ht)

其中,σ 是 sigmoid 激活函数,

  • 是逐元素乘法,
  • W 是权重,
  • b 是 LSTM 的偏置参数。

5. 计算损失: 需要一个损失函数来计算实际输出 Ot 和预测输出 y 之间的差异。交叉熵损失和分类损失通常是序列标注任务的损失函数。它可以计算为

Lt = loss (yt, Ot)

总损失 L 可以计算为所有损失的总和:L = ∑ Lt

6. 时间反向传播 (BPTT): 时间反向传播 (BPTT) 用于更新模型参数和最小化损失。在每个时间步,计算损失关于参数的梯度,并使用梯度下降优化来更新参数。

7. 数据集的训练和评估: 下一步是使用带标签的数据集训练 RNN。在验证数据集上计算损失。必须通过减小损失函数来防止过拟合。在 RNN 训练完成后对其进行评估,以检查其准确率、精确率和效率。

让我们通过命名实体识别任务来理解序列标注。我们需要标记和识别句子中的实体。例如,以简单句子“红堡在德里。”为例,它会为句子中的每个实体给出标签,如 [FAC, FAC, O, O, GPE]。

在此,FAC 指建筑物名称,GPE 指地点。

说明

我们将输入文本根据其含义转换为标签,并将标签表示为向量。我们使用基于 LSTM 的 RNN 逐词处理输入序列,在每个时间步更新隐藏状态。每个时间步的最终输出用于预测该单词的标签。

在训练过程中,我们将使用损失函数来比较预测标签和实际标签。使用BPTT计算梯度,并通过梯度下降更新 LSTM 的参数。

最后,在测试数据集上评估训练好的模型以检查其准确性。

使用 Python 中的 RNN 实现序列标注

我们可以使用 Python 提供的深度学习库来实现 RNN 序列标注:Tensorflow。我们将实现 RNN 的序列标注来执行命名实体识别 (NER)

在此实现中,我们将训练一个LSTM 模型来预测句子中实体的标签。

首先,我们将使用各种带标签的句子数据集,其中每个单词都用其标签进行标记。然后,我们将训练模型以学习单词与标签之间的模式和关系。

程序:使用 Tensorflow 实现 RNN 序列标注并理解 LSTM 模型

代码

输出

Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 embedding_1 (Embedding)     (None, 80, 200)           3000000   
                                                                 
 lstm_1 (LSTM)               (None, 80, 74)            81400     
                                                                 
 time_distributed_1 (TimeDi  (None, 80, 5)             375       
 stributed)                                                      
                                                                 
=================================================================
Total params: 3081775 (11.76 MB)
Trainable params: 3081775 (11.76 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

说明

步骤 1: 我们已经实现了所需的库,包括 Tensorflow 及其模型。

步骤 2: 我们创建了一个用于序列标注的 RNN 模型。它包含多个参数。

  • vocab: 它定义了词汇量大小,即数据集中唯一的单词。
  • labels: 它定义了模型要预测的实体的标签。
  • embedding_dimen: 它描述了词嵌入的维度,用于在向量空间中表示单词。
  • lstm_model_units: 它定义了 LSTM 层中的 LSTM 单元数量。

步骤 3: 在创建 RNN 模型(rnn_model)的函数中,我们创建了一个顺序模型并添加了多个层,包括嵌入层、LSTM 层、密集层和 TimeDistributed 层。

这些层的工作方式如下:

  1. 嵌入层:此层有助于理解输入数据的词嵌入。它将每个单词索引转换为指定维度(由 embedding_dimen 表示)的密集向量表示。input_length 指定了输入序列的最大长度。
  2. LSTM 层:LSTM 层实现了序列到序列的映射。LSTM 层返回序列标注所需的输入序列中的隐藏状态。
  3. 密集层:此全连接层使用 softmax 激活函数作为输出,返回每个标签的预测概率。
  4. TimeDistributed 层:此层为序列中的每个单词分配标签。

步骤 4:返回模型: rnn_model 函数返回 RNN 模型。

步骤 5:使用模型:我们为 RNN 模型参数(如词汇量大小、标签等)赋值。最后,我们使用 summary() 打印了 LSTM 模型的摘要,以获取模型层和输出形状。