性能优于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

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}