[DL]词向量

文本表示方法

  • 词袋模型(bag of words):one-hot、tf-idf
  • 主题模型:LSA(SVD)、pLSA、LDA
  • 基于词向量的固定表征:Word2Vec、FastText、Glove
  • 基于词向量的动态表征:ELMO、GPT、BERT

词向量是自然语言处理中的一种表示方法,用于将单词转换成数值向量。在传统的文本处理中,计算机难以理解和处理文字,因为它们是离散的符号,难以进行数学运算。词向量的出现解决了这个问题,它将单词映射到一个连续的向量空间中,使得单词的语义信息可以以数值形式进行表示和处理。

简单来说,词向量是一种将单词转换为连续向量表示的方法,有助于计算机理解和处理自然语言。

词向量的主要思想是,具有相似语义的单词在向量空间中会有相近的距离。这意味着通过比较向量之间的距离或相似度,可以衡量单词之间的语义关系。

词袋模型

词袋模型是最初进行文本表示的方式,基于文本中的词汇频率信息,忽略了单词之间的顺序和语法结构,将文本表示为一个由词汇构成的集合,每个词汇对应一个特征,其值表示该词汇在文本中的出现频率或重要性。

  • one-hot:在one-hot编码中,每个特征值被表示为一个唯一的二进制向量,其中只有一个元素为1,其余元素为0。首先,需要确定离散特征的取值范围,也称为特征空间。特征空间是包含所有可能特征值的集合。对于每个离散特征值,创建一个全零向量,并将对应索引位置的元素设置为1。

    one-hot编码可能导致高维度的稀疏向量表示,特别是当特征空间很大时。

  • tf-idf:是一种衡量词语在文本中重要性的统计方法。TF(词频)指的是一个给定的词语w在该文档中出现的次数,IDF(逆文档频率)是log(语料库的文档总数D/包含该词的文档数d),公式如下
    T F = n N I D F = l o g ∣ D ∣ ∣ d ∣ T F − I D F = T F ∗ I D F TF= \frac{n}{N} \\ IDF= log\frac{|D|}{|d|} \\ TF-IDF=TF*IDF TF=NnIDF=logdDTFIDF=TFIDF
    TF-IDF的结果是一个向量,其中每个维度对应于文本中的一个词汇。该向量用于表示文本的特征,其中每个维度的值表示相应词汇在文本中的重要性。

    tf-idf使罕见的单词更加突出并且有效地忽略了常用单词,但忽略了位置和上下文语义,仅考虑了统计特征。

主题模型

主题模型可以从文本数据中学习到主题-单词分布,其中每个主题对应一个特定的词语权重。这些主题-单词分布可以被看作是隐含的词向量表示,其中每个主题可以被视为一个语义概念,而每个单词的权重则表示该单词与该主题的相关性。

LSA

LSA是一种用于文本分析和文本挖掘的技术,旨在从文本数据中捕捉和表示潜在的语义信息。LSA使用基于矩阵分解的方法,将文本转换为一个低维的语义空间,从而实现对文本的降维和语义表示。

通常首先使用TfidfVectorizer类将文本数据转换为TF-IDF矩阵,用作LSA的输入矩阵。接下来,使用TruncatedSVD类来执行LSA的降维操作。通过指定n_components参数,我们可以指定降维后的维度。最后,输出每个文档的LSA表示结果。降维后的结果是一个n_components维向量,其中每个维度代表了文档在语义空间中的投影。

pLSA

pLSA是一种概率模型,用于从文本数据中学习潜在的语义结构。与LSA类似,pLSA也是一种基于矩阵分解的方法,但它引入了概率模型来建模文档和主题之间的关系。

LDA

LDA是一种概率生成模型,用于从文本数据中学习主题的分布以及文档和主题之间的关系。LDA是一种基于贝叶斯推断的方法。

基于词向量的固定表征

基于词向量的固定表征是一种常见的文本表示方法,将文本中的每个词都映射为一个固定长度的向量。这种表示方法的核心思想是通过训练一个词嵌入模型,将词语转换为密集的词向量,以捕捉词语之间的语义关系。这种方法忽略了词汇的顺序信息,只关注词汇的存在与否或简单的统计特征。

相比较词袋模型,其具有以下优势:

  • 维度低:one-hot编码中很多都是0,没有被利用,固定表征降低了文本表示维度且每个维度都有意义。
  • 语义信息丰富:词向量捕捉到了词语之间的语义关系,使得具有相似含义的词在向量空间中更加接近,从而丰富了文本表示的语义信息。
  • 通用性:通过预训练的词嵌入模型,可以在不同的任务和数据集上共享词向量,从而充分利用了大规模语料库的信息。
  • 计算效率:一旦词向量训练完成,获取词语的向量表示非常高效,可以快速地对大量文本进行表示。

但仍然存在一些问题:

  • 无法处理未登录词:基于词向量的固定表征无法处理未在训练语料中出现的词语,因为它们没有对应的词向量表示。
  • 忽略上下文信息:固定表征只关注词语本身的表示,忽略了词语之间的上下文信息。

下面介绍几种常用的词嵌入模型。

Word2Vec

Word2Vec是一种广泛使用的词嵌入模型,它通过学习将词语映射到高维向量空间中,以捕捉词语之间的语义关系。Word2Vec模型有两个主要的架构:连续词袋模型(Continuous Bag-of-Words,简称CBOW)和skip-gram模型。这两种架构在训练过程中都使用了神经网络,并通过上下文词语的信息来预测目标词语。

CBOW

根据上下文词语来预测目标词语。

首先,我们根据文本数据构建词汇表,并为每个词语分配一个唯一的索引。然后,我们使用上下文窗口大小来生成训练样本,每个样本包含目标词语和其上下文词语。

接下来,我们构建CBOW模型,包括嵌入层、平均池化层和全连接层。

然后,我们编译模型并使用训练数据进行训练。

最后,我们可以获取训练后的词向量,并根据需要进行后续的操作。

在这里插入图片描述

输入单词被onehot编码过。

skip-gram

根据目标词语来预测上下文词语。实现流程与CBOW相似,模型和数据样本构建略有不同。CBOW需要对输出层的向量进行加和平均。CBOW目标词与其window内所有上下文构成一个数据,skip-gram目标词与每个上文词构成一个数据。

在这里插入图片描述

在实际应用中,可以直接调用库函数,简单使用的例子如下所示。默认情况下,gensim的Word2Vec模型是使用skip-gram算法进行训练的。如果要使用CBOW算法,可以通过设置sg参数来指定算法类型。

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

# 加载语料库数据
corpus_path = 'corpus.txt'  # 语料库文件路径
sentences = LineSentence(corpus_path)
# 配置 Word2Vec 模型参数
embedding_dim = 100  # 词向量维度
window_size = 5  # 上下文窗口大小
min_count = 5  # 最小词频阈值
workers = 4  # 并行处理的线程数
# 训练 Word2Vec 模型
model = Word2Vec(sentences, size=embedding_dim, window=window_size, min_count=min_count, workers=workers)  # sg=0
# 获取词向量
word_vectors = model.wv
# 获取词语的词向量
vector = word_vectors['cat']
print(f"Vector representation of 'cat': {vector}")

FastText

word2vec把语料库中的每个单词当成原子的,它会为每个单词生成一个向量。这忽略了单词内部的形态特征,比如:“apple” 和“apples”,两个单词都有较多公共字符,即它们的内部形态类似,但是在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失了。

为了克服这个问题,fastText使用了字符级别的n-grams来表示一个单词。对于单词“apple”,假设n的取值为3,则它的trigram有

“<ap”, “app”, “ppl”, “ple”, “le>”  # <:前缀, >:后缀

我们可以用这些trigram来表示“apple”这个单词,进一步,我们可以用这5个trigram的向量叠加来表示“apple”的词向量。

一般情况下,使用fastText进行文本分类,同时会产生词的embedding,即embedding是fastText分类的产物。

在这里插入图片描述

fastText的输入是多个单词及其n-gram特征。

Glove

基于上述叙述的相关获取词向量的方法,可以总结出获取词向量的两种基本的思路:

  1. 利用全局统计信息,进行矩阵分解来获取词向量,这样获得的词向量往往在词语相似性任务上表现不好;
  2. 利用局部上下文窗口单独训练,但是没有很好的利用到统计信息。

Word2Vec在学习词与词间的关系上有了大进步,但是它有很明显的缺点:只能利用一定窗口长度的上下文环境,即利用局部信息,没法利用整个语料库的全局信息。

Glove对Word2Vec的这个缺点进行改进,运用到全局的语料信息。

GloVe的原理主要基于两个思想:

  • 共现统计:在大规模文本数据中,词汇之间的共现频率可以提供有关它们之间语义关系的信息。如果两个词汇经常在上下文中一起出现,那么它们可能具有相似的含义。
  • 向量空间:词汇的含义可以由向量表示来捕捉。通过将词汇映射到一个连续的向量空间,并使得语义相似的词汇在这个向量空间中彼此接近,我们可以获得词汇的分布式表示。

GloVe算法的核心思想是最小化共现统计的差异和向量空间中的距离。通过以下步骤学习词向量:

  1. 构建共现矩阵:对于给定的语料库,构建一个词汇-词汇的共现矩阵。共现矩阵的每个元素表示两个词汇在window内上下文中共同出现的频率。举例说明如下

    假设有以下两个句子作为我们的语料库:
    "I like to eat bananas."
    "I like to eat apples."
    设置window=2,在第一句话中,我们可以得到以下共现关系:
    ("I", "like"), ("I", "to"), ("like", "to"), ("like", "eat"), 
    ("to", "eat"), ("to", "bananas"), ("eat", "bananas")
    在第二句话中,我们可以得到以下共现关系:
    ("I", "like"), ("I", "to"), ("like", "to"), ("like", "eat"), 
    ("to", "eat"), ("to", "apples"), ("eat", "apples")
    那么共现矩阵表现为:
            I  like  to  eat  bananas  apples
    I       0   2     2   2    1        1
    like    2   0     2   2    1        1
    to      2   2     0   2    1        1
    eat     2   2     2   0    1        1
    bananas 1   1     1   1    0        0
    apples  1   1     1   1    0        0
    
  2. 定义损失函数

    GloVe使用一个损失函数来衡量词汇之间的共现统计与词向量之间的关系。该损失函数将最小化共现矩阵中的差异与词汇之间的向量距离之间的差异。
    J = ∑ i , j = 1 V f ( X i j ) ( w i T w ~ j + b i + b ~ j − log ⁡ ( X i j ) ) 2 J = \sum_{i,j=1}^{V} f(X_{ij}) \left( \mathbf{w}_i^T \tilde{\mathbf{w}}_j + b_i + \tilde{b}j - \log(X{ij}) \right)^2 J=i,j=1Vf(Xij)(wiTw~j+bi+b~jlog(Xij))2
    V是词汇表的大小,Xij是共现矩阵中词汇i和词汇j共同出现的频率,w表示词汇i和词汇j的词向量,f(Xij)是一个权重函数,用于调整共现次数的权重,可以是线性函数也可以是其他形式的函数。

  3. 迭代优化

    通过迭代优化算法(如随机梯度下降),更新词汇的向量表示,使得损失函数逐步减小。

基于词向量的动态表征

基于词向量的动态表征方法将每个词汇表示为一个向量,并通过对这些词向量进行组合和操作来获得整个文本的表示。在动态表征方法中,词向量的值可以根据上下文或任务动态地进行调整和更新。

ELMO

