你要是想构建一个大型语言模型,首先得掌握词向量的概念。幸运的是,这个概念很简单,也是本系列文章的一个完美起点。

那么,假设你有一堆单词,它可以只是一个简单的字符串数组。

animals = ["cat", "dog", "rat", "pig"]

你没法直接用单词进行数学运算,所以必须先把它们转换成数字。最简单的方法就是用它们在数组中的索引值。

animal_to_idx = {animal: idx for idx, animal in enumerate(animals)}

animal_to_idx

Output:

当然,等你把数学运算做完,你还需要把索引转换回对应的单词。可以这样做:

idx_to_animal = {idx: animal for animal, idx in animal_to_idx.items()}

idx_to_animal

Output:

用索引来表示单词,在自然语言处理中一般不是个好主意。问题在于,索引会暗示单词之间存在某种顺序关系,而实际上并没有。

比如,我们的数据里,猫和猪之间并没有固有的关系,狗和老鼠之间也没有。但是,使用索引后,看起来猫离猪“很远”,而狗似乎“更接近”老鼠,仅仅因为它们在数组中的位置不同。这些数值上的距离可能会暗示一些实际上并不存在的模式。同样,它们可能会让人误以为这些动物之间存在基于大小或相似度的关系,而这在这里完全没有意义。

一个更好的方法是使用独热编码(one-hot encoding)。独热向量是一个数组,其中只有一个元素是 1(表示“激活”),其他所有元素都是 0。这种表示方式可以完全消除单词之间的错误排序关系。

让我们把单词转换成独热向量:

import numpy as np

n_animals = len(animals)

animal_to_onehot = {}

for idx, animal in enumerate(animals):

one_hot = np.zeros(n_animals, dtype=int)

one_hot[idx] = 1

animal_to_onehot[animal] = one_hot

animal_to_onehot

Output:

{

'cat': array([1, 0, 0, 0]),

'dog': array([0, 1, 0, 0]),

'rat': array([0, 0, 1, 0]),

'pig': array([0, 0, 0, 1])

}

可以看到,现在单词之间没有任何隐含的关系了。

独热编码的缺点是,它是一种非常稀疏的表示,只适用于单词数量较少的情况。想象一下,如果你有 10,000 个单词,每个编码都会有 9,999 个零和一个 1,太浪费内存了,存那么多零干嘛……

是时候创建更密集的向量表示了。换句话说,我们现在要做词向量(word embeddings)了。

词向量是一种密集向量(dense vector),其中大多数(甚至所有)值都不是零。在机器学习,尤其是自然语言处理和推荐系统中,密集向量可以用来紧凑而有意义地表示单词(或句子、或其他实体)的特征。更重要的是,它们可以捕捉这些特征之间的有意义关系。

举个例子,我们创建一个词向量,其中每个单词用 2 个特征表示,而总共有 4 个单词。

用 PyTorch 创建词向量非常简单。我们只需要使用 nn.Embedding 层。你可以把它想象成一个查找表,其中行代表每个唯一单词,而列代表该单词的特征(即单词的密集向量)。

import torch

import torch.nn as nn

embedding_layer = nn.Embedding(num_embeddings=4, embedding_dim=2)

好,现在我们把单词的索引转换成词向量。这几乎不费吹灰之力,因为我们只需要把索引传给 nn.Embedding 层就行了。

indices = torch.tensor(np.arange(0, len(animals)))

indices

Output:

tensor([0, 1, 2, 3])

embeddings = embedding_layer(indices)

embeddings

Output:

tensor([[ 1.6950, -2.7905],

[ 2.4086, -0.1779],

[ 0.7402, 0.0955],

[-0.5155, 0.0738]], grad_fn=)

现在,我们可以用索引查看每个单词的词向量了。

for animal, _ in animal_to_idx.items():

print(f"{animal}'s embedding is {embeddings[animal_to_idx[animal]]}")

Output:

cat's embedding is tensor([ 1.6950, -2.7905], grad_fn=)

dog's embedding is tensor([ 2.4086, -0.1779], grad_fn=)

rat's embedding is tensor([0.7402, 0.0955], grad_fn=)

pig's embedding is tensor([-0.5155, 0.0738], grad_fn=)

每个单词都有两个特征——正是我们想要的结果。

目前这些数值没啥实际意义,因为 nn.Embedding 层还没有经过训练。但一旦它被适当地训练了,这些特征就会变得有意义。

注意:

这些特征对模型来说非常关键,但对人类来说可能永远不会“有意义”。它们代表的是通过训练学到的抽象特征。对我们来说,这些特征看起来可能是随机的、毫无意义的,但对一个训练好的模型来说,它们能够捕捉到重要的模式和关系,使其能够有效地理解和处理数据。

在本系列的下一篇文章中,我们将学习如何训练词向量模型。

