00:00
啊,大家好,今天给大家讲一下呃,Sentence这样的一个模型啊,从名字上看啊,这个模型它比较适用于去做一些句子上的任务,比方说呃,获取一个句子的呃一个表,呃向量表示,或者是做一些文本语义相似度的计算等等啊那么前面这个的话,大家只有自己看见好就好了啊我说一下,其实呃sentence它没有比较特别的一些在基于bet的一些改进啊,其中有一个点吧,等会我会讲,那么它主要是针对于bet去做啊,微调翻ing,然后呃有一个特别巧妙的一个设计,其他就没有什么,那么我们首先想一下,就是如果说给你一个传统的bet模型,你如何去获取一个句子的向量表示,一般来说的话,我们是有两种方式。啊,传统的摄量动,比方说现在这是个bart模型。已经训练好了80模型,然后呢,我就输一个CS。
01:01
然后后面是个句子啊,整个一个完整的一句话。等等,然后呢,比第一种情况就是说,呃,我去把这个除了crs以外所所有的这个句子里面的单词就是token。他的他都会有输出。都会向量,我把这些向量全部加起来。呃,全部加起来。然后做一个平均,嗯,Average作为平均,那么这个平均值就作为这个整个句子的。一个向量。向量表示。那么这个。就得到一个这样的一个向量,呃,第二种情况呢,第二种方法就是说直接把这个CS。呃的输出。就直接把这个CS这个位置的输出。作为这个句子的这样一个向量。呃,其实呃在很多地方我们都是用的第二种方式,也就是把这个CS它的输出看成是它对于这个句子啊,它的一个就是完整的一个语音信息吧,比方说呃,比方说文本分类任务。
02:15
文本分类任务,我记得我在李宏毅老师还是什么视频上看到过,就是呃,大家都会用用CS。去,呃,去代表CS的输出的向量,去代表这个句子的一个向量,然后去做后面的一些下游的任务,比方说后面再做一个呃。之类的,就做一个分类任务等等啊,这是两种方式,这个大家应该都了解过了。嗯。那么就是说那么用这两种方式,后来呢,这个文章啊,就是sentence bird他们的作者做了一个实验,发现在文本相似度,也就是sts,那么这个sts的全称在这里,呃,它的这个在文本相似度这个任务上使用呃上述两种方法得到向量,然后去做一个啊做这个下游任务,也就是完美相似度,呃发现效果并不好,我们可以看一下,呃,这个是用lo,呃第一行它是用love得到的一个句子的,呃,一个embedding啊,就是说他用一个love,然后获得每个词的inbding,然后做个average,就是作为当做来作为整个句这个句子的一个inbding,然后在这些任务当中做到的呃分数,那么是这样的一个情况,而比方说bet。
03:34
它所有的词做为呃的输出的向量,做一个average,做呃来当做这个句子的呃向量,那呃,然后他再做一下呃,做一下后面这些呃,下个任务得到的分数是这样子的,那么前三行大概是这样的啊,第三行就是说用crs的输出作为这个句子的向量啊,得到。的情况是这样的,我们看到它那个平均分啊。也就是说,Bet不管是这两种哪一种。
04:02
都不如glo,那当然这个bet它是那个最小的bet,也就是呃,最小的bet,呃,发现它们的效果都并不是很好。也就是这样子,实以上,呃,那么这个由此sentence就诞生了,呃,Sentence它主要是。对bet,呃,预训练的一个bet在上面进行一个微调,呃,其中我说它没有什么别的,就是一个微调,还有一个就是最重要的。就sentence sentence,它用到了一个比较,呃,这个其其实已经提出很久的很久的一个概念,叫孪生网络和三胞胎网络,那么他们的单词对应的是这个。呃,什么什么叫孪生网络和三胞胎网络呢?这个地方呃,就是重点了,我给大家介绍一下。啊,这里。啊,那么孪生网络很好理解,就是。就是说这个网络和这个网络它们之间是一模一样的,包括参数啊什么的,全部都是一模一样的,那么不一样的地方在于哪什么呢?就是说呃,这个网络先比方说这是这是两个句子,这是第一个句子,这是第二个句子,然后我要去计算这两个句子这之间的一个呃相似度,好,那我先说说第一个句子,通过这个模型。
05:20
然后得到这样一个句子的一个inbedding表示,那么这个句子的inbedding表示,呃,是怎么得到的?你可以是啊,还是我前面说的,用一个CS,或者是用所有token的一个平均值都可以,反正反正就是你先得到一个句子的一个呃向量表示,然后你再输入呃一个句子通过这个同样的模型,那么这里有个地方注意啊,我刚忘了讲,就是当你这个第一个句子通过这个模型得到这个向量之后呢,是因为你没有任你还没有去计算loss啊什么的,所以说这个当你第一个句子通过的时候,你其实这个模型参数是并没有更新的,因为你都没有计算loss,那么也就没有梯度,那没有梯度怎么去反向传播呢?是吧,所以说第一次当你通过的时候,是不进行反向传播,也不进行参数更新的,而当你第二个句子输入的时候,也得到了同样的一个向量,然后将这两个向量就是句子的向量,比方说我现在做的就是文本相似度嘛,那么你这两个文本就是说这两个向量去计算它们的相似度啊,用比方说余弦或者距离或者。
06:28
就是等等其他呃各种计算距离的方式也好,就得到呃,计算出了这么一个loss,然后此时再回传,回传的时候呢,啊,就更新这个网络,那么这个网络更新了,其实这个网络也是更新的,因为他们俩永远都是一模一样的,我用一个代码来稍微讲解一下,大家明白吧,比方说我现在定义,呃,我就简单写一下吧。比方说我现在啊。比方说这是一个呃,孪生模型,然后N点。Mo啊,后面的话我就不写D。
07:05
啊,后面的话我就懒得写了,那么这个地方。啊,比方说这是一个input,一个INPUT2。那么呃,他怎么做呢?比方说我现在就有一个。这么样一个轮式模型,你在这里啊,首先你把整个网络定义好了啊,比方说呃,FC啊,这里维度我也不写了。就这样吧,就是N。呃,比方说你这个孪生网络,这个网络它就是一个简单的一个,呃,线性的一个啊模型,然后呢,呃,我这里的话我会通过两次,那么呃,具体来说我会怎么做呢?我在这儿再写一个函数df for word。
08:01
Once,呃,通过一次,然后self,然后in X。然后呢,呃。对吧,然后这里的话我怎么走呢?我会,呃,因为我们知道就是说你去在模型里面传入参数的时候,它会默认调用forward函数,那我这里定义一个forward ones是干嘛呢?就是要在这个forward里面去调用这个forward ones,那也就是说。嗯。首先我会返回一个OUTPUT1 output1就是这个,也就是说这个的的向量,那它什么呢?它就是forward。Once the year output,二等forward。One input2,然后最后啊,你再返回怎么样怎么样就可以了,就是这样的一个过程,那么大家可以看到,就是当你传入第一个句子的时候,就像我说的,你是不进行任何梯度回传的,而且你看呃,大家可以看到,就是说呃这两个东西入的时候,他们其实都通过的是同样的一个模型,他们的参数是一模一样的,不管是权重啊,偏制等等都是一模一样的,那么这个就是孪生网络,呃,这个大家还是很好理解的。
09:21
那么孪生网络的损失函数呢?啊,是这样的定义的。啊,这个地方DW被定义为就是说两个输入之间的欧式距离,也就呃就是呃两个啊对,两个输入之间的欧式距离,也就是这个和这个呃也可以是欧式距离,也可以是其他的什么距离都可以,比方说就是一个单纯的一个绝对值。也是可以的,只要能够定义它们的距离就可以了,呃,那么这里面Y表示什么呢?Y表示就是说,如果说X1和X2它们是属于同一类的。嗯,那我我们就希望这个Y等于零,Y等于零的时候,也就是说只有这里后面这个地方就没有了,那就是说我们希望啊,最小化它们之间的距离,那Y如果等于一的话呢,那这里就没有了,就只有这里啊Y等于一,那么这个M表示什么呢?嗯。
10:12
M表示的是边际价值啊,这个地方我来讲一下就明白了,首先我们知道DW是它们俩的距离,然后Y等于一的时候,我们就不看前面就看后面,那就只有这一块啊,1/2我们也不管了,就就是那就其实就只有一个max,零和这个东西的平方啊,零,呃,零和这个东西对吧?呃,那也就是说假设我零,M等于一。那如果啊,它们俩是不不同类的,那它们俩不同类,并且它们俩的距离呃被预测出来特别小,也就是说它们是小于这个一的,那一减去一个小于的数,那肯定大于零的,对吧,大于零,那么咱们max就是这个大于零的数,那就是啊这样一个数的平方,那比方说呃,这个M还是一,但是他们是不不同类的,不同类的话,那么Y就是一,那么也是只有这个嘛,呃,那Y等于一的时候,那比方它们是不同类,不同类,并且它们的之间的距离特别的大,你说这个DW算出来这个值特别大,那就是正正好是我们需要的,因为我们就是要让不同类之间的距离特别的大,那么呃,这个地方,那它就是大于一的,假设说它们特别大,大于一,那么这个一减去一个大于一的数肯定是小于零的,那最后这个max就得到零了,也就是说,呃。
11:25
这里我写了就是说,如果说它们之间的距离,它们首先是不同类的,并且他们在不同类的情况下呢,它们的距离还大于我们给定的这样的一个叫做,呃,我们期望他们大于的一个距离吧,那么就不做优化,不做优化,因为这里是零嘛。如果说它们之间是不同类的,但是他们之间的距离小于了这个M,那我们就希望呃去调整参数,使得它们这个距离增大到M,因此这个M其实是个参数,呃说我们自己就是一个呃,一个超参数,我们自己设定的希望他们呃距离呃大到一个什么样的程度,我们就呃达到我们的期望,就是这样一个东西。
12:07
那么这个loss它的一个代码的实现,呃,就是这里。啊,其实主要看下这个地方,就是其实就是完全按照这个来设计的。那么这个,呃,Pair wise distance,其实就是啊这个东西。那其实就是计算OUTPUT1和OUTP2它们之间的一个,呃,距离就这个GW,他们GW在这儿,然后再进去。呃,这个地方都是完全按照这个公式来,大家自己看一下就好了。啊,那这个就是一个孪生网络。嗯。看一下啊,好,孪生网络讲完之后,剩下就是三胞胎网络啊,三胞胎网络就是这样子,假设我们现在有一张图,有呃,一张图片uncle,这个uncle表示什么呢?呃,大家可以理解为是一个基准,就是说嗯。
13:05
我用一个句子来作为呃比呃例子吧,比方说现在我有个句子S一个句子S2的句子S3,而这个S1和S2他们的语义。是相近的。而这个S1和S3呢,它们语义。是相反的。那我们希望呃,把这三个东西送入模型之后呢,送一个,呃,我刚也说三三胞,呃三胞胎网络其实和孪生网络很相似,首先这个模型啊,这个M就是model。这三个model他们的权重啊,不是权重,是参数,所有的参数不光权重,包括权重偏置等等,其他的就是各种参数都是共享的,然后呢,你从这儿啊得到一个output,这里得到一个output,这得到一个outut。然后我们希望这个OUTPUT1。
14:02
和OUTPUT2以及OUTPUT3它们之间有个什么样的关系呢?因为他们俩的语义相近的,所以我们希望OUTPUT1和OUTPUT2之间的距离,不管是你怎么定义句,比方说曼哈顿距离,或者是欧式距离,或者是与呃呃余弦相似度等等,反正就是让OUTP1和OUTPUT2之间的距离更接近,然后OUTPUT1和OUTPUT3之间的距离呃比较比较远就可以了。那OUTPUT2和OUTPUT3有什么关系呢?不需要管他们的关系,因为只有S1才是我们的一个基准,这里大家可以理解吗?就是这个,这就是相当于这个图像案例当中的uncle,比方说大家看到这是个奥巴马的图片,然后呢,这个也是奥巴马的图片,但是这个是呃呃,法国总统的一个图片,所以说。然后我们就希望啊,这个奥巴马图片通过这个CNN之后呢,啊,他们啊这里写了全程共享的,呃,然后这个是呃,也是奥巴马图片,然后我们希望这个in beding和这个in beny他们的距离是要相似的,然后这个这个in beding和这个in beding他们的距离是要比较远的。
15:07
那么啊,其实这个模型的话都很很好理解,那么以此类推,四胞台网络什么样子呢?大家也可以理解,五胞台网络大家可以理解啊,最主要是这个损失函数是怎么定义的,那么这个损失函数我定义的其实还是挺有意思的,呃,这个损失函数是这样子的。呃,就是说这个D它是个函数。我把这个写过来了。啊,这个loss定义为什么呢。Max。首先是D。AP。减去DA。嗯,再加上一个F9,然后再和零。啊,这个A表示什么呢?A就是uncle。然后这个P表示什么呢?P就是positive。啊,那这个N就是negative,那对应到这个图片图这个例子来说的话就是,呃,A就是奥巴马的图片,P也是奥巴马图片,那么N就是别人的一个这张图片,那也就是说我们希望这个A和这个P的距离啊,这个D函数啊。
16:13
D函数AB定义为什么呢?定义为啊AB与B之间距离,比方说是这样子的,或者是呢,呃,这样子的。啊,再或者是别的各种定义距离的一些方式吧,那就是说我们希望A和P的距离。减去A和N的距离,再加上一个F系中的距离与邻心相比较啊,那这个地方怎么理解呢?尤其是这个F系统为什么会有这个东西,这个那这里我也解释了,大家看一下啊。我们希望A和P的距离。就是呃,就是我们这个标准的这个图片与真呃与这个呃正立positive正立,它们之间距离应该小于这个标准图片与复力就是负样本它们距的它它的距离,那呃这个的距离小于这个距离,那么也就是它这个负负数,这个负数加上一个action,也就这个margin,也就是这个边际啊。
17:15
呃,这个margin是个超参数,它表示什么呢?它表示的是,呃。这个距离与这个距离之间应该相差多少?也就是其实和前面那个孪生网络差不多,也就是我们心里的一个预期,我们预期就是说相似图片。呃的相似程度与不相似图片的呃相似程度,它们之间应该要差多少才算这个网络是合格的?那么差多少呢?就差这个margin这个值,比方说。现在margin是0.2了,而且我们这个相似图两相似的两张图片它们的距离是0.5,那么这个模型在预测不相似的两张图片的时候,它们的相似程度至少,呃,啊,它们的距离不是相似程度,这个D表示的是距离,它们的距离应该更大,大于多少?大于0.7这地方大。
18:09
嗯,看一下这个,其实看下这个公式就应该能理解了,加上我下面这个文字解释,那么这个就是整个孪生网络和三胞胎网络的一个讲解,其实这个sentence。最主要的地方,也就是这个地方,呃这个地方的一个创新就是把sentence,呃就是把呃孪生网络和三胞特网络用到当中。那么最后,呃,它在保证准确确认同准确性的同时呢,可以将上述就是bet和Robert他们的一个时间复杂度,就是从1万个句子当中找出最相似的两个句子,对。从65个小时降低为五秒钟,其中计算余弦相似度大概就要花呃0.01秒。呃,那么其中的话我还是讲完吧,后面有一些有一些比较小的一些trick。
19:03
呃,比方说。就是说我们前面提到了怎么一个句子的一个表示,我们有两种方式,传统两种方式,一种是所输向量一个平1C输么,这种是啊也是一样的,用crs作为整个,呃。句子的向量,另一种是呢,呃,求所有的token的输出作为整个句子的向量。第三种max,呃,这个max我为什么这里没有写呢?因为它这个地方其实我啊还没有特别理解。照一下。啊,这里因为他说,呃,他这里的max策略啊,他说是计算max over time。Of the output vectors,我不太理解它这个max overtime到底是什么意思啊,如果有有懂的同学麻烦评论告诉我一下,呃,因为我看网上有两种说法,一种是就是类似于max pulling一样,就就去取所有token。
20:14
呃,它向量的一个呃位置,呃就是呃各个维度上的一个最大值,然后来做作为一个新的向量啊全部出来,然后一个新的向量,然后这个的向量作为这个句子的向量啊,这是这几种,那么这几种方式的对比效果呢,发现就是。呃,平均,呃要稍微好一点,也就是说取所有的一个ke,它的向量个均值作为这个句子向量,它的效果好实呢,实影特。好,那么这是这个pulling它的一个策略啊,我们可以看这个模型的图啊,它首先是输入两个句子,然后呃,每个句子通过一个得到一个呃。
21:04
所有单词,所有token,它的向量之后呢,做一个pulling pulling,那么后面的所有的实验采用都是命策略,就是求一个均值,那这里啊,得到一个均值,也就是U,然后把这个句子B啊输入。呃,Birdt,然后呢,得到所有值的向量,然后再做一个均值,得到一个呃向量V,然后用U和V,它这里还不光只是呃U和V,它把UV以及U减去V的绝对值这三个向量全部拼接在一起,也就是说这个这个向量的嗯长度或者是那K里较为长度啊,它的长度是原来这个U或者V的一个三三倍。啊,大家可以看到这里就是它将UV减V的绝对值三个相位拼接在一起啊,并且还要乘以一个权重参数WT,这是一个,呃。呃可学习的一个参数,哎,好,那么呃当然这个地方的话,它这个呃文章当中是用这样一个括号,然后逗号来表示,但是我个人比较喜欢呃,就是向量的拼接的话,我喜欢用画方括号加上冒号。
22:13
呃呃加上呃加上分号来进行这样子这样描述。那么这是对于分类问题。呃的sentence,它的呃一个做法,并且它的损失来说是cross。然后再回归问题当中,也就是计算两个句子的一个相似度的情况下。就是把U和V做一个。那么损失函数是一。这个其实都比较简单,都没什么好说的,后面的话就是一个三胞胎网络啊,他用的一个三胞胎网络,当然这里也是,呃,其实和这个公式是基本上一样的,就是字母变了一下而已,其他没什么区别,当然还有就是它的距离,它用的是欧式距离,就是这个。
23:02
呃,这个这些距离比其他的这个边际啊,Margin也就是这里的F,它设置的是一,那么其他地方就没有什么好说的,后面就是,呃,这个是他用的一个数据集的一个介绍。呃,后面的话这个是呃,他做一些实验,就是说用什么样的策略得到一个什么样的效果,以及前面我这里提到在做回呃,在做分类问题的时候,他呃为什么会选用这个U。一般我们来理解的话,就是说用U和V去拼接就可以了,但他这里居然用了一个U减去V的绝对值也拼接上去了,好,然后他他做一些其他的实验,就说呃,只拼接U和V会怎么样,只有66.04分,但是我们会看这两个。添加了个U减V的绝对值以后,拼接上这么一个新的向量以后,分数能达到80分,相比于前面新增了十四十四个点,这其实呃,说明这个提升还是挺大的。然后他做了一些其他的实验,比方说添加一个UV,以及嗯,或者是只用U减V,只用U减V的绝对值也比单纯拼U和V要好。
24:15
那么这个是他做一些实验,我觉得最重要的,最有意思的就是这个表格啊,因为它涉及到很多平级的实验,这个呃,或许能带给我们一些思考吧,为什么有减就V的绝对值能带来这么好的效果呢?嗯,这个我也没有想出来为什么。好,那么基本上这个呃,模型就讲解到这里了。啊,我看看还有什么要讲啊,应该没有,呃,然后的话,我我记得我之前做sentence啊,不不就做一个句子相似度,比方说呃,我记得我以前做过一个就是说。然后一个汉语。呃,是这样子的,这个韩语,比方说嗯abcd啊,比方说这是个韩语的句子,然后汉语,呃,哎怎么说呢。
25:10
他说这是韩语句子,然后这是汉语句子,然后这是汉语句子,这是汉语句子,那么他们这个汉这个汉语句子啊,是完全由这个韩语句子翻译过来的。那么这样的一个句子对,我们希望他,呃,计算它们的相似度的时候,应该相似度很高。都很高,然后这样它也是翻译过来的,那我希望它的像素很高,然后我自己人为生成的一些复力,怎么生成呢?就是用韩语和它不是翻译过来的,比方说我用S1和S和C2。这样子,然后S2和C1,那么他们俩肯定是完全根本就不相干的东西,那么它们的相似度应该很低,然后我之前是等同的,我之前是就是把韩语通过一个啊inbding。得到这样一个白点,然后汉语呢,也通过得到一个in bed点,然后把这两个in bedding啊硬拼拼接。
26:04
啊,这是韩语的一个in bedding,这是啊,这个inbding是怎么得到的?是就是一个简单的word in bedding。这是一个呃,Word in in白点。然后这也是一个WORD0白领。然后把他们俩一拼接,拼接完了之后直接送一个LSTM。啊,我记得好像是八月20天。然后得到啊,得到了什么呢?BISTEM是这样子的吗?啊,比方说我现在就简单一点,就是一个卡。那我就取最后的它这个输出,我来这里再接一个,呃,线性层linear。然后最后啊,就做一个分类啊,不是不是分类就是一个啊,就做一个linear,得到一个什么呢?得到一个BA1这样的一个维度。
27:00
啊,表示什么呢?表示说啊,后面还做一个soft,不是应该是一个。啊,就是一个smo,这样的话就能让它的分数压到,就是让它的值压到零到一之内。就压到零零到一当中,那么这个值就代表它这个它们之间相似度啊,就是这个意思,然后呢,它这两个相似度呢,我就我的label定义为是零,这也是零,这也是一,这是一,然后去计算他们的啊,我用的是一个MSE去计算它的一个loss,这样子得到一个东西啊我呃,这样效果其实也还不错吧,感觉。嗯,还有就是我记得我试过就是不将这两个向量进行拼接,将这两个向量直接相加,相加完了之后再通过一个STM,然后取最后一个,然后通过一个linear把它转换成be,然后再通过so,呃呃,S。Save。然后也是压到一个零到一的范围,然后再做一个MSE也是一样,好像这两个效果差的不是特别多,只差一个点左右,嗯。
28:06
这也是一种做就是句子相似的一种办法吗?好,那么本期视频就到这儿,谢谢大家。
我来说两句