热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一文搞懂onehot和embedding

在NLP领域,wordembedding已经成为了众所周知的技术。在现实生活中wordembedding已经拥有非常广泛的应用:语音助手、机器翻译、情感

在 NLP领域,word embedding 已经成为了众所周知的技术。在现实生活中 word embedding 已经拥有非常广泛的应用:语音助手、机器翻译、情感分析… 因为 word embedding 的特殊性,它几乎覆盖了所有 NLP 的应用。接下来说说  传统的 one-hot 编码开始,阐述其优劣,并延伸至 word embedding 技术和其优点

人类可以很轻易地理解一个单词、词组或者字母,比如「LOVE」,但机器是理解不了的。想要让机器理解单词,就必须要把它变成一串数字(向量)。下面介绍的 One-Hot Encoding(One-Hot 编码)和 Word Embedding (词嵌入)和就是把单词变成向量的两类方法


一、One-Hot Encoding (词汇表->稀疏向量)


1.首先one-hot是什么?为什么用one-hot?

一般来说,机器学习教程会推荐你或要求你,在开始拟合模型之前,先以特定的方式准备好数据;其中,一个很好的例子就是对类别数据(Categorical data)进行 One-Hot 编码

那么,什么是类别数据?类别数据是一种只有标签值而没有数值的变量。它的值通常属于一个大小固定且有限的集合。类别变量也常被称为标称值(nominal)。
下面举例说明:


  • 宠物(pet)变量包含以下几种值:狗(dog)、猫(cat)。
  • 颜色(color)变量包含以下几种值:红(red)、绿(green)、蓝(blue)。
  • 位次(place)变量包含以下几种值:第一(first)、第二(second)和第三(third)。

以上例子中的每个值都代表着一个不同的类别。有些类别彼此间存在一定的自然关系,比如自然的排序关系。上述例子中,位次(place)变量的值就有这种自然的排序关系。这种变量被称为序数变量(ordinal variable)。


2.类别数据有什么问题?

有些算法可以直接应用于类别数据。比如,你可以不进行任何数据转换,将决策树算法直接应用于类别数据上(取决于具体实现方式)。但还有许多机器学习算法并不能直接操作标签数据。这些算法要求所有的输入输出变量都是数值(numeric)。通常来说,这种限制主要是因为这些机器学习算法的高效实现造成的,而不是算法本身的限制。
但这也意味着我们需要把类别数据转换成数值形式。如果输出变量是类别变量,那你可能还得将模型的预测值转换回类别形式,以便在一些应用中展示或使用
如何将类别数据转换成数值数据:


两个方法:1.整数编码                          2.One-Hot 编码


a.整数编码:第一步,先要给每个类别值都分配一个整数值。
比如,用 1 表示红色(red),2 表示绿色(green),3 表示蓝色(blue)。这种方式被称为标签编码或者整数编码,可以很轻松地将它还原回类别值。整数之间存在自然的排序关系,机器学习算法也许可以理解并利用这种关系。比如,前面的位次(place)例子中的序数变量就是一个很好的例子。对于它我们只需要进行标签编码就够了。

b.One-Hot 编码

但对于不存在次序关系的类别变量,仅使用上述的整数编码是不够的。实际上,使用整数编码会让模型假设类别间存在自然的次序关系,从而导致结果不佳或得到意外的结果(预测值落在两个类别的中间)。这种情况下,就要对整数表示使用 One-Hot 编码了。One-Hot 编码会去除整数编码,并为每个整数值都创建一个二值变量。

再通俗一点:

将离散型特征使用one-hot编码,确实会让特征之间的距离计算更加合理。比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。

在颜色(color)的示例中,有 3 种类别,因此需要 3 个二值变量进行编码。对应的颜色位置上将被标为“1”,其它颜色位置上会被标为“0”。

red, green, blue
1, 0, 0
0, 1, 0
0, 0, 1

二、word embedding - 让计算机学会爱(词间的关系)

深度学习应用在自然语言处理当中的时候,基本都会通过词向量的方式将one-hot编码的向量,转换为词向量。至于为什么这么做,

一个原因是因为深度学习对稀疏输入效果不好,

第二个最主要原因是,那种one-hot方式的编码,对于每一个不同的单词或者中文的词语,之间关系没有办法表达出来,也即,对于不同的单词,两个单词的one-hot编码的向量的相似度永远为0, 也即cos(Vi, Vj) = 0。那么问题来了,怎样表示出单词之间的内在联系呢?embedding来了

 