在 PyTorch 中理解词向量,将单词转换为有用的向量表示的更多相关文章

  1. PyTorch在NLP任务中使用预训练词向量

    在使用pytorch或tensorflow等神经网络框架进行nlp任务的处理时,可以通过对应的Embedding层做词向量的处理,更多的时候,使用预训练好的词向量会带来更优的性能.下面分别介绍使用ge ...

  2. PyTorch基础——词向量(Word Vector)技术

    一.介绍 内容 将接触现代 NLP 技术的基础:词向量技术. 第一个是构建一个简单的 N-Gram 语言模型,它可以根据 N 个历史词汇预测下一个单词,从而得到每一个单词的向量表示. 第二个将接触到现 ...

  3. NLP︱高级词向量表达(二)——FastText(简述、学习笔记)

    FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper: ...

  4. 第一节——词向量与ELmo(转)

    最近在家听贪心学院的NLP直播课.都是比较基础的内容.放到博客上作为NLP 课程的简单的梳理. 本节课程主要讲解的是词向量和Elmo.核心是Elmo,词向量是基础知识点. Elmo 是2018年提出的 ...

  5. NLP获取词向量的方法(Glove、n-gram、word2vec、fastText、ELMo 对比分析)

    自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的. 1 Glove - 基于统计方法 Glove是一个典型的基于统计的获取词向量的方 ...

  6. NLP教程(2) | GloVe及词向量的训练与评估

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...

  7. 斯坦福NLP课程 | 第2讲 - 词向量进阶

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  8. NLP︱词向量经验总结(功能作用、高维可视化、R语言实现、大规模语料、延伸拓展)

    R语言由于效率问题,实现自然语言处理的分析会受到一定的影响,如何提高效率以及提升词向量的精度是在当前软件环境下,比较需要解决的问题. 笔者认为还存在的问题有: 1.如何在R语言环境下,大规模语料提高运 ...

  9. 词向量( Distributed Representation)工作原理是什么

    原文:http://www.zhihu.com/question/21714667 4 个回答 83赞同反对,不会显示你的姓名 皮果提 刘鑫.莫教授要养猫.Starling Niohuru 等人赞同 ...

  10. PyTorch 如何理解张量:一维张量、二维张量、行/列向量、矩阵

    理解张量,并将张量与线性代数的知识连接起来,我认为最重要的是理解 tensor 的两个属性:shape 和 ndim . ndim 表示张量的维度,一维张量的 ndim 值为 1,二维张量的 ndim ...

随机推荐

  1. SSL免费证书之Let’s Encrypt

    官网:https://letsencrypt.org/zh-cn 官网建议使用Certbot的方式进行安装,所以首先我们需要安装Certbot Certbot) 官网:Certbot (eff.org ...

  2. PythonDay4Advance

    PythonDay4Advance 函数 引言:比如植物大战僵尸,这个游戏本身也是由代码编写,现在假设有一种豌豆射手,每发射一次 炮弹会执行100行逻辑代码 如果我在程序,每当需要发射炮弹的时候,都要 ...

  3. ZCMU-1153

    思路 一个感觉是规律问题的数学问题 因为输入的是n所以要的出有关n的关系或者关系 有关排序,所以可以从位次入手,设双胞胎前一个位置在ai,后一个在bi. Sum(bi-ai)=(2+3+4+5+6+. ...

  4. .NET Core 异常(Exception)底层原理浅谈

    中断与异常模型图 内中断 内中断是由 CPU 内部事件引起的中断,通常是在程序执行过程中由于 CPU 自身检测到某些异常情况而产生的.例如,当执行除法运算时除数为零,或者访问了不存在的内存地址,CPU ...

  5. 腾讯云 TStor 私有云存储获统信+海光/兆芯官方认证

    腾讯云 TStor 是一款分布式存储产品,致力于解决私有云.混合云下的各类存储需求.产品紧跟国内信创生态,持续加强自主可控能力.目前,TStor 已经支持国内主流国产操作系统和硬件,如中标麒麟操作系统 ...

  6. 3.MySQL常用函数

    常用命令 ● alter add alter table add <table_name> add <column_name> <data_type> [约束类型] ...

  7. LNMP Wordpress phpMyAdmin的部署记录

    背景 CentOS 8.2服务器,使用的虚拟服务器.只开放22与80端口.设置默认页面是wordpress的入口,phpmyadmin使用虚拟目录的形式进行访问. 安装 总体思路按照此文章进行.我进行 ...

  8. 利用shell中awk和xargs以及sed将多行多列文本中某一列合并成一行

    一.问题描述最近需要利用Shell将多行多列文本中某一列,通过指定的分隔符合并成一行.假设需要处理的文本如下: 我们主要处理的是,将用户名提取处理,合并成一行,并通过逗号进行分隔.最终的格式如下: & ...

  9. MAC brew install 跳过 update

    相信很多用 MAC 小伙伴的小伙伴都对 HomeBrew 很熟悉. 但是! 都遇到过这样的问题, 每次安装新东西, 它都要先去 update 一下, 那个耗时啊-. 怎么才能不 update, 直接安 ...

  10. 快速生成视频互动直播包含会议直播APP(Android)

    阿里云服务器推荐购买99元 首先此应用基于腾讯云实时音视频TRTC.注册腾讯云https://console.cloud.tencent.com/trtc 并完成实名认证开始. 安卓直播高级版 包括直 ...