00:00
呃,大家好,今天给大家讲一下它的使用,以及tune的一个呃方法。呃,这个certainport主要是我用的是这个,就是他们这个论文的作者,他们自己去预训练好了一些模型,然后去使用它,呃的话大家会用的比较多,然后我就讲一下,首先最简单的就是说呃。呃,是使用它是比较简单的,比方说针对一些任务,呃,我这里首先使用和翻ing,我我针对的任务都是语义文本相似度,也就是sts。那么一开始使用的时候,呃。首先你导入这个库啊,先下载。啊,看这个代码吧,首先你去啊,Install这样sentence transformers,然后呢,你呃去导入这个库,完了之后呢,呃去选择你要使用那个模型,呃,因为我这里是使用的sts任务嘛,所以它这有一些预训练好的模型可以看这。
01:02
Brushing the model。Models这里有一些,比方说对于sts任务,它这里有一些啊,比较好的模型的使用,呃,它这呃。这样的。啊,分数多少他都列出来了,然后还有一些全部的列表在这里。哎,就是这个大家可以看一下,然后我这的话就简单一点,我就使用它这个最好的模型,也就是。呃。呃,这个large这个东西。啊,那么这个保险有1.31个G啊,下载的话在里面还是比较快的,两分钟就下载好了。呃,与右内相似度这个任务呢,就是呃,首先我先说一下,就是如果你给的那个句子,你如果获得它的一个向量吧,只要获得向量了,其实一个获得句子的向量了,其实剩下的就好说了啊,其实非常简单,比方说这个就是你的语料库啊,这个语料库里面有这么多个句子啊,一二三四五六七八九十十一啊,有11个句子啊,你把这个句子啊放在一个list里面去。
02:07
那这个sentence,你只要调用这个model model.in code这个方法把sentence去就可以了,那么就获得一个sentence in,它的维度是多少呢?呃,首先这它返回的是个list,并且这个list它的维度是啊,11,然后1024,也就是说你会有11个句子啊,因为你这里就有十一十一个句子了啊,也就是11行,然后每一个句子是用1024为的一个向量。然后这里大家可以看到。你把输出来,首先这个句子啊方这个句子lack个西的,呃表示就是这样,那么它的是一啊,它也是1024,都是1024,那么一共11个。呃,就是这样的一个意思,那你就非常简单,只需要调用这一行代码model in code,就可以获得这样的一个句子的一个向量表示。然后呢,你要去啊做相似度,所以说你要有一个query的一个句子,就是你要用这个句子啊,Query这个句子去找啊,这个语料当中哪一个句子和这个query句子语义是最相近的,或者是前几个最相近的。
03:17
啊,那你就首先你要query它这个,呃,Inco的方法呀,必须传入的是一个list,也就是说你不管是一个句子还是多个句子。哪怕你是一个句子,你要放到list里面去啊,然后一下,然后你就获得了这个que in。啊,接下来得到了这个向量,以及前面语料库所有的句子的向量之后呢,你要去计算他们这个余弦相似,余弦相似度,呃。这样的话才能知道啊余弦距离距离呃,这样的话你才知道哪些呃句子的距离是比较近的,比较近的话,我们就认为他们的语义是比较相似的,比较相近。啊,那后面的话就是比较简单,呃,就是一些函数的使用了塞派D这个函数啊,这个库里面的CD这个函数,那么它们的呃,计算的是一个余弦几离cos,然后把这个query放进来,把这个sentences放进来,这两个都是list,然后得到的是个距离,啊这个地方得到的是个距离,那么我把这个距离从小到大进行排序,那排名第一的肯定就是他们距离是最近的,也就是它们的相似度是最近的。
04:27
那这个余弦相似度这个分数怎么定义呢?我就直接用这个一减去这个距离,呃,因为呃距离越小,它们的分数就应该越大,所以说这个地方就一减就可以了。那最后得出来就是说前三个句子,呃,就语料库当中,前三个最相似的句子是什么呢?假如我这个query句子是这个啊,最相似的是这个句子它们的相似程度,或者说呃,余弦分数是0.59,那一减去0.590就是零点,呃四零左右,那0.40就是它们之间的距离,那它们之间距离就比较小。
05:07
那像这个a man is eating a food,那这个句子,呃,和它的相似度就比较小,那么它们的距离就比较大,那么距离大概有0.80左右,就距离非常远。就是这样一个意思。好,那么这个就是一个呃,非常简单的使用,呃,使用的话还是比较比较简单的,但是大家可能用的比较多的是翻,就是在自己自己的一个训练集上。去对他那个预训练好的模型再进行微调。呃,那么这个翻我用的一个数据集是什么呢?就是一个韩语和中文的一个句子。呃,去计算它们之间的相似度,这里这个是个Excel Excel里面有两列,第一列是韩语的,呃语料,呃句子,第二列是中文的句子。那它这个是一一对应的,并且这个Excel里面全部都是呃相似的句子,也就是说这一行,比方说这一行,那这个韩语,这个韩语翻译过来就是这个中文,这个中文翻译过去也就是这个韩语,也就是他们是呃语义是一模一样的,其实就是。
06:18
呃,这个Excel里面呢,呃,全部都是,呃正样本,也就是语义都是一模一样的,但是的话我去训练一个模型,呃,我还是希望有一些副样本。来呃来进行学,呃让他学习的,那我怎么做呢?我就只需要把这个比方说我去把第一零,呃把这一列全部读出来,读出来之后呢,放到一个list里面去,然后用shuffle给它把这个list顺序打乱,然后再把这一列给它读出来,放到另外一个list里面去,然后再把另外这个list否打乱,那么这个时候他们一一对应的就基本上就不是。呃呃翻译过来的句子,而是比方说这个可能对应到这个时候,然后这个可能对应到这个句子,就呃就是不一样的,那么他们的语义肯定就是非常小。
07:06
呃,要么是零,或者是至少是0.10.20.3左右,呃,这样子一个东西。那么这个。代码是怎么做的呢?啊,首先这个shuffle啊,我是自己定义的一个函数,其实random.shuffle它有函数的,然后这里面放一个list。放一个list进去,那么它就会呃打乱这个list里面的元素,但是random它有个问题就在于它会改变,它直接改变的是你这个呃给进的这个list,它直接在这这个list上去进行操作。而我。不希望他这样,我希望他,呃不改变这个list,而是给我再返回出来一个叫做shuffle to list,我让他返回出来,但是它这个是做不到的,就是random是做不到的,所以说我这里去实现。
08:00
那么好,呃,首先前面是读取数据,非常简单,就呃。我先把第零行的汉语句子读出来,然后第一行的中文句子读来,放到list里面去。嗯,然后呢,我就把这个历史打乱,用我这个自定义的这个消耗函数。啊,打乱。然后再去定义数据集,我们可以看一下。比方说。第零个句子,然后。啊,这韩语看不懂,那看中文吧,是不是就是这个。啊,就是这个第一个句子。那比方说打乱的。那他肯定就不一样了。啊,那就不一样了,而且他们肯定也是不一样的意思,因为他们都是打乱的。呃,然后剩下就是定义数据,它这个地方其实讲的比较清楚啊,就是如果你要去自己训练的话,呃,翻天的话就点这个training。
09:06
他这里会告诉你怎么做。呃,首先的话,你这个模型啊,你去选择一个预训练,预训练的模型,然后这个数据的定义。尤其是训练数据集,它这地方比较特殊,因为它会用到一个,呃,它自己它它自己定义的一个类去包包装你这个数据。呃,比方说。那么这个类就是input,它这个需要什么呢?啊,它需要呃。它需要是一个test,这个test它是个list,然后还需要一个label啊,这个label它是一个float,必须得是float类型,如果是呃,比方说你这写成一,那么就会报错,呃一定要写成1.0,然后这个list里面呢。是两个元素,这两个元素分别是。对于我这个任务来说,那么这个这个比方说第一个就是呃,韩语句子。
10:04
然后第二个就是中文句子,然后这个label表示说这个韩语句子和这个中文句子它们的相似度是多少,呃,我这里就简单一点,就是直接翻译过来的句子呢,就是正样本里面的句子呢,呃,句子对呢,我就直接设置为是1.0,然后如果是打乱的话,我就直接设置他们的label是0.0。有相思都是零。那么大概就讲样的,呃,它需要用这个包裹,包裹完了之后呢,啊,比方说这我就进行一个AA,那么这个A就是一个input example这样一个对象,这是一个类,这是个对象,然后呢,我再去,呃把比方说screen list,它是个list。啊,这里面让我的end,那么这个里面它最后会放进去什么呢?ABC啊D等等等等。那么这个A是个input example这样的一个对象,B也是个input example这样对象,所以说这个list里面放的是全部都是这样的一个input example对象,然后对象里面有什么东西,我也啊讲清楚了。
11:06
所以就这样子的。可以看到它这里样例啊,它这个样例就写的很清楚了,呃,这个input example test里面是两个句子。然后有个label label表示它们的相似度,那么这是第二个input example啊,这是一个句子,然后这是一个子,然后就是它们的相似度。然后全部都包在一个list里面,这个list是个一维的,不是二维的。啊,所以我这里比较简单,我就直接选取。啊,Train size啊,我这里划分了训练集和验证集啊,训练级有12159个。啊,就是把这个,嗯。去这样的一个,呃,前12159个句子。呃,这个是呃一一对应的Co koreal list和cn list1对应的,然后它们标签是因为它是一一对应的嘛,所以是1.0,然后再把一些负样本也放过来,负样本在在这个shuffle,呃cn list和shuffle Korea list里面。
12:08
就拿过来,然后用一个idx,然后这边也是啊,用个input example这样包起来的。然后append到这个train里面去,好,那么这个train最后这个list,这个list里面就保存了很多的呃样本。呃,然后这个,呃,保存很多样本怎么用呢?你再把它放到把这个和model。啊,这个地方你看放这里。把这个塔。呃。和model model是这里定义的,都放到这个sentence data set里面,Sentence data set是这里的一个方函。啊,然后走到一个train data set,然后把这个data set直接丢到data loader里面去,这个data loader就是porch的data loader啊这里。就可以了,然后等于二,那么这样的话,整个完整的一个就定义好了,然后验证是比较简单的验证,就不需要用input example去那样子包裹,它只需要是呃,大家可以看这个SENTENCE1,它里面对于我这个任务来说,那么全部放的都是韩语。
13:18
SENTENCE2,它放的全部都是中文,那么这个第呃第一个韩语呢和第一个中文。然后他们的相似度,然后第二句韩语和第二句中文。他们的相似度就是这样子就可以了,非常简单,验证级的话是比较简单的。呃,验证比较简单,这样就可以了,那么就是这条大家看一下吧,然后这个score也是一样的,就是验证,这全部都是验证的部分,然后验证的话,你只要把它放到啊用evaluation evaluation也是sentence的一个方法。呃个把sentence sentence。
14:02
啊,至此的话,整个数据的部分就讲完了,那么最后你要去训练这个模型翻非常简单,你就只需要把这个evaluator放进去。然后把这个呃,Train objectives,呃,把这个train data load和train loss放进去,Train loss对loss用的是一个语弦项余弦的loss,然后把这个model也放进去就可以了啊,它这地方呃,它会自动检测你的环境当中有没有GPU,如果有GPU的话,它会去自动去使用GPU,所以大家如果用的话在这里。啊,把这个GPU用用打开就可以了。然后这里它还有一些别的参数,比方说I,呃,你要训练几个,看仔细看一下这个里面有什么参数。呃,对。比方说这里面叫什么参数呢,一百六对吧,IPO还有呃。
15:01
Up steps,还有,呃。像。像这个,呃,Save best model,就是说保存你最好的模型在验证集上,因为你这里不是传入了一个验证集吗?在验证集上呃,最好的一个模型,它保存下来,保存的路径。是这个output pass。然后呢,你去经过多少次验证一次呢,就evaluation。啊。那么这个整个参数也讲完了,其中有个地方我们要讲这个warm up steps这个,呃,最后再说吧。好,那么你就然后去训练就可以了,训练完了之后呢,啊保呃,那么保模型就会保存到这个目录下。这个目录啊,就比方说是就是这个,那么这个目录下就保存了这些东西。等的是的话是加载它预训练的模型,而这里的话,你只要把你的目录传进来,那么加载的就是你自己翻to后的模型。
16:11
啊,大概就这样子啊,那么这个model呃完之后呢,我给它加载出来,加载出来我再去做一下测试,比方说我在这里随便挑两句话。好,我再挑一个中文。啊,他们的相度是0.81,但实际上呢,呃,因为他俩是一翻译的,翻译的关系嘛,所以他们相似度应该是一,或者至少是呃,0.80.9这样子,那比方说我选两个不相不就是。不想干那去了。比方说我刚找的是这个句子,那我再找一个呃这个句子,那它俩就是呃,不是翻译的关系,他俩的语义应该是不一样的,那么它的分数或者说相似度应该很低。
17:09
啊,就只有0.09,就非常非常低了,这个就已经,所以它们俩是没有什么相似的,然后我再找一个,嗯。把这个韩语拿过来。呃,然后这个韩语对应这个的话就肯定不是。它们的相似度应该也非常低,因为他俩也不是一一对应的。啊,它的相似度就只有0.12,就非常低,所以说这就基本上算是可以吧,啊,当然我这里有个地方没讲啊,就是说one up steps这个地方,其实我问了这个作者,呃,我在他们给他提个英雄,我说呃。因为其实我自己都不太了解这个v up steps有什么用途,呃,因为在我理解的话,就是说你去加载这个预训练好的模型,那这个模型里面的框架,还有参数什么的,全部都是已经训练好了的,对吧,那我直接去,然后呢,我直接在我的呃数据上去。
18:14
呃,翻就可以了,但是呢,我问他,我说我可不可以删除掉这个work steps,以及这个到底有什么含义,他就告诉我说,呃,如果说我不是从头开始训练,也就是说当我要翻冲的时候,我必须要用这个参参数,呃,因为这个参数可以让我的模型提前去预热,或者是。呃,其实我就不太理解了。呃,就是以避免模破坏模型之,呃,以免破坏模型之前学到的内内容啊,这个地方我就不太理解了,因为他如果是比方说热身的话,那我也没有给他热身的数据啊,因为他肯定是在他原始的那个数据上去进行一个warm up的,那我这里也没有给他我呃原始的数据啊,我给的是我自己的数据啊,那他怎么去进行一个warm up的。
19:10
还有说不破坏他模型之前学到的内容,这个地方我就嗯不是很理解了,反正我想了一会儿没有想明白啊,大家如果有理懂的话,可以在评论区告诉我啊,那么本期视频就到这,呃,这个视频的文章是这篇,到时候我会挂在我视频下方,好,谢谢大家。
我来说两句