学习NLP,解决两个问题:
答案是使用预训练模型。预训练模型(pre-training model)是先通过一批语料进行训练模型,然后在这个初步训练好的模型基础上,再继续训练或者另作他用。这样的理解基本上是对的,预训练模型的训练和使用分别对应两个阶段:预训练阶段(pre-training)和 微调(fune-tuning)阶段。
文法规则->统计语言学->神经网络方法
2017年谷歌提出了Transformer架构模型,2018年底,基于Transformer架构,谷歌推出了bert模型,bert模型一诞生,便在各大11项NLP基础任务中展现出了卓越的性能(一个排名榜单),现在很多模型都是基于或参考Bert模型进行改造。
Transformer 架构是自然语言处理领域最近几乎所有主要发展的核心。这种 Transformer 架构的性能优于 RNN 和 CNN(卷积神经网络)。而且训练模型所需的计算资源也大为减少。
BERT (Bidirectional Encoder Representations)双向编码器表示是第一个无监督、深度双向的自然语言处理模型预训练系统。它只使用纯文本语料库进行训练。
目前NLP可以处理的任务主要包含以下几个大类:问答系统,文档摘要,机器翻译,语音识别,文档分类等。
TF-IDF(Term Frequency-inverse Document Frequency)是一种针对关键词的统计分析方法,用于评估一个词对一个文件集或者一个语料库的重要程度。一个词的重要程度跟它在文章中出现的次数成正比,跟它在语料库出现的次数成反比。这种计算方式能有效避免常用词对关键词的影响,提高了关键词与文章之间的相关性。
其中TF指的是某词在文章中出现的总次数,该指标通常会被归一化定义为TF=(某词在文档中出现的次数/文档的总词量),这样可以防止结果偏向过长的文档(同一个词语在长文档里通常会具有比短文档更高的词频)。IDF逆向文档频率,包含某词语的文档越少,IDF值越大,说明该词语具有很强的区分能力,IDF=loge(语料库中文档总数/包含该词的文档数+1),+1的原因是避免分母为0。TFIDF=TFxIDF,TFIDF值越大表示该特征词对这个文本的重要性越大。
Word2Vec是google在2013年推出的一个NLP工具,它的特点是能够将单词转化为向量来表示。基本出发点和Distributed representation类似:上下文相似的两个词,它们的词向量也应该相似。 word2vec在 2018 年之前非常流行,但是随着 BERT、GPT2.0 等方法的出现,这种方式已经不算效果最好的方法了。
word2vec主要包含两个模型:
如何根据一个词的one-hot编码,得到它对应的词向量,可以看下图所示:
word2vec训练的目的就是得到这个隐藏层参数矩阵。
dels import word2vec
import jiebadef train():with open('/pub/NLP/天龙八部.txt', errors='ignore', encoding='utf-8') as fp:lines = fp.readlines()for line in lines:seg_list = jieba.cut(line)with open('/pub/NLP/分词后的天龙八部.txt', 'a', encoding='utf-8') as ff:ff.write(' '.join(seg_list)) # 词汇用空格分开# 加载语料sentences = word2vec.Text8Corpus('/pub/NLP/分词后的天龙八部.txt')# 训练模型model = word2vec.Word2Vec(sentences)# 保存模型model.save('/pub/NLP/天龙八部.model')def test_word2vec_model():# 加载模型model = word2vec.Word2Vec.load('/pub/NLP/天龙八部.model')# 选出最相似的10个词for e in st_similar(positive=['段誉'], topn=10):print(e[0], e[1])
输出结果:
乔峰 0.9072518348693848
游坦之 0.9017099738121033
木婉清 0.8961336016654968
虚竹 0.8942322731018066
阿紫 0.8807579874992371
王语嫣 0.8777897953987122
慕容复 0.87125563621521
萧峰 0.8666722178459167
乌老大 0.8532173037528992
段正淳 0.8409541249275208
Bert最关键两点,一点是特征抽取器采用Transformer;第二点是预训练的时候采用双向语言模型。使用Bert得到的embedding可以为下游任务提供高质量的特征。即使没有关键字重叠,还是可以找出比较相似的句子。
BERT是 word2vec的高级进化版,进化的后果【用进废退】就是:BERT广泛成长,word2vec逐渐废弃。
Bert 与 word2vec 的区别是:word2vec中每个单词都有一个固定的表示,而与单词出现的上下文无关;bert生成的单词表示是由单词周围的单词动态形成的。
Bert 有自己的word to vector方法,可以将其看做是embedding生成机制中的一种,但Bert得到embedding是动态的,即使同一个单词得到的embedding可能都不是一样的(因为其上下文可能不同)。但有个问题是:BERT 是由12层 Transformer 构成,每个层得到的输出embedding各不相同,所以就需要我们自己考虑取哪些层的输出。通常情况下,取最后一层的embedding就OK了。
Bert 可以得到word的embedding,句子的embedding,句子的embedding是通过[CLS]获取的。
Attention 是一种算法,可以将其看成是平级于 RNN,LSTM 的一种方法。这种方法的特别之处在于它对一个句子不同的词赋以不同的优先级。transformer 是一种架构,它基于Attention 机制实现。所谓的transformer也就是数个ecoder layer叠加得到的块。【同时需要注意,我们平常也会使用一个包叫做Transformer,这个包实现了诸如BERT,GPT这种常用且著名的算法,这个包由著名的hugging face团队开发】。BERT是一种集合transfomer+双向检索思想得到的算法,它可以很好的提取出文本中的信息。
"""
实现bert做embedding
"""
import torch
from transformers import BertTokenizer, BertModel # 导入transformer 的包
#torch.set_printoptions(profile="full") # 输出tensor的整个部分
"""
1.from_pretrained()方法是类PreTrainedModel的一个方法
2.这里的如果加上 output_hidden_states=True,那么就会把所有的hidden_states 给输出
如果没有加,那么就只能得到最后一个隐层的输出。
"""
model = BertModel.from_pretrained("bert-base-uncased",output_hidden_states = True)tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')inputs = tokenizer("hello,my dog",return_tensors='pt')
# 执行model[BertModel实例]的forward()方法,但是在执行之前,仍然做了很多其他的事情
_grad():outputs = model(**inputs)hiddden_states = outputs[2] # get the hidden states# The last hidden-state is the first element of the output tuple
last_hidden_states = outputs[0]print(last_hidden_states)"""
1.如果我的句子是 "hello,my dog is cute",那么得到last_hidden_state 的size
就是torch.Size([1, 8, 768]);如果我的句子是"hello,my dog",那么得到的last_hidden_state
的 就是 torch.size([1,6,768])。也就是中间那个维度的大小是跟句子长度有关系"""
print(last_hidden_states.size()) #"""
inputs 是个字典,的内容如下:
{'input_ids': tensor([[ 101, 7592, 1010, 2026, 3899, 2003, 10140, 102]]),
'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0]]),
'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1]])
}
"""
标注工具的选择,市面上有多种标注工具可供选择,例如MAE, Callisto,Brandeis Annotation Tool,Prodigy(收费)等。
1.负责语料库的收集、整理和分类工作
2.根据需求完成数据预处理任务
3.使用自然语言处理技术对语料进行解析和分析,并产生文本数据
4.通过分析数据和算法实现自动化文本分类模型训练
5.持续优化模型性能和精度,提升效果
6.编写相关文档资料等,协助其他人员使用语料库
7.维护语料库并进行定期更新和维护
自从 BERT 和 GPT 模型取得重大成功之后, Transformer 结构已经替代了循环神经网络 (RNN) 和卷积神经网络 (CNN),成为了当前 NLP 模型的标配。两个著名 Transformer 模型: GPT和BERT。
Transformers 是由 Hugging Face 开发的一个 NLP 包,支持加载目前绝大部分的预训练模型。随着 BERT、GPT 等大规模语言模型的兴起,越来越多的公司和研究者采用 Transformers 库来构建 NLP 应用。
2018 年底随着 BERT 的提出,这一阶段神经语言模型的发展终于出现了一位集大成者,它在 11 个 NLP 任务上都达到了最好性能。
BERT 在模型大框架上采用和 GPT 完全相同的两阶段模型,首先是语言模型预训练,然后使用微调模式解决下游任务。BERT 不仅像 GPT 模型一样采用 Transformer 作为编码器,而且在预训练阶段采用了类似 ELMO 的双向语言模型。
因此 BERT 不仅编码能力强大,而且对各种下游任务,Bert 都可以简单地通过改造输入输出部分来完成。但是 BERT 的优点同样也是它的缺陷,由于 BERT 构建的是双向语言模型,因而无法直接用于文本生成任务。
Hugging Face Transformers 是自然语言处理领域的重要开源项目,提供了基于通用架构(如 BERT,GPT-2,RoBERTa)的数千个预训练模型,并提供了 PyTorch 和 TensorFlow 的良好互操作性。
Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商,他们本来打算创业做聊天机器人,然后在github上开源了一个Transformers库,虽然聊天机器人业务没搞起来,但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超100,000个预训练模型,10,000个数据集,变成了机器学习界的github。
Hugging Face Hub 平台为自然语言处理社区提供了一个中心化的地方,使人们可以共享和发现各种自然语言处理模型和数据集。该公司主要是提供nlp服务,同时它提供了一个很🐂的开源社区,这里可以找到大部分开源model。其对外提供了一个库 Transformers,Transformers 提供了数以千计的预训练模型,支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成,并且Transformers 与 PyTorch、 TensorFlow 无缝整合。
功能包括:
一般transformer模型有三个部分组成kennizer,2.Model,3.Post processing。如下图所示,图中第二层和第三层是每个部件的输入/输出以及具体的案例。我们可以看到三个部分的具体作用:Tokenizer就是把输入的文本做切分,然后变成向量,Model负责根据输入的变量提取语义信息,输出logits;最后Post Processing根据模型输出的语义信息,执行具体的nlp任务,比如情感分析,文本自动打标签等;可见Model是其中的核心部分,Model又可以分为三种模型,针对不同的NLP任务,需要选取不同的模型类型:Encoder模型(如Bert,常用于句子分类、命名实体识别(以及更普遍的单词分类)和抽取式问答。),Decoder模型(如GPT,GPT2,常用于文本生成),以及sequence2sequence模型(如BART,常用于摘要,翻译,生成性问答等):
bert_dir = '/opt/data/models/bert-base-chinese' tokenizer = AutoTokenizer.from_pretrained(bert_dir, local_files_only=True)config = BertConfig.from_pretrained(os.path.join(bert_dir, "config.json"))# 导入模型 model = AutoModelForMaskedLM.from_pretrained(bert_dir,config=config,local_files_only=True)device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")(device)sentence = '中国足球为何不能进世界杯'inputs = tokenizer(sentence,truncation="longest_first",return_tensors="pt")inputs = (device)_grad():outputs = model(**inputs)logits = outputs[0]label = torch.max(logits.data, 1)[1].tolist()print("分类结果:" + config.label_list[label[0]])
方式一, 采用git lfs:
brew install git-lfs
git clone
如:git clone
方式二,采用huggingface_hub库:
安装:
python -m pip install huggingface_hub
from huggingface_hub import snapshot_download
snapshot_download(repo_id="bert-base-chinese")
## 指定文件或忽略文件使用参数:allow_regex,ignore_regex
snapshot_download(repo_id="bert-base-chinese", ignore_regex=["*.h5", "*.ot", "*.msgpack"])
也可以使用proxy:
import requests
from huggingface_hub import configure_http_backend, get_session# Create a factory function that returns a Session with configured proxies
def backend_factory() -> requests.Session:session = requests.Session()session.proxies = {"http": ":3128", "https": ":1080"}return session# Set it as the default session factory
configure_http_backend(backend_factory=backend_factory)# In practice, this is mostly done internally in `huggingface_hub`
session = get_session()
单一文件下载:
from huggingface_hub import hf_hub_download
hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json")hf_hub_download(repo_id="google/fleurs", filename="fleurs.py", repo_type="dataset")
指定版本:
hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="v1.0")hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="test-branch")hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="refs/pr/3")hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="877b84a8f93f2d619faa2a6e514a32beef88ab0a")
使用命令行工具huggingface-cli:
huggingface-cli download gpt2 config.json
将TensorFlow版本模型转为Pytorch版本:.html
具体每个模型如何转为相应的Pytorch版本:.py文件,如bert的.py
ES可以在矢量相似度搜索中使用NLP模型。矢量相似度搜索(通常也称为语义搜索)超越了传统的基于关键字的搜索,让用户可以找到语义相似但可能没有任何共同关键字的文档,从而提供更广泛的结果。矢量相似度搜索作用于密集矢量,并使用 k-最近邻搜索来查找相似矢量。
将模型导入集群:
eland_import_hub_model --url <user>:<password>@localhost:9200/ --hub-model-id sentence-transformers/msmarco-MiniLM-L-12-v3 --task-type text_embedding --start
华为昇腾ModelZoo
Hugging Face
transformers
huggingface github
huggingface_hub 模型下载API
A Survey of Large Language Models
预训练模型下载
本文发布于:2024-02-01 09:37:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170675146035710.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |