算法岗常见面试题(七):语言模型

两种策略将预训练的语言表示应用到下游任务:

  1. 基于特征 (feature-base):将训练出的表示作为feature用于任务。
  2. 微调 (fine-funing):在预训练好的模型上加些针对任务的层,再对后几层进行精调。

1 Word2vec (feature-base)

理解 Word2Vec 之 Skip-Gram 模型

word2vec原理推导与代码分析

word2vec Parameter Learning Explained

(5条消息) 图解Word2vec,读这一篇就够了(通俗易懂)_文晓武的博客-CSDN博客_word2vec流程

1.1 说说word2vec ?

语言离散表示的缺点:

  1. 维度过高,数据稀疏,难以优化
  2. 不包含语义,无法衡量词与词之间的关系

word2vec是一种分布式表示。(为什么叫分布式表示:相比于one-hot只有一个维度是1,将词的表示集中在某个维度,分布式表示将词的信息分散到每个维度。)

word2vec是从大量文本语料中以无监督的方式学习语义知识的一种模型,通过一个嵌入空间使得语义上相似的单词在该空间中距离很近。 基本流程:先基于训练数据构建一个神经网络,当模型训练好之后,用这个模型通过训练数据所学到的参数,如隐层的权重矩阵,作为词向量。 模型的输出概率代表了词典中每个词有多大的概率跟input word同时出现。

1.2 word2vec为什么通过单词预测可以学习到单词的embedding?

无监督的学习方式,利用上下文语言环境学习词的嵌入表示。通过一个嵌入空间,使得语义上相似的单词再该空间内距离很近。

1.3 两种原理/框架

skip-gram和CBOW的训练目标都不是得到一个预测上下文词的模型,而是作为一种预训练任务,得到词向量。

alt

每个模型包含三个层:输入层、投影层、输出层。

从上图中可以看出,初始的Word2vec方法中可以产生两种词向量,输入层到投影层之间的权重矩阵得到输入向量vwv_w,投影层到输出层之间的权重矩阵得到输出向量vwv_w^’。最终使用的词向量是输入向量vwv_w,而输出向量会在后期的模型优化过程中被省略。

输入层是词的one-hot表示。

预测使用softmax激活函数。

损失函数是对数似然函数:E=logp(wOwI)E=-logp(w_O|w_I)wIw_IwOw_O分别为输入单词和目标输出单词,p(wOwI)p(w_O|w_I)对应了输出层的yOy_O,最小化EE

  • 损失函数是如何得到的?

    对于CBOW和skip-gram,训练目标为maxp(wOwI)maxp(w_O|w_I),即使得目标输出的softmax的概率最大,对maxp(wOwI)maxp(w_O|w_I)进一步推导得到:

    maxp(wOwI)=maxyj=maxlogyj=maxlog(eujjVeuj)=ujlogjVeuj:=Emaxp(w_O|w_I)=maxy_{j*}=maxlogy_{j*}=maxlog(\frac{e^{u_{j*}}}{\sum_{j'\in V}e^{u_{j'}}})=u_{j*}-log\sum_{j'\in V}e^{u_{j'}}:=-E

    其中jj*对应了目标单词的下标。

1.3.1 skip-gram

给定input word预测上下文。 神经网络的模型图: alt

输入层:一个单词的词向量。

投影层:没有操作,直接将输入的词向量传向输出层。 如果需要用300维的向量表示词向量,则隐层需要有300个节点,隐层矩阵为10000行,300列(10000为词汇数,300为隐层个数)。最终目标就是学习隐层的权重矩阵(10000x300) 模型训练完毕,直接查询word对应的index所在行的向量,即为输入单词的词嵌入。 如果两个词具有非常相似的上下文,那么他们的嵌入向量也会非常相似

输出层:每个单词都是相互独立的,没有顺序关系,共享权重矩阵

损失函数为对数似然函数:

L=wClogp(Context(w)w)L=-\sum_{w\in C}logp(Context(w)|w)

其中,p(Context(w)w)=uContext(w)p(uw)p(Context(w)|w)=\prod_{u\in Context(w)}p(u|w) alt

1.3.2 CBOW

用中心词的C个上下文单词,预测中心词。 alt

输入层:上下文的词向量。

投影层:每个上下文使用的权重矩阵是共享的,且该层不使用激活函数。投影层对输入进行向量相加求平均值的操作。

