TensorFlow深度学习实战——字符嵌入、子词嵌入、句子嵌入和段落嵌入
TensorFlow深度学习实战——字符嵌入、子词嵌入、句子嵌入和段落嵌入
- 0. 前言
- 1. 字符嵌入
- 2. 字词嵌入
- 3. 句子嵌入和段落嵌入
- 相关链接
0. 前言
在自然语言处理中,嵌入 (Embedding
) 技术是将文本转化为数值向量的核心方法,使计算机能够理解和处理语言中的语义信息。根据文本处理的粒度不同,除了词嵌入外,还包括字符嵌入、子词嵌入、句子嵌入和段落嵌入。这些嵌入技术使得计算机能够以不同的粒度理解和处理文本中的语义信息,从而为各种自然语言处理任务提供强大的支持。
1. 字符嵌入
字符嵌入 (Character Embedding
) 最早由 Xiang
和 LeCun
提出,相较于词嵌入具有以下优势:
- 字符词汇表规模较小:例如,英语的字符词汇表包含大约
70
个字符(26
个字母,10
个数字和其余特殊字符),这使得字符嵌入模型也相对小巧紧凑 - 与提供大但有限词汇表的词嵌入不同,字符嵌入不存在字符表外的问题,因为任何单词都可以用字符表表示
- 对于稀有或拼写错误的单词来说,字符嵌入往往更好,因为字符输入的不平衡要比词输入少得多
- 字符嵌入通常在需要句法而非语义相似性概念的应用中表现更好
但与词嵌入不同,字符嵌入往往特定于具体任务,因此,预训练嵌入通常不可用。
2. 字词嵌入
子词嵌入 (Subword Embedding
) 结合了字符嵌入和词嵌入的思想,将一个单词视为一组字符 n-gram
(即连续 n
个字符的序列)的集合,最早由 Bojanowski
等人提出,基于 Facebook AI Research
(FAIR
) 的研究,之后发布了 fastText
嵌入,fastText
嵌入目前支持 157
种语言。
fastText
为字符 n-gram
(其中 n
的范围在 3
到 6
个字符之间)计算嵌入,以及单词本身的嵌入。例如,对于单词 green
,当 n=3
时的字符 n-gram
包括 <gr
,gre
,ree
,een
和 en>
。单词的开头和结尾分别用 <
和 >
字符词元 (token
),以区分短单词及其 n-grams
,如 <cat>
和 cat
。
在查询时,如果单词存在于嵌入中,可以使用单词作为键从 fastText
嵌入中查找向量。与传统的词嵌入不同的是,即使单词不存在嵌入,仍然可以构建该单词的 fastText
向量。方法是将单词分解为其组成的三字符子词,查找这些子词的向量,然后取这些子词向量的平均值。fastText
的 Python API
可以自动执行这些操作,但如果使用其他 API
(如 Gensim
或 NumPy
)访问 fastText
字词嵌入,则需要手动执行。
3. 句子嵌入和段落嵌入
生成句子嵌入 (Sentence Embedding
) 和段落嵌入 (Paragraph Embedding
) 的一种简单但有效的方法是,对其组成词的单词向量进行平均,尽管已经有多种句子和段落嵌入方法提出,但通常首先尝试使用单词向量的平均值作为基准。
句子(和段落)嵌入也可以通过将其视为一个单词序列,并使用标准单词向量表示进行创建,以任务优化的方式生成。将词向量序列作为输入来训练一个网络,以完成某个特定任务。通常情况下,从网络的某些较深层(分类层之前)提取的向量往往会产生非常好的序列向量表示,但这些向量往往仅适用于特定任务,作为通用向量表示的用途有限。
Kiros
等人提出了一种生成适用于跨任务的句子通用向量表示的方法,利用从书籍中的文本连续性构建编码器-解码器模型,由编码器-解码器网络构建的单词序列的向量表示通常被称为思维向量 (Thought Vector
),思维向量是对文本的含义、上下文和关系的高维空间中的数值表示,就像我们理解某个陈述或概念背后的思想一样,模型经过训练可以预测给定句子周围的句子。虽然像 Word2Vec 或 GloVe 这样的词嵌入代表了单个单词在固定向量空间中的表示,但思维向量通常与整个句子或文本片段相关联,这些向量旨在捕捉比词嵌入更复杂的含义,因为词嵌入通常关注单个单词的表示,而没有考虑句子层面的上下文。因此,思维向量对于需要理解文本整体含义的任务(如文本生成、摘要生成或情感分析)更为有效。模型的工作原理与 skip-gram (根据给定的单词预测周围的单词)非常相似,因此,这些句子向量被称为 skip-thought
向量,skip-Thoughts
模型为每个句子生成大小为 2048
的向量。
Google
通用句子编码器提供了更易用的句子嵌入,可在 TensorFlow Hub
上获得,在实现方面,有两种不同的编码器类型。第一种方式快速但准确性较低,基于 Iyer
等人提出的深度平均网络 (Deep Averaging Network
, DAN
),结合了单词和二元组的嵌入,并通过全连接网络处理;第二种方式准确性更高但速度较慢,基于 Vaswani
等人提出的 transformer
网络的编码器部分。
与 ELMo 类似,Google
通用句子编码器也可以从 TensorFlow Hub
加载到 TensorFlow
代码中,接下来,调用此模型处理 2
个句子样本:
embed = hub.load("https://tfhub.dev/google/universal-sentence-encoder-large/4")
embeddings = embed(["I like watching movie", "I do not like eating apple"])["outputs"]
print(embeddings.shape)
输出为 (2, 512)
,即每个句子用一个大小为 512
的向量表示。需要注意的是,Google
通用句子编码器可以处理任意长度的单词序列,因此可以同时获取单词嵌入或段落嵌入。但随着序列长度变长,嵌入的质量往往会降低。
在 Word2Vec
提出后不久,Le
和 Mikolov
提出来早期的长序列(如段落和文档)嵌入方法,这种方法称为 Doc2Vec
或 Paragraph2Vec
。Doc2Vec
算法是 Word2Vec
的扩展,利用周围的单词来预测一个单词。在 Doc2Vec
的情况下,在训练期间提供了一个额外的参数——段落 ID
。在训练结束时,Doc2Vec
网络学习了每个单词的嵌入和每个段落的嵌入。在推理过程中,网络接收一个带有一些缺失单词的段落,使用段落的已知部分生成一个段落嵌入,然后利用这个段落嵌入和单词嵌入来推断段落中缺失的单词。Doc2Vec
算法有两种变体——段落向量-分布式记忆 (Distributed Memory version of Paragraph Vector
, PV-DM
) 和段落向量-分布式词袋 (Distributed Bag of Words version of Paragraph Vector
, PV-DBOW
),与 Word2Vec
中的 CBOW
和 skip-gram
类似。Gensim
库提供了预构建的 Doc2Vec
实现,我们也可以用自定义语料库进行训练。
相关链接
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)——词嵌入技术详解