性能优于BERT的FLAIR:一篇文章入门Flair模型

2023-11-05 10:15

本文主要是介绍性能优于BERT的FLAIR:一篇文章入门Flair模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • What is FLAIR?
    • FLAIR Model
    • Contextual String Embedding for Sequence Labeling
      • example
    • FLAIR Application Area
      • Sentiment Analysis
      • Named Entity Recognition
      • Text Classification
  • FLAIR
    • 一、什么是FLAIR?
    • 二、FLAIR Library的优势是什么?
    • 三、用于Sequence Labeling的Contextual String Embedding
  • FLAIR算法实现
    • Embedding Words with Transformers
    • Embedding Documents with Transformers
    • How to Stack Embedding
    • Transformer Embedding
      • Embedding Words
      • Embedding Sentences
      • Arguments
        • Layers
        • Pooling Operation
        • Layer Mean
        • Fine-Tunealbe
    • Flair Embedding
    • Recommended Flair Usage
    • Classic Word Embedding
  • 参考文献

What is FLAIR?

FLAIR是一个NLP的综合框架,旨在为研究人员提供用于各种文本分析任务的灵活高效的工具集

FLAIR的特点是强调尖端的序列标记(cutting-edge sequence labeling)、文本分类(text categorization)和语言建模(language modeling)

FLAIR由两个主要部分组成:FLAIR Library和FLAIR Embedding

  1. FLAIR Library包含几种用于常见NLP任务的预配置模型和应用程序
  2. FLAIR Embedding提供了一个在巨大数据集上训练的Word Embedding和Contextual String Embedding

FLAIR Model

在这里插入图片描述
FLAIR模型图说明了通过FLAIR不同组件的信息流,提供了如何处理和分析文本的可视化表示,该图显示了以下组件:

  1. Word Embedding:使用Word2Vec和GloVe捕获给定文本中各个单词的语义和句法信息
  2. Character Embedding:结合Character Embedding来捕获单词的形态信息
  3. Contextual String Embedding:FLAIR利用Contextual String Embedding根据周围的上下文对单词的含义进行编码
  4. Sequence Labeling:FLAIR使用Sequence Labeling(例如LSTM)为文本中的各个token分配label,该组件对命名实体识别和词性标记等任务至关重要
  5. Text Classification:FLAIR使用卷积神经网络(CNN)和Self-Attention支持文本分类任务,该组件使模型能够将文档分类为不同的类别或预测情感
  6. Language Models:FLAIR结合了捕捉文本全局上下文的语言模型,这些模型(Transformer)是在大型语料库上进行训练的,并且可以生成上下文化的单词表示

Contextual String Embedding for Sequence Labeling

FLAIR 中的Contextual String Embedding是文本中word或token的表示,它们根据周围的上下文捕获其含义。这些embedding通过考虑整个句子或单词出现的标记序列来编码单个单词的语义和句法信息。这种上下文信息对于 NLP 中的序列标记任务至关重要,例如命名实体识别 (NER) 和词性 (POS) 标记。

example

"The cat sat on the mat."例如,单词"mat"可以指代地板覆盖物,而单词"cat"可能指代猫科哺乳动物。

在FLAIR中,Contextual String Embedding通常基于BERT或RoBERTa,它会考虑句子中每个单词的上下文,并为该单词生成对应的向量表示或Embedding
在这里插入图片描述
在图中,输入句子 "The cat sat on the mat"被输入到Contextual String Embedding组件中,该组件将句子作为一个整体进行处理,Contextual String Embedding为句子中的每个单词生成对应的向量表示,捕获它们的上下文含义

然后,这些Contextual String Embedding将用作Sequence Labeling的输入,例如命名实体识别 (NER) 或词性 (POS) 标记。Sequence Labeling组件根据上下文和手头的任务将特定标签应用于句子中的每个单词

例如,在命名实体识别任务中,Sequence Labeling组件可以将"cat"识别和分类为 "ANIMAL"类型的实体,将"mat"识别为"OBJECT"类型的实体。

Contextual String Embedding通过利用句子中单词的上下文信息,在提高Sequence Labeling任务的性能方面发挥着至关重要的作用。它们使模型能够根据周围的单词做出更准确的预测,从而提高准确性和对文本的理解。

FLAIR Application Area

Sentiment Analysis

情感分析涉及确定一段文本中表达的情感,无论是积极的、消极的还是中性的。 FLAIR 的模型可以准确分析社交媒体帖子、客户评论和在线讨论中的情绪。

Named Entity Recognition

命名实体识别(NER)旨在识别和分类文本中的命名实体,例如人名、组织名称、位置和日期。 FLAIR 的Sequence Labeling模型在 NER 任务中表现出色,可为信息提取提供准确的结果。

Text Classification

文本分类涉及将文档分类为预定义的类别或主题。 FLAIR 提供了强大的文本分类模型,支持垃圾邮件检测、主题建模和文档组织等任务

FLAIR

对语境的了解打破了阻碍NLP技术进步的障碍
至今为止,单词要么表示为稀疏矩阵,要么表示为嵌入式词语,如GLoVe,Bert和ELMo

一、什么是FLAIR?

Flair是由Zalando Research开发的一个简单的自然语言处理(NLP)库。 Flair的框架直接构建在PyTorch上,PyTorch是最好的深度学习框架之一。 Zalando Research团队还为以下NLP任务发布了几个预先训练的模型:

  1. 名称-实体识别(NER):它可以识别单词是代表文本中的人,位置还是名称。
  2. 词性标注(PoS):将给定文本中的所有单词标记为它们所属的“词性”。
  3. 文本分类:根据标准对文本进行分类(标签)。

二、FLAIR Library的优势是什么?

Flair库中包含了许多强大的功能,以下是最突出的一些方面:

  1. 它包括了最通用和最先进的单词嵌入方式,如GloVe,BERT,ELMo,字符嵌入等。凭借Flair API技术,使用起来非常容易
  2. Flair的界面允许我们组合不同的word embedding并使用词向量表示文档,显著优化了结果

三、用于Sequence Labeling的Contextual String Embedding

在处理NLP任务时,上下文语境非常重要。通过先前字符预测下一个字符,这一学习过程构成了序列建模的基础。

Contextual String Embedding是通过熟练利用字符语言模型的内部状态,来产生一种新的嵌入类型。简单来说,它通过字符模型中的某些内部原则,使单词在不同的句子中可以具有不同的含义
注意:语言和字符模型是单词/字符的概率分布,因此每个新单词或新字符都取决于前面的单词或字符
在这里插入图片描述
有两个主要因素驱动了Contextual String Embedding:

  1. 这些单词被理解为字符(没有任何单词的概念)。也就是说,它的工作原理类似于字符嵌入
  2. Embedding是通过其周围文本进行语境化的。这意味着根据上下文,相同的单词可以有不同的Embedding意义。很像自然的人类语言,不是吗?在不同的情况下,同一个词可能有不同的含义

让我们看个例子来理解这个意思:

  • 案例1:读一本书(Reading a book)
  • 案例2:请预订火车票(Please book a train ticket)

说明:

  • 在案例1中,book是一个名词
  • 在案例2中,book是动词

FLAIR算法实现

Embedding Words with Transformers

使用flair中的TransformerWordEmbeddings来实现将文本映射到向量空间中

from flair.data import Sentence
from flair.embeddings import TransformerWordEmbeddings# init embedding
embedding = TransformerWordEmbeddings("./model/bert-base-chinese")# create a sentence
sentence = Sentence("今天天气真好")# embed words in sentence
embedding.embed(sentence)
for token in sentence:print(f"{token}: {token.embedding}")

Embedding Documents with Transformers

from flair.data import Sentence
from flair.embeddings import TransformerDocumentEmbeddings# init embedding
document_embedding=TransformerDocumentEmbeddings("./model/bert-base-chinese")# create a sentence
document_sentence=Sentence("今天天气真好")# embed words in sentence
document_embedding.embed(document_sentence)
print(f"{document_sentence}: {document_sentence.embedding}")

How to Stack Embedding

我们可以使用Flair将embedding组合成"embedding stacks",当不进行微调时,使用embedding组合通常会给出最佳结果
使用StackedEmbedding类并通过传递希望组合的embedding列表来实例化它

Transformer Embedding

Flair 支持各种基于 Transformer 的架构,例如 HuggingFace 的 BERT 或 XLNet,有两个类 TransformerWordEmbeddings(用于嵌入单词)和 TransformerDocumentEmbeddings(用于嵌入文档)。

Embedding Words

加载BERT模型:

from flair.embeddings import TransformerWordEmbeddings# init embedding
embedding = TransformerWordEmbeddings('bert-base-uncased')# create a sentence
sentence = Sentence('The grass is green .')# embed words in sentence
embedding.embed(sentence)

加载RoBERTa模型:

from flair.embeddings import TransformerWordEmbeddings# init embedding
embedding = TransformerWordEmbeddings('roberta-base')# create a sentence
sentence = Sentence('The grass is green .')# embed words in sentence
embedding.embed(sentence)

Embedding Sentences

要将整个句子作为一个整体(而不是句子中的每个单词),只需要使用TransformerDocumentEmbedding即可

from flair.embeddings import TransformerDocumentEmbeddings# init embedding
embedding = TransformerDocumentEmbeddings('roberta-base')# create a sentence
sentence = Sentence('The grass is green .')# embed words in sentence
embedding.embed(sentence)

Arguments

初始化 TransformerWordEmbeddings 和 TransformerDocumentEmbeddings 类时可以设置多个选项:

ArgumentDefault
modelbert-base-uncased
layersall
subtoken_poolingfirst
layer_meanTrue
fine_tuneFalse
Layers

layers参数控制Transformer层用于嵌入,如果将此值设置为 “-1、-2、-3、-4”,则使用前 4 层进行嵌入。如果将其设置为 “-1”,则仅使用最后一层。如果将其设置为"all",则使用所有图层
这会影响embedding的长度,因为层只是连接起来的

from flair.data import Sentence
from flair.embeddings import TransformerWordEmbeddingssentence = Sentence('The grass is green.')# use only last layers
embeddings = TransformerWordEmbeddings('bert-base-uncased', layers='-1', layer_mean=False)
embeddings.embed(sentence)
print(sentence[0].embedding.size())sentence.clear_embeddings()# use last two layers
embeddings = TransformerWordEmbeddings('bert-base-uncased', layers='-1,-2', layer_mean=False)
embeddings.embed(sentence)
print(sentence[0].embedding.size())sentence.clear_embeddings()# use ALL layers
embeddings = TransformerWordEmbeddings('bert-base-uncased', layers='all', layer_mean=False)
embeddings.embed(sentence)
print(sentence[0].embedding.size())"""
torch.Size([768])
torch.Size([1536])
torch.Size([9984])
"""
Pooling Operation

大多数基于Transformer的模型(Transformer-XL除外)都使用subword tokenization。例如,以下token puppeteer可以标记(tokenization)为subwords:pupp、##ete 和 ##er。
我们对这些subwords实现不同的池化操作来生成最终的token表示:

  • first:仅使用第一个subword的embedding
  • last:仅使用最后一个subword的embedding
  • first_last:第一个和最后一个subword的embedding被连接并使用
  • mean:计算并使用所有subword embedding的 torch.mean
# use first and last subtoken for each word
embeddings = TransformerWordEmbeddings('bert-base-uncased', subtoken_pooling='first_last')
embeddings.embed(sentence)
print(sentence[0].embedding.size())
Layer Mean

基于 Transformer 的模型具有一定数量的层,可以设置 layer_mean=True 对所有选定图层进行平均,所得向量将始终具有与单层相同的维度

from flair.embeddings import TransformerWordEmbeddings# init embedding
embedding = TransformerWordEmbeddings("roberta-base", layers="all", layer_mean=True)# create a sentence
sentence = Sentence("The Oktoberfest is the world's largest Volksfest .")# embed words in sentence
embedding.embed(sentence)"""
tensor([-0.0323, -0.3904, -1.1946,  ...,  0.1305, -0.1365, -0.4323],device='cuda:0', grad_fn=<CatBackward>)
Fine-Tunealbe

对embedding进行微调时,在TransformerWordEmbedding中设置卡fine_tune=True。微调时,也应该只使用最顶层,所以最好设置layers=“-1”

# use first and last subtoken for each word
embeddings = TransformerWordEmbeddings('bert-base-uncased', fine_tune=True, layers='-1')
embeddings.embed(sentence)
print(sentence[0].embedding)

Flair Embedding

Contextual String Embedding是一种强大的嵌入,可以捕获超出标准Word Embedding的潜在语义信息。主要区别是:

  1. 它们在没有任何明确的单词概念下进行训练,因此从根本上将单词建模为字符序列
  2. 它们通过周围的文本进行语境化,这意味着同一个单词将根据其上下文使用而具有不同的embedding

使用Flair只需要实例化适当的embedding类即可使用:

from flair.embeddings import FlairEmbeddings# init embedding
flair_embedding_forward = FlairEmbeddings('news-forward')# create a sentence
sentence = Sentence('The grass is green .')# embed words in sentence
flair_embedding_forward.embed(sentence)

Recommended Flair Usage

建议结合前向和后向Flair embedding,根据任务,还建议在组合中添加标准word embedding。因此,对于大多数英语任务,我们推荐的StackedEmbedding是:

from flair.embeddings import WordEmbeddings, FlairEmbeddings, StackedEmbeddings# create a StackedEmbedding object that combines glove and forward/backward flair embeddings
stacked_embeddings = StackedEmbeddings([WordEmbeddings('glove'),FlairEmbeddings('news-forward'),FlairEmbeddings('news-backward'),])sentence = Sentence('The grass is green .')# just embed a sentence using the StackedEmbedding as you would with any single embedding.
stacked_embeddings.embed(sentence)# now check out the embedded tokens.
for token in sentence:print(token)print(token.embedding)

使用三种不同embedding的组合来实现word embedding,这样的组合往往可以实现最先进的精度

Classic Word Embedding

经典的Word Embedding是静态的、单词级的,这意味着每个不同的单词都会得到一个预先计算的embedding
只要实例化WordEmbeddings类并传入相应的模型名称即可:

from flair.embeddings import WordEmbeddings# init embedding
glove_embedding = WordEmbeddings('glove')# create sentence.
sentence = Sentence('The grass is green .')# embed a sentence using glove.
glove_embedding.embed(sentence)# now check out the embedded tokens.
for token in sentence:print(token)print(token.embedding)

将适当的 id 字符串传递给 WordEmbeddings 类的构造函数来选择加载那些预训练的embedding。
如果要加载自定义embedding,需要确保自定义embedding的格式为gensim
可以使用以下代码片段经FastText embedding转换为gensim

import gensim
word_vectors = gensim.models.KeyedVectors.load_word2vec_format('/path/to/fasttext/embeddings.txt', binary=False)

参考文献

1、Hugging Face-FLAIR
2、Flair:一款简单但技术先进的NLP库
3、Everything about FLAIR: A Framework for NLP
4、Transformer embeddings
5、Embeddings
6、Flair embeddings

这篇关于性能优于BERT的FLAIR:一篇文章入门Flair模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满