为什么需要编码和解码?

在机器学习中,算法通常无法直接处理文字或类别,需要先将它们转化为数值才能输入模型。

编码器的作用是接收输入序列,并将其转换成固定长度的上下文向量(context vector)。这个向量是输入序列的一种内部表示,捕获了输入信息的关键特征。在自然语言处理的应用中,输入序列通常是一系列词语或字符。

Embedding 编码 和 One-hot 编码的比较

One-hot编码Embedding编码是机器学习和深度学习中常用的两种数据表示方法,主要用于将类别数据或离散数据转换成神经网络可以处理的数值向量。

1. One-hot编码

One-hot编码是一种简单的、常用于处理分类变量的表示方法。每个类别被表示为一个只有一个位置为1,其余位置全为0的二进制向量。

特点:

  • 稀疏表示:对于有 ( N ) 个类别的分类变量,每个类别都会被编码为一个长度为 ( N ) 的向量,只有该类别对应的位置是1,其它位置是0。
  • 无嵌入信息:不同类别之间没有相似性或顺序上的信息,所有类别被认为是完全独立的。

举例:

假设你有三个类别:“苹果”、“橙子”和“香蕉”,用One-hot编码如下表示:

  • “苹果” = [1, 0, 0]
  • “橙子” = [0, 1, 0]
  • “香蕉” = [0, 0, 1]

如果有1000个类别,One-hot编码的向量长度就是1000,虽然每个向量只有一个1,但需要存储很多0,这使得它在大规模分类问题中效率较低。

优点:

  • 简单直观:One-hot编码很容易理解和实现。
  • 适用于小型分类问题:如果类别数较少,One-hot编码是一个不错的选择。

缺点:

  • 向量维度高:随着类别数量的增加,One-hot编码的维度会非常高,导致内存占用增加。
  • 没有表达类别之间的关系:所有类别被认为是独立的,没有任何相似性信息。

2. Embedding编码

Embedding编码是一种密集的、低维度的表示方法,通常用于表示高维度的类别数据或者词汇。Embedding是通过将离散的类别映射到连续的实数向量空间中,使得类别之间的相似性可以通过向量之间的距离表示。

特点:

  • 密集表示:每个类别被编码为一个长度相对较小的实数向量,而不是一个高维的稀疏向量。
  • 学习得到的表示:Embedding通常是通过模型训练得到的,模型会根据任务的目标自动调整Embedding向量,使得相似的类别会有相似的向量表示。
  • 适合大规模数据:Embedding编码能够处理大规模的类别数据,特别适合用于处理文本数据中的词汇表示。

举例:

假设我们仍然有“苹果”、“橙子”和“香蕉”这三个类别,经过Embedding编码,它们可能被映射到一个2维的向量空间中:

  • “苹果” = [0.25, 0.78]
  • “橙子” = [0.31, 0.81]
  • “香蕉” = [0.15, 0.67]

这些向量不再是稀疏的0和1的表示,而是实数值。模型通过学习这些向量,使得相似的类别(如“苹果”和“橙子”)可能在向量空间中距离较近。

优点:

  • 低维度和密集表示:Embedding向量维度较低,适合处理类别数量非常大的数据集,如词汇表。
  • 表达类别之间的关系:Embedding能够捕捉类别之间的相似性和关系,使得相似类别在向量空间中距离较近。
  • 灵活性强:Embedding可以通过模型进行优化,使其适应具体的任务需求。

缺点:

  • 需要训练:Embedding通常需要通过模型训练来得到,如果训练数据不足,Embedding可能无法有效表达类别之间的关系。
  • 解释性较差:相比One-hot编码,Embedding向量的物理意义不直观,难以解释具体维度的含义。

总结

  • One-hot编码是一种简单的、易于实现的高维稀疏表示,适合类别数量较少且没有类别关系的场景。
  • Embedding编码是一种低维密集表示,通过模型训练可以捕捉类别之间的相似性,适合类别数量多、存在复杂关系的场景,如自然语言处理中的词向量表示。

在实际应用中,One-hot编码多用于简单分类任务,而Embedding编码通常用于处理复杂的、高维度的类别数据,比如文本、推荐系统等领域。

词向量

