学习总结
- 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的virtualenvVS 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 ):
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的改进不断涌现。
图:各类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)序列的每个符号映射成一个
维向量表示得到
,然后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的输出。
而如下图所示,在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)的输出是:,由于残差结构的引入,各个子网络的输出维度需要相等,因此论文中统一使用的维度为
。
图: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]
图:MHA
如上图所示,MHA由Linear线性层,Scaled Dot-Product Attention(SDPA)层组成。进入MHA的输入来自于最底层的Embedding,将个符号的embedding放在一起组成MHA的输入QKV(query, key, value):
,MHA拿到输入后先将
维矩阵拆分成
个
维的子矩阵,再通过一个Linear线性层映射得到维度相同的新子矩阵
,最后将每个子矩阵经过Scaled Dot-Product Attention后再合并起来得到输出。
其中:
论文中的
图: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打卡任务概览: