00:13
上回课程结束之前呢,我给大家简单提过了一下这个循环神经网络,那么相比于卷积神经网络呢?循环神经网络是食欲上的一个循环的一个信息,对吧?那么它每一步都会产生一个对应的一个输出,那这个输出呢,你可以把它拼起来,你可以取最后一刻的输出作为它的一个啊feature的一个表达,也可以做很多很多一些其他的事情,包括给大家讲过一些match model,对吧?也可以把最后的一刻的时刻的这个向量拿出来,和图像扔到CNN里面,得到的一个向量做一个match,对不对?你就可以做一个图文匹配对吧?可以做一个呃,自动评论对吧,那可以做一些其他的一些类似的工作。但是呢,还有一类工作,比如说像机器翻译文档自动总结,或者像对话系统,你并不能用一个feature去表示所有的东西,打个比方说,机器翻译呢,需要产生的是什么呢?是一串一系列的一个token。
01:10
是吧,比如说你明天有时间吗?那么你不可能只回一个一个词,对吧?你只会yes或只会no,那不是每句话都是这样子,那对于文档自动总结呢,也是一样的,左侧呢,你扔进去一个文档,右侧的呢,能给你回答出一个标题,一个总结,对吧?那基本上就是几个字或者几个词,就把这个文档的核心意思给概括了,包括对话系统啊,左边说了一句话,那右边会回一句话,那么这个右边的回这句话呢,可以长也可以短,并没有人对它的一个长度做限制,所以我们并不能说右面是一个feature生成出来的这样一个一个token,对吧。所以说关键的问题在于哪呢?我们现在必须得有一个结构去完成这样的一个工作,那么就有人提出了一个基准的模型,叫做sequence to sequence。那么什么叫sequence呢?Sequence讲的就是一串序列。
02:04
打个比方说哈,这是一个词,叫我。这是一个词。今天。这是一个词。呃,出去。然后后面是出去放下面哈,然后旅游。就是旅游吧,OK,那。这四个词呢,就是什么呢,就是四个token对吧。他们组成了一个sequence。现在呢?我说了这样一句话,那么你要给我回答一句话,你也要回答一串token,也就是说你也要回答一个什么sequence。所以说呢,我们说这个模型叫做sequence to sequence。那这个模型呢,怎么去做呢,大家就会去想哈,如果你说。当你说我。我的时候不会产生一个向量,对不对,会产生一个feature,因为这是一个什么,我们在这个地方有一个RN的一个cell,也可以是RM的一个一个细胞,对吧,RCM,或者是之前给大家提过的GRU都可以。
03:06
对吧。无论它是什么都没关系,他在这一时刻上接受了我的输入,得到了一个featureer的输出,对吧?这肯定毫无疑问的,然后呢,这个cell向后移动了一下,又开始接收,今天然后呢,它又输出了一个feature,对吧?那这是一个什么?循环神经网络的一个定义嘛,对吧,它是循环向前的,它每时每刻呢都会产生feature,那么如果你用这个feature呢去预测。回答答案里面对应的那个词,比如说我今天出去旅游,然后我说啊好啊。比如说我说好啊。我也想去。假设我说了这样一句话。那么你如果用这个feature去预测好啊,然后呢,用下一个今天这个feature去预测我也或者说预测我反正是看切词了哈,然后出去呢预测也想去看起来这样做是可以的,但是呢,回答和问题并不一定是一一对应的,有可能我觉得你出去玩我心里很不平衡,所以我发表了一大篇原言论,对吧,那这个时候怎样让这句话被生成出来呢?
04:15
其实我们可以用到最简单的一个思想哈,就是说当我先听完这句话,我把这句话全听完了,那么不管是我把每一时刻的feature做一个相加,加和哈比,比如把那个feature都加在一块儿。不管什么方式,是把feature加一起,还是这句话最后的一个final state。这个feature呢,就代表了什么。输入的sequence。输入的sequence,也就是说哈,输入你到底说的是什么,我们已经不关心了,那么输入的sequence,它对应的feature我们已经拿到了,我们可以认为只要学的好,那么这个feature就能代表这句话对不对?之后我们怎么做呢?
05:01
之后我们把这个feature再扔进另外一个循环神经网络里。大家知道哈,循环神经网络这是一个cell,就这个cell,它是不断的在向向前移动的。这个CE呢,它有一个什么初始状态对不对。他该有一个初始状态,这个我们之前讲过了。那最开始如果你什么都没有的话,初始状态就是零,对不对,肯定就是零啊,里内部的向量全是零,那么我现在把这个feature扔进来,让这个feature接过来,让它变成它的初始向量。于是呢,我们就学到了一个什么呢。学到一个以这个feature为初始向量的时候。当你每一次接收到了一个输入,你该去说什么话?打个比方说啊,我刚才说。我今天出去玩是吧。然后呢,你现在根据这句话得到了一个feature,比如说是001。
06:00
然后呢,你把这个feature扔到另外一个循环神经网络里。这个群号神经网络怎么最开始怎么去训练呢。在训练的过程是这样的啊,比如说我说好啊,我也要去。好啊,我也去是吧。在这个feature这个001向量这个扔进来的条件下。第一次输入go。这个go不是个字符啊,它就是一个ID,因为我们之前讲过,在循环神经网络里面,所有的token都是ID,对吧,就是说这个网络它什么都看不到,他看到的是一个ID,是01234。然后呢,根据0234这些数字去对它这个词,这个初始化的词向量矩阵做一个索引,然后把这个词的向量作为它的一个输入,对不对?Go,比如说它是一的话,那我为什么go是一啊,因为我我总共有三个东西啊,总共有pad,还有go,还有一个us,我一会给大家讲一下。够假设,我就现在认为它是一,它肯定有一个对应的向量,对不对,最开始我把这个向量扔进去。
07:06
那么这个时候这个cell接收到了什么呢?一个初始状态叫001对吧,是一句话,就是说你这个encoder的这个一个结尾,对吧,同时呢,他还接收到了一个什么呢?Go这样的一个输入,所以说他知道当你输入到go的时候,我得开始预测了,预测的内容是什么呢?就是根据这句话,他所给我限定的范围,这不是一个feature吗?给我限定的范围预测一个词,那这里边预测的肯定就是好啊。对吧,那最开始他学的肯定是错的呀,他他预测的肯定不是好啊,对吧,肯定预测的是其他的值对吧,那其他的值预测出来是有什么有损失的嘛,是错了嘛,有是有有损失,我就需要在这个feature的条件下,在购输入的情况下,必须给我预测什么好啊,对吧?所以只要两句话的feature差不多的话,这个地方一定会说好啊,打个比方说,我说。
08:02
Coder的地方,我说我今天要出去玩,那么这个feature和这个feature是不是差不太多对吧,扔进来以后呢,他的输出仍然是好啊,然后后面也是一样的,我也要去对吧,那么第一个输出了好啊。第二个它的输入应该是什么呢。这个地方大家注意一下,这个地方有一个技术点叫做错峰。就是说我们要交错一位,把它给输入进去,这个地方你要输入的是什么好啊。然后让他输出我。然后第三个位置输出,我第四个位置输出也。然后最后一个输出什么野。最后一个输入也去。那么当他输出了去以后呢,上边是输出完了,但是你下边没完事儿啊,下边还得接着往下再输出一个什么。我也去对吧。去之后,你要预测的目标是什么呢?因为这句话已经说完了,我们可以在无形的在后边看作什么,这个地方有一个结束符,我们称这个结束符为EOS,我们让他预测一个东西,叫做EOS。
09:12
明白了吧,这是神经网络的一个encequ这样一个基本的一个玩法。我再给大家捋一遍。我说了,我今天出去玩儿。把这个final state扔到一个新的循环神经网络里,作为它的初始状态,作为它的状态,然后呢,再给他一个go。他就知道你说这句话,我要开始回答什么,然后呢,每一次都把你这个标这个答案呢,错一位输进去。就可以了,那最后一个输输出的是us。大家明白这个过程吧,这是什么呢?训练的过程。训练的时候,我们知道这个答案上下就是错开的。所以呢,我们并不需要把每一个输出连到下一个输入。
10:00
明白吧,但是在预测的时候我是不知道答案是什么的,预测的时候它的做法是这样的哈,首先呢,我还是输入一个go。让他输出一个,自己就输出一个好啊,之后怎么办呢?我怎么能知道我该说什么呢,我把好啊。再重新输入神经网络。那么这个地方一旦连起来了,它就会看到好啊,就跟刚开始看到训练数据是一样的,对吧,它会产生一个我,然后我之后呢,你再把它连过来。每一只要你每一时刻。都向自己连一下。它就会产生一句。正确的一个话,对吧?正确的回应,那么当你输入到最后一个去,这个去又连过来了以后,产生的是什么?Us对不对,Us后面呢,你就要么你就可以终止解码对不对?要么你可以把后面都看成什么,假设你训练的过程中,Us后面你也扔了,后面全是us的话,那上面肯定什么都没有,对吧,后面都没有东西了。这个过程大家明白哈。所以呢,通过这个模型,我们呢,就把这个,呃,包括措施机器人。
11:07
作诗。聊天机器人。以及一些其他应用,比如翻译。什么还有一些那个,呃,摘要这样的一些sequence和sequence的一些。任务都解决掉了。这张图是官方提供的一个图。首先呢,我们有一个什么,有一个句子对吧,然后都输入进来。最后呢,大家能看到这是个l s tmce内部的状态呢,大家不用关心,反正它有一个输出的一个vector对吧,就出来一个VE,然后呢,我们扔到一个新的一个叫decoder这样一个sequence里面去。这样一个这个一个循环神经网络里去作为初始状态,并且给一个start,这个start就是我刚才讲的那个go,对吧,那至于什么是start,是就是至于start或者go对应的向量是什么,根本没有关系。呃,你如果强迫那个向量等于一,那他就学学会匹配一的,如果你强迫他是零,那就学会匹配零的,当然了,你随机给他一个随机初始化就可以,然后让他去自己去选OK,然后呢,扔到一个star进来呢,他就会回应一个yes,然后呢把在训练的过程中呢,你是把这个呃答案呢错一位输入进去,那在预测的时候呢,自己跟自己连起来就可以了,就预测到N之后就停下来了。
12:30
那么我给大家讲讲一个聊天机器人,这个机器人的代码稍微有点多,我从头给大家讲一下这个数据加载啊,以及这个模型构建的一部分。首先呢,我们看一下这个目录结构啊,一般这个目录结构呢,是分为三个加上一个呃根目录对吧,那个三个子目录呢,就是第一个是数据文件,第二是保存模型的,第三个是它的一些数据加载的一些类。那么最外层呢,这个chat boat呢,就是它的这个,呃,就是它的这个主文件。
13:01
那么我们看一下。啊,那么我们看一下QA这个文件哈。呃,这个文件呢,因为数据是社敏的,所以呢,我只从这个小黄鸡的这个数据里面截取出来了十几句话,我们只拟和这十几句话,那么如果大家后面呢,遇到了自己的一些需要的一些应用呢,大家可以自己去找数据,呃,不管你找到什么样的数据,只要你把它转换成一个Q,一个A,对吧,这样的一句话。就OK了。然后呢,我们有这个文件以后呢,我们看一下这个文件的加载。文件的加载呢,是在这个。Data这个文件里面,这个Python脚本里面。这里面呢,首先我们定义了第一个类,叫做辅助的code。我给大刚才给大家讲过,我们有三个辅助的code,对吧,首先呢,第一个是pad pad是什么干什么用的呢?我们在做循环神经网络的时候,也给大家说过哈,一句话呢,它不可能是一边长,它可能有的有句话特别长,比如说是呃,50个字。
14:05
有的话呢,可能只有20个字。那么一个BY里边。肯定有的长有的短,对不对。短的怎么办呢?短的要把它补充一个叫做pad的一个字符。我刚才还给大家说过啊,我们所有的循环神经网络啊,能看到的都是ID对应的向量,对不对,所以我们在把数据送进去之前,要把它先作为ID转换,所以呢,循环神经网络呢,看到的是这样的一个矩阵。ERE。三。嗯,421。568之类之类的哈,1213呢就是一句话,421也是一句话,比如说一对应着,如果是一对应着是我的话,比如说二对应的是和,那么三对应的是门。那么第一句话在讲的就是我和我们明白吧,这句话呢?我们真正神经网络在拟合的是什么呢?拟和的不是数字,而是一个token之间的一个什么?
15:07
一个关系。我和我们这句话扔进来以后,它是四个字了,那还有可能是什么?呃,和我,就是你和我,假设是你和我对吧,那就是三个字怎么办呢?我们在构建词表的时候。把零那个位置空出来。扔到后面去给他做一个补留。我们会对这个sequence,每一个sequence记着,记录一个长度,第一个sequence是四,第2SEQUENCE是三,对吧,第三个也是三,对不对,我们扔到这个RN里边,包括RTM里面的时候。这个三和四就会告诉他,告诉这个神经网络,你只算几个输出。比如说这个哈,他就只算三个输出,就得到了一个什么final。他不会把零这个位置的一个输出当成state,他只会把这个位置的输出当成明白吧。
16:03
那这就是这个padding的一个意思,那么第二个呢,我们还有一个go,这个go就是我们刚才说过的,在decoder的时候。我们要有一个什么启动的一个。一个够。输进去。有同学会问他,为什么一定要用go?其实因为什么呢?不管是在训练还是在预测的时候,如果你没有这个够,你都不知道第一个词应该是从什么开始。明白吧,因为假如说我打比方,现在你要预测,那么你肯定得先输入第一个词才能开始开始往外吐吐答案嘛,对吧,你得输入第一个词或者第一个字开始往外吐答案,那么现在你都不知道第一个词是什么,你从哪开始呢,对吧?所以呢,我们假设第一个词统统统一的全是go。还有一个第二个有一个什么us,什么是us呢?就让他不断的吐,不断的吐,对吧?答案一个token,一个token吐,吐完token再转换成这个串,或者转换成这个word就是一句话了,它肯定有一个结束的时候。
17:06
对吧,他不可能说说浅没完,因为你E是什么,是参与训练的对不对,Us是参与训练的。呃,最后一个词,假如说我和我们,那他看到了门以后,他觉得这句话你应该说完了,所以他会预测出来一个E。当你检测到有us的时候,你就不要再进行解码,这句话就解完了,明白吧,这就是us的一个作用。然后呢,在BA date里边呢,BA就是一个BA date啊,我们有五个输入。第一个是query input,这是给他刚才给大家讲过的啊,Query input呢,实际上是一个什么呢?二维矩阵对吧,第一维是败取。而第二位是sequence。BY去呢是比如说是50个,就说对BY里边有50句话,Sequence呢是每句话最长是30个字,那这就是50乘30的这样一个矩阵。为什么要有第二个Les呢?
18:00
刚才也给大家说过,就是如果你这个句子啊,长度是不一样的话,你得把Les传进来,告诉RN做到哪一个位置是得到了final state。否则他不知道,他就把后面那些ping,那些零都输入进去了,然后开始算final state,这是有问题的。接下来呢,Answer input answer也是一样的answer target是什么东西呢?这个就是我们刚才说的错峰一个输入的一个。其实呢,它并不是错峰啊,真正讲错的错峰的是answer input,因为我们刚才给大家讲过,Go是第一个输入对不对,所以说这时候得到target什么第零个元素,对吧。就得他给的第零个元素,这详细的就不写了哈。然后datarier呢是一个类,这个类专门负责从原始数据里面构建词表,并且把要加工的数据呢做ID化。首先呢,我们看一下它有这样几个。嗯。成员第一个是query,第二是然后还有一些构建必须的一些对吧。
19:03
然后呢,还有三个就是刚才我们上面那个o code里面定义的这三个三个token对吧。然后呢,Load chart load char data呢,就加载了这个我们刚才说的这个try data里边这个协聊数据。嗯,大家下来可以调一下看一下哈,它这里面的try number number呢就是二对吧,一个Q一个A,然后使用什么杠T风格对不对,然后呢,Query呢,就是左边那个answer是右边那个,然后我们把query和answer加到一个列表里去。当我们把这个数据加载完之后呢,我们要去形成一个cos,形成这语料库,怎么去做呢?我们把所有的串都加在一块儿。在循环神经网络里面,我给大家说过啊,我们可以基于字,也可以基于词去做这个事情,但是呢,我们现在基于字去做的,呃,基于字有它一定的好处哈,词有很多很多,但是字就那么多。比如说这是一个词表。这样,这是词表啊,第零个呢,我刚才给大家说了,对应的是pading,第一对应的是go,第二对应的是us,下边对应的是所有的字,对不对。
20:10
你很快就建构了很多很多字,所以说呢,不管你见到任何一个新的生僻单词的时候,都可以拆解为两个字或三个字来去表达它。所以说这样的情况下,所谓的OOV的问题就非常非常少了。原来我没有见过这个词的话,我就没办法表达它了,但是如果拆成字去表达的话,我就可以去表达对吧。之后呢,我们调用了一个counter去对所有积累的S做一个计数。然后做排序,然后呢,把它和这个,因为我们前面有三个字符,对不对,012嘛,对吧,所以我们从三开始,然后把这个字符呢,做一个编码变成一个。并且呢,把的。之后呢,我们有一个函数叫做prepare to train,这个函数主要做的工作呢,是把现在的query和都变成ID形式的,那我在这里边能看到,对于每一个串,在这个query里面呢,我们都做了一个to ID的这样一个转换,所以当这句这这个函数执行完以后呢,Query和answer就都变成了一排数字。
21:19
对吧,后面呢,我们又做了一个这个沙uffle shuffle是什么意思呢?就是我们为了让这个训练数据比较均匀,不让它产生一种训练数据上的一种倾斜,那么我们会把这个数据做一次整体的一个沙Le。之后呢,我们得到了这样一个query和answer。这个是在预测的时候啊,这个展示就大家可以自己看一下就OK了。然后我们接下来呢,有这样一个函数叫next bitch,它就是说首先看了一下总共有多少个呃样本,然后呢,你是多少就能得到你这个I是总共能就总共有多少个bit对吧。然后呢,每一次的start呢,就是说I乘上size n呢就是I加一乘size,然后从里面去索引那个query和这个answer,并且把这个N通过这个公式给算出来就可以了。
22:11
然后呢?算出以后呢,我们把把它转化成这个ipad这个形式啊,把它送到这个神经网络里,这个函数呢,这个这个文件呢,大家可以单独的运行一下,大家能看到啊,这个函数运行起来应该是没有问题的,这样我们才能进行下一步。然后呢,在这个文件里呢,主要就是一个比较大的模型叫sequence to sequence model啊模型的第一步呢,主要是加载这个训练数据。那它加载了这个,通过调用这个date per load tra date是吧?加载之后呢,做一个词表,然后再做一个呃,训练数的一个转换。之后呢,去做了一个字典的一个damp对吧,为什么damp字典呢?因为他下一次还要influence,他要去load这个字典才能去推断明白吧,因为因为字典是当你训练完之后,字典就没了,对吧?如果你必须把它把它保存起来,后面才能继续使用。
23:09
最核心的就是建立模型这个位置哈,这个函数。第一步呢,还是这个query input和query l,就我们刚才讲过的这query l呢,就是说我说一句话对吧,那这是二维矩阵,这是一个一维的一个向量对吧,然后answer input target刚都说过了。Batch size呢,我们这里边是通过对query input做一个动态的这样一个调用,去查看这个Bach size是多少,然后我们接下来看这个mode哈,如果mode是train的情况下呢,我们这个最长的codede的step就是你最长要解码多少次呢?那就是answer answer learn呢,我们在datari里边呢,已经给它加一了。让他靠这个地方的处理。已经加一了,为什么?因为我们说过啊,在answer的这个抵扣的这个过程当中,你是有多了一步的,多了一个go对吧,下面多一个go,上面多一个E对吧。
24:04
啊,然后sequence mask呢,是我们后边要算这个loss用的,直接对这个呃,取过来用就可以了。当model的是如果是抵扣的时候呢,我们这抵扣的时候,我们并不知道这个总共要输出多少步,对吧,所以我们就给它乘十,随便给一个数啊,让它足够大,别说刚抵扣到一半,我给它切断了,那就不太好了。接下来呢,是刚才说过的,从一个token怎么去构建一个呃,一句话的一个向量表达的一个过程,首先我们初始化了一个。词的一个inviting矩阵。它的大小呢是war cap size,然后它的这个列呢,是inbding size,这是一个什么过程呢?哈,大家可以看一下这个图。它的行方向呢,是对吧。我刚才给大家讲过一个size呢,它大概是这样的。比如说零是什么?是pad?
25:00
一是go。二是us对吧,后面还有很多很多这个各种各样的字。三是一个字,比如说是我对吧。都是字,那么这个东西送到神经网络里边呢,神经网络肯定是不认识的,对吧,包括零同学它也不认识,怎么办呢?我们随机初始化一个矩阵,一个查询矩阵。0PAD我随便给他一个什么了,256维或者128维的一个向量一也是一样,反正呢,就给它变成一个向量。全部都变成向量,那这样就是一个矩阵了,对不对。我来一个单词的时候呢,我怎么知道这个词,它的神经网络的一个输入是什么呢?直接到这个矩阵里去查询这个向量,把这个向量查出来扔到神经网络里就可以了。然后接下来呢,我们对这个查询出来的这个query和answer都做,都做了一个inbding是吧,就用刚才的方法做inbding,当我们把query in r。
26:02
那它有很多output,每一时刻都有一个output,同时有一个最后的一个什么encounter,一个final state,对吧?Final state呢,可以给我们用来解码使用。中间那块呢,是一个闭幕色区所依靠的一个使用的一个代码,我们可以暂时先不看哈,下面是一个attention的一个代码,可能我们先暂时也不看,我们从这个地方开始看。有一个decoder cell对吧?这里有一个decoder cell,它的初始状态呢,是从这个Co state复制过来的,大家可以看到这个地方就接上了。接下来呢,会给他提供一个decode这样一个层,然后这是一个它的内置函数需要用的一个层。接下来呢,如果是在训练的过程呢,我们使用一个叫training helper的一个类,这个helper呢,当然你不用管它内部怎么实现啊,它基本上实现的就是三个函数,第一个函数是初始化函数,第二是每次迭代的函数,然后第三个呢是那个呃,预测的时候的那个函数。那么我们直接调用training helper,然后输入我们的answer inding answer inding是什么呢?就是我们刚才说的这个我的我的answer是吧,在这个第一个时间是够的这个,那么每时每刻的这个词的一个向量的一个输入。
27:12
并且呢,把这个answer输进去。然后呢,这个时候呢,Training helper呢,就知道了我这个输入是什么。接下来呢,我们把这个training helper呢,使用这个basic decoder呢包装一下。Basic decoder呢,需要两个重要的一个输入,第一个是decoder cell,第二是training helper。Deco是什么东西啊,就是我们刚才上面说的你的一个解码的一个什么单对吧,然后training呢,就是你数据的一个来,那么这两个组合起来送给这个training decota,然后之后对他做这个动态的一个解码就可以了。De outputs里面,我们去调用它的这个r output就得到了de的一个log,这个log可以直接用来我们来计算这个我们的loss。明白吧?
28:00
然后。这样的话,我这个loss就算完了,之后呢,我想知道这个sample ID,就是说我现在这个,呃,预测出来的ID是什么,也可以直接通过deco output里面的sample ID得到。那么这就是一个简单的一个训练的一个过程。如果是在解码的过程当中呢,解码的过程当中啊,有两种方式,第一种方式呢,你是使用并用色取。第二种方式是不使用闭幕色区。那么什么是闭幕色区呢?这是一个呃,我们在搜索当中哈,会用到的一个技术。大家知道我在解码的过程呢,是一个迭代的这样一个过程,我第一时刻,比如说有可能是生成的是我你他。对吧。但是你如果第一时刻生成了我,那第二时刻就会生成什么,另外三个三个字对吧,如果是你也是另外三个字。我现在的目的呢,是生成一个合法的序列出来,那第一种生成的方式呢,就是我就挑选一一个什么,呃,每一时刻都是它的最大概率的token生成出来。
29:07
就是每一时刻都是最大的概率的token生成出来。这种方式呢,叫做greedy。就是贪婪。因为当我没有生成出来之前哈。我是不知道我要生成什么序列的。对吧,那我如果生成所有的序列,然后去穷取,然后去看哪一个序列更好,这个显然是时间范围内不允许的,对吧?所以第一种策略叫格,第二种策略啊,因为格蒂你只能生成什么一个路径,对不对?你只能生成一条,每次都取一个最优的马,肯定生成一条,那么我现在想生成三条怎么办呢?这个地方用到的技术叫闭色学。大家下来可以看一下这个代码啊,它主要做的做法呢,就是说第一次生成我你他对吧,那现在这是三条路径,你这现在只有三条好。第二次我有什么三条,你有三条,他有三条,总共变成多少啊,现在变成九条是吧,在这九条里边,我挑最大的三条,比如说是我一个,你一个,他一个,把这三条留下来。
30:15
这两条就都砍掉。明白吧?在每一时刻都做这样的一个工作。这就是闭。如果在解码的过程当中使用闭幕色序的话呢,你在这里面要需要把这个encoder相关的这个变量都把它做一个tba,给它乘上一个beam wise。把它扩大成原来的三倍或四倍,然后用使它可能适应这个并摄取勾这样一个解码的一个过程。那么我们就简单说一下这个,呃,Greed的这个方式哈,我们刚才讲过,其实greedy在大多数情况下已经够用了哈,Greedy呢,就是生成一条路径,就最贪婪的那条路径,首先呢,这也是个helper,对吧?这个helper呢,嗯,你要给他一个start token,这个start token是你自己定义的,Token呢,就是我们说的那个,呃。
31:05
启动的那个token,那这个token呢,它是一个向量,你不能说呃,只给他一个go,它不会帮你自己生成哈,你要把这个ship给他生成好,然后把这个token给他送进来。然后呢,N的token也是一样,N的token呢,它并不需要你把它送好,不不需要把它写成一个败血形式,你只要给它一个单个的变量就OK了。然后呢,Inbding呢,你给他一个inbding matrix,这个就是我们之前说的那个呃词向量的一个查找矩阵,对吧?然后呢,他这个helper呢,就会从这里面去不断的查找,每次迭代一个新词出来,就会查找一个向量出来,然后再送到下一个RN里边。然后接下来呢,把decode cell和deco decoding helper呢都送到这个basic decoder里面,然后去做这个decoder对吧,然后之后做dynamic decode就可以了。这就是呃,所有全部的一个这个神经网络的一个内容,后面的有一些呃保存模型和一些加载模型呢,相对来说要简单一些。
32:05
然后呢,群里面呢,也不是很复杂,在这里面呢,我做了一些输出的一些工作,大家可以边训练的时候边看一下。然后呢,在这个main函数里面,我们有两种选项哈,如果你是在刚开始第一次训练的时候呢,你把它改成train,把词典damp下来,然后呢,建立模型,然后就开始训练了,在这里面就开始训练了,它会打出这个loss,也会打出这个,隔一段时间会打出一个这个你。答案,现在生成的怎么样,好不好?大家可以看一下。然后呢,如果现在你是改成抵扣的话。他主要做的事情呢,是加载还是加载模型对吧,然后呢,这个时候做的就是把词典加载起来,嗯,然后呢,做一个推断influence在里面,它会把你这个model的这个参数呢加载过来,具体细节大家可以参考这个代码。那总体来说呢,我们这聊天机器人的模型呢,就是这样的,这也就是说我刚才给大家讲过的sequence to sequence模型的一种啊,比较经典的一个实现,然后我们今天的课呢,就先到这里,大家有什么问题呢,可以随时下来再跟我交流。
我来说两句