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

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

macOS彻底卸载Python的超完整指南(推荐!)

《macOS彻底卸载Python的超完整指南(推荐!)》随着python解释器的不断更新升级和项目开发需要,有时候会需要升级或者降级系统中的python的版本,系统中留存的Pytho版本如果没有卸载干... 目录MACOS 彻底卸载 python 的完整指南重要警告卸载前检查卸载方法(按安装方式)1. 卸载

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke