FastText词嵌入的可视化指南

2024-06-21 08:48

本文主要是介绍FastText词嵌入的可视化指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:Amit Chaudhary

编译:ronghuaiyang

导读

非常清楚的解释了FastText的来龙去脉。

单词嵌入是自然语言处理领域中最有趣的方面之一。当我第一次接触到它们时,对一堆文本进行无监督训练的简单方法产生了显示出语法和语义理解迹象的表示,这很有趣。

在这篇文章中,我们将探索由Bojanowski等人介绍的名为“FastText”的单词嵌入算法,并了解它是如何对2013年的Word2Vec算法进行增强的。

词表示的直觉

假设我们有下面的单词,我们想把它们表示成向量,这样它们就可以用于机器学习模型。

Ronaldo, Messi, Dicaprio

一个简单的想法是对单词进行独热编码,其中每个单词都有一个唯一的位置。


isRonaldoisMessiisDicaprio
Ronaldo100
Messi010
Dicaprio001

我们可以看到,这种稀疏表示没有捕捉到单词之间的任何关系,而且每个单词都是相互独立的。

也许我们可以做得更好。我们知道Ronaldo和Messi是足球运动员,而Dicaprio是演员。让我们使用我们的世界知识并创建手动特征来更好地表示这些单词。


isFootballerisActor
Ronaldo10
Messi10
Dicaprio01

这比之前的独热编码更好,因为相关的项在空间上更接近。

Related words closer in space

我们可以继续添加更多的方面作为维度来获得更细微的表示。


isFootballerisActorPopularityGenderHeightWeight
Ronaldo10
Messi10
Dicaprio01

但是为每个可能的单词手动这样做是不可扩展的。如果我们根据我们对单词之间关系的认知来设计特征,我们能在神经网络中复制同样的特征吗?

我们能让神经网络在大量的文本语料库中进行梳理并自动生成单词表示吗?

这就是研究词嵌入算法的目的。

Word2Vec回顾

2013年,Mikolov等提出了一种从大量非结构化文本数据中学习单词向量表示的有效方法。这篇论文从语义分布的角度实现了这个想法。

你可以通过这个单词和哪些单词在一起出现来了解这个单词 — J.R. Firth 1957

由于相似的单词出现在相似的上下文中,Mikolov等人利用这一观点制定了表征学习的两个任务。

第一种方法叫做“连续词包(Continuous Bag of Words)”,它预测相邻词的中心词。

第二项任务叫做“Skip-gram”,在这个任务中,我们给定中心词,预测上下文词。

Interactive example of skipgram method

学习到的表征具有有趣的特征,比如这个流行的例子,在这个例子中,对单词向量的算术运算似乎保留了意义。

Example of word analogy in word2vec

Word2Vec的局限性

虽然Word2Vec改变了NLP的游戏规则,我们将看到如何仍有一些改进的空间:

  • Out of Vocabulary(OOV)单词

    在Word2Vec中,需要为每个单词创建嵌入。因此,它不能处理任何在训练中没有遇到过的单词。例如,单词“tensor”和“flow”出现在Word2Vec的词汇表中。但是如果你试图嵌入复合单词“tensorflow”,你将会得到一个词汇表错误。

Example of out of vocab words
  • 形态学:对于词根相同的单词,如“eat”和“eaten”,Word2Vec没有任何的参数共享。每个单词都是根据上下文来学习的。因此,可以利用单词的内部结构来提高这个过程的效率。

Words that have shared radicals

FastText

为了解决上述挑战,Bojanowski等提出了一种新的嵌入方法FastText。他们的关键见解是利用单词的内部结构来改进从skip-gram法获得的向量表示。

对skip-gram法进行如下修正:

1. Sub-word生成

对于一个单词,我们生成长度为3到6的n-grams表示。

  • 我们取一个单词并添加尖括号来表示单词的开始和结束

Adding angular bracket to a word
  • 然后生成长度n的n-grams。例如,对于单词“eating”,从尖括号开始到尖括号结束滑动3个字符的窗口,可以生成长度为3个字符的n-grams。在这里,我们每次将窗口移动一步。

    Interactive example of generating 3-grams

  • 这样,我们就得到了一个单词的n-grams的列表。

3-character n-grams of a word eating

不同长度的字符n-grams的例子如下:

WordLength(n)Character n-grams
eating3<ea, eat, ati, tin, ing, ng>
eating4<eat, eati, atin, ting, ing>
eating5<eati, eatin, ating, ting>
eating6<eatin, eating, ating>

  • 由于存在大量的唯一的n-grams,我们应用哈希来限制内存需求。我们不是学习每个唯一的n-grams的嵌入,而是学习一个总的B嵌入,其中B表示存储桶的大小。文章中用的桶的大小为200万。

    Hash dictionary to store n-grams

    每个字符n-gram被散列到1到b之间的整数,尽管这可能会导致冲突,但它有助于控制词汇表的大小。本文使用Fowler-Noll-Vo散列函数的FNV-1a变体将字符序列散列为整数值。

Hashing function for a n-gram

2. 使用负采样的Skip-gram

为了理解预训练,让我们以一个简单的玩具为例。我们有一个中心词是“eating”的句子,需要预测上下文中的词“am”和“food”。

Skip-gram with window size of 1

1、首先,中心词的嵌入是通过取字符n-grams的向量和整个词本身来计算的。

Summing n-grams with word vector

2、对于实际的上下文单词,我们直接从嵌入表示中获取它们的单词向量,不需要加上n-grams。

Example of context words

3、现在,我们随机采集负样本,使用与unigram频率的平方根成正比的概率。对于一个实际的上下文词,将抽样5个随机的负样本单词。

Example of negative context words

4、我们在中心词和实际上下文词之间取点积,并应用sigmoid函数来得到0到1之间的匹配分数。

5、基于这种损失,我们使用SGD优化器更新嵌入向量,使实际上下文词更接近中心词,同时增加了与负样本的距离。

Goal of negative sampling in skip-gram

论文中的直觉

  • 对于形态丰富的语言(如捷克语和德语),FastText显著提高了句法词类比任务的性能。


word2vec-skipgramword2vec-cbowfasttext
Czech52.855.077.8
German44.545.056.4
English70.169.974.9
Italian51.551.862.7


  • 与Word2Vec相比,FastText降低了语义类比任务的性能。

Example of semantic analogy


word2vec-skipgramword2vec-cbowfasttext
Czech25.727.627.5
German66.566.862.3
English78.578.277.8
Italian52.354.752.3

  • FastText比常规的skipgram慢1.5倍,因为增加了n-grams的开销。

  • 在单词相似度任务中,使用带有字符ngrams的sub-word信息比CBOW和skip-gram基线具有更好的性能。用子词求和的方法表示词外词比用空向量表示具有更好的性能。



    skipgramcbowfasttext(null OOV)fasttext(char-ngrams for OOV)
    ArabicWS35351525455

    GUR35061626470
    GermanGUR6578788181

    ZG22235384144
    EnglishRW43434647

    WS35372737171
    SpanishWS35357585859
    FrenchRG6570697575
    RomanianWS35348525154
    RussianHJ69606066

实现

要训练自己的嵌入,可以使用官方CLI工具或使用fasttext实现。

157种语言在Common Crawl和Wikipedia的预训练词向量:https://fasttext.cc/docs/en/crawl-vectors.html,各种英语的词向量:https://fasttext.cc/docs/en/english-vectors.html。

—END—

英文原文:https://amitness.com/2020/06/fasttext-embeddings/#intuition-on-word-representations

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧

这篇关于FastText词嵌入的可视化指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080753

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Spring Boot结成MyBatis-Plus最全配置指南

《SpringBoot结成MyBatis-Plus最全配置指南》本文主要介绍了SpringBoot结成MyBatis-Plus最全配置指南,包括依赖引入、配置数据源、Mapper扫描、基本CRUD操... 目录前言详细操作一.创建项目并引入相关依赖二.配置数据源信息三.编写相关代码查zsRArly询数据库数

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

JavaScript错误处理避坑指南

《JavaScript错误处理避坑指南》JavaScript错误处理是编程过程中不可避免的部分,它涉及到识别、捕获和响应代码运行时可能出现的问题,本文将详细给大家介绍一下JavaScript错误处理的... 目录一、错误类型:三大“杀手”与应对策略1. 语法错误(SyntaxError)2. 运行时错误(R

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

MySQL中慢SQL优化方法的完整指南

《MySQL中慢SQL优化方法的完整指南》当数据库响应时间超过500ms时,系统将面临三大灾难链式反应,所以本文将为大家介绍一下MySQL中慢SQL优化的常用方法,有需要的小伙伴可以了解下... 目录一、慢SQL的致命影响二、精准定位问题SQL1. 启用慢查询日志2. 诊断黄金三件套三、六大核心优化方案方案

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

Python中DataFrame转列表的最全指南

《Python中DataFrame转列表的最全指南》在Python数据分析中,Pandas的DataFrame是最常用的数据结构之一,本文将为你详解5种主流DataFrame转换为列表的方法,大家可以... 目录引言一、基础转换方法解析1. tolist()直接转换法2. values.tolist()矩阵