搜索系统(二)

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 字(可选)

  1. 最优的匹配位置并不总是句子的最后一个位置,所以多位置(multi-view)的匹配是有必要的

  2. 最终句子匹配的结果,取决与多位置的句子表征的结合程度,即多粒度的匹配。

  3. 同时多粒度的匹配是建立在丰富的语义表征上,即使用双向的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

科学的道路并不平坦.只有不畏劳苦沿着陡峭山路攀登的人,才有希望登上光辉的顶点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/2049.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity --- 游戏案例 --- 英雄无敌与Ruby

1.如何在场景中标识出一个空游戏物体&#xff08;对象集群&#xff09; 1.选中该空游戏物体&#xff0c;然后在Inspector面板处的物体名旁边添加想要的颜色的图标即可&#xff0c;最终效果如下图 2.这个图标只在场景中能开到&#xff0c;在游戏画面中是看不到的&#xff0c;其存…

Vulnhub项目:Web Machine(N7)

靶机地址&#xff1a;Web Machine(N7)渗透过程&#xff1a;kali ip&#xff1a;192.168.56.104&#xff0c;靶机ip&#xff0c;使用arp-scan进行查看靶机地址&#xff1a;192.168.56.128收集靶机开放端口&#xff1a;nmap -sS -sV -T5 -A 192.168.56.128开放了80端口&#xff0…

索尼mxf变成rsv的修复方法

索尼的影视级摄像机一般是用MXF文件结构&#xff0c;在一些极端情况下(如断电)会生成RSV文件&#xff0c;遇到这种情况我们应该如何处理&#xff1f;下面来看看今天这个案例。故障文件:12.51G RSV文件故障现象:断电后仅生成了一个扩展名为rsv的文件&#xff0c;使用播放器可以播…

python+django+vue全家桶鲜花商城售卖系统

重点&#xff1a; &#xff08;1&#xff09; 网上花店网站中各模块功能之间的的串联。 &#xff08;2&#xff09; 网上花店网站前台与后台的连接与同步。 &#xff08;3&#xff09; 鲜花信息管理模块中鲜花的发布、更新与删除。 &#xff08;4&#xff09; 订单…

java多线程之线程的六种状态

线程的六种状态(1) NEW(初始状态)(2) TERMINATED(终止状态 / 死亡状态)(3) RUNNABLE(运行时状态)(4) TIMED_WAITING(超时等待状态)(5) WAITING(等待状态)(6) BLOCK(阻塞状态)sleep和wait的区别:操作系统里的线程自身是有一个状态的,但是java Thread 是对系统线程的封装,把这里的…

基于C++的AI五子棋游戏项目开发教程

项目资源下载 基于C的AI五子棋游戏项目源码压缩包下载地址基于C的AI五子棋游戏项目源码Github下载地址基于C的AI五子棋游戏项目所需素材基于C的AI五子棋游戏项目所需要的EasyX 项目简介 本项目基于C开发&#xff0c;整体来说比较简单&#xff0c;实现了人与AI之间的五子棋对弈…

Java实习生------Redis常见面试题汇总(AOF持久化、RDB快照、分布式锁、缓存一致性)⭐⭐⭐

“年轻人&#xff0c;就要勇敢追梦”&#x1f339; 参考资料&#xff1a;图解redis 目录 谈谈你对AOF持久化的理解&#xff1f; redis的三种写回策略是什么&#xff1f; 谈谈你对AOF重写机制的理解&#xff1f;AOF重写机制的具体过程&#xff1f; 谈谈你对RDB快照的理解&a…

面试官:说一下MySQL中的锁机制吧

5. 1MySQL有哪些锁&#xff1f; 为保证数据的一致性&#xff0c;需要对并发操作进行控制&#xff0c;因此产生了锁。同时锁机制也为实现MySQL的各个隔离级别提供了保证。 锁冲突 也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要&#xff0c;也更加…

seata服务搭建

它支持两种存储模式&#xff0c;一个是文件&#xff0c;一个是数据库&#xff0c;下面我们分别介绍一下这两种配置nacos存储配置&#xff0c;注意如果registry.conf中注册和配置使用的是file&#xff0c;就会去读取file.config的配置&#xff0c;如果是nacos则通过nacos动态读取…