词向量(Word Vector)
词向量是一种深度学习技术,旨在将词语映射到一个高维空间中,使得相似的词语在空间中距离较近。词向量可以捕捉到词语之间的语义关系和相似度。例如,如果我们有三个词语 [“cat”, “dog”, “bird”],词向量后的结果将是:

  • cat: [0.1, 0.2, 0.3, …] (维度为 100)
  • dog: [0.4, 0.5, 0.6, …] (维度为 100)
  • bird: [0.7, 0.8, 0.9, …] (维度为 100)

词向量的优点是:

  • 能够捕捉到词语之间的语义关系和相似度。
  • 可以减少维度灾难,因为词向量的维度可以远小于 One-Hot 编码。

词向量的缺点是:

  • 需要大量的计算资源和数据来训练模型。
  • 训练时间较长。

word2vec

Word2Vec是一个常用的词嵌入(word embedding)技术,用来将文本中的词转换成连续的、低维的向量。它通过捕捉词汇的上下文关系,学习到能够表示词语语义的向量。这种向量能反映出词汇之间的相似性,例如“苹果”和“橙子”可能会有相似的向量,因为它们都是水果。

Word2Vec的核心思想

Word2Vec的基本理念是:“相似上下文中的词应该有相似的向量表示”。它的原理可以简单理解为:如果两个词经常出现在相似的上下文中,那么它们的向量应该在向量空间中距离很近。

Word2Vec有两种主要的模型:

  1. CBOW(Continuous Bag of Words):根据上下文来预测中间的词。
  2. Skip-gram:根据一个词来预测它的上下文。

1. CBOW模型

  • 目标:给定上下文,预测中心词。
  • 举例:假设句子是“我喜欢吃苹果”,在CBOW模型中,我们会使用“我”、“喜欢”和“吃”作为上下文来预测“苹果”这个词。

这个模型通过考虑上下文中的多个词来训练,使得模型能更好地预测中心词,从而学到每个词的语义表示。

2. Skip-gram模型

  • 目标:给定一个词,预测它的上下文。
  • 举例:同样的句子“我喜欢吃苹果”,在Skip-gram模型中,我们使用“苹果”这个词来预测它周围的词“我”、“喜欢”和“吃”。

Skip-gram适用于小数据集并且效果较好,因为它能够更好地捕捉到稀有词汇的上下文。

Word2Vec的训练过程

无论是CBOW还是Skip-gram,它们的训练目标都是通过神经网络将词汇映射到一个低维的向量空间。在训练的过程中,Word2Vec会不断调整这些向量,使得相似的词语在向量空间中距离更近。

  • 输入层:输入的是词汇的One-hot编码(即每个词都表示为一个高维稀疏向量)。
  • 隐藏层:这层是我们希望学习到的词嵌入向量的维度,通常为100到300维。
  • 输出层:CBOW模型的输出是词汇表中的所有词的概率分布,模型会尝试预测出正确的中心词。

经过训练后,模型会学到一个嵌入矩阵,每个词的嵌入向量就保存在这个矩阵中。这个嵌入向量就是Word2Vec的输出,能够捕捉到词语的语义。

Word2Vec的优点

  • 低维表示:将词语表示为密集的向量,而不是高维的One-hot编码。
  • 捕捉语义关系:学到的向量能够捕捉到词汇之间的语义相似性,例如“国王 - 男人 + 女人 = 女王”。

model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)

  • sentences:输入的句子列表。
  • vector_size:词向量的维度。
  • window:窗口大小,表示在训练时考虑的上下文词语的数量
  • min_count: 最小词语频率。只有频率大于或等于这个值的词语才会被纳入模型。默认值为 1
  • workers: 并行处理的 worker 数量。默认值为 3。

Transformer编码器和Word2Vec的对比

Transformer编码器Word2Vec虽然都是自然语言处理中的重要技术,但它们在设计理念、功能和应用上有显著差异。让我们逐步对比它们的不同点:

1. 静态 vs 动态嵌入

  • Word2Vec:生成的是静态嵌入。也就是说,训练完模型后,每个词都会有一个固定的向量表示,词的含义不随上下文变化。例如,“bank”在所有场景中都对应相同的向量,无论它指的是“银行”还是“河岸”。
  • Transformer编码器:生成的是动态上下文嵌入。Transformer通过自注意力机制,使得词的表示能够根据它在句子中的上下文动态变化。例如,“bank”在不同上下文中会生成不同的嵌入表示,反映出它的不同含义。

