NLP面试题汇总1(吐血整理)

统计学习方法笔记

当正负样本极度不均衡时存在问题!比如,正样本有99%时,分类器只要将所有样本划分为正样本就可以达到99%的准确率。但显然这个分类器是存在问题的。当正负样本不均衡时,常用的评价指标为ROC曲线和PR曲线。

概率模型:决策树、bayes、HMM、CRF、概率潜在语义分析、潜在狄利克雷分析lda、高斯混合模型(一定可以表示为联合概率分布的形式,)概率模型的代表是概率图模型,即联合概率分布由有向图或者无向图表示的模型,而联合概率可以根据图的结构分解为因子乘积的形式。Bayes,CRF,HMM都是概率图模型。

非概率模型:SVM、感知机、k近邻、k均值、潜在语义分析、NN、Adaboost,LR两者都有。

生成模型:HMM、navie bayes,可以还原出联合概率分布,收敛更快,存在隐变量依然可以用生成方法学习,

判别模型:k近邻、感知机、决策树、LR、最大熵、svm、CRF。往往学习准确率更高,可以进行各种成都上 的抽象,定义特征并使用特征,简化学习问题。

bayes估计:利用bayes定理,计算给定数据条件下的条件概率,即后验概率,取后验概率最大!

极大似然估计:频率学派,取能使概率最大的参数。

损失函数和风险函数:损失函数(代价函数)一次度量模型一次预测的好坏,风险函数度量平均意义下模型预测的好坏。

损失函数:0-1,平方损失,绝对损失,对数(似然)损失

损失函数的期望就是理论上模型关于联合分布的平均意义下的损失,即风险函数,或期望损失。学习的目标就是选择期望风险最小的模型。

经验风险:关于数据集的平均风险

期望风险:模型关于联合分布的期望损失。

经验风险最小化:极大似然估计,当模型是条件概率分布,损失函数为对数损失,经验风险最小化等价于极大似然估计。当样本容量小,会产生过拟合

结构风险最小化:防止过拟合提出,等价于正则化,加入了正则化项。如bayes估计中的最大后验概率估计。

过拟合:模型参数过多,学习到了噪音,对训练数据预测很好,对位置数据很差,导致模型拟合能力下降。

欠拟合:模型过于简单,未学习到数据的较多特征,都很差。

决策树:表示给定特征条件下类的条件概率分布,包含特征选择,决策树生成,剪枝

熵:随机变量不确定性的度量。

条件商:已知随机变量X的条件下随机变量Y的不确定性,定义X条件下Y的条件概率分布的熵对X的数学期望。

信息增益(互信息):得知特征X的信息而使得y信息不确定性减少的程度。即:经验熵H(D)与H(D/A)之差。

信息增益比:其信息增益g(D,A)与训练集D关于特征A的值的熵HA(D)之比。

剪枝:通过优化函数考虑了减小模型复杂度,损失函数的极小化等价于正则化的极大似然估计。

ID 3 :选择信息增益最大的特征建立子节点,再递归调用上述方法,直至所有特征小于某阈值或没有,极大似然法。

C 4.5: 选择信息增益比最大的特征建立子节点,再递归调用上述方法,直至所有特征小于某阈值或没有,极大似然法。

CART :Gini 指数最小化准则(经A=a分割后的不确定性)。平方误差损失,启发式,最小二乘回归树。二分类gini = 2p(1-p)

最大熵模型:熵最大的模型是最好的模型,在约束条件下,在没有更多信息情况下,那些不确定部分是等可能的,极大似然估计,LR和最大熵都归结为以似然函数为目标的最优化问题,它是光滑的凸函数,保证能找到全局最优解。

SVM:二分类模型,定义在特征空间上的间隔最大的分类器。学习策略就是间隔最大化,求解二次凸优化问题,等价于正则的合页损失函数的最小化问题,可分为线性可分,线性支持,非线性支持。不可分可用和技巧。

函数间隔:分类预测的正确性及确信度,除以范数变为几何间隔,

SVM学习的基本思路是求解能够正确划分训练集并且使几何间隔最大的分离超平面。在决定分离超平面时,只有SV起作用,,引入对偶问题往往更容易求解,其次可以推广到非线性分类问题。

线性不可分时,即不能满足函数间隔大于等于1,可引入松弛变量,软间隔最大,

引入核函数,将原空间变换映射到新空间,多项式,高斯核,

SMO:序列最小最优化算法。针对2个变量构建一个二次规划问题,不断分解为子问题并对子问题求解,包括求解2个变量二次规划问题及选择变量的启发式方法。选择第1个变量的过程是外层循环,寻找违反KKt条件最严重的点,第2个变量是内层循环,标准是能使这个变量有较大变化。每一次只学习基函数及系数。

Adaboost:提高被前一轮分类器错误分类样本的权值,降低正确分类的权值,加法模型,损失函数为指数函数,不用知道下界,采用前向分布算法。

提升树:平方损失(求导后,拟合残差了),指数损失,一般损失(不好优化计算)->

梯度提升树:最速下降法拟合残差的近似值,计算负梯度,拟合一个回归树。

EM:用于求解含有隐变量的概率模型参数的极大似然估计,或积大后验概率估计。Jenson不等式,求中点再log更大!image-20201007205854157

HMM:可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成不可观测的状态随机序列,

再由各个状态生成一个观测从而产生观测随机序列的过程,属于生成模型,是关于时序的概率模型。由初始概率分布,状态转移概率分布,观测概率分布决定,状态转移概率矩阵和初始的概率向量确定了隐藏的morkv连,生成不可观测的状态序列,观测矩阵确定了如何从状态生成观测,与状态序列综合确定了如何产生观测序列。

作了两个假设:1齐次马尔可夫假设:隐层的马尔可夫链在任意时刻只依赖与其前一时刻的状态,与其他时刻的状态无关,也与t时刻无关。2观测独立性假设:任意时刻的观测只依赖于该时刻的morkov链的状态,与其他观测及状态无关。

HMM3个基本问题:

1.概率计算问题:给定模型和观测序列,求在模型下观测序列O出现的概率。直接计算1求状态序列概率,2求对固定的状态序列下观测的概率,3求状态序列和观测序列同时出现的联合概率,4对所有可能的状态序列求和。O(TN^T)掷出1,6,8的概率。

前向与后向算法:减小计算量的原因在于每一次计算直接引用前一个时刻的计算结果,避免重复计算。高效的关键是局部计算前向概率,利用路径结构将前向概率递推到全局。

2.学习问题:给定观测序列,估计模型参数,使得该模型下观测序列概率最大,即用极大似然概率方法估计参数。EM求隐变量。哪种筛子掷出的概率最大

3.预测问题(解码问题):已知模型和观测序列,求对给定观测序列条件概率P(I/O)最大的状态序列I。即给定观测序列,求最有可能的对应的状态序列。近似算法与维特比算法。反推出每种骰子是什么。

维特比:DP解HMM预测问题,基用动态规划求概率最大路径问题(最优路径),一条路径对应着一个状态序列。

CRF:给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成morkov随机场(概率无向图模型),由输入到输出的判别模型,形式为对数线性模型。学习方法通常是极大似然估计或正则化的极大似然估计。直接求条件概率分布的模型故为判别,使用特征函数更加抽象表达特征f(X,i,yi,yi-1)

成对morkov性:随机变量组条件下,随机变量Yu和Yv是独立的。

局部morkov:

全局morkov:

如果满足3个性质,即为概率无向图模型。

将概率无向图的联合概率分布表示为其最大团上的随机变量的函数的乘机形式的操作即为因子分解。

CRF预测问题:求非规划化概率最大的最有路径问题,不求和只需记录Max值和位置,根据最后节点向前回溯选取最佳路径。中途只保留最短路径。

CRF可看成是序列化的LR,都是判别式,LR不是用分类条件估计w,而是用了sum(wixi)近似估计,若将ak替换成f,则与crf一样!

如何从CRF到HMM?对于每个转移概率p(ti/ti-1),定义f(x,i,yi,yi-1)=1,yi=ti,yi-1=ti-1,权重为logp(ti=yi/ti-1=yi-1),对于每个f,同样操作就可以得到HMM!

闵可夫斯基距离:p=2欧式,p=1曼哈顿,p=无穷切比雪夫,

马哈拉诺比斯距离:距离越大,相似越小,

皮尔逊相关系数与余弦距离,修正后的余弦距离。皮与修在于中心化方式不同。

奇异值分解SVD:mxn=m阶正交矩阵、由降序排列的对角元素组成的mxn矩形对角矩阵、n阶正交矩阵。矩阵的奇异值分解一定存在,但不唯一,几何解释是可分解为三个简单的变换:一个坐标系的旋转或反射VT、一个坐标轴的缩放sum、另一个坐标系的旋转或反射U。可看作是矩阵压缩的一种方法。即用因子分解近似表示原始矩阵,是在平方损失意义下的最优U近似。正交矩阵同转置相乘为单位矩阵。紧奇异值分解为无损压缩,截断奇异值分解为有损压缩。U的列为左奇异,V的列为右奇异向量。

PCA:利用正交变换把线性相关变量表示的 观测数据转换为少数几个线性无关变量表示的数据,线性无关的变量为主成分,属于降维方法。

LSA潜在语义分析:无监督学习,通过矩阵分解发现文本与单词之间基于话题的语义关系。传统方法以单词向量表示文本语义内容,以单词向量空间度量表示文本之间的相似度。LSA采用了非概率的话题分析模型,将文本集合表示为单词-文本矩阵,对单词-文本矩阵进行SVD分解,从而得到划题空间,以及文本在话题向量空间的表示。

NMF非负矩阵分解:分解的矩阵非负,也用于话题分析。

PLSA:概率潜在语义分析:

LDA潜在狄利克雷分配:作为bayes学习的话题模型,是LSA,PLSA的扩展。lda的预测一个文档是输出的主题-文档的概率向量,就是说这个文档属于各个主题的概率向量。每个主题的含义是由你训练过程中得到的主题-词分布决定。比如预测一个文档的输出是(0.25,0.75),就是说这个文档中的内容25%属于第一个主题,75%属于第二个主题。每一个主题的具体含义就看主题-词分布中概率排的靠前的一些词语,大致是这样,预测过程是认为训练得到的主题-词分布不变,这个输出其实就是新文档对应于各个主题的采样概率。用最大似然计算出来的。输出的数字就是新样本在该主题分布下的概率,比如第一个主题数字为0.5,那么新样本内容在该主题下的概率就是百分之50。

AdaBoosting

总之,AdaBoost的主要思想就是在不改变训练数据的情况下,通过在迭代训练弱学习器中,不断提升被错分类样本的权重(也就是使被错分的样本在下一轮训练时得到更多的重视),不断减少正确分类样本的权重。最后通过加权线性组合M个弱分类器得到最终的分类器,正确率越高的弱分类器的投票权数越高,正确率低的弱分类器自然投票权数就低。集成学习,(就我目前所学习到的)主要可以分为三大类,Boosting, Bagging, Stacking。Boosting的代表有AdaBoost, gbdt, xgboost。而Bagging的代表则是随机森林 (Random Forest)。Stacking 的话,好像还没有著名的代表,可以视其为一种集成的套路。

Boosting

首先,Boosting是一个迭代提升的过程,所以它肯定是串行的算法(尽管xgboost可以在节点分裂属性选择上做并行计算)。基于训练集,先训练弱学习器,然后根据前一个弱学习器分错的样本,改变样本的概率分布构成新的训练集,从而可以训练出一个更强的学习器。这样反复迭代提升,就能得到一系列分类器。最后,将这些分类器组合起来,就能构成一个很强的学习器。

AdaBoost

给定一个二分类的训练数据集

T={(x1,y1),…,(xN,yN)}

其中,x_i 是n维的, 类标y_i={-1,+1}

AdaBoost算法的步骤:
(1) 初始化训练数据的权值分布:D1=(w11,…,wi1,…,w1N),w1i=1/N,i=1,2,…,N(即初始时,每个样本视为一样的)
(2) 对m=1,2,…,M
(2a) 对具有权值分布Dm的训练数据集学习,得到一个基本分类器Gm(x)
(2b) 计算Gm(x)在训练数据集上的分类错误率:em=P(Gm(xi)!=yi)
(2c) 根据分类错误率计算Gm(x)的加权系数:am
(2d) 根据加权系数更新训练数据集的权值分布Dm+1
(3)以上学到了M个“弱”学习器,将这M个弱学习器加权求和:f(x)=sum(am*Gm(x)),最终的分类器为G(x)=sign(f(x))

总之,AdaBoost的主要思想就是在不改变训练数据的情况下,通过在迭代训练弱学习器中,不断提升被错分类样本的权重(也就是使被错分的样本在下一轮训练时得到更多的重视),不断减少正确分类样本的权重。最后通过加权线性组合M个弱分类器得到最终的分类器,正确率越高的弱分类器的投票权数越高,正确率低的弱分类器自然投票权数就低。

GBDT

GBDT的基本原理是boosting里面的 boosting tree(提升树),并使用gradient boost。GBDT中的树都是回归树,不是分类树 ,因为gradient boost 需要按照损失函数的梯度近似的拟合残差,这样拟合的是连续数值,因此只有回归树。Gradient Boosting是一种Boosting的方法,其与传统的Boosting的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boosting中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少,与传统Boosting对正确、错误样本进行加权有着很大的区别。这个梯度代表上一轮学习器损失函数对预测值求导。与Boosting Tree的区别:Boosting Tree的适合于损失函数为平方损失或者指数损失。而Gradient Boosting适合各类损失函数(损失函数为:平方损失则相当于Boosting Tree拟合残差、损失函数为:使用指数损失则可以近似于Adaboost,但树是回归树)

下面是完整的GBDT介绍。

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它在被提出之初就和SVM一起被认为是泛化能力较强的算法。**GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类。**GBDT的思想使其具有天然优势可以发现多种有区分性的特征以及特征组合。

REGRESSION DECISION TREE:回归树

回归树总体流程类似于分类树,区别在于,回归树的每一个节点都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化平方误差。也就是被预测出错的人数越多,错的越离谱,平方误差就越大,通过最小化平方误差能够找到最可靠的分枝依据。分枝直到每个叶子节点上人的年龄都唯一或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。

img

回归树算法如下图(截图来自《统计学习方法》5.5.1 CART生成):

img

请注意上图中的下标和上标,xixi表示第i个样本,x(j)x(j)表示该样本的第j个feature。所以上图中的遍历划分变量j的意思是遍历feature和相应的s,找出使平方误差和最小的(j,s)。

BOOSTING DECISION TREE:提升树算法

提升树是迭代多棵回归树来共同决策。当采用平方误差损失函数时,每一棵回归树学习的是之前所有树的结论和残差,拟合得到一个当前的残差回归树,残差的意义如公式:残差 = 真实值 - 预测值 。提升树即是整个迭代过程生成的回归树的累加。
  举个例子,参考自一篇博客(参考文献 4),该博客举出的例子较直观地展现出多棵决策树线性求和过程以及残差的意义。
  训练一个提升树模型来预测年龄:
  训练集是4个人,A,B,C,D年龄分别是14,16,24,26。样本中有购物金额、上网时长、经常到百度知道提问等特征。提升树的过程如下:

img

该例子很直观的能看到,预测值等于所有树值得累加,如A的预测值 = 树1左节点 值 15 + 树2左节点 -1 = 14。
  因此,给定当前模型 fm-1(x),只需要简单的拟合当前模型的残差。现将回归问题的提升树算法叙述如下:

img

GRADIENT BOOSTING DECISION TREE:梯度提升决策树

提升树利用加法模型和前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步的优化很简单,如平方损失函数学习残差回归树。

img

但对于一般的损失函数,往往每一步优化没那么容易,如上图中的绝对值损失函数和Huber损失函数。针对这一问题,Freidman提出了梯度提升算法:利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树。(注:鄙人私以为,与其说负梯度作为残差的近似值,不如说残差是负梯度的一种特例)算法如下(截图来自《The Elements of Statistical Learning》):

img

xgboost

xgboost类似于gbdt,但是很多地方经过了Tianqi Chen大牛的优化,因此不论是精度还是效率上都有了提升。与gbdt相比,具体的优点有:

1.损失函数是用泰勒展式二项逼近,而不是像gbdt里就是一阶导数
2.对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性
3.节点分裂的方式不同,gbdt是用的gini系数xgboost是经过优化推导后的

xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。下面所有的内容来自原始paper,包括公式。

(1) xgboost在目标函数中显示的**加上了正则化项,**基学习器为CART时,正则化项与树的叶子节点的数量T和叶子节点的值有关。

img

(2) GB中使用Loss Function对f(x)的一阶导数计算出伪残差用于学习生成fm(x),xgboost不仅使用到了一阶导数,还使用二阶导数。第t次的loss:

img

对上式做二阶泰勒展开:

img

(3) 上面提到CART回归树中寻找最佳分割点的衡量标准是最小化均方差xgboost寻找分割点的标准是最大化Lsplit

img

xgboost算法的步骤和GB基本相同,都是首先初始化为一个常数,gb是根据一阶导数ri,xgboost是根据一阶导数gi和二阶导数hi,迭代生成基学习器,相加更新学习器。

xgboost与gdbt除了上述三点的不同,xgboost在实现时还做了许多优化:

  1. 在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
  2. xgboost考虑了训练数据为稀疏值的情况,可**以为缺失值或者指定的值指定分支的默认方向,**这能大大提升算法的效率,paper提到50倍。
  3. xgboost借鉴了随机森林中的列(特征)采样技术,即在某个节点分裂时,不是在当前节点中所有属性中选取最佳分裂属性,**而是在当前属性集合中的某些属性中来选择最优分裂属性。**这种方法降低了过拟合的可能性。
  4. 特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行。
  5. 按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。
  6. xgboost还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。

知乎上关于xgboost/gbdt讨论的经典问答

【问】xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?
  用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和DecisionTree一样我能理解,因为它是用bagging的方法把DecisionTree组合在一起,相当于做了多次DecisionTree一样。但是xgboost/gbdt仅仅用梯度上升法就能用6个节点的深度达到很高的预测精度,使我惊讶到怀疑它是黑科技了。请问下xgboost/gbdt是怎么做到的?它的节点和一般的DecisionTree不同吗?
【答】
  这是一个非常好的问题,题主对各算法的学习非常细致透彻,问的问题也关系到这两个算法的本质。这个问题其实并不是一个很简单的问题,我尝试用我浅薄的机器学习知识对这个问题进行回答。
  一句话的解释,来自周志华老师的机器学习教科书( 机器学习-周志华):Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
  随机森林(random forest)和GBDT都是属于集成学习(ensemble learning)的范畴。集成学习下有两个重要的策略Bagging和Boosting。
  Bagging算法是这样做的:**每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来。****简单的多数投票一般就可以。**其代表算法是随机森林。Boosting的意思是这样,他通过迭代地训练一系列的分类器,**每个分类器采用的样本分布都和上一轮的学习结果有关。**其代表算法是AdaBoost, GBDT。
  其实就机器学习算法来说,其泛化误差可以分解为两部分,偏差(bias)和方差(variance)。这个可由下图的式子导出(这里用到了概率论公式D(X)=E(X2)-[E(X)]2)。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。这个有点儿绕,不过你一定知道过拟合。
  如下图所示,当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小。但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大。所以模型过于复杂的时候会导致过拟合。

img

当模型越简单时,即使我们再换一组数据,最后得出的学习器和之前的学习器的差别就不那么大,模型的方差很小。还是因为模型简单,所以偏差会很大。

也就是说,当我们训练一个模型时,偏差和方差都得照顾到,漏掉一个都不行。
  对于Bagging算法来说,由于我们会并行地训练很多不同的分类器的目的就是降低这个方差(variance) ,因为采用了相互独立的基分类器多了以后,h的值自然就会靠近.所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树。
  对于Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择variance更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。

【问】机器学习算法中GBDT和XGBOOST的区别有哪些?
【答】
传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。

xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。

Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)

列抽样(column subsampling)即特征抽样。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。

xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

多种语言封装支持。

【问】为什么基于 tree-ensemble 的机器学习方法,在实际的 kaggle 比赛中效果非常好?
【答】

通常,解释一个机器学习模型的表现是一件很复杂事情,而这篇文章尽可能用最直观的方式来解释这一问题。我主要从三个方面来回答楼主这个问题。

  1. 理论模型 (站在 vc-dimension 的角度)
  2. 实际数据
  3. 系统的实现 (主要基于 xgboost)
    通常决定一个机器学习模型能不能取得好的效果,以上三个方面的因素缺一不可。

(1)站在理论模型的角度统计机器学习里经典的 vc-dimension 理论告诉我们:一个机器学习模型想要取得好的效果,这个模型需要满足以下两个条件:

  1. 模型在我们的训练数据上的表现要不错,也就是 trainning error 要足够小。
  2. 模型的 vc-dimension 要低。换句话说,就是模型的自由度不能太大,以防overfit.当然,这是我用大白话描述出来的,真正的 vc-dimension 理论需要经过复杂的数学推导,推出 vc-bound. vc-dimension 理论其实是从另一个角度刻画了一个我们所熟知的概念,那就是 bias variance trade-off.

好,现在开始让我们想象一个机器学习任务。对于这个任务,一定会有一个 “上帝函数” 可以完美的拟合所有数据(包括训练数据,以及未知的测试数据)。很可惜,这个函数我们肯定是不知道的 (不然就不需要机器学习了)。我们只可能选择一个 “假想函数” 来 逼近 这个 “上帝函数”,我们通常把这个 “假想函数” 叫做 hypothesis.

在这些 hypothesis 里,我们可以选择 svm, 也可以选择 logistic regression. 可以选择单棵决策树,也可以选择 tree-ensemble (gbdt, random forest). 现在的问题就是,为什么 tree-ensemble 在实际中的效果很好呢?

区别就在于 “模型的可控性”。

先说结论,tree-ensemble 这样的模型的可控性是好的,而像 LR 这样的模型的可控性是不够好的(或者说,可控性是没有 tree-ensemble 好的)。为什么会这样?别急,听我慢慢道来。

我们之前说,当我们选择一个 hypothsis 后,就需要在训练数据上进行训练,从而逼近我们的 “上帝函数”。我们都知道,对于 LR 这样的模型。如果 underfit,我们可以通过加 feature,或者通过高次的特征转换来使得我们的模型在训练数据上取得足够高的正确率。而对于 tree-enseble 来说,我们解决这一问题的方法是通过训练更多的 “弱弱” 的 tree. 所以,这两类模型都可以把 training error 做的足够低,也就是说模型的表达能力都是足够的。但是这样就完事了吗?没有,我们还需要让我们的模型的 vc-dimension 低一些。而这里,重点来了。在 tree-ensemble 模型中,通过加 tree 的方式,对于模型的 vc-dimension 的改变是比较小的。而在 LR 中,初始的维数设定,或者说特征的高次转换对于 vc-dimension 的影响都是更大的。换句话说,tree-ensemble 总是用一些 “弱弱” 的树联合起来去逼近 “上帝函数”,一次一小步,总能拟合的比较好。而对于 LR 这样的模型,我们很难去猜到这个“上帝函数”到底长什么样子(到底是2次函数还是3次函数?上帝函数如果是介于2次和3次之间怎么办呢?)。所以,一不小心我们设定的多项式维数高了,模型就 “刹不住车了”。俗话说的好,步子大了,总会扯着蛋。这也就是我们之前说的,tree-ensemble 模型的可控性更好,也即更不容易 overfit.

(2)站在数据的角度

除了理论模型之外, 实际的数据也对我们的算法最终能取得好的效果息息相关。kaggle 比赛选择的都是真实世界中的问题。所以数据多多少少都是有噪音的。而基于树的算法通常抗噪能力更强。比如在树模型中,我们很容易对缺失值进行处理。除此之外,基于树的模型对于 categorical feature 也更加友好。

除了数据噪音之外,feature 的多样性也是 tree-ensemble 模型能够取得更好效果的原因之一。通常在一个kaggle任务中,我们可能有年龄特征,收入特征,性别特征等等从不同 channel 获得的特征。而特征的多样性也正是为什么工业界很少去使用 svm 的一个重要原因之一,因为 svm 本质上是属于一个几何模型,这个模型需要去定义 instance 之间的 kernel 或者 similarity (对于linear svm 来说,这个similarity 就是内积)。这其实和我们在之前说过的问题是相似的,我们无法预先设定一个很好的similarity。这样的数学模型使得 svm 更适合去处理 “同性质”的特征,例如图像特征提取中的 lbp 。而从不同 channel 中来的 feature 则更适合 tree-based model, 这些模型对数据的 distributation 通常并不敏感。

(3)站在系统实现的角度

除了有合适的模型和数据,一个良好的机器学习系统实现往往也是算法最终能否取得好的效果的关键。一个好的机器学习系统实现应该具备以下特征:

  1. 正确高效的实现某种模型。我真的见过有些机器学习的库实现某种算法是错误的。而高效的实现意味着可以快速验证不同的模型和参数。
  2. 系统具有灵活、深度的定制功能。
  3. 系统简单易用。
  4. 系统具有可扩展性, 可以从容处理更大的数据。

到目前为止,xgboost 是我发现的唯一一个能够很好的满足上述所有要求的 machine learning package. 在此感谢青年才俊 陈天奇。

在效率方面,xgboost 高效的 c++ 实现能够通常能够比其它机器学习库更快的完成训练任务。

在灵活性方面,xgboost 可以深度定制每一个子分类器,并且可以灵活的选择 loss function(logistic,linear,softmax 等等)。除此之外,xgboost还提供了一系列在机器学习比赛中十分有用的功能,例如 early-stop, cv 等等在易用性方面,xgboost 提供了各种语言的封装,使得不同语言的用户都可以使用这个优秀的系统。

最后,在可扩展性方面,xgboost 提供了分布式训练(底层采用 rabit 接口),并且其分布式版本可以跑在各种平台之上,例如 mpi, yarn, spark 等等。

有了这么多优秀的特性,自然这个系统会吸引更多的人去使用它来参加 kaggle 比赛。

综上所述,理论模型,实际的数据,良好的系统实现,都是使得 tree-ensemble 在实际的 kaggle 比赛中“屡战屡胜”的原因。

Bagging

Bagging的代表算法是随机森林,简单说下随机森林的步骤:

(1) 对训练样本进行bootstrap自助法采样,即有放回的采样,获得M个采样集合;
(2) 在这M个采样集合上训练处M个弱决策树。注意到,在决策树生成中还用到了列采样的技巧,原本决策树中节点分裂时,是选择当前节点中所有属性的最优属性进行划分的,但是列采样的技巧是在所有属性中的子集中选最优属性进行划分。这样做可以进一步降低过拟合的可能性;
(3) 对这M个训练出来的弱决策树进行集成。

Stacking

Stacking还没有代表性的算法,我姑且把它理解成一个集成的思想吧。具体做法是:

(1) 先将训练集D拆成k个大小相似但互不相交的子集D1,D2,…,Dk;
(2) 令Dj’= D - Dj,在Dj’上训练一个弱学习器Lj。将Dj作为测试集,获得Lj在Dj上的输出Dj’’;
(3) 步骤2可以得到k个弱学习器以及k个相应的输出Dj’’,这个k个输出加上原本的类标构成新的训练集Dn;
(4) 在Dn训练次学习器L,L即为最后的学习器。

以上Stacking只做了一层,据kaggle上的大神反馈,Stacking可以做好多层,会有神奇的效果。

下面给出kaggle中一个Stacking的实例,就是入门级的titanic那道题单层stacking的源码(只给出了stacking 的过程,前面特征工程处理的代码被省略掉了)。Stacking后的xgboost(得分:0.77990)比我之前只用xgboost时(得分:0.77512)提高了一点,排名上升了396…… 源码戳这

Log on 2017-6-22: Stacking了两次之后,得分从单次stacking的0.77990上升到了0.79904

Log on 2017-6-22: Stacking了三次之后,得分从两次stacking的0.77990降低到了0.78469。所以,Stacking并不是越多层越好,反而会变坏。

一个良好的自我介绍究竟如何准备呢。

其实,好的自我介绍和一个吸引人的演讲是一样的,需要关注的永远是听众更想听什么,然后把你想说的东西用听众喜欢的方式表达出来。那么对于面试的自我介绍而言,我们需要关注的就应当是面试官想要招一个什么样的员工,然后对应的去组织自己的语言。所以,一般一个好的自我介绍的核心内容往往就是三段式:
1.首先,面试官招聘的很有可能以后就是他的同事,所以他一定希望面试者是一个有趣的人。毕竟谁愿意整天面对着一个面瘫脸工作呢,因此自我介绍里面一定要有能体现自己性格开朗,沟通能力等软实力方面的内容。但是严防出现大段这类话的形况,防止喧宾夺主,毕竟人家招的还是技术岗,技术最重要。
2.和其他行业不同,IT届的技术岗非常重视你的技术实力,因此自我介绍中用简V
3.计算机技术日新月异,迭代的速度完全不是其他任何行业可以比拟的。因此工作的时候需要不断地学习新知识,否则根本无法适应不断提升地业务需要。所以面试官希望的面试者还是一个对于技术、新鲜事物有强烈好奇心的骚年。
但需要这三段,并不是说只要包含这三个内容就足够了。表达的方法也很重要,不能像第二种类型一样,只是干瘪的介绍。每一个论述都需要有论点的支撑,最好的方法就是每个你想介绍的方面都选取你的经历中最典型的,能表现这一方面的用几句话概括起来,然后加上所以我觉得沟通能力还不错之类的总结。这样才能让自我介绍更加丰满,让面试官感觉好像听故事一样。
同时,自我
介绍的时候语气也非常重要!!首先全程一定要用中气十足的语气,让人觉得你很有自信
,千万千万不要蔫儿蔫儿的。对于不同的内容,要注意情绪的转换,比如说自己幽默、性格开朗的时候,你就需要用一种积极向上的,话里都带着笑得语气表达出来**,千万不要像白开水水一样让人感觉你在背书**。否则,你的内容准备得再好也没有半毛钱用处。

简历应该是怎么样的
简历虽然只是求职的第一步,但如果连第一步都跨不过去,那么更别谈什么面试的技巧。面试不同的岗位都影响简历的撰写,像我这样面试技术岗的,简历还是需要简洁一点,可以走性冷淡风,不要太多的废话。面试技术岗简历上所有的文字都是应该体现你在这个岗位之间的优势,其他所有东西都不能提高你面试的成功率,哪怕你获得的是全国劳动模范。

    如果是找实习岗位的话,简历应该以项目经历为主,选择三个最能体现自己能力的项目即可。每一个项目都应该写明项目的过程,自己参与的工作,以及从中的收获。对于不利于自己求职但又不得不写上去的信息,应该尽可能地使他不那么显眼,比如跨专业工作,原来的专业名字不要那么显眼。

   另外简历项目可以写多,但是每个项目中的具体到技术的模块不要写多,只写几个自己最熟悉的,比如自己到那几个算法,就不要把所有的算法都写上去,人家首先问的就是你简历上的东西。

面试应该如何准备呢
首先我先声明,面试绝对是要准备的,不管是面试实习还是面试校招社招岗位,面试都是需要至少好几天的准备。如果你想裸面,除非你真的很牛逼,不然肯定会尝到痛苦的,以为找个实习就可以裸面,能学到东西越多的岗位,进这个岗位实习的难度就越大。

   面试前至少你要保证,简历上的每一个你都知道他的全部内容,同时要针对简历上的每一个点刷大量的面试题,有时候面试就是这样。感觉面试官聊到自己擅长的地方了,但是一问问题都不会,感觉全会,一问全不会,这就要求一定要去刷面试题。比如在简历上写了SVM,那就要知道svm的原理,svm的各个参数,svm用来解决什么问题,svm有什么优缺点,用svm做过什么东西等等。简历上的东西真的不是写写上去就好了,简历写的多随意,面试就有多难堪。个人认为简历上的每一个点的相对应的知识都应该打印好几张纸,在面试之前好好看好好背诵。

   关于项目经历,刚才说到项目经历,每一个写在简历上的项目经历都应该了然于心。有几个要求:

1.必须流畅地讲述出整个项目的过程,项目过程中的每一个环节都应该仔细地去回顾

2.在项目进行的过程中,遇到了哪些困难,又是怎么解决的,每一个项目都应该提前想好

写文章以自勉,在背后越努力,才能在人前表现地越轻松,我觉得面试也是这样的,暂时就先写到这里了,下次更多的面试经历再补充。

优质的岗位:适合自己的才是优质的岗位

招聘企业信息:企业的官方微信、官网,或者在领英上问一下

岗位如何鉴定含金量:还是适合自己的还是最重要,给钱多的不一定含金量高,但含金量高的钱一定不会少,小公司是否有试错的机会,大公司是否有完善的培养机制,要么干的更久,要么干的稀缺性,要么能提升你的能力。

岗位怎么样:可以上看准网,应届生,职业圈、职友集。

工作经验太少,简历不会写:工作经历是直观证明能力的证据,但能力的证明并不止实习经历。找证明自己能力的经历,做过什么项目,学术经历,项目经历。

比如行业分析师,平时多写行业报告,可以在网上放上去,然后简历上附上链接

怎么匹配自己的岗位:兴趣,性格、能力(胜任不胜任)、价值观

了解行业世界:行业、职能、企业、地域

做决策:决策平衡单、决策模式(元认知&自我觉察)

了解企业:前生,历史发展、主营业务、竞争对手、组织框架、用波特五例分析以下

专业不对口怎么办:专业对口率本来就很低,只要不说xx优先,那就是有硬性要求。

数据分析:jd差的特别远,数据库、会R语言、会python,岗位对技术的能力要求是不一样的

如果是凭兴趣找工作,入职当天就是离职倒计时

双非院校怎么提升竞争力,我比的是和自己差不多的人,只要比身边的人强一点。旁边的人都在海投,那我就不海投,求职目标比别人明确,对公司的了解和对行业的了解都比别人深刻,笔试多比别人准备,能力不够动机来凑。表现的很喜欢这家公司,这个行业。

社招没有好岗位,如果想正儿八经的工作,老老实实参加校招。

聪明的学生是不参加校招的,早就在秋招前找好工作了。

面试:需要看到大家的思维的质量,过往经历是什么,面试的岗位和过往经历的关系,主动去说大学期间做了什么,比如卖盆的故事,我做过的事情是有分析的,我知道怎么把事情做好。

思维质量,事情如何去分析,如何去选。

我的优势是什么,我的劣势是什么

未来的规划一定要清楚,我要实现什么,我要通过如何去实现自己的目标,我的目标是非常清晰的,我是有行动计划的,一定是切实可行的,太遥远的不必要说。

项目介绍

那对于一个项目该如何进行面试前的准备呢?同样,对于这个问题,仍旧需要先站在面试官的角度,思考面试官想要从和你交流项目的过程中知道什么。还是那句话,面试官需要招聘的是基础知识扎实、有能力解决问题的、富有创造性的、同时又有一定沟通能力的人。因此,接下来的准备过程中,都需要处处以能展现这几点为目的。面试官问项目的时候也往往遵循着一个套路:简单整体介绍项目,你的创新点是什么?项目中用到的某个网络或者某个技术你了解吗?这个项目你遇到了哪些困难、你是如何解决的?这个项目的评价标准是什么?最终达到什么样的性能?咋一看似乎这些问题不是很有规律可言,但其实就像拔萝卜的过程一样:

  1. 从宏观上认识萝卜。也就是你首先要用简短的语言,几句话将你的萝卜整体展现给面试官。一般这几句话我们往往会依照STAR法则去组织语言,即在什么背景(Situation)下,为了解决什么问题(Target),采取了什么方法(Action),最后达到了什么效果(Result).

  2. 把主体***。一般面试官会让你介绍你项目中所用到的网络,此时作为面试者就可以按照:为什么用这个网络,网络结构和特点是什么,训练和测试的差别等进行回答。例如我其中的一个项目用到了一个检测网络SSD,那我就会从速度要求引出one_stage和two_stage的区别,因此使用较快的SSD。然后介绍其网络结构和其全卷积、先验框、多尺度的特点,最后解释测试时NMS的处理等等。

  3. 把细小末梢一点点抽出来。只准备到能够将主体***的水平仍然不够,你需要做到的是对于其有可能会牵引出来的一切问题都尽可能准备的足够充分。例如,第二点所提到的目标检测,训练过程中如何区分正样本?既然提到了two stage,那么two stage 网络中的ROI-pooling 又是怎么回事?为了让准备的过程中更有逻辑性且考虑更加全面,可以画一棵树,树的主干是此项目所用的主要方法,分出的枝干是所有细节的技术,叶子又是细节技术所牵引出来的其他技术知识。一般也就是准备到两级问题就没基本可以了。如果面试官问到三级、四级。。。那这个面试官真是毫无人性啊,怼他!

  4. 对于拔萝卜的评价。评价问题就非常好准备了,主要为两类评价:
    对方法的性能的评价,一般会问你用的评价指标是什么,达到什么水平。例如我的一个项目用到了灵敏度、特异性、AUC,基本所有面试官都问了我这些指标的含义,如何计算,以及的方法达到了什么程度。
    在拔萝卜过程中的创新点有哪些,和现有的方法好在哪些方面。在这个过程中遇到了哪些困难,你是如何解决的。(此问题尤为重要!)
    基本按着这四点进行准备,项目经历这一块就没什么问题了。当然,还需要重复的一点语气!语气!语气!重要的问题说三遍!同样的话,被不同人,用不同的语气说出来,说服力也完全不一样,哪怕你觉得你的项目就是个渣渣,其实没有任何创新型可言,效果也贼烂,但你在与面试官的交流过程中也一定要底气十足。你需要不停的催眠自己,我做的东西就是最棒的!这一点非常重要!
    基础知识
    算法面试过程中,还有的非常看重的一点就是对于基础知识的掌握。这些基础知识有可能是在项目经历的交流过程中在第二级问题的时候问,也可能在项目之外单独问,但这些问题其实说来说去也就那么点,无非是如何处理过拟合问题,BN是怎么回事?怎么去理解SVM和逻辑斯蒂回归的区别等等。这些只要花时间认真准备,对每一个问题准备的尽可能充分就妥妥的了。
    那么。。。问题来了,想把这些问题都准备地很充分这得多久,时间来得及吗?答,还是挺费时的,对于一个问题如果仅仅简单的概述式的介绍给面试官,那基本是凉了的,那到底怎么样才算是准备的足够高充分了呢?简单举个栗子,面试官问你知道Batch Normalization吗?你需要这么回答:
    BN的背景是什么(即为什么会提出这种方法)
    BN的基本原理是什么,以理解的方式介绍大概步骤
    训练和测试时的方差和均值选取的差别
    BN的多卡同步又是怎么回事?
    甚至,你可以进一步了解下,BN所针对的激活函数一般是sigmoid,可以将参数拉离饱和区,那么如果换成Relu的话,BN是否还有效呢?再进一步的话还可以了解下主流的规范化方法有哪些?(这种程度的问题就知道个名字就好了,不知道也没问题)。
    如果你能对一个问题理解到这种程度,基本面试官只要不是压根看你不爽,基本都会觉得你很棒棒了。But! 这么准备下来,一个问题都得准备好久,岂不是根本来不及了?因此!要懂得借用集体的智慧,比如我就组织了我们实验室的五个小伙伴建立一个讨论小组,每天轮流三个人每个人准备一个问题,把问题准备到上面的那个地步,将自己组织好的问题答案共享到腾讯文档,然后每天晚上八点半大家一起讨论。这样还有一个好处就是一个人去理解一个问题的时候往往很容易陷入牛角尖,理解的也很容易片面,但大家一起讨论之后,基本就能很快豁然开朗了。这么准备起来,每天其实只要花很少的时间就可以在相对较短的时间内把这个环节准备的非常充分了。以下是我们讨论小组准备的材料部分预览,我们5个花了大约一个月的时间,共讨论了约70+的问题,约四万五千字的文档使我在面试过程中,基本没有遇到过没讨论过的问题。这些问题可以自己觉得重要的,或者去牛客网上找面经中的问题,同时也非常推荐《百面机器学习》这本书,我们的很多问题也是直接在这本书上找的。

    **Situation(情景)**对于酒店来说,顾客的在线评论非常重要,但目前酒店面对的一个主要问题就是网络上各渠道的点评过多,导致每天要来花费大量的时间来人工搜集并处理这些评论。而对于一些自差评或投诉,如果酒店无法及时看到并处理,那么这些评论将会在网络上形成非常不利的影响。说实话,酒店每天机械式的处理网络点评效果并不好,除了增加人工成本、无法实时关注信息外,还会导致错误概率的加大。

    目前酒店都比较重视顾客点评管理和舆情监控这一块,因为现在的顾客都习惯在订酒店之前先查看点道评情况,就像网络购物一样查看商品的好评和差评。所以有很多酒店都很重视回复管理顾客点评,对网络舆情进行监控,一旦出现差评,及时回复处理,如果差评处理的越慢越晚,其内传播的面也越广,维护处理的成本就越高,对酒店的在线口碑伤害也就越大。

    Task(任务)

    Action(行动):训练:用了比较多的技巧:包括截断补齐,正则,数据增强10%,earl_stop,归一化,与之微调,40%的dorpout,动态学习率,

    小技巧:mask英文一起遮挡,数字只需判断是num,或者扣掉,

    Result(结果):auc93%

    另外一件事:mean_max_pooling,一句话的数学表达,平均响应和最大响应,ebemding*2,映射成一个之进行sigmoid激活。

前景预测

在1998年微软亚洲研究院成立之初,NLP就被确定为最重要的研究领域之一。历经二十载春华秋实,在历届院长支持下,微软亚洲研究院在促进NLP的普及与发展以及人才培养方面取得了非凡的成就。共计发表了100余篇ACL大会文章,出版了《机器翻译》和《智能问答》两部著作,培养了500名实习生、20名博士和20名博士后。我们开发的NLP技术琳琅满目,包括输入法、分词、句法/语义分析、文摘、情感分析、问答、跨语言检索、机器翻译、知识图谱、聊天机器人、用户画像和推荐等,已经广泛应用于Windows、Office、Bing、微软认知服务、小冰、小娜等微软产品中。我们与创新技术组合作研发的微软对联和必应词典,已经为成千上万的用户提供服务。

过去二十年, NLP利用统计机器学习方法,基于大规模的带标注的数据进行端对端的学习,取得了长足的进步。尤其是过去三年来,深度学习给NLP带来了新的进步。其中在单句翻译、抽取式阅读理解、语法检查等任务上,更是达到了可比拟人类的水平。

基于如下的判断,我们认为未来十年是NLP发展的黄金档:

  1. 来自各个行业的文本大数据将会更好地采集、加工、入库。
  2. 来自搜索引擎、客服、商业智能、语音助手、翻译、教育、法律、金融等领域对NLP的需求会大幅度上升,对NLP质量也提出更高要求。
  3. 文本数据和语音、图像数据的多模态融合成为未来机器人的刚需。这些因素都会进一步促进对NLP的投资力度,吸引更多人士加入到NLP的研发中来。因此我们需要审时度势、抓住重点、及时规划,面向更大的突破。

因此,NLP研究将会向如下几个方面倾斜:

  1. 将知识和常识引入目前基于数据的学习系统中。
  2. 低资源的NLP任务的学习方法。
  3. 上下文建模、多轮语义理解。
  4. 基于语义分析、知识和常识的可解释NLP。

NLP的技术进展

自然语言处理,有时候也称作自然语言理解,旨在利用计算机分析自然语言语句和文本,抽取重要信息,进行检索、问答、自动翻译和文本生成。人工智能的目的是使得电脑能听、会说、理解语言、会思考、解决问题,甚至会创造。它包括运算智能、感知智能、认知智能和创造智能几个层次的技术。计算机在运算智能即记忆和计算的能力方面已远超人类。而感知智能则是电脑感知环境的能力,包括听觉、视觉和触觉等等,相当于人类的耳朵、眼睛和手。目前感知智能技术已取得飞跃性的进步;而认知智能包括自然语言理解、知识和推理,目前还待深入研究;创造智能目前尚无多少研究。比尔·盖茨曾说过, “自然语言理解是人工智能皇冠上的明珠”。NLP的进步将会推动人工智能整体进展。

NLP在深度学习的推动下,在很多领域都取得了很大进步。下面,我们就来一起简单看看NLP的重要技术进展。

神经机器翻译

神经机器翻译就是模拟人脑的翻译过程。

翻译任务就是把源语言句子转换成语义相同的目标语言句子。人脑在进行翻译的时候,首先是尝试理解这句话,然后在脑海里形成对这句话的语义表示,最后再把这个语义表示转化到另一种语言。神经机器翻译就是模拟人脑的翻译过程,它包含了两个模块:一个是编码器,负责将源语言句子压缩为语义空间中的一个向量表示,期望该向量包含源语言句子的主要语义信息;另一个是解码器,它基于编码器提供的语义向量,生成在语义上等价的目标语言句子。

神经机器翻译模型的优势在于三方面:一是端到端的训练,不再像统计机器翻译方法那样由多个子模型叠加而成,从而造成错误的传播;二是采用分布式的信息表示,能够自动学习多维度的翻译知识,避免人工特征的片面性;三是能够充分利用全局上下文信息来完成翻译,不再是局限于局部的短语信息。基于循环神经网络模型的机器翻译模型已经成为一种重要的基线系统,在此方法的基础上,从网络模型结构到模型训练方法等方面,都涌现出很多改进。

神经机器翻译系统的翻译质量在不断取得进步,人们一直在探索如何使得机器翻译达到人类的翻译水平。2018年,微软亚洲研究院与微软翻译产品团队合作开发的中英机器翻译系统,在WMT2017新闻领域测试数据集上的翻译质量达到了与人类专业翻译质量相媲美的水平(Hassan et al., 2018)。该系统融合了微软亚洲研究院提出的四种先进技术,其中包括可以高效利用大规模单语数据的联合训练和对偶学习技术,以及解决曝光偏差问题的一致性正则化技术和推敲网络技术。

智能人机交互

智能人机交互包括利用自然语言实现人与机器的自然交流。其中一个重要的概念是“对话即平台”。

“对话即平台(CaaP,Conversation as a Platform)是微软首席执行官萨提亚·纳德拉2016年提出的概念,他认为图形界面的下一代就是对话,并会给整个人工智能、计算机设备带来一场新的革命。

萨提亚之所以提出这个概念是因为:首先,源于大家都已经习惯用社交手段,如微信、Facebook与他人聊天的过程。我们希望将这种交流过程呈现在当今的人机交互中。其次,大家现在面对的设备有的屏幕很小(比如手机),有的甚至没有屏幕(比如有些物联网设备),语音交互更加自然和直观。对话式人机交互可调用Bot来完成一些具体的功能,比如订咖啡,买车票等等。许多公司开放了CAAP平台,让全世界的开发者都能开发出自己喜欢的 Bot以便形成一个生态。

面向任务的对话系统比如微软的小娜通过手机和智能设备让人与电脑进行交流,由人发布命令,小娜理解并完成任务。同时,小娜理解你的习惯,可主动给你一些贴心提示。而聊天机器人,比如微软的小冰负责聊天。无论是小娜这种注重任务执行的技术,还是小冰这种聊天系统,其实背后单元处理引擎无外乎三层技术:第一层,通用聊天机器人;第二层,搜索和问答(Infobot);第三层,面向特定任务对话系统(Bot)。

img

聊天系统的架构

机器阅读理解

自然语言理解的一个重要研究课题是阅读理解。

阅读理解就是让电脑看一遍文章,针对这些文章问一些问题,看电脑能不能回答出来。机器阅读理解技术有着广阔的应用前景。例如,在搜索引擎中,机器阅读理解技术可以用来为用户的搜索(尤其是问题型的查询)提供更为智能的答案。我们通过对整个互联网的文档进行阅读理解,从而直接为用户提供精确的答案。同时,这在移动场景的个人助理,如微软小娜(Cortana)里也有直接的应用:智能客服中可使用机器阅读文本文档(如用户手册、商品描述等)来自动或辅助客服来回答用户的问题;在办公领域可使用机器阅读理解技术处理个人的邮件或者文档,然后用自然语言查询获取相关的信息;在教育领域用来可以用来辅助出题;在法律领域可用来理解法律条款,辅助律师或者法官判案;在金融领域里从非结构化的文本(比如新闻中)抽取金融相关的信息等。机器阅读理解技术可形成一个通用能力,第三方可以基于它构建更多的应用。

斯坦福大学在2016年7月发布了一个大规模的用于评测阅读理解技术的数据集(SQuAD),包含10万个由人工标注的问题和答案。SQuAD数据集中,文章片段(passage)来自维基百科的文章,每个文章片段(passage)由众包方式,标注人员提5 个问题,并且要求问题的答案是passage中的一个子片段。标注的数据被分成训练集和测试集。训练集公开发布用来训练阅读理解系统,而测试集不公开。参赛者需要把开发的算法和模型提交到斯坦福由其运行后把结果报在网站上。

一开始,以 100 分为例,人的水平是 82.3 左右,机器的水平只有 74 分,机器相差甚远。后来通过不断改进,机器阅读理解性能得以逐步地提高。2018年1月,微软亚洲研究院提交的R-Net系统首次在SQuAD数据集上以82.65的精准匹配的成绩首次超越人类在这一指标上的成绩。随后阿里巴巴、科大讯飞和哈工大的系统也在这一指标上超越人类水平。标志着阅读理解技术进入了一个新的阶段。最近微软亚洲研究院的NL-Net和谷歌的BERT系统又先后在模糊匹配指标上突破人类水平。对于阅读理解技术的推动,除了SQuAD数据集起到了关键作用之外,还有如下三个方的因素:首先,是端到端的深度神经网络。其次,是预训练的神经网络;最后,是系统和网络结构上的不断创新。

机器创作

机器可以做很多理性的东西,也可以做出一些创造性的东西。

早在2005年,微软亚洲研究院在时任院长沈向洋的提议和支持下成功研发了《微软对联》系统。用户出上联,电脑对出下联和横批,语句非常工整。

在此基础上,我们又先后开发了格律诗和猜字谜的智能系统。在字谜游戏里,用户给出谜面,让系统猜出字,或系统给出谜面让用户猜出字。2017年微软研究院开发了电脑写自由体诗系统、作词谱曲系统。中央电视台《机智过人》节目就曾播放过微软的电脑作词谱曲与人类选手进行词曲创作比拼的内容。这件事说明如果有大数据,那么深度学习就可以模拟人类的创造智能,也可以帮助专家产生更好的想法。

就作词来说,写一首歌词首先要决定主题。比如想写一首与“秋”、“岁月”、“沧桑”、“感叹”相关的歌,利用词向量表示技术,可知“秋风”、“流年”、“岁月”、“变迁”等词语比较相关,通过扩展主题可以约束生成的结果偏向人们想要的歌词,接着在主题模型的约束下用序列到序列的神经网络,用歌词的上一句去生成下一句,如果是第一句,则用一个特殊的序列作为输入去生成第一句歌词,这样循环生成歌词的每一句。

下面也简介一下谱曲。为一首词谱曲不单要考虑旋律是否好听,也要考虑曲与词是否对应。这类似于一个翻译过程。不过这个翻译中的对应关系比自然语言翻译更为严格。它需严格规定每一个音符对应到歌词中的每一个字。例如每一句有N个字,那么就需要将这句话对应的曲切分成N个部分,然后顺序完成对应关系。这样在“翻译”过程中要“翻译”出合理的曲谱,还要给出曲与词之间的对应关系。我们利用了一个改进的序列到序列的神经网络模型,完成从歌词“翻译”到曲谱的生成过程。

值得关注的NLP技术

从最近的NLP研究中,我们认为有一些技术发展趋势值得关注,这里总结了五个方面:

热点一,预训练神经网络

如何学习更好的预训练的表示,在一段时间内继续成为研究的热点。

通过类似于语言模型的方式来学习词的表示,其用于具体任务的范式得到了广泛应用。这几乎成为自然语言处理的标配。这个范式的一个不足是词表示缺少上下文,对上下文进行建模依然完全依赖于有限的标注数据进行学习。实际上,基于深度神经网络的语言模型已经对文本序列进行了学习。如果把语言模型关于历史的那部分参数也拿出来应用,那么就能得到一个预训练的上下文相关的表示。这就是Matthew Peters等人在2018年NAACL上的论文“Deep Contextualized Word Representations”的工作,他们在大量文本上训练了一个基于LSTM的语言模型。最近Jacob Delvin等人又取得了新的进展,他们基于多层Transformer机制,利用所谓“MASKED”模型预测句子中被掩盖的词的损失函数和预测下一个句子的损失函数所预训练得到的模型“BERT”,在多个自然语言处理任务上取得了当前最好的水平。以上提到的所有的预训练的模型,在应用到具体任务时,先用这个语言模型的LSTM对输入文本得到一个上下文相关的表示,然后再基于这个表示进行具体任务相关的建模学习。结果表明,这种方法在语法分析、阅读理解、文本分类等任务都取得了显著的提升。最近一段时间,这种预训练模型的研究成为了一个研究热点。

如何学习更好的预训练的表示在一段时间内将继续成为研究的热点。在什么粒度(word,sub-word,character)上进行预训练,用什么结构的语言模型(LSTM,Transformer等)训练,在什么样的数据上(不同体裁的文本)进行训练,以及如何将预训练的模型应用到具体任务,都是需要继续研究的问题。现在的预训练大都基于语言模型,这样的预训练模型最适合序列标注的任务,对于问答一类任务依赖于问题和答案两个序列的匹配的任务,需要探索是否有更好的预训练模型的数据和方法。将来很可能会出现多种不同结构、基于不同数据训练得到的预训练模型。针对一个具体任务,如何快速找到合适的预训练模型,自动选择最优的应用方法,也是一个可能的研究课题。

热点二,迁移学习和多任务学习

对于那些本身缺乏充足训练数据的自然语言处理任务,迁移学习有着非常重要和实际的意义。多任务学习则用于保证模型能够学到不同任务间共享的知识和信息。

不同的NLP任务虽然采用各自不同类型的数据进行模型训练,但在编码器(Encoder)端往往是同构的。例如,给定一个自然语言句子who is the Microsoft founder,机器翻译模型、复述模型和问答模型都会将其转化为对应的向量表示序列,然后再使用各自的解码器完成后续翻译、改写和答案生成(或检索)任务。因此,可以将不同任务训练得到的编码器看作是不同任务对应的一种向量表示,并通过迁移学习(Transfer Learning)的方式将这类信息迁移到目前关注的目标任务上来。对于那些本身缺乏充足训练数据的自然语言处理任务,迁移学习有着非常重要和实际的意义。

多任务学习(Multi-task Learning)可通过端到端的方式,直接在主任务中引入其他辅助任务的监督信息,用于保证模型能够学到不同任务间共享的知识和信息。Collobert和Weston早在2008年就最早提出了使用多任务学习在深度学习框架下处理NLP任务的模型。最近Salesforce的McCann等提出了利用问答框架使用多任务学习训练十项自然语言任务。每项任务的训练数据虽然有限,但是多个任务共享一个网络结构,提升对来自不同任务的训练数据的综合利用能力。多任务学习可以设计为对诸任务可共建和共享网络的核心层次,而在输出层对不同任务设计特定的网络结构。

热点三,知识和常识的引入

如何在自然语言理解模块中更好地使用知识和常识,已经成为目前自然语言处理领域中一个重要的研究课题。

随着人们对人机交互(例如智能问答和多轮对话)要求的不断提高,如何在自然语言理解模块中更好地使用领域知识,已经成为目前自然语言处理领域中一个重要的研究课题。这是由于人机交互系统通常需要具备相关的领域知识,才能更加准确地完成用户查询理解、对话管理和回复生成等任务。

最常见的领域知识包括维基百科和知识图谱两大类。机器阅读理解是基于维基百科进行自然语言理解的一个典型任务。给定一段维基百科文本和一个自然语言问题,机器阅读理解任务的目的是从该文本中找到输入问题对应的答案短语片段。语义分析是基于知识图谱进行自然语言理解的另一个典型任务。给定一个知识图谱(例如Freebase)和一个自然语言问题,语义分析任务的目的是将该问题转化为机器能够理解和执行的语义表示。目前,机器阅读理解和语义分析可以说是最热门的自然语言理解任务,它们受到了来自全世界研究者的广泛关注和深入探索。

常识指绝大多数人都了解并接受的客观事实,例如海水是咸的、人渴了就想喝水、白糖是甜的等。常识对机器深入理解自然语言非常重要,在很多情况下,只有具备了一定程度的常识,机器才有可能对字面上的含义做出更深一层次的理解。然而获取常识却是一个巨大的挑战,一旦有所突破将是影响人工智能进程的大事情。另外,在NLP系统中如何应用常识尚无深入的研究,不过出现了一些值得关注的工作。

热点四,低资源的NLP任务

引入领域知识(词典、规则)可以增强数据能力、基于主动学习的方法增加更多的人工标注数据等,以解决数据资源贫乏的问题。

面对标注数据资源贫乏的问题,譬如小语种的机器翻译、特定领域对话系统、客服系统、多轮问答系统等,NLP尚无良策。这类问题统称为低资源的NLP问题。对这类问题,除了设法引入领域知识(词典、规则)以增强数据能力之外,还可以基于主动学习的方法来增加更多的人工标注数据,以及采用无监督和半监督的方法来利用未标注数据,或者采用多任务学习的方法来使用其他任务甚至其他语言的信息,还可以使用迁移学习的方法来利用其他的模型。

以机器翻译为例,对于稀缺资源的小语种翻译任务,在没有常规双语训练数据的情况下,首先通过一个小规模的双语词典(例如仅包含2000左右的词对),使用跨语言词向量的方法将源语言和目标语言词映射到同一个隐含空间。在该隐含空间中, 意义相近的源语言和目标语言词具有相近的词向量表示。基于该语义空间中词向量的相似程度构建词到词的翻译概率表,并结合语言模型,便可以构建基于词的机器翻译模型。使用基于词的翻译模型将源语言和目标语言单语语料进行翻译,构建出伪双语数据。于是,数据稀缺的问题通过无监督的学习方法产生伪标注数据,就转化成了一个有监督的学习问题。接下来,利用伪双语数据训练源语言到目标语言以及目标语言到源语言的翻译模型,随后再使用联合训练的方法结合源语言和目标语言的单语数据,可以进一步提高两个翻译系统的质量。

为了提高小语种语言的翻译质量,我们提出了利用通用语言之间大规模的双语数据,来联合训练四个翻译模型的期望最大化训练方法(Ren et al., 2018)。该方法将小语种Z(例如希伯来语)作为有着丰富语料的语种X(例如中文)和Y(例如英语)之间的一个隐含状态,并使用通用的期望最大化训练方法来迭代地更新X到Z、Z到X、Y到Z和Z到Y之间的四个翻译模型,直至收敛。

热点五,多模态学习

视觉问答作为一种典型的多模态学习任务,在近年来受到计算机视觉和自然语言处理两个领域研究人员的重点关注。

婴儿在掌握语言功能前,首先通过视觉、听觉和触觉等感官去认识并了解外部世界。可见,语言并不是人类在幼年时期与外界进行沟通的首要手段。因此,构建通用人工智能也应该充分地考虑自然语言和其他模态之间的互动,并从中进行学习,这就是多模态学习。

视觉问答作为一种典型的多模态学习任务,在近年来受到计算机视觉和自然语言处理两个领域研究人员的重点关注。给定一张图片和用户提出的一个自然语言问题,视觉问答系统需要在理解图片和自然语言问题的基础上,进一步输入该问题对应的答案,这需要视觉问答方法在建模中能够对图像和语言之间的信息进行充分地理解和交互。

我们在今年的CVPR和KDD大会上分别提出了基于问题生成的视觉问答方法(Li et al., 2018)以及基于场景图生成的视觉问答方法(Lu et al., 2018),这两种方法均在视觉问答任务上取得了非常好的结果,实现了state-of-the-art的效果。除视觉问答外,视频问答是另一种最近广受关注的多模态任务。该任务除了包括带有时序的视频信息外,还包括了音频信息。目前,视频问答作为一种新型的问答功能,已经出现在搜索引擎的场景中。可以预见,该任务在接下来一定还会受到更多的关注。

未来展望:理想的NLP框架和发展前景

我们认为,未来理想状态下的NLP系统架构可能是如下一个通用的自然语言处理框架:

首先,对给定自然语言输入进行基本处理,包括分词、词性标注、依存分析、命名实体识别、意图/关系分类等。

其次,使用编码器对输入进行编码将其转化为对应的语义表示。在这个过程中,一方面使用预训练好的词嵌入和实体嵌入对输入中的单词和实体名称进行信息扩充,另一方面,可使用预训练好的多个任务编码器对输入句子进行编码并通过迁移学习对不同编码进行融合。

接下来,基于编码器输出的语义表示,使用任务相关的解码器生成对应的输出。还可引入多任务学习将其他相关任务作为辅助任务引入到对主任务的模型训练中来。如果需要多轮建模,则需要在数据库中记录当前轮的输出结果的重要信息,并应用于在后续的理解和推理中。

显然,为了实现这个理想的NLP框架需要做很多工作:

  • 需要构建大规模常识数据库并且清晰通过有意义的评测推动相关研究;
  • 研究更加有效的词、短语、句子的编码方式,以及构建更加强大的预训练的神经网络模型;
  • 推进无监督学习和半监督学习,需要考虑利用少量人类知识加强学习能力以及构建跨语言的embedding的新方法;
  • 需要更加有效地体现多任务学习和迁移学习在NLP任务中的效能,提升强化学习在NLP任务的作用,比如在自动客服的多轮对话中的应用;
  • 有效的篇章级建模或者多轮会话建模和多轮语义分析;
  • 要在系统设计中考虑用户的因素,实现用户建模和个性化的输出;
  • 构建综合利用推理系统、任务求解和对话系统,基于领域知识和常识知识的新一代的专家系统;
  • 利用语义分析和知识系统提升NLP系统的可解释能力。

未来十年,NLP将会进入爆发式的发展阶段。从NLP基础技术到核心技术,再到NLP+的应用,都会取得巨大的进步。比尔·盖茨曾经说过人们总是高估在一年或者两年中能够做到的事情,而低估十年中能够做到的事情。

我们不妨进一步想象十年之后NLP的进步会给人类生活带来哪些改变?

  • 十年后,机器翻译系统可以对上下文建模,具备新词处理能力。那时候的讲座、开会都可以用语音进行自动翻译。除了机器翻译普及,其他技术的进步也令人耳目一新。家里的老人和小孩可以跟机器人聊天解闷。
  • 机器个人助理能够理解你的自然语言指令,完成点餐、送花、购物等下单任务。你已习惯于客服机器人来回答你的关于产品维修的问题。
  • 你登临泰山发思古之幽情,或每逢佳节倍思亲,拿出手机说出感想或者上传一幅照片,一首情景交融、图文并茂的诗歌便跃然于手机屏幕上,并且可以选择格律诗词或者自由体的表示形式,亦可配上曲谱,发出大作引来点赞。
  • 可能你每天看到的体育新闻、财经新闻报道是机器人写的。
  • 你用手机跟机器人老师学英语,老师教你口语,纠正发音,跟你亲切对话,帮你修改论文。
  • 机器人定期自动分析浩如烟海的文献,给企业提供分析报表、辅助决策并做出预测。搜索引擎的智能程度大幅度提高。很多情况下,可以直接给出答案,并且可以自动生成细致的报告。
  • 利用推荐系统,你关心的新闻、书籍、课程、会议、论文、商品等可直接推送给你。
  • 机器人帮助律师找出判据,挖掘相似案例,寻找合同疏漏,撰写法律报告。
  • ……

未来,NLP将跟其他人工智能技术一道深刻地改变人类的生活。当然前途光明、道路曲折是亘古不变的道理,为了实现这个美好的未来,我们需要大胆创新、严谨求实、扎实进取。讲求研究和应用并举,普及与提高同步。我们期待着与业界同仁一道努力,共同走进NLP下一个辉煌的十年。

NLP面试题

img

1.为什么要进行预训练?

深度学习时代,为了充分训练深层模型参数并防止过拟合,通常需要更多标注数据喂养。在NLP领域,标注数据更是一个昂贵资源。PTMs从大量无标注数据中进行预训练使许多NLP任务获得显著的性能提升。总的来看,预训练模型PTMs的优势包括:

  1. 在庞大的无标注数据上进行预训练可以获取更通用的语言表示,并有利于下游任务;
  2. 为模型提供了一个更好的初始化参数,在目标任务上具备更好的泛化性能、并加速收敛;
  3. 是一种有效的正则化手段,避免在小数据集上过拟合(一个随机初始化的深层模型容易对小数据集过拟合);

2. 什么是词嵌入和分布式表示?PTMs与分布式表示的关系?

词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量,这也是分布式表示:向量的每一维度都没有实际意义,而整体代表一个具体概念。

分布式表示相较于传统的独热编码(one-hot)表示具备更强的表示能力,而独热编码存在维度灾难和语义鸿沟(不能进行相似度计算)等问题。传统的分布式表示方法,如矩阵分解(SVD/LSA)、LDA等均是根据全局语料进行训练,是机器学习时代的产物。预训练模型(Pre-trained Models,PTMs),PTMs也属于分布式表示的范畴,本文的PTMs主要介绍深度学习时代、自NNLM[2]以来的 “modern” 词嵌入。

3. PTMs有哪两大范式?对比不同的预训练编码器?

PTMs的发展经历从浅层的词嵌入到深层编码两个阶段,按照这两个主要的发展阶段,我们归纳出PTMs两大范式:「浅层词嵌入」和「预训练编码器」。

1、浅层词嵌入( Non-Contextual Embeddings**)**

浅层词嵌入,这一类PTMs范式是我们通常所说的“词向量”,其主要特点是学习到的是上下文独立的静态词嵌入,其主要代表为NNLM[2]、word2vec(CBOW[3]、Skip-Gram[3])、Glove[4]等。这一类词嵌入通常采取浅层网络进行训练,而应用于下游任务时,整个模型的其余部分仍需要从头开始学习。因此,对于这一范式的PTMs没有必要采取深层神经网络进行训练,采取浅层网络加速训练也可以产生好的词嵌入[3]

浅层词嵌入的主要缺陷为:

  • 词嵌入与上下文无关,每个单词的嵌入向量始终是相同,因此不能解决一词多义的问题。
  • 通常会出现OOV(Out-of-vocabulary问题,为了解决这个问题,相关文献提出了字符级表示或sub-word表示,如CharCNN[5] 、FastText[6] 和 Byte-Pair Encoding [7]

img

​ 图1: 常见的3种浅层词嵌入对比:NNLM、word2vec、Glove

图1给出了三种常见的浅层词嵌入之间的对比,Glove可以被看作是更换了目标函数和权重函数的全局word2vec。此外,相关文献也提出了句子和文档级别的嵌入方式,如 Skip-thought[8] 、Context2Vec[9] 等。

2、预训练编码器(Contextual Embeddings

第二类PTMs范式为预训练编码器,主要目的是通过一个预训练的编码器能够输出上下文相关的词向量,解决一词多义的问题。这一类预训练编码器输出的向量称之为「上下文相关的词嵌入」。

img图2: NLP编码器对比

图2给出了NLP各种编码器间的对比。PTMs中预训练编码器通常采用LSTM和Transformer(Transformer-XL),其中Transformer又依据其attention-mask方式分为Transformer-Encoder和Transformer-Decoder两部分。此外,Transformer也可看作是一种图神经网络GNN[10]

这一类「预训练编码器」范式的PTMs主要代表有ELMO[11]GPT-1[12]BERT[13]XLNet[14]等。

4. PTMs按照任务类型如何分类?

PTMs按照任务类型可分为2大类:监督学习 和 无监督学习/自监督学习。

监督学习在NLP-PTMs中的主要代表就是CoVe[15],CoVe作为机器翻译的encoder部分可以应用于多种NLP下游任务。除了CoVe外,NLP中的绝大多数PTMs属于自监督学习。

自监督学习是无监督学习的一种方法[16],自监督学习[17]主要是利用辅助任务从大规模的无监督数据中挖掘自身的监督信息,通过这种构造的监督信息对网络进行训练,从而可以学习到对下游任务有价值的表征。因此,从“构造监督信息”这个角度来看,自监督也可看作是监督学习和无监督学习的一种融合[1]。严格地讲,从是否由人工标注来看,自监督学习属于无监督学习的范畴。

综合各种自监督学习的分类方式,笔者将NLP-PTMs在自监督学习中分为两种类型[16][17]:基于上下文(Context Based)和基于对比(Contrastive Based)。在这里插å¥å›¾ç‰‡æè¿°

1、基于上下文(Context Based)

基于上下文的PTMs,主要基于数据本身的上下文信息构造辅助任务,在NLP中我们通常引入语言模型作为训练目标。PTMs中的语言模型主要分为三大类:

img图3: 三类语言模型之间的对比

第一类:自回归语言模型(LM)

[公式]

  • 优点:

    • 语言模型(language model,LM)联合概率的无偏估计,即为传统的语言模型,考虑被预测单词之间的相关性,天然适合处理自然生成任务;
  • 缺点:

    • 联合概率按照文本序列顺序拆解(从左至右分解),无法获取双向上下文信息表征;
  • 代表模型:ELMO、GPT-1、GPT-2[18]、ULMFiT[19]、SiATL[20]

第二类:自编码语言模型(DAE)

[公式]

  • 优点:

    • 本质为降噪自编码(DAE)特征表示,通过引入噪声[MASK]构建MLM(Masked language model),获取双向上下文信息表征(本文将自编码语言模型统一称为DAE,旨在采用部分损坏的输入,旨在恢复原始的未失真输入);如果当前token被预测,则 [公式] 否则 [公式][公式] 为原始文本被替换后的输入。
  • 缺点:

    • 引入独立性假设,为语言模型联合概率的有偏估计,没有考虑预测token之间的相关性;
    • 预训练时的「MASK」噪声在finetune阶段不会出现,造成两阶段不匹配问题;为解决这一问题,在15%被预测的token中,80%被替换为「MASK」,10%被随机替换,10%被替换为原词。
  • 代表模型:BERT、MASS [21]、T5[22]、RoBERTa[23]、UniLM[24]、XLM[25]、SpanBERT[26]、ERNIE-Baidu[27][28]、E-BERT[29]、ERNIE-THU[30]、BART[31]

BERT[13]是自编码语言模型的一个典型代表,但其采用的MLM策略和Transformer-Encoder结构,导致其不适合直接处理生成任务。为了解决这一问题,也可采用基于Seq2Seq MLM方法:encoder部分采取masked策略,而decoder部分以自回归的方式预测encoder部分被mask的token。此外,还有很多基于自编码语言模型的PTMs提出了不同的MLM增强策略,称之为 Enhanced Masked Language Modeling (E-MLM) [1]

上述DAE具体的PTMs方法见图4。

第三类:排列语言模型(PLM)

排列语言模型(Permuted Language Model,PLM)综合了LM和DAE-LM两者的优点。严格来讲,PLM和LM是标准的自回归语言模型(注:PLM是一种广义的自回归方法[14]),而MLM不是一个标准的语言模型,其引入独立性假设,隐式地学习预测token(mask部分本身的强相关性)之间的关系。如果衡量序列中被建模的依赖关系的数量,标准的自回归语言模型可以达到上界,不依赖于任何独立假设。LM和PLM能够通过自回归方式来显式地学习预测token之间的关系。然而,LM无法对双向上下文进行表征,借鉴 NADE[32]的思想,PLM将这种传统的自回归语言模型(LM)进行推广,将顺序拆解变为随机拆解(从左至右分解),产生上下文相关的双向特征表示。

PLM最为典型的代表就是XLNet[14],这是对标准语言模型的一个复兴[33]:提出一个框架来连接标准语言模型建模方法和预训练方法。

一个关键问题:为什么PLM可以实现双向上下文的建模?**PLM的本质就是语言模型联合概率的多种分解机制的体现,其将LM的顺序拆解推广到随机拆解。**PLM没有改变原始文本序列的自然位置,只是定义了token预测的顺序。PLM只是针对语言模型建模不同排列下的因式分解排列,并不是词的位置信息的重新排列。

最后,我们对基于上述三类语言模型的PTMs进行总结:

img

图4: 基于上下文(Context Based)的3种语言模型PTMs总结

2、基于对比(Contrastive Based)

基于对比(Contrastive Based),不同于Context Based主要基于数据本身的上下文信息构造辅助任利用,Contrastive Based主要利用样本间的约束信息构造辅助任务,这类方法也是 Contrastive learning[34](CTL)。CTL假设观察到的文本对(正样本)在语义上比随机采样的文本(负样本)更相似。CTL 背后的原理是「在对比中学习」。相较于语言建模,CTL 的计算复杂度更低,因而在预训练中是理想的替代训练标准。

CTL通过构建正样本(positive)和负样本(negative),然后度量正负样本的距离来实现自监督学习[17]:可以使用点积的方式构造距离函数,然后构造一个 softmax 分类器,以正确分类正样本和负样本。鼓励相似性度量函数将较大的值分配给正例,将较小的值分配给负例:

[公式]

相似性度量函数通常可采取两种方式: [公式][公式]

第一类: Deep InfoMax (DIM)

DIM 方法来源于CV领域,对于全局的特征(编码器最终的输出)和局部特征(编码器中间层的特征),DIM需要判断全局特征和局部特征是否来自同一图像[17]

InfoWord [35]将DIM引入到NLP中,用Mutual Information的一个下界InfoNCE来重新解释BERT和XLNET的objective,并提出一个新的DIM objective以最大化一个句子的global representation和其中一个ngram的local representation之间的Mutual Information。

第二类:Replaced Token Detection (RTD)

噪声对比估计(Noise-Contrastive Estimation,NCE)[36]通过训练一个二元分类器来区分真实样本和假样本,可以很好的训练词嵌入。RTD于与 NCE 相同,根据上下文语境来预测token是否替换 。

  • word2vec[3]中的negative sampling可看作是RTD,负样本从词表中进行带权采样。
  • ELECTRA[37]提出了一种新的预训练任务框架,构建生成器-判别器,生成器通过MLM任务对被mask的token进行预测,迭代器判断原始句子中的每个token是否被replace过。生成器相当于对输入进行了筛选,使判别器的任务更难,从而学习到更好的表示。生成器-判别器共享embedding,生成器部分采用small-bert,判别器部分对每一个token采用sigmoid计算loss。finetune阶段只采用判别器部分。RTD也被看作解决MLM中「MASK」在预训练和finetune间差异的一种手段。
  • WKLM[38]在实体level进行替换,替换为具有相同实体类型的实体名称。

第三类:Next Sentence Prediction (NSP)

NSP 区分两个输入句子是否为训练语料库中的连续片段,第二个句子50%为第一句子实际的连续片段,50%从其他语料随机选择。NSP可以引导模型理解两个输入句子之间的关系,从而使对此信息敏感的下游任务受益,如QA任务。而RoBERTa[23]表明:NSP在对单个文档中的文本块进行训练时,去除NSP任务或在下游任务上可以稍微提高性能。

第四类:Sentence Order Prediction (SOP)

SOP 使用同一文档中的两个连续片段作为正样本,而相同的两个连续片段互换顺序作为负样本。NSP融合了主题预测和相关性预测,主题预测更容易,这使得模型进行预测时仅依赖于主题学习。与NSP不同,SOP使用同一文档中的两个连续段作为正样本,但顺序互换为负样本。采取SOP任务的PTMs有ALBERT[39]、StructBERT[40]、BERTje[41]

图5对上述基于对比(Contrastive Based)的四类PTMs进行了总结:

img图5: 基于对比(Contrastive Based)的PTMs总结

5. PTMs有哪些拓展?

1、引入知识

PTMs通常从通用大型文本语料库中学习通用语言表示,但是缺少特定领域的知识。PTMs中设计一些辅助的预训练任务,将外部知识库中的领域知识整合到PTMs中被证明是有效的[1]

  • ERNIE-THU[30]将在知识图谱中预先训练的实体嵌入与文本中相应的实体提及相结合,以增强文本表示。由于语言表征的预训练过程和知识表征过程有很大的不同,会产生两个独立的向量空间。为解决上述问题,在有实体输入的位置,将实体向量和文本表示通过非线性变换进行融合,以融合词汇、句法和知识信息。
  • LIBERT[42](语言知识的BERT)通过附加的语言约束任务整合了语言知识。
  • SentiLR[43]集成了每个单词的情感极性,以将MLM扩展到标签感知MLM(LA-MLM),ABSA任务上都达到SOTA。
  • SenseBERT[44] 不仅能够预测被mask的token,还能预测它们在给定语境下的实际含义。使用英语词汇数据库 WordNet 作为标注参照系统,预测单词在语境中的实际含义,显著提升词汇消歧能力。
  • KnowBERT[45] 与实体链接模型以端到端的方式合并实体表示。
  • KG-BERT[46]显示输入三元组形式,采取两种方式进行预测:构建三元组识别和关系分类,共同优化知识嵌入和语言建模目标。这些工作通过实体嵌入注入知识图的结构信息。
  • K-BERT[47]将从KG提取的相关三元组显式地注入句子中,以获得BERT的扩展树形输入。
  • K-Adapter[48]通过针对不同的预训练任务独立地训练不同的适配器来注入多种知识,从而可以不断地注入知识,以解决注入多种知识时可能会出现灾难性遗忘问题。
  • 此外,这类PTMs还有WKLM[38]、KEPLER[49]和[50]等。

2、模型压缩

由于预训练的语言模型通常包含至少数亿个参数,因此很难将它们部署在现实应用程序中的在线服务和资源受限的设备上。模型压缩是减小模型尺寸并提高计算效率的有效方法。

5种PTMs的压缩方法为:

  • pruning(剪枝):将模型中影响较小的部分舍弃。

    • 如Compressing BERT[51],还有结构化剪枝 LayerDrop [52],其在训练时进行Dropout,预测时再剪掉Layer,不像知识蒸馏需要提前固定student模型的尺寸大小。
  • quantization(量化):将高精度模型用低精度来表示;

    • 如Q-BERT[53]和Q8BERT[54],量化通常需要兼容的硬件。
  • parameter sharing (参数共享):相似模型单元间的参数共享;

    • ALBERT[39]主要是通过矩阵分解和跨层参数共享来做到对参数量的减少。
  • module replacing(模块替换)

    • BERT-of-Theseus[55]根据伯努利分布进行采样,决定使用原始的大模型模块还是小模型,只使用task loss。
  • knowledge distillation (知识蒸馏):通过一些优化目标从大型、知识丰富、fixed的teacher模型学习一个小型的student模型。蒸馏机制主要分为3种类型:

    • 从软标签蒸馏:DistilBERT [56]、EnsembleBERT[57]
    • 从其他知识蒸馏:TinyBERT[58]、BERT-PKD、MobileBERT[59] 、 MiniLM[60] 、DualTrain[61]
    • 蒸馏到其他结构:Distilled-BiLSTM[62]

img图6: 不同的知识蒸馏PTMs

3、多模态

随着PTMs在NLP领域的成功,许多研究者开始关注多模态领域的PTMs,主要为通用的视觉和语言特征编码表示而设计。多模态的PTMs在一些庞大的跨模式数据语料库(带有文字的语音、视频、图像)上进行了预训练,如带有文字的语音、视频、图像等,主要有 VideoBERT[63]、CBT[64] 、UniViLM[65]、 ViL-BERT[66] 、 LXMERT[67]、 VisualBERT [68]、 B2T2[69] 、Unicoder-VL[70] 、UNITER [71]、 VL-BERT[72] 、 SpeechBERT[73]

4、领域预训练

大多数PTM都在诸如Wikipedia的通用语料中训练,而在领域化的特定场景会收到限制。如基于生物医学文本的BioBERT[74],基于科学文本的SciBERT[75],基于临床文本的Clinical-BERT[76]。一些工作还尝试将PTMs适应目标领域的应用,如医疗实体标准化[77]、专利分类PatentBERT [78]、情感分析SentiLR[79]关键词提取[80]

5、多语言和特定语言

学习跨语言共享的多语言文本表示形式对于许多跨语言的NLP任务起着重要的作用。

  • Multilingual-BERT[81]在104种 Wikipedia文本上进行MLM训练(共享词表),每个训练样本都是单语言文档,没有专门设计的跨语言目标,也没有任何跨语言数据,M-BERT也可以很好的执行跨语言任务。
  • XLM[25]通过融合跨语言任务(翻译语言模型)改进了M-BERT,该任务通过拼接平行语料句子对进行MLM训练。
  • Unicoder[82]提出了3种跨语言预训练任务:1)cross-lingual word recovery;2) cross-lingual paraphrase classification;3) cross-lingual masked language model.

虽然多语言的PTMs在跨语言上任务表现良好,但用单一语言训练的PTMs明显好于多语言的PTMs。此外一些单语言的PTMs被提出:BERT-wwm[83], ZEN[84], NEZHA[85] , ERNIE-Baidu[27][28], BERTje[86], CamemBERT[87], FlauBERT [88], RobBERT [89]

6. 如何对PTMs进行迁移学习?

PTMs从大型语料库中获取通用语言知识,如何有效地将其知识适应下游任务是一个关键问题。迁移学习的方式主要有归纳迁移(顺序迁移学习、多任务学习)、领域自适应(转导迁移)、跨语言学习等。NLP中PTMs的迁移方式是顺序迁移学习。

1、如何迁移?

1)选择合适的预训练任务:语言模型是PTM是最为流行的预训练任务;同的预训练任务有其自身的偏置,并且对不同的任务会产生不同的效果。例如,NSP任务可以使诸如问答(QA)和自然语言推论(NLI)之类的下游任务受益。

2)选择合适的模型架构:例如BERT采用的MLM策略和Transformer-Encoder结构,导致其不适合直接处理生成任务。

3)选择合适的数据:下游任务的数据应该近似于PTMs的预训练任务,现在已有有很多现成的PTMs可以方便地用于各种特定领域或特定语言的下游任务。

4)选择合适的layers进行transfer:主要包括Embedding迁移、top layer迁移和all layer迁移。如word2vec和Glove可采用Embedding迁移,BERT可采用top layer迁移,Elmo可采用all layer迁移。

5)特征集成还是fine-tune?对于特征集成预训练参数是freeze的,而fine-tune是unfreeze的。特征集成方式却需要特定任务的体系结构,fine-tune方法通常比特征提取方法更为通用和方便。

**2、fine-tune策略:**通过更好的微调策略进一步激发PTMs性能

  • 两阶段fine-tune策略:如第一阶段对中间任务或语料进行finetune,第二阶段再对目标任务fine-tune。第一阶段通常可根据特定任务的数据继续进行fine-tune预训练。
  • 多任务fine-tune:MTDNN[90]在多任务学习框架下对BERT进行了fine-tune,这表明多任务学习和预训练是互补的技术。
  • 采取额外的适配器:fine-tune的主要缺点是其参数效率低,每个下游任务都有自己的fine-tune参数。因此,更好的解决方案是在固定原始参数的同时,将一些可fine-tune的适配器注入PTMs。
  • 逐层阶段:逐渐冻结而不是同时对所有层进行fine-tune,也是一种有效的fine-tune策略。

7. PTMs还有哪些问题需要解决?

(本部分来自[91],有删减和修正)

虽然 PTMs已经在很多 NLP 任务中显示出了他们强大的能力,然而由于语言的复杂性,仍存在诸多挑战。综述论文给出了五个未来 PTMs发展方向的建议。

1、PTMs的上限

目前,PTMs并没有达到其上限。大多数的PTMs可通过使用更长训练步长和更大数据集来提升其性能。目前NLP中的SOTA也可通过加深模型层数来更进一步提升。这将导致更加高昂的训练成本。因此,一个更加务实的方向是在现有的软硬件基础上,设计出更高效的模型结构、自监督预训练任务、优化器和训练技巧等。例如, ELECTRA [37]就是此方向上很好的一个解决方案。

2、面向任务的预训练和模型压缩

在实践中,不同的目标任务需要 PTMs拥有不同功能。而 PTMs与下游目标任务间的差异通常在于两方面:模型架构与数据分布。尽管较大的PTMs通常情况下会带来更好的性能表现,但在低计算资源下如何使用是一个实际问题。例如,对于 NLP 的 PTM 来说,对于模型压缩的研究只是个开始,Transformer 的全连接架构也使得模型压缩具有挑战性。

3、PTMs的架构设计

对于PTMs,Transformer 已经被证实是一个高效的架构。然而 Transformer 最大的局限在于其计算复杂度(输入序列长度的平方倍)。受限于 GPU 显存大小,目前大多数 PTM 无法处理超过 512 个 token 的序列长度。打破这一限制需要改进 Transformer 的结构设计,例如 Transformer-XL[92]

4、finetune中的知识迁移

finetune是目前将 PTM 的知识转移至下游任务的主要方法,但效率却很低,每个下游任务都需要有特定的finetune参数。一个可以改进的解决方案是固定PTMs的原始参数,并为特定任务添加小型的finetune适配器,这样就可以使用共享的PTMs 服务于多个下游任务。

5、PTMs 的解释性与可靠性

PTMs 的可解释性与可靠性仍然需要从各个方面去探索,它能够帮助我们理解 PTM 的工作机制,为更好的使用及性能改进提供指引。

写在最后:本文总结 与 原综述论文[1]的一些不同之处:

  1. 本文定义了PTMs两大范式:浅层词嵌入和预训练编码器。不同于原文,XLNet在原综述论文中被归为Transformer-Encoder,本文认为将其归为Transformer-XL更合适。
  2. 本文PTMs按照自监督学习的分类不同于原文。本文按照 基于上下文(Context Based)和基于对比(Contrastive Based)两种方式归类;将原文的LM、MLM、DAE、PLM归为Context Based;
  3. 本文将原文MLM和DAE统一为DAE;
  4. 其他:1)在3.1.2的E-MLM段落中,可以将StructBERT拿出来,只放在SOP;2)3.1.5对ELECTRA的描述,应采取ELECTRA原文中的主要方法(参数共享),两阶段的方法只是一种实验尝试;3)在puring部分可以补充LayerDrop;4)应将UniLM归为MLM;、

参考:

  1. 1(https://zhuanlan.zhihu.com/p/115014536#ref_1_0)bcdePre-trained Models for Natural Language Processing: A Survey https://arxiv.org/abs/2003.08271v2
  2. 2(https://zhuanlan.zhihu.com/p/115014536#ref_2_0)bA neural probabilistic language model.
  3. 3(https://zhuanlan.zhihu.com/p/115014536#ref_3_0)bcd Distributed representations of words and phrases and their compositionality.
  4. ^GloVe: Global vectors for word representation
  5. ^Character-aware neural language models.
  6. ^Enriching word vectors with subword information.
  7. ^Neural machine translation of rare words with subword units.
  8. ^Skip-thought vectors
  9. ^Context2Vec: Learning generic context embedding with bidirec- tional LSTM.
  10. ^https://zhuanlan.zhihu.com/p/110805093
  11. ^Deep contextualized word representations.
  12. ^Improving language understanding by generative pre-training.
  13. 4(https://zhuanlan.zhihu.com/p/115014536#ref_13_0)bBERT: pre-training of deep bidirectional trans- formers for language understanding
  14. 5(https://zhuanlan.zhihu.com/p/115014536#ref_14_0)bcXLnet: Generalized Autoregressive Pretraining for Language Understanding
  15. ^Learned in translation: Contextualized word vectors.
  16. 6(https://zhuanlan.zhihu.com/p/115014536#ref_16_0)bSelf-supervised Visual Feature Learning with Deep Neural Networks: A Survey
  17. 7(https://zhuanlan.zhihu.com/p/115014536#ref_17_0)bcdSelf-supervised Learning 再次入门 https://zhuanlan.zhihu.com/p/108906502
  18. ^ Language models are unsuper- vised multitask learners
  19. ^ULMFiT:Universal Language Model Fine-tuning)
  20. ^SiATL:An Embarrassingly Simple Approach for Transfer Learning from Pretrained Language Models
  21. ^MASS: masked sequence to sequence pre-training for language generation.
  22. ^Exploring the limits of transfer learning with a uni- fied text-to-text transformer
  23. 8(https://zhuanlan.zhihu.com/p/115014536#ref_23_0)bRoBERTa: A ro- bustly optimized BERT pretraining approach
  24. ^Unified language model pre-training for natural language un- derstanding and generation.
  25. 9(https://zhuanlan.zhihu.com/p/115014536#ref_25_0)bCross-lingual lan- guage model pretraining.
  26. ^SpanBERT: Improving pre- training by representing and predicting spans.
  27. 10(https://zhuanlan.zhihu.com/p/115014536#ref_27_0)bERNIE: enhanced representation through knowledge integration
  28. 11(https://zhuanlan.zhihu.com/p/115014536#ref_28_0)bERNIE 2.0: A continual pre-training framework for language understanding
  29. ^BERT is not a knowledge base (yet): Factual knowledge vs. name-based reasoning in unsupervised QA
  30. 12(https://zhuanlan.zhihu.com/p/115014536#ref_30_0)bERNIE: enhanced language representation with informative entities
  31. ^BART: denoising sequence-to- sequence pre-training for natural language generation, transla- tion, and comprehension.
  32. ^Neural autoregressive distribution estimation
  33. ^他们创造了横扫NLP的XLNet:专访CMU博士杨植麟
  34. ^A theoretical analysis of contrastive unsupervised representation learning.
  35. ^A mutual information maximization perspective of language representation learning
  36. ^Noise-contrastive estimation: A new estimation principle for unnormalized sta- tistical models.
  37. 13(https://zhuanlan.zhihu.com/p/115014536#ref_37_0)bELECTRA: Pre-training text encoders as discriminators rather than generators
  38. 14(https://zhuanlan.zhihu.com/p/115014536#ref_38_0)bPretrained encyclopedia: Weakly supervised knowledge-pretrained language model
  39. 15(https://zhuanlan.zhihu.com/p/115014536#ref_39_0)bALBERT: A lite BERT for self-supervised learning of language representations.
  40. ^StructBERT: Incorporating language struc- tures into pre-training for deep language understanding
  41. ^BERTje: A dutch BERT model
  42. ^Informing unsupervised pre- training with external linguistic knowledge
  43. ^Sentilr: Linguistic knowledge enhanced lan- guage representation for sentiment analysis
  44. ^SenseBERT: Driving some sense into BERT
  45. ^Knowledge enhanced contextual word representations
  46. ^KG-BERT: BERT for Knowledge Graph Completion
  47. ^K-BERT: Enabling lan- guage representation with knowledge graph
  48. ^K-adapter: Infusing knowledge into pre-trained models with adapters
  49. ^KEPLER: A unified model for knowledge embedding and pre-trained language representation
  50. ^Enhancing pre-trained language representations with rich knowledge for machine reading comprehension.
  51. ^Compressing BERT: Studying the effects of weight pruning on transfer learning
  52. ^REDUCING TRANSFORMER DEPTH ON DEMAND WITH STRUCTURED DROPOUT
  53. ^Q- BERT: Hessian based ultra low precision quantization of BERT.
  54. ^Q8BERT: Quantized 8bit BERT.
  55. ^BERT-of-Theseus: Compressing BERT by pro- gressive module replacing
  56. ^DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter.
  57. ^MT-DNN:Improving Multi-Task Deep Neural Networks via Knowledge Distillation for Natural Language Understanding
  58. ^TinyBERT: Distilling BERT for natural language understanding
  59. ^MobileBERT: Task-agnostic com- pression of BERT by progressive knowledge transfer
  60. ^MiniLM: Deep self-attention distillation for task-agnostic compression of pre-trained transformers.
  61. ^Extreme language model compression with optimal subwords and shared projections
  62. ^Distilling task-specific knowledge from BERT into simple neural networks
  63. ^VideoBERT: A joint model for video and language representation learning
  64. ^Contrastive bidirectional transformer for temporal representation learning
  65. ^Univilm: A unified video and language pre-training model for multimodal under- standing and generation.
  66. ^ViL- BERT: Pretraining task-agnostic visiolinguistic representa- tions for vision-and-language tasks.
  67. ^LXMERT: learning cross- modality encoder representations from transformers.
  68. ^VisualBERT: A simple and performant base- line for vision and language.
  69. ^Fusion of detected objects in text for visual question answering.
  70. ^Unicoder-vl: A universal encoder for vision and language by cross-modal pre-training
  71. ^UNITER: learning universal image-text representations.
  72. ^VL-BERT: pre-training of generic visual- linguistic representations
  73. ^SpeechBERT: Cross-modal pre-trained language model for end-to-end spoken question answering.
  74. ^BioBERT: a pre-trained biomedical language representation model for biomedical text mining.
  75. ^SciBERT: A pre- trained language model for scientific text
  76. ^Clin- icalBERT: Modeling clinical notes and predicting hospital readmission.
  77. ^BERT-based rank- ing for biomedical entity normalization.
  78. ^PatentBERT: Patent clas- sification with fine-tuning a pre-trained BERT model.
  79. ^SentiLR: Linguistic knowledge enhanced lan- guage representation for sentiment analysis.
  80. ^Progress notes clas- sification and keyword extraction using attention-based deep learning models with BERT.
  81. ^ https://github.com/google-research/bert/blob/master/multilingual.md
  82. ^Unicoder: A universal language encoder by pre-training with multiple cross-lingual tasks.
  83. ^Pre-training with whole word masking for chinese BERT
  84. ^ZEN: pre-training chinese text encoder enhanced by n-gram representations.
  85. ^NEZHA: Neural contextualized representa- tion for chinese language understanding
  86. ^BERTje: A dutch BERT model.
  87. ^ CamemBERT: a tasty french language model
  88. ^FlauBERT: Unsupervised language model pre-training for french
  89. ^Rob-BERT: a dutch RoBERTa-based language model.
  90. ^Multi-task deep neural networks for natural language understanding.
  91. ^https://zhuanlan.zhihu.com/p/114785639
  92. ^Transformer-XL: Atten- tive language models beyond a fixed-length context.

8. 文本表示和各词向量间的对比?

1、文本表示哪些方法?

下面对文本表示进行一个归纳,也就是对于一篇文本可以如何用数学语言表示呢?

  • 基于one-hot、tf-idf、textrank等的bag-of-words;
  • 主题模型:LSA(SVD)、pLSA、LDA;
  • 基于词向量的固定表征:word2vec、fastText、glove
  • 基于词向量的动态表征:elmo、GPT、bert

2、怎么从语言模型理解词向量?怎么理解分布式假设?

上面给出的4个类型也是nlp领域最为常用的文本表示了,文本是由每个单词构成的,而谈起词向量,one-hot是可认为是最为简单的词向量,但存在维度灾难和语义鸿沟等问题;通过构建共现矩阵并利用SVD求解构建词向量,则计算复杂度高;而早期词向量的研究通常来源于语言模型,比如NNLM和RNNLM,其主要目的是语言模型,而词向量只是一个副产物。

imgNNLM

所谓分布式假设,用一句话可以表达:相同上下文语境的词有似含义。而由此引申出了word2vec、fastText,在此类词向量中,虽然其本质仍然是语言模型,但是它的目标并不是语言模型本身,而是词向量,其所作的一系列优化,都是为了更快更好的得到词向量。glove则是基于全局语料库、并结合上下文语境构建词向量,结合了LSA和word2vec的优点。

img

3、传统的词向量有什么问题?怎么解决?各种词向量的特点是什么?

上述方法得到的词向量是固定表征的,无法解决一词多义等问题,如“川普”。为此引入基于语言模型的动态表征方法:elmo、GPT、bert。

各种词向量的特点:

(1)One-hot 表示 :维度灾难、语义鸿沟;

(2)分布式表示 (distributed representation) :

  • 矩阵分解(LSA):利用全局语料特征,但SVD求解计算复杂度大;
  • 基于NNLM/RNNLM的词向量:词向量为副产物,存在效率不高等问题
  • word2vec、fastText:优化效率高,但是基于局部语料;
  • glove:基于全局预料,结合了LSA和word2vec的优点;
  • elmo、GPT、bert:动态特征;

4、word2vec和NNLM对比有什么区别?(word2vec vs NNLM)

1)其本质都可以看作是语言模型;

2)词向量只不过NNLM一个产物,word2vec虽然其本质也是语言模型,但是其专注于词向量本身,因此做了许多优化来提高计算效率:

  • 与NNLM相比,词向量直接sum,不再拼接,并舍弃隐层;
  • 考虑到sofmax归一化需要遍历整个词汇表,采用hierarchical softmax 和negative sampling进行优化,hierarchical softmax 实质上生成一颗带权路径最小的哈夫曼树,让高频词搜索路劲变小;negative sampling更为直接,实质上对每一个样本中每一个词都进行负例采样;

5、word2vec和fastText对比有什么区别?(word2vec vs fastText)

1)都可以无监督学习词向量, fastText训练词向量时会考虑subword;

2) fastText还可以进行有监督学习进行文本分类,其主要特点:

  • 结构与CBOW类似,但学习目标是人工标注的分类结果;
  • 采用hierarchical softmax对输出的分类标签建立哈夫曼树,样本中标签多的类别被分配短的搜寻路径;
  • 引入N-gram,考虑词序特征;
  • 引入subword来处理长词,处理未登陆词问题;

6、glove和word2vec、 LSA对比有什么区别?(word2vec vs glove vs LSA)

1)glove vs LSA

  • LSA(Latent Semantic Analysis潜在语义分析)可以基于co-occurance matrix构建词向量,实质上是基于全局语料采用SVD进行矩阵分解,然而SVD计算复杂度高;
  • glove可看作是对LSA一种优化的高效矩阵分解算法,采用Adagrad对最小平方损失进行优化;

2)word2vec vs glove

  • word2vec是局部语料库训练的,其特征提取是基于滑窗的;而glove的滑窗是为了构建co-occurance matrix,是基于全局语料的,可见glove需要事先统计共现概率;因此,word2vec可以进行在线学习,glove则需要统计固定语料信息。
  • word2vec是无监督学习,同样由于不需要人工标注;glove通常被认为是无监督学习,但实际上glove还是有label的,即共现次数[公式]
  • word2vec损失函数实质上是**带权重的交叉熵,**权重固定;glove的损失函数是最小平方损失函数,权重可以做映射变换。
  • 总体来看,glove可以被看作是更换了目标函数和权重函数的全局word2vec

imgelmo vs GPT vs bert

7、 elmo、GPT、bert三者之间有什么区别?(elmo vs GPT vs bert)
之前介绍词向量均是静态的词向量,无法解决一次多义等问题。下面介绍三种elmo、GPT、bert词向量,它们都是基于语言模型的动态词向量。下面从几个方面对这三者进行对比:

(1)特征提取器:elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。

(2)单/双向语言模型

  • GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。
  • GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。

9. 深入解剖word2vec

1、word2vec的两种模型分别是什么?

word2Vec 有两种模型:CBOWSkip-Gram:

  • CBOW 在已知 context(w) 的情况下,预测 w
  • Skip-Gram在已知 w 的情况下预测 context(w)

imgword2vec

与NNLM相比,word2vec的主要目的是生成词向量而不是语言模型,在CBOW中,投射层将词向量直接相加而不是拼接起来,并舍弃了隐层,这些牺牲都是为了减少计算量,使训练更佳

2、word2vec的两种优化方法是什么?它们的目标函数怎样确定的?训练过程又是怎样的?

不经过优化的CBOW和Skip-gram中 ,在每个样本中每个词的训练过程都要遍历整个词汇表,也就是都需要经过softmax归一化,计算误差向量和梯度以更新两个词向量矩阵(这两个词向量矩阵实际上就是最终的词向量,可认为初始化不一样),当语料库规模变大、词汇表增长时,训练变得不切实际。为了解决这个问题,word2vec支持两种优化方法:hierarchical softmaxnegative sampling。此部分仅做关键介绍,数学推导请仔细阅读《word2vec 中的数学原理详解》。

(1)基于hierarchical softmax 的 CBOW 和 Skip-gram

img基于hierarchical softmax 的 CBOW 和 Skip-gram

hierarchical softmax 使用一颗二叉树表示词汇表中的单词,每个单词都作为二叉树的叶子节点。对于一个大小为V的词汇表,其对应的二叉树包含V-1非叶子节点。假如每个非叶子节点向左转标记为1,向右转标记为0,那么每个单词都具有唯一的从根节点到达该叶子节点的由{0 1}组成的代号(实际上为哈夫曼编码,为哈夫曼树,是带权路径长度最短的树,哈夫曼树保证了词频高的单词的路径短,词频相对低的单词的路径长,这种编码方式很大程度减少了计算量)。

CBOW中的目标函数是使条件概率 [公式] 最大化,其等价于:

img

Skip-gram中的目标函数是使条件概率 [公式] 最大化,其等价于:

img

(2)基于negative sampling的 CBOW 和 Skip-gram

negative sampling是一种不同于hierarchical softmax的优化策略,相比于hierarchical softmax,negative sampling的想法更直接——为每个训练实例都提供负例。

对于CBOW,其目标函数是最大化:

img

img

img

对于Skip-gram,同样也可以得到其目标函数是最大化:

img

img

img

负采样算法实际上就是一个带权采样过程,负例的选择机制是和单词词频联系起来的。

img

img

img

具体做法是以 N+1 个点对区间 [0,1] 做非等距切分,并引入的一个在区间 [0,1] 上的 M 等距切分,其中 M >> N。源码中取 M = 10^8。然后对两个切分做投影,得到映射关系:采样时,每次生成一个 [1, M-1] 之间的整数 i,则 Table(i) 就对应一个样本;当采样到正例时,跳过(拒绝采样)。

img

Negative Sampling · 负采样

在训练神经网络时,每当接受一个训练样本,然后调整所有神经单元权重参数,来使神经网络预测更加准确。换句话说,每个训练样本都将会调整所有神经网络中的参数。
我们词汇表的大小决定了我们skip-gram 神经网络将会有一个非常大的权重参数,并且所有的权重参数会随着数十亿训练样本不断调整。

negative sampling 每次让一个训练样本仅仅更新一小部分的权重参数,从而降低梯度下降过程中的计算量。
如果 vocabulary 大小为1万时, 当输入样本 ( “fox”, “quick”) 到神经网络时, “ fox” 经过 one-hot 编码,在输出层我们期望对应 “quick” 单词的那个神经元结点输出 1,其余 9999 个都应该输出 0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们为 negative word. negative sampling 的想法也很直接 ,将随机选择一小部分的 negative words,比如选 10个 negative words 来更新对应的权重参数。

在论文中作者指出对于小规模数据集,建议选择 5-20 个 negative words,对于大规模数据集选择 2-5个 negative words.

如果使用了 negative sampling 仅仅去更新positive word- “quick” 和选择的其他 10 个negative words 的结点对应的权重,共计 11 个输出神经元,相当于每次只更新 300 x 11 = 3300 个权重参数。对于 3百万 的权重来说,相当于只计算了千分之一的权重,这样计算效率就大幅度提高。

Selecting Negative Samples

使用 一元模型分布 (unigram distribution) 来选择 negative words,一个单词被选作 negative sample 的概率跟它出现的频次有关,现频次越高的单词越容易被选作negative words,经验公式为:

img

f(w) 代表 每个单词被赋予的一个权重,即 它单词出现的词频分母 代表所有单词的权重和公式中3/4完全是基于经验的,论文中提到这个公式的效果要比其它公式更加出色。

img

10.深入解剖Glove详解

GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具。

1、GloVe构建过程是怎样的?

(1)根据语料库构建一个共现矩阵,矩阵中的每一个元素 [公式] 代表单词 [公式] 和上下文单词 [公式] 在特定大小的上下文窗口内共同出现的次数。

(2)构建词向量(Word Vector)和共现矩阵之间的近似关系,其目标函数为: [公式]
这个loss function的基本形式就是最简单的mean square loss,只不过在此基础上加了一个权重函数 [公式] :
[公式]

根据实验发现 [公式] 的值对结果的影响并不是很大,原作者采用了 [公式] 。而 [公式] 时的结果要比 [公式] 时要更好。下面是 [公式][公式] 的函数图象,可以看出对于较小的 [公式] ,权值也较小。这个函数图像如下所示:

img

2、GloVe的训练过程是怎样的?

  1. 实质上还是监督学习:虽然glove不需要人工标注为无监督学习,但实质还是有label就是 [公式]
  2. 向量 [公式][公式]为学习参数,本质上与监督学习的训练方法一样,采用了AdaGrad的梯度下降算法,对矩阵 [公式] 中的所有非零元素进行随机采样,学习曲率(learning rate)设为0.05,在vector size小于300的情况下迭代了50次,其他大小的vectors上迭代了100次,直至收敛。
  3. 最终学习得到的是两个词向量是 [公式][公式] ,因为 [公式] 是对称的(symmetric),所以从原理上讲[公式][公式] ,是也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,我们最终会选择两者之和 [公式] 作为最终的vector(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。

3、Glove损失函数是如何确定的?(来自GloVe详解

img

img

img

11. 深入解剖bert(与elmo和GPT比较)

bert的全称是Bidirectional Encoder Representation from Transformers,bert的核心是双向Transformer Encoder,提出以下问题并进行解答:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ota8BlrJ-1602121779817)(C:\Users\VULCAN\AppData\Roaming\Typora\typora-user-images\image-20200520192431888.png)]

也可以把词抠出来,进行训练,loss,这样能更好捕捉词与词的关联,

1、为什么bert采取的是双向Transformer Encoder,而不叫decoder?

BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。双向 Transformer 通常被称为“Transformer encoder”,而左侧上下文被称为“Transformer decoder”,decoder是不能获取要预测的信息的。

2、elmo、GPT和bert在单双向语言模型处理上的不同之处?

在上述3个模型中,只有bert共同依赖于左右上下文。那elmo不是双向吗?实际上elmo使用的是经过独立训练的从左到右和从右到左LSTM的串联拼接起来的。而GPT使用从左到右的Transformer,实际就是“Transformer decoder”。

3、bert构建双向语言模型不是很简单吗?不也可以直接像elmo拼接Transformer decoder吗?

BERT 的作者认为,这种拼接式的bi-directional 仍然不能完整地理解整个语句的语义。更好的办法是用上下文全向来预测[mask],也就是用 “能/实现/语言/表征/…/的/模型”,来预测[mask]。BERT 作者把上下文全向的预测方法,称之为 deep bi-directional。

4、bert为什么要采取Marked LM,而不直接应用Transformer Encoder?

我们知道向Transformer这样深度越深,学习效果会越好。可是为什么不直接应用双向模型呢?因为随着网络深度增加会导致标签泄露。如下图:

img双向编码与网络深度的冲突

深度双向模型比left-to-right 模型或left-to-right and right-to-left模型的浅层连接更强大。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接地“see itself”。

为了训练一个深度双向表示(deep bidirectional representation),研究团队采用了一种简单的方法,即随机屏蔽(masking)部分输入token,然后只预测那些被屏蔽的token。论文将这个过程称为“masked LM”(MLM)。

5、bert为什么并不总是用实际的[MASK]token替换被“masked”的词汇?

NLP必读 | 十分钟读懂谷歌BERT模型: 虽然这确实能让团队获得双向预训练模型,但这种方法有两个缺点。首先,预训练和finetuning之间不匹配,因为在finetuning期间从未看到[MASK]token。为了解决这个问题,团队并不总是用实际的[MASK]token替换被“masked”的词汇。相反,训练数据生成器随机选择15%的token。例如在这个句子“my dog is hairy”中,它选择的token是“hairy”。然后,执行以下过程:
数据生成器将执行以下操作,而不是始终用[MASK]替换所选单词:
80%的时间:用[MASK]标记替换单词,例如,my dog is hairy → my dog is [MASK]
10%的时间:用一个随机的单词替换该单词,例如,my dog is hairy → my dog is apple
10%的时间:保持单词不变,例如,my dog is hairy → my dog is hairy. 这样做的目的是将表示偏向于实际观察到的单词。
Transformer encoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示。此外,因为随机替换只发生在所有token的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。
使用MLM的第二个缺点是每个batch只预测了15%的token,这表明模型可能需要更多的预训练步骤才能收敛。团队证明MLM的收敛速度略慢于 left-to-right的模型(预测每个token),但MLM模型在实验上获得的提升远远超过增加的训练成本。

bert模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。

img

下面给出了Transformer Encoder模型的整体结构:

imgTransformer Encoder

imgmulti-head attention

nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

Reference

  1. word2vec 中的数学原理详解
  2. GloVe详解
  3. 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
  4. NLP必读 | 十分钟读懂谷歌BERT模型
  5. 谷歌BERT解析----2小时上手最强NLP训练模型

12. 神经网络基础

1、神经网络中的激活函数:对比ReLU与Sigmoid、Tanh的优缺点?ReLU有哪些变种?

优点:

  • 从计算的角度上,Sigmoid和Tanh激活函数均需要计算指数,复杂度高,而ReLU只需要一个阈值即可得到激活值;
  • ReLU的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活边界。
  • ReLU的单侧抑制提供了网络的稀疏表达能力。

修正线性单元(Rectified Linear Unit,ReLU):ReLU函数被认为有生物上的解释性,比如单侧抑制、宽兴奋边界(即兴奋程度 也可以非常高)。在生物神经网络中,同时处于兴奋状态的神经元非常稀疏。人 脑中在同一时刻大概只有1 ∼ 4%的神经元处于活跃状态。Sigmoid型激活函数会导致一个非稀疏的神经网络,而ReLU却具有很好的稀疏性,大约50%的神 经元会处于激活状态。

缺点:

  • ReLU和Sigmoid一样,它们的输出是非零中心化的,给后一层的神经网络引入偏置偏移, 会影响梯度下降的效率。

img

  • ReLU的局限性在于其训练过程中会导致神经元死亡的问题。

在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个ReLU神经元在所有的训练数据上都不能被激活。那么,这个神经元自身参数的梯度永远都会是 0,在以后的训练过程中永远不能被激活。这种现象称为死亡 ReLU 问题 (Dying ReLU Problem),并且也有可能会发生在其它隐藏层。

ReLU的变种

在实际使用中,为了避免上述情况,有几种ReLU的变种也会被广泛使用:Leaky ReLU、ELU以及softplus函数

imgReLU、Leaky ReLU、ELU以及softplus函数

2、神经网络结构哪几种?各自都有什么特点?

  • 前馈网络:整个网络中的信息是朝一个方向传播,没有反向的信息传播,可以用一个有向无环路图表示。前馈网络包括全连接前馈网络卷积神经网络等。
  • 反馈网络:反馈网络中神经元不但可以接收其它神经元的信号,也可以接收自己的反馈信号。和前馈网络相比,反馈网络中的神经元具有记忆功能,在不同的时刻具有不同的状态。馈神经网络中的信息传播可以是单向或双向传递,因此可用一个有向循环图或无向图来表示。反馈网络包括循环神经网络、Hopfield 网络、玻尔兹曼机等。
  • 图网络:图网络是定义在图结构数据上的神经网络。图中每个节点都一个或一组神经元构成。节点之间的连接可以是有向的,也可以是无向的。每个 节点可以收到来自相邻节点或自身的信息。 图网络是前馈网络和记忆网络的泛化,包含很多不同的实现方式,比如图卷积网络、消息传递网络等。

img前馈网络、反馈网络和图网络

3、前馈神经网络叫做多层感知机是否合适?

前馈神经网络也经常称为多层感知器(Multi-Layer Perceptron,MLP)。但多层感知器的叫法并不是十分合理,因为前馈神经网络其实是由多层的logistic 回归模型(连续的非线性函数)组成,而不是由多层的感知器(不连续的非线性函数)组成。

4、前馈神经网络怎么划分层?

在前馈神经网络中,各神经元分别属于不同的层。每一层的神经元可以接受前一层神经元的信号,并产生信号输出到下一层。第0层叫输入层,最后一层叫输出层,其它中间层叫做隐藏层。整个网络中无反馈,信号从输入层向输 出层单向传播,可用一个有向无环图表示。

5、如何理解通用近似定理?

img通用近似定理《神经网络与深度学习》

通用近似定理:对于具有线性输出层和至少一个使用“挤压”性质的激活函数的隐藏层组成的前馈神经网络,只要其隐藏层神经元的数量足够,它可以以任意的精度来近似任何从一个定义在实数空间中的有界闭集函数。说明:

  • 所谓“挤压”性质的函数是指像 sigmoid 函数的有界函数,但神经网络的通用近似性质也被证明对于其 它类型的激活函数,比如ReLU,也都是适用的。
  • 通用近似定理只是说明了**神经网络的计算能力可以去近似一个给定的连续函数,但并没有给出如何找到这样一个网络,以及是否是最优的。**此外,当应用到机器学习时,真实的映射函数并不知道,一般是通过经验风险最小化和正则化来进行参数学习。因为神经网络的强大能力,反而容易在训练集上过拟合。

6、怎么理解前馈神经网络中的反向传播?具体计算流程是怎样的?

img

img

上式中,误差项 [公式] 来表示第 [公式] 层的神经元对最终误差的影响,也反映了最终的输出对第 [公式] 层的神经元对最终误差的敏感程度。

前馈神经网络中反向传播的实质就是误差的反向传播: 第 [公式] 层的误差项可以通过第 [公式] 层的误差项计算得到,这就是误差的反向传播。

误差反向传播算法的具体含义是[公式] 层的一个神经元的误差项(或敏感性)是所有与该神经元相连的第 [公式] 层的神经元的误差项的权重和,然后再乘上该神经元激活函数的梯度。

出使用随机梯度下降的误差反向传播算法的具体训练过程:

img

7、卷积神经网络哪些部分构成?各部分作用分别是什么?

如果用全连接前馈网络来处理图像时,会存在以下两个问题:

  • 参数太多
  • 局部不变性特征:全连接前馈网络很难提取局部不变特征,一般需要进行数据增强来提高性能。

卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的前馈神经网络,使用反向传播算法进行训练。卷积神经网络有三个结构上的特性:局部连接,权重共享以及子采样。

  • 卷积层的作用:局部连接,权重共享;
  • 池化层(pooling layer)也叫子采样层(subsampling layer)的作用:进行特征选择,降低特征数量,并从而减少参数数

img全连接和局部连接

8、在深度学习中,网络层数增多会伴随哪些问题,怎么解决?为什么要采取残差网络ResNet?

CNN之三大经典网络LeNet-AlexNet-VGG。在VGG中,卷积网络达到了19层,在GoogLeNet中,网络史无前例的达到了22层。那么,网络的精度会随着网络的层数增多而增多吗?随着网络层数的增加,网络发生了退化(degradation)的现象:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当你再增加网络深度的话,训练集loss反而会增大。注意这并不是过拟合,因为在过拟合中训练loss是一直减小的。

(1)在深度学习中,网络层数增多会伴随哪些问题,怎么解决?

  • 1 计算资源的消耗(GPU)
  • 2 模型容易过拟合(Dropout)
  • 3 梯度消失/梯度爆炸问题的产生(批量归一化BN):BN层能对各层的输出做归一化,这样梯度在反向层层传递后仍能保持大小稳定,不会出现过小或过大的情况。
  • 4 degradation退化问题:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当你再增加网络深度的话,训练集loss反而会增大。注意这并不是过拟合,因为在过拟合中训练loss是一直减小的。(残差网络ResNet?)

(2)为什么要采取残差网络ResNet?

img残差网络ResNet

img

残差块可以表示为:(参考自详解残差网络

[公式]

对于一个更深的层 [公式] ,其与 [公式] 层的关系可以表示为

[公式]

这个公式反应了残差网络的两个属性:

  1. [公式] 层可以表示为任意一个比它浅的l层和他们之间的残差部分之和;
  2. [公式][公式] 是各个残差块特征的单位累和,而MLP是特征矩阵的累积。

根据BP中使用的导数的链式法则,损失函数 [公式] 关于 [公式] 的梯度可以表示为

[公式]

上面公式反映了残差网络的两个属性:

  1. 在整个训练过程中, [公式] 不可能一直为 [公式] ,也就是说在残差网络中不会出现梯度消失的问题。
  2. [公式] 表示 [公式] 层的梯度可以直接传递到任何一个比它浅的 [公式] 层。

13. 循环神经网络

1、什么是循环神经网络?循环神经网络的基本结构是怎样的?

循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接受其它神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。和前馈神经网络相比,循环神经网络更加符合生物神经网络的结构。循环神经网络已经被广泛应用在语音识别、语言模型以及自然语言生成等任务上。循环神经网络的参数学习可以通过随时间反向传播算法来学习。随时间反向传播算法即按照时间的逆序将错误信息一步步地往前传递。当输入序列比较长时,会存在梯度爆炸和消失问题,也称为长期依赖问题。为了解决这个问题,人们对循环神经网络,进行了很多的改进,其中最有效的改进方式引入门控机制。此外,循环神经网络可以很容易地扩展到两种更广义的记忆网络模型:递归神经网络和图网络。——《神经网络与深度学习》

img循环神经网络

2、循环神经网络RNN常见的几种设计模式是怎样的?

  • 序列到类别模式
  • 同步序列到序列模式
  • 异步的序列到序列模式

img序列到类别模式

img同步序列到序列模式

img异步的序列到序列模式

3、循环神经网络RNN怎样进行参数学习?

随时间反向传播(Backpropagation Through Time,BPTT)算法的主要思想是通过类似前馈神经网络的错误反向传播算法来进行计算梯度。BPTT算法将循环神经网络看作是一个展开的多层前馈网络,其中“每一层”对应循环网络中的“每个时刻”。这样,循环神经网络就可以按按照前馈网络中的反向传播算法进行计算参数梯度。**在“展开”的前馈网络中,所有层的参数是共享的。**因此参数的真实梯度是将所有“展开层”的参数梯度之和。

img随时间反向传播BPTT算法示例

img

定义 [公式] 为第t 时刻的损失对第k 时刻隐藏神经层的净输入 [公式] 的导数,同样对U、W求导时则可得到到随时间反向传播的公式:

img

img

4、循环神经网络RNN长期依赖问题产生的原因是怎样的?

RNN产生长期依赖的原因与参数学习BPTT过程有关,实质就是参数U 的更新主要靠当前时刻k 的几个相邻状态 [公式] 来更新,长距离的状态对U 没有影响。将 [公式] 展开可得到:

[公式]

如果令 [公式] ,则可得到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kc5UQhKi-1602121779849)(https://www.zhihu.com/equation?tex=%5Cdelta_%7Bt%2Ck%7D%3D%5Cgamma%5E%7Bt-k%7D%5Cdelta_%7Bt%2Ct%7D)]

若 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s8CAHxVr-1602121779850)(https://www.zhihu.com/equation?tex=%5Cgamma%3E1+)],当 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DPoiyaKJ-1602121779851)(https://www.zhihu.com/equation?tex=t%E2%88%92k%5Crightarrow%5Cinfty)] 时,造成系统不稳定,称为梯度爆炸问题(Gradient Exploding Problem);相反,若 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TvPLRsvc-1602121779853)(https://www.zhihu.com/equation?tex=%5Cgamma%3C1+)],当 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GQjQdLKP-1602121779853)(https://www.zhihu.com/equation?tex=t%E2%88%92k%5Crightarrow%5Cinfty)] 时会出现和深度前馈神经网络类似的梯度消失问题(gradient vanishing problem)。

在循环神经网络中的梯度消失不是说 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d1cE8kEn-1602121779853)(https://www.zhihu.com/equation?tex=%5Cfrac%7B%5Calpha+L%7D%7B%5Calpha+U%7D)] 的梯度消失了,而是 [公式] 的梯度消失了当 [公式] 。也就是说,参数U 的更新主要靠当前时刻k 的几个相邻状态 [公式] 来更新,长距离的状态对U 没有影响。

5、RNN中为什么要采用tanh而不是ReLu作为激活函数?为什么普通的前馈网络或 CNN 中采取ReLU不会出现问题?

[公式] 可以得到,当使用ReLU作为激活函数时, [公式] ,只要 [公式] 不是单位矩阵,梯度还是会出现消失或者爆炸的现象。

当采用ReLU作为循环神经网络中隐含层的激活函数时,**只有当 [公式] 的取值在单位矩阵附近时才能取得比较好的效果,因此需要将 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IHxjx6W3-1602121779862)(https://www.zhihu.com/equation?tex=U)] 初始化为单位矩阵。**实验证明,初始化W为单位矩阵并使用ReLU激活函数在一些应用中取得了与长短期记忆模型相似的结果,并且学习速度比长短期记忆模型更快,是一个值得尝试的小技巧。

那么为什么普通的前馈网络或 CNN 中采取ReLU不会出现梯度消失或梯度爆炸的问题呢?

类似前馈神经网络中的误差反向传播:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FUPRZfBV-1602121779862)(https://pic4.zhimg.com/80/v2-6e664bccf536e3bca81c60d649f889db_720w.jpg)]

因为他们每一层的 W 不同,且在初始化时是独立同分布的,因此可以在一定程度相互抵消。即使多层之后一般也不会出现数值问题。

6、循环神经网络RNN怎么解决长期依赖问题?LSTM的结构是怎样的?LSTM又有哪些变种的?

RNN中的长期依赖问题,也就是梯度消失或梯度爆炸可以采取如下方法解决:

  1. RNN梯度爆炸的解决方法:梯度截断

  2. RNN梯度消失的解决方法;残差结构、门控机制(LSTM、GRU)

为了RNN中的长期依赖问题,一种非常好的解决方案是引入门控Hochreiter and Schmidhuber 来控制信息的累积速度,包括有选择地加入新的信息,并有选择地遗忘之前累积的信息。这一类网络可以称为基于门控的循环神经网络(Gated RNN)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTiD6vou-1602121779862)(https://pic1.zhimg.com/80/v2-5c3b956dff7a2a7235387d562db7e918_720w.jpg)]

长短期记忆(LSTM)结构

长短期记忆(LSTM)网络和门控循环单元(GRU)网络是两种主要的基于门控的循环神经

网络。LSTM的结构如上图所示,LSTM三个门的作用是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knwlbevR-1602121779864)(https://pic4.zhimg.com/80/v2-93d4c22c5245fe149a34695a850afe6b_720w.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6DLAQORE-1602121779864)(https://pic3.zhimg.com/80/v2-0d8a13831d598a7ffc62f2ccf752c8d2_720w.jpg)]

7、怎么理解“长短时记忆单元”?RNN中的隐状态 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V9xLu29E-1602121779865)(https://www.zhihu.com/equation?tex=h_t)] 与LSTM中的记忆状态 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J9eoOpPu-1602121779865)(https://www.zhihu.com/equation?tex=C_t)] 有什么区别?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5otMfwbt-1602121779866)(https://www.zhihu.com/equation?tex=h_t)] 为短期记忆, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UVAsGNwW-1602121779866)(https://www.zhihu.com/equation?tex=C_t)] 记忆能力由于[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-21r6EUHH-1602121779867)(https://www.zhihu.com/equation?tex=h_t)] ,但又远远短于长期记忆,因此被称为长的短时记忆。

记忆循环神经网络中的隐状态h存储了历史信息,可以看作是一种记忆(memory)。在简单循环网络中,隐状态每个时刻都会被重写,因此可以看作是一种短期记忆(short-term memory)。在神经网络中,长期记忆(long-term memory)可以看作是网络参数,隐含了从训练数据中学到的经验,并更新周期要远远慢于短期记忆。而在LSTM网络中,记忆单元c 可以在某个时刻捕捉到某个关键信息,并有能力将此关键信息保存一定的时间间隔。记忆单元c 中保存信息的生命周期要长于短期记忆h,但又远远短于长期记忆,因此称为长的短期记忆(long short-term memory)。

8、LSTM与GRU关系是怎样的?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a9Lbj5q8-1602121779867)(https://pic3.zhimg.com/80/v2-34c93e858b69c4129f9ff604288beab2_720w.jpg)]GRU结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QF2H16Wz-1602121779867)(https://pic4.zhimg.com/80/v2-3ec711bb9f1b74a1391c362553df870b_720w.jpg)]

  • GRU 把遗忘门和输入门合并为更新门(update)z,并使用重置门(reset)r 代替输出门;
  • 合并了记忆状态 C 和隐藏状态 h

14. 神经网络的训练技巧及优化问题

神经网络主要的问题集中在优化问题和正则化问题。

(1)优化问题:神经网络模型是一个非凸函数,再加上在深度网络中的梯度消失问题,很难进行优化;另外,深层神经网络模型一般参数比较多,训练数据也比较大,会导致训练的效率比较低。
(2)泛化问题:因为神经网络的拟合能力强,反而容易在训练集上产生过拟合。因此,在训练深层神经网络时,同时也需要通过一定的正则化方法来改进网络的泛化能力。

对应的优化问题有:

  • 1)如何初始化参数;
  • 2)预处理数据;
  • 3)如何避免陷入局部最优?(学习率衰减+梯度方向优化)

具体展开讨论如下:

1、神经网络优化的难点体现在哪里?

深层神经网络是一个高度非线性的模型,其风险函数是一个非凸函数,因此风险最小化是一个非凸优化问题,会存在很多局部最优点。在高维空间中,非凸优化的难点并不在于如何逃离局部最优点,而是如何逃离鞍点

2、神经网络数据预处理方法有哪些?神经网络怎样进行参数初始化?参数初始化为0、过大、过小会怎样?

(1)神经网络数据预处理方法有哪些?

  • 缩放归一化:通过缩放将每一个特征的取值范围归一到[0, 1] 或[−1, 1] 之间
  • 标准归一化:将每一个维特征都处理为符合标准正态分布(均值为0,标准差为1)。
  • 白化(Whitening):是一种重要的预处理方法,用来降低输入数据特征之间的冗余性。输入数据经过白化处理后,特征之间相关性较低,并且所有特征具有相同的方差。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M8o19uov-1602121779868)(https://pic3.zhimg.com/80/v2-ad87adc0906a9254633eb25e68444f6a_720w.jpg)]

(2)参数初始化为0、过大、过小会怎样?

  • 参数为0:在第一遍前向计算时,所有的隐层神经元的激活值都相同。这样会导致深层神经元没有区分性。这种现象也称为对称权重现象。
  • 参数过大或过小:参数过小还会使得sigmoid型激活函数丢失非线性的能力,这样多层神经网络的优势也就不存在了。如果参数取得太大,会导致输入状态过大。对于sigmoid 型激活函数来说,激活值变得饱和,从而导致梯度接近于0。

(3)经常使用的初始化方法有以下几种:

  • Gaussian 分布初始化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKRolHPk-1602121779869)(https://pic4.zhimg.com/80/v2-2d167be29b476ba0b13a97385b48fba7_720w.jpg)]

  • Xavier均匀分布初始化:参数可以在[−r, r] 内采用均匀分布进行初始化

对于sigmoid 型激活函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JNapX84e-1602121779870)(https://pic2.zhimg.com/80/v2-85ea5086dac1f5d11a03094c771c8ef1_720w.jpg)]

对于tanh函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-20LQVAYV-1602121779870)(https://pic3.zhimg.com/80/v2-19d992d087999588abc9c320c54bd9a2_720w.jpg)]

3、神经网络优化方法有哪些?

几种优化方法大体上可以分为两类:一是调整学习率,使得优化更稳定;二是调整梯度方向,优化训练速度。如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ULY03AuJ-1602121779870)(https://pic3.zhimg.com/80/v2-db5d3eceb2a13b3aec51f9a8879da3fe_720w.jpg)]

  • AdaGrad:Adagrad 算法的缺点是在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点。在第t 迭代时,计算每个参数梯度平方的累计值:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m7Hq84wd-1602121779871)(https://pic2.zhimg.com/80/v2-9c8a88bd2709c66b7a251455ac27c195_720w.jpg)]

img

  • RMSprop:计算每次迭代梯度gt 平方的指数衰减移动平均:

img

  • 动量法:用梯度的移动平均来代替每次的实际梯度:
  • Adam:Adam 算法一方面计算梯度平方的指数加权平均(和RMSprop 类似),另一方面计算梯度gt 的指数加权平均(和动量法类似)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qQUCN5v2-1602121779872)(https://pic3.zhimg.com/80/v2-95682f5a103283db3c23ec24e95c4c32_720w.jpg)]

img

img

4、请介绍逐层归一化(Batch Normalization和Layer Normalization)?

(1)为什么要进行逐层归一化?什么是内部协变量偏移?

在深层神经网络中,中间某一层的输入是其之前的神经层的输出。因此,其之前的神经层的参数变化会导致其输入的分布发生较大的差异。在使用随机梯度下降来训练网络时,每次参数更新都会导致网络中间每一层的输入的分布发生改变。越深的层,其输入的分布会改变得越明显。就像一栋高楼,低楼层发生一个较小的偏移,都会导致高楼层较大的偏移。

协变量偏移:协变量是一个统计学概念,是可能影响预测结果的统计变量。 在机器学习中,协变量可以看作是输入。一般的机器学习算法都要求输 入在训练集和测试集上的分布是相似的。如果不满足这个要求,这些学 习算法在测试集的表现会比较差。

从机器学习角度来看,如果某个神经层的输入分布发生了改变,那么其参数需要重新学习,这种现象叫做内部协变量偏移

内部协变量偏移会导致什么问题?

简而言之,每个神经元的输入数据不再是“独立同分布”。

  1. 上层参数需要不断适应新的输入数据分布,降低学习速度。
  2. 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
  3. 层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。

为了解决内部协变量偏移问题,就要使得每一个神经层的输入的分布在训练过程中要保持一致。最简单直接的方法就是对每一个神经层都进行归一化操作,使其分布保存稳定。下面介绍几种比较常用的逐层归一化方法:批量归一化、层归一化。层归一化和批量归一化整体上是十分类似的,差别在于归一化的方法不同。

动机

  • 训练的本质是学习数据分布。如果训练数据与测试数据的分布不同会降低模型的泛化能力。因此,应该在开始训练前对所有输入数据做归一化处理。
  • 而在神经网络中,因为每个隐层的参数不同,会使下一层的输入发生变化,从而导致每一批数据的分布也发生改变;致使网络在每次迭代中都需要拟合不同的数据分布,增大了网络的训练难度与过拟合的风险。

(2)批量归一化(Batch Normalization,BN)的主要作用是什么?主要原理是什么?

BN 是一种正则化方法(减少泛化误差),主要作用有:

  • 加速网络的训练(缓解梯度消失,支持更大的学习率)
  • **防止过拟合:**BN 可以看作在各层之间加入了一个新的计算层,对数据分布进行额外的约束,从而增强模型的泛化能力;
  • 降低了参数初始化的要求。

基本原理

  • BN 方法会针对每一批数据,在网络的每一层输入之前增加归一化处理,使输入的均值为 0,标准差为 1目的是将数据限制在统一的分布下。
  • 具体来说,针对每层的第 k 个神经元,计算这一批数据在第 k 个神经元的均值与标准差,然后将归一化后的值作为该神经元的激活值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BE7dPO7z-1602121779874)(https://pic2.zhimg.com/80/v2-b9a1fcbeead480142688e0cbe182da61_720w.jpg)]

  • BN 可以看作在各层之间加入了一个新的计算层,对数据分布进行额外的约束,从而增强模型的泛化能力;
  • 但同时 BN 也降低了模型的拟合能力,破坏了之前学到的特征分布;为了恢复数据的原始分布,BN 引入了一个重构变换来还原最优的输入数据分布

img

其中 γβ 为可训练参数。

(3)BN 在训练和测试时分别是怎么做的?

  • 训练时每次会传入一批数据,做法如前述;训练时不采用移动平均,使用 BN 的目的就是为了保证每批数据的分布稳定,使用全局统计量反而违背了这个初衷;
  • 当测试或预测时,每次可能只会传入单个数据,此时模型会使用全局统计量代替批统计量(移动平均(moving averages))

5、神经网络正则化的方法有哪些?

  • L1 和L2 正则化:L1 和L2 正则化是机器学习中最常用的正则化方法,通过约束参数的L1 和L2 范数来减小模型在训练数据集上的过拟合现象
  • Batch Normalization(同上)
  • 提前停止: 当验证集上的错误率不再下降,就停止迭代。
  • Dropout:集成学习的解释:每做一次丢弃,相当于从原始的网络中采样得到一个子网络。每次迭代都相当于训练一个不同的子网络,这些子网络都共享原始网络的参数。那么,最终的网络可以近似看作是集成了指数级个不同网络的组合模型。当在循环神经网络上应用丢弃法,不能直接对每个时刻的隐状态进行随机丢弃,这样会损害循环网络在时间维度上记忆能力。一种简单的方法是对非时间维度的连接(即非循环连接)进行随机丢失:

img虚线边表示进行随机丢弃,不同的颜色表示不同的丢弃掩码

  • 数据增强: 增加数据量,提高模型鲁棒性,避免过拟合。目前,数据增强还主要应用在图像数据上,在文本等其它类型的数据还没有太好的方法。
  • 标签平滑:在输出标签中添加噪声来避免模型过拟合。

6、神经网络怎么解决梯度消失问题?

  • 选择合适的激活函数:前馈神经网络:ReLU 循环神经网络:tanh
  • Batch Normalization
  • 采取残差网络ResNet

15-1.详解BiLSTM及代码实现

一、介绍

1.1 文章组织

本文简要介绍了BiLSTM的基本原理,并以句子级情感分类任务为例介绍为什么需要使用LSTM或BiLSTM进行建模。在文章的最后,我们给出在PyTorch下BiLSTM的实现代码,供读者参考。

1.2 情感分类任务

自然语言处理中情感分类任务是对给定文本进行情感倾向分类的任务,粗略来看可以认为其是分类任务中的一类。对于情感分类任务,目前通常的做法是先对词或者短语进行表示,再通过某种组合方式把句子中词的表示组合成句子的表示。最后,利用句子的表示对句子进行情感分类。

举一个对句子进行褒贬二分类的例子。

句子:我爱赛尔

情感标签:褒义

1.3 什么是LSTM和BiLSTM?

LSTM的全称是Long Short-Term Memory,它是RNN(Recurrent Neural Network)的一种。LSTM由于其设计的特点,非常适合用于对时序数据的建模,如文本数据。BiLSTM是Bi-directional Long Short-Term Memory的缩写,是由前向LSTM与后向LSTM组合而成。两者在自然语言处理任务中都常被用来建模上下文信息。

1.4 为什么使用LSTM与BiLSTM?

将词的表示组合成句子的表示,可以采用相加的方法,即将所有词的表示进行加和,或者取平均等方法,但是这些方法没有考虑到词语在句子中前后顺序。如句子“我不觉得他好”。“不”字是对后面“好”的否定,即该句子的情感极性是贬义。使用LSTM模型可以更好的捕捉到较长距离的依赖关系。因为LSTM通过训练过程可以学到记忆哪些信息和遗忘哪些信息。

但是利用LSTM对句子进行建模还存在一个问题:无法编码从后到前的信息。在更细粒度的分类时,如对于强程度的褒义、弱程度的褒义、中性、弱程度的贬义、强程度的贬义的五分类任务需要注意情感词、程度词、否定词之间的交互。举一个例子,“这个餐厅脏得不行,没有隔壁好”,这里的“不行”是对“脏”的程度的一种修饰,通过BiLSTM可以更好的捕捉双向的语义依赖。

二、BiLSTM原理简介

2.1 LSTM介绍

2.1.1 总体框架

img

总体框架如图1所示。

img图1. LSTM总体框架

2.1.2 详细介绍计算过程

计算遗忘门,选择要遗忘的信息。

img

img图2. 计算遗忘门

计算记忆门,选择要记忆的信息。

img

img图3. 计算记忆门和临时细胞状态

计算当前时刻细胞状态

img

img图4. 计算当前时刻细胞状态

计算输出门和当前时刻隐层状态

img

img图5. 计算输出门和当前时刻隐层状态

最终,我们可以得到与句子长度相同的隐层状态序列{ [公式] }

2.2 BiLSTM介绍

前向的LSTM与后向的LSTM结合成BiLSTM。比如,我们对“我爱中国”这句话进行编码,模型如图6所示。

img图6. 双向LSTM编码句子

img

对于情感分类任务来说,我们采用的句子的表示往往是[ [公式] ]

。因为其包含了前向与后向的所有信息,如图7所示。

img图7. 拼接向量用于情感分类

三、BiLSTM代码实现样例

3.1 模型搭建

使用PyTorch搭建BiLSTM样例代码。代码地址为https://github.com/albertwy/BiLSTM/

#!/usr/bin/env python
# coding:utf8

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

torch.manual_seed(123456)


class BLSTM(nn.Module):
    """
        Implementation of BLSTM Concatenation for sentiment classification task
    """

    def __init__(self, embeddings, input_dim, hidden_dim, num_layers, output_dim, max_len=40, dropout=0.5):
        super(BLSTM, self).__init__()

        self.emb = nn.Embedding(num_embeddings=embeddings.size(0),
                                embedding_dim=embeddings.size(1),
                                padding_idx=0)
        self.emb.weight = nn.Parameter(embeddings)

        self.input_dim = input_dim
        self.hidden_dim = hidden_dim
        self.output_dim = output_dim

        # sen encoder
        self.sen_len = max_len
        self.sen_rnn = nn.LSTM(input_size=input_dim,
                               hidden_size=hidden_dim,
                               num_layers=num_layers,
                               dropout=dropout,
                               batch_first=True,
                               bidirectional=True)

        self.output = nn.Linear(2 * self.hidden_dim, output_dim)

    def bi_fetch(self, rnn_outs, seq_lengths, batch_size, max_len):
        rnn_outs = rnn_outs.view(batch_size, max_len, 2, -1)

        # (batch_size, max_len, 1, -1)
        fw_out = torch.index_select(rnn_outs, 2, Variable(torch.LongTensor([0])).cuda())
        fw_out = fw_out.view(batch_size * max_len, -1)
        bw_out = torch.index_select(rnn_outs, 2, Variable(torch.LongTensor([1])).cuda())
        bw_out = bw_out.view(batch_size * max_len, -1)

        batch_range = Variable(torch.LongTensor(range(batch_size))).cuda() * max_len
        batch_zeros = Variable(torch.zeros(batch_size).long()).cuda()

        fw_index = batch_range + seq_lengths.view(batch_size) - 1
        fw_out = torch.index_select(fw_out, 0, fw_index)  # (batch_size, hid)

        bw_index = batch_range + batch_zeros
        bw_out = torch.index_select(bw_out, 0, bw_index)

        outs = torch.cat([fw_out, bw_out], dim=1)
        return outs

    def forward(self, sen_batch, sen_lengths, sen_mask_matrix):
        """
        :param sen_batch: (batch, sen_length), tensor for sentence sequence
        :param sen_lengths:
        :param sen_mask_matrix:
        :return:
        """

        ''' Embedding Layer | Padding | Sequence_length 40'''
        sen_batch = self.emb(sen_batch)

        batch_size = len(sen_batch)

        ''' Bi-LSTM Computation '''
        sen_outs, _ = self.sen_rnn(sen_batch.view(batch_size, -1, self.input_dim))
        sen_rnn = sen_outs.contiguous().view(batch_size, -1, 2 * self.hidden_dim)  # (batch, sen_len, 2*hid)

        ''' Fetch the truly last hidden layer of both sides
        '''
        sentence_batch = self.bi_fetch(sen_rnn, sen_lengths, batch_size, self.sen_len)  # (batch_size, 2*hid)

        representation = sentence_batch
        out = self.output(representation)
        out_prob = F.softmax(out.view(batch_size, -1))

        return out_prob

init()函数中对网络进行初始化,设定词向量维度,前向/后向LSTM中隐层向量的维度,还有要分类的类别数等。

bi_fetch()函数的作用是将 [公式][公式] 拼接起来并返回拼接后的向量。由于使用了batch,所以需要使用句子长度用来定位开始padding时前一个时刻的输出的隐层向量。

forward()函数里进行前向计算,得到各个类别的概率值。

3.2 模型训练

def train(model, training_data, args, optimizer, criterion):
    model.train()

    batch_size = args.batch_size

    sentences, sentences_seqlen, sentences_mask, labels = training_data

    # print batch_size, len(sentences), len(labels)

    assert batch_size == len(sentences) == len(labels)

    ''' Prepare data and prediction'''
    sentences_, sentences_seqlen_, sentences_mask_ = \
        var_batch(args, batch_size, sentences, sentences_seqlen, sentences_mask)
    labels_ = Variable(torch.LongTensor(labels))
    if args.cuda:
        labels_ = labels_.cuda()

    assert len(sentences) == len(labels)

    model.zero_grad()
    probs = model(sentences_, sentences_seqlen_, sentences_mask_)
    loss = criterion(probs.view(len(labels_), -1), labels_)

    loss.backward()
    optimizer.step()

代码中training_data是一个batch的数据,其中包括输入的句子sentences(句子中每个词以词下标表示),输入句子的长度sentences_seqlen,输入的句子对应的情感类别labels。 训练模型前,先清空遗留的梯度值,再根据该batch数据计算出来的梯度进行更新模型。

    model.zero_grad()
    probs = model(sentences_, sentences_seqlen_, sentences_mask_)
    loss = criterion(probs.view(len(labels_), -1), labels_)

    loss.backward()
    optimizer.step()

3.3 模型测试

以下是进行模型测试的代码。

def test(model, dataset, args, data_part="test"):
    """
    :param model:
    :param args:
    :param dataset:
    :param data_part:
    :return:
    """

    tvt_set = dataset[data_part]
    tvt_set = yutils.YDataset(tvt_set["xIndexes"],
                              tvt_set["yLabels"],
                              to_pad=True, max_len=args.sen_max_len)

    test_set = tvt_set
    sentences, sentences_seqlen, sentences_mask, labels = test_set.next_batch(len(test_set))

    assert len(test_set) == len(sentences) == len(labels)

    tic = time.time()

    model.eval()
    ''' Prepare data and prediction'''
    batch_size = len(sentences)
    sentences_, sentences_seqlen_, sentences_mask_ = \
        var_batch(args, batch_size, sentences, sentences_seqlen, sentences_mask)

    probs = model(sentences_, sentences_seqlen_, sentences_mask_)

    _, pred = torch.max(probs, dim=1)

    if args.cuda:
        pred = pred.view(-1).cpu().data.numpy()
    else:
        pred = pred.view(-1).data.numpy()

    tit = time.time() - tic
    print "  Predicting {:d} examples using {:5.4f} seconds".format(len(test_set), tit)

    labels = numpy.asarray(labels)
    ''' log and return prf scores '''
    accuracy = test_prf(pred, labels)

    return accuracy


def cal_prf(pred, right, gold, formation=True, metric_type=""):
    """
    :param pred: predicted labels
    :param right: predicting right labels
    :param gold: gold labels
    :param formation: whether format the float to 6 digits
    :param metric_type:
    :return: prf for each label
    """
    ''' Pred: [0, 2905, 0]  Right: [0, 2083, 0]  Gold: [370, 2083, 452] '''
    num_class = len(pred)
    precision = [0.0] * num_class
    recall = [0.0] * num_class
    f1_score = [0.0] * num_class

    for i in xrange(num_class):
        ''' cal precision for each class: right / predict '''
        precision[i] = 0 if pred[i] == 0 else 1.0 * right[i] / pred[i]

        ''' cal recall for each class: right / gold '''
        recall[i] = 0 if gold[i] == 0 else 1.0 * right[i] / gold[i]

        ''' cal recall for each class: 2 pr / (p+r) '''
        f1_score[i] = 0 if precision[i] == 0 or recall[i] == 0 \
            else 2.0 * (precision[i] * recall[i]) / (precision[i] + recall[i])

        if formation:
            precision[i] = precision[i].__format__(".6f")
            recall[i] = recall[i].__format__(".6f")
            f1_score[i] = f1_score[i].__format__(".6f")

    ''' PRF for each label or PRF for all labels '''
    if metric_type == "macro":
        precision = sum(precision) / len(precision)
        recall = sum(recall) / len(recall)
        f1_score = 2 * precision * recall / (precision + recall) if (precision + recall) > 0 else 0
    elif metric_type == "micro":
        precision = 1.0 * sum(right) / sum(pred) if sum(pred) > 0 else 0
        recall = 1.0 * sum(right) / sum(gold) if sum(recall) > 0 else 0
        f1_score = 2 * precision * recall / (precision + recall) if (precision + recall) > 0 else 0

    return precision, recall, f1_score

15-2 Understanding LSTM Networks

Posted on August 27, 2015

Recurrent Neural Networks

Humans don’t start their thinking from scratch every second. As you read this essay, you understand each word based on your understanding of previous words. You don’t throw everything away and start thinking from scratch again. Your thoughts have persistence.

Traditional neural networks can’t do this, and it seems like a major shortcoming. For example, imagine you want to classify what kind of event is happening at every point in a movie. It’s unclear how a traditional neural network could use its reasoning about previous events in the film to inform later ones.

Recurrent neural networks address this issue. They are networks with loops in them, allowing information to persist.

img

Recurrent Neural Networks have loops.

In the above diagram, a chunk of neural network, AA, looks at some input xtxt and outputs a value htht. A loop allows information to be passed from one step of the network to the next.

These loops make recurrent neural networks seem kind of mysterious. However, if you think a bit more, it turns out that they aren’t all that different than a normal neural network. A recurrent neural network can be thought of as multiple copies of the same network, each passing a message to a successor. Consider what happens if we unroll the loop:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-86YKDE2G-1602121779886)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/img/RNN-unrolled.png)]

An unrolled recurrent neural network.

This chain-like nature reveals that recurrent neural networks are intimately related to sequences and lists. They’re the natural architecture of neural network to use for such data.

And they certainly are used! In the last few years, there have been incredible success applying RNNs to a variety of problems: speech recognition, language modeling, translation, image captioning… The list goes on. I’ll leave discussion of the amazing feats one can achieve with RNNs to Andrej Karpathy’s excellent blog post, The Unreasonable Effectiveness of Recurrent Neural Networks. But they really are pretty amazing.

Essential to these successes is the use of “LSTMs,” a very special kind of recurrent neural network which works, for many tasks, much much better than the standard version. Almost all exciting results based on recurrent neural networks are achieved with them. It’s these LSTMs that this essay will explore.

The Problem of Long-Term Dependencies

One of the appeals of RNNs is the idea that they might be able to connect previous information to the present task, such as using previous video frames might inform the understanding of the present frame. If RNNs could do this, they’d be extremely useful. But can they? It depends.

Sometimes, we only need to look at recent information to perform the present task. For example, consider a language model trying to predict the next word based on the previous ones. If we are trying to predict the last word in “the clouds are in the sky,” we don’t need any further context – it’s pretty obvious the next word is going to be sky. In such cases, where the gap between the relevant information and the place that it’s needed is small, RNNs can learn to use the past information.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MqXvKxil-1602121779887)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/img/RNN-shorttermdepdencies.png)]

But there are also cases where we need more context. Consider trying to predict the last word in the text “I grew up in France… I speak fluent French.” Recent information suggests that the next word is probably the name of a language, but if we want to narrow down which language, we need the context of France, from further back. It’s entirely possible for the gap between the relevant information and the point where it is needed to become very large.

Unfortunately, as that gap grows, RNNs become unable to learn to connect the information.

Neural networks struggle with long term dependencies.

In theory, RNNs are absolutely capable of handling such “long-term dependencies.” A human could carefully pick parameters for them to solve toy problems of this form. Sadly, in practice, RNNs don’t seem to be able to learn them. The problem was explored in depth by [Hochreiter (1991) German] and Bengio, et al. (1994), who found some pretty fundamental reasons why it might be difficult.

Thankfully, LSTMs don’t have this problem!

LSTM Networks

Long Short Term Memory networks – usually just called “LSTMs” – are a special kind of RNN, capable of learning long-term dependencies. They were introduced by Hochreiter & Schmidhuber (1997), and were refined and popularized by many people in following work.1 They work tremendously well on a large variety of problems, and are now widely used.

LSTMs are explicitly designed to avoid the long-term dependency problem. Remembering information for long periods of time is practically their default behavior, not something they struggle to learn!

All recurrent neural networks have the form of a chain of repeating modules of neural network. In standard RNNs, this repeating module will have a very simple structure, such as a single tanh layer.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8s1wDhP-1602121779888)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/img/LSTM3-SimpleRNN.png)]

The repeating module in a standard RNN contains a single layer.

LSTMs also have this chain like structure, but the repeating module has a different structure. Instead of having a single neural network layer, there are four, interacting in a very special way.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8EHIX9Bu-1602121779889)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/img/LSTM3-chain.png)]

The repeating module in an LSTM contains four interacting layers.

Don’t worry about the details of what’s going on. We’ll walk through the LSTM diagram step by step later. For now, let’s just try to get comfortable with the notation we’ll be using.

img

In the above diagram, each line carries an entire vector, from the output of one node to the inputs of others. The pink circles represent pointwise operations, like vector addition, while the yellow boxes are learned neural network layers. Lines merging denote concatenation, while a line forking denote its content being copied and the copies going to different locations.

The Core Idea Behind LSTMs

The key to LSTMs is the cell state, the horizontal line running through the top of the diagram.

The cell state is kind of like a conveyor belt. It runs straight down the entire chain, with only some minor linear interactions. It’s very easy for information to just flow along it unchanged.

img

The LSTM does have the ability to remove or add information to the cell state, carefully regulated by structures called gates.

Gates are a way to optionally let information through. They are composed out of a sigmoid neural net layer and a pointwise multiplication operation.

img

The sigmoid layer outputs numbers between zero and one, describing how much of each component should be let through. A value of zero means “let nothing through,” while a value of one means “let everything through!”

An LSTM has three of these gates, to protect and control the cell state.

Step-by-Step LSTM Walk Through

The first step in our LSTM is to decide what information we’re going to throw away from the cell state. This decision is made by a sigmoid layer called the “forget gate layer.” It looks at ht−1ht−1 and xtxt, and outputs a number between 00 and 11 for each number in the cell state Ct−1Ct−1. A 11 represents “completely keep this” while a 00 represents “completely get rid of this.”

Let’s go back to our example of a language model trying to predict the next word based on all the previous ones. In such a problem, the cell state might include the gender of the present subject, so that the correct pronouns can be used. When we see a new subject, we want to forget the gender of the old subject.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJISjqlS-1602121779892)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/img/LSTM3-focus-f.png)]

The next step is to decide what new information we’re going to store in the cell state. This has two parts. First, a sigmoid layer called the “input gate layer” decides which values we’ll update. Next, a tanh layer creates a vector of new candidate values, CtCt, that could be added to the state. In the next step, we’ll combine these two to create an update to the state.

In the example of our language model, we’d want to add the gender of the new subject to the cell state, to replace the old one we’re forgetting.

img

It’s now time to update the old cell state, Ct−1Ct−1, into the new cell state CtCt. The previous steps already decided what to do, we just need to actually do it.

We multiply the old state by ftft, forgetting the things we decided to forget earlier. Then we add it∗Ctit∗Ct. This is the new candidate values, scaled by how much we decided to update each state value.

In the case of the language model, this is where we’d actually drop the information about the old subject’s gender and add the new information, as we decided in the previous steps.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M1Lp5nFQ-1602121779892)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/img/LSTM3-focus-C.png)]

Finally, we need to decide what we’re going to output. This output will be based on our cell state, but will be a filtered version. First, we run a sigmoid layer which decides what parts of the cell state we’re going to output. Then, we put the cell state through tanhtanh (to push the values to be between −1−1 and 11) and multiply it by the output of the sigmoid gate, so that we only output the parts we decided to.

For the language model example, since it just saw a subject, it might want to output information relevant to a verb, in case that’s what is coming next. For example, it might output whether the subject is singular or plural, so that we know what form a verb should be conjugated into if that’s what follows next.

img

Variants on Long Short Term Memory

What I’ve described so far is a pretty normal LSTM. But not all LSTMs are the same as the above. In fact, it seems like almost every paper involving LSTMs uses a slightly different version. The differences are minor, but it’s worth mentioning some of them.

One popular LSTM variant, introduced by Gers & Schmidhuber (2000), is adding “peephole connections.” This means that we let the gate layers look at the cell state.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9Cco9Ta-1602121779893)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/img/LSTM3-var-peepholes.png)]

The above diagram adds peepholes to all the gates, but many papers will give some peepholes and not others.

Another variation is to use coupled forget and input gates. Instead of separately deciding what to forget and what we should add new information to, we make those decisions together. We only forget when we’re going to input something in its place. We only input new values to the state when we forget something older.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vWRDTbCP-1602121779894)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/img/LSTM3-var-tied.png)]

A slightly more dramatic variation on the LSTM is the Gated Recurrent Unit, or GRU, introduced by Cho, et al. (2014). It combines the forget and input gates into a single “update gate.” It also merges the cell state and hidden state, and makes some other changes. The resulting model is simpler than standard LSTM models, and has been growing increasingly popular.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lsKoLO8w-1602121779894)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/img/LSTM3-var-GRU.png)]

These are only a few of the most notable LSTM variants. There are lots of others, like Depth Gated RNNs by Yao, et al. (2015). There’s also some completely different approach to tackling long-term dependencies, like Clockwork RNNs by Koutnik, et al. (2014).

Which of these variants is best? Do the differences matter? Greff, et al. (2015) do a nice comparison of popular variants, finding that they’re all about the same. Jozefowicz, et al. (2015)tested more than ten thousand RNN architectures, finding some that worked better than LSTMs on certain tasks.

Conclusion

Earlier, I mentioned the remarkable results people are achieving with RNNs. Essentially all of these are achieved using LSTMs. They really work a lot better for most tasks!

Written down as a set of equations, LSTMs look pretty intimidating. Hopefully, walking through them step by step in this essay has made them a bit more approachable.

LSTMs were a big step in what we can accomplish with RNNs. It’s natural to wonder: is there another big step? A common opinion among researchers is: “Yes! There is a next step and it’s attention!” The idea is to let every step of an RNN pick information to look at from some larger collection of information. For example, if you are using an RNN to create a caption describing an image, it might pick a part of the image to look at for every word it outputs. In fact, Xu, et al.(2015) do exactly this – it might be a fun starting point if you want to explore attention! There’s been a number of really exciting results using attention, and it seems like a lot more are around the corner…

Attention isn’t the only exciting thread in RNN research. For example, Grid LSTMs by Kalchbrenner, et al. (2015) seem extremely promising. Work using RNNs in generative models – such as Gregor, et al. (2015), Chung, et al. (2015), or Bayer & Osendorfer (2015) – also seems very interesting. The last few years have been an exciting time for recurrent neural networks, and the coming ones promise to only be more so!

Acknowledgments

I’m grateful to a number of people for helping me better understand LSTMs, commenting on the visualizations, and providing feedback on this post.

I’m very grateful to my colleagues at Google for their helpful feedback, especially Oriol Vinyals, Greg Corrado, Jon Shlens, Luke Vilnis, and Ilya Sutskever. I’m also thankful to many other friends and colleagues for taking the time to help me, including Dario Amodei, and Jacob Steinhardt. I’m especially thankful to Kyunghyun Cho for extremely thoughtful correspondence about my diagrams.

Before this post, I practiced explaining LSTMs during two seminar series I taught on neural networks. Thanks to everyone who participated in those for their patience with me, and for their feedback.


  1. In addition to the original authors, a lot of people contributed to the modern LSTM. A non-comprehensive list is: Felix Gers, Fred Cummins, Santiago Fernandez, Justin Bayer, Daan Wierstra, Julian Togelius, Faustino Gomez, Matteo Gagliolo, and Alex Graves.

16. Attention注意力机制+Transformer详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G5zCTbBs-1602121779895)(https://pic1.zhimg.com/v2-d289fa31ebfd4814a94b16f0de0920d2_1200x500.jpg)]

一、Attention机制剖析

1、为什么要引入Attention机制?

根据通用近似定理,前馈网络和循环网络都有很强的能力。但为什么还要引入注意力机制呢?

  • 计算能力的限制:当要记住很多“信息“,模型就要变得更复杂,然而目前计算能力依然是限制神经网络发展的瓶颈。
  • 优化算法的限制:虽然局部连接、权重共享以及pooling等优化操作可以让神经网络变得简单一些,有效缓解模型复杂度和表达能力之间的矛盾;但是,如循环神经网络中的长距离以来问题,信息“记忆”能力并不高。

可以借助人脑处理信息过载的方式,例如Attention机制可以提高神经网络处理信息的能力。

2、Attention机制有哪些?(怎么分类?)

当用神经网络来处理大量的输入信息时,也可以借鉴人脑的注意力机制,只 选择一些关键的信息输入进行处理,来提高神经网络的效率。按照认知神经学中的注意力,可以总体上分为两类:

  • 聚焦式(focus)注意力:自上而下的有意识的注意力,主动注意——是指有预定目的、依赖任务的、主动有意识地聚焦于某一对象的注意力;
  • 显著性(saliency-based)注意力:自下而上的有意识的注意力,被动注意——基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关;可以将max-pooling和门控(gating)机制来近似地看作是自下而上的基于显著性的注意力机制。

在人工神经网络中,注意力机制一般就特指聚焦式注意力。

3、Attention机制的计算流程是怎样的?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j65DkAMx-1602121779895)(https://pic1.zhimg.com/80/v2-54fe529ded98721f35277a5bfa79febc_720w.jpg)]Attention机制的实质:寻址(addressing)

Attention机制的实质其实就是一个寻址(addressing)的过程,如上图所示:给定一个和任务相关的查询Query向量 q,通过计算与Key的注意力分布并附加在Value上,从而计算Attention Value,这个过程实际上是Attention机制缓解神经网络模型复杂度的体现:不需要将所有的N个输入信息都输入到神经网络进行计算,只需要从X中选择一些和任务相关的信息输入给神经网络。

*注意力机制可以分为三步:一是信息输入;二是计算注意力分布α;三是根据注意力分布α 来计算输入信息的加权平均。*

step1-信息输入:用X = [x1, · · · , xN ]表示N 个输入信息;

step2-注意力分布计算:令Key=Value=X,则可以给出注意力分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JOGmzDcG-1602121779895)(https://www.zhihu.com/equation?tex=%5Calpha_i%3Dsoftmax%28s%28key_i%2Cq%29%29%3Dsoftmax%28s%28X_i%2Cq%29%29)]

我们将 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m3qYMzUx-1602121779896)(https://www.zhihu.com/equation?tex=%5Calpha_i)] 称之为注意力分布(概率分布), [公式] 为注意力打分机制,有几种打分机制:

img

step3-信息加权平均:注意力分布 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aycPcZT0-1602121779897)(https://www.zhihu.com/equation?tex=%5Calpha_i)] 可以解释为在上下文查询q时,第i个信息受关注的程度,采用一种“软性”的信息选择机制对输入信息X进行编码为:

[公式]

这种编码方式为软性注意力机制(soft Attention),软性注意力机制有两种:普通模式(Key=Value=X)和键值对模式(Key!=Value)。

img软性注意力机制(soft Attention)

4、Attention机制的变种有哪些?

与普通的Attention机制(上图左)相比,Attention机制有哪些变种呢?

  • **变种1-硬性注意力:**之前提到的注意力是软性注意力,其选择的信息是所有输入信息在注意力 分布下的期望。还有一种注意力是只关注到某一个位置上的信息,叫做硬性注意力(hard attention)。硬性注意力有两种实现方式:(1)一种是选取最高概率的输入信息;(2)另一种硬性注意力可以通过在注意力分布式上随机采样的方式实现。硬性注意力模型的缺点:

硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息。因此最终的损失函数与注意力分布之间的函数关系不可导,因此无法使用在反向传播算法进行训练。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。硬性注意力需要通过强化学习来进行训练。——《神经网络与深度学习》

  • **变种2-键值对注意力:**即上图右边的键值对模式,此时Key!=Value,注意力函数变为:

img

  • **变种3-多头注意力:**多头注意力(multi-head attention)是利用多个查询Q = [q1, · · · , qM],来平行地计算从输入信息中选取多个信息。每个注意力关注输入信息的不同部分,然后再进行拼接:

img

5、一种强大的Attention机制:为什么自注意力模型(self-Attention model)在长距离序列中如此强大?

(1)卷积或循环神经网络难道不能处理长距离序列吗?

当使用神经网络来处理一个变长的向量序列时,我们通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列,如图所示:

img基于卷积网络和循环网络的变长序列编码

从上图可以看出,无论卷积还是循环神经网络其实都是对变长序列的一种“局部编码”:卷积神经网络显然是基于N-gram的局部编码;而对于循环神经网络,由于梯度消失等问题也只能建立短距离依赖。

(2)要解决这种短距离依赖的“局部编码”问题,从而对输入序列建立长距离依赖关系,有哪些办法呢?

如果要建立输入序列之间的长距离依赖关系,可以使用以下两种方法:一 种方法是增加网络的层数,通过一个深层网络来获取远距离的信息交互,另一种方法是使用全连接网络。 ——《神经网络与深度学习》

img全连接模型和自注意力模型:实线表示为可学习的权重,虚线表示动态生成的权重。

由上图可以看出,全连接网络虽然是一种非常直接的建模远距离依赖的模型, 但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。

这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(self-attention model)。由于自注意力模型的权重是动态生成的,因此可以处理变长的信息序列。

总体来说,为什么自注意力模型(self-Attention model)如此强大利用注意力机制来“动态”地生成不同连接的权重,从而处理变长的信息序列。

(3)自注意力模型(self-Attention model)具体的计算流程是怎样的呢?

同样,给出信息输入:用X = [x1, · · · , xN ]表示N 个输入信息;通过线性变换得到为查询向量序列,键向量序列和值向量序列:

img

上面的公式可以看出,self-Attention中的Q是对自身(self)输入的变换,而在传统的Attention中,Q来自于外部。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cDwV9I8W-1602121779901)(https://pic4.zhimg.com/80/v2-fcc2df696966a9c6700d1476690cff9f_720w.jpg)]self-Attention计算过程剖解(来自《细讲 | Attention Is All You Need 》)

注意力计算公式为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPjHeaAx-1602121779901)(https://pic2.zhimg.com/80/v2-72093f153e59cfdc851e2ac1fbf5c03d_720w.jpg)]

自注意力模型(self-Attention model)中,通常使用缩放点积来作为注意力打分函数,输出向量序列可以写为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KEQqhLEf-1602121779902)(https://pic2.zhimg.com/80/v2-2f76af60c24ba75e37f2f5df8edfdb71_720w.jpg)]

二、Transformer(Attention Is All You Need)详解

从Transformer这篇论文的题目可以看出,Transformer的核心就是Attention,这也就是为什么本文会在剖析玩Attention机制之后会引出Transformer,如果对上面的Attention机制特别是自注意力模型(self-Attention model)理解后,Transformer就很容易理解了。

1、Transformer的整体架构是怎样的?由哪些部分组成?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrNjRHe6-1602121779902)(https://pic1.zhimg.com/80/v2-7f8b460cd617fedc822064c4230302b0_720w.jpg)]Transformer模型架构

Transformer其实这就是一个Seq2Seq模型,左边一个encoder把输入读进去,右边一个decoder得到输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4B5E8rJw-1602121779902)(https://pic4.zhimg.com/80/v2-846cf91009c44c6e479bada42bfc437f_720w.jpg)]Seq2Seq模型

Transformer=Transformer Encoder+Transformer Decoder

(1)Transformer Encoder(N=6层,每层包括2个sub-layers):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8AAJ6pSG-1602121779903)(https://pic3.zhimg.com/80/v2-3b97d37951078856097069778293230a_720w.jpg)]Transformer Encoder

  • sub-layer-1multi-head self-attention mechanism,用来进行self-attention。
  • sub-layer-2Position-wise Feed-forward Networks,简单的全连接网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出(输入输出层的维度都为512,中间层为2048):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rhZeU3Xs-1602121779903)(https://pic3.zhimg.com/80/v2-5236351e3efd93d567ac1fceea7716ee_720w.png)]

每个sub-layer都使用了残差网络: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7tKVE1JP-1602121779904)(https://www.zhihu.com/equation?tex=LayerNorm%28X%2Bsublayer%28X%29%29)]

(2)Transformer Decoder(N=6层,每层包括3个sub-layers):

imgTransformer Decoder

  • sub-layer-1Masked multi-head self-attention mechanism,用来进行self-attention,与Encoder不同:由于是序列生成过程,所以在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask
  • sub-layer-2Position-wise Feed-forward Networks,同Encoder。
  • sub-layer-3Encoder-Decoder attention计算
2、Transformer Encoder 与 Transformer Decoder 有哪些不同?

(1)multi-head self-attention mechanism不同,Encoder中不需要使用Masked,而Decoder中需要使用Masked;

(2)Decoder中多了一层Encoder-Decoder attention,这与 self-attention mechanism不同。

3、Encoder-Decoder attention 与self-attention mechanism有哪些不同?

它们都是用了 multi-head计算,不过Encoder-Decoder attention采用传统的attention机制,其中的Query是self-attention mechanism已经计算出的上一时间i处的编码值,Key和Value都是Encoder的输出,这与self-attention mechanism不同。代码中具体体现:

 ## Multihead Attention ( self-attention)
            self.dec = multihead_attention(queries=self.dec,
                                           keys=self.dec,
                                           num_units=hp.hidden_units,
                                           num_heads=hp.num_heads,
                                           dropout_rate=hp.dropout_rate,
                                           is_training=is_training,
                                           causality=True,
                                           scope="self_attention")

## Multihead Attention ( Encoder-Decoder attention)
            self.dec = multihead_attention(queries=self.dec,
                                           keys=self.enc,
                                           num_units=hp.hidden_units,
                                           num_heads=hp.num_heads,
                                           dropout_rate=hp.dropout_rate,
                                           is_training=is_training,
                                           causality=False,
                                           scope="vanilla_attention")
4、multi-head self-attention mechanism具体的计算过程是怎样的?

img

multi-head self-attention mechanism计算过程

Transformer中的Attention机制由Scaled Dot-Product AttentionMulti-Head Attention组成,上图给出了整体流程。下面具体介绍各个环节:

  • Expand:实际上是经过线性变换,生成Q、K、V三个向量;
  • Split heads: 进行分头操作,在原文中将原来每个位置512维度分成8个head,每个head维度变为64;
  • Self Attention:对每个head进行Self Attention,具体过程和第一部分介绍的一致;
  • Concat heads:对进行完Self Attention每个head进行拼接;

上述过程公式为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gszN27ZU-1602121779905)(https://pic3.zhimg.com/80/v2-c7100e268bcefaa7ff0a1344acc15e7e_720w.jpg)]

5、Transformer在GPT和Bert等词向量预训练模型中具体是怎么应用的?有什么变化?
  • GPT中训练的是单向语言模型,其实就是直接应用Transformer Decoder
  • Bert中训练的是双向语言模型,应用了Transformer Encoder部分,不过在Encoder基础上还做了Masked操作

BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。双向 Transformer 通常被称为“Transformer encoder”,而左侧上下文被称为“Transformer decoder”,decoder是不能获要预测的信息的。

Reference

  1. 《神经网络与深度学习》
  2. Attention Is All You Need
  3. 谷歌BERT解析----2小时上手最强NLP训练模型
  4. 细讲 | Attention Is All You Need
  5. 深度学习中的注意力模型(2017版)

17. 主题模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dvSklgJ4-1602121779906)(https://pic1.zhimg.com/v2-055d703ac6adb2e103c2632d03dabe8b_1200x500.jpg)]

本文对nlp中一个极为重要的模型——主题模型LDA(Latent Dirichlet Allocation)从宏观理解与数学解释两个维度进行介绍。

1、LDA的宏观理解

LDA可以分为以下5个步骤:

  • 一个函数:gamma函数。
  • 四个分布:二项分布、多项分布、beta分布、Dirichlet分布。
  • 一个概念和一个理念:共轭先验和贝叶斯框架。
  • 两个模型:pLSA、LDA。
  • 一个采样:Gibbs采样

关于LDA有两种含义,一种是线性判别分析(Linear Discriminant Analysis),一种是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA),本文讲后者。

按照wiki上的介绍,LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,是一种主题模型,它可以将文档集 中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题(分布)出来后,便可以根据主题(分布)进行主题聚类或文本分类。同时,它是一种典型的词袋模型,即一篇文档是由一组词构成,词与词之间没有先后顺序的关系。此外,一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。

人类是怎么生成文档的呢?首先先列出几个主题,然后以一定的概率选择主题,以一定的概率选择这个主题包含的词汇,最终组合成一篇文章。如下图所示(其中不同颜色的词语分别对应上图中不同主题下的词)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LMO4WeHl-1602121779907)(https://pic4.zhimg.com/80/v2-a4fa1c493fa7b91c9d7c496cdfb12e0b_720w.jpg)]

那么LDA就是跟这个反过来:根据给定的一篇文档,反推其主题分布。

在LDA模型中,一篇文档生成的方式如下:

  • 从狄利克雷分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jno5QS71-1602121779907)(https://pic4.zhimg.com/80/v2-389a9983ea24ad0b3af0559c2aca381b_720w.jpg)]

中取样生成文档 i 的主题分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqaF84QN-1602121779907)(https://pic2.zhimg.com/80/v2-295772d913f4fb6d8bba602ad6c7a50d_720w.jpg)]

  • 从主题的多项式分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ObSLXRnr-1602121779908)(https://pic2.zhimg.com/80/v2-295772d913f4fb6d8bba602ad6c7a50d_720w.jpg)]

中取样生成文档i第 j 个词的主题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5m5bSEXT-1602121779908)(https://pic2.zhimg.com/80/v2-0c0da5282e2d5aa119441bd008f51831_720w.jpg)]

  • 从狄利克雷分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VV8B1D9r-1602121779908)(https://pic3.zhimg.com/80/v2-76d0eb69ba026a58bbe3edd275fee712_720w.jpg)]

中取样生成主题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmhZXpvl-1602121779909)(https://pic2.zhimg.com/80/v2-0c0da5282e2d5aa119441bd008f51831_720w.jpg)]

对应的词语分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gIPiTX7F-1602121779909)(https://pic2.zhimg.com/80/v2-15578abdfc59bf9ee34fa1637565df65_720w.jpg)]

  • 从词语的多项式分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cb1Lhd4a-1602121779909)(https://pic2.zhimg.com/80/v2-15578abdfc59bf9ee34fa1637565df65_720w.jpg)]

中采样最终生成词语

img

其中,类似Beta分布是二项式分布的共轭先验概率分布,而狄利克雷分布(Dirichlet分布)是多项式分布的共轭先验概率分布。此外,LDA的图模型结构如下图所示(类似贝叶斯网络结构):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QpWJ16Q9-1602121779910)(https://pic2.zhimg.com/80/v2-fd5b506218cefe3128a0f5a7bcacc475_720w.jpg)]

1.1 5个分布的理解

先解释一下以上出现的概念。

  1. 二项分布(Binomial distribution)
    二项分布是从伯努利分布推进的。伯努利分布,又称两点分布或0-1分布,是一个离散型的随机分布,其中的随机变量只有两类取值,非正即负{+,-}。而二项分布即重复n次的伯努利试验,记为

img

。简言之,只做一次实验,是伯努利分布,重复做了n次,是二项分布。

  1. 多项分布
    是二项分布扩展到多维的情况。多项分布是指单次试验中的随机变量的取值不再是0-1的,而是有多种离散值可能(1,2,3…,k)。比如投掷6个面的骰子实验,N次实验结果服从K=6的多项分布。其中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wm16xKl5-1602121779912)(https://pic2.zhimg.com/80/v2-1ea84b310181b5bb2bca5046863c28d9_720w.jpg)]

  1. 共轭先验分布
    贝叶斯统计中,如果后验分布先验分布属于同类,则先验分布与后验分布被称为共轭分布,而先验分布被称为似然函数的共轭先验
  2. Beta分布
    二项分布的共轭先验分布。给定参数

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-elcpmYdy-1602121779912)(https://pic3.zhimg.com/80/v2-dc9a5f1e674945628de19bd19f2a1662_720w.jpg)]

,取值范围为[0,1]的随机变量 x 的概率密度函数:

img

其中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SDMPmesh-1602121779913)(https://pic1.zhimg.com/80/v2-51cd38d633435d8d047e8c7e686f72c0_720w.jpg)]

img

注:这便是所谓的gamma函数,下文会具体阐述。

  1. 狄利克雷分布
    是beta分布在高维度上的推广。Dirichlet分布的的密度函数形式跟beta分布的密度函数如出一辙:

img

其中

img

至此,我们可以看到二项分布和多项分布很相似,Beta分布和Dirichlet 分布很相似。

如果想要深究其原理可以参考:通俗理解LDA主题模型,也可以先往下走,最后在回过头来看详细的公式,就更能明白了。

总之,可以得到以下几点信息。

  • beta分布是二项式分布的共轭先验概率分布:对于非负实数

img

img

,我们有如下关系:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jf2hkQG1-1602121779917)(https://pic1.zhimg.com/80/v2-135f32dd82d55c7117dd77e9501a935c_720w.jpg)]

其中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Py6SFvOG-1602121779917)(https://pic3.zhimg.com/80/v2-84ee88adb7096681aae93c0b7a48802a_720w.jpg)]

对应的是二项分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iB77DIfj-1602121779917)(https://pic4.zhimg.com/80/v2-d14cdc70255653e674a4d71cb862bce7_720w.jpg)]

的记数。针对于这种观测到的数据符合二项分布,参数的先验分布和后验分布都是Beta分布的情况,就是Beta-Binomial 共轭。”

  • 狄利克雷分布(Dirichlet分布)是多项式分布的共轭先验概率分布,一般表达式如下:

img

针对于这种观测到的数据符合多项分布,参数的先验分布和后验分布都是Dirichlet 分布的情况,就是 Dirichlet-Multinomial 共轭。 ”

  • 贝叶斯派思考问题的固定模式:
    先验分布

img

+ 样本信息

img

= 后验分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RmBoBx2W-1602121779919)(https://pic3.zhimg.com/80/v2-b749a935d8ea3434a93c50fef251480e_720w.jpg)]

1.2 3个基础模型的理解

在讲LDA模型之前,再循序渐进理解基础模型:Unigram model、mixture of unigrams model,以及跟LDA最为接近的pLSA模型。为了方便描述,首先定义一些变量:

img

表示词,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z2bUszls-1602121779920)(https://pic3.zhimg.com/80/v2-baeac1d9d7cf057a52a3fbff326ac3de_720w.jpg)]

示所有单词的个数(固定值)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D0BZWhEj-1602121779920)(https://pic1.zhimg.com/80/v2-f5cc9e47883d3f86d5795d82e36323c4_720w.jpg)]

表示主题,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpx67m8i-1602121779920)(https://pic1.zhimg.com/80/v2-65a9120364a862f3e7abfc1c106738bc_720w.jpg)]

主题的个数(预先给定,固定值)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zk4M47tR-1602121779922)(https://pic4.zhimg.com/80/v2-dd6a8eac39004fd988a9dc22baa1055f_720w.jpg)]

表示语料库,其中的M是语料库中的文档数(固定值)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UpRDGQVz-1602121779922)(https://pic1.zhimg.com/80/v2-4bdfc6e14e6eaaa6813c4cc802ea4a54_720w.jpg)]

表示文档,其中的N表示一个文档中的词数(随机变量)。

  1. Unigram model
    对于文档

img

,用

img

表示词

img

的先验概率,生成文档w的概率为:

img

  1. Mixture of unigrams model
    该模型的生成过程是:给某个文档先选择一个主题z,再根据该主题生成文档,该文档中的所有词都来自一个主题。假设主题有

img

,生成文档w的概率为:

img

  1. PLSA模型
    理解了pLSA模型后,到LDA模型也就一步之遥——给pLSA加上贝叶斯框架,便是LDA。
    在上面的Mixture of unigrams model中,我们假定一篇文档只有一个主题生成,可实际中,一篇文章往往有多个主题,只是这多个主题各自在文档中出现的概率大小不一样。比如介绍一个国家的文档中,往往会分别从教育、经济、交通等多个主题进行介绍。那么在pLSA中,文档是怎样被生成的呢?
    假定你一共有K个可选的主题,有V个可选的词,咱们来玩一个扔骰子的游戏。
    **一、**假设你每写一篇文档会制作一颗K面的“文档-主题”骰子(扔此骰子能得到K个主题中的任意一个),和K个V面的“主题-词项” 骰子(每个骰子对应一个主题,K个骰子对应之前的K个主题,且骰子的每一面对应要选择的词项,V个面对应着V个可选的词)。
    比如可令K=3,即制作1个含有3个主题的“文档-主题”骰子,这3个主题可以是:教育、经济、交通。然后令V = 3,制作3个有着3面的“主题-词项”骰子,其中,教育主题骰子的3个面上的词可以是:大学、老师、课程,经济主题骰子的3个面上的词可以是:市场、企业、金融,交通主题骰子的3个面上的词可以是:高铁、汽车、飞机。

img

二、每写一个词,先扔该“文档-主题”骰子选择主题,得到主题的结果后,使用和主题结果对应的那颗“主题-词项”骰子,扔该骰子选择要写的词。
先扔“文档-主题”的骰子,假设(以一定的概率)得到的主题是教育,所以下一步便是扔教育主题筛子,(以一定的概率)得到教育主题筛子对应的某个词:大学。
上面这个投骰子产生词的过程简化下便是:
“先以一定的概率选取主题,再以一定的概率选取词”。

**三、**最后,你不停的重复扔“文档-主题”骰子和”主题-词项“骰子,重复N次(产生N个词),完成一篇文档,重复这产生一篇文档的方法M次,则完成M篇文档。
上述过程抽象出来即是PLSA的文档生成模型。在这个过程中,我们并未关注词和词之间的出现顺序,所以pLSA是一种词袋方法。生成文档的整个过程便是选定文档生成主题,确定主题生成词。

反过来,既然文档已经产生,那么如何根据已经产生好的文档反推其主题呢?这个利用看到的文档推断其隐藏的主题(分布)的过程(其实也就是产生文档的逆过程),便是主题建模的目的:自动地发现文档集中的主题(分布)。

文档d和词w是我们得到的样本,可观测得到,所以对于任意一篇文档,其

img

是已知的。从而可以根据大量已知的文档-词项信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mXCziXcf-1602121779927)(https://pic4.zhimg.com/80/v2-9abfe6ac0f502f2c453edd44ee42f75f_720w.jpg)]

,训练出文档-主题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-emtWUZ1h-1602121779928)(https://pic3.zhimg.com/80/v2-d9b214b2d2b7bd56d2f5230793b13546_720w.jpg)]

和主题-词项

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Ncqiy49-1602121779928)(https://pic2.zhimg.com/80/v2-c81d0dceffc09337d510eaedfa2bf739_720w.jpg)]

,如下公式所示:

img

故得到文档中每个词的生成概率为:

img

由于

img

可事先计算求出,而

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tCx9kEm8-1602121779931)(https://pic3.zhimg.com/80/v2-d9b214b2d2b7bd56d2f5230793b13546_720w.jpg)]

未知,所以

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JcgBHHlN-1602121779931)(https://pic2.zhimg.com/80/v2-4bdc0487d0fbf510bf71e2db691966d5_720w.jpg)]

)就是我们要估计的参数(值),通俗点说,就是要最大化这个θ。
用什么方法进行估计呢,常用的参数估计方法有极大似然估计MLE、最大后验证估计MAP、贝叶斯估计等等。因为该待估计的参数中含有隐变量z,所以我们可以考虑EM算法。详细的EM算法可以参考之前写过的 EM算法 章节。

1.3 LDA模型

事实上,理解了pLSA模型,也就差不多快理解了LDA模型,因为LDA就是在pLSA的基础上加层贝叶斯框架,即LDA就是pLSA的贝叶斯版本(正因为LDA被贝叶斯化了,所以才需要考虑历史先验知识,才加的两个先验参数)。

下面,咱们对比下本文开头所述的LDA模型中一篇文档生成的方式是怎样的:

  • 按照先验概率

img

选择一篇文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eyEEi6WP-1602121779932)(https://pic1.zhimg.com/80/v2-3035989541786a9b1446ac7232d7029c_720w.jpg)]

  • 从狄利克雷分布(即Dirichlet分布)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q6jJm5OA-1602121779933)(https://pic4.zhimg.com/80/v2-389a9983ea24ad0b3af0559c2aca381b_720w.jpg)]

中取样生成文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vjc6KRcR-1602121779933)(https://pic1.zhimg.com/80/v2-3035989541786a9b1446ac7232d7029c_720w.jpg)]

的主题分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Foad6zBF-1602121779934)(https://pic2.zhimg.com/80/v2-295772d913f4fb6d8bba602ad6c7a50d_720w.jpg)]

,换言之,主题分布

img

由超参数为

img

的Dirichlet分布生成。

  • 从主题的多项式分布

img

中取样生成文档

img

第 j 个词的主题

img

  • 从狄利克雷分布(即Dirichlet分布)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWIVcE2d-1602121779937)(https://pic3.zhimg.com/80/v2-76d0eb69ba026a58bbe3edd275fee712_720w.jpg)]

中取样生成主题

img

对应的词语分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gOFA9fsR-1602121779939)(https://pic2.zhimg.com/80/v2-15578abdfc59bf9ee34fa1637565df65_720w.jpg)]

,换言之,词语分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4oFx8djU-1602121779940)(https://pic2.zhimg.com/80/v2-15578abdfc59bf9ee34fa1637565df65_720w.jpg)]

由参数为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pavy05do-1602121779940)(https://pic3.zhimg.com/80/v2-76d0eb69ba026a58bbe3edd275fee712_720w.jpg)]

的Dirichlet分布生成。

  • 从词语的多项式分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7F7isB7h-1602121779940)(https://pic2.zhimg.com/80/v2-15578abdfc59bf9ee34fa1637565df65_720w.jpg)]

中采样最终生成词语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TML65lEJ-1602121779941)(https://pic3.zhimg.com/80/v2-788821b30557ab3dadfc4f65ce202ff2_720w.jpg)]

LDA中,选主题和选词依然都是两个随机的过程,依然可能是先从主题分布{教育:0.5,经济:0.3,交通:0.2}中抽取出主题:教育,然后再从该主题对应的词分布{大学:0.5,老师:0.3,课程:0.2}中抽取出词:大学。

那PLSA跟LDA的区别在于什么地方呢?区别就在于:

PLSA中,主题分布和词分布是唯一确定的,能明确的指出主题分布可能就是{教育:0.5,经济:0.3,交通:0.2},词分布可能就是{大学:0.5,老师:0.3,课程:0.2}。 但在LDA中,主题分布和词分布不再唯一确定不变,即无法确切给出。例如主题分布可能是{教育:0.5,经济:0.3,交通:0.2},也可能是{教育:0.6,经济:0.2,交通:0.2},到底是哪个我们不再确定(即不知道),因为它是随机的可变化的。但再怎么变化,也依然服从一定的分布,即主题分布跟词分布由Dirichlet先验随机确定。正因为LDA是PLSA的贝叶斯版本,所以主题分布跟词分布本身由先验知识随机给定。

换言之,LDA在pLSA的基础上给这两参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yu385XUj-1602121779942)(https://pic4.zhimg.com/80/v2-763dfa220e6add2485d73117fca16a33_720w.jpg)]

)加了两个先验分布的参数(贝叶斯化):一个主题分布的先验分布Dirichlet分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIIxnK9R-1602121779942)(https://pic4.zhimg.com/80/v2-389a9983ea24ad0b3af0559c2aca381b_720w.jpg)]

,和一个词语分布的先验分布Dirichlet分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AKpfhD73-1602121779943)(https://pic3.zhimg.com/80/v2-76d0eb69ba026a58bbe3edd275fee712_720w.jpg)]

综上,LDA真的只是pLSA的贝叶斯版本,文档生成后,两者都要根据文档去推断其主题分布和词语分布(即两者本质都是为了估计给定文档生成主题,给定主题生成词语的概率),只是用的参数推断方法不同,在pLSA中用极大似然估计的思想去推断两未知的固定参数,而LDA则把这两参数弄成随机变量,且加入dirichlet先验。

所以,pLSA跟LDA的本质区别就在于它们去估计未知参数所采用的思想不同,前者用的是频率派思想,后者用的是贝叶斯派思想。

LDA参数估计:Gibbs采样,详见文末的参考文献。

2. 怎么确定LDA的topic个数?

  1. 基于经验 主观判断、不断调试、操作性强、最为常用。
  2. 基于困惑度(主要是比较两个模型之间的好坏)。
  3. 使用Log-边际似然函数的方法,这种方法也挺常用的。
  4. 非参数方法:Teh提出的基于狄利克雷过程的HDP法。
  5. 基于主题之间的相似度:计算主题向量之间的余弦距离,KL距离等。

3. 如何用主题模型解决推荐系统中的冷启动问题?

推荐系统中的冷启动问题是指在没有大量用户数据的情况下如何给用户进行个性化推荐,目的是最优化点击率、转化率或用户 体验(用户停留时间、留存率等)。冷启动问题一般分为用户冷启动、物品冷启动和系统冷启动三大类。

  • 用户冷启动是指对一个之前没有行为或行为极少的新用户进行推荐;
  • 物品冷启动是指为一个新上市的商品或电影(这时没有与之相关的 评分或用户行为数据)寻找到具有潜在兴趣的用户;
  • 系统冷启动是指如何为一个 新开发的网站设计个性化推荐系统。

解决冷启动问题的方法一般是基于内容的推荐。以Hulu的场景为例,对于用 户冷启动来说,我们希望根据用户的注册信息(如:年龄、性别、爱好等)、搜 索关键词或者合法站外得到的其他信息(例如用户使用Facebook账号登录,并得 到授权,可以得到Facebook中的朋友关系和评论内容)来推测用户的兴趣主题。 得到用户的兴趣主题之后,我们就可以找到与该用户兴趣主题相同的其他用户, 通过他们的历史行为来预测用户感兴趣的电影是什么。

同样地,对于物品冷启动问题,我们也可以根据电影的导演、演员、类别、关键词等信息推测该电影所属于的主题,然后基于主题向量找到相似的电影,并将新电影推荐给以往喜欢看这 些相似电影的用户。可以使用主题模型(pLSA、LDA等)得到用户和电影的主题。

以用户为例,我们将每个用户看作主题模型中的一篇文档,用户对应的特征 作为文档中的单词,这样每个用户可以表示成一袋子特征的形式。通过主题模型 学习之后,经常共同出现的特征将会对应同一个主题,同时每个用户也会相应地 得到一个主题分布。每个电影的主题分布也可以用类似的方法得到。

**那么如何解决系统冷启动问题呢?**首先可以得到每个用户和电影对应的主题向量,除此之外,还需要知道用户主题和电影主题之间的偏好程度,也就是哪些主题的用户可能喜欢哪些主题的电影。当系统中没有任何数据时,我们需要一些先验知识来指定,并且由于主题的数目通常比较小,随着系统的上线,收集到少量的数据之后我们就可以对主题之间的偏好程度得到一个比较准确的估计。

4. 参考文献

通俗理解LDA主题模型

谈起LDA,自然需要引入pLSA。pLSA是用一个生成模型来建模文章的生成过程。假设有K个主题,M篇文章;对语料库中的任意文章d,假设该文章有N个词,则对于其中的每一个词,我们首先选择一个主题z,然后在当前主题的基础上生成一个词w。

生成主题z和词w的过程遵照一个确定的概率分布。设在文章d中生成主题z的概率为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JZavJKtc-1602121779944)(https://www.zhihu.com/equation?tex=p%28z%7Cd%29)] ,在选定主题的条件下生成词w的概率为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLx4LqPp-1602121779944)(https://www.zhihu.com/equation?tex=p%28w%7Cz%29)] ,则给定文章d,生成词w的概率可以写成:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4saUgGUE-1602121779945)(https://www.zhihu.com/equation?tex=p%28w%7Cd%29%3D%5Csum_%7Bz%7D%5E%7BZ%7D%7Bp%28w%2Cz%7Cd%29%7D%3D%5Csum_%7Bz%7D%5E%7BZ%7D%7Bp%28w%7Cd%2Cz%29p%28z%7Cd%29%7D%3D%5Csum_%7Bz%7D%5E%7BZ%7D%7Bp%28w%7Cz%29p%28z%7Cd%29%7D)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rfs9daSR-1602121779945)(https://pic3.zhimg.com/80/v2-9bd488c7d2a61a466dedb1d78b2bb536_720w.jpg)]pLSA概率图模型

LDA可以看作是pLSA的贝叶斯版本,其文本生成过程与pLSA基本相同,不同的是为主题分布和词分布分别加了两个狄利克雷(Dirichlet)先验。为什么要加入狄利克雷先验呢?这就要从频率学派和贝叶斯学派的区别说起。pLSA采用的是频率派思想,将每篇文章对应的主题分布[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xTJY5fvD-1602121779946)(https://www.zhihu.com/equation?tex=p%28z%7Cd%29)]和每个主题对应的词分布[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3IJjmjOR-1602121779946)(https://www.zhihu.com/equation?tex=p%28w%7Cz%29)]看成确定的未知常数,并可以利用EM算法求解出来;
而LDA采用的是贝叶斯学派的思想,认为待估计的参数(主题分布和词分布)不再是一个固定的常数,而是服从一定分布的随机变量。这个分布符合一定的先验概率分布(即狄利克雷分布),并且在观察到样本信息之后,可以对先验分布进行修正,从而得到后验分布。LDA之所以选择狄利克雷分布作为先验分布,是因为它为多项式分布的共轭先验概率分布,后验概率依然服从狄利克雷分布,这样做可以为计算带来便利。——《百面机器学习》

imgLDA概率图模型

在LDA概率图模型中,α,β分别为两个狄利克雷分布的超参数,为人工设定。

补充:pLSA虽然可以从概率的角度解释了主题模型,却都只能对训练样本中的文本进行主题识别,而对不在样本中的文本是无法识别其主题的。根本原因在于NMF与pLSA这类主题模型方法没有考虑主题概率分布的先验知识,比如文本中出现体育主题的概率肯定比哲学主题的概率要高,这点来源于我们的先验知识,但是无法告诉NMF主题模型。而LDA主题模型则考虑到了这一问题,目前来说,绝大多数的文本主题模型都是使用LDA以及其变体。

2、LDA的数学基础

2.1 概率基础

(1)二项分布与多项分布

二项分布:[公式]

多项分布:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6kDGI3f2-1602121779947)(https://www.zhihu.com/equation?tex=P%28x_1%2C+x_2%2C+…%2C+x_k%3B+n%2C+p_1%2C+p_2%2C+…%2C+p_k%29+%3D+%5Cfrac%7Bn%21%7D%7Bx_1%21…x_k%21%7D%7Bp_1%7D%5E%7Bx_1%7D…%7Bp_k%7D%5E%7Bx_k%7D+)]

(2)Gamma函数

[公式]

Gamma函数如有这样的性质:[公式]

Gamma函数可以看成是阶乘在实数集上的延拓:[公式]

(3)Beta分布和Dirichlet分布

Beta分布的概率密度函数为:

[公式] 其中,[公式]

Dirichlet分布的概率密度函数为:

[公式]

其中,[公式]

这说明,对于Beta分布的随机变量,其均值可以用 [公式] 来估计。

Dirichlet分布也有类似的结论,如果 [公式] , 同样可以证明:

[公式]

(4)共轭先验分布

在贝叶斯概率理论中,如果后验概率 [公式] 和先验概率 [公式] 满足同样的分布律,那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。Beta分布是二项式分布的共轭先验分布,而狄利克雷(Dirichlet)分布是多项式分布的共轭先验分布。

2.2 MCMC及Gibbs Sampling

(1)MCMC简介

MCMC采样法主要包括两个MC,即蒙特卡洛法(Monte Carlo)和马尔可夫链(Markov Chain)。蒙特卡洛法是指基于采样的数值型近似求解方法,而马尔可夫链则用于进行采样。MCMC采样法基本思想是:针对待采样的目标分布,构造一个马尔可夫链,使得该马尔可夫链的平稳分布就是目标分布;然后,从任何一个初始状态出发,沿着马尔可夫链进行状态转移,最终得到的状态转移序列会收敛到目标分布,由此可以得到目标分布的一系列样本。在实际操作中,核心点是如何构造合适的马尔可夫链,即确定马尔可夫链的状态转移概率,这涉及一些马尔可夫链的相关知识点,如时齐性、细致平衡条件、可遍历性、平稳分布等。——《百面机器学习》

在现实应用中,我们很多时候很难精确求出精确的概率分布,常常采用近似推断方法。近似推断方法大致可分为两大类:第一类是采样(Sampling), 通过使用随机化方法完成近似;第二类是使用确定性近似完成近似推断,典型代表为变分推断(variational inference)。在很多任务中,我们关心某些概率分布并非因为对这些概率分布本身感兴趣,而是要基于他们计算某些期望,并且还可能进一步基于这些期望做出决策。采样法正式基于这个思路。

蒙特卡洛法(Monte Carlo)是指基于采样的数值型近似求解方法,具体来说,假定我们的目标是计算函数f(x)在概率密度函数p(x)下的期望:

[公式]

根据 [公式] 进行样本采样 [公式] ,最终可计算f(x)在这些样本上的均值:

[公式]

若概率密度函数 [公式] 很复杂,则构造服从p分布的独立同分布样本也很困难。MCMC方法的关键在于通过构造“平稳分布为 [公式] 的马尔可夫链”来产生样本:若马尔科夫链运行时间足够长,即收敛到平稳状态,则此时产出的样本X近似服从分布p。细致平衡条件为:

[公式]

(2)Metropolis-Hastings算法采样过程:

对于目标分布 [公式] ,首先选择一个容易采样的参考条件分布 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u4ojS82R-1602121779958)(https://www.zhihu.com/equation?tex=q%28x%5E%7B%2A%7D%7Cx%29)] ,并令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLGG8o55-1602121779958)(https://www.zhihu.com/equation?tex=A%28x%2Cx%5E%7B%2A%7D%29%3Dmin+%5B%5Cfrac%7Bp%28x%5E%7B%2A%7D%29q%28x%7Cx%5E%7B%2A%7D%29%7D%7Bp%28x%29q%28x%5E%7B%2A%7D%7Cx%29%7D%2C1%5D)]

然后根据如下过程进行采样:

1)随机选一个初始样本 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mC1De9yK-1602121779959)(https://www.zhihu.com/equation?tex=x%5E%7B%280%29%7D)] ;

2)For t = 1, 2, 3, … :

根据参考条件分布[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S02pw8Sz-1602121779959)(https://www.zhihu.com/equation?tex=q%28x%5E%7B%2A%7D%7Cx%5E%7Bt-1%7D%29)]抽取一个样本 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSgadflX-1602121779959)(https://www.zhihu.com/equation?tex=x%5E%7B%2A%7D)] ;

根据均匀分布U(0,1)产生随机数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nb7Q4EGB-1602121779960)(https://www.zhihu.com/equation?tex=u)] ;

若 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aRnfcSoo-1602121779960)(https://www.zhihu.com/equation?tex=u%3CA%28x%5E%7Bt-1%7D%2Cx%5E%7B%2A%7D%29)] ,则令[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1sbNGqmb-1602121779960)(https://www.zhihu.com/equation?tex=x%5E%7Bt%7D%3Dx%5E%7B%2A%7D)],否则令[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VTSF1YMH-1602121779962)(https://www.zhihu.com/equation?tex=x%5E%7Bt%7D%3Dx%5E%7Bt-1%7D)]。

(3)Gibbs Sampling算法采样过程:

吉布斯采样法是Metropolis-Hastings算法 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7udWdLVf-1602121779962)(https://www.zhihu.com/equation?tex=A%28x%5E%7Bt-1%7D%2Cx%5E%7B%2A%7D%29%3D1)] 时的一个特例,其核心思想是每次只对样本的一个维度进行采样和更新。对于目标分布p(x),按如下过程进行采样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TJkMhnLB-1602121779962)(https://pic1.zhimg.com/80/v2-30bb831eb5823f6b46a75018bf23f224_720w.jpg)]

3、pLSA中的参数估计:EM求解

(1)通过极大似然估计建立目标函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtT0yuL8-1602121779963)(https://pic4.zhimg.com/80/v2-6fd0d41a18076b75a452ba112c38bcd3_720w.jpg)]

(2)EM求解-E步:

确定后验概率:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXtfCkSX-1602121779963)(https://pic4.zhimg.com/80/v2-ef9574096b2b64fc6bdf833bb8e128eb_720w.jpg)]

并带入新的期望目标函数中:

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iczk4jRH-1602121779964)(https://pic4.zhimg.com/80/v2-ef9574096b2b64fc6bdf833bb8e128eb_720w.jpg)]

(3)EM求解-M步:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97EwIsBm-1602121779965)(https://pic2.zhimg.com/80/v2-196f2f2c92b1a47f9d81ea4f87a32ce5_720w.jpg)]

4、LDA中的参数估计:Gibbs Sampling

本节中通过Gibbs Sampling对进行参数估计,需要特别指出的是,Gibbs Sampling其实不是求解的过程,而是通过采样去求后验分布的期望,从而估计最终参数。

通过Gibbs Sampling对进行参数估计分为3个步骤:1)确定联合分布;2)求解后验概率Gibbs updating rule;3)确立后验分布并求期望估计参数;

(1)确定联合分布:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfsH5oZ0-1602121779965)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+p%28%5Cvec+w+%2C+%5Cvec+z+%5Cmid+%5Cvec+%5Calpha%2C+%5Cvec+%5Cbeta%29+%26+%3D+p%28%5Cvec+w+%5Cmid+%5Cvec+z%2C+%5Cvec+%5Cbeta%29+p%28%5Cvec+z+%5Cmid+%5Cvec+%5Calpha%29+%5C%5C%5Cend%7Balign%7D%3D)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uH8F3Qzw-1602121779966)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%26++%5Cprod_%7Bk%3D1%7D%5EK%5Cfrac%7B%5CDelta%28%5Cvec+%5Cphi_K+%2B+%5Cvec+%5Cbeta%29%7D%7B%5CDelta+%28%5Cvec+%5Cbeta%29%7D+%5Cprod_%7Bm%3D1%7D%5EM+%5Cfrac%7B%5CDelta%28%5Cvec+%5Ctheta_m+%2B+%5Cvec+%5Calpha%29%7D%7B%5CDelta%28%5Cvec+%5Calpha%29%7D+%5Cend%7Balign%7D)]

(2)根据(1)求出的联合分布可以求解Gibbs updating rule

img

(3)确立后验分布并求期望估计参数:

每个文档上Topic的后验分布和每个Topic下的词的后验分布分别如下(据上文可知:其后验分布跟它们的先验分布一样,也都是Dirichlet 分布):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WlUKtYvW-1602121779968)(https://pic3.zhimg.com/80/v2-734c87b507e63b581d85741cb20f7642_720w.jpg)]

根据Dirichlet 分布参数估计:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNgTv6DQ-1602121779968)(https://pic1.zhimg.com/80/v2-b0899f6391fae757c1b159333e7cb2cc_720w.jpg)]

5、LDA的训练和预测过程:

(1)训练过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kPESTZ7J-1602121779969)(https://pic4.zhimg.com/80/v2-e15ea53458e97756dba0ac862ecc242b_720w.jpg)]

(2)预测过程:LDA的各个主题的词分布 [公式] 已经确定:

img

6、LDA主题数目选择及评估标准

在LDA中,主题的个数K是一个预先指定的超参数。对于模型超参数的选择,实践中的做法一般是将全部数据集分成训练集、验证集、和测试集3部分,然后利用验证集对超参数进行选择。例如,在确定LDA的主题个数时,我们可以随机选取60%的文档组成训练集,另外20%的文档组成验证集,剩下20%的文档组成测试集。在训练时,尝试多组超参数的取值,并在验证集上检验哪一组超参数所对应的模型取得了最好的效果。最终,在验证集上效果最好的一组超参数和其对应的模型将被选定,并在测试集上进行测试。

为了衡量LDA模型在验证集和测试集上的效果,需要寻找一个合适的评估指标。一个常用的评估指标是困惑度(perplexity)。在文档集合D上,模型的困惑度被定义为:

img

其中M为文档的总数, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0bVsRXg-1602121779970)(https://www.zhihu.com/equation?tex=w_%7Bd%7D)] 为文档d中单词所组成的词袋向量,p([外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R2Vu3ufn-1602121779971)(https://www.zhihu.com/equation?tex=w_%7Bd%7D)])为模型所预测的文档d的生成概率, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FDlpXxjE-1602121779971)(https://www.zhihu.com/equation?tex=N_%7Bd%7D+)] 为文档d中单词的总数。

References

[1] 《百面机器学习:算法工程师带你去面试》

[2] 通俗理解LDA主题模型

[3] LDA求解之Gibbs采样算法

18. 概率图模型

在自然语言处理中,概率图模型极为重要,在中文分词、词性标注、命名实体识别等诸多场景中有着广泛的应用。概率图模型(Graphical Model)分为贝叶斯网络(Bayesian Network)和马尔科夫网络(Markov Network),其中贝叶斯网络可以用一个有向图结构表示,马尔科夫网络可以用无向图结构;进一步概率图模型包含朴素贝叶斯模型、最大熵模型、隐马尔可夫模型、条件随机场、主题模型等。此外,概率图模型常常会涉及表示、推断、参数学习三大问题。

img概率图模型的三大问题

概率图模型涉及很多方面,本文仅仅介绍两个重要模型HMM和CRF,将有关的概率图串起来。本文不仔细介绍有关底层知识,仅是一篇汇总+总结文。

1、HMM VS NB,GMM

本小节从朴素贝叶斯模型(NB)和高斯混合模型(GMM)引出隐马尔可夫模型(HMM)。

1.1 朴素贝叶斯模型(NB)

NB的目标函数是后验概率最大化,其等价于0-1损失最小。NB是贝叶斯网络中最为简单的一个模型,贝叶斯网络中应熟悉概率因子分解和条件独立性判断(head to tail,tail to tail,head to head),而NB正是应用了tail to tail的条件独立性假设。

img朴素贝叶斯模型(NB)

最大后验概率: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KNINARJi-1602121779974)(https://www.zhihu.com/equation?tex=y%3Dmax+++P%28y_%7Bk%7D+%7C+x%29+%3Dmax++%5Cfrac%7BP%28x+%7Cy_%7Bk%7D%29P%28y_%7Bk%7D%29%7D%7BP%28x%29%7D)]

条件独立性假设: [公式]

NB的参数学习意味着需要估计 [公式] 和 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUgW9lO6-1602121779976)(https://www.zhihu.com/equation?tex=P%28y_%7Bk%7D%29)] ,可以采用极大似然估计(MLE);而采用MLE可能会出现估计概率为0的情况,这会影响后验概率的计算结果,使分类产生偏差。因此,可采用贝叶斯估计解决,如add-1-smoothing 或者 add-k-smoothing。

1.2 高斯混合模型(GMM)

再引出GMM之前,首先换个角度理解NB:把NB看做单一模型,即观测变量 [公式] 由 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFGDJWuv-1602121779977)(https://www.zhihu.com/equation?tex=y_%7Bk%7D)]产生,而[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILhOFUQD-1602121779978)(https://www.zhihu.com/equation?tex=y_%7Bk%7D)] 也是可以观测的;一旦给定[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gxvWcPWv-1602121779979)(https://www.zhihu.com/equation?tex=y_%7Bk%7D)],就可以估计 [公式]

而对于GMM,观测变量虽然 [公式]也是由[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-phB6LZhm-1602121779981)(https://www.zhihu.com/equation?tex=y_%7Bk%7D)] 产生的,但是[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B2gjLkHQ-1602121779981)(https://www.zhihu.com/equation?tex=y_%7Bk%7D)] 确实不可以观测的。“混合”表示观测变量 [公式] 会由多个隐变量 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KJBdqgX7-1602121779982)(https://www.zhihu.com/equation?tex=y_%7Bk%7D)] 产生:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fmRxYB9S-1602121779983)(https://www.zhihu.com/equation?tex=p%28x%29%3D%5Csum_%7Bk%7D%5E%7BK%7D%7Bp%28x%2Cy_%7Bk%7D%29%7D%3D%5Csum_%7Bk%7D%5E%7BK%7D%7Bp%28x%7Cy_%7Bk%7D%29p%28y_%7Bk%7D%29%7D)]

GMM也是一种常见的聚类算法,使用EM算法进行迭代计算;GMM假设每个簇的分布服从高斯分布。

1.3 隐马尔可夫模型(HMM)

在引入HMM之前,我们分别介绍了NB和GMM,那么它们与HMM有何关联?

当NB中的 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tF0AV149-1602121779984)(https://www.zhihu.com/equation?tex=y_%7Bk%7D)] 变为隐变量时,即可得到“混合”的GMM模型;而当GMM模型中的隐变量展开为时间序列时,即可得到HMM。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IKFdiV7U-1602121779984)(https://pic2.zhimg.com/80/v2-5e3ed1c04789138521c25970f54fd231_720w.jpg)]隐马尔可夫模型(HMM)

学习HMM的口诀是“1-2-3”:

(1)1个参数包含: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DwicCOT3-1602121779986)(https://www.zhihu.com/equation?tex=%5Clambda%3D%EF%BD%9B%5Cpi%2CA%2CB%EF%BD%9D)] ;

(2)2个假设:一阶马尔科夫假设+观测独立性假设;

(3)3个问题:概率计算问题(前向后向);参数学习问题(EM/MLE);预测问题(Viterbi);

2、CRF VS LR,ME

2.1 最大熵模型ME

img最大熵模型(ME)

最大熵模型由最大熵原理导出,最大熵原理是概率学习和估计的一个准则。最大熵原理认为在所有可能的概率模型的集合中,熵最大的模型是最好的模型。最大熵模型的学习等价于约束最优化问题:

img

求解之后可以得到最大熵模型的表达式为:

img

最大熵模型最终可以归结为学习最佳的参数w。

2.2 从最大熵模型ME看逻辑回归LR

如果将看作 [公式] 二元变量,并且将特征函数修改为: [公式]

即可得到sigmoid函数:

[公式]

从上所述,可以看出LR是最大熵模型ME的一个特例。 LR和ME均属于对数线性模型。

2.3 从最大熵模型ME看CRF

img条件随机场(CRF)

条件随机场CRF可以看作是最大熵模型ME在时间序列上的延伸。

3、HMM、MEMM vs CRF

本小节对HMM、MEMM和CRF进行对比。

1)HMM是有向图模型,是生成模型;HMM有两个假设:一阶马尔科夫假设和观测独立性假设;但对于序列标注问题不仅和单个词相关,而且和观察序列的长度,单词的上下文,等等相关。

2)MEMM(最大熵马尔科夫模型)是有向图模型,是判别模型;MEMM打破了HMM的观测独立性假设,MEMM考虑到相邻状态之间依赖关系,且考虑整个观察序列,因此MEMM的表达能力更强;但MEMM会带来标注偏置问题:由于局部归一化问题,MEMM倾向于选择拥有更少转移的状态。这就是标记偏置问题。

img最大熵模型(MEMM)

3)CRF模型解决了标注偏置问题,去除了HMM中两个不合理的假设,当然,模型相应得也变复杂了。

HMM、MEMM和CRF的优缺点比较:

a)与HMM比较。CRF没有HMM那样严格的独立性假设条件,因而可以容纳任意的上下文信息。特征设计灵活(与ME一样)

b)与MEMM比较。由于CRF计算全局最优输出节点的条件概率,它还克服了最大熵马尔可夫模型标记偏置(Label-bias)的缺点。

c)与ME比较。CRF是在给定需要标记的观察序列的条件下,计算整个标记序列的联合概率分布,而不是在给定当前状态条件下,定义下一个状态的状态分布.

首先,CRF,HMM(隐马模型),MEMM(最大熵隐马模型)都常用来做序列标注的建模,像分词、词性标注,以及命名实体标注
隐马模型一个最大的缺点就是由于其输出独立性假设,导致其不能考虑上下文的特征,限制了特征的选择
最大熵隐马模型则解决了隐马的问题,可以任意选择特征,但由于其在每一节点都要进行归一化,所以只能找到局部的最优值,同时也带来了标记偏见的问题,即凡是训练语料中未出现的情况全都忽略掉。
条件随机场则很好的解决了这一问题,他并不在每一个节点进行归一化,而是所有特征进行全局归一化,因此可以求得全局的最优值。

概率模型提供了一种描述框架,将学习任务归结于计算变量的概率分布。在概率模型中,利用已知变量推测未知变量的分布称为“推断”,其核心是如何基于可观测变量推测未知变量的条件分布。

概率图模型是一类用图来表达变量相关关系的概率模型。概率图模型可大致分为两类:

  • 使用有向无环图表示变量间的依赖关系,称为有向图模型贝叶斯网
  • 使用无向图表示变量间的相关关系,称为无向图模型马尔可夫网

19. HMM MEMM CRF

隐马尔可夫模型(HMM)

HMM是一种结构比较简单的动态贝叶斯网络结构。在隐马尔可夫模型中,有两组变量:

  • 不可观测的状态变量(隐变量) [公式] ,其中 [公式] 表示第i时刻的系统状态
  • 观测变量 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tOgj8kxs-1602121779990)(https://www.zhihu.com/equation?tex=%5C%7Bx_1%2Cx_2%2C%5Ccdots%2Cx_n%5C%7D)] ,其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-34Ca3t7T-1602121779991)(https://www.zhihu.com/equation?tex=x_i)] 表示第i时刻的观测值

其中隐变量 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lC8yJIS-1602121779992)(https://www.zhihu.com/equation?tex=y_i%5Cin+Y)] (状态空间)通常是有N个取值的离散空间。而观测变量 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qqEp2quo-1602121779992)(https://www.zhihu.com/equation?tex=x_i%5Cin+X)](观测空间)可以为离散型也可以为连续型,这里仅讨论离散型(M个取值)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUjzM69R-1602121779993)(https://pic3.zhimg.com/80/v2-fd4d8943e683995ed5272f8d4ccdbfaa_720w.png)]

HMM模型的图结构如上所示,图中的箭头显示了变量间的依赖关系,可以看出HMM模型就是一个马尔可夫链:

  • 观测变量的取值仅依赖于当前的状态变量
  • 当前的状态变量仅由上一个状态变量决定,不依赖于其他的任何变量

这种性质决定了HMM中所有变量的联合概率分布为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O9gqnbTS-1602121779993)(https://www.zhihu.com/equation?tex=P%28x_1%2Cy_1%2C%5Ccdots%2Cx_n%2Cy_n%29%3DP%28y_1%29%5Cprod%5En_%7Bi%3D2%7DP%28y_i%7Cy_%7Bi-1%7D%29P%28x_i%7Cy_i%29)]

显而易见,HMM还需要下面三类参数:

  • **状态转移概率:**记为矩阵 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8n3kQiNc-1602121779994)(https://www.zhihu.com/equation?tex=A%3D%5Ba_%7Bij%7D%5D_%7BN%5Ctimes+N%7D)],其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v2VONFRa-1602121779994)(https://www.zhihu.com/equation?tex=a_%7Bij%7D%3DP%28y_%7Bt%2B1%7D%3Ds_j%7Cy_t%3Ds_i%29%2C~~~~1%5Cleq+i%2Cj%5Cleq+N)],s代表状态的取值
  • **输出观测概率:**记为矩阵 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a0cysAB8-1602121779994)(https://www.zhihu.com/equation?tex=B%3D%5Bb_%7Bij%7D%5D_%7BN%5Ctimes+M%7D)] ,其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRSGDLsj-1602121779995)(https://www.zhihu.com/equation?tex=b_%7Bij%7D%3DP%28x_%7Bt%7D%3Do_j%7Cy_t%3Ds_i%29%2C~~~~1%5Cleq+i%5Cleq+N%2C+1%5Cleq+j%5Cleq+M)] ,o代表观测值
  • **初始状态概率:**模型在初始时刻各状态的概率,记作 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lFkFDRXo-1602121779996)(https://www.zhihu.com/equation?tex=%5Cpi%3D%28%5Cpi_1%2C%5Cpi_2%2C%5Ccdots%2C%5Cpi_N%29)] ,其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZJdMxJmn-1602121779996)(https://www.zhihu.com/equation?tex=%5Cpi_i%3DP%28y_1%3Ds_i%29~~~~1%5Cleq+i%5Cleq+N)]

通过指定状态空间 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJK8Og9g-1602121779997)(https://www.zhihu.com/equation?tex=Y)] 、观测空间 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuivXn63-1602121779997)(https://www.zhihu.com/equation?tex=X)] 、以及参数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oc8NOCp6-1602121779999)(https://www.zhihu.com/equation?tex=%5Clambda%3D%5BA%2CB%2C%5Cpi%5D)] ,就能确定一个隐马尔可夫模型。而根据马尔可夫性,HMM产生观测序列的过程也很简单了。

在实际应用中,通常关注HMM的三个基本问题:

概率计算问题:给定模型 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HwQ3mHTB-1602121779999)(https://www.zhihu.com/equation?tex=%5Clambda%3D%5BA%2CB%2C%5Cpi%5D)] ,有效计算其产生观测序列 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pn4ikNHt-1602121779999)(https://www.zhihu.com/equation?tex=x%3D%5C%7Bx_1%2Cx_2%2C%5Ccdots%2Cx_n%5C%7D)]的概率 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sLjgUxFY-1602121780000)(https://www.zhihu.com/equation?tex=P%28x%7C%5Clambda%29)] (前向算法)

预测问题(解码问题):给定模型 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xI4xsbwF-1602121780001)(https://www.zhihu.com/equation?tex=%5Clambda%3D%5BA%2CB%2C%5Cpi%5D)] 和观测序列 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ds9v9lnE-1602121780001)(https://www.zhihu.com/equation?tex=x%3D%5C%7Bx_1%2Cx_2%2C%5Ccdots%2Cx_n%5C%7D)] ,找到与此观测序列最匹配的状态序列 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wnvs5YNp-1602121780002)(https://www.zhihu.com/equation?tex=y%3D%5C%7By_1%2Cy_2%2C%5Ccdots%2Cy_n%5C%7D)] (维特比算法)

学习问题:给定观测序列 [公式] ,找到适合的模型参数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cy9YvnFD-1602121780003)(https://www.zhihu.com/equation?tex=%5Clambda%3D%5BA%2CB%2C%5Cpi%5D)] 使得该序列出现的概率 [公式] 最大(前向-后向算法)

最大熵马尔可夫模型(MEMM)

MEMM是一种判别式有向图模型。对比于HMM的联合概率分布

[公式]

MEMM直接对条件概率建模,用 [公式] 来代替HMM中的两个条件概率,它表示在先前状态 [公式] ,观测值 [公式] 下得到当前状态 [公式] 的概率,即根据前一状态和当前观测预测当前状态。从图结构可以明白地展示出来

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jFpAoZXg-1602121780006)(https://pic3.zhimg.com/80/v2-5b4ac39f9307f23f11b09ede239cadb6_720w.jpg)]

也就是

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZEa3wUdw-1602121780007)(https://www.zhihu.com/equation?tex=P%28y%7Cx%29%3DP%28y_1%29%5Cprod%5En_%7Bi%3D2%7DP%28y_i%7Cy_%7Bi-1%7D%2Cx_i%29)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b0zwjk3Y-1602121780007)(https://www.zhihu.com/equation?tex=P_%7By_%7Bi-1%7D%7D%28y_i%7Cx_%7Bi%7D%29%3D%5Cfrac%7B1%7D%7BZ%28x_%7Bi%7D%2Cy_%7Bi-1%7D%29%7D%5Csum_a%5Em%28%5Clambda_af_a%28x_%7Bi%7D%2Cy_i%29%29)]

每个这样的分布函数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZaRcFV90-1602121780007)(https://www.zhihu.com/equation?tex=P_%7By_%7Bi-1%7D%7D%28y_i%7Cx_i%29)] 都是一个服从最大熵的指数模型。

由于MEMM在 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7krWQsj-1602121780008)(https://www.zhihu.com/equation?tex=%28y_%7Bi-1%7D%2Cx_i%2Cy_i%29)] 做了局部归一化,因而可能会产生标注偏置的问题。

MEMM vs HMM:

  • HMM是生成式模型,MEMM是判别式模型
  • HMM由隐藏状态产生输入(观测),MEMM基于输入(观测)产生隐藏状态(condition on observations)
  • 相比于MEMM,HMM更不直观,因为目标是预测出隐藏状态,而不是基于隐藏状态来预测观测
  • HMM的马尔可夫性导致观测值严格独立,MEMM摒弃了这个假设,可以在长距离上得到features(每一个分布函数也可以定义为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNsUmhvi-1602121780009)(https://www.zhihu.com/equation?tex=P_%7By_%7Bi-1%7D%7D%28y_i%7Cx_%7B1%3An%7D%29%3D%5Cfrac%7B1%7D%7BZ%28x_%7B1%3An%7D%2Cy_%7Bi-1%7D%29%7D%5Csum_a%5Em%28%5Clambda_af_a%28x_%7B1%3An%7D%2Cy_i%29%29)] )

条件随机场(CRF)

条件随机场是一种判别式无向图模型(满足于马尔可夫性)。具体来说若 [公式] 为观测序列, [公式] 为对应的标记序列,则条件随机场的目标是对 [公式] 建模。通常情况下我们讨论的都是链式条件随机场(下面称为CRF)

img

CRF的条件概率被定义为

[公式]

其中 [公式] 是定义在观测序列的两个相邻标记位置上的转移特征函数,用于刻画相邻标记变量之间的相关关系以及观测序列对它们的影响, [公式] 是定义在观测序列的标记位置i上的状态特征函数,用于刻画观测序列对标记变量的影响, [公式] 为参数,Z为规范化因子。因而使用条件随机场的关键在于定义合适的特征函数。

MEMM vs CRF:

  • MEMM有向图模型,CRF无向图模型
  • 从概率公式上也可以看出,CRF的归一化在模型上更加合理,是全局性的,相比于MEMM的局部归一化更优,因而解决了MEMM存在的标注偏置问题
  • CRF的特征函数定义非常灵活,还可以使用外部特征,保证了获取信息的丰富性

参考

20. 实体关系抽取方法总结

实体关系抽取(Entity and Relation Extraction,ERE)是信息抽取的关键任务之一。ERE是级联任务,分为两个子任务:实体抽取和关系抽取,如何更好处理这种类似的级联任务是NLP的一个热点研究方向。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HaPP9V5U-1602121780015)(https://pic3.zhimg.com/80/v2-2b9a9eb6f1e9a66b33bf30a79a5f3d96_720w.jpg)]本文结构

Q1:与联合抽取对比,Pipeline方法有哪些缺点?

Pipeline方法指先抽取实体、再抽取关系。相比于传统的Pipeline方法,联合抽取能获得更好的性能。虽然Pipeline方法易于实现,这两个抽取模型的灵活性高,实体模型和关系模型可以使用独立的数据集,并不需要同时标注实体和关系的数据集。但存在以下缺点:

  1. 误差积累:实体抽取的错误会影响下一步关系抽取的性能。
  2. 实体冗余:由于先对抽取的实体进行两两配对,然后再进行关系分类,没有关系的候选实体对所带来的冗余信息,会提升错误率、增加计算复杂度。
  3. 交互缺失:忽略了这两个任务之间的内在联系和依赖关系。

(基于共享参数的联合抽取方法仍然存在训练和推断时的gap,推断时仍然存在误差积累问题,可以说只是缓解了误差积累问题。)

Q2:NER除了LSTM+CRF,还有哪些解码方式?如何解决嵌套实体问题?

虽然NER是一个比较常见的NLP任务,通常采用LSTM+CRF处理一些简单NER任务。NER还存在嵌套实体问题(实体重叠问题),如「《叶圣陶散文选集》」中会出现两个实体「叶圣陶」和「叶圣陶散文选集」分别代表「作者」和「作品」两个实体。而传统做法由于每一个token只能属于一种Tag,无法解决这类问题。笔者尝试通过归纳几种常见并易于理解的 实体抽取解码方式 来回答这个问题。

1、序列标注:SoftMax和CRF

本质上是token-level 的多分类问题,通常采用CNNs/RNNs/BERT+CRF处理这类问题。与SoftMax相比,CRF进了标签约束。对这类方法的改进,介绍2篇比较有价值的工作:

  • 针对CRF解码慢的问题,LAN[1]提出了一种逐层改进的基于标签注意力机制的网络,在保证效果的前提下比 CRF 解码速度更快。文中也发现BiLSTM-CRF在复杂类别情况下相比BiLSTM-softmax并没有显著优势。
  • 由于分词边界错误会导致实体抽取错误,基于LatticeLSTM[2]+CRF的方法可引入词汇信息并避免分词错误(词汇边界通常为实体边界,根据大量语料构建词典,若当前字符与之前字符构成词汇,则从这些词汇中提取信息,联合更新记忆状态)。

但由于这种序列标注采取BILOU标注框架,每一个token只能属于一种,不能解决重叠实体问题,如图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvf6BBpq-1602121780016)(https://pic3.zhimg.com/80/v2-135d19b9894df6ce265af8b37e3931fa_720w.jpeg)]

基于BILOU标注框架,笔者尝试给出了2种改进方法去解决实体重叠问题:

  • 改进方法1:采取token-level 的多label分类,将SoftMax替换为Sigmoid,如图所示。当然这种方式可能会导致label之间依赖关系的缺失,可采取后处理规则进行约束。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0SV8cV0-1602121780016)(https://pic2.zhimg.com/80/v2-67a484ce19e5f896393e862125ee2af1_720w.jpg)]

  • 改进方法2:依然采用CRF,但设置多个标签层,对于每一个token给出其所有的label,然后将所有标签层合并。显然这可能会增加label数量[3],导致label不平衡问题。基于这种方式,文献[4]也采取先验图的方式去解决重叠实体问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mSDlFMKb-1602121780017)(https://pic2.zhimg.com/80/v2-d39b7799d2c7c028d05c08e53630f4e1_720w.jpg)]

2、Span抽取:指针网络

指针网络(PointerNet)最早应用于MRC中,而MRC中通常根据1个question从passage中抽取1个答案片段,转化为2个n元SoftMax分类预测头指针和尾指针。对于NER可能会存在多个实体Span,因此需要转化为n个2元Sigmoid分类预测头指针和尾指针。

将指针网络应用于NER中,可以采取以下两种方式:

第一种:MRC-QA+单层指针网络。在ShannonAI的文章中[5],构建query问题指代所要抽取的实体类型,同时也引入了先验语义知识。如图所示,由于构建query问题已经指代了实体类型,所以使用单层指针网络即可;除了使用指针网络预测实体开始位置、结束位置外,还基于开始和结束位置对构成的所有实体Span预测实体概率[6]。此外,这种方法也适合于给定事件类型下的事件主体抽取,可以将事件类型当作query,也可以将单层指针网络替换为CRF。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cBfyYXJk-1602121780018)(https://pic2.zhimg.com/80/v2-afc0de669e56b65b93b1dfd11f9aa7e9_720w.jpg)]

第二种:多层label指针网络。由于只使用单层指针网络时,无法抽取多类型的实体,我们可以构建多层指针网络,每一层都对应一个实体类型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YhNZ24Y3-1602121780018)(https://pic4.zhimg.com/80/v2-bc4536c503edc7796bb2992b269ba467_720w.jpg)]

需要注意的是:

      • 1)MRC-QA会引入query进行实体类型编码,这会导致需要对愿文本重复编码输入,以构造不同的实体类型query,这会提升计算量。
      • 2)笔者在实践中发现,n个2元Sigmoid分类的指针网络,会导致样本Tag空间稀疏,同时收敛速度会较慢,特别是对于实体span长度较长的情况。

3、片段排列+分类

上述序列标注和Span抽取的方法都是停留在token-level进行NER,间接去提取span-level的特征。而基于片段排列的方式[7],显示的提取所有可能的片段排列,由于选择的每一个片段都是独立的,因此可以直接提取span-level的特征去解决重叠实体问题。

对于含T个token的文本,理论上共有 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbrGJIRj-1602121780019)(https://www.zhihu.com/equation?tex=N%3DT%28T%2B1%29%2F2+)] 种片段排列。如果文本过长,会产生大量的负样本,在实际中需要限制span长度并合理削减负样本。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6lde3WD-1602121780019)(https://pic1.zhimg.com/80/v2-047854b179d60784414ef9a773dba900_720w.jpeg)]

需要注意的是:

  1. 实体span的编码表示:在span范围内采取注意力机制与基于原始输入的LSTM编码进行交互。然后所有的实体span表示并行的喂入SoftMax进行实体分类。
  2. 这种片段排列的方式对于长文本复杂度是较高的。

4、Seq2Seq

ACL2019的一篇paper中采取Seq2Seq方法[3],encoder部分输入的原文tokens,而decoder部分采取hard attention方式one-by-one预测当前token所有可能的tag label,直至输出 (end of word) label,然后转入下一个token再进行解码。

**Q3:**Pipeline中的关系分类有哪些常用方法?如何应用弱监督和预训练机制?怎么解决高复杂度问题、进行one-pass关系分类?

(注:Pipeline方法中,关系抽取通常转化为一个分类问题,笔者这里称之为「关系分类」)

1、模板匹配:是关系分类中最常见的方法,使用一个模板库对输入文本两个给定实体进行上下文匹配,如果满足模板对应关系,则作为实体对之间的关系。常见的模板匹配方法主要包括:

  • 人工模板:主要用于判断实体间是否存在上下位关系。上下位关系的自然语言表达方式相对有限,采用人工模板就可以很好完成关系分类。但对于自然语言表达形式非常多的关系类型而言,这就需要采取统计模板。
  • 统计模板:无须人工构建,主要基于搜索引擎进行统计模板抽取。具体地,将已知实体对作为查询语句,抓取搜索引擎返回的前n个结果文档并保留包含该实体对的句子集合,寻找包含实体对的最长字串作为统计模板,保留置信度较高的模板用于关系分类。

基于模板匹配的关系分类构建简单、适用于小规模特定领域,但召回率低、可移植性差,当遇到另一个领域的关系分类需要重新构建模板。

2、半监督学习

bootstrapping(自举):利用少量的实例作为初始种子集合,然后在种子集合上学习获得关系抽取的模板,再利用模板抽取更多的实例,加入种子集合中并不断迭代。

    • bootstrapping比较常见的方法有DIPRE和Snowball。和DIPRE相比,Snowball通过对获得的模板pattern进行置信度计算,一定程度上可以保证抽取结果质量。
    • bootstrapping的优点构建成本低,适合大规模的关系任务并且具备发现新关系的能力,但也存在对初始种子较为敏感、存在语义漂移、准确率等问题。

远程监督:其主要的基本假设是,如果一个实体对满足某个给定关系,那么同时包含该实体对的所有句子(构成一个Bag)都可能在阐述该关系。可以看出,该假设是一个非常强的假设,实际上很多包含该实体对的句子并不代表此种关系,会引入大量噪声。为了缓解这一问题,主要采取**「多示例学习」、「强化学习」和「预训练机制」**:

(1)多示例学习:主要基于Bag的特征进行关系分类,主要代表文献包括PCNN[8]、Selective Attention over Instances[9]、Multi-label CNNs[10]、APCNNs[11],其中Bag的表示主要方式和池化方式为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lV8pKmRa-1602121780020)(https://pic3.zhimg.com/80/v2-99630814abbd768be5d61236eedd1a16_720w.png)]

以APCNNs为例,采取PCNN模型[8]提取单一句子的特征向量,最后通过attention加权得到Bag级别的特征,关系分类是基于Bag特征进行的,而原始的PCNN模型只选择Bag中使得模型预测得分最高的句子用于模型参数的更新,这会损失很多信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6JNEiGtc-1602121780021)(https://pic2.zhimg.com/80/v2-3794aa58abe904bbbb11a03f04527fc1_720w.jpg)]APCNNs

(2)强化学习:在采用多示例学习策略时,可能会出现整个Bag包含大量噪声的情况。基于强化学习的CNN+RL[12]比句子级别和Bag级别的关系分类模型取得更好效果。

模型主要由样例选择器和关系分类器构成。样例选择器负责从样例中选择高质量的句子,采取强化学习方式在考虑当前句子的选择状态下选择样例;关系分类器向样例选择器反馈,改进选择策略。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yul0qVxl-1602121780021)(https://pic3.zhimg.com/80/v2-c42e7faeffa7e8f89b7b9d50198a06aa_720w.jpg)]CNN+RL

(3)预训练机制:采取“Matching the Blank[13]”方法,首次在预训练过程中引入关系分类目标,但仍然是自监督的,没有引入知识库和额外的人工标注,将实体metion替换为「BLANK」标识符。

  • 该方法认为包含相同实体对的句子对为正样本,而实体对不一样的句子对为负样本。如图, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hI5VgJWr-1602121780021)(https://www.zhihu.com/equation?tex=r_A)] 和[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3fN7W5E0-1602121780021)(https://www.zhihu.com/equation?tex=r_B)]构成正样本,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzPEi8I4-1602121780022)(https://www.zhihu.com/equation?tex=r_A)] 和[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m808Drpw-1602121780022)(https://www.zhihu.com/equation?tex=r_C)]构成 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8rzaRwf-1602121780022)(https://www.zhihu.com/equation?tex=r_B)]和[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lkWWRAvg-1602121780023)(https://www.zhihu.com/equation?tex=r_C)]构负样本。
  • 不同于传统的远程监督,该方法训练中不使用关系标签,采用二元分类器对句子对进行相似度计算。预训练的损失包含2部分:MLM loss 和 二元交叉熵关系损失。
  • 在FewRel数据集上,不进行任何tuning就已经超过了有监督的结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eL3N2dZ9-1602121780024)(https://pic1.zhimg.com/80/v2-9881932fe8b77a99b0ff567a95850050_720w.png)]

3、监督学习:主要分为基于特征、核函数、深度学习三种方法;基于特征的方法需要定义特征集合,核函数不需要定义特征集合、在高维空间进行计算。笔者主要介绍基于深度学习的方法。

过去的几年中,很多基于深度学习的有监督关系分类被提出,大致都采用CNN、RNN、依存句法树、BERT的方法,由于这些方法大都很容易理解,笔者这里不再赘述,只选择介绍3篇比较新颖的文献进行介绍。

3-1 Matching the Blanks: Distributional Similarity for Relation Learning[13]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kUBj2qo0-1602121780025)(https://pic2.zhimg.com/80/v2-04a6f2715e6d5be8345e022e67f3c785_720w.jpg)]

这篇文献来自GoogleAI,基于BERT,共采用6种不同结构来进行实体pair的pooling,然后将pooling进行关系分类或关系相似度计算,显示(f)效果最好。

  1. 标准输入+「CLS」输出;
  2. 标准输入+mention pooling输出;
  3. position embedding 输入+mention pooling输出;
  4. entity markers输入+「CLS」输出;
  5. entity markers输入+ mention pooling输出;
  6. entity markers输入+ entity start 输出;

3-2 Extracting Multiple-Relations in One-Pass with Pre-Trained Transformers[14]

Pipeline方法下的关系分类,同一个句子会有多个不同的实体对,过去的一些方法构造多个(句子,entity1,entity2)进行多次关系分类,本质上是一个multi pass问题,同一个句子会进行重复编码,耗费计算资源。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0VFAAPMj-1602121780026)(https://pic2.zhimg.com/80/v2-06fea304be6f9a2e0da60daa9fc8083d_720w.jpg)]

  • 本文将多次关系抽取转化为one pass问题,将句子一次输入进行多个关系分类。在BERT顶层对不同的实体对进行不同的关系预测。
  • 本文将还编码词和实体之间的相对距离计算Entity-Aware Self-Attention。如下图所示, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VGK4Y0vI-1602121780027)(https://www.zhihu.com/equation?tex=w_%7Bd%28i-j%29%7D)] 代表实体 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yswmGFsM-1602121780028)(https://www.zhihu.com/equation?tex=x_%7Bi%7D)] 到token [公式]间相对距离的embedding。

imgEntity-Aware Self-Attention

3-3 Simultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction[15]

与上篇文献[14]类似,这篇文献的依旧采用one-pass对所有实体mention进行关系分类,同时从所有实体mention中定位关系。

不同的地方是从句子级别拓展到文档级别,同时引入NER辅助进行多任务学习,此外,实体信息在进行mention pooling才给定,而不是输入时就给出 ;进行关系分类时采用Bi-affine方法(sigmoid),而不是采用Softmax。具体地:

  • Bi-affine Pairwise Scores:采用Transformer编码,对每个token通过两个独立MLP进行三元组中的head和tail表征,然后Bi-affine通过计算每个三元组的得分: [公式]
  • 采用LogSumExp计算得分: [公式]
  • 计算loss时,给定E个实体对信息再进行计算: [公式]

imgSimultaneously Self-Attending

Q4:什么是关系重叠&复杂关系问题?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7CQ0AZrv-1602121780031)(https://pic3.zhimg.com/80/v2-57e852eceab07f7145b457e260aebcc6_720w.jpg)]

  • a:正常关系问题
  • b:关系重叠问题,一对多。如“张学友演唱过《吻别》《在你身边》”中,存在2种关系:「张学友-歌手-吻别」和「张学友-歌手-在你身边」
  • c:关系重新问题,一对实体存在多种关系。如“周杰伦作曲并演唱《七里香》”中,存在2种关系:「周杰伦-歌手-七里香」和「周杰伦-作曲-七里香」
  • d:复杂关系问题,由实体重叠导致。如《叶圣陶散文选集》中,叶圣陶-作品-叶圣陶散文选集;
  • e:复杂关系问题,关系交叉导致。如“张学友、周杰伦分别演唱过《吻别》《七里香》”,「张学友-歌手-吻别」和「周杰伦-歌手-七里香」

Q5:联合抽取难点在哪里?联合抽取总体上有哪些方法?各有哪些缺点?

顾名思义,联合模型就是一个模型,将两个子模型统一建模。根据Q1,联合抽取可以进一步利用两个任务之间的潜在信息,以缓解错误传播的缺点(注意⚠️只是缓解,没有从根本上解决)。

联合抽取的难点是如何加强实体模型和关系模型之间的交互,比如实体模型和关系模型的输出之间存在着一定的约束,在建模的时候考虑到此类约束将有助于联合模型的性能。

现有联合抽取模型总体上有两大类[16]

1、共享参数的联合抽取模型

通过共享参数(共享输入特征或者内部隐层状态)实现联合,此种方法对子模型没有限制,但是由于使用独立的解码算法,导致实体模型和关系模型之间交互不强。

绝大数文献还是基于参数共享进行联合抽取的,这类的代表文献有:

2、联合解码的联合抽取模型

为了加强实体模型和关系模型的交互,复杂的联合解码算法被提出来,比如整数线性规划等。这种情况下需要对子模型特征的丰富性以及联合解码的精确性之间做权衡[16]

  • 一方面如果设计精确的联合解码算法,往往需要对特征进行限制,例如用条件随机场建模,使用维特比解码算法可以得到全局最优解,但是往往需要限制特征的阶数。
  • 另一方面如果使用近似解码算法,比如集束搜索,在特征方面可以抽取任意阶的特征,但是解码得到的结果是不精确的。

因此,需要一个算法可以在不影响子模型特征丰富性的条件下加强子模型之间的交互。

此外,很多方法再进行实体抽取时并没有直接用到关系的信息,然而这种信息是很重要的。需要一个方法可以同时考虑一个句子中所有实体、实体与关系、关系与关系之间的交互

Q6:介绍基于共享参数的联合抽取方法?

在联合抽取中的实体和关系抽取的解码方式与Q2中的实体抽取的解码方式基本一致,主要包括:序列标注CRF/SoftMax、指针网络、分类SoftMax、Seq2Seq等。基于共享参数的联合抽取,实体抽取loss会与关系抽取loss相加。

由于很多的相关文献实用性不高,我们只介绍其中具备代表性和易于应用的几篇文献,首先归纳如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gyT88sKE-1602121780032)(https://pic4.zhimg.com/80/v2-2ac766a7e2d2c18fd9370dc7f0af0a1b_720w.jpg)]

6-1 依存结构树:End-to-End Relation Extraction using LSTMs on Sequences and Tree Structures[17]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wgH60o4c-1602121780032)(https://pic2.zhimg.com/80/v2-87a4ff51f40530516e4a81e8cdf18881_720w.jpg)]

  • 联合抽取顺序:先抽取实体,再进行关系分类

    • 实体抽取:采用BILOU标注,SoftMax解码;
    • 关系抽取:针对实体抽取出的实体对,在当前句子对应的依存句法树中找到能够覆盖该实体对的最小依存句法树,并采用TreeLSTM生成该子树对应的向量表示,最后,根据子树根节点对应的TreeLSTM向量进行SoftMax关系分类。
  • 存在问题

    • 实体抽取未使用CRF解码,没有解决标签依赖问题。
    • 关系抽取仍然会造成实体冗余,会提升错误率、增加计算复杂度
    • 使用句法依存树,只针对句子级别并且只适用于易于依存解析的语言。
    • 不能解决完整的关系重叠问题,本质上是实体重叠问题没有解决。

6-2 指针网络,Going out on a limb: Joint Extraction of Entity Mentions and Relations without Dependency Trees[18]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dy54prbR-1602121780033)(https://pic3.zhimg.com/80/v2-0fd98680c655b7b90f576ad638483996_720w.jpg)]网络结构图和标注框架

  • 联合抽取顺序:识别实体的同时进行关系抽取,不再采取依存树。

    • 实体抽取:采用BILOU标注,SoftMax解码;解码时利用前一步的label embedding信息。
    • 关系抽取:采取指针网络解码,指针网络实际上有R层(R为关系总数)。对当前实体查询在其位置前的所有实体(向前查询),并计算注意力得分:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8KLg0lmz-1602121780037)(https://pic4.zhimg.com/80/v2-cd78949b66ac4ee1b17c6651a15b4517_720w.jpg)]

  • 存在问题

    • 只向前查询head实体,会存在对tail实体的遗漏;
    • 在关系指针网络的gold标签中,对于实体span中每一个token平均分配1/N概率,没有充分利用实体边界信息,这会导致注意力分散。

6-3 Copy机制+seq2seq:Extracting Relational Facts by an End-to-End Neural Model with Copy Mechanism[19]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZmBlZ2g-1602121780038)(https://pic4.zhimg.com/80/v2-f1d7dd81ed37370ca1b71e72061d855b_720w.jpg)]

  • 联合抽取顺序:采用Seq2Seq框架,依次抽取关系、head实体、tail实体。

    • Encoder编码:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tdXwowJw-1602121780038)(https://www.zhihu.com/equation?tex=o_t%5EE%2Ch_t%5EE%3Df%28x_t%2Ch_%7Bt-1%7D%5EE%29)]

    • Decoder编码:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K4IKl8a7-1602121780038)(https://www.zhihu.com/equation?tex=o_t%5ED%2Ch_t%5ED%3Dg%28u_t%2Ch_%7Bt-1%7D%5ED%29)]

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g7lC3YfV-1602121780039)(https://www.zhihu.com/equation?tex=u_%7Bt%7D)] 为decoder部分t时刻的输入,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2rXSZN75-1602121780039)(https://www.zhihu.com/equation?tex=u_t%3D%5Bv_t%3Bc_t%5D%5Ccdot+W%5Eu)],主要有两部分组成:

        • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qdXqEsKO-1602121780039)(https://www.zhihu.com/equation?tex=c_%7Bt%7D)] 为attention vector, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mrUhLvkK-1602121780040)(https://www.zhihu.com/equation?tex=v_%7Bt%7D)] 为前一步的copy entity 或者 relation embedding;
      • 关系预测:将 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iNHIIJyZ-1602121780040)(https://www.zhihu.com/equation?tex=o_t%5EE)] 直接喂入SoftMax进行;

      • head实体预测(Copy the First Entity):

        • 在当前解码步,从n个token中选择一个作为实体:
        • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wH9vYkre-1602121780041)(https://www.zhihu.com/equation?tex=q_i%5Ee%3Dselu%28%5Bo_t%5ED%3Bo_i%5EE%5D%5Ccdot+w%5Ee%29)]为每一个token的编码,加入当前解码的输出;
        • 根据[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-At3p0tEu-1602121780041)(https://www.zhihu.com/equation?tex=p%5Ee%3Dsoftmax%28%5Bq%5Ee%3Bq%5E%7BNA%7D%5D%29)]从n个token中选择最大概率的token作为实体;
      • tail实体预测(Copy the Second Entity)

        • 与head实体预测类似,只是需要mask上一步预测的head实体(token)
  • 存在问题:

    • 只考虑token维度的实体,丢失了多个token构成的实体,这是一个明显bug;

6-4 多头选择机制+sigmoid:Joint entity recognition and relation extraction as a multi-head selection problem[20]

img网络结构

本篇文献应用较为广泛,与3-3的文献[15]十分类似,只是不再提供实体信息、需要对实体进行预测。

  • 联合抽取顺序:先抽取实体,再利用实体边界信息进行关系抽取。

    • 实体抽取:采用BILOU标注,CRF解码;

    • 关系抽取:采用sigmoid进行多头选择,与文献[15]的做法类似。

      • 对于含n个token的句子,可能构成的关系组合共有 [公式] 个,其中r为关系总数,即当前token会有多个头的关系组合:

img

      • 该方法并没有像文献[15]分别构建head和tail实体编码,而是直接通过token的编码表示进入sigmoid layer直接构建「多头选择」。
      • 引入实体识别后的entity label embedding进行关系抽取,训练时采用gold label,推断时采用predict label。
      • 在三元组统一解码时,需要利用实体边界信息组建三元组,因为多头选择机制只能知道token和token之间的关系,但并不知道token隶属的实体类别。
    • 存在问题:

      • entity label embedding在训练和推断时存在gap,文献[21]提出了Soft Label Embedding ,并引入了BERT。
      • 鲁棒泛化问题:原作者在文献[22]引入了对抗训练机制(如今看来,这种对抗训练机制比较简单了)

6-5 SPO问题+指针网络,Joint Extraction of Entities and Relations Based on a Novel Decomposition Strategy [23]

img

  • 联合抽取顺序:是一个spo问题,先抽取实体(主体subject,简称s),再抽取关系(关系predicate及其对应的客体object,简称po)。

    • 如上图所示,主体抽取包含「Trump」和「Queens」,然后基于已抽取的主体再进行po抽取。例如对于「Trump」,其对应的关系包含「PO」-「United States」和「BI」-「Queens」;可以看出「Queens」既可以作为subject,也可以是object。

img网络结构图

  • 主体(s)抽取:采用指针网络进行解码。

  • 关系和客体(po)抽取:同样采用指针网络进行解码,但事实上采用的是Q2中提到的多层label指针网络,即每一层是一个关系label对应的指针网络(用来抽取object)。

    • 在对当前的subject抽取对应的po时,采取多种方式加强了对当前subject的实体感知方式,如sentence pooling 、entity pooling、relative position embedding等;在对object的end pos 解码时也引入start pos的编码信息。
  • 存在问题

    • 在训练时,subject的选择是随机的,并没有将所有subject统一进行po抽取;没有充分利用信息,可能造成信息损失,因此需要延长epoch训练。

6-6 多轮对话+强化学习 :*Entity-Relation Extraction as Multi-Turn Question Answering*[24]

img多轮对话设计-实体关系抽取

  • 联合抽取顺序:基于人工设计的QA模板,先提取实体,再抽取关系。

    • 文献指出通常的三元组形式存在问题,并不能充分反应文本背后的结构化信息[25]:如上图的结构化表格,TIME需要依赖Position,Position需要依赖Corp(公司)。进行传统的三元组抽取可能导致依赖关系的间断,因此这种多轮QA方式[25]

      • 能够很好地捕捉层级化的依赖关系。
      • 问题能够编码重要的先验关系信息,对实体/关系抽取有所帮助。
      • 问答框架是一种很自然的方法来同时提取实体和关系。
    • 将联合抽取转为一种对轮问答任务[25]:对每种实体和每种关系都用问答模板进行刻画,从而这些实体和关系可以通过回答这些模板化的问题来进行抽取,采取BIES标注实体,MRC+CRF进行解码(与文献[5]一脉相承,只是不再使用指针网络,而是CRF)。

  • 强化学习:

    • 笔者在前面已经指出,基于共享参数的联合学习仍然不能完全避免在推断时的误差积累,这篇文献采用强化学习机制进行优化。
    • 在多轮QA中[25],Action就是选择一个文本段,Policy就是选择该文本段的概率。对于Reward,使用正确抽取的三元组的数量作为奖励,使用REINFORCE算法寻找最优解。
  • 存在问题

    • 也许针对三元组形式不能体现文本结构化信息的任务是有一定必要性的,如关系依赖问题。但对于通常的三元组任务,引入question需要对原始文本进行多次编码才能抽取实体和关系,计算复杂度较高。

6-7 片段排列: Span-Level Model for Relation Extraction[7]

  • 联合抽取顺序:片段排列抽取实体,然后提取实体对进行关系分类;

    • 将片段排列方式生成的候选实体span,进行实体类型SoftMax分类;对于候选实体span不为None的实体span组成实体pair进行关系SoftMax分类;
    • 笔者在前文介绍实体重叠问题时,已经介绍了这种基于片段排列的方式,基于片段排列的方式[7],显示的提取所有可能的片段排列,由于选择的每一个片段都是独立的,因此可以直接提取span-level的特征去解决重叠实体问题。
    • 实体span的编码表示:在span范围内采取注意力机制与基于原始输入的LSTM编码进行交互。
  • 存在问题

    • 对于含T个token的文本,理论上共有 [公式] 种片段排列,计算复杂度极高。如果文本过长,会产生大量的负样本,在实际中需要限制span长度并合理削减负样本。
    • 进行关系判断时,也会造成实体冗余,提高错误率。

6-8 片段排列:SpERT:Span-based Joint Entity and Relation Extraction with Transformer Pre-training [26]

imgSpERT

  • 联合抽取顺序:在输出端进行片段排列进行实体分类,然后进行关系分类。

    • 与6-7[7]类似,但采取BERT编码表示,在BERT最后输出的hidden层根据候选的实体span进行实体分类,过滤实体类型为None的片段然后进行关系分类。
    • 进行关系分类时,融合多种特征组合:包含实体span的pooling,实体span长度,实体pair之间token的pooling;
  • 存在问题

    • 虽然缓解了片段排列的高复杂度问题,但关系分类仍有实体冗余问题。

Q7:介绍基于联合解码的联合抽取方法?

在Q6中的基于共享参数的联合抽取的方法中,并没有显式地刻画两个任务之间的交互,同样训练和推断仍然存在gap。

为了加强两个子模型之间的交互,一些联合解码算法被提出[16]:文献[27]提出使用整数线性规划(ILP)对实体模型和关系模型的预测结果进行强制约束。文献[28]利用条件随机场(CRF)同时建模实体和关系模型,并通过维特比解码算法得到实体和关系的输出结果。文献 [29]将实体关系抽取看为一个结构化预测问题,采用结构化感知机算法,设计了全局特征,并使用集束搜索进行近似联合解码。文献[30]提出使用全局归一化(Global Normalization)解码算法。文献 [31] 针对实体关系抽取设计了一套转移系统(Transition System),从而实现联合实体关系抽取。由于篇幅限制,对上述文献感兴趣的读者可以详细参考原文。

下面笔者介绍3种易于应用的统一实体和关系标注框架的联合解码方法。

7-1 Joint extraction of entities and relations based on a novel tagging scheme[32]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-081g0Lxn-1602121780045)(https://pic3.zhimg.com/80/v2-e141cdbea67ee818a0b737f32901c5fe_720w.jpg)]

  • 总体标注框架

    • 统一了实体和关系标注框架,直接以关系标签进行BIOES标注。head实体序号为1,tail实体序号为2;
  • 存在问题:

    • 不能关系重叠问题,比如一个实体存在于多种关系中的情况。这是一个致命的bug。

7-2 Joint Extraction of Entities and Overlapping Relations Using Position-Attentive Sequence Labeling [33]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fIP8L0wQ-1602121780046)(https://pic2.zhimg.com/80/v2-35b5c97045e6a21e46d0a19b63f18a2d_720w.jpg)]

  • 总体标注框架:如上图所示,对于含n个token的句子,共有n个不同标注框架。也就是对于每一个位置的token都进行一次标注,无论实体还是关系都采用BIES标注。

    • 当p=5指向第5个token「Trump」时,其对应的实体为「PER」,此时p=5对应的标签实体有「United States」、「Queens」、「New York City 」,分别对应关系「President of」、「 Born in」、「Born in」.
    • 本质上将实体和关系融合为一体,共同采用BIES标注,用CRF解码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lrV2O7H-1602121780046)(https://pic4.zhimg.com/80/v2-a282cabaca78ffafd972ba29ce0fcaab_720w.jpg)]

    • 实体关系提取时,对当前指向位置的实体采用position attention 机制进行识别对应的关系实体,该机制融合了 position-aware 和 context-aware 表示:其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S6Ld9Cy9-1602121780047)(https://www.zhihu.com/equation?tex=h_%7Bp%7D)] 为当前指示的token位置编码, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4uNwJkKs-1602121780047)(https://www.zhihu.com/equation?tex=h_%7Bj%7D)] 为上下文编码, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WO0XAIyN-1602121780047)(https://www.zhihu.com/equation?tex=h_%7Bt%7D)] 为当前解码位置的编码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjRhCTpz-1602121780048)(data:image/svg+xml;utf8, )]

  • 存在问题:对一个句子进行了n次重复编码,复杂度高, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wSH2qLR8-1602121780048)(https://www.zhihu.com/equation?tex=o%28n%5E2%29)]

7-3 Joint extraction of entities and relations based on a novel tagging scheme[34]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0DomPOU3-1602121780049)(https://pic3.zhimg.com/80/v2-a718849385b5a804f10f73bb962241c2_720w.jpg)]

  • 总体标注框架:这个方法来自PaddlePaddle/Research,也是百度2020关系抽取的baseline方法,同样也是统一了实体和关系的SPO标注框架。(SPO问题可参考前文的6-5

    • 使用方法的是token level 的多label分类,即每一个token对应多个label。

    • 标注框架十分巧妙,如上图示例中形成的2个spo三元组,「王雪纯-配音-晴雯」和「王雪纯-配音-红楼梦」,存在两个关系「配音-人物」和「配音-作品」,多label标签就以关系标签建立:

      • 假设一共存在R个关系,那label一共为(2*R+2个),如果是subject中的第一个token,则标记为「B-S-关系名称」;如果是object中的第一个token,则标记为「B-O-关系名称」;其余的实体token标记为「I」,不隶属于实体的token标记为「O」;
      • 如对于subject王雪纯中,「王」隶属于两个「B-S-配音-作品」和「B-S-配音-人物」;其余的「雪」「纯」用「I」来标注;
      • 如对于object红楼梦中「红」隶属于「B-O-配音-作品」;其余的「楼」「梦」用「I」来标注;
      • 如对于object晴雯中「晴」隶属于「B-O-配音-人物」;其余的「雯」用「I」来标注;
  • 存在问题:

    • 上述标注框架还是无法直接解决一些包含实体重叠的关系抽取?

      • 如:《叶圣陶散文选集》中,叶圣陶-作品-叶圣陶散文选集;
    • 上述标注框架也无法直接解决一个句子中的多重同类关系:

      • 如,‘张学友《吻别》周杰伦《菊花台》梁静茹《吻别》’等,需要加入后处理逻辑。

总结:上述统一实体和关系标注框架虽然不能完全解决关系重叠等问题,但在特定场景下,引入一些后处理规则进行约束,这种方式简单明了、易于迭代维护。

Q8:实体关系抽取的前沿技术和挑战有哪些?如何解决低资源和复杂样本下的实体关系抽取?如何应用图神经网络?

在前文中,笔者叙述了pipeline和联合抽取中的一些实体关系抽取方法,其中面临的挑战,笔者初步总结如下并给出一点建议:

1、对于pipeline方法中的NER来说:

虽然很多方法已经很普及,但更需要关注复杂场景下的实体重叠问题;此外,对于NER问题其实应用很广,在很多性能敏感的场景下,使用深度学习的方法似乎不能满足要求,这时就需要我们采取「词典+规则」的方法,例如:

  • 对于医疗场景中的很多实体歧义性并不强,对上下文也不够敏感,这时构建出一个针对目标实体的词表更为有效。
  • 对于通用领域中歧义性的实体,是否可以采用多种分词方式和句法分析等融合的方法去寻找实体边界呢?这都值得我们进一步尝试。

此外,应用解决NER的方法是否可以解决一些事件段落切割问题,方便我们将复杂任务进行拆解。

2、对于pipeline方法中的关系分类来说:

首要问题是怎么降低计算复杂度,关系分类时不再对句子重复编码,而是one-pass。

在低资源场景下,采取远程监督的方法确实可以自动进行语料构建,但其中针对样本噪音的降噪方法是否还有提升空间?降噪方法能否做到与模型无关,是否可以借鉴图像分类中很有效的置信学习[35]呢?

此外,预训练语言模型如此火爆,针对关系分类任务,能否在预训练阶段引入更有效的关系分类的目标呢?如前文提到的文献[13]

3、对于联合抽取任务来说:

难点是如何加强实体模型和关系模型之间的交互,怎么对需要对子模型特征的丰富性以及联合解码的精确性之间做权衡?

此外,很多方法再进行实体抽取时并没有直接用到关系的信息,然而这种信息是很重要的。需要一个方法可以同时考虑一个句子中所有实体、实体与关系、关系与关系之间的交互

引入图神经网络是否能够解决关系与关系之间的交互呢?由于篇幅原因,本文不再赘述。感兴趣的读者可以参考ACL2019中的系列文献[36][37][38][39]

4、对于低资源问题复杂样本问题来说:

在刘知远老师的《知识图谱从哪里来:实体关系抽取的现状与未来》[40]一文中,详细叙述了这方面的问题:

  • 对于少次关系学习问题:他们提出了FewRel 2.0[41],在原版数据集FewRel的基础上增加了以下两大挑战:领域迁移(domain adaptation)和“以上都不是”检测(none-of-the-above detection)。
  • 对于文档级别的关系抽取问题:提出了DocRED数据集[42],是一个大规模的人工标注的文档级关系抽取数据集,文档级关系抽取任务要求模型具有强大的模式识别、逻辑推理、指代推理和常识推理能力[40]

此外,如何引入将低资源问题的解决方案引入实体关系抽取中是一个值得探讨的问题,如主动学习、迁移学习(领域自适应、跨语言问题)、元学习、半监督学习等;还有怎么解决不平衡数据下的关系抽取?一些顶会的系列文献[43][44][45][46][47][48]也做了一些尝试,感兴趣的读者可以参考。

笔者注:对于NLP中的低资源问题、复杂样本问题、数据质量问题等,我们将在《高能NLP之路》专栏的下一篇文章中进行详细介绍,希望大家关注。

彩蛋:百度2020关系抽取比赛的baseline可以采取哪些方法?

除了百度官方给出的baseline[34],大家可以参考前文提及的[20][23]

写在最后

由于篇幅有限,并为给读者更好的阅读体验,本文删减了大量对模型内部的解读,更为细节的请阅读原文。

  • 如需下载本篇文档,可以到我的github下载。
  • 如有错误,请指正。
  • 未经允许,不得转载。

参考

  1. ^Hierarchically-Refined Label Attention Network for Sequence Labeling https://arxiv.org/pdf/1908.08676.pdf
  2. ^Chinese NER Using Lattice LSTM https://arxiv.org/pdf/1805.02023.pdf
  3. 16(https://zhuanlan.zhihu.com/p/77868938#ref_3_0)bNeural Architectures for Nested NER through Linearization
  4. ^Nested named entity recognition revisited.
  5. 17(https://zhuanlan.zhihu.com/p/77868938#ref_5_0)bA Unified MRC Framework for Named Entity Recognition https://arxiv.org/pdf/1910.11476.pdf
  6. ^https://zhuanlan.zhihu.com/p/89019478
  7. 18(https://zhuanlan.zhihu.com/p/77868938#ref_7_0)bcdSpan-Level Model for Relation Extraction https://www.aclweb.org/anthology/P19-1525.pdf
  8. 19(https://zhuanlan.zhihu.com/p/77868938#ref_8_0)bDistant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks. EMNLP
  9. ^Selective Attention over Instances (Lin 2016)
  10. ^Relation Extraction with Multi-instance Multi-label Convolutional Neural Networks.
  11. ^Distant Supervision for Relation Extraction with Sentence-Level Attention and Entity Descriptions
  12. ^Reinforcement Learning for Relation Classification from Noisy Data
  13. 20(https://zhuanlan.zhihu.com/p/77868938#ref_13_0)bcMatching the Blanks: Distributional Similarity for Relation Learning https://arxiv.org/pdf/1906.03158.pdf
  14. 21(https://zhuanlan.zhihu.com/p/77868938#ref_14_0)bExtracting Multiple-Relations in One-Pass with Pre-Trained Transformers
  15. 22(https://zhuanlan.zhihu.com/p/77868938#ref_15_0)bcdSimultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction https://www.aclweb.org/anthology/N18-1080.pdf
  16. 23(https://zhuanlan.zhihu.com/p/77868938#ref_16_0)bc基于深度学习的联合实体关系抽取 http://www.czsun.site/publications/thesis.pdf
  17. ^End-to-End Relation Extraction using LSTMs on Sequences and Tree Structures https://www.aclweb.org/anthology/P16-1105.pdf
  18. ^Going out on a limb: Joint Extraction of Entity Mentions and Relations without Dependency Trees https://pdfs.semanticscholar.org/bbbd/45338fbd85b0bacf23918bb77107f4cfb69e.pdf?_ga=2.119149259.311990779.1584453795-1756505226.1584453795
  19. ^Extracting Relational Facts by an End-to-End Neural Model with Copy Mechanism
  20. 24(https://zhuanlan.zhihu.com/p/77868938#ref_20_0)bJoint entity recognition and relation extraction as a multi-head selection problem
  21. ^BERT-Based Multi-Head Selection for Joint Entity-Relation Extraction
  22. ^Adversarial training for multi-context joint entity and relation extraction
  23. 25(https://zhuanlan.zhihu.com/p/77868938#ref_23_0)bJoint Extraction of Entities and Relations Based on a Novel Decomposition Strategy
  24. ^Entity-Relation Extraction as Multi-Turn Question Answering https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1905.05529.pdf
  25. 26(https://zhuanlan.zhihu.com/p/77868938#ref_25_0)bcdhttps://zhuanlan.zhihu.com/p/65870466
  26. ^Span-based Joint Entity and Relation Extraction with Transformer Pre-training https://arxiv.org/pdf/1909.07755.pdf
  27. ^Joint inference for fine-grained opinion extraction
  28. ^Investigating lstms for joint extraction of opinion entitiesandrelations.
  29. ^Incremental joint extraction of entity mentions and relations.
  30. ^End-to-end neural relation extrac- tion with global optimization.
  31. ^Jointextractionofentities and relations based on a novel graph scheme
  32. ^Joint extraction of entities and relations based on a novel tagging scheme. https://arxiv.org/pdf/1706.05075.pdf
  33. ^Joint Extraction of Entities and Overlapping Relations Using Position-Attentive Sequence Labeling
  34. 27(https://zhuanlan.zhihu.com/p/77868938#ref_34_0)bhttps://github.com/PaddlePaddle/Research/tree/master/KG/DuIE_Baseline
  35. ^Confident Learning: Estimating Uncertainty in Dataset Labels
  36. ^Graph Neural Networks with Generated Parameters for Relation
  37. ^GraphRel: Modeling Text as Relational Graphs for Joint Entity and Relation Extraction
  38. ^Attention Guided Graph Convolutional Networks for Relation Extraction
  39. ^Joint Type Inference on Entities and Relations via Graph Convolutional Networks
  40. 28(https://zhuanlan.zhihu.com/p/77868938#ref_40_0)bhttps://www.zhihu.com/search?type=content&q=%E5%85%B3%E7%B3%BB%E6%8A%BD%E5%8F%96
  41. ^ FewRel 2.0: Towards More Challenging Few-Shot Relation Classification
  42. ^DocRED: A Large-Scale Document-Level Relation Extraction Dataset
  43. ^Knowledge-Augmented Language Model and its Application to Unsupervised Named-Entity Recognition
  44. ^Description-Based Zero-shot Fine-Grained Entity Typing
  45. ^Zero-Shot Entity Linking by Reading Entity Descriptions
  46. ^Multi-Level Matching and Aggregation Network for Few-Shot Relation Classification
  47. ^Exploiting Entity BIO Tag Embeddings and Multi-task Learning for Relation Extraction with Imbalanced Data
  48. ^Massively Multilingual Transfer for NER

21. 如何理解序列到序列模型?

序列到序列特点

1.输入输出时不定长的。比如说想要构建一个聊天机器人,你的对话和他的回复长度都是不定的。

3.输入输出元素之间是具有顺序关系的。不同的顺序,得到的结果应该是不同的,比如“不开心”和“开心不”这两个短语的意思是不同的。

编码器

通信领域,编码器(Encoder)指的是将信号进行编制,转换成容易传输的形式。

而在这里,主要指的是将句子编码成一个能够映射出句子大致内容的固定长度的向量

解码器

解码器(Decoder),这里就是将由编码器得到的固定长度的向量再还原成对应的序列数据,一般使用和编码器同样的结构,也是一个RNN类的网络。

实际操作过程会将由编码器得到的定长向量传递给解码器,解码器节点会使用这个向量作为隐藏层输入和一个开始标志位作为当前位置的输入。得到的输出向量能够映射成为我们想要的输出结果,并且会将映射输出的向量传递给下一个展开的RNN节点。

每一次展开,会使用上一个节点的映射输出所对应的向量来投入到下一个输入中去,直到遇到停止标志位,即停止展开。

22.序列到序列模型有什么限制吗?

23.如果不采用序列到序列模型,可以考虑用其它模型方法吗?

24. 如何理解词向量?

25. 词向量哪家好?

26. 解释一下注意力机制的原理?

27.注意力机制是不是适用于所有场景呢?它的鲁棒性如何?

28. 怎么将原有的模型加上注意力机制呢?

29. 通俗地解释一下词法分析是什么?有什么应用场景?

30.深度学习中的词法分析有哪些常见模型呢?

31. 通俗地解释一下知识图谱是什么?有什么应用场景?

32. 深度学习中的知识图谱有哪些常见模型呢?

33. 深度学习中的机器翻译有哪些常见模型呢?

34. 机器翻译的通俗实现以及部署过程是怎样的呢?

35. 通俗地解释一下文本情感分析是什么?常见的应用场景是?

36. 最常用的情感分析模型是什么呢?如何快速部署呢?

37. 通俗地解释一下问答系统?它涵盖哪些领域?常见的应用场景是?

38. 常见的问答系统模型是什么?如何快速部署呢?

39. 图像文字生成是什么?它的技术原理是什么?

40.常见的图像文字生成模型是什么?

41. NLP 的无监督学习发展动态是怎样的?有哪些领域在尝试无监督学习?

42. NLP 和强化学习的结合方式是怎样的?有哪些方向在尝试强化学习?

43. NLP 和元学习?元学习如何能够和 NLP 结合起来?

44. 能说一下各自领域最常用且常见的基准模型有哪些吗?

45、LSTM中各模块分别使用什么激活函数,可以使用别的激活函数吗?

关于激活函数的选取。在LSTM中,遗忘门、输入门、输出门使用Sigmoid函数作为激活函数;在生成候选记忆时,使用双曲正切函数Tanh作为激活函数。

值得注意的是,这两个函数都是饱和的,即在输入达到一定值的情况下,输出不会发生明显变化。如果是非饱和的激活函数,比如ReLU,那么就难以实现门控的效果。

Sigmoid函数的输出在0~1之间,符合门控的物理意义。且当输入较小或较大时,其输出会非常接近0或1,从而保证该门开或关。

在生成候选记忆时,使用Tanh函数,因为其输出在-1~1之间,这与大多数场景下特征分布是0中心的吻合。此外,Tanh在输入为0的附近比Sigmoid有更大梯度,通常使模型收敛更快。

激活函数选取不是一成不变的,例如在原始LSTM中,使用的是Sigmoid函数的变种,h(x)=2sigmoid(x)−1,g(x)=4sigmoid(x)−2h(x)=2sigmoid(x)-1,g(x)=4sigmoid(x)-2h(x)=2sigmoid(x)−1,g(x)=4sigmoid(x)−2,这两个函数的范围分别是[-1,1]和[-2,2]。后来发现效果并不如sigmoid。
  实际上在门控中,使用Sigmoid几乎是现代所有神经网络模块的共同选择。例如在GRU和Attention机制中,也采用Sigmoid作为门控激活函数。
  在计算能力有限制的设备中,由于Sigmoid函数求指数需要一定的计算量,此时会使用0/1门控输出为0或1的离散值。即当输入小于阈值,门控输出为0;大于阈值时,输出为1。

46.什么是Seq2Seq模型?Seq2Seq有哪些优点?

Seq2Seq,全称Sequence to Sequence模型。称为序列到序列模型。大致意思是将一个序列信息,通过编码和解码生成一个新的序列模型。通常用于机器翻译、语音识别、自动对话等任务。

在Seq2Seq模型之前,深度神经网络所擅长的问题中,输入和输出都可以表示为固定长度的向量,如果长度稍有变化,会使用补零等操作。然而对于前面的任务,其序列长度实现并不知道。如何突破这个局限,Seq2Seq应运而生。

Seq2Seq的核心思想在于通过深度神经网络将一个输入的序列映射为一个作为输出的序列。

这一个过程由编码输入和解码输出两个环节组成。在经典的实现中,编码器和解码器各由一个循环神经网络组成,既可以选择传统RNN,也可以选择LSTM、GRU等。在Seq2Seq中,两个模型是共同训练的。

假想一个复习和考试的场景,我们将学到的历史信息经过一系列加工整理,形成了知识体系,这就是编码过程。然后在考试的时候,将高度抽象的知识应用到系列问题中进行求解,这就是解码过程。

Seq2Seq经典结构在这里插å¥å›¾ç‰‡æè¿°

在机器翻译过程中,如上图所示,输入是一个源语言的句子。有三个单词A、B、C,编码器依次读入A、B、C和结束符 。解码第一步,读入编码器最终状态,生成第一个目标语言单词W,第二步读入第一步的输出W,生成第二个单词X,如此循环,知道输出结束符.输出的序列W、X、Y、Z就是翻译后目标语言的句子。

在文本摘要任务中,输入序列是长句子或段落,输出序列是摘要短句。在图像描述文本生成任务中,输出是图像经过视觉网络后的特征,输出序列是图像描述短句。语言识别中输入序列是音频信号,输出序列是识别出的文本。不同场景下,编码器和解码器有不同的设计,但对应的Seq2Seq底层结构基本相似。
  Seq2Seq优点在于可以处理变长序列。

二、.Seq2Seq模型在解码时,有哪些常用的方法?
Seq2Seq模型最核心的部分在于解码部分,大量的改进也是基于解码环节。Seq2Seq模型最基础的解码方法是贪心法:即选取一种度量标准后,每次都在当前状态下选择最佳的一个结果,直到结束。贪心法计算代价低,适合作为基准结果与其他方法比较。显然贪心法获得的是一个局部最优解,往往并不能取得最好的效果。

集束搜索是常见改进算法,它是一种启发式算法。该方法会保存beam size个当前的较佳选择。解码的时候每一步根据当前的选择进行下一步扩展和排序,接着选择前beam size个进行保存,循环迭代,直到结束时选择一个最佳的作为编码的结果。在这里插å¥å›¾ç‰‡æè¿°

上图中beam size为2。当前有解码得到的两个候选:I和My。然后输入解码器,得到一系列候选序列。显然,如果beam size取1,退化为贪心算法。b越大,搜索空间越大,效果会有所提升,但计算量也相应增大。实际上beam size需要取一个折中范围:8~12.

常见的改进方法还有:

解码时使用堆叠RNN
增加Dropout机制
与编码器建立残差连接
加入注意力机制(解码时每一步有针对的关注当前有关编码结果)
加入记忆网络(从外部获取知识)

47. Seq2Seq模型加入注意力机制是为了解决什么问题?为什么选用了双向循环神经网络?

人脑的注意力机制本质上是一种注意力资源分配的模型,比如说我们在阅读一篇论文的时候,在某个特定时刻注意力肯定只会在某一行文字描述,在看到一张图片时,我们的注意力肯定会聚焦于某一局部。随着我们的目光移动,我们的注意力肯定又聚焦到另外一行文字,另外一个图像局部。所以,对于一篇论文、一张图片,在任意一时刻我们的注意力分布是不一样的。这便是著名的注意力机制模型的由来。早在计算机视觉目标检测相关的内容学习时,我们就提到过注意力机制的思想,目标检测中的 Fast R-CNN 利用 RoI(兴趣区域)来更好的执行检测任务,其中 RoI 便是注意力模型在计算机视觉上的应用。

注意力模型的使用更多是在自然语言处理领域,在机器翻译等序列模型应用上有着更为广泛的应用。在自然语言处理中,注意力模型通常是应用在经典的 Encoder-Decoder 框架下的,也就是 RNN 中著名的 N vs M 模型,seq2seq 模型正是一种典型的 Encoder-Decoder 框架。在这里插å¥å›¾ç‰‡æè¿°

Encoder-Decoder 作为一种通用框架,在具体的自然语言处理任务上还不够精细化。换句话说,单纯的Encoder-Decoder 框架并不能有效的聚焦到输入目标上,这使得像 seq2seq 的模型在独自使用时并不能发挥最大功效。比如说在上图中,编码器将输入编码成上下文变量 C,在解码时每一个输出 Y 都会不加区分的使用这个 C 进行解码。而注意力模型要做的事就是根据序列的每个时间步将编码器编码为不同 C,在解码时,结合每个不同的 C 进行解码输出,这样得到的结果会更加准确

比如,在不运用注意力机制的情况下:
统一编码为 C:在这里插å¥å›¾ç‰‡æè¿°

使用统一的 C 进行解码:在这里插å¥å›¾ç‰‡æè¿°

在应用了注意力模型之后,每个输入会被独立编码,解码时就会有各自对应的 c 进行解码,而不是简单的一刀切:在这里插å¥å›¾ç‰‡æè¿°

相应的,原先的 Encoder-Decoder 框架在引入了注意力机制后就变成了如下结构:****在这里插å¥å›¾ç‰‡æè¿°

在实际任务(机器翻译)中使用Seq2Seq,通常会先使用一个RNN作为编码器,将输入序列(源语言句子的词向量序列)编码成一个向量表示 ,然后再使用一个RNN解码,从该向量表示中解码得到输出序列(目标语言句子的词序列)。

在Seq2Seq中,当前隐状态以及上一个输出词决定了当前输出词。即在这里插å¥å›¾ç‰‡æè¿°

实际使用中,随着输入序列长度的增加,模型性能显著下降。因为编码时输入序列的全部信息被压缩到一个向量表示中去。序列越长,句子越前面的词的信息丢失就越严重。以100词的句子为例,编码时将整个句子的信息压缩到一个向量中去,而在解码时(比如翻译),目标语言第一个单词大概率与源语言第一个单词对应,这就意味着第一步的解码需要考虑到100步之前的信息。在这里插å¥å›¾ç‰‡æè¿°
  一个小技巧是可以将源语言句子逆向输入,或者重复输入两遍,得到一定的提升,也可以使用LSTM缓解这个问题。但对于过长序列仍难以有很好表现。此外Seq2Seq的输出序列通常会损失部分输入序列信息,因为解码时丢失了当前词与对应源语言词的上下文信息和位置信息。

48.知道哪些命名实体识别算法?具体的优缺点?

命名实体识别(Named EntitiesRecognition, NER)是自然语言处理(Natural LanguageProcessing, NLP)的一个基础任务。其目的是识别语料中人名、地名、组织机构名等命名实体。由于这些命名实体数量不断增加,通常不可能在词典中穷尽列出,且其构成方法具有各自的一些规律性,因而,通常把对这些词的识别从词汇形态处理(如汉语切分)任务中独立处理,称为命名实体识别。命名实体识别技术是信息抽取、信息检索、机器翻译、问答系统等多种自然语言处理技术必不可少的组成部分。

命名实体是命名实体识别的研究主体,一般包括3大类(实体类、时间类和数字类)和7小类(人名、地名、机构名、时间、日期、货币和百分比)命名实体。评判一个命名实体是否被正确识别包括两个方面:实体的边界是否正确;实体的类型是否标注正确。主要错误类型包括文本正确,类型可能错误;反之,文本边界错误,而其包含的主要实体词和词类标记可能正确。

命名实体识别的主要技术方法分为:基于规则和词典的方法、基于统计的方法、二者混合的方法等。

  • 基于规则和词典的方法
    基于规则的方法多采用语言学专家手工构造规则模板,选用特征包括统计信息、标点符号、关键字、指示词和方向词、位置词(如尾字)、中心词等方法,以模式和字符串相匹配为主要手段,这类系统大多依赖于知识库和词典的建立。基于规则和词典的方法是命名实体识别中最早使用的方法,一般而言,当提取的规则能比较精确地反映语言现象时,基于规则的方法性能要优于基于统计的方法。但是这些规则往往依赖于具体语言、领域和文本风格,编制过程耗时且难以涵盖所有的语言现象,特别容易产生错误,系统可移植性不好,对于不同的系统需要语言学专家重新书写规则。基于规则的方法的另外一个缺点是代价太大,存在系统建设周期长、移植性差而且需要建立不同领域知识库作为辅助以提高系统识别能力等问题。

  • 基于统计的方法
    基于统计机器学习的方法主要包括:隐马尔可夫模型(HiddenMarkovMode,HMM)、最大熵(MaxmiumEntropy,ME)、支持向量机(Support VectorMachine,SVM)、条件随机场( ConditionalRandom Fields,CRF)等。

在这4种学习方法中,最大熵模型结构紧凑,具有较好的通用性,主要缺点是训练时间复杂性非常高,有时甚至导致训练代价难以承受,另外由于需要明确的归一化计算,导致开销比较大。而条件随机场为命名实体识别提供了一个特征灵活、全局最优的标注框架,但同时存在收敛速度慢、训练时间长的问题。一般说来,最大熵和支持向量机在正确率上要比隐马尔可夫模型高一些,但是隐马尔可夫模型在训练和识别时的速度要快一些,主要是由于在利用Viterbi算法求解命名实体类别序列的效率较高。隐马尔可夫模型更适用于一些对实时性有要求以及像信息检索这样需要处理大量文本的应用,如短文本命名实体识别。

基于统计的方法对特征选取的要求较高,需要从文本中选择对该项任务有影响的各种特征,并将这些特征加入到特征向量中。依据特定命名实体识别所面临的主要困难和所表现出的特性,考虑选择能有效反映该类实体特性的特征集合。主要做法是通过对训练语料所包含的语言信息进行统计和分析,从训练语料中挖掘出特征。有关特征可以分为具体的单词特征、上下文特征、词典及词性特征、停用词特征、核心词特征以及语义特征等。

基于统计的方法对语料库的依赖也比较大,而可以用来建设和评估命名实体识别系统的大规模通用语料库又比较少。

  • 混合方法
    自然语言处理并不完全是一个随机过程,单独使用基于统计的方法使状态搜索空间非常庞大,必须借助规则知识提前进行过滤修剪处理。目前几乎没有单纯使用统计模型而不使用规则知识的命名实体识别系统,在很多情况下是使用混合方法:

统计学习方法之间或内部层叠融合
规则、词典和机器学习方法之间的融合,其核心是融合方法技术
将各类模型、算法结合起来,将前一级模型的结果作为下一级的训练数据,并用这些训练数据对模型进行训练,得到下一级模型。
NER研究进展的大概趋势

在基于机器学习的方法中,NER被当作序列标注问题。利用大规模语料来学习出标注模型,从而对句子的各个位置进行标注。输入是一段序列,预测其中每个单词的标签(是不是命名实体,是哪种实体)。NER 任务中的常用模型包括生成式模型HMM、判别式模型CRF等。其中条件随机场是NER目前的主流模型。ÏÏ它的目标函数不仅仅考虑输入的状态特征函数,而且还包含标签转移特征函数。在训练时可以采用SGD学习模型参数。在已知模型,给定输入序列,预测输出序列也就是求使目标函数最大化的最优序列,是一个动态规划问题,可以使用Viterbi算法解码求得最优标签序列。CRF的优点在于其为一个序列进行标注的过程中充分利用内部及上下文特征信息。

随着词的分布式表示(wordembedding)的提出,神经网络可以有效处理许多NLP任务。这类方法对于序列标注任务(POS、NER)的处理方法是相似的:将token从离散one-hot表示映射到低维空间中成为稠密的embedding,随后将句子的embedding序列输入到RNN中,用神经网络自动提取特征,Softmax来预测每个token的标签。

缺点在于对每个token打标签的过程是独立的进行,不能直接利用上文已经预测的标签(只能靠隐含状态传递上文信息),进而导致预测出来的标签可能会是无效的。

学界提出了DL-CRF模型做序列标注。在神经网络的输出层接入CRF层(重点是利用标签转移概率)来做句子级别的标签预测,使得标注过程不再是对各个token独立分类。

BiLSTM-CRF模型

应用于NER中的biLSTM-CRF模型主要由Embedding层(主要有词向量,字向量以及一些额外特征),双向LSTM层,以及最后的CRF层构成。实验结果表明biLSTM-CRF已经达到或者超过了基于丰富特征的CRF模型,成为目前基于深度学习的NER方法中的最主流模型。在特征方面,该模型继承了深度学习方法的优势,无需特征工程,使用词向量以及字符向量就可以达到很好的效果,如果有高质量的词典特征,能够进一步获得提高。

49.如何对中文分词问题用隐马尔可夫模型进行建模和训练?

在这里插å¥å›¾ç‰‡æè¿°

HMM![在这里插å

¥å›¾ç‰‡æè¿°](https://img-blog.csdnimg.cn/20200412220204659.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk3OTk0MQ==,size_16,color_FFFFFF,t_70)在这里插å¥å›¾ç‰‡æè¿°åœ¨è¿™é‡Œæ’å¥å›¾ç‰‡æè¿°

50.最大熵隐马尔可夫模型为什么会产生标注偏置问题,如何解决?

在这里插å¥å›¾ç‰‡æè¿°

在这里插å¥å›¾ç‰‡æè¿°

在这里插å¥å›¾ç‰‡æè¿°

在这里插å¥å›¾ç‰‡æè¿°

在这里插å¥å›¾ç‰‡æè¿°

51.常见的概率图模型中,哪些是生成式模型,哪些是判别式模型?

在这里插å¥å›¾ç‰‡æè¿°

52. 使用PyTorch简要写一个RNN算法

PyTorch入门
所有的框架都是基于计算图的。计算图分为静态和动态的。静态是先先定义后执行,动态图是运行过程中被定义的。

Tensor是PyTorch中重要数据结构,可以认为是一个高维数组,可以是一个数(标量),一维数组(向量),二维数组(矩阵)或更高维数组。与numpy的区别是可以GPU加速。

  • Autograd

深度学习的本质是通过反向传播求导数。PyTorch的Autograd模块实现了自动求导功能,在Tensor上的所有操作,都能自动提供微分。

autograd.Variable是Autograd核心类,简单封装了Tensor。支持几乎所有Tensor的操作。Tensor在被封装成VAriable之后,可以调用它的.backward方法实现反向传播。

  • Variable主要包含3个属性:
    data:保存Variable所包含的Tensor
    grad:保存data对应的梯度
    grad_fn:纸箱一个function对象,用来计算梯度

from torch.autograd import Variable
x = Variable(t.ones(2,2),requires_grad = True) #使用Tensor新建一个Variable
y = x.sum()
y.backward() #反向传播计算梯度
x.grad() #查看梯度值
神经网络

torch.nn是专门为神经网络设计的模块化接口。nn构建与Autograd之上,可以用来定义和运行神经网络。nn.Module是nn中最重要的类,可以看做是一个网络的封装,包含各层网络的定义及forward方法。

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
def init(self):
super(Net,self).init()
self.conv1 = nn.Conv2d(1,6,5)
self.conv2 = nn.Conv2d(6,16,5)
self.fc1 = nn.Linear(1655,120)
self.fc2 = nn.Linear(120,84)
self.fc3 = nn.Linear(84,10)
def forword(self,x):
x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
x = F.max_pool2d(F.relu(self.conv2(x)),2)
x = x.view(x.size()[0],-1)
x = x.relu(self.fc1(x))
x = x.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
只要在nn.Module子类中定义了forward函数,backward函数就会被自动实现(利用Autograd).在forward函数中可以使用任何Variable支持的函数。forward函数的输入和输出都是Variable,只有Variable才具有自动求导功能。输入时需要将Tensor封装为Variable。

损失函数及优化器

nn实现了神经网络中大部分的损失函数。

nn.MSELoss用来计算均方误差
nn.CrossEntropyLoss用来计算交叉熵误差
output = net(input)
target = Variable(t.arange(0,10))
criterion = nn.MSELoss()
loss = criterion(output,target)
在反向传播计算完所有参数的梯度后,还需要使用优化方法更新网络的权重和参数。

torch.optim中实现了大部分深度学习中的优化方法

import torch.optim as optim

optimizer = optim.SGD(net.parameters(),lr = 0.01) #新建一个优化器 指定参数和学习率
optimizer.zero_grad() #先梯度清0
output = net(input)
loss = criterion(output,target) #计算损失
loss.backward() #反向传播
optimizer.step() #更新参数

循环神经网络

PyTorch中实现了最常用的RNN、LSTM、GRU。此外还有3种对应的RNNCell。RNN和RNNCell的区别在于RNN可以处理整个序列,RNNCell一次只能处理序列上的一个时间点的数据。RNN更完备更易于使用,RNNCell更灵活

input = V(t.randn(2,3,4)) # 输入序列长度为2 batch_size为2 每个元素占4维
lstm = nn.LSTM(4,3,1) # lstm输入向量4维 3个隐含单元 1层
h0 = V(t.randn(1,3,3))
c0 = V(t.randn(1,3,3)) # 记忆单元
out, hn = lstm(input,(h0.c0))

词向量在NLP中应用广泛,PyTorch同样提供了Embedding层

embedding = nn.Embedding(4,5) # 有四个词 每个词用5维的向量表示
embedding.weight,data = t.arange(0,20).view(4,5) # 可以用预训练好的词向量初始化embedding

53.深度学习优化算法

1.SGD 随机梯度下降

普通的梯度下降法每进行一次 迭代 都需要将所有的样本进行计算,当样本量十分大的时候,会非常消耗计算资源,收敛速度会很慢。尤其如果像ImageNet那样规模的数据,几乎是不可能完成的。同时由于每次计算都考虑了所有的训练数据,也容易造成过拟合。在某种程度上考虑的太多也会丧失随机性 。于是有人提出,既然如此,那可不可以每一次迭代只计算一个样本的loss呢?然后再逐渐遍历所有的样本,完成一轮(epoch)的计算。答案是可以的,虽然每次依据单个样本会产生较大的波动,但是从整体上来看,最终还是可以成功收敛。由于计算量大大减少,计算速度也可以极大地提升。这种逐个样本进行loss计算进行迭代的方法,称之为 Stochasitc Gradient Descent 简称SGD。在这里插å¥å›¾ç‰‡æè¿°

2. mini-batch SGD 小批量随机梯度下降

SGD随机梯度下降法对经典的梯度下降法有了极大速度的提升。但有一个问题就是由于过于自由 导致训练的loss波动很大。那么如何可以兼顾经典GD的稳定下降同时又保有SGD的随机特性呢?于是小批量梯度下降法, mini-batch gradient descent 便被提了出来。其主要思想就是每次只拿总训练集的一小部分来训练,比如一共有5000个样本,每次拿100个样本来计算loss,更新参数。50次后完成整个样本集的训练,为一轮(epoch)。由于每次更新用了多个样本来计算loss,就使得loss的计算和参数的更新更加具有代表性。不像原始SGD很容易被某一个样本给带偏 。loss的下降更加稳定,同时小批量的计算,也减少了计算资源的占用。在这里插å¥å›¾ç‰‡æè¿°

3.momentum 动量法![在这里插å

¥å›¾ç‰‡æè¿°](https://img-blog.csdnimg.cn/20200413180111760.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk3OTk0MQ==,size_16,color_FFFFFF,t_70)

  1. 在这里插å¥å›¾ç‰‡æè¿°

4. Adagrad![在这里插å

¥å›¾ç‰‡æè¿°](https://img-blog.csdnimg.cn/20200413202523105.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk3OTk0MQ==,size_16,color_FFFFFF,t_70)

5. RMSprop![在这里插å

¥å›¾ç‰‡æè¿°](https://img-blog.csdnimg.cn/20200413202617982.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk3OTk0MQ==,size_16,color_FFFFFF,t_70)

6. Adam![在这里插å

¥å›¾ç‰‡æè¿°](https://img-blog.csdnimg.cn/20200413202709184.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk3OTk0MQ==,size_16,color_FFFFFF,t_70)

7. Adamax![在这里插å

¥å›¾ç‰‡æè¿°](https://img-blog.csdnimg.cn/20200413202736699.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk3OTk0MQ==,size_16,color_FFFFFF,t_70)

8. Nadam

说明在这里插å¥å›¾ç‰‡æè¿°

在这里插å¥å›¾ç‰‡æè¿°此处有各个优化算法的动态视图:https://blog.csdn.net/u012759136/article/details/52302426

54. Dropout

Dropout简介
1.1 Dropout出现的原因
在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。
过拟合是很多机器学习的通病。如果模型过拟合,那么得到的模型几乎不能用。为了解决过拟合问题,一般会采用模型集成的方法,即训练多个模型进行组合。此时,训练模型费时就成为一个很大的问题,不仅训练多个模型费时,测试多个模型也是很费时。在这里插å¥å›¾ç‰‡æè¿°

综上所述,训练深度神经网络的时候,总是会遇到两大缺点:

(1)容易过拟合
(2)费时

Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。

1.2 什么是Dropout

在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征

1.3 为什么说Dropout可以解决过拟合?

(1)取平均的作用: 先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。

(2)减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。

(3)Dropout类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。

55. LDA主题模型

本篇博文将详细讲解LDA主题模型,从最底层数学推导的角度来详细讲解,只想了解LDA的读者,可以只看第一小节简介即可。PLSA和LDA非常相似,PLSA也是主题模型方面非常重要的一个模型,本篇也会有的放矢的讲解此模型。如果读者阅读起来比较吃力,可以定义一个菲波那切数列,第 f(n) = f(n-1) + f(n-2) 天再阅读一次,直到这个知识点收敛。如果读者发现文章中的错误或者有改进之处,欢迎交流。

1. 简介

在机器学习领域,LDA是两个常用模型的简称:Linear Discriminant Analysis 和 Latent Dirichlet Allocation。本文的LDA仅指代Latent Dirichlet Allocation. LDA 在主题模型中占有非常重要的地位,常用来文本分类。

LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出,用来推测文档的主题分布。它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题分布后,便可以根据主题分布进行主题聚类或文本分类。

2. 先验知识

LDA 模型涉及很多数学知识,这也许是LDA晦涩难懂的主要原因。本小节主要介绍LDA中涉及的数学知识。数学功底比较好的同学可以直接跳过本小节。

LDA涉及到的先验知识有:二项分布、Gamma函数、Beta分布、多项分布、Dirichlet分布、马尔科夫链、MCMC、Gibs Sampling、EM算法等。限于篇幅,本文仅会有的放矢的介绍部分概念,不会每个概念都仔细介绍,亦不会涉及到每个概念的数学公式推导。如果每个概念都详细介绍,估计都可以写一本百页的书了。如果你对LDA的理解能达到如数家珍、信手拈来的程度,那么恭喜你已经掌握了从事机器学习方面的扎实数学基础。想进一步了解底层的数学公式推导过程,可以参考《数学全书》等资料。

2.1 词袋模型

LDA 采用词袋模型。所谓词袋模型,是将一篇文档,我们仅考虑一个词汇是否出现,而不考虑其出现的顺序。在词袋模型中,“我喜欢你”和“你喜欢我”是等价的。与词袋模型相反的一个模型是n-gram,n-gram考虑了词汇出现的先后顺序。有兴趣的读者可以参考其他书籍。

2.2 二项分布

二项分布是N重伯努利分布,即为X ~ B(n, p). 概率密度公式为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tb9rCaiG-1602121780050)(https://www.zhihu.com/equation?tex=P%28K+%3D+k%29+%3D+%5Cbegin%7Bpmatrix%7D+n%5C%5C+k%5C%5C+%5Cend%7Bpmatrix%7Dp%5Ek%7B%281-p%29%7D%5E%7Bn-k%7D)]

2.3 多项分布

多项分布,是二项分布扩展到多维的情况. 多项分布是指单次试验中的随机变量的取值不再是0-1的,而是有多种离散值可能(1,2,3…,k).概率密度函数为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v9RLcrVy-1602121780050)(https://www.zhihu.com/equation?tex=P%28x_1%2C+x_2%2C+…%2C+x_k%3B+n%2C+p_1%2C+p_2%2C+…%2C+p_k%29+%3D+%5Cfrac%7Bn%21%7D%7Bx_1%21…x_k%21%7D%7Bp_1%7D%5E%7Bx_1%7D…%7Bp_k%7D%5E%7Bx_k%7D+)]

2.4 Gamma函数

Gamma函数的定义:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDsHNNHL-1602121780050)(https://www.zhihu.com/equation?tex=%5CGamma%28x%29+%3D+%5Cint_0%5E%5Cinfty+t%5E%7Bx-1%7De%5E%7B-t%7Ddt)]

分部积分后,可以发现Gamma函数如有这样的性质:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fZqHW8Oo-1602121780051)(https://www.zhihu.com/equation?tex=%5CGamma%28x%2B1%29+%3D+x%5CGamma%28x%29)]

Gamma函数可以看成是阶乘在实数集上的延拓,具有如下性质:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2HTxcvuI-1602121780052)(https://www.zhihu.com/equation?tex=%5CGamma%28n%29+%3D+%28n-1%29%21)]

2.5 Beta分布

Beta分布的定义:对于参数\alpha > 0, \beta > 0, 取值范围为[0, 1]的随机变量x的概率密度函数为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dfCGLftk-1602121780052)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+f%28x%3B+%5Calpha%2C+%5Cbeta%29+%3D+%5Cfrac%7B1%7D%7BB%28%5Calpha%2C+%5Cbeta%29%7D+x%5E%7B%5Calpha±+1%7D+%7B%281-x%29%7D%5E%7B%5Cbeta-1%7D+%5Cend%7Balign%7D)] (1)

其中,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WvUKU39l-1602121780053)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+%5Cfrac%7B1%7D%7BB%28%5Calpha%2C+%5Cbeta%29%7D+%3D+%5Cfrac%7B%5CGamma%28%5Calpha+%2B+%5Cbeta%29%7D%7B%5CGamma%28%5Calpha%29%5CGamma%28%5Cbeta%29%7D+%5Cend%7Balign%7D)] (2)

2.6 共轭先验分布

在贝叶斯概率理论中,如果后验概率P(θ|x)和先验概率p(θ)满足同样的分布律,那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0ZjKFaa-1602121780053)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+P%28%5Ctheta+%7C+x%29+%3D+%5Cfrac%7BP%28%5Ctheta%2C+x%29%7D+%7BP%28x%29%7D+%5Cend%7Balign%7D)] (3)

Beta分布是二项式分布的共轭先验分布,而狄利克雷(Dirichlet)分布是多项式分布的共轭分布。

共轭的意思是,以Beta分布和二项式分布为例,数据符合二项分布的时候,参数的先验分布和后验分布都能保持Beta分布的形式,这种形式不变的好处是,我们能够在先验分布中赋予参数很明确的物理意义,这个物理意义可以延续到后续分布中进行解释,同时从先验变换到后验过程中从数据中补充的知识也容易有物理解释。

2.7 Dirichlet分布

Dirichlet的概率密度函数为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8V4DtfLt-1602121780053)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+f%28x_1%2C+x_2%2C+…%2C+x_k%3B+%5Calpha_1%2C+%5Calpha_2%2C+…%2C+%5Calpha_k%29+%3D+%5Cfrac%7B1%7D%7BB%28%5Calpha%29%7D%5Cprod_%7Bi%3D1%7D%5E%7Bk%7D%7Bx_i%7D%5E%7B%5Calpha%5Ei-1%7D+%5Cend%7Balign%7D)] (4)

其中,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BMoA5iRk-1602121780054)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+B%28%5Calpha%29+%3D+%5Cfrac%7B%5Cprod_%7Bi%3D1%7D%5E%7Bk%7D%5CGamma%28%5Calpha%5Ei%29%7D%7B%5CGamma%28%5Csum_%7Bi%3D1%7D%5E%7Bk%7D%5Calpha%5Ei%29%7D%2C+%5Csum_%7Bi%3D1%7D%5E%7Bk%7Dx%5Ei+%3D+1+%5Cend%7Balign%7D)] (5)

根据Beta分布、二项分布、Dirichlet分布、多项式分布的公式,我们可以验证上一小节中的结论 – Beta分布是二项式分布的共轭先验分布,而狄利克雷(Dirichlet)分布是多项式分布的共轭分布。

2.8 Beta / Dirichlet 分布的一个性质

如果 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHAdluEW-1602121780054)(https://www.zhihu.com/equation?tex=p+~+Beta%28t+%7C+%5Calpha%2C+%5Cbeta%29)] ,则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zziTpeQU-1602121780055)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+E%28p%29+%26+%3D+%5Cint_0%5E1+t+%2A+Beta%28t%7C+%5Calpha%2C+%5Cbeta%29dt+%5C%5C%5Cend%7Balign%7D)] (6)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aHMRpFvc-1602121780056)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%26+%3D+%5Cint_0%5E1+t+%2A+%5Cfrac%7B%5CGamma%28%5Calpha+%2B+%5Cbeta%29%7D%7B%5CGamma%28%5Calpha%29%5CGamma%28%5Cbeta%29%7Dt+%5E+%7B%28%5Calpha±1%29%7D+%7B%281±+t%29%7D%5E%7B%5Cbeta±+1%7Ddt+%5C%5C%5Cend%7Balign%7D)] (7)

[公式] (8)

上式右边的积分对应到概率分布 [公式] , 对于这个分布,有

[公式]

把上式带入E§的计算式,得到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MaMDNeH1-1602121780057)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+E%28p%29+%26+%3D+%5Cfrac%7B%5CGamma%28%5Calpha+%2B+%5Cbeta%29%7D%7B%5CGamma%28%5Calpha%29%5CGamma%28%5Cbeta%29%7D+%5Ccdot+%5Cfrac%7B%5CGamma%28%5Calpha+%2B+1%29%5CGamma%28%5Cbeta%29%7D%7B%5CGamma%28%5Calpha+%2B+%5Cbeta+%2B+1%29%7D+%5C%5C%5Cend%7Balign%7D)] (9)

[公式] (10)

[公式] (11)

这说明,对于Beta分布的随机变量,其均值可以用 [公式] 来估计。Dirichlet分布也有类似的结论,如果 [公式] , 同样可以证明:

[公式] (12)

这两个结论非常重要,后面的LDA数学推导过程会使用这个结论。

2.9 MCMC 和 Gibbs Sampling

在现实应用中,我们很多时候很难精确求出精确的概率分布,常常采用近似推断方法。近似推断方法大致可分为两大类:第一类是采样(Sampling), 通过使用随机化方法完成近似;第二类是使用确定性近似完成近似推断,典型代表为变分推断(variational inference).

在很多任务中,我们关心某些概率分布并非因为对这些概率分布本身感兴趣,而是要基于他们计算某些期望,并且还可能进一步基于这些期望做出决策。采样法正式基于这个思路。具体来说,假定我们的目标是计算函数f(x)在概率密度函数p(x)下的期望

[公式] (13)

则可根据p(x)抽取一组样本 [公式] ,然后计算f(x)在这些样本上的均值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6mujPTKf-1602121780061)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+%5Chat+f+%26+%3D+%5Cfrac%7B1%7D%7BN%7D+%5Csum_%7Bi%3D1%7D%5ENf%28x_i%29+%5Cend%7Balign%7D)] (14)

以此来近似目标期望E[f]。若样本 [公式] 独立,基于大数定律,这种通过大量采样的办法就能获得较高的近似精度。可是,问题的关键是如何采样?对概率图模型来说,就是如何高效地基于图模型所描述的概率分布来获取样本。概率图模型中最常用的采样技术是马尔可夫链脸蒙特卡罗(Markov chain Monte Carlo, MCMC). 给定连续变量 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DAJvmoc-1602121780061)(https://www.zhihu.com/equation?tex=x+%5Cin+X)] 的概率密度函数p(x), x在区间A中的概率可计算为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cvu2jCRT-1602121780062)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+P%28A%29+%26+%3D+%5Cint_A+p%28x%29dx+%5Cend%7Balign%7D)] (15)

若有函数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmjtIong-1602121780062)(https://www.zhihu.com/equation?tex=f%3A+X+%5Cmapsto+R)] , 则可计算f(x)的期望

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X0Q6El4X-1602121780063)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+P%28f%29+%26+%3D+E_p%5Bf%28X%29%5D+%3D+%5Cint_x+f%28x%29p%28x%29dx+%5Cend%7Balign%7D)] (16)

若x不是单变量而是一个高维多元变量x, 且服从一个非常复杂的分布,则对上式求积分通常很困难。为此,MCMC先构造出服从p分布的独立同分布随机变量 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ddcUYHZE-1602121780063)(https://www.zhihu.com/equation?tex=x_1%2C+x_2%2C+%5Ccdots%2C+x_N)] , 再得到上式的无偏估计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCseLmGU-1602121780063)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+%5Ctilde+p%28f%29+%26+%3D+%5Cfrac%7B1%7D%7BN%7D%5Csum_%7Bi%3D1%7D%5ENf%28x_i%29+%5Cend%7Balign%7D)] (17)

然而,若概率密度函数p(x)很复杂,则构造服从p分布的独立同分布样本也很困难。MCMC方法的关键在于通过构造“平稳分布为p的马尔可夫链”来产生样本:若马尔科夫链运行时间足够长,即收敛到平稳状态,则此时产出的样本X近似服从分布p.如何判断马尔科夫链到达平稳状态呢?假定平稳马尔科夫链T的状态转移概率(即从状态X转移到状态 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sWdoWaOK-1602121780063)(https://www.zhihu.com/equation?tex=x%5E%7B%27%7D)] 的概率)为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lfj0enCB-1602121780064)(https://www.zhihu.com/equation?tex=T%28x%5E%7B%27%7D+%5Cmid+x%29)] , t时刻状态的分布为p(x^t), 则若在某个时刻马尔科夫链满足平稳条件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j1rEbxIZ-1602121780064)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+p%28x%5Et%29T%28x%5E%7Bt-1%7D+%5Cmid+x%5Et%29+%3D+p%28x%5E%7Bt-1%7D%29T%28x%5Et+%5Cmid+x%5E%7Bt-1%7D%29+%5Cend%7Balign%7D)] (18)

则p(x)是马尔科夫链的平稳分布,且马尔科夫链在满足该条件时已收敛到平稳条件。也就是说,MCMC方法先设法构造一条马尔科夫链,使其收敛至平稳分布恰为待估计参数的后验分布,然后通过这条马尔科夫链来产生符合后验分布的样本,并基于这些样本来进行估计。这里马尔科夫链转移概率的构造至关重要,不同的构造方法将产生不同的MCMC算法。

Metropolis-Hastings(简称MH)算法是MCMC的重要代表。它基于“拒绝采样”(reject sampling)来逼近平稳分布p。算法如下:

  • 输入:先验概率 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0vSucJy-1602121780065)(https://www.zhihu.com/equation?tex=Q%28x%5E%7B%5Cast%7D+%5Cmid+x%5E%7Bt-1%7D%29)]
  • 过程:
  • 1. 初始化x^0;
  • 2. for t = 1, 2, … do
  • 3. 根据 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MX44Y3Ve-1602121780066)(https://www.zhihu.com/equation?tex=Q%28x%5E%7B%5Cast%7D+%5Cmid+x%5E%7Bt-1%7D%29)] 采样出候选样本 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IeeXOGaH-1602121780066)(https://www.zhihu.com/equation?tex=x%5E%7B%5Cast%7D)]
  • 4. 根据均匀分布从(0, 1)范围内采样出阈值u;
  • 5. if u [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3pdWxpbj-1602121780067)(https://www.zhihu.com/equation?tex=%5Cle+A%28x%5E%7B%5Cast%7D+%5Cmid+x%5E%7Bt-1%7D%29+then)]
  • 6. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fsBWKRg5-1602121780067)(https://www.zhihu.com/equation?tex=x%5Et+%3D+x%5E%7B%5Cast%7D)]
  • 7. else
  • 8. [公式]
  • 9. end if
  • 10. enf for
  • 11. return [公式]
  • 输出:采样出的一个样本序列
    于是, 为了达到平稳状态,只需将接受率设置为

[公式] (19)

吉布斯采样(Gibbs sampling)有时被视为MH算法的特例,它也使用马尔科夫链读取样本,而该马尔科夫链的平稳分布也是采用采样的目标分布p(x).具体来说,假定 [公式] , 目标分布为p(x), 在初始化x的取值后,通过循环执行以下步骤来完成采样:

  • 1. 随机或以某个次序选取某变量[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M8rqisMu-1602121780069)(https://www.zhihu.com/equation?tex=x_i)];
  • 2. 根据x中除[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eO8llr8h-1602121780070)(https://www.zhihu.com/equation?tex=x_i)]外的变量的现有取值,计算条件概率[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BIOe7bgh-1602121780070)(https://www.zhihu.com/equation?tex=p%28x_i+%5Cmid+X_i%29)], 其中[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SrAWnvCU-1602121780070)(https://www.zhihu.com/equation?tex=X_i+%3D+%7Bx_1%2C+x_2%2C+%5Ccdots%2C+x_%7Bi-1%7D%2C+x_%7Bi%2B1%7D%2C+%5Ccdots%2C+x_N%7D)];
  • 3. 根[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LxYd6HrQ-1602121780071)(https://www.zhihu.com/equation?tex=p%28x_i+%5Cmid+X_i%29)]据对变量[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X2v5wZnz-1602121780071)(https://www.zhihu.com/equation?tex=x_i)]采样,用采样值代替原值.

3. 文本建模

一篇文档,可以看成是一组有序的词的序列 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WSYXrZ10-1602121780071)(https://www.zhihu.com/equation?tex=d+%3D+%28%5Comega_1%2C+%5Comega_2%2C+%5Ccdots%2C+%5Comega_n%29)] . 从统计学角度来看,文档的生成可以看成是上帝抛掷骰子生成的结果,每一次抛掷骰子都生成一个词汇,抛掷N词生成一篇文档。在统计文本建模中,我们希望猜测出上帝是如何玩这个游戏的,这会涉及到两个最核心的问题:

  • 上帝都有什么样的骰子;
  • 上帝是如何抛掷这些骰子的;

第一个问题就是表示模型中都有哪些参数,骰子的每一个面的概率都对应于模型中的参数;第二个问题就表示游戏规则是什么,上帝可能有各种不同类型的骰子,上帝可以按照一定的规则抛掷这些骰子从而产生词序列。

3.1 Unigram Model

在Unigram Model中,我们采用词袋模型,假设了文档之间相互独立,文档中的词汇之间相互独立。假设我们的词典中一共有 V 个词 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWXKAZeR-1602121780071)(https://www.zhihu.com/equation?tex=%5Cnu_1%2C+%5Cnu_2%2C+%5Ccdots%2C+%5Cnu_V)] ,那么最简单的 Unigram Model 就是认为上帝是按照如下的游戏规则产生文本的。

  • 1. 上帝只有一个骰子,这个骰子有V面,每个面对应一个词,各个面的概率不一;
  • 2. 每抛掷一次骰子,抛出的面就对应的产生一个词;如果一篇文档中N个词,就独立的抛掷n次骰子产生n个词;
3.1.1 频率派视角

对于一个骰子,记各个面的概率为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OhGF7Qjx-1602121780072)(https://www.zhihu.com/equation?tex=%5Cvec+p+%3D+%28p_1%2C+p_2%2C+%5Ccdots%2C+p_V%29)] , 每生成一个词汇都可以看做一次多项式分布,记为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07p9Ijvb-1602121780073)(https://www.zhihu.com/equation?tex=%5Comega+%5Csim+Mult%28%5Comega+%5Cmid+%5Cvec+p%29)] 。一篇文档 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mOCthjIw-1602121780073)(https://www.zhihu.com/equation?tex=d+%3D+%5Cvec+%5Comega+%3D+%28%5Comega_1%2C+%5Comega_2%2C+%5Ccdots%2C+%5Comega_n%29)] , 其生成概率是 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nyankDwo-1602121780073)(https://www.zhihu.com/equation?tex=p%28%5Cvec+%5Comega%29+%3D+p+%28%5Comega_1%2C+%5Comega_2%2C+%5Ccdots%2C+%5Comega_n%29+%3D+p%28%5Comega_1%29p%28%5Comega_2%29+%5Ccdots+p%28%5Comega_n%29)]

文档之间,我们认为是独立的,对于一个语料库,其概率为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zk9k2z7-1602121780074)(https://www.zhihu.com/equation?tex=W+%3D+%28%5Cvec+%5Comega_1%2C+%5Cvec+%5Comega_2%2C+%5Ccdots%2C+%5Cvec+%5Comega_m%29)]

假设语料中总的词频是N,记每个词 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lvWNbQAI-1602121780074)(https://www.zhihu.com/equation?tex=%5Comega_i)] 的频率为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MwARkyI7-1602121780074)(https://www.zhihu.com/equation?tex=n_i)] , 那么 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oVJqR0WN-1602121780075)(https://www.zhihu.com/equation?tex=%5Cvec+n+%3D+%28n_1%2C+n_2%2C+%5Ccdots%2C+n_V%29%24%2C+%24%5Cvec+n)] , 服从多项式分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fx3Z4czp-1602121780076)(https://www.zhihu.com/equation?tex=p%28%5Cvec+n%29+%3D+Mult%28%5Cvec+n+%5Cmid+%5Cvec+p%2C+N%29+%3D+%5Cbegin%7Bpmatrix%7D+N+%5C%5C+%5Cvec+n+%5Cend%7Bpmatrix%7D+%5Cprod_%7Bk+%3D+1%7D%5EV+p_k%5E%7Bn_k%7D)]

整个语料库的概率为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OLCMx0ES-1602121780076)(https://www.zhihu.com/equation?tex=p%28W%29+%3D+p%28%5Cvec+%5Comega_1%29+p%28%5Cvec+%5Comega_2%29+%5Ccdots+p%28%5Cvec+%5Comega_m%29+%3D+%5Cprod_%7Bk+%3D+1%7D%5EV+p_k%5E%7Bn_k%7D)]

此时,我们需要估计模型中的参数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4TBnXOb1-1602121780077)(https://www.zhihu.com/equation?tex=%5Cvec+p)] ,也就是词汇骰子中每个面的概率是多大,按照频率派的观点,使用极大似然估计最大化p(W), 于是参数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNDEDaBy-1602121780078)(https://www.zhihu.com/equation?tex=p_i)] 的估计值为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8payFMDl-1602121780078)(https://www.zhihu.com/equation?tex=%5Chat+p_i+%3D+%5Cfrac%7Bn_i%7D%7BN%7D)]

3.1.2 贝叶斯派视角

对于以上模型,贝叶斯统计学派的统计学家会有不同意见,他们会很挑剔的批评只假设上帝拥有唯一一个固定的骰子是不合理的。在贝叶斯学派看来,一切参数都是随机变量,以上模型中的骰子 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ifvZVedp-1602121780079)(https://www.zhihu.com/equation?tex=%5Cvec+p)] 不是唯一固定的,它也是一个随机变量。所以按照贝叶斯学派的观点,上帝是按照以下的过程在玩游戏的:

  • 1. 现有一个装有无穷多个骰子的坛子,里面装有各式各样的骰子,每个骰子有V个面;
  • 2. 现从坛子中抽取一个骰子出来,然后使用这个骰子不断抛掷,直到产生语料库中的所有词汇

坛子中的骰子无限多,有些类型的骰子数量多,有些少。从概率分布角度看,坛子里面的骰子 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmCOFKqo-1602121780079)(https://www.zhihu.com/equation?tex=%5Cvec+p)] 服从一个概率分布 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CCGjjhRj-1602121780079)(https://www.zhihu.com/equation?tex=p%28%5Cvec+p%29)] , 这个分布称为参数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDgjw45s-1602121780080)(https://www.zhihu.com/equation?tex=%5Cvec+p)] 的先验分布。在此视角下,我们并不知道到底用了哪个骰子 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dH0IvxqR-1602121780080)(https://www.zhihu.com/equation?tex=%5Cvec+p)] ,每个骰子都可能被使用,其概率由先验分布 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-857RRG2r-1602121780081)(https://www.zhihu.com/equation?tex=p%28%5Cvec+p%29)] 来决定。对每个具体的骰子,由该骰子产生语料库的概率为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0HuJ0XT-1602121780081)(https://www.zhihu.com/equation?tex=p%28W+%5Cmid+%5Cvec+p%29)] , 故产生语料库的概率就是对每一个骰子 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SihaxVzf-1602121780081)(https://www.zhihu.com/equation?tex=%5Cvec+p)] 上产生语料库进行积分求和

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jkvELbTl-1602121780082)(https://www.zhihu.com/equation?tex=p%28W%29+%3D+%5Cint+p%28W+%5Cmid+%5Cvec+p%29+p%28%5Cvec+p%29+d+%5Cvec+p)]

先验概率有很多选择,但我们注意到 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKowwe0I-1602121780082)(https://www.zhihu.com/equation?tex=p%28%5Cvec+n%29+%3D+Mult%28%5Cvec+n+%5Cmid+%5Cvec+p%2C+N%29)] . 我们知道多项式分布和狄利克雷分布是共轭分布,因此一个比较好的选择是采用狄利克雷分布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cZBcVdhX-1602121780083)(https://www.zhihu.com/equation?tex=Dir%28%5Cvec+p+%5Cmid+%5Cvec+%5Calpha%29+%3D+%5Cfrac%7B1%7D%7B%5CDelta+%28%5Cvec+%5Calpha%29%7D+%5Cprod_%7Bk%3D1%7D%5EVp_k%5E%7B%5Calpha_k±1%7D%2C+%5Cvec+%5Calpha+%3D+%28%5Calpha_1%2C+%5Ccdots%2C+%5Calpha_V%29)]

此处 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJ017lx4-1602121780083)(https://www.zhihu.com/equation?tex=%5CDelta%28%5Cvec+%5Calpha%29)] ,就是归一化因子 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3GxvL0lQ-1602121780084)(https://www.zhihu.com/equation?tex=Dir%28%5Cvec+%5Calpha%29)] , 即

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0twRYTn-1602121780085)(https://www.zhihu.com/equation?tex=%5CDelta%28%5Cvec+%5Calpha%29+%3D+%5Cint+%5Cprod_%7Bk%3D1%7D%5EVp_k%5E%7B%5Calpha_k±+1%7Dd%5Cvec+p)]

由多项式分布和狄利克雷分布是共轭分布,可得:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7iye9Dl2-1602121780085)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+p%28%5Cvec+p+%7C+W%2C+%5Cvec+%5Calpha%29+%3D+Dir%28%5Cvec+p+%5Cmid+%5Cvec+n+%2B+%5Cvec+%5Calpha%29+%3D+%5Cfrac%7B1%7D%7B%5CDelta%28%5Cvec+n+%2B+%5Cvec+%5Calpha%29%7D+%5Cprod_%7Bk+%3D+1%7D%5EV+p_k%5E%7Bn_k+%2B+%5Calpha_k±+1%7Dd%5Cvec+p+%5Cend%7Balign%7D)] (20)

此时,我们如何估计参数 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B01RSSx1-1602121780086)(https://www.zhihu.com/equation?tex=%5Cvec+p)] 呢?根据上式,我们已经知道了其后验分布,所以合理的方式是使用后验分布的极大值点,或者是参数在后验分布下的平均值。这里,我们取平均值作为参数的估计值。根据第二小节Dirichlet分布中的内容,可以得到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bPBUwmO-1602121780087)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+E%28%5Cvec+p%29+%3D+%5Cbiggl%28+%5Cfrac%7Bn_1+%2B+%5Calpha_1%7D%7B%5Csum_%7Bi%3D1%7D%5EV+%28n_i+%2B+%5Calpha_i%29%7D%2C+%5Cfrac%7Bn_2+%2B+%5Calpha_2%7D%7B%5Csum_%7Bi%3D1%7D%5EV+%28n_i+%2B+%5Calpha_i%29%7D%2C+%5Ccdots%2C+%5Cfrac%7Bn_V+%2B+%5Calpha_V%7D%7B%5Csum_%7Bi%3D1%7D%5EV+%28n_i+%2B+%5Calpha_i%29%7D+%5Cbiggr%29+%5Cend%7Balign%7D)] (21)

对于每一个 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AyUXCXjV-1602121780087)(https://www.zhihu.com/equation?tex=p_i)] , 我们使用下面的式子进行估计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UTm0x3FP-1602121780088)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+%5Chat+p_i+%3D+%5Cfrac%7Bn_i+%2B+%5Calpha_i%7D%7B%5Csum_%7Bi%3D1%7D%5EV%28n_i+%2B+%5Calpha_i%29%7D+%5Cend%7Balign%7D)] (22)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z0qaoXmB-1602121780089)(https://www.zhihu.com/equation?tex=%5Calpha_i)] 在 Dirichlet 分布中的物理意义是事件的先验的伪计数,上式表达的是:每个参数的估计值是其对应事件的先验的伪计数和数据中的计数的和在整体计数中的比例。由此,我们可以计算出产生语料库的概率为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyEGg8ek-1602121780089)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+p%28W+%5Cmid+%5Calpha%29+%26+%3D+%5Cint+p%28W+%5Cmid+%5Calpha%29+p%28%5Cvec+p+%5Cmid+%5Calpha%29d%5Cvec+p+%5C%5C%5Cend%7Balign%7D)] (23)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IboUrT3W-1602121780089)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%26+%3D+%5Cint+%5Cprod_%7Bk%3D1%7D%5EV+p_k%5E%7Bn_k%7DDir%28%5Cvec+p+%5Cmid+%5Cvec+%5Calpha%29d%5Cvec+p+%5C%5C%5Cend%7Balign%7D)] (24)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8qhfVs1h-1602121780090)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%26+%3D+%5Cint+%5Cprod_%7Bk%3D1%7D%5EV+p_k%5E%7Bn_k%7D+%5Cfrac%7B1%7D%7B%5CDelta%28%5Cvec+%5Calpha%29%7D+%5Cprod_%7Bk+%3D+1%7D%5EV+p_k%5E%7B%5Calpha_k±+1%7Dd%5Cvec+p+%5C%5C%5Cend%7Balign%7D)] (25)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x7zVGz6j-1602121780090)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%26+%3D+%5Cfrac%7B1%7D%7B%5CDelta%28%5Cvec+%5Calpha%29%7D+%5Cint+%5Cprod_%7Bk%3D1%7D%5EV+p_k%5E%7Bn_k%7D+%5Cprod_%7Bk+%3D+1%7D%5EV+p_k%5E%7Bn_k+%2B+%5Calpha_k±+1%7Dd%5Cvec+p+%5C%5C%5Cend%7Balign%7D)] (26)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q1tT8tnx-1602121780091)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%26+%3D+%5Cfrac%7B%5CDelta%28%5Cvec+n+%2B+%5Cvec+%5Calpha%29%7D%7B%5CDelta%28%5Cvec+%5Calpha%29%7D+%5Cend%7Balign%7D)] (27)

3.2 PLSA模型

Unigram Model模型中,没有考虑主题词这个概念。我们人写文章时,写的文章都是关于某一个主题的,不是满天胡乱的写,比如一个财经记者写一篇报道,那么这篇文章大部分都是关于财经主题的,当然,也有很少一部分词汇会涉及到其他主题。所以,PLSA认为生成一篇文档的生成过程如下:

  • 1. 现有两种类型的骰子,一种是doc-topic骰子,每个doc-topic骰子有K个面,每个面一个topic的编号;一种是topic-word骰子,每个topic-word骰子有V个面,每个面对应一个词;
  • 2. 现有K个topic-word骰子,每个骰子有一个编号,编号从1到K;
  • 3. 生成每篇文档之前,先为这篇文章制造一个特定的doc-topic骰子,重复如下过程生成文档中的词:
  • 3.1 投掷这个doc-topic骰子,得到一个topic编号z;
  • 3.2 选择K个topic-word骰子中编号为z的那个,投掷这个骰子,得到一个词;

PLSA中,也是采用词袋模型,文档和文档之间是独立可交换的,同一个文档内的词也是独立可交换的。K 个topic-word 骰子,记为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MrQKNH1q-1602121780091)(https://www.zhihu.com/equation?tex=%5Cvec+%5Cphi_1%2C+%5Ccdots%2C+%5Cvec+%5Cphi_K)] ; 对于包含M篇文档的语料 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DdeG7zMl-1602121780091)(https://www.zhihu.com/equation?tex=C+%3D+%28d_1%2Cd_2%2C+%5Ccdots%2Cd_M%29+)] 中的每篇文档 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w135W29A-1602121780091)(https://www.zhihu.com/equation?tex=d_m)] ,都会有一个特定的doc-topic骰子 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zxtg80KP-1602121780092)(https://www.zhihu.com/equation?tex=%5Cvec+%5Ctheta_m)] ,所有对应的骰子记为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sstLVSBu-1602121780093)(https://www.zhihu.com/equation?tex=%5Cvec+%5Ctheta_1%2C+%5Ccdots%2C+%5Cvec+%5Ctheta_M)] 。为了方便,我们假设每个词 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FSMsfzBG-1602121780093)(https://www.zhihu.com/equation?tex=%5Comega)] 都有一个编号,对应到topic-word 骰子的面。于是在 PLSA 这个模型中,第m篇文档 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6L5tG4NW-1602121780094)(https://www.zhihu.com/equation?tex=d_m)] 中的每个词的生成概率为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gWhiuKh4-1602121780095)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+p%28%5Comega+%5Cmid+d_m%29+%26+%3D+%5Csum_%7Bz%3D1%7D%5EK+p%28%5Comega+%5Cmid+z%29+p%28z+%5Cmid+d_m%29+%5C%5C%5Cend%7Balign%7D)] (28)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BfXXoVPF-1602121780095)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%26+%3D+%5Csum_%7Bz+%3D+1%7D%5EK+%5Cphi_%7Bz+%5Comega%7D+%5Ctheta_%7B%5Comega+z%7D+%5Cend%7Balign%7D)] (29)

一篇文档的生成概率为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EayhUDEh-1602121780095)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+p%28%5Cvec+%5Comega+%5Cmid+d_m%29+%26+%3D+%5Cprod_%7Bi+%3D+1%7D%5En+%5Csum_%7Bz%3D1%7D%5EK+p%28%5Comega+%5Cmid+z%29+p%28z+%5Cmid+d_m%29+%5C%5C%5Cend%7Balign%7D)] (30)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X4g9CkkE-1602121780095)(https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D%26+%3D+%5Cprod_%7Bi+%3D+1%7D%5En+%5Csum_%7Bz+%3D+1%7D%5EK+%5Cphi_%7Bz+%5Comega%7D+%5Ctheta_%7B%5Comega+z%7D+%5Cend%7Balign%7D)] (31)

由于文档之间相互独立,很容易写出整个语料的生成概率。求解PLSA 可以使用著名的 EM 算法进行求得局部最优解,有兴趣的同学参考 Hoffman 的原始论文,或者李航的《统计学习方法》,此处略去不讲。

3.3 LDA 模型
3.3.1 PLSA 和 LDA 的区别

首先,我们来看看PLSA和LDA生成文档的方式。在PLSA中,生成文档的方式如下:

  • 1. 按照概率[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sByDDsIh-1602121780096)(https://www.zhihu.com/equation?tex=p%28d_i%29)]选择一篇文档[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3fsRuRCa-1602121780096)(https://www.zhihu.com/equation?tex=d_i)]
  • 2. 根据选择的文档[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4HWVh6ul-1602121780097)(https://www.zhihu.com/equation?tex=d_i)],从从主题分布中按照概率[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Ko9WecD-1602121780097)(https://www.zhihu.com/equation?tex=p%28%5Czeta_k+%5Cmid+d_i%29)]选择一个隐含的主题类别[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I3sB6NnP-1602121780098)(https://www.zhihu.com/equation?tex=%24%5Czeta_k)]
  • 3. 根据选择的主题[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-la09GuOo-1602121780098)(https://www.zhihu.com/equation?tex=%5Czeta_k)], 从词分布中按照概率[公式]选择一个词[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3vOSbvXm-1602121780099)(https://www.zhihu.com/equation?tex=%5Comega_j)]

LDA 中,生成文档的过程如下:

  • 1. 按照先验概率[公式]选择一篇文档[公式]
  • 2. 从Dirichlet分布[公式]中取样生成文档[公式]的主题分布[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJonY2o0-1602121780100)(https://www.zhihu.com/equation?tex=%5Ctheta_i)],主题分布[公式]由超参数为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfCqJoxX-1602121780101)(https://www.zhihu.com/equation?tex=%5Calpha)]的Dirichlet分布生成
  • 3. 从主题的多项式分布[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VdLxJgof-1602121780102)(https://www.zhihu.com/equation?tex=%5Ctheta_i)]中取样生成文档[公式]第 j 个词的主题[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sn15p9p6-1602121780102)(https://www.zhihu.com/equation?tex=z_%7Bi%2C+j%7D)]
  • 4. 从Dirichlet分布[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dMBzFc4T-1602121780103)(https://www.zhihu.com/equation?tex=%5Cbeta)]中取样生成主题[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8phGYtFw-1602121780104)(https://www.zhihu.com/equation?tex=z_%7Bi%2C+j%7D)]对应的词语分布[公式],词语分布[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SVuiuzom-1602121780104)(https://www.zhihu.com/equation?tex=%5Cphi_%7Bz_%7Bi%2C+j%7D%7D)]由参数为[公式]的Dirichlet分布生成
  • 5. 从词语的多项式分布[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nCehta84-1602121780106)(https://www.zhihu.com/equation?tex=%5Cphi_%7Bz_%7Bi%2C+j%7D%7D)]中采样最终生成词语[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F57isWNs-1602121780106)(https://www.zhihu.com/equation?tex=%5Comega_%7Bi%2C+j%7D)]

可以看出,LDA 在 PLSA 的基础上,为主题分布和词分布分别加了两个 Dirichlet 先验。

我们来看一个例子,如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2VyOcoFh-1602121780106)(https://pic2.zhimg.com/80/v2-d98334991c4f74a24a3597de57777a11_720w.jpg)]

上图中有三个主题,在PLSA中,我们会以固定的概率来抽取一个主题词,比如0.5的概率抽取教育这个主题词,然后根据抽取出来的主题词,找其对应的词分布,再根据词分布,抽取一个词汇。由此,**可以看出PLSA中,主题分布和词分布都是唯一确定的。但是,在LDA中,主题分布和词分布是不确定的,LDA的作者们采用的是贝叶斯派的思想,认为它们应该服从一个分布,主题分布和词分布都是多项式分布,因为多项式分布和狄利克雷分布是共轭结构,在LDA中主题分布和词分布使用了Dirichlet分布作为它们的共轭先验分布。**所以,也就有了一句广为流传的话 – LDA 就是 PLSA 的贝叶斯化版本。下面两张图片很好的体现了两者的区别:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bdhf30k0-1602121780107)(https://pic1.zhimg.com/80/v2-a2322b24366a01db4e6013aa0a98b2a8_720w.jpg)]

img

在PLSA和LDA的两篇论文中,使用了下面的图片来解释模型,它们也很好的对比了PLSA和LDA的不同之处。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fKjeYq5K-1602121780109)(https://pic4.zhimg.com/80/v2-f5dbddd82b371a1fd262d60ecf1fc19b_720w.jpg)]

img

3.3.2 LDA 解析一

现在我们来详细讲解论文中的LDA模型,即上图。

[公式] , 这个过程表示在生成第m篇文档的时候,先从


  1. a ↩︎

  2. a ↩︎

  3. a ↩︎

  4. a ↩︎

  5. a ↩︎

  6. a ↩︎

  7. a ↩︎

  8. a ↩︎

  9. a ↩︎

  10. a ↩︎

  11. a ↩︎

  12. a ↩︎

  13. a ↩︎

  14. a ↩︎

  15. a ↩︎

  16. a ↩︎

  17. a ↩︎

  18. a ↩︎

  19. a ↩︎

  20. a ↩︎

  21. a ↩︎

  22. a ↩︎

  23. a ↩︎

  24. a ↩︎

  25. a ↩︎

  26. a ↩︎

  27. a ↩︎

  28. a ↩︎

  • 19
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值