要了解 embedding 的优点,我们可以对应 One-hot 编码来观察。One-hot 编码是一种最普通常见的表示离散数据的表示,首先我们计算出需要表示的离散或类别变量的总个数 N,然后对于每个变量,我们就可以用 N-1 个 0 和单个 1 组成的 vector 来表示每个类别。这样做有两个很明显的缺点:


  • 对于具有非常多类型的类别变量,变换后的向量维数过于巨大,且过于稀疏。
  • 映射之间完全独立,并不能表示出不同类别之间的关系。

因此,考虑到这两个问题,表示类别变量的理想解决方案则是我们是否可以通过较少的维度表示出每个类别,并且还可以一定的表现出不同类别变量之间的关系,这也就是 embedding 出现的目的。

Embedding 是一个将离散变量转为连续向量表示的一个方式。在神经网络中,embedding 是非常有用的,因为它不光可以减少离散变量的空间维数,同时还可以有意义的表示该变量。

我们可以总结一下,embedding 有以下 3 个主要目的:


  • 在 embedding 空间中查找最近邻,这可以很好的用于根据用户的兴趣来进行推荐。
  • 作为监督性学习任务的输入。
  • 用于可视化不同离散变量之间的关系。

这也就意味对于维基百科书籍表示而言,使用 Neural Network Embedding,我们可以在维基百科上获取到的所有 37,000 本书,对于每一篇,仅仅用一个包含 50 个数字的向量即可表示。此外,因为 embedding 是可学习的,因此在不断的训练过程中,更相似的书籍的表示在 embedding space 中将彼此更接近。
One-hot 编码的最大问题在于其转换不依赖于任何的内在关系,而通过一个监督性学习任务的网络,我们可以通过优化网络的参数和权重来减少 loss 以改善我们的 embedding 表示,loss 越小,则表示最终的向量表示中,越相关的类别,它们的表示越相近

Embedding 可视化,可以看出词与词之间的相似性

底下这个图是我用tensorflow训练人民的名义的embedding的结果


三、总结

最后我们来做一个总结,自然语言的向量化表示方法主要有两类:one-hot encoding 和 word embedding。它们的优缺点如下:
在这里插入图片描述


四、应用

Embedding 的基本内容如前面介绍所示,然而我想说的是它的价值并不仅仅在于 word embedding 或者 entity embedding,这种将类别数据用低维表示且可自学习的思想更存在价值。通过这种方式,我们可以将神经网络,深度学习用于更广泛的领域,Embedding 可以表示更多的东西,而这其中的关键在于要想清楚我们需要解决的问题和应用 Embedding 表示我们得到的是什么。

说到embedding就不得不说说word2vector了,word2vector做法即为embedding的过程,这个可以扩展到推荐中的item2vector 。顺便提一嘴word2vec:

1.可以看作是多分类任务

2.浅层神经网络

3.数据构造模式:cbow、skip-gram模式

完结!

以下加一点用tensorflow模拟embedding的一点代码做个记录

import tensorflow as tf
import numpy as np#类似语料库
embedding_dict = tf.convert_to_tensor(np.random.random(size=(30,4)))
#输入的词索引
input_train = tf.convert_to_tensor([1,2,4,5])检索得到对应词的embedding权重
embed = tf.nn.embedding_lookup(embedding_dict,input_train)#由于我的tensorflow的版本较高,session开启方式不同
sess = tf.compat.v1.Session()
sess.run(tf.compat.v1.global_variables_initializer())print(sess.run(embedding_dict))
print("====================================")
print(sess.run(embed))sess.close()

推荐阅读
  • 视觉图像的生成机制与英文术语解析
    近期,Google Brain、牛津大学和清华大学等多家研究机构相继发布了关于多层感知机(MLP)在视觉图像分类中的应用成果。这些研究深入探讨了MLP在视觉任务中的工作机制,并解析了相关技术术语,为理解视觉图像生成提供了新的视角和方法。 ... [详细]
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • 本文介绍了如何使用 Google Colab 的免费 GPU 资源进行深度学习应用开发。Google Colab 是一个无需配置即可使用的云端 Jupyter 笔记本环境,支持多种深度学习框架,并且提供免费的 GPU 计算资源。 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 如何在Linux系统中部署TensorFlow的详细指南
    本文详细介绍了在Linux系统中部署TensorFlow的过程。作者基于北京大学曹建教授的MOOC课程进行学习,但由于课程内容较旧,环境配置方面遇到了不少挑战。经过多次尝试,最终成功解决了这些问题,并总结了一套详细的安装指南,帮助初学者快速上手TensorFlow。 ... [详细]
author-avatar
ruanbaoshuijingkou
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有