2. 上下文处理能力

  • Word2Vec:仅能捕捉局部上下文信息。Word2Vec的模型(例如CBOW或Skip-gram)使用了固定的窗口大小,意味着它只能利用词汇前后有限的几个词进行预测。模型没有全局视角,无法很好地处理长距离依赖关系。
  • Transformer编码器:使用全局上下文信息。Transformer的自注意力机制能够让每个词都能与句子中的所有其他词交互,从而捕捉到长距离依赖关系。这样,Transformer能够更好地理解句子的整体含义,尤其是在复杂的语言现象中。

3. 训练方式

  • Word2Vec:是基于浅层神经网络的模型,通常使用类似于Skip-gram或CBOW这样的简单架构来预测词与上下文之间的关系。模型只关注词汇和其局部上下文之间的关系,没有更深层次的网络结构。
  • Transformer编码器:是基于深层神经网络的架构,通常包含多个层级的编码器。每个编码器层都有多头自注意力机制和前馈神经网络,可以通过层层叠加的方式,逐步学习到更复杂的特征和表示。

4. 处理序列的方式

  • Word2Vec:使用的模型没有内置的位置感知机制,也就是说,Word2Vec无法捕捉词序信息。虽然它能够学习到词与词之间的语义关系,但不能很好地区分词的前后顺序。
  • Transformer编码器:采用了位置编码(Positional Encoding)来处理词序信息。因为Transformer不依赖于序列结构,它通过位置编码将位置信息显式添加到词嵌入中,帮助模型理解词序对句子意义的重要性。

5. 模型的输出

  • Word2Vec:输出的是每个词的静态向量表示,不随着任务或上下文变化。它的输出在某种程度上表示了词的全局语义相似性。
  • Transformer编码器:输出的是每个词的动态向量表示,这些表示不仅与词的本身有关,还包含它在上下文中的关系。因此,Transformer的输出是针对特定句子上下文的嵌入,捕捉到了句子层次的语义信息。

6. 计算复杂度

  • Word2Vec:由于是浅层网络,计算量较小,训练速度较快,适用于快速生成词嵌入。它的计算复杂度与词汇量和嵌入维度成线性关系。
  • Transformer编码器:由于有多层自注意力机制,其计算复杂度较高,尤其是当处理长序列时,自注意力的计算复杂度是**O(n^2)**(n是序列长度)。因此,Transformer虽然功能强大,但对硬件要求较高。

7. 语义表达能力

  • Word2Vec:虽然能够捕捉词语的语义相似性,但由于它是静态的,不能处理多义词和上下文变化。因此,它的语义表达能力有限,特别是在处理复杂句子结构时。
  • Transformer编码器:能够通过自注意力机制捕捉句子中每个词的上下文关系,因此语义表达能力更强,能够处理多义词以及更复杂的句法和语义结构。

具体对比总结

特性 Word2Vec Transformer编码器
嵌入类型 静态嵌入(同一词的向量固定) 动态上下文嵌入(根据上下文生成不同向量)
上下文处理能力 局部上下文 全局上下文
训练模型 浅层神经网络 深层神经网络,多层自注意力
位置信息 无法处理词序 使用位置编码捕捉词序
模型输出 词的固定向量表示 词在特定上下文中的动态向量表示
计算复杂度 较低,训练快速 较高,计算复杂,尤其是在长序列下
语义表达能力 较弱,无法处理多义词 强大,能处理多义词和复杂语义

小结

  • Word2Vec是一种静态的词嵌入方法,适用于简单的NLP任务,如相似度计算和分类,但它不能处理上下文变化或长距离依赖。
  • Transformer编码器通过自注意力机制,生成动态的上下文敏感嵌入,能够更好地捕捉词汇在句子中的语义关系,是现代语言模型(如BERT、GPT等)的基础架构。

因此,Transformer编码器可以看作是词嵌入技术的发展和延伸,提供了比Word2Vec更丰富、更上下文相关的词语表示。