0
点赞
收藏
分享

微信扫一扫

【NLP】(task1)Transformers在NLP中的兴起 + 环境配置

鱼满舱 2022-08-25 阅读 63


学习总结

  • NLP任务主要划分为4个大类:文本分类;序列标注;问答任务——抽取式问答和多选问答;生成任务——语言模型、机器翻译和摘要生成
  • 先根据paper《Attention Is All You Need》中的图对transformer有大概了解,其中MHA子网络就是之前在李宏毅深度学习课程中的多头注意力(【李宏毅深度学习CP10】Self-attention(part2):),另外可以复习李宏毅老师讲的transformer
  • transformer的编码器和解码器是基于自注意力的模块叠加而成的,源(输入)序列和目标(输出)序列的嵌入(embedding)表示将加上位置编码(positional encoding),再分别输入到编码器和解码器中
  • 课程推荐:​​CS224n: Natural Language Processing with Deep Learning​​​ 书籍推荐:​​Speech and Language Processing​​ 另外还有2文要补看:
    NLP中的预训练+微调的训练方式推荐阅读:
    ​​2021年如何科学的“微调”预训练模型?​​​​从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史​​

文章目录

  • ​​学习总结​​
  • ​​零、环境配置​​
  • ​​1.用virtualenv模块​​
  • ​​2.用conda创建虚拟环境1​​
  • ​​3.用conda创建虚拟环境2​​
  • ​​4.用Colab(省事)​​
  • ​​一、自然语言处理(Natural Language Processing, NLP)​​
  • ​​二、常见的NLP任务​​
  • ​​2.1 文本分类:​​
  • ​​2.2 序列标注:​​
  • ​​2.3 问答任务——抽取式问答和多选问答:​​
  • ​​2.4 生成任务——语言模型、机器翻译和摘要生成:​​
  • ​​三、Transformer的兴起​​
  • ​​四、初识Transformer​​
  • ​​1.整体描述 Transformer:encoder+decoder​​
  • ​​2.Encoder​​
  • ​​3.Decoder​​
  • ​​4.MHA子网络​​
  • ​​5.FFN子网络​​
  • ​​6.Position Embedding的计算​​
  • ​​五、小测​​
  • ​​Reference​​

零、环境配置

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盘文件(文件名最好为英文)才能下载,发现这篇博客的大兄弟也是和我一样要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

那么在vscode换用所需虚拟环境的python解释器(上面搞的是yourEnv虚拟环境)就行了(不过后面章节的实践部分好像用这个环境会报错​​Kernel died with exit code 1​​​了,​​参考Stack Overflow​​ ):

【NLP】(task1)Transformers在NLP中的兴起 + 环境配置_python


conda一些常用命令

conda create --name yourEnv pythnotallow=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的改进不断涌现。

【NLP】(task1)Transformers在NLP中的兴起 + 环境配置_深度学习_02


图:各类Transformer改进,来源:​​A Survey of Transformers​​另外,由于Transformer优异的模型结构,使得其参数量可以非常庞大从而容纳更多的信息,因此Transformer模型的能力随着预训练不断提升,随着近几年计算能力的提升,越来越大的预训练模型以及效果越来越好的Transformers不断涌现,简单的统计可以从下图看出:

【NLP】(task1)Transformers在NLP中的兴起 + 环境配置_深度学习_03


图:预训练模型参数不断变大,来源​​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)序列的每个符号映射成一个维向量表示得到,然后decoder根据按时间步依次生成输出序列:在时间步,使用以前的信息生成

encoder和decoder结构相似,最底层的输入符号经过Embedding查表之后与Positional Embedding相加得到每个符号的向量表示,随后经过个相同的神经网络(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的输出。
  • 【NLP】(task1)Transformers在NLP中的兴起 + 环境配置_python_15

而如下图所示,在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的输入。

【NLP】(task1)Transformers在NLP中的兴起 + 环境配置_python_16


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)的输出是:,由于残差结构的引入,各个子网络的输出维度需要相等,因此论文中统一使用的维度为

【NLP】(task1)Transformers在NLP中的兴起 + 环境配置_深度学习_19

图: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主要的区别在于:对于输出而言,我们需要保证在第时间步的时候只能看到以及之前的信息,将时间之后的信息mask防止Label泄漏

4.MHA子网络

MHA子网络 = [Linear, Scaled Dot-Product Attention, Concat, Linear]

【NLP】(task1)Transformers在NLP中的兴起 + 环境配置_python_23


图:MHA

如上图所示,MHA由Linear线性层,Scaled Dot-Product Attention(SDPA)层组成。进入MHA的输入来自于最底层的Embedding,将个符号的embedding放在一起组成MHA的输入QKV(query, key, value):,MHA拿到输入后先将维矩阵拆分成维的子矩阵,再通过一个Linear线性层映射得到维度相同的新子矩阵,最后将每个子矩阵经过Scaled Dot-Product Attention后再合并起来得到输出。

其中:

论文中的

【NLP】(task1)Transformers在NLP中的兴起 + 环境配置_深度学习_34


图:Scaled Dot-Product Attention (SDPA)

如上图所示,远论文在描述时依旧使用的作为SDPA的输入,但此时的已经是子矩阵了,也就是经过线性层得到:

然后attention做法是:

5.FFN子网络

MHA的输出再经过一个Feed-Forward Networks(FFN):

其中是mha的输出。

6.Position Embedding的计算

单个token符号的embedding通过查表获得,每个符号位置对应的position embedding计算法式为:

其中pos表示第pos个位置,表示第pos位置对应的维embedding中第维的值。

五、小测

(1)常见的nlp任务:文本分类、序列标注、机器翻译、机器问答
语音信号处理 不能选,因为常见的nlp任务指文本任务,audio signal process通常指声音信号进行处理(比如声音转文字),两者研究方向有重叠,但一般不认为是nlp的一个常见任务。

(2)《attention is all you need》首次提出transformer,而2018年的《BERT pre traning of deep bidirectional transformer for language understanding》的BERT将transformer发扬光大了,但不是首次提出

(3)transformer可以被用在 自然语言处理、语音信号处理、计算机图像处理、音乐生成等领域

(4)属于第一个transformer模型的基本组件有:
multi head attention、position embedding、全连接、LayerNorm、softmax(计算attention score时用到)
以下选项不选:type embedding(这是BERT的,第一个transformer没有这东东)、BatchNorm(transformer里面没有用BN)。

Reference

(1)《Attention Is All You Need》

(2)datawhale notebook(course)

(3)​​HuggingFace/Transformers, 48.9k Star​​ (4)复旦邱锡鹏nndl:https://github.com/nndl/nndl.github.io

(5)

(6)NLP打卡任务概览:

【NLP】(task1)Transformers在NLP中的兴起 + 环境配置_深度学习_46


举报

相关推荐

0 条评论