快速注册 找回密码

QQ登录

只需一步,快速开始

查看: 1033|回复: 3

BERT小门生级上手教程,从原理到上手全有图示,还能直接在线运行 ...

[复制链接]

该用户从未签到

升级  44.5%

送鲜花(0) 砸鸡蛋(0)
发表于 2021-4-8 19:32:03 | 显示全部楼层 |阅读模式
提示您:未得到智伍应用正式版的授权,部门功能受到影响!



尊重的用户,您好!!


非常感谢您能安装智伍应用旗下的产物,为了产物的可连续发展和升级,云收罗已经开始按天收费,发起购买200天,免费赠予400天,一共600天,均匀天天仅需1.67元。


向用户收费是为了给用户更可靠的保障和服务,所收取的费用重要用于产物的正常运作、不停研发和改进,盼望各位用户可以或许明白和支持。



购买正式版授权请打开下面的网址自助购买:
www.zhiwu55.com/authorization/buy_end_time.php?hzw_appid=B4592D53D254F99549C9FBF696104B22



购买之后,主动开通正式版授权,新收罗的内容不会再出现未购买授权的提示信息,同时智伍应用旗下全部含云收罗功能的产物,都无需再次购买云收罗的正式版授权,即云收罗的授权可以在智伍应用的各个产物那边通用!


假如您已经购买了正式版,照旧会出现未购买授权的提示,大概有别的题目,请接洽智伍应用官方在线客服QQ/微信:2085244671




作者 Jay Alammar
伊瓢 编译
量子位 出品 | 公众号 QbitAI


BERT,作为天然语言处置惩罚范畴的C位选手,总是NLPer们逃不外的一环。
HXWbB622mwE76cD3.jpg

但是,假如是履历匮乏、底子单薄的选手,想玩转BERT照旧有点难的。
如今,科技博主Jay Alammar创作了一篇《第一次利用BERT的图形化指南》,用非常简朴清楚的方式先容了怎样上手BERT,从BERT的原理到现实操纵的过程都有图示,乃至图比代码都多。量子位为各人编译搬运如下~
Qv6aK46m63Al46EJ.jpg

这篇文章重要以用BERT的变体对句子举行分类为例,先容了BERT的利用方式。
末了的传送门处另有Colab的地点。
数据集:SST2

起首,我们必要用到SST2数据集,内里的句子来自于一些影戏批评。
假如批评者对影戏表现肯定赞赏,就会有“1”的标签;
假如批评者不喜好这个影戏,发表了负面批评,就会有“0”的标签。
数据集里的影戏批评是用英文写的,大概长如许:
JDbnUZuxTMrkJk9R.jpg

句子情绪分类模子

如今,借助SST2影评数据集,我们必要创建一个主动对英文句子举行分类的模子。
假如判定是肯定的、正面的,就标注1;假如判定是否定的、负面的,就标注0。
大抵的逻辑是如许的:
x4LNXsLY6m3jvfSS.jpg

输入一句话,颠末影戏批评句子分类器,输出积极或悲观的效果。
这个模子现实上是两个模子构成的。
DistilBERT负责处置惩罚句子,提取信息,然后通报给下一个模子,这是“抱抱脸公司”(HuggingFace)做的一个开源BERT版本,比力轻量级而且运行快,性能和原版差不多。
下一个模子就是一个根本的逻辑回归模子,它的输入是DistilBERT的处置惩罚效果,输出积极或悲观的效果。
我们在两个模子之间通报的数据是巨细为768的向量,可以把这个向量当成可以用来分类的句子嵌入。
aBwwJsA1SS5a449B.jpg

模子的练习过程

固然我们会用到两个模子,但是我们只必要练习逻辑回归模子就行了,DistilBERT可以直接用预练习好的版本。
不外,这个模子从来都没有针对句子分类使命被练习或微调过,我们从通用目的BERT获取一些句子分类本领,尤其是对于第一个位置的BERT输出而言(与[CLS]token相干),这是BERT的第二个练习目的,接下来就是句子分类了,这个目的好像是练习模子将全句意义封装到第一位置的输出位置。
这个Transformer库为我们提供了DistilBERT的实行和模子的预练习版本。
ohjQ9p94gh4Cipj6.jpg

教程概述

这是本篇教程的整个筹划,我们先用练习过的DistilBERT来天生2000个句子的句子嵌入。
rRoxZPDrvRQUufGu.jpg

之后就不消再碰DistilBERT了,这里都是Scikit Learn,我们在这个数据集上做通例的练习和测试:
G1wl3okAB1c63kKF.jpg

针对第一个模子也就是DistilBERT举行练习测试,创建我们练习用的数据集并评估第二个模子也就是逻辑回归模子。
然后在练习集上练习逻辑回归模子:
v7O4P8ZT8uKD5982.jpg

单个猜测是怎样举行的

在研究代码表明怎样练习模子之前,我们先看看一个练习后的模子怎样举行猜测。
我们试着给这句话举行分类猜测:
a visually stunning rumination on love
关于爱情的视觉上令人赞叹的反省
第一步,用BERT tokenizer把句子分为两个token;
第二步,我们参加句子分类用的特别token(第一个位置的是[CLS],句子竣事的位置是[SEP])。
fBDVy7B7bFBWMwBI.jpg

第三步,tokenizer用嵌入表中的ID取代每个token,成为练习模子的组件。
EzwcMGK8uD4NR8yZ.jpg

留意,tokenizer是在这一行代码里完成全部步调的:
1tokenizer.encode("a visually stunning rumination on love", add_special_tokens=True)如今我们的输入句子是可以通报给DistilBERT的得当状态了。
这个步调可视化起来长如许:
v6HZZCG66p0SUpc9.jpg

从DistilBERT颠末

输入向量从DistilBERT颠末,输出每个输入token的向量,每个向量有768个数字构成。
g2ubEoc5BxUZsb55.jpg

由于这是个句子分类的使命,以是我们忽视掉除第一个向量之外的其他内容(第一个向量和[CLS]token相干),然后把第一个向量作为逻辑回归模子的输入。
zNJomNJO6ov6886i.jpg

从这里开始,逻辑回归模【*****智伍应用提示您:未购买正式版授权,功能受到影响!!请根据最上面的引导提示,自助购买正式版授权,主动开通!!在线客服微信:ccccyyyy4444,官方网站:zhiwu55.com*****】,把这个向量举行分类。
这个猜测盘算的过程是如许的:
sS4wqm7tZm1MCcsj.jpg

代码

如今,开始看这整个过程的代码,背面你也可以在传送门里看到GitHub代码和Colab上的可运行版本。
起首,导入trade工具。
1import numpy as np
2import pandas as pd
3import torch
4import transformers as ppb # pytorch transformers
5from sklearn.linear_model import LogisticRegression
6from sklearn.model_selection import cross_val_score
7from sklearn.model_selection import train_test_split你可以在GitHub里找到这个数据集,以是我们可以直接把它导入到pandas dataframe里。
1df = pd.read_csv('https://github.com/clairett/pytorch-sentiment-classification/raw/master/data/SST2/train.tsv', delimiter='\t', header=None)可以直接用df.head() 检察dataframe的前五行,看看数据集长啥样。
1df.head()然后就输出:
Qv58prB3VjC88nI5.jpg

导入预练习DistilBERT模子和tokenizer

1model_class, tokenizer_class, pretrained_weights = (ppb.DistilBertModel, ppb.DistilBertTokenizer, 'distilbert-base-uncased')
2
3## Want BERT instead of distilBERT? Uncomment the following line:
4#model_class, tokenizer_class, pretrained_weights = (ppb.BertModel, ppb.BertTokenizer, 'bert-base-uncased')
5
6# Load pretrained model/tokenizer
7tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
8model = model_class.from_pretrained(pretrained_weights)如今可以对这个数据集tokenize了。
留意,这一步和上面的例子差别,例子只处置惩罚了一个句子,但是我们要批处置惩罚全部的句子。
Tokenization

1tokenized = df[0].apply((lambda x: tokenizer.encode(x, add_special_tokens=True)))这一步让每个句子都酿成ID列表。
oJJV8X7j7y7nT2Mf.jpg

