跳转至

自然语言处理

定义

定义是让计算机理解与解释自然语言,实现人类和计算机的高效交互。

结构

自然语言处理任务,通常依次包含三大基础结构:

  1. 预训练(word2vec, Glove, 词嵌入, BERT)
  2. 架构(多层感知机,CNN,RNN,Attention)
  3. 应用(情感分析,自然语言推断)。

下面会按照以上顺序,逐一进行学习和介绍。

基本技术

词嵌入(上下文无关)

自然语言中,单词为基本单位。将单词映射为特征向量的技术,称为词嵌入。

其基本应用场景包含:词相似,词类比等。

onehot编码

  1. 思路:假设有1000个不同的单词,每个单词用一个1000维的向量表示,向量中只有一个元素为1,其他元素为0。
  2. 优点:实现最简单。
  3. 缺点:不能编码单词之间的相似性。

word2vec

word2vec旨在解决编码单词之间的相似性的问题。它通过训练一个神经网络模型,将单词映射为低维向量表示,使得相似的单词在向量空间中距离更近。

其包含两个基本的自监督模型:跳元模型和连续词袋模型。这两个模型的训练都依赖于条件概率。

首先来看跳元模型,其核心思想为:假设一个词可以用来在文本序列中生成其周围的单词。

跳元模型的训练目标是最大化给定中心词,生成上下文词的条件概率(生成特定词的概率/生成所有词的概率)即:

\[ P(w_o | w_c) = \frac{exp(u_o^T v_c)}{\sum_{w \in V} exp(u_w^T v_c)} \]

其中,\(w_o\) 是上下文词,\(w_c\) 是中心词,\(V\) 是词汇表,\(u_o\) 是输出向量(上下文词),\(v_c\) 是输入向量(中心词)。

其次来看连续词袋模型,其核心思想为:假设中心词是基于其在文本序列中的周围上下文词生成的。

由于存在多个上下文词,所以通过向量平均的方式得到上下文词向量,从而模型的训练目标是最大化给定上下文词向量,生成中心词的条件概率,即:

\[ P(w_c | w_{o1}, w_{o2}, w_{o3}) = \frac{exp(u_c^T v_{o1} + u_c^T v_{o2} + u_c^T v_{o+3})}{\sum_{w \in V} exp(u_w^T v_{o1} + u_w^T v_{o2} + u_w^T v_{o3})} \]

其中,\(w_c\) 是中心词,\(w_{o1}\)\(w_{o2}\),\(w_{o3}\) 是上下文词,\(V\) 是词汇表,\(u_c\) 是输出向量(中心词),\(w_{o1}\)\(w_{o2}\)\(w_{o3}\) 是输入向量(上下文词)。

BERT(上下文有关)

在BERT之前,上下文有关的词向量表示主要有两种:ELMO(双向LSTM最后拼接)和GPT(Decoder-only,从左到右生成)。

由于ELMo对上下文进行双向编码,但是使用任务相关的架构。而GPT是从左到右编码,但是使用任务无关的架构。而BERT基于Transformer的编码器架构,对上下文进行双向编码,同时架构通用性较高。

预训练

BERT预训练任务有两个:

  1. 掩码语言模型(Masked Language Model, MLM)。核心思想学习词级别的信息。具体方式为随机给定一些词mask,之后最大化模型根据上下文预测mask的正确概率。
  2. 下一句预测(Next Sentence Prediction, NSP)。核心思想是学习句子级别的信息。是随机给定两个句子,之后最大化模型判断这两个句子是否是下一句的概率。

微调 BERT微调之后(Fine-tuning),可以同时适用于序列级别和词元级别的应用。

  1. 序列级别。包含单文本分类和文本对分类(回归)。
  2. 词元级别。包含文本标注(NER)和问答(QA)。

BERT输入向量中,有两个特殊的向量:CLS和SEP。CLS向量:用于表示整个句子的向量。在分类任务中,将[CLS]向量映射为标签空间,即可得到句子的分类结果。在回归任务中,将[CLS]向量映射为标量值,即可得到句子的回归结果。而[SEP]向量:用于表示句子结束的向量。

BERT微调期间,不同应用之间的BERT所需的最小架构更改是添加一个额外的全连接层(稠密层),也就是所谓的输出头。训练时的监督学习过程中,额外层的参数是从0开始学习,而BERT模型的所有参数都是开始微调的。

单文本分类 属于序列级别任务,关注CLS向量。用输出头将序列的CLS向量映射到标签空间。

文本对分类或回归 属于序列级别任务,关注拼接文本对的CLS向量。用输出头将序列的拼接文本对的CLS向量映射到标量值。

文本标注 属于词元级别任务,关注每个词元的向量表示。比如词性表示任务。维护一个全局输出头(768 -> num_labels),将每个词元的向量表示输入,得到其对应的标签。

问答

利用QA对进行微调。其输入为:CLS 问题 SEP 段落 SEP。然后维护2个全局输出头(768 -> 1),得到每个token作为开始位置的分数和结束位置的分数,最后softmax得到每个token作为开始位置的概率和结束位置的概率。