图片
一、弁言
前边我面先容过ChatGPT的基愉快趣以及预历练大讲话模子的发展史,咱们知谈ChatGPT和扫数预历练大讲话模子的中枢是什么?其实便是 Transformer,Hugging Face 的火爆离不开他们开源的这个 Transformers 库。这个开源库里稀有万个咱们可以径直调用的模子。好多场景下,这个开源模子照旧实足咱们使用了。接下来咱们就从Transformer的架构和具体的案例来先容Hugging Face Transformer。
图片
二、Transformer 架构
Transformer 是一种用于当然讲话处治和其它序列到序列任务的神经收集模子,它是在2017年由Vaswani等东谈主建议来的 ,Transformer的中枢模块是通过自能干力机制(Self Attention) 捕捉序列之间的依赖关系。图片
要是独一词向量本人,莫得能干力机制和位置编码,那么讲话模子就不简略分拨。 比如一个单词 apple 它到底是生果如故一个科技公司呢,它是不知谈的,独一通过自能干力机制,捕捉到了高下文关联信息之后,这个讲话模子才简略拓荒起通盘序列的选举表征。自能干力机制是由三个部分构成的:Query Key Value: 查询键值,自能干力机制输入进去是一个序列,每一个元素都是一个向量,也便是词向量,对于每一个元素咱们都会给它猜度出来三个向量 Query、Key还有Value,这三个向量通许序列本人的词向量再乘以Query、Key和Value的参数矩阵,通过矩阵乘法,咱们从词向量本人生息出来三个稀奇的向量,便是Query、Key和Value。Attention Scores:能干力的得分,对于每个查询向量,咱们都要猜度它和扫数其它键向量之间的相似度得分,这个得分就叫能干力得分。这个得分便是通过对查询向量和键向量进行点击Dot Product猜度得到的。Attention Weight:能干力的权重,得到了能干力的得分之后,它明白过Softmax进行一个归一化,然后就得到了能干力的权重。这个权重骨子上便是每个值向量的加权平均值,亦然自能干力机制的输出,经过这一系列的猜度,这个序列中每一个词向量的互相就开始从全都互不重复变成有了好多关系,那输出的向量就简略为 Transformer 所用,可以进行更进一步的分析处治。扫数的能干力机制都是多头的,多头能干力便是将能干力机制加多了小数小小的改造,亦然通过把输入向量进行线性变换,分娩好多组能干力机制,这些能干力机制就可以并行猜度,同期猜度好多组Query、Key和Value,然后团聚成一个新的向量默示,把多头再进行团聚,这么作念的克己是它可以同期关注不同位置的和不同语义层面上的信息,从而更好的捕捉序列的全局特征和局部特征,因此,多头能干力在处治复杂序列数据时推崇的更好了。除了自能干力和多头能干力机制除外,Transformer 还包括编码器(Encoder)妥协码器(Decoder):Encoder:将序列映射成一组荫藏状况,经过了能干力机制的处治,Decoder再将荫藏状况映射到输出序列,这是Transformer基本的一个机制,这些荫藏状况通过多个堆叠的自能干力层还有前馈神经收集层酿成相比复杂的并行结构。图片
上头这张图展示一个输入的文本序列在编码器Encoder妥协码器Decoder里面,以及从Encoder到Decoder怎样样流动的一个经过,可以了解一下。Encoder和Decoder在Transformer里面是由多个堆叠构成的,是以在Encoder中,每一个Transformer模块都是包含两个子层:多头自能干力层(Multi Head Self Attention)前馈神经收集层(Feed Forward Neuro Network)在Decoder中也包括两个子层,多头能干力机制层和Encoder Decoder能干力层,这是两个不同的能干力层,一个是Self Attention,序列本人我方的能干力;一个是Encoder的输入、Encoder过来的输出和Decoder本人的输入衔尾的Attention,是以向量序列通过多层的 Transformer 模块进行处治,每一个模块都会对序列进行一系列的自能干力、前馈、再自能干力、前馈、然后传递到Decoder过来又进行自能干力,然后再进行Encoder Decoder Attention,再进行Feed Forward等一系传记递的经过,层层叠加,层层叠叠,这么Transformer就简略得到越来越多的输入和输出序列之间的依赖关系,逐层学习各个序列之间的高档特征,从而可以灵验的捕捉到序列到序列的语义,进行语义方面的学习。图片
三、最具影响力的 Transformers
以下是 Transformer 模子(简略)历史中的一些要道节点:图片
Transformer 架构 于 2017 年 6 月推出。底本酌量的重心是翻译任务。随后推出了几个有影响力的模子,包括2018 年 6 月: GPT, 第一个预历练的 Transformer 模子,用于多样 NLP 任务并赢得极好的扫尾2018 年 10 月: BERT, 另一个大型预历练模子,该模子旨在生成更好的句子摘记2019 年 2 月: GPT-2, GPT 的改造(况兼更大)版块,由于谈德问题莫得立即公开发布2019 年 10 月: DistilBERT, BERT 的提真金不怕火版块,速率提高 60%,内存消弱 40%,但仍保留 BERT 97% 的性能2019 年 10 月: BART 和 T5, 两个使用与原始 Transformer 模子疏导架构的大型预历练模子(第一个这么作念)2020 年 5 月, GPT-3, GPT-2 的更大版块,无需微调即可在多样任务上推崇细腻(称为零样本学习)其中,最具影响力的应该要属Google 2018年建议的BERT模子,它是最流行的当然讲话处治模子之一,它是通过双向的 Transformer 编码器来学习高下文干系的单词默示。BERT出身之后,好多东谈主就开始对BERT加以改造,望望能不可找到更好的 Transformer。RoBERTa:它是Facebook建议来的,基于BERT进一步历练的讲话模子,通过调动一些里面结构还有历练经过,培植了一定的模子推崇力,骨子上对于下流的一些任务来说,RoBERTa和BERT是各有特色,主要看你的具体任务是什么?有些任务如故BERT推崇可以,而有些任务上,RoBERTa会比BERT略微好一些。ALBERT:它是一种基于BERT轻量级的讲话模子,是Google和Toyota团队2019年建议的。它通过参数分享和范围这种手艺裁减了模子的大小和历练时分,同期还能保抓跟BERT差未几的推崇才气,它会更轻量级一些。DistillBERT:亦然一种基于BERT轻量级的讲话模子,由Hugging Face团队2019年推出的,使用了一种学问蒸馏的方法,简略保抓BERT模子的着力,还能把BERT模子压缩到一半以上,只剩下一半傍边的参数,然而同期保抓访佛的推崇力,可以说DistillBERT是一个很小的大模子,着力相比高。图片
四、Hugging Face Transformers
Hugging Face Transformers 是一家公司,在Hugging Face提供的API中,咱们险些可以下载到扫数前边提到的预历练大模子的一谈信息和多样参数。咱们可以以为这些模子在Hugging Face基本便是开源的了,咱们只需要拿过来微调或者从头历练这些模子。用官方的话来说,Hugging Face Transformers 是一个用于当然讲话处治的Python库,提供了预历练的讲话模子和用具,使得酌量者和工程师简略粗疏的历练使用分享起初进的NLP模子,其中包括BERT、GPT、RoBERTa、XLNet、DistillBERT等等。通过 Transformers 可以粗疏的用这些预历练模子进行文天职类、定名实体识别、机器翻译、问答系统等NLP任务。这个库还提供了通俗的API、示例代码和文档,让咱们使用这些模子或者学习模子变得相等简陋。图片
4.1、Transformers Pipeline
图片
咱们先来望望,Transformers 这个开源库到底明慧些什么。底下的代码都是径直使用开源模子,需要行使 GPU 的算力,是以你最好如故在 Colab 里运行,能干不要健忘把 Runtime 的类型修改为 GPU。from transformers import pipelineclassifier = pipeline(task='sentiment-analysis', device=0)preds = classifier('I am really happy today!')print(preds)输出扫尾:No model was supplied, defaulted to distilbert-base-uncased-finetuned-sst-2-english and revision af0f99b (https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english).Using a pipeline without specifying a model name and revision in production is not recommended.[{'label': 'POSITIVE', 'score': 0.9998762607574463}]这个代码相等简陋,第一滑代码,咱们界说了一个 task 是 sentimental-analysis 的 Pipeline,也便是一个情怀分析的分类器。里面 device=0 的敬爱是咱们指定让 Transformer 使用 GPU 资源。要是你念念要让它使用 CPU,你可以设立 device=-1。然后,调用这个分类器对一段文本进行情怀分析。从输出扫尾看,它给出了正确的 Positive 揣测,也给出了具体的揣测分数。因为咱们在这里莫得指定任何模子,是以 Transformers 自动领受了默许的模子,也便是日记里看到的 distilbert-base-uncased-finetuned-sst-2-english 这个模子。
看名字咱们可以知谈,这个模子是一个针对英语的模子。要是念念要支柱华文,咱们也可以换一个模子来试试。
classifier = pipeline(model='uer/roberta-base-finetuned-jd-binary-chinese', task='sentiment-analysis', device=0)preds = classifier('这家店有点黑,鱼香肉丝也太难吃了。')print(preds)输出扫尾:[{'label': 'negative (stars 1, 2 and 3)', 'score': 0.934112012386322}]这里,咱们指定模子的称号,就能换用另一个模子来进行情怀分析了。此次咱们选用的是 roberta-base-finetuned-jd-binary-chinese 这个模子。RoBERTa 这个模子是基于 BERT 作念了一些缠绵上的修改而得来的。此后头的 finetuned-jd-binary-chinese 是基于京东的数据进行微调过的一个模子。Pipeline 是 Transformers 库里面的一个中枢功能,它封装了扫数托管在 HuggingFace 上的模子推理揣测的进口。你不需要眷注具体每个模子的架构、输入数据形式是什么样式的。咱们只须通过 model 参数指定使用的模子,通过 task 参数来指定任务类型,运行一下就能径直赢得扫尾。比如,咱们现在不念念作念情怀分析了,而是念念要作念英译中,咱们只需要把 task 换成 translation_en_to_zh,然后选用一个允洽的模子就好了。translation = pipeline(task='translation_en_to_zh', model='Helsinki-NLP/opus-mt-en-zh', device=0)text = 'Artificial intelligence is really amazing. I believe you will fall in love with it.'translated_text = translation(text)print(translated_text)输出扫尾:
[{'translation_text': '东谈主工智能确凿太神奇啦,我深信你会心爱上它'}]
在这里,咱们选用了赫尔辛基大学的 opus-mt-en-zh 这个模子来作念英译中,运行一下就可以看到,咱们输入的英文被翻译成了华文。不外,咱们怎样知谈应该选用哪个模子呢?这个如魔法一般的 Helsinki-NLP/opus-mt-en-zh 模子名字从那里可以找到呢?
图片
五、Hugging Face实战
Hugging Face是一个AI社区,辛勤于于分享机器学习模子和数据集。它的主要居品包括Hugging Face Dataset、Hugging Face Tokenizer、Hugging Face Transformer和Hugging Face Accelerate。Hugging Face Dataset是一个库,用于粗疏探听和分享音频、猜度机视觉和当然讲话处治(NLP)任务的数据集。只需一滑代码即可加载数据集,并使用高大的数据处治方法快速准备好数据集,以便在深度学习模子中进行历练。在Apache Arrow形式的支柱下,以零拷贝读取处治大型数据集,莫得任何内存摒弃,以达成最好速率和着力。Hugging Face Tokenizer是一个用于将文本迤逦为数字默示体式的库。它支柱多种编码器,包括BERT、GPT-2等,并提供了一些高档对皆方法,可以用于映射原始字符串(字符和单词)和秀美空间之间的关系。Hugging Face Transformer是一个用于当然讲话处治(NLP)任务的库。它提供了多样预历练模子,包括BERT、GPT-2等,并提供了一些高档功能,举例限度生成文本的长度、温度等。Hugging Face Accelerate是一个用于加快历练和推理的库。它支柱多样硬件加快器,举例GPU、TPU等,并提供了一些高档功能,举例混杂精度历练、梯度积攒等。5.1、Hugging Face Dataset
图片
Hugging Face Dataset是一个大派别据集仓库,用于粗疏探听和分享音频、猜度机视觉和当然讲话处治(NLP)任务的数据集。只需一滑代码即可加载数据集,并使用高大的数据处治方法快速准备好数据集,以便在深度学习模子中进行历练。在Apache Arrow形式的支柱下,以零拷贝读取处治大型数据集,莫得任何内存摒弃,以达成最好速率和着力。Hugging Face Dataset还与拥抱面部中心深度集成,使您可以粗疏加载数据集并与更普通的机器学习社别离享数据集。在花时分下载数据集之前,快速获取酌量数据集的一些老例信息不息会很有匡助。数据集的信息存储在 DatasetInfo 中,可以包含数据集刻画、因素和数据集大小等信息。使用 load_dataset_builder() 函数加载数据集构建器并查验数据集的属性,而无需提交下载:
>>> from datasets import load_dataset_builder>>> ds_builder = load_dataset_builder('rotten_tomatoes')# Inspect dataset description>>> ds_builder.info.descriptionMovie Review Dataset. This is a dataset of containing 5,331 positive and 5,331 negative processed sentences from Rotten Tomatoes movie reviews. This data was first used in Bo Pang and Lillian Lee, ``Seeing stars: Exploiting class relationships for sentiment categorization with respect to rating scales.'', Proceedings of the ACL, 2005.# Inspect dataset features>>> ds_builder.info.features{'label': ClassLabel(num_classes=2, names=['neg', 'pos'], id=None), 'text': Value(dtype='string', id=None)}要是您对数据集感到舒心,请使用 load_dataset() 加载它:from datasets import load_datasetdataset = load_dataset('rotten_tomatoes', split='train')
5.2、Hugging Face Tokenizer
图片
Tokenizers 提供了现时最常用的分词器的达成,重心是性能和多功能性。这些分词器也用于Transformers。Tokenizer 把文本序列输入到模子之前的预处治,相当于数据预处治的方法,因为模子是不可能径直读笔墨信息的,如故需要经过分词处治,把文本变成一个个token,每个模子比如BERT、GPT需要的Tokenizer都不相同,它们都有我方的字典,因为每一个模子它的历练语料库是不相同的,是以它的token和它的字典大小、token的形式都会各有不同,全体来讲,便是给多样种种的词进行分词,然后编码,以123456来代表词的状况,这个便是Tokenizer的作用。是以,Tokenizer的任务便是把输入的文本迤逦成一个一个的秀美,它还可以持重对文本序列的清洗、截断、填充进行处治。简而言之,便是为了满足具体模子所条件的形式。主要特色:使用现时最常用的分词器历练新的词汇表并进行秀美化。由于Rust达成,因此相等快速(历练和秀美化),在就业器CPU上对1GB文本进行秀美化不到20秒。易于使用,但也相等多功能。旨在用于酌量和分娩。全都对皆追踪。即使进行松懈性门径化,也遥远可以赢得与任何令牌对应的原始句子部分。实施扫数预处治:截断、填充、添加模子所需的特殊令牌。这里演示怎样使用 BPE 模子实例化一个:classTokenizerfrom tokenizers import Tokenizerfrom tokenizers.models import BPEtokenizer = Tokenizer(BPE(unk_token='[UNK]'))5.3、Hugging Face Transformer
图片
Transformers提供API和用具,可粗疏下载和历练起初进的预历练模子。使用预历练模子可以贬低猜度资本、碳萍踪,并简约历练模子所需的时分和资源。这些模子支柱不同模态中的常见任务,举例:当然讲话处治:文天职类、定名实体识别、问答、讲话建模、摘记、翻译、多项领受和文本生成。猜度机视觉:图像分类、决策检测和分割。音频:自动语音识别和音频分类。多模式:表格问答、光学字符识别、从扫描文档中索求信息、视频分类和视觉问答。Transformers支柱PyTorch、TensorFlow和JAX之间的框架互操作性。这提供了在模子的每个阶段使用不同框架的天真性;在一个框架顶用三行代码历练一个模子,在另一个框架中加载它进行推理。模子还可以导出到ONNX和TorchScript等形式,以在分娩环境中部署。# 导入必要的库from transformers import AutoModelForSequenceClassification# 启动化分词器和模子model_name = 'bert-base-cased'model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)# 将文本编码为模子守望的张量形式inputs = tokenizer(dataset['train']['text'][:10], padding=True, truncation=True, return_tensors='pt')# 将编码后的张量输入模子进行揣测outputs = model(**inputs)# 获取揣测扫尾和标签predictions = outputs.logits.argmax(dim=-1)
5.4、Hugging Face Accelerate
图片
Accelerate 是一个库,只需添加四行代码,即可在职何散播式确立中运行疏导的 PyTorch 代码!简而言之,大范畴的历练和推理变得简陋、高效温暖应性强。from accelerate import Acceleratoraccelerator = Accelerator()model, optimizer, training_dataloader, scheduler = accelerator.prepare( model, optimizer, training_dataloader, scheduler)5.5、基于Hugging Face Transformer达成的文天职类示例
图片
装配Hugging Face必要的库pip install torchpip install transformerspip install datasets
# 导入必要的库from transformers import AutoTokenizer, AutoModelForSequenceClassificationfrom datasets import load_dataset# 界说数据集称号和任务类型dataset_name = 'imdb'task = 'sentiment-analysis'# 下载数据集并打乱数据dataset = load_dataset(dataset_name)dataset = dataset.shuffle()# 启动化分词器和模子model_name = 'bert-base-cased'tokenizer = AutoTokenizer.from_pretrained(model_name)model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)# 将文本编码为模子守望的张量形式inputs = tokenizer(dataset['train']['text'][:10], padding=True, truncation=True, return_tensors='pt')# 将编码后的张量输入模子进行揣测outputs = model(**inputs)# 获取揣测扫尾和标签predictions = outputs.logits.argmax(dim=-1)labels = dataset['train']['label'][:10]# 打印揣测扫尾和标签for i, (prediction, label) in enumerate(zip(predictions, labels)): prediction_label = '正面批驳' if prediction == 1 else '负面批驳' true_label = '正面批驳' if label == 1 else '负面批驳' print(f'Example {i+1}: Prediction: {prediction_label}, True label: {true_label}')
输出扫尾:
100%|██████████| 3/3 [00:00<00:00, 65.66it/s]Downloading model.safetensors: 100%|██████████| 436M/436M [00:19<00:00, 22.0MB/s]Some weights of the model checkpoint at bert-base-cased were not used when initializing BertForSequenceClassification: ['cls.predictions.transform.dense.bias', 'cls.predictions.transform.LayerNorm.bias', 'cls.seq_relationship.weight', 'cls.seq_relationship.bias', 'cls.predictions.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.dense.weight']- This IS expected if you are initializing BertForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).- This IS NOT expected if you are initializing BertForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).Some weights of BertForSequenceClassification were not initialized from the model checkpoint at bert-base-cased and are newly initialized: ['classifier.bias', 'classifier.weight']You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.Example 1: Prediction: 正面批驳, True label: 正面批驳Example 2: Prediction: 正面批驳, True label: 负面批驳Example 3: Prediction: 正面批驳, True label: 正面批驳Example 4: Prediction: 正面批驳, True label: 负面批驳Example 5: Prediction: 正面批驳, True label: 负面批驳Example 6: Prediction: 正面批驳, True label: 正面批驳Example 7: Prediction: 正面批驳, True label: 正面批驳Example 8: Prediction: 负面批驳, True label: 正面批驳Example 9: Prediction: 正面批驳, True label: 负面批驳Example 10: Prediction: 正面批驳, True label: 负面批驳从上头的扫尾来看,成果其实不太好,因为咱们莫得作念任务干整个据的历练,径直使用bert模子进行文本情怀分析,当然成果不太理念念的,从运行的日记也能看到,指示咱们应该不才游任务上历练这个模子,以便简略用于揣测和推理。Transformer 架构论文: https://arxiv.org/abs/1706.03762Hugging Face官方文档:https://huggingface.co/docs图片
最新国产相关2018在线视频要是你对这篇著作感敬爱黑丝 少妇,而且你念念要学习更多对于AI界限的实战手段,可以关注「手艺怒潮AI」公众号。在这里,你可以看到最新最热的AIGC界限的干货著作和案例实战教程。
本站仅提供存储就业,扫数内容均由用户发布,如发现存害或侵权内容,请点击举报。