数据集是当前的列表(大概pandas Series/DataFrame),在DistilBERT处置惩罚它之前,我们必要给全部向量同一规格,给短句子加上token 0。
填上0之后,如今就有了一个成形的矩阵/张量可以投喂给BERT了:
DAorl5fl6E2ks86f.jpg

用DistilBERT处置惩罚

如今,为添补的token矩阵创造一个输入张量,发送给DistilBERT。
1input_ids = torch.tensor(np.array(padded))
2
3with torch.no_grad():
4 last_hidden_states = model(input_ids)运行这一步之后,last_hidden_states保存DistilBERT的输出。
scYV3pVrp8248D3F.jpg

打开BERT的输出张量

解压缩这个3-d输出张量,先查抄它的尺寸:
JZAWysSwJk03H8AA.jpg

回首处置惩罚句子的过程

每行都和我们数据集里的一个句子关联,回首一下,整个处置惩罚过程是如许的:
oM6SZUUAOPlKoTuL.jpg

挑出紧张部门

关于句子分类,我们只对BERT的[CLS] token输出感爱好,以是我们只挑出紧张部门就行了。
QCBMB0S21Sb35mbZ.jpg

下面是从3D张量里挑出我们必要的2D张量的办法:
1# Slice the output for the first position for all the sequences, take all hidden unit outputs
2features = last_hidden_states[0][:,0,:].numpy()如今的特性是个2D numpy数组,内里有我们数据集里全部句子的句子嵌入。
ofQzEzOv0dTL63LL.jpg

逻辑回归数据集


如今我们有BERT的输出了,前面逻辑回归模子已经已经练习好了。下图的798列是特性,标签是初始数据集内里的。
qSJNq810ygyQgsts.jpg

在完成传统的呆板学习练习测试后,我们可以拿逻辑回归模子再举行练习。
1labels = df[1]
2train_features, test_features, train_labels, test_labels = train_test_split(features, labels)将数据分为练习集/测试集:


接下来,在练习集上练习逻辑回归模子:
1lr_clf = LogisticRegression()
2lr_clf.fit(train_features, train_labels)如今模子练习完了,用测试集给它打分:
1lr_clf.score(test_features, test_labels)得出的模子正确度为81%。
Score Benchmarks

作为参考,这个数据集现在的最高正确率得分为96.8.
在这个使命里,DistilBERT可以练习来提拔分数,这个过程叫做微调(fine-tuning),可以更新BERT的权重,来实现更好的分类句子。
微调后的DistilBERT可以实现90.7的正确率,完备的BERT模子能到达94.9的正确率。
传送门

A Visual Guide to Using BERT for the First Time
https://jalammar.github.io/a-visual-guide-to-using-bert-for-the-first-time/
代码
https://github.com/jalammar/jalammar.github.io/blob/master/notebooks/bert/A_Visual_Notebook_to_Using_BERT_for_the_First_Time.ipynb
Colab
https://colab.research.google.com/github/jalammar/jalammar.github.io/blob/master/notebooks/bert/A_Visual_Notebook_to_Using_BERT_for_the_First_Time.ipynb
DistilBERT
https://medium.com/huggingface/distilbert-8cf3380435b5
— 完 —
量子位 QbitAI · 头条号签约
关注我们,第一时间获知前沿科技动态
ICHE2uoChQ2nhj5E.jpg
头像被屏蔽

该用户从未签到

送鲜花(0) 砸鸡蛋(0)
发表于 2021-4-8 19:52:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

该用户从未签到

升级  40%

送鲜花(0) 砸鸡蛋(0)
发表于 2021-4-8 20:12:29 | 显示全部楼层
转发了

该用户从未签到

送鲜花(0) 砸鸡蛋(0)
发表于 2021-4-8 20:32:26 | 显示全部楼层
转发了
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

社区精彩导读

Powered by Discuz! X3.4 © 2006-2021 Comsenz Inc

本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与[小城社区]无关。 如有侵犯您版权的,请邮件与我们联系处理(邮箱:10000@546800.com),本站将立即改正。
快速回复 返回顶部 返回列表