目次
1.词嵌入的作用
2.嵌入矩阵的盘算
3.Embedding层的代码实行
词嵌入(Embedding)技能是一种将词汇映射到低维连续向量空间的方法。将离散的单词数据处置处罚成连续且固定长度的向量,使模子可以学习和处置处罚语义信息。
假设须要将["Are", "you", "OK","?"]转换成向量的情势作为神经网络的输入。
将["Are", "you", "OK","?"]转换为4*4的向量矩阵。
1.词嵌入的作用
- 捕获语义关系
- 词嵌入可以大概将词汇映射到低维向量空间中,使得语义相近的词在向量空间中的位置也相近。比方,“国王”“皇后”“王子” 等词的向量会比力靠近,由于它们在语义上有肯定的关联性。
- 这种特性有助于盘算机更好地明白词汇之间的语义关系,从而进步天然语言处置处罚任务的精确性。
- 丰富语义信息
- 词向量不但仅是简朴的数字表现,它还蕴含了词汇的多种语义信息。比方,一个词的向量大概包罗了其词性、词义、感情倾向等方面的信息。
- 这使得盘算机在处置处罚天然语言时可以大概更全面地思量词汇的各种特性,从而做出更精确的判定。
- 低落数据维度
- 在天然语言处置处罚中,词汇的数目通常非常巨大。如果采取传统的独热编码(one-hot encoding)方式表现词汇,向量的维度会非常高,且数据希罕。词嵌入将词汇表现为低维向量,有用地低落了数据的维度。
- 降维后的向量不但更易于存储和盘算,还能淘汰盘算资源的斲丧,进步算法的运行服从。
- 加快盘算过程
- 低维向量之间的盘算速率通常比高维希罕向量更快。在天然语言处置处罚任务中,如文天职类、呆板翻译等,须要频仍地皮算词汇之间的相似度或举行矩阵运算。词嵌入提供的低维向量可以大概加快这些盘算过程,进步算法的实行速率。
将高维的希罕向量转换为浮点数的低维连续向量
举行PCA降维,可以发现语义相近的词语词语对应的向量位置也更相近。
具体来说,词嵌入技能具有以下几个告急作用:
起首,它有用地将天然语言中的词语,转换为数值向量表达词语之间的语义关系。如许一来,盘算机可以更好地明白词语的寄义和它们之间的关系,从而进步天然语言处置处罚任务的精确性。
其次,词嵌入技能可以大概低落数据的维度,淘汰盘算量和存储空间的需求。相比于传统的独热编码方式,词嵌入向量更加紧凑和高效。
别的,词嵌入技能为各种天然语言处置处罚任务提供了丰富的语义信息。这些信息可以被用于文天职类、感情分析、呆板翻译等任务中,资助模子更好地明白和处置处罚天然语言文本。
总之,词嵌入技能是天然语言处置处罚范畴中的一项告急技能,它为更高级的天然语言处置处罚任务提供了有力的支持。
2.嵌入矩阵的盘算
假设现在须要将["Are", "you", "OK","?"]中的每个词转换为128维的向量。
基于矩阵相乘的方法表明:
基于索引查找的方法表明
一、基于神经网络的方法
- Word2Vec
- FastText
- FastText 在 Word2Vec 的底子上举行改进,可以大概处置处罚词的子词信息。它将每个词表现为字符 n-gram 的聚集,然后通过神经网络学习词向量和子词向量。
- 在盘算词嵌入矩阵时,FastText 会思量词的全局信息和子词信息,从而进步对低频词和生僻词的表现效果。
二、基于矩阵分解的方法
- 埋伏语义分析(Latent Semantic Analysis,LSA)
- 非负矩阵分解(Non-negative Matrix Factorization,NMF)
- NMF 是另一种矩阵分解方法,它要求分解后的矩阵元素都好坏负的。对于词 - 文档矩阵X,NMF 试图找到两个非负矩阵W和H,使得X~=WH。
- 矩阵W的每一行对应一个词的低维向量表现,即词嵌入矩阵。在练习过程中,通过最小化重构偏差来调解W和HH的参数。
三、基于全局词频统计的方法
- GloVe
- GloVe(Global Vectors for Word Representation)基于全局词频统计信息来学习词向量。它通过构建词 - 词共现矩阵X,此中Xij表现词i和词j在语料库中共同出现的次数。
- GloVe 界说了一个丧失函数,通过最小化这个丧失函数来学习词向量。丧失函数思量了词的局部上下文窗口和全局统计信息,可以大概有用地捕获词语的语义和语法关系。
- 终极得到的词向量构成了词嵌入矩阵。
3.Embedding层的代码实行
- from torchtext.vocab import Glove #导入GloVe词向量
- # 简单介绍一下Glove词向量,它是斯坦福大学的研究者在2014年开发和发布的GloVe和word2vec与fasttext, # 是当前最常用的3个词向量版本
- # 6B表示了模型是基于60亿个单词的语料库训练的在300表示一个单词,使用300维的向量表示
- glove =GloVe(name='6B',dim=300)
复制代码- # 使用nn.Embedding创建词嵌入层将qlove.vectors,通过from pretrained接口,导入到Embedding层中
- # 此时的embedding层,就载入了Glove词向量数据
- embedding = nn.Embedding.from_pretrained(glove.vectors)
- # 打印embedding层中的weiqht的尺寸
- print(f"embedding.shape :{embedding.weight.shape}")
复制代码 步调输出:
embedding.shape: torch.size([400000,300])
- #将man、king、queen等8个词语的词问量,绘制到二维平面上
- words =['man', 'woman', 'king', 'queen', 'dog', 'mother', 'father']
- indices =[]
- for word in words: #将单词word,通过glove的词汇表,转换为单词的索引
- index = glove.stoi[word] #将这些索引保存到indices数组中
- indices.append(index) # 打印单词word和索引index的对应关系
- print(f"{word}->{index}")
复制代码- #将索引列表,使用torch.tensor,转为张量的形式
- indices = torch.tensor(indices) # 将索引列表转换为,词向量的矩阵
- vectors =embedding(indices).detach().numpy() #打印vector的尺寸
- print(f"vectors.shape:{vectors.shape}")
复制代码 输出效果:
- from sklearn.decomposition import PCA
- import matplotlib.pyplot as plt
- # 使用PCA降维算法,将向量vectors进行降维
- pca = PCA(n_components=2)
- vectors_2d = pca.fit_transform(vectors)
- # 将单词和向量,绘制到二维平面上
- plt.scatter(vectors_2d[:, 0], vectors_2d[:, 1])
- for i, word in enumerate(words):
- plt.annotate(word,
- xy=(vectors_2d[i, 0], vectors_2d[i, 1]),
- xytext=(-10, 10),
- textcoords='offset points')
- plt.show()
复制代码 参考链接:
【学习Transformer,应该从词嵌入WordEmbedding开始】
|