NLP(task1)Transformers在NLP中的兴起 + 环境配置
Posted 奇跡の山
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLP(task1)Transformers在NLP中的兴起 + 环境配置相关的知识,希望对你有一定的参考价值。
学习总结
- NLP任务主要划分为4个大类:文本分类;序列标注;问答任务——抽取式问答和多选问答;生成任务——语言模型、机器翻译和摘要生成
- 先根据paper《Attention Is All You Need》中的图对transformer有大概了解,其中MHA子网络就是之前在李宏毅深度学习课程中的多头注意力(【李宏毅深度学习CP10】Self-attention(part2):https://andyguo.blog.csdn.net/article/details/119577093),另外可以复习李宏毅老师讲的transformer
- transformer的编码器和解码器是基于自注意力的模块叠加而成的,源(输入)序列和目标(输出)序列的嵌入(embedding)表示将加上位置编码(positional encoding),再分别输入到编码器和解码器中
- 课程推荐:CS224n: Natural Language Processing with Deep Learning
书籍推荐:Speech and Language Processing
另外还有2文要补看:
NLP中的预训练+微调的训练方式推荐阅读:
2021年如何科学的“微调”预训练模型?
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
文章目录
零、环境配置
conda和pip 在cpu区别不大,用GPU版本就先下载CUDA再下载GPU版的pytorch;
1.用virtualenv模块
可以在vscode中使用virtualenv
模块创建虚拟环境(ps:工作开发环境因为项目对一些包的版本要求不同,可以创建虚拟环境相互隔离;虚拟环境可以分别为这两个项目配置不同的运行环境,这样两个项目就可以同时运行)
pip install virtualenv # 下载virtualenv包
virtualenv venv1 # 创建新虚拟环境,名字为venv1
venv1\\Scripts\\activate # 注意linux和win的激活命令不同,此处为win
特别注意:创建新虚拟环境要在C盘文件(文件名最好为英文)才能下载,发现这篇博客(https://blog.csdn.net/sanmi8276/article/details/107309918/)的大兄弟也是和我一样要C盘才行,否则会报错virtualenv:error:argument dest:invalid validate_dest value:"虚拟环境的名字"
。
vscode配置python虚拟环境可以参考这三篇博客:
在vscode中启用python的virtualenv
VS Code中运行Python的虚拟环境;
Windows下vscode配置python虚拟环境
2.用conda创建虚拟环境1
也可以在vscode终端conda创建虚拟环境
1)创建新的终端(terminal),创建新的虚拟环境:
conda create --name yourEnv python=3.8
然后就会blabla地创建:
Collecting package metadata (current_repodata.json): done
Solving environment: done
==> WARNING: A newer version of conda exists. <==
current version: 4.10.1
latest version: 4.10.3
Please update conda by running
$ conda update -n base conda
## Package Plan ##
environment location: D:\\anaconda1\\envs\\yourEnv
added / updated specs:
- python=3.8
The following packages will be downloaded:
package | build
---------------------------|-----------------
pip-21.0.1 | py38haa95532_0 1.8 MB http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
python-3.8.11 | h6244533_1 16.0 MB http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
sqlite-3.36.0 | h2bbff1b_0 780 KB http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
wheel-0.37.0 | pyhd3eb1b0_0 32 KB http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
------------------------------------------------------------
Total: 18.6 MB
The following NEW packages will be INSTALLED:
ca-certificates anaconda/pkgs/main/win-64::ca-certificates-2021.7.5-haa95532_1
certifi anaconda/pkgs/main/win-64::certifi-2021.5.30-py38haa95532_0
openssl anaconda/pkgs/main/win-64::openssl-1.1.1k-h2bbff1b_0
pip anaconda/pkgs/main/win-64::pip-21.0.1-py38haa95532_0
python anaconda/pkgs/main/win-64::python-3.8.11-h6244533_1
setuptools anaconda/pkgs/main/win-64::setuptools-52.0.0-py38haa95532_0
sqlite anaconda/pkgs/main/win-64::sqlite-3.36.0-h2bbff1b_0
vc anaconda/pkgs/main/win-64::vc-14.2-h21ff451_1
done
#
# To activate this environment, use
#
# $ conda activate yourEnv
#
# To deactivate an active environment, use
#
# $ conda deactivate
2)激活该虚拟环境:
C:\\NLP_group>conda activate yourEnv
结果如下,莫慌:
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
If using 'conda activate' from a batch script, change your
invocation to 'CALL conda.bat activate'.
To initialize your shell, run
$ conda init <SHELL_NAME>
Currently supported shells are:
- bash
- cmd.exe
- fish
- tcsh
- xonsh
- zsh
- powershell
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your shell after running 'conda init'.
那就按其提示:
C:\\NLP_group>CALL conda.bat activate
这时候会发现命令行的开头变成base了,最后正常激活环境即可:
(base) C:\\NLP_group>conda activate yourEnv
结果如下,前面的开头已变为yourEnv(当前新创建的环境):
(yourEnv) C:\\NLP_group>
3.用conda创建虚拟环境2
当然也可以直接在anaconda prompt或者cmd上操作命令
就像本次任务创建并激活新虚拟环境后,在方法2用pip install -r requirements.txt
就会报错,后来发现是路径问题——要切换到当前requirements.txt
文件所在的路径中,其中这个requirements文件内容如下,就是我们一开始说的每个项目配置的包可能不同,在新虚拟环境下直接用pip install -r requirements.txt
命令就能够一键傻瓜式安装啦。
transformers==4.4.2
datasets==1.6.2
notebook
torch==1.9.0
sklearn
scipy
那么在vscode换用所需虚拟环境的python解释器(上面搞的是yourEnv虚拟环境)就行了(不过后面章节的实践部分好像用这个环境会报错Kernel died with exit code 1
了,参考Stack Overflow
):
conda一些常用命令
conda create --name yourEnv python=3.8:创建新环境
conda activate yourEnv:切换到新环境
conda activate base:回到base环境
conda deactivate yourEnv:退出激活的环境
conda remove -n yourEnv --all:del掉环境(要先退出该环境)
conda list: 看这个环境下安装的包和版本
conda install numpy scikit-learn: 安装numpy sklearn包
conda env remove -n yourEnv: 删除你的环境
conda env list: 查看所有的环境
ps:linux和win的激活语句不同
更多参考:conda创建新环境
4.用Colab(省事)
当然也可以直接用Colab,可以参考之前的一篇博文:Colab简明使用教程
from transformers import pipeline
# 使用情绪分析流水线
classifier = pipeline('sentiment-analysis')
classifier('We are very happy to introduce pipeline to the transformers repository.')
测试transformers,结果为
Downloading: 100%
629/629 [00:00<00:00, 15.1kB/s]
Downloading: 100%
268M/268M [00:06<00:00, 37.4MB/s]
Downloading: 100%
48.0/48.0 [00:00<00:00, 1.11kB/s]
Downloading: 100%
232k/232k [00:00<00:00, 1.58MB/s]
[{'label': 'POSITIVE', 'score': 0.9996980428695679}]
一、自然语言处理(Natural Language Processing, NLP)
自然语言处理(Natural Language Processing, NLP)是一种重要的人工智能(Artificial Intelligence, AI)技术。我们随处可以见到NLP技术的应用,比如网络搜索,广告,电子邮件,智能客服,机器翻译,智能新闻播报等等。最近几年,基于深度学习(Deep Learning, DL)的NLP技术在各项任务中取得了很好的效果,这些基于深度学习模型的NLP任务解决方案通常不使用传统的、特定任务的特征工程而是仅仅使用一个端到端(end-to-end)的神经网络模型就可以获得很好的效果。
学习内容:基于最前沿的深度学习模型结构(transformers)来解决NLP里的几个经典任务。
学习目标:了解transformer相关原理、熟练使用transformer相关的深度学习模型来解决NLP里的实际问题以及在各类任务上取得很好的效果。
资料推荐:
(1)自然语言与深度学习的课程推荐:CS224n: Natural Language Processing with Deep Learning
(2)自然语言处理的书籍推荐:Speech and Language Processing
二、常见的NLP任务
这次学习将NLP任务划分为4个大类:
2.1 文本分类:
对单个、两个或者多段文本进行分类。举例:“这个教程真棒!”这段文本的情感倾向是正向的,“我在学习transformer”和“如何学习transformer”这两段文本是相似的。
2.2 序列标注:
对文本序列中的token、字或者词进行分类。举例:“我在国家图书馆学transformer。”这段文本中的国家图书馆是一个地点,可以被标注出来方便机器对文本的理解。
2.3 问答任务——抽取式问答和多选问答:
1、抽取式问答根据问题从一段给定的文本中找到答案,答案必须是给定文本的一小段文字。举例:问题“小学要读多久?”和一段文本“小学教育一般是六年制。”,则答案是“六年”。
2、多选式问答,从多个选项中选出一个正确答案。举例:“以下哪个模型结构在问答中效果最好?“和4个选项”A、MLP,B、cnn,C、lstm,D、transformer“,则答案选项是D。
2.4 生成任务——语言模型、机器翻译和摘要生成:
语言模型:根据已有的一段文字生成(generate)一个字
摘要生成:根据一大段文字生成一小段总结性文字
机器翻译:将源语言比如中文句子翻译成目标语言比如英语
虽然各种基于transformer的深度学习模型已经在多个人工构建的NLP任务中表现出色,但由于人类语言博大精深,深度学习模型依然有很长的路要走。
三、Transformer的兴起
2017年,Attention Is All You Need论文首次提出了Transformer模型结构并在机器翻译任务上取得了The State of the Art(SOTA, 指在对比当前领域的其他模型是最好的)的效果。
2018年,BERT: Pre-training of Deep Bidirectional Transformers for
Language Understanding:https://arxiv.org/pdf/1810.04805.pdf 使用Transformer模型结构进行大规模语言模型(language model)预训练(Pre-train),再在多个NLP下游(downstream)任务中进行微调(Finetune),一举刷新了各大NLP任务的榜单最高分,轰动一时。
2019年-2021年,研究人员将Transformer模型结构和预训练+微调这种训练方式相结合,提出了一系列Transformer模型结构、训练方式的改进(比如transformer-xl,XLnet,Roberta等等)。如下图所示,各类Transformer的改进不断涌现。
图:各类Transformer改进,来源:A Survey of Transformers
另外,由于Transformer优异的模型结构,使得其参数量可以非常庞大从而容纳更多的信息,因此Transformer模型的能力随着预训练不断提升,随着近几年计算能力的提升,越来越大的预训练模型以及效果越来越好的Transformers不断涌现,简单的统计可以从下图看出:
图:预训练模型参数不断变大,来源Huggingface
各类Transformer的研究非常多,总体上经典和流行的Transformer模型都可以通过HuggingFace/Transformers, 48.9k Star:https://github.com/huggingface/transformers 免费获得和使用
Hugging face 是一家总部位于纽约的聊天机器人初创服务商,开发的应用在青少年中颇受欢迎,相比于其他公司,Hugging Face更加注重产品带来的情感以及环境因素。官网链接在此 https://huggingface.co/ 。
但更令它广为人知的是Hugging Face专注于NLP技术,拥有大型的开源社区。尤其是在github上开源的自然语言处理,预训练模型库 Transformers,已被下载超过一百万次,github上超过24000个star。Transformers 提供了NLP领域大量state-of-art的 预训练语言模型结构的模型和调用框架。以下是repo的链接(https://github.com/huggingface/transformers)
NLP中的预训练+微调的训练方式推荐阅读:
2021年如何科学的“微调”预训练模型?:https://zhuanlan.zhihu.com/p/363802308
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史:https://zhuanlan.zhihu.com/p/49271699
四、初识Transformer
下面用图和公式直接给出Transformer模型结构的定义,先有一个宏观印象,篇章2的4个小节会进一步对该模型结构进行更形象的讲解。本节先描述整体,再描述子模块。
1.整体描述 Transformer:encoder+decoder
Transformer在论文Attention Is All You Need中首次被提出,用于NLP中的翻译任务,因此该模型也使用了翻译任务通用的encoder-decoder模型结构,左边是encoder,右边是decoder。
encoder将输入符号(通常也叫做token)序列 ( x 1 , . . . x n ) (x_1,...x_n) (x1,...xn)的每个符号映射成一个 d d d维向量表示得到 z = ( z 1 , . . . , z n ) , z i ∈ R d \\mathbf{z} = (z_1, ..., z_n), z_i \\in \\mathbb{R}^d z=(z1,...,zn),zi∈Rd,然后decoder根据 z \\mathbf{z} z按时间步依次生成输出序列 ( y 1 , . . . , y n ) (y_1,...,y_n) (y1,...,yn):在时间步 t t t,使用 t t t以前的信息 ( z 1 , . . . , z t ) (z_1,...,z_t) (z1,...,zt)生成 y t y_t yt。
encoder和decoder结构相似,最底层的输入符号 ( x 1 , . . . x n ) (x_1,...x_n) (x1,...xn)经过Embedding查表之后与Positional Embedding相加得到每个符号的向量表示,随后经过 N N N个相同的神经网络(Layer)。
2.Encoder
在transformer里的encoder用的就是self-attention,如下图一的每个block不是neural network的一层,而是好几个layer做的事情:
- 先做一个self-attention,input一排vector以后,做self-attention,考虑整个sequence的资讯,Output另外一排vector.
- 接下来这一排vector,会再丢到fully connected的feed forward network里面,再output另外一排vector,这一排vector就是block的输出。
而如下图所示,在transformer里面加了了一个设计——不只是输出这个vector,还要把这个vector加上它的input得到新的ouput。把得到的residual结果做normalization(这边用的不是batch normalization,而是用layer normalization)。
计算出mean跟standard deviation以后,就可以做一个normalize,我们把input 这个vector里面每一个dimension减掉mean再除以standard deviation以后得到x’,就是layer normalization的输出。得到layer normalization的输出以后,它的这个输出 才是FC network的输入。
Encoder = Nx[LayerNorm(x + MHA(x)), LayerNorm(x + FFN(x))]
如下图所示,encoder每个网络由2个子网络(SubLayer)组成:multi-head self-attention(MHA)和前向全连接网络(FFN)。网络中还应用了残差结构连接各个子网络、LayerNorm归一化技巧,因此每个子网络(如下图所示,可以是Multi-Head Attention或者Feed Forward)的输出是:
L
a
y
e
r
N
o
r
m
(
x
+
S
u
b
l
a
y
e
r
(
x
)
)
LayerNorm(x + Sublayer(x))
LayerNorm(x+Sublayer(x)),由于残差结构的引入,各个子网络的输出维度需要相等,因此论文中统一使用的维度为
d
=
512
d=512
d=512。
图:transformer结构图,Transformer被提出时的结构如上图所示
3.Decoder
Decoder = Nx[LayerNorm(x + MMHA(x)), LayerNorm(x + MHA(x)), LayerNorm(x + FFN(x))]
如上图所示,decoder与encoder相似,每个网络由3个自网络(SubLayer)组成:Masked Multi-Head Attention(MMHA),Multi-Head Attention(MHA)和Feed Forward(FFN),后面两个子网络与encoder一样。
MMHA与MHA主要的区别在于:对于输出而言,我们需要保证在第
t
t
t时间步的时候只能看到
t
t
t以及之前的信息,将
t
t
t时间之后的信息mask防止Label泄漏。
4.MHA子网络
MHA子网络 = [Linear, Scaled Dot-Product Attention, Concat, Linear]
图:MHA
如上图所示,MHA由Linear线性层,Scaled Dot-Product Attention(SDPA)层组成。进入MHA的输入来自于最底层的Embedding,将 n n n个符号的embedding放在一起组成MHA的输入QKV(query, key, value): Q ∈ R n × d = K ∈ R n × d = V ∈ R n × d Q \\in \\mathbb{R}^{n \\times d} = K \\in \\mathbb{R}^{n \\times d} = V \\in \\mathbb{R}^{n \\times d} Q∈Rn×d=K∈Rn×d=V∈Rn×d,MHA拿到输入后先将 n × d n \\times d n×d维矩阵拆分成 n × h n \\times h nJohn Snow 的Spark NLP 中Transformers
John Snow 的Spark NLP 中Transformers
最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型
NLP Transformers:获得固定句子嵌入向量形状的最佳方法?