美文网首页
NLP - 预训练模型

NLP - 预训练模型

作者: nlpming | 来源:发表于2020-08-05 21:19 被阅读0次

    1. 早期NLP预训练模型

    1.1 神经网络语言模型(NNLM)

    • NNLM由Begio在2003年提出发表在JMLR上。神经网络语言模型的训练目标是给定 w_t 的上文n-1个词w_{t-n+1}, ..., w_{t-2}, w_{t-1},预测 w_t 出现的概率 P(w_t|w_{t-n+1}, ..., w_{t-2}, w_{t-1});每个词输入到模型中首先经过One-hot编码,然后查询Look up Table(C),得到每个词的Word embedding:x=(C(W_{t-n+1}), ..., C(w_{t-2}), C(w_{t-1}))(n-1个词向量进行拼接得到x);x经过隐藏层,之后再经过softmax层得到词w_t生成的条件概率;其中y_{w_t} \in \mathbb{R}^{|V|},假设词表大小为|V|C的维度为|V| \times m,其中m表示词向量维度。h表示隐层的维度;

    y_{w_t} = b+Wx+U tanh(d +Hx)
    P(w_t|w_{t-n+1}, ..., w_{t-2}, w_{t-1}) = \frac{ e^{ y_{w_t}} }{ \sum_i {e^{ y_i}} }
    L(\theta) = \sum_{t} logP(w_t|w_{t-n+1}, ..., w_{t-2}, w_{t-1})

    • 上式中,b,d为偏置,W为输入层到输出层参数,加入输入到输出层的连接能够使得模型快速收敛。H为输入层到隐藏层的参数,U为隐藏层到输出层的参数。各个参数的维度如下:x \in \mathbb{R}^{(n-1)m \times 1}W \in \mathbb{R}^{|V| \times (n-1)m}H \in \mathbb{R}^{h \times (n-1)m}U \in \mathbb{R}^{|V| \times h}
    • 可以看出NNLM主要的计算集中在隐藏层、输出层之间的矩阵向量运算,以及输出层上的softmax归一化操作。 因此后续的相关研究工作中,很多是针对这一部分进行优化的,其中就包括了word2vec的工作。
    • 对神经网络语言模型而言,词向量word embedding只是副产物;Look up table(C)存储着每个词的词向量,它是一个矩阵,矩阵的每一行代表一个单词的词向量,行数等于词汇表大小;矩阵的列数等于词向量维数。
    神经网络语言模型.png

    1.2 Word2vec模型

    1.2.1 CBow和Skip-Gram模型

    • Wor2vec模型 :跟NNLM模型结构类似,去除了中间的隐藏层减少了计算量,并且其目标主要是用来训练词向量。word2vec模型包含两种结构CBow和Skip-Gram,CBow模型利用单词的上下文预测当前词生成的条件概率,Skip-Gram模型利用当前词预测上下文词生成的条件概率。最后在输出层为了减小softmax的计算,使用层次Softmax和负采样(Negative Sampling)方法减小输出层计算量。层次softmax实现采用的是哈夫曼树,将计算复杂度从 |V| 减小到 log|V|

    • 对于CBow模型其目标函数为如下对数似然函数:其中Context(w)表示w上下文中的词;\mathcal{ C}代表整个语料库;
      \mathcal {L} = \sum_{w \in \mathcal{C}} log p(w | Context(w))

    • 对于Skip-Gram模型其优化目标函数如下:
      \mathcal{L}= \sum_{w \in \mathcal{C}} log p(Context(w) | w)
      p(Context(w)|w) = \prod_{u \in Context(w)} p(u | w)

    word2vec模型.png

    1.2.2 层次softmax

    • 对于层次softmax实现的CBow模型而言,包括三层:输入层、投影层、输出层;假设Context(w)w前后各c个词组成;与NNLM模型相比:(1)在投影层NNLM是通过词向量拼接的方式得到x_w,然而CBow模型是通过向量相加的方式;(2)NNLM有隐藏层,然而CBow模型去除了隐藏层;(3)NNLM输出层是线性结构,CBow模型的输出是树形结构;
    • 输入层:包含Context(w)2c个词的词向量;假设每个词向量维度为m
    • 投影层:将输入的2c个词的向量做求和累加,即x_w = \sum_{i=1}^{2c} v(Context(w)_i) \in \mathbb{R}^m
    • 输出层:输出层对应一棵二叉树,它是以语料中出现过的词当叶子结点,以各词在语料中出现的次数当权值构造出来的Huffman树;在这棵Huffman树中,叶子结点共N个,分别对应词典D中的词;非叶子结点N-1个;
    • 符号定义如下:
      (1)p^w表示从根结点出发到达w对应叶子结点路径;
      (2)l^w表示路径p^w中包含结点的个数;
      (3)p^w_1, p^w_2, ..., p^w_{l_w}表示路径p^w中的l^w个结点;其中p^w_1表示根结点,p^w_{l_w}表示词w对应的结点;
      (4)d^w_1, d^w_2, ..., d^w_{l_w} \in (0,1),表示词w的Huffman编码,它由l^w-1位编码构成;
      (5)\theta^w_1, \theta^w_2, ..., \theta^w_{l_w-1} \in \mathbb{R}^m,路径p^w中非叶子结点对应的向量;
    层次softmax实现CBow模型.png
    • 条件概率p(w|Context(w))的定义,更具体的说就是如何利用向量x_w \in \mathbb{R}^m以及Huffman树来定义函数p(w|Context(w))由上图可以看出,从根结点出发到达“足球”这个叶子结点,中间共经历了4次分支,而每一次分支都可视为进行了一次二分类; 每一次分类的概率如下所示:

    第1次:p(d^w_2|x_w, \theta^w_1) = 1 - \sigma(x^T_w \theta^w_1)
    第2次:p(d^w_3|x_w, \theta^w_2) = \sigma(x^T_w \theta^w_2)
    第3次:p(d^w_4|x_w, \theta^w_3) = \sigma(x^T_w \theta^w_3)
    第4次:p(d^w_5|x_w, \theta^w_4) = 1 - \sigma(x^T_w \theta^w_4)

    • 最终条件概率p(足球|Context(足球))的计算公式如下:
      p(足球|Context(足球)) = \prod_{j=2}^{5} p(d^w_j | x_w, \theta^w_{j-1})
      p(w|Context(w)) = \prod_{j=2}^{l^w} p(d^w_j | x_w, \theta^w_{j-1})

    • 层次softmax基本思想: 对于词典D中的任意词w,Huffman树中比存在一条从根结点到词w对应结点的路径p^w(并且这条路径是唯一的)。路径p^w上存在l^w-1个分支,将每个分支看做做一次二分类,每一次二分类就产生一个概率,将这些概率乘起来就是所需的p(w|Context(w))将原来softmax回归问题,转换成了Huffman树上求解多个二分类的问题,时间复杂度由O(|V|)下降至O(log|V|)。

    1.2.3 负采样方法

    • 与层次softmax相比,NEG不使用复杂的Huffman树,而是利用相对简单的随机负采样,能大幅度提高性能;在CBow模型中已知词的Context(w)需要预测w,因此对于给定的Context(w)w就是一个正样本,其他词就是负样本了。 假设 u表示正负样本的集合,其中只有一个正样本w;则条件概率p(u|Context(w))的计算公式如下:
      p(u|Context(w)) = \begin{cases} \sigma(x^T_w \theta^u), & L^w(u) = 1; \\ 1 - \sigma(x^T_w \theta^u), & L^w(u) = 0; \end{cases}
    • 最终的优化目标如下:从下面的公式可以看出,为了最大化目标函数我们需要最大化正样本的概率,并且最小化所有负样本概率;
      \begin{align} \mathcal{L} &= \sum_{w \in \mathcal{ C}} log g(w) \\ &= \sum_{w \in \mathcal {C}} log \left( \sigma(x^T_w \theta^w ) \prod_{u \in NEG(w)} [1 - \sigma(x^T_w \theta^u)] \right) \end{align}
    • 负采样算法: 对于一个给定的词w,如何生成NEG(w)呢?通常的要求是对于那些高频词,被选为负样本的概率应该比较大,反之对于哪些低频词被选中负样本的概率应该比较小。本质上就是一个带权采样的过程。

    (1)假设词典\mathcal{D }中的每一个词w对应一个线段l(w),长度为:len(w) = \frac{counter(w) }{\sum_{u \in \mathcal{D}} counter( u)}counter(w)表示w在语料中出现的次数;现在将语料中所有词的长度进行拼接得到长度为1的单位线段;
    (2)随机采样的策略就是每次生成一个[0, 1]之间的随机数,当随机数命中某个线段的范围,将这个线段对应的单词作为负样本;

    负采样算法实现.png

    1.3 Glove模型

    • Glove模型:基于全局信息统计词与词之间的共现,构建共现矩阵X_{ij}。构建词向量(w_i^T \tilde{w_j}) 与共现矩阵之间的近似关系,由此构建目标函数 J(\theta)。优化目标函数得到词向量。具体原理参考:GloVe详解

    w_i^T \tilde{w_j} + b_i + \tilde{b_j} = log(X_{ij}) \\ J(\theta) = \sum_{i,j=1}^{V} f(X_{ij}) (w_i^T \tilde{w_j} + b_i + \tilde{b_j} - log(X_{ij}))^2

    1. 早期的预训练模型,训练出的词向量是 静态固定不变 的。即相同的单词,在不同的上下文情况下,其词向量是一样的。
    2. 对于一词多意的问题很难解决。比如下面的例子,bank在不同的上下文下对应不同的意思:银行,河堤;
    3. 因此考虑如何解决,在不同的上下文情况下,单词得到不同的词向量?即获取 动态词向量
    一词多意问题.png

    2. 动态词向量模型

    2.1 ELMo模型

    • ELMo模型发表在2018 NAACL会议上,并获得最佳论文奖。ELMo模型使用双层双向LSTM网络,对句子进行建模。其训练目标还是给定单词上下文词,预测当前词出现的条件概率,模型结构如下。左边是一个前向双层LSTM网络,用于编码单词w_t的上文信息;右边是一个后向双层LSTM网络,用于编码单词w_t的下文信息。

    前向语言模型:p(t_1, t_2, ..., t_N) = \prod_{k=1}^{N} p(t_k|t_1, t_2, ..., t_{k-1}) \\ 后向语言模型:p(t_1, t_2, ..., t_N) = \prod_{k=1}^{N} p(t_k|t_{k+1}, t_{k+2}, ..., t_N) \\ 目标函数:L(\theta) = \sum_{k=1}^N \left( logp(t_k|t_1, t_2, ..., t_{k-1}, \theta_x, \overrightarrow{\theta}_{LSTM}, \theta_S) + logp(t_k|t_{k+1}, t_{k+2}, ..., t_N, \theta_x, \overleftarrow{\theta}_{LSTM}, \theta_S) \right)

    • 上式中,\theta_x表示单词向量,\theta_S表示softmax层的参数;
    ELMo模型.png
    • ELMo词向量的应用:对于每一个token而言t_k,假设LSTM网络层数为L,则token可由2L+1个向量表示;通过对token的每个向量 \{ x_k^{LM}, \overrightarrow{h_{k,j}^{LM}}, \overleftarrow{h_{k,j}^{LM}} \}进行加权输出,将加权后的向量利用到下游任务中。其中三种向量的权值,根据具体任务训练得到。

    \begin{align} R_k & = \{ x_k^{LM}, \overrightarrow{h_{k,j}^{LM}}, \overleftarrow{h_{k,j}^{LM} } | j = 1, 2, ..., L \} \\ & = \{ h_{k,j}^{LM} | j=0,1,2, ..., L \} \end{align}

    2.2 BERT模型

    • BERT模型2018年由谷歌提出,使用Transformer的Encoder作为BERT基础结构。BERT与ELMo模型不同,它的训练使用了两个任务:Masked LM 和 Next Sentence Prediction (NSP)
    BERT模型.png

    2.2.1 Masked LM任务

    • Masked LM任务与Word2vec中的CBow模型有点类似,通过Mask一些输入的词,利用上下文的信息预测这个词。
    • 具体的Mask策略: 对于输入的句子,随机的masked句子中15%的词;为了防止fine-tuning的时候[MASK]标记没有出现的问题,预训练阶段并不是将词都替换成[MASK],具体策略如下:
      (1)80%的概率,将词替换成特殊标记[MASK]
      (2)10%的概率,随机将词替换成词表中任意一个词;
      (3)10%的概率,维持当前词不变;
    Masked LM.png

    2.2.2 NSP任务

    • NSP任务是一个二分类任务;NSP任务,对于fine-tuning阶段QA和NLI效果提升起着重要作用。
    NSP.png

    2.2.3 BERT模型输入

    • 首先输入的句子会使用WordPiece模型得到子词解决unk问题,然后每一个token会有一个对应的embedding(Token embedding);其次对于输入的两个句子都有其对应的embedding(Segment embedding),最后每一个位置都有对应的Position embedding
      BERT模型的输入.png

    2.2.4 如何使用BERT?

    1) 单文档分类任务
    • 例如常见的情感分析,就是单文档分类任务;将学习到的[CLS]向量输入到一个线性分类器中,预测得到每个类别的概率。
    单文档分类.png
    2) 序列标注任务
    • 输入一个句子,输出每个词的label。比如对话系统领域的槽位填充任务就是一个序列标注问题。
    序列标注任务.png
    3) 多文档分类任务
    • 输入两个句子,输出一个label。比如自然语言推理(Natural Language Inference )任务。
    多文档分类任务.png
    4) 问答系统
    • Extraction-based Question Answering这种类型的问答,其答案出现在文档中,只需要确定start(s),end(e)的位置。
    问答系统.png
    • 如何计算得到start, end?start和end分别学习两个向量,计算最终的softmax输出概率。
    计算start.png 计算end.png

    2.3 GPT模型

    • GPT模型使用的是Transformer的Decoder,所以其没有考虑下文信息。BERT模型认为这是它主要的缺点。如下图所示,在计算 生成的条件概率时,其只考虑了<BOS>, 潮水, 退了
    Transformer Decoder self Attention.png
    • 模型参数数量对比
    image.png

    参考论文

    参考资料

    相关文章

      网友评论

          本文标题:NLP - 预训练模型

          本文链接:https://www.haomeiwen.com/subject/mgcprktx.html