输出层:输出最可能的w。可以看做一个对分类问题,最朴素的做法是softmax回归。

损失函数为对数似然函数:

L=wClogp(wContext(w))L=-\sum_{w\in C}logp(w|Context(w)) alt

1.4 优化策略(超参数一面)

(答出前两条即可)

  1. 层次softmax(Hierarchical Softmax):时间复杂度从V降到logV (V为词表的大小)
  2. 负采样:时间复杂度从V下降到NnegN_{neg}+1(NnegN_{neg}为负采样的样本个数)
  3. 二次采样subsampling:对高频次单词进行抽样来减少训练样本的个数
  4. 将常见的单词组合或者词组作为单个“words”来处理
  5. 对优化目标采用负采样方法,这样每个训练样本的训练只会更新一小部分的模型权重,从而降低计算负担

1.4.1 层次softmax

从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,并从中找概率最大的值。层次softmax是计算softmax 的一种高效策略

基本思想

在求概率分布时,不对所有单词的概率求和来做归一化,而是用哈夫曼树来构建softmax,无需计算词表中所有单词的softmax并选择最大的作为输出,只需遍历树的深度个节点,即可找到softmax值最大的词作为输出。 alt

基本结构

根据词频,通过哈夫曼树构建词表,其中,叶子节点表示单词,叶子节点的个数为词表的大小V,非叶子节点用来求到达叶子节点的概率,非叶子节点的个数为V-1。从根节点到叶子节点只有一条路径,用这条路径上所有非叶子节点概率的乘积作为该单词是输出单词的概率。这样只用计算树深度个输出节点的概率就可以得到目标单词的概率。此外,高频词非常接近树根,所需要的计算次数将进一步减少。

训练过程

将投影层输出的向量直接和哈夫曼树中的根节点相连。然后在非叶子节点上计算二分概率(sigmoid),这个概率是指从当前节点向左子树走还是右子树走的概率。

具体而言,每个非叶子节点相当于一个神经元/感知机(一个sigmoid激活函数),任务是预测它在随机游走过程中应该向左走还是向右走。层次softmax算法去掉了原始word2vec模型的输出向量,取而代之的是,每个非叶子节点都包含一个输出向量vn(w,j)v^’_{n(w,j)}vn(w,j)v^’_{n(w,j)}是一个可学习的参数,并在模型训练过程中不断调整。 一个词被定义为输出单词的概率的计算公式

一个词被定义为输出单词的概率的计算公式

v^’_{n(w,j)}反向传播过程中的更新计算公式

vn(w,j)v^’_{n(w,j)}反向传播过程中的更新计算公式

以上的反向传播的计算过程同时适用于CBOW和skip-gram,区别在于,在应用于skip-gram时,需要对输出的上下文中的每个单词都重复这个更新过程。

  • 哈夫曼树

    是一种带权路径长度最短的二叉树,也称最优二叉树。哈夫曼树的构建针对的是带权的叶子节点,应用到word2vec中,权重就是词频。

    基于词表的哈夫曼树的构建:

    每次从集合中选出权值最小的两个节点,以这两个节点作为左右子树构建新的树,其中,权重较小的作为左子树,权重较大的作为右子树,两个节点相同时就将深度较小的作为左子树。 alt

    根据词频构建,高词频的放在前面。于是每个叶子节点代表一个词,且每个词都可以表示为01的哈夫曼编码。

  • 多个二分类解决多分类问题

    SVM中的多分类是由二分类组成的,且使用的也是二叉树的结构。

1.4.2 负采样

为了解决每轮都有大量的输出向量需要更新的问题,我们选择只更新其中的一小部分样本。 负样本:输出端期望预测为0的word,即非期望预测结果的word 正样本:输出端期望预测为1的word,即为期望预测结果的word 如,输入"so",期望输出上下文词"quick",则"quick"为正样本,除"quick"以外的所有词为负样本。 基本思想

在输出向量中随机选择少量的负样本(比如5个)来更新权重,而不是对所有的词语都更新权重。正样本也需要更新权重。即,从原来的更新所有词的权重变为只更新少量负样本+正样本的权重负样本数量的选择

对于小规模数据集,5~20个大规模数据集,2~5个如何选择负样本

