TensorFlow深度学习实战——基于语言模型的动态词嵌入技术

发布于:2025-04-15 ⋅ 阅读:(21) ⋅ 点赞:(0)

TensorFlow深度学习实战——基于语言模型的动态词嵌入技术

0. 前言

基于语言模型的词嵌入技术,通过利用上下文信息来生成动态的词向量,大大提升了词嵌入模型的表达能力。随着 BERTGPT 等大规模预训练模型的出现,基于语言模型的词嵌入在自然语言处理领域的应用变得越来越广泛,成为当前自然语言处理 (Natural Language Processing, NLP) 研究的一个重要方向。

1. 基于语言模型的词嵌入

语言模型是基于单词序列的概率分布,可以用于根据特定的单词序列预测最可能的下一个单词。与传统的词嵌入(无论是静态前软还是动态嵌入)类似,语言模型也会被训练在给定语料库中部分句子的情况下预测下一个单词(或者在双向语言模型中也可以预测前一个单词)。训练过程不涉及手动标签标注,因为它利用了大量文本的自然语法结构,所以在某种意义上,这是一种自监督学习过程。
语言模型作为词嵌入与传统嵌入的主要区别在于,传统嵌入应用为数据上的单一初始转换,然后针对特定任务进行微调。而语言模型是在大型外部语料库上训练的,并且代表了某种特定语言(如中文或英文)的模型。这一步骤称为预训练,预训练语言模型的计算成本通常相当高,下一步是为特定应用领域微调通用语言模型。例如,在旅行行业,可以用来自旅行领域的文本来微调语言模型,微调采用自定义文本重新训练最后几层。一旦微调完成,可以在旅行领域内多个任务中重复使用这个模型。与预训练步骤相比,微调步骤通常要简单得多。
一旦有了经过微调的语言模型,可以移除语言模型的最后一层,然后用一到两个层全连接层替换它,这个网络将输入的语言模型嵌入转换成最终分类或回归任务需要的输出。这与迁移学习的思想相同,唯一的区别在于这里是在文本而不是图像上进行迁移学习。与图像的迁移学习一样,基于语言模型的嵌入可以在标注数据非常少的情况下获得优秀结果。因此,基于语言模型的嵌入也称为自然语言处理的 ImageNet 时刻。

1.1 ELMo 与 ULMFiT

基于语言模型的嵌入的思想起源于 ELMo (Embeddings from Language Model) 网络,ELMo 通过在大型文本语料库上训练,以预测给定词序列的下一个和前一个词,从而学习语言,ELMo 基于双向长短期记忆 (Long Short-Term Memory, LSTM)。
第一个可行的语言模型嵌入由 HowardRuder 提出,通过通用语言模型微调 (Universal Language Model Fine-Tuning, ULMFiT) 模型实现,该模型在包含 28,595 篇维基百科文章和 1.03 亿个单词的 wikitext-103 数据集上进行了训练。ULMFiT 与图像任务的迁移学习有同样的优势,在标注数据较少的情况下,在监督学习任务中获得更好的结果。
Transformer 架构已经成为机器翻译任务的首选网络,取代了 LSTM 网络,因为它可以并行操作并更好地处理长期依赖性。

1.2 GPT

OpenAI 团队的 Radford 等人提出使用标准 Transformer 网络的解码器,而不是 ULMFiT 中使用的 LSTM 网络。基于此,构建了一种名为生成预训练 (Generative Pretraining, GPT) 的语言模型嵌入,该模型在许多语言处理任务上取得了最先进的结果。同时提出了用于单句和多句任务的几种监督任务配置,涉及单句和多句任务,如分类、推理、相似度和多选题问答。OpenAI 团队随后推出了更大的语言模型 GPT-2GPT-3

1.3 BERT

OpenAI Transformer 架构的一个问题在于它是单向的,而 ELMoULMFiT 是双向的。由 Google AI 团队提出的 BERT (Bidirectional Encoder Representations for Transformers) 利用 Transformer 架构的编码器,通过屏蔽高达 15% 的输入来安全地实现双向性,并要求模型进行预测。与 GPT 一样,BERT 提出了用于多种监督学习任务的配置,如单句和多句分类、问答和标记。
BERT 模型有两个主要变体——BERT-baseBERT-largeBERT-base12 个编码器层,768 个隐藏单元和 12 个注意头,总共有 1.1 亿个参数;BERT-large24 个编码器层,1024 个隐藏单元和 16 个注意头,总共有 3.4 亿个参数。
BERT 的预训练过程是一项计算复杂的任务,目前只能通过张量处理单元 (Tensor Processing Units, TPUs) 或大规模分布式图形处理单元 (Graphics Processing Units, GPUs) 集群来实现。使用自定义数据集对基于 BERT 的模型进行微调通常可以在 GPU 上实现。
BERT 模型完成微调后,通常最后四个隐藏层的嵌入可以用于下游任务。具体使用哪种嵌入或嵌入的组合(通过求和、平均、最大池化或连接)通常取决于任务类型。

2. 使用 BERT 作为特征提取器

在本节中,将介绍如何从 BERT 语言模型中提取嵌入。BERT 项目提供了一组可以从命令行运行的 Python 脚本,用于对 BERT 进行微调:

$ git clone https://github.com/google-research/bert.git
$ cd bert

下载想要微调的 BERT 模型。BERT 有两种变体——BERT-baseBERT-large,此外,每个模型都有区分大小写和不区分大小写版本。在本节中,使用 BERT-base-uncased 预训练模型:

$ mkdir data
$ cd data
$ wget https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.
zip
$ unzip -a uncased_L-12_H-768_A-12.zip

以上命令在本地 BERT 项目的 data 目录下下载并解压缩 uncased_L-12_H-768_A-12 文件,其中 bert_config.json 文件是用于创建原始预训练模型的配置文件,而 vocab.txt 是模型使用的词汇表,包含 30,522 个单词和单词片段。

$ ls uncased_L-12_H-768_A-12
bert_config.json                     bert_model.ckpt.index  vocab.txt
bert_model.ckpt.data-00000-of-00001  bert_model.ckpt.meta

预训练语言模型可以直接用作简单机器学习的文本特征提取器,可以用于将文本输入向量化的情况,利用嵌入的分布式特性可以获得比独热编码更密集和更丰富的表示。
在这种情况下,输入是每行一个句子的文件 sentences.txt,将其放入 ${CLASSIFIER_DATA} 文件夹中。可以通过将最后几层标记为 -1 (最后一个隐藏层)、-2 (倒数第二个隐藏层)等,从最后的隐藏层中生成嵌入。提取输入句子 BERT 嵌入:

$ export BERT_BASE_DIR=./data/uncased_L-12_H-768_A-12
$ export CLASSIFIER_DATA=./data/my_data
$ export TRAINED_CLASSIFIER=./data/my_classifier
$ python extract_features.py \
--input_file=${CLASSIFIER_DATA}/sentences.txt \
--output_file=${CLASSIFIER_DATA}/embeddings.jsonl \
--vocab_file=${BERT_BASE_DIR}/vocab.txt \
--bert_config_file=${BERT_BASE_DIR}/bert_config.json \
--init_checkpoint=${BERT_BASE_DIR}/bert_model.ckpt \
--layers=-1,-2,-3,-4 \
--max_seq_length=128 \
--batch_size=8

以上命令将从模型的最后四个隐藏层中提取 BERT 嵌入,并将它们逐行写入到与输入文件相同目录下的 embeddings.jsonlJSON 文件中,这些嵌入可以作为输入用于特定任务的下游模型,如情感分析。由于 BERT 在大量英文文本上进行了预训练,它能够学习语言的微妙差别,这对于下游任务非常有用。下游模型不一定是神经网络,也可以是非神经网络模型,如 SVMXGBoost
BERT 可以用于迁移学习外,与计算机视觉一样,也可以为特定任务微调 BERT (或其他 Transformer 模型),将合适模型头 (Head Network) 连接到 BERT,并将组合网络针对特定任务进行微调。

相关链接

TensorFlow深度学习实战(1)——神经网络与模型训练过程详解
TensorFlow深度学习实战(2)——使用TensorFlow构建神经网络
TensorFlow深度学习实战(3)——深度学习中常用激活函数详解
TensorFlow深度学习实战(4)——正则化技术详解
TensorFlow深度学习实战(5)——神经网络性能优化技术详解
TensorFlow深度学习实战(6)——回归分析详解
TensorFlow深度学习实战(7)——分类任务详解
TensorFlow深度学习实战(8)——卷积神经网络
TensorFlow深度学习实战(9)——构建VGG模型实现图像分类
TensorFlow深度学习实战(10)——迁移学习详解
TensorFlow深度学习实战(11)——风格迁移详解
TensorFlow深度学习实战(12)——词嵌入技术详解