term weight
如何衡量一个词在一篇文档中的重要性
词频率(tf):term在文档中出现了多少次,tf越大说明越重要
逆文档频率(idf):有多少文档包含了这个term,idf越大表明越不重要
综合词频率和逆文档频率的优势,最终得到weight = tf *idf
从信息论的角度来解读tf * idf
一个query中每个词的权重应该反应这个词对查询来讲提供了多少信息,一个简单的办法就是用每个词的信息量作为它的权重
I(w) = -p(w) * log p(w) = -tf(w)/N * log tf(w)/N = tf(w)/N * log N/tf(w) 【N是整个语料库的大小,是个可以省的常数】
I(w) = tf(w) * logN/tf(w)
缺陷:两个词出现的频率tf相同,一个是某篇特定文章中的常见词,而另外一个词是分散在多篇文章中,那么显然第一个词有更高的区分度,
它的权重应该更大,更好的权重公式应该能够反映出关键词的区分度
假设:
每个文献大小基本相同,均为M个词,即 M = N/D = sum (tf(w)) / D
一个关键词在文献中一旦出现,不论次数多少,贡献都等同,这样一个词要么在一个文献中出现c(w) = tf(w)/D(w),要么是0,c(w) < M
最终变成:
I(w) = tf(w) * log N/tf(w) = tf(w) * log MD/(c(w) * D(w)) = tf(w) * log(D/D(w) * M/c(w))
I(w) = tf(w) * log N/tf(w) = tf(w) * log MD/(c(w) * D(w)) = tf(w) * log(D/D(w) * M/c(w))
因为c(w) < M,所以第二项大于0,它是c(w)的递减函数
tf(w) * idf(w) = I(w) - tf(w) * log M/c(w)
可以看出一个词的信息量I(w)越多,tf*idf值越大,同时w命中文献中w平均出现的次数越多,第二项越小,tf*idf越大
TF-IDF对于多段文本的关键词提取非常有效,但是对于单篇或者文档分割较少的文本则表现的不是很好,此处需要借助textrank来解决这个问题
TextRank是一种基于图排序的算法,其基本思想来源于google的PageRank算法,通过把文本切分为若干组成单元(单词或者短语或者句子)并建立图模型
(所谓这样的图模型,例如:今天阳光明媚,天清气爽,适合出游。所以今天去公园吧。这句话的图模型如下图所示),
利用投票机制对文本中的重要程度成分进行排序(下图中,“今天”的重要程度会比较高),仅利用单篇文档本身的信息即可实现关键词提取、做文摘
TextRank
编辑切换为居中
添加图片注释,不超过 140 字(可选)
TextRank利用投票的原理,让每一个单词给它的邻居(也即窗口)投赞成票,票的权重取决于自己的票数。所以如上所述,它是一个图排序模型,我们假设每一个词是一个顶点(Vertex),
那么所有的词就构成了一个网络,在这个网络里面每一个顶点会指向其他顶点的边,也会由其他顶点指向自己的边。通过计算每个顶点所连接的指向自己的顶点的权重和,最终得到该顶点的权重值。
初始值确定:因为目标的权重取决于自身的权重(通过计算每个顶点所连接的指向自己的顶点的权重和),所以这里的初始值为非0的值。
这里引入了阻尼系数的概念。在图模型中,该参数表示从某一个指定的顶点,到任意一个其他顶点的概率,详细公式见下图
编辑切换为居中
添加图片注释,不超过 140 字(可选)
对文本进行切分为字或词形式
对切分好的字或词构建图模型,也即构建一个字或词与字或词的连接矩阵;选择用滑动窗口的方式对每个单词取邻居:假设,我们取一个长度为k的滑动窗口,
则w_{1},w_{2},...,w_{k};w_{2},w_{3},...,w_{k+1};w_{3},w_{4},...,w_{k+2};等都是一个窗口。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边;
在这个邻居上面构成图,可以计算出每个单词节点的重要性
权重计算:
设定最大迭代次数,并依次进行逐步迭代;
按照连出矩阵,对每一个单词节点更新其排序权重;
对于连出到自身或者连出为空的单词节点不进行计算,因为这部分节点在图中属于孤立点,所以只要求保持其初始值即可;
对于连出的其他词的单词节点,则按照TextRank公式,逐步更新其排序权重;
同时根据前后两次迭代之间单词的权重变化值,来判断是否提前结束循环过程
text rank demo
编辑切换为居中
添加图片注释,不超过 140 字(可选)
tag_filter主要是用来做停用词过滤的,防止将停用词作为重要的词从图中提取出来
seg_result主要是对输入的sentence做分词
word_list里存放的是经过过滤的sentence的分词结果
编辑
添加图片注释,不超过 140 字(可选)
edge_dict = {} #记录节点的边连接字典
针对每个词,将窗口范围2n范围内的词全部输入到edge_dict中
编辑切换为居中
添加图片注释,不超过 140 字(可选)
matrix主要是通过edge_list,将每个词的出度和入度在矩阵里面表示出来
因为出度入度计算都是+1,此处需要归一化一下,变成 < 1的数
编辑切换为居中
添加图片注释,不超过 140 字(可选)
通过pagerank算法计算关键词
textrank模型缺点
TextRank算法对于一段文本中多次出现的词,赋予更大的权重,因为它连出的节点会更多,所以当各个节点的初始权重一致的时候,则最终出现次数多的词权重会更大。
这样会使类似于“的”、"你、我、他"等常用词,会出现比较大的误差,因为这些词一般没有什么特别的含义,仅仅是一个连接词或指代词。
对于这种情况,可以在对文本进行切分时,去掉里面的停用词或其他符合一定规则的词语
plsa算法原理
主题词提取
针对一篇文章,往往是有好几个主题。譬如一篇奥运会的文章,可能40%会谈论运动员比赛成绩,30%谈论运动员私人生活,20%谈论运动员感情,还有10%谈论其它主题
我们可以很自然的看到,一篇文章通常是由多个主题构成的,而每一个主题大概可以用与该主题相关的频率最高的一些词来描述。以上这种想法由Hofmann于1999年给出的pLSA模型中首先进行了明确的数学化。Hofmann认为一篇文章(Doc)可以由多个主题(Topic)混合而成,而每个Topic都是词汇上的概率分布,文章中的每个词都是由一个固定的Topic生成的
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑
添加图片注释,不超过 140 字(可选)
倒数第二步旨在将zk暴露出来。由于likelihood function中与存在latent variable(p(zk|dm), p(wn|zk)),难以直接使用MLE求解,
很自然想到用E-M算法求解。E-M算法主要分为Expectation与Maximization两步
p(a, b) = p(a) * p(b|a) = p(b) * p(a|b) 贝叶斯
doc,N个词,K个主题、M个文档: p(w|d) = p(z|d) * p(w|z) = sum_z 【p(z, w|d)】****
p(dm), p(zk|dm), p(wn|zk)
p(wn, dm) 第m篇文档中,第n个词出现的概率
Loss function = p(w1, d1) * p(w2, d1) * ...... p(wn, d1) * p(w1, d2) * p(w2, d2) * ....... * p(wn, d2) * ........p(w1, dm) * p(w1, dm)....... p(wn, dm)
p(w1, d1) 有可能出现一次或者多次,那么假设它出现了n(d1, w1)次
log L = p(w1, d1) + p(w1, d2) + ......
p(wn, dm) = p(dm) * p(wn|dm)
p(wn|dm) = sum_z p(z|d) * p(w|z)
zk表示第m篇文档对应的主题
p(zk|dm)表示当前的dm文档是包含zk这个主题的
p(wn|zk)表示当前的第zk个主题中,能生成wn这个单词的概率
EM 算法,目的就是为了求隐变量 p(zk|dm), p(wn|zk)
p(zk|dm, wn)
p(zk|dm), p(wn|zk)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
lambda = matrix(n, k),表示第i篇文档对应的主题分布是什么,k个主题
体育、娱乐、综艺、美食、直播,每个doc都是上面的一个概率分布
采访姚明的专访: 体育(0.8), 娱乐(0.16),综艺(0.03),美食(0.00001)
大胃王吃烧饼:体育(0.0001),娱乐(0.2),综艺(0.1),美食(0.7)
theta = matrix(k,m),表示第k个主题对应的词的概率分布是什么,n个词
体育: 姚明、篮球、nba、梅西......
娱乐:王一博、肖战。。。。。。
p(zk|wn, dm)
p(zk|wn, dm) = p(zk, wn, dm) / p(wn, dm), p(a) * p(b|a) = p(a, b)
p(zk, wn, dm) = p(dm) * p(zk|dm) * p(wn|zk) = p(zk, dm) * p(wn|zk) = p(zk, dm, wn)
p(wn, dm) = p(dm) * p(wn|dm)
p(zk, wn, dm) = p(zk|dm) * p(wn|zk) / p(wn|dm)
p(wn|dm) = sum_z p(zk|dm) * p(wn|zk)
EStep
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
MStep
编辑
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
logab = log a + logb
log p(dm) * p(wn|dm) = log p(dm) + log(p(wn|dm))
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
搜索的向量化召回是什么
从query中准确计算出用户的搜索意图以及准确表达文档的语义含义是非常困难的,因此之前的搜索算法主要还是通过关键词匹配的方式进行检索。
但是如何处理用户想要的搜索结果和输入query并不能通过关键词匹配的方式获取呢,语义匹配(也就是embedding匹配)应运而生。
所谓embedding就是将高维稀疏的id映射成为一个低维稠密的向量,这样就可以在同一个向量空间中同时表示query和候选集文档从而进行譬如计算相似度等方面的操作。
embedding技术就是一种表示学习,能学习到query或者候选集文档的语义信息
向量召回的本质在于通过模型学习到query以及doc的embedding,利用embedding的信息去表达,从而利用近邻搜索的方式找到与目标query相关的doc。
向量化召回可以帮助我们把更多的精力放在真正的语义上,通过语义召回与query真正相关的doc,
并减少对于query分析的过分依赖(如果query term重要性,query改写在一些case无法捕捉到真正的语义内容而带来badcase)
在向量召回阶段需要考虑到两个问题:
一个是极大候选集带来的离线训练以及线上服务的压力(ANN召回)
另外一个是与现有的term matching共存使用的问题(如何平衡与传统term based召回的共同问题)
query输入很简单,用户肯定徒省事,但是doc输入比较复杂,每个doc理解很难,因为篇幅太长,针对一个query短短的几句介绍,有可能用户的意图不明确
假如对应的query里面,一些必须词没有了,直接有可能造成召回的doc的误识别
基于term based关键词匹配的方法,有可能丢失掉一些重要的信息,所以说,我需要借助一种方式来帮助做召回,这个方法就叫做向量化召回
query -> vector
doc -> vector
这两个vector属于同一个dimension(空间维度),那么相似度,就可以用向量之间的相乘来模拟
term based召回,依赖于term weight, 改写,没有真正做到理解语义,现在这个时候,直接通过学习query & doc的embedding,来做到真正的理解语义,
这样,我只需要做,来了一个query,快速的把当前的query encode 一个n维的向量,离线把doc侧encode成一个n维的向量,那么就可以借助knn(query_encode, doc_encode),
来算topk相似的doc出来
向量化召回框架图
编辑切换为居中
添加图片注释,不超过 140 字(可选)
线上召回的时候先找到相关的cluster,做embedding相似度计算,召回相关的docs。线上请求的时候,query会触发线上实时预估,docs的embedding则存储在索引中。
考虑到性能以及业务逻辑,向量召回不会对全部的query起作用,比如一些简单的query,本身就包含特定的需求,向量召回并不会提供额外的信息。
在实践中很多时候会把向量化召回作为激进省的一个补充流程
向量召回作为retrieval的一个部分,处于整体搜索链路比较前的位置,有可能有召回到较好的doc但是在排序阶段没有办法排到前边去,排序模型对新的数据不敏感,
没有办法很好的处理新的数据分布:
将召回生成的embedding作为ranking阶段的特征,可以直接将embedding作为特征或者计算query和doc的embedding的cosine 相似度
向量化召回详细方案
模型结构
编辑切换为居中
添加图片注释,不超过 140 字(可选)
DSSM
通过搜索引擎里 Query 和 Title 的海量的点击曝光日志,用 DNN 把 Query 和 Title 表达为低纬语义向量,并通过 cosine 距离来计算两个语义向量的距离,最终训练出语义相似度模型。
该模型既可以用来预测两个句子的语义相似度,又可以获得某句子的低纬语义向量表达
模型损失函数
编辑切换为居中
添加图片注释,不超过 140 字(可选)
D是距离函数,q是query,d+代表正样本,d-表示负样本,N是样本数量,m是正负样本的强制边界值(此处的m<0,这样用户正样本的距离减去负样本的距离加上负数才能和0比较)。
这个公式的意思是,如果正负样本的距离比较小,那么他们俩的损失就不算数了;如果正负样本的距离比较大,那么这个损失就用来训练模型。
这个公式的动机来源就是让正负样本尽量离远点儿,具体多远可以用m来调。m的大小很重要,但是不同的任务的m值可能不一样,这个值的大小可能会导致5%-10%的召回率差异
预训练模型改进召回效果
可以采用bert分别做query和doc的encoder,接着用pooling之后的query doc的cosine距离当作输出,最后通过pairwise损失函数训练模型
为了让语义模型在pretrain的时候发挥更大的效果,可以采用重要性模块,在bert上做MLM的时候,优先去mask掉重要性高的词语
做embeddnig召回,需要面对三个难点:
query长尾,难以捕捉细粒度之间的差异
需要泛化
过多误召回伤害用户体验,因为是end2end的训练的模型
query -> embedding结果
doc -> embedding结果
doc的文本要比query的文本要长,如果说,不把doc or query拉齐到同一个维度n,那么query与doc是没有办法去计算相似度或者距离的
1000个字 -> 256
10个字 -> 256
去计算doc 与 query之间的关系
样本选择
负样本选取
随机选取:从文档候选集中随机选取负样本,相当于把与正样本有着很大区分边界的样本取为负样本,把"hard negative"强负样本加入模型训练,
将使得召回任务的候选集和真实情况相符,可以让embedding获取到重要的内容
非点击曝光样本:在正样本同一个请求中的曝光但未点击样本,但是当前方案选取的负样本,其实和正样本一样,是用户的query比较匹配的结果,
即它们也很正,这样导致很难将他们区分开,效果弱于第一种方案
正样本选取
点击作为正样本:点击代表了用户选择,很自然可以作为正样本
曝光作为正样本:将召回当做一个简单迅速的ranker(精排),所以让召回模型去学习ranker中排序靠前的样本。这样所有曝光给用户的都当做正样本。
应该是对于点击样本来说,曝光样本并未给召回模型提供更多的信息。
负样本选取
query,doc,<q, doc>点击了,<q, doc>没有点击
<q, doc>点击作为正样本,<q, doc>没有点击作为负样本
上述都要求我的query下面的doc list需要有show,有展示,对于那些没有展示的doc,我就不管了么?
(为了让正样本学的更好,我随机的从未展示的样本中,挑选作为负样本,让正样本学的更正,负样本学的更鲁棒,引入噪音了)
正样本选取
点击作为正样本:点击代表了用户选择,很自然可以作为正样本
曝光作为正样本:将召回当做一个简单迅速的ranker(精排),所以让召回模型去学习ranker中排序靠前的样本。这样所有曝光给用户的都当做正样本。
应该是对于点击样本来说,曝光样本并未给召回模型提供更多的信息。
模型评估
不同于rank使用auc作为离线衡量指标,此处采用了top K recall的方式进行衡量。
下面公式中的T为基于业务逻辑(如点击/人工标注)圈定出的target doc,而 d_i为基于cosine similarity计算出的与query最相关的docs,详细召回评估指标如下:
编辑
添加图片注释,不超过 140 字(可选)
搜索相关性是什么
用户输入query,通过query理解、doc理解、索引召回后会透传给精排相关性模型,主要是通过复杂模型来判断query表达的主题和页面表达的主题的匹配程度,进而真正的做到理解用户需求,保证召回结果的整体相关性
整个搜索排序模型中,相关性是非常重要的指标,核心是保证用户的体验,更多的是偏向于人工评估,需要遵循相关的人工评估标准
时效性:主题匹配度的打分不受页面资源的时效性影响,如果q是奥运会,未指明那一届,都认为相关性好,如果q里面有2021年奥运会,那么必须要出东京奥运会
有效性:主题匹配度的打分不受页面资源的有效性影响,如果q是xx软件下载,主题匹配的打分不需要下载的软件是否免费,是否带病毒,是否是目标软件
丰富度:主题匹配度的打分不受页面资源的丰富度影响,如果q是搜作文,提供一篇范文的和提供两篇范文的页面都是3分相关性case
便捷性:主题匹配度的打分不受页面资源的便捷影响,如果q是搜一篇新闻,结果1不需要翻页就可阅读全文,结果2将一篇新闻分为好几页,用户需要翻页才能阅读,这两个结果只要和q的主题匹配,那么都是3分
权威度:主题匹配度的打分不受页面资源的权威度影响,如果q是搜病怎么治,百度知道的结果和专业医院网站上的结果,相关性都是3分
相关性预料
预训练语料
中文百度百科的数据,将对应的实体数据在语料中直接MASK掉
资讯新闻数据,索引库中优质10亿网页
视频的title数据、ocr信息、asr信息、comment信息
相关领域权威数据(医疗、旅游、游戏)
搜索用户的点击query/title的对数据
大模型语料
query/title的点击数据,要清理不置信的点击数据,有时候会有点击信息作弊(自有样本构建)
如果是一个垂类,可以拿q是爬一些百度的show结果,尤其是top1的结果,(外部优质结果构建)
人工标注数据最后上去fine tune一下
3分
query: 紫菜包饭
title: 紫菜包饭怎么做
2分
query: 亲爱的热爱的第5集
title: 亲爱的热爱电视剧集选
1分
query:红烧鲤鱼怎么做
title:红烧鲫鱼怎么做
query:红色的轿车
title:白色的轿车
0分
query: 紫菜包饭
title: 红烧鱼怎么做
相关性模型
预训练模型
ELMO
bert
gpt2
ernie
albert
roberta
electra
相关性模型
表达
交互
语义
预训练模型
什么是预训练模型
预训练通过自监督学习从大规模数据中获得与具体任务无关的预训练模型,具体体现在某一个词在一个特定上下文中的语义表征
(例如苹果在不同的上下文语义中具有不同的含义,可以是水果也可以是电子产品)。
当通过大规模的语料训练得到预训练模型后,这个时候需要借助预训练模型来对下游任务做微调,针对具体的任务修正网络。训练数据可以是文本、文本-图像对、文本-视频对。预训练模型的训练方法可使用自监督学习技术(如自回归的语言模型和自编码技术)。可训练单语言、多语言和多模态的模型。此类模型可经过微调之后,用于支持分类、序列标记、结构预测和序列生成等各项技术,并构建文摘、机器翻译、图片检索、视频注释等应用
预训练模型为什么会work
预训练模型是一种迁移学习的应用,利用几乎无限的文本,学习输入句子的每一个成员的上下文相关的表示,它隐式地学习到了通用的语法语义知识。
它可以将从开放领域学到的知识迁移到下游任务,以改善低资源任务,对低资源语言处理也非常有利。
预训练模型在几乎所有 NLP 任务中都取得了目前最佳的成果。最后,这个预训练模型+微调机制具备很好的可扩展性,在支持一个新任务时,
只需要利用该任务的标注数据进行微调即可,一般工程师就可以实现
预训练关键技术
transformer
自监督学习
fine tune
transformer
编辑切换为居中
添加图片注释,不超过 140 字(可选)
transformer是预训练语言模型的核心网络。给定一句话或是一个段落作为输入,首先将输入序列中各个词转换为其对应的词向量,同时加上每一个词的位置向量,体现词在序列的位置。
然后将这些词向量输入到多层 Transformer 网络中,通过自注意力(self-attention)机制来学习词与词之间的关系,编码其上下文信息,再通过一个前馈网络经过非线性变化,
输出综合了上下文特征的各个词的向量表示。
每一层 Transformer 网络主要由 Multi-head self-attention 层(多头自注意力机制)和前馈网络层两个子层构成。Multi-head self-attention 会并行地执行多个不同参数的 self-attention,
并将各个 self-attention 的结果拼接作为后续网络的输入,self-attention 机制会在后面中做详细介绍。此后,我们得到了蕴含当前上下文信息的各个词的表示,
然后网络会将其输入到前馈网络层以计算非线性层次的特征
在每一层 Transformer 网络中,会将残差连接(residual connection)把自注意力机制前或者前馈神经网络之前的向量引入进来,以增强自注意力机制或者前馈网络的输出结果向量。
并且还做一个 layer normalization,也就是通过归一化把同层的各个节点的多维向量映射到一个区间里面,这样各层节点的向量在一个区间里面。这两个操作加入在每个子层后,
可更加平滑地训练深层次网络
Transformer 可以用于编码,也可以用于解码。所谓解码就是根据一个句子的输入得到一个预想的结果,比如机器翻译(输入源语言句子,输出目标语言句子),
或者阅读理解(输入文档和问题,输出答案)。解码时,已经解码出来的词要做一个自注意力机制,之后和编码得到的隐状态的序列再做一个注意力机制。
这样可以做 N 层,然后通过一个线性层映射到词表的大小的一个向量。每个向量代表一个词表词的输出可能性,经过一个softmax 层得到每个词的输出概率
f = feed forward(x)
过全连接网络,由可能发生梯度消失和梯度爆炸,造成输入数据的信息受损
feed forward output:
o = f + x
layer normalization: 一个样本,不同的feature之间,做norm,文本,偏时序,词与词是由先后顺序的,如果batch,没有鸟用的
batch normalization: epoch , batch_size, 每个batch_size,要做norm,做正则,缓解梯度消失和梯度爆炸,多个样本,不同的feature,做norm
self-attention
假定当前输入包含三个词,给定其输入词向量或是其上一层 Transformer 网络的输出,将其通过三组线性变换,转换得到三组 queries、keys 和 values 向量。
query 和 key 向量用来计算两两词之间的得分,也就是其依赖关系,这个得分会同其对应的 value 向量做加权和,以得到每个词综合上下文信息的表示。
给定当前第一个词的 query 向量,其首先同各个词的 key 向量通过点积操作得到这两个词的得分,这些得分用来表示这两个词的依赖或是相关程度。
这些得分之后会根据 query 等向量的维度做一定比例的缩放,并将这些得分通过 softmax 操作做归一化。之后,各个得分会同其相对应的 value 向量相乘得到针对第一个词加权的各个 value 向量,这些加权的 value 向量最终相加以得到当前第一个词的上下文表示
在得到第一个词的上下文表示后,给定第二个词的 query 向量,我们会重复之前的操作,计算当前 query 向量同各个词 key 向量的得分,对这些得分做 softmax 归一化处理,
并将这些得分同其对应的 value 向量做加权和,以得到其编码上下文信息的表示
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑
添加图片注释,不超过 140 字(可选)
输入是 The weather is nice today,利用自注意力机制调整每个词的表示,比如 The。我们认为它要受到其他所有词的影响,但是影响力可大可小。
那么每个词的影响力是通过计算 The 与每个词的关联度,然后通过一个 softmax 归一化得到一个权值,每个词一个权值,这样 The 的最后表示就是和每个词计算关联度的结果之和。
多头注意力机制就是对一个节点,可以设置几组 K、Q 和 V,分别计算关联度(通过 Q 和 K 计算点积)和加权调整的值(通过 V 和关联度计算)。
几组结果可以拼在一起,通过一个线性变换,体现多角度的特征抽取。多头可以是16个头、12个头等
a1, a2, a3, a4, a5
最简单的归一化怎么做? a1/(a1+a2+a3+a4+a5)
10, 20, 30, 40, 50
10/150 20/150 30/150 40/150 50/150
权重归一
softmax
exp(a1)/(sum_i exp(ai))
w1, w2, w3
w1_embedding = w1_embedding * a1 + w2_embedding * a2 + w3_embedding * a3
a1 = 相似度(w1, w1)
a2 = 相似度(w1, w2)
a3 = 相似度(w1, w3)
a1 = exp(a1)/[exp(a1)+exp(a2)+exp(a3)]
w1_embedding就是融合了上下文的embedding的信息得到的向量么
苹果_embedding,如果是在乔布斯创立了苹果电脑
乔布斯_embedding * a1 + 创立_embedding * a2 + 了_embedding * a3 + 苹果embedding * a4 + 电脑_embedding * a5
苹果_embedding,如果是在今年的苹果大丰收
苹果_embedding = 今年_embedding * a1 + 的_embedding * a2 + 苹果_embedding * a3 + 大丰收_embedding * a4
自监督学习
在预训练的模型中,AR(自回归)LM 和 AE(自动编码器)是最常用的自监督学习方法,其中,自回归 LM 旨在利用前面的词序列预测下个词的出现概率(语言模型)。
自动编码器旨在对损坏的输入句子,比如遮掩了句子某个词、或者打乱了词序等,重建原始数据。通过这些自监督学习手段来学习单词的上下文相关表示
ARLM:
新华社报道称东京______
p(奥运会|新华社报道称东京) = 0.9,预测下一个词是奥运会
ARAE:
新华社报道称东京奥运会中国夺得50块金牌
新华社报道称东京______中国夺得50块金牌(mask掉)
p(奥运会|新华社报道称东京, 中国夺得50块金牌) = 0.9
微调 finetune
在做具体任务时,微调旨在利用其标注样本对预训练网络的参数进行调整。以我们使用基于 BERT(一种流行的预训练模型)为例来判断两个句子是否语义相同。
输入是两个句子,经过 BERT 得到每个句子的对应编码表示,我们可以简单地用预训练模型的第一个隐节点预测分类标记判断两个句子是同义句子的概率,
同时需要额外加一个线性层和 softmax 计算得到分类标签的分布。预测损失可以反传给 BERT 再对网络进行微调。当然也可以针对具体任务设计一个新网络,把预训练的结果作为其输入
CLS -> 可以来表示当前的句子可以被编码成的embedding是什么样子的
CLS后面加softmax,来做分类认为
预训练模型介绍
早期的词嵌入(word embedding)的工作,比如 Word2Vec,它的训练的结果是词的嵌入,是一个静态的表示,
此后 ULMFiT 是第一个使用 RNN 基于 LM 训练的上下文相关的预训练模型;
CoVe 利用翻译任务来训练编码器-解码器,并使用编码器作为预训练模型;
ELMo 使用双向 LSTM 合并两个方向的隐状态获得上下文相关表示;
GPT 采用 LM 进行训练,它是基于 Transformer 的单向预训练模型;BERT 是基于 Transformer 的基于掩码的预训练模型;
MT-DNN 基于 BERT 增加了一些任务进行多任务训练;
MASS 使用编码-解码器来训练预训练模型;
UniLM 尝试同时支持语言理解和生成任务,把预训练模型用于多语言任务。
XLM 是一种支持多语言的 BERT 模型;
Unicoder 引入若干新的任务改进了 XLM;
T5 把多种自然语言任务(比如机器翻译、问答),用了更大的数据,在一个网络训练,同时支持这些任务;
BART 是一种编码-解码器模型,通过还原损坏的句子训练;
mBART 将 BART 理念扩展到多语言。
另外还有最新的很多模型恕我这里没有全部列出。
ELMO
编辑切换为居中
添加图片注释,不超过 140 字(可选)
ELMO在特征抽取的时候使用了 LSTM 而不是 Transformer,Transformer 是谷歌在 17 年做机器翻译任务的“Attention is all you need”的论文中提出的,引起了相当大的反响,
很多研究已经证明了Transformer 提取特征的能力是要远强于 LSTM 的
如果原文是苏炳添东京奥运会半决赛第一名,ELMo 在训练的时候使用 biLSTM,预测 “半决赛” 的时候,前向 LSTM 会 Mask “半决赛”之后的所有单词,
使用上文 "苏炳添/东京/奥运会" 预测;后向 LSTM 会 Mask "半决赛" 之前的单词,使用下文 "语言/处理" 进行预测。然后再将前向 LSTM 和后向 LSTM 的输出拼接在一起,
因此 ELMo 是将上下文信息分隔开进行预测的,而不是同时利用上下文信息进行预测
Bert
编辑切换为居中
添加图片注释,不超过 140 字(可选)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
预训练模型要同时利用单词 left (上文) 和 right (下文) 信息才能最好地预测。像ELMo 这种分别进行 left-to-right 和 right-to-left 的模型称为 shallow bidirectional model (浅层双向模型),BERT 希望在 Transformer Encoder 结构上训练出一种深度双向模型 deep bidirectional model,因此提出了 Mask LM 这种方法进行训练。
Mask LM 是用于防止信息泄露的,BERT 在训练时只预测 [Mask] 位置的单词,这样就可以同时利用上下文信息。但是在后续使用的时候,句子中并不会出现 [Mask] 的单词,这样会影响模型的性能。
因此在训练时采用如下策略,随机选择句子中 15% 的单词进行 Mask,在选择为 Mask 的单词中,有 80% 真的使用 [Mask] 进行替换,10% 不进行替换,剩下 10% 使用一个随机单词替换
BERT 还有一个预训练任务是 Next Sentence Prediction (NSP),即下一句预测,给定两个句子 A 和 B,要预测句子 B 是否是句子 A 的下一个句子。BERT 使用这一预训练任务的主要原因是,
很多下游任务,例如问答系统 (QA),自然语言推断 (NLI) 都需要模型能够理解两个句子之间的关系,但是通过训练语言模型达不到这个目的。BERT 在进行训练的时候,
有 50% 的概率会选择相连的两个句子 A B,有 50% 的概率会选择不相连得到两个句子 A B,然后通过 [CLS] 标志位的输出 C预测句子 A 的下一句是不是句子 B
ALBERT在模型结构上没有做太大的变动,更多是一个工程优化的论文,很多想法其实都比较直白,也比较“工程”(自行意会),副标题叫做a bag of tricks training BERT比较合适,应该是google内部对于训练BERT这个模型的一些总结和提炼。BERT这个模型训练的主要瓶颈在于模型过大,就算是BERT-base也是相当巨无霸的模型,训练的大量时间耗费在参数和梯度的同步上面,这是这篇ALBERT的主要着重点,减少参数。
paper里面主要用到的trick是两个:
一个是embedding的factorization,一个VxH的embedding变成两个VxE, ExH的两个fc,参数这里就少了一大截。
第二个trick就是参数共享,paper的实验现实attention的weights共享的效果好于之后的ffn weights共享的效果。
其他几个比较有意思的tricks:
SOP loss,算是NSP的改良版,实现上也更加简单(两个segment交换就行了,省去了去sample的麻烦)。训练到一定程度,停掉dropout,mlm的accuracy又蹭上去一截,这个是一篇比较直接的论文,更像是实验记录,读起来比较顺畅,意外的简单。至于inference的时候,可以减少一些内存开销,但是计算量本身不会减少,该头疼的还是继续头疼。
RoBERTa
动态MASK
原来Bert对每一个序列随机选择15%的Tokens替换成[MASK],为了消除与下游任务的不匹配,还对这15%的Tokens进行
(1)80%的时间替换成[MASK];(2)10%的时间不变;(3)10%的时间替换成其他词。但整个训练过程,这15%的Tokens一旦被选择就不再改变,也就是说从一开始随机选择了这15%的Tokens,之后的N个epoch里都不再改变了。这就叫做静态Masking。
而RoBERTa一开始把预训练的数据复制10份,每一份都随机选择15%的Tokens进行Masking,也就是说,同样的一句话有10种不同的mask方式。
然后每份数据都训练N/10个epoch。这就相当于在这N个epoch的训练中,每个序列的被mask的tokens是会变化的。这就叫做动态Masking
去掉NSP
原本的Bert为了捕捉句子之间的关系,使用了NSP任务进行预训练,就是输入一对句子A和B,判断这两个句子是否是连续的。在训练的数据中,50%的B是A的下一个句子,50%的B是随机抽取的。
而RoBERTa去除了NSP,而是每次输入连续的多个句子,直到最大长度512(可以跨文章)。这种训练方式叫做(FULL - SENTENCES),而原来的Bert每次只输入两个句子。
实验表明在MNLI这种推断句子关系的任务上RoBERTa也能有更好性能。
更大的mini-batch,更多的训练语料
模型越来越大:比如 Transformer 的层数变化,从12层的 Base 模型到24层的 Large 模型。导致模型的参数越来越大,比如 GPT 110 M,到 GPT-2 是1.5 Billion,图灵是 17 Billion,
而 GPT-3 达到了惊人的 175 Billion。一般而言模型大了,其能力也会越来越强,但是训练代价确实非常大。
预训练方法也在不断增加,从自回归 LM,到自动编码的各种方法,以及各种多任务训练等。
还有从语言、多语言到多模态不断演进。最后就是模型压缩,使之能在实际应用中经济的使用,比如在手机端。这就涉及到知识蒸馏和 teacher-student models,把大模型作为 teacher,
让一个小模型作为 student 来学习,接近大模型的能力,但是模型的参数减少很多
表示(Representation based model)
DSSM
CDSSM
交叉(interaction based model)
MatchPyramid
MVLSTM
KNRM
bert类(attention based model)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
表示类
编辑切换为居中
添加图片注释,不超过 140 字(可选)
交叉类
DSSM
编辑切换为居中
添加图片注释,不超过 140 字(可选)
不足:term粒度,context转义现象非常严重,无法真正解决语义问题,更像强匹配
CDSSM
编辑切换为居中
添加图片注释,不超过 140 字(可选)
相比DSSM,从DNN换到CNN,引入ngram信息,同时加入query分析的数据,多轮finetune
不足:语序、同义词问题,上下文考虑仍然不足
MatchPyramid
编辑
添加图片注释,不超过 140 字(可选)
匹配矩阵的计算上做得更加精细,关注的是原始word级别的交互
对于query和doc之间每个word的两两交互提出了3中方法,包括精确匹配的indicator计算,两个word完全相同为1否则为0;以及语法相似度的匹配,包括cosine以及dot product,
关注的是更泛化的匹配
整个过程和图像识别以及人类的认知一样,word-level的匹配信号,类比图像中的像素特征;phrase-level的匹配信号,包括n-gram有序的phrase以及n-term无序的phrase,类比图像中的边缘检测;到sentence-level的匹配信号,类比图像中的motifs检测
MVLSTM
编辑
添加图片注释,不超过 140 字(可选)
-
最优的匹配位置并不总是句子的最后一个位置,所以多位置(multi-view)的匹配是有必要的
-
最终句子匹配的结果,取决与多位置的句子表征的结合程度,即多粒度的匹配。
-
同时多粒度的匹配是建立在丰富的语义表征上,即使用双向的LSTM进行句子表征
KNRM
编辑切换为居中
添加图片注释,不超过 140 字(可选)
Conv-knrm相比k-nrm,最大的改变就是它添加了n-gram的卷积,增加了原先模型的层次,这里有一个好处就是它能够捕捉更加细微的语义实体,交叉的粒度也更加细
bert双塔模型
编辑切换为居中
添加图片注释,不超过 140 字(可选)
搜索评估标准
离线评估标准
最终效果层面,重人工gsb,side by side
不同的模块,有自己的评估标准
在线评估标准
分桶ab
interleaving
搜索核心指标
致现在奋斗的自己
There is no smooth road to science
Only those who are not afraid to climb along the steep mountain road can hope to reach the brilliant summit
科学的道路并不平坦.只有不畏劳苦沿着陡峭山路攀登的人,才有希望登上光辉的顶点