采样过程中需要构建概率分布,也可以随机抽取,还可以根据经验定义一个良好的分布。

某个词被选为负样本的概率和词频成正比

损失函数

alt

上述公式同时适用于CBOW和skip-gram模型,其中,应用于skip-gram模型时,一次只对上下文中的一个单词计算这个等式。反向传播的过程中,只更新输出向量中正样本和负样本对应的权重参数。

1.4.3 二次采样subsampling

对于训练原始文本中遇到的每一个单词,他们都有一定的概率被删掉,删除的概率与单词的频率有关。 alt

2 FastText

使用word2vec的结构训练,加上了ngram,ngram一方面可以增加信息,一方面避免OOV。

2.1 N-gram

(1条消息) 浅谈fastText中的N-gram特征_43v3rY0unG的博客-CSDN博客_fasttext ngram

ngram缓解了word2vec无序的问题,具体而言,fasttext将n-gram的词也当作文本中的词,在输入端体现处理,在计算隐层时,把n-gram的向量也加进去求和取平均。反向传播的过程中,模型会同时学到词的向量和n-gram的向量。

  • 哈希桶

    由于n-gram的量远大于原有的词,所以完全存下所有的n-gram并不现实。采用哈希桶的方式,把所有n-gram哈希到buckets个桶中,哈希到同一个桶的所有n-gram共享一个embedding vector。哈希的方式保证了查找效率O(1),桶的方式保证了内存消耗控制在O(buckets*dim)内。

ngram的使用前提是数据稀疏,分为两种:

  1. 用于分类(有监督的,需要设定label)
  2. 用于词向量(cbow和skipgram)

2-gram的形式:

['I love', 'love deep', 'deep learning', 'learning as', 'as it', 'it can', 'can help', 'help me', 'me resolve', 'resolve some', 'some complicated', 'complicated problems', 'problems in', 'in 2018']

  • 缺点

    会使词汇量指数级增长

2.2 FastText是什么(超参数二面)

  • 面试官让我回顾NLP模型发展时,我提到了FastText,于是面试官问FastText是什么?

使用word2vec的结构训练,加上了ngram,ngram一方面可以增加信息,缓解word2vec无序的问题,一方面避免OOV。

3 ELMo (feature-base)

alt

ELMo(Embedding from language Model)是一个语言模型(根据前k个词预测第k个词),其核心结构为一个双向LSTM,目标函数是最大化正反两个方向的语言模型的最大似然。

模型的输入为word2vec或其他方式得到的token embedding

  • word2vec缺点
    1. 每个词的特征向量只与自身相关,无法捕获上下文信息
    2. 每个单词的特征向量是唯一的,不能解决一词多义
  • ELMo的核心要点
  1. 使用大规模的无标签语料库训练双向LSTM语言模型
  2. 将ELMo得到的特征向量送到下游任务中,得到任务相关的预测结果。
  • 应用到下游任务 alt

  • 优势

    1. 可以处理一词多义
    2. 具有不同层次的表征能力。ELMo通过对多层LSTM的输出进行自适应加权的结构,使用其可以根据下游任务自适应调整ELMo的输出。
    3. 具有强大的灵活性,可以和各种下游任务结合
  • 缺点

    速度较慢,对每个token编码,都要通过language model计算得出。

4 GPT (fine-funing)

可迁移到多种NLP任务的,基于Transformer的语言模型。 模型的训练分两步:

  1. 无监督的预训练 目标函数是最大化似然函数。
  2. 有监督的训练数据

优点:

  1. 循环神经网所捕获到的信息较少,而transformer可以捕获到更长范围的信息
  2. 计算速度比循环神经网络更快,易于并行化
  3. 实验结果显示,Transformer的效果比ELMo和LSTM网络更好

缺点: 对于某些类型的任务需要对输入数据的结构作调整

#算法面经#
全部评论
楼主是不是经常做面试官?
点赞 回复 分享
发布于 2023-04-04 10:09 四川
这都是妥妥的干货啊
点赞 回复 分享
发布于 2023-04-04 10:15 四川
很受用!厉害
点赞 回复 分享
发布于 2023-04-04 20:04 广东

相关推荐

Pandaileee:校友加油我现在也只有一个保底太难了
点赞 评论 收藏
分享
10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
6 22 评论
分享
牛客网
牛客企业服务