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),ziRd,然后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} QRn×d=KRn×d=VRn×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:获得固定句子嵌入向量形状的最佳方法?

RNN神经网络- 吴恩达Andrew Ng 循环神经网络 NLP Transformers Week4 知识总结

盘点当下大热的 7 大 Github 机器学习『创新』项目