ELMO是一个RNN-based的语言模型,其任务是学习句子中的下一个单词或者前一个单词是什么。它是一个双向的RNN网络,这样每一个单词都对应两个hidden state,进行拼接便可以得到单词的Embedding表示。当同一个单词上下文不一样,得到的embedding就不同。

在ELMO中,一个单词会得到多个embedding,对不同的embedding进行加权求和,可以得到最后的embedding用于下游任务。要说明一个这里的embedding个数,下图中只画了两层RNN输出的hidden state,其实输入到RNN的原始embedding也是需要的,所以你会看到说右下角的图片中,包含了三个embedding。

在这里插入图片描述

GPT

GPT采用多层Transformer Decoder作为特征抽取器。使用单向信息学习一个语言模型,对句子进行无监督的 Embedding。

BERT

GPT采用多层Transformer Encoder作为特征抽取器。使用双向信息学习一个语言模型,对句子进行无监督的 Embedding。

各词向量间的对比

各种词向量的特点

one-hot 表示 :维度灾难、语义鸿沟

分布式表示(分布式假设:相同上下文语境的词有似含义):

  • 矩阵分解(LSA):利用全局语料特征,但SVD求解计算复杂度大
  • 基于NNLM/RNNLM的词向量:词向量为副产物,存在效率不高等问题
  • Word2Vec、FastText:优化效率高,但是基于局部语料
  • Glove:基于全局预料,结合了LSA和word2vec的优点
  • ELMO、GPT、BERT:动态特征,解决了其他方法中无法满足一词多义的情况

方法之间的区别

  • word2vec vs NNLM

    其本质都可以看作是语言模型;

    词向量只不过NNLM一个产物,word2vec虽然其本质也是语言模型,但是其专注于词向量本身,因此做了许多优化来提高计算效率:

    • 与NNLM相比,词向量直接sum,不再拼接,并舍弃隐层;
    • 考虑到sofmax归一化需要遍历整个词汇表,采用hierarchical softmax 和negative sampling进行优化,hierarchical softmax 实质上生成一颗带权路径最小的哈夫曼树,让高频词搜索路劲变小;negative sampling更为直接,实质上对每一个样本中每一个词都进行负例采样;
  • word2vec vs fastText

    都可以无监督学习词向量, fastText训练词向量时会考虑subword;

    fastText还可以进行有监督学习进行文本分类,其主要特点:

    • 结构与CBOW类似,但学习目标是人工标注的分类结果;
    • 采用hierarchical softmax对输出的分类标签建立哈夫曼树,样本中标签多的类别被分配短的搜寻路径;
    • 引入N-gram,考虑词序特征;
    • 引入subword来处理长词,处理未登陆词问题;
  • word2vec vs glove vs LSA

    glove vs LSA

    LSA(Latent Semantic Analysis)可以基于共现构建词向量,实质上是基于全局语料采用SVD进行矩阵分解,然而SVD计算复杂度高;

    glove可看作是对LSA一种优化的高效矩阵分解算法,采用Adagrad对最小平方损失进行优化;

    word2vec vs glove

    word2vec是局部语料库训练的,其特征提取是基于滑窗的;而glove的滑窗是为了构建co-occurance matrix,是基于全局语料的,可见glove需要事先统计共现概率;因此,word2vec可以进行在线学习,glove则需要统计固定语料信息。

    word2vec是无监督学习,同样由于不需要人工标注;glove通常被认为是无监督学习,但实际上glove还是有label的,即共现次数。

    word2vec损失函数实质上是带权重的交叉熵,权重固定;glove的损失函数是最小平方损失函数,权重可以做映射变换。

    总体来看,glove可以被看作是更换了目标函数和权重函数的全局word2vec

  • ELMO vs GPT vs BERT

    特征提取器:elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。

    GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。

    GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。

T和bert中的Transformer可采用多层,并行计算能力强。

GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。

GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。


参考笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值