Kafka和RabbitMQ有哪些区别,各自适合什么场景?

目录标题1. 消息的顺序2. 消息的匹配3. 消息的超时4. 消息的保持5. 消息的错误处理6. 消息的吞吐量总结1. 消息的顺序 有这样一个需求&#xff1a;当订单状态变化的时候&#xff0c;把订单状态变化的消息发送给所有关心订单变化的系统。 订单会有创建成功、待付款、已支付、已…

Cookie和Session详解

目录 前言&#xff1a; Session详解 Cookie和Session区别和关联 服务器组织会话的方式 使用Tomcat实现登录成功跳转到欢迎页面 登录前端页面 登录成功后端服务器 重定向到欢迎页面 抓包分析交互过程 小结&#xff1a; 前言&#xff1a; Cookie之前博客有介绍过&#x…

音视频技术开发周刊 | 285

每周一期&#xff0c;纵览音视频技术领域的干货。新闻投稿&#xff1a;contributelivevideostack.com。GPT-4 Office全家桶发布谷歌前脚刚宣布AI工具整合进Workspace&#xff0c;微软后脚就急匆匆召开了发布会&#xff0c;人狠话不多地祭出了办公软件王炸——Microsoft 365 Cop…

使用GPT-4生成QT代码

一、概述最近ChatGPT火爆起来了&#xff0c;ChatGPT是一种基于GPT的自然语言处理模型&#xff0c;可以用于生成自然语言文本&#xff0c;例如对话、文章等。最近又发现了一个优秀且免费的代码生成工具Cursor.so &#xff0c;Cursor.so集成了 GPT-4 &#xff0c;可以帮助你快速编…

Python3,5行代码,生成自动排序动图,这操作不比Excel香?

5行代码生成自动排序动图1、引言2、代码实战2.1 pynimate介绍2.2 pynimate安装2.3 代码示例3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c;听说你的excel段位又提升了&#xff1f; 小鱼&#xff1a;你这是疑问的语气&#xff1f; 小屌丝&#xff1a;没有~ 吧… 小鱼&…

计算机网络复习重点

文章目录计算机网络复习重点第一章 计算机网络和因特网概念与应用1、什么是因特网2、协议protocol3、入网方式4、物理媒介5、数据交换模式6、延时与丢包什么时候发生延时&#xff1f;延时的类型丢包何时发生7、协议层次与模型因特网协议栈TCP / IP模型ISO/OSI参考模型协议数据单…

MySQL-存储过程

什么是存储过程我们前面所学习的MySQL语句都是针对一个表或几个表的单条 SQL 语句&#xff0c;但是在数据库的实际操作中&#xff0c;并非所有操作都那么简单&#xff0c;经常会有一个完整的操作需要多条SQL语句处理多个表才能完成。例如&#xff0c;为了确认学生能否毕业&…

归并排序和快速排序

目录 归并排序 思路&#xff1a; 代码执行&#xff1a; 快速排序 运行流程图&#xff1a; 代码思路&#xff1a; 代码执行&#xff1a; 归并排序 定义&#xff1a;归并排序是建立在归并操作上的一种有效&#xff0c;稳定的排序算法&#xff0c;该算法是采用分治法&#x…

【JavaSE】类和对象(中)

类和对象&#xff08;中&#xff09;4. this引用4.1 为什么要有this引用4.2 什么是this引用4.3 this引用的特性5. 对象的构造及初始化5.1 如何初始化对象5.2 构造方法&#xff08;构造器&#xff09;5.2.1 概念5.2.2 特性5.3 默认初始化5.4 就地初始化6. 封装6.1 封装的概念6.2…

常用hook

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。理解&#xff1a;hook是react提供的函数API官方提供的hook基础hookuseState APIconst [state, setState] useState(initialState); //返回state值 以及更新state的方法 …

壹沓科技完成近2亿元B轮融资:构建数字机器人,实现业务超自动化

RPA中国获悉&#xff0c;全球领先的数字机器人公司壹沓科技近期宣布完成近2亿元B轮融资&#xff0c;本轮融资由鼎晖VGC(创新与成长基金)领投&#xff0c;创享欢聚投资基金、IDG资本、钟鼎资本跟投&#xff0c;指数资本继续担任独家财务顾问。 壹沓科技CEO卞晓瑜表示&#xff1…