00:00
大家好,这视频主要给大家讲一下SE to sequence以及它的拖实啊,关于sequence to sequence,它应用的话,包括它解决的问题,别的痛点。大家可以去百度啊,或者谷歌搜一下啊,花个几秒钟就能够很很很快明白了,所以我在这里我也不多赘述了,我主要是从呃,就是实战的方面去讲解一下怎么去呃理解sequence to sequence OK,那么现在呃,我们先看一下这个东西,首先我有这么一比方说,我有个机器翻译的任务啊,我先要把一个比方说我有IK这个下划线。表示的是空格的意思就是I'k然后呢,呃。我把里面的每个词。就是每个字母都转换成小写,转换成小写之后呢,再通过就是那个呃,Word to ID转换成,转换成就是把一个字母啊,不是word X,应该是letter ID X,就是说字母转换成索引,比方说I这个字母它就会转成九,然后空格它就会转成27啊,然后A就会转成一之类的,就是这样的一个呃变化,然后呢,这个是一个呃,法语还是德语啊,这个我也不知道,反正就是一个其他语言吧。
01:14
然后假设说K翻译成其他语言,就是就是这个东西,然后这个东西呢,你把它的character级别,就说字符级别的东西取出来,就是ES,然后空格G啊G这样子的东西给它取出来,然后呢,出来之后全部转换成索引,和上面一样,都都变成索引了,OK,然后我再做一个one hot,那么对于英语的这个句子。啊,我不知道这个声音会不会太大了。OK啊,转换成索引之后呢,做一个one hot。那么比方说这个九,那么对应的就是说,呃,这个向量当中所引为九的位置是一,其他位置都是零,然后这个27就是说第27个位置是一,其他位置都是零,就转换成one hot,然后呢,呃,下面就是数据,有了数据的话,处理就大概这么多,然后我下面就是讲一下呃,To模型它是怎么样的一个。
02:08
好运运行的一个流程。现在比方说我有一个一句英语来了,Go away,然后呢,还是按照上面的步骤,我会把里面的每一个字母取出来,包括空格也是也是要的,然后呢,我先输入G,然后呢,再输入O,再输入空格,再输入a way这样的依次输入进去之后呢,它到最后一个时间步骤,就是说Y对应的这个这个时刻。它会有一个最后final STEM,就是最后的一个隐藏的状态H和C啊,这是个LSTM模型的话,那它就会有一个H和C,就有啊如果是那个。啊。对,就是如果是RN的话,它是一个outt和H,如果是LSTM的话,它会有一个out h和C,而outt我们是不需要的,我们要的只是它最后的final state就是H和COK,那么这是一个Co的一个结构,就是说我把一个句子Co,其他东西我都不要,我就只要这个最后浓缩出来的一个。
03:14
隐藏的一个一些向量,一些信息,上下文信息,我们把它获取出来,然后呢。我再把这个隐藏的这个信息作为。就是说另外一个LTM的网络的一个初始的一个值传入进去,嗯嗯。传输进去之后呢,呃,我在这里。再再去做解码,呃,我想想就是这里吧,首先我把这传进去做一个初始,然后并且在X0时刻,我输入什么呢?我输入杠T-T表示的是就是说一个。就是比方说,假如说这个是德语的话,那么就是对于德语来说,杠T是一个开始字符。我会同时输入,在第零时刻,我会输入开始字符和字符以及。
04:04
Encoder输出的final。把这两个。呃,结合起来输入进TM,那么它会输出一个东西对吧,输出一个呃。就是说出一个向量。那么我要我现在要做什么呢?我现在要做的就是把M。因为这个杠T后面就是M这个这个呃,字母我。和这个P。M对应的one hot和这个P,它对应的一个呃,预测结果求一个cross。然后去反向传播。然后在下一个时刻呢。我输入的是M。输入是M,然后呢,我要让它输出的是A,所以说我此时要把A的one hot和这个时候预测得到的这个P的向量去做一个process反向传播。然后一次继续下去,就repeat this process就是重复这个步骤。
05:04
一直到最后。得到的是什么呢?得到的是这个句子的结束,结束标志。比方说杠T是开始标志,假设杠N是结束标志,那么我应该得到的是这里是杠N,然后这里也应该得到杠恩,然后计算它们之间的cross。OK,那么就是说细节的上来说的话就是首先呃,Encoder,它会得到这个hidden,呃,Hidden state,然后传输进去,然后呢,我一开始输入的是start,对吧,就是开始的一个字符把他们俩传入,然后呢,我这个时候会输出什么呢?我呃不是说输出什么,而是说我希望它输出的这个M。这个字母,并且它这个时候还会得到一个新的呃,Space就是H1和C1,然后下一个时候呢,我再把H1和C1作为输入,M也作为输入,再去呃,得到输出,得到什么呢?我期望得到A,并且此时得到的是H2和C2,然后在下一个时刻呢,我把H2和C2以及A作为输入,然后我期望得到什么呢?期望得到C。
06:09
然后以及我得到了H3 C3,然后继续这样repeat这个过程。最终呢,我要得,我要呃输入E以及它就是说呃H14 c14,那么这个时候我要得到什么呢?我要得到的是。End of end of sequence就是说一个句子的结束标志,比方说我说的杠N。你看这个时候我就要把C14啊,就是说H14和C4以及E输入,那么我应该得到是我期望得到的是杠N,就是说表示是一个句子的终结的一个。标志吧,标志,然后呢,得到这个东西,这个东西其实也没什么用,就是要得到这个而已。然后我就应该返回这样的一个句子。好,那么呃,这个PPT其实讲的蛮好的啊,这个项目的话是这位这位老师他的一个PPT,我拿来讲一下,然后呢,啊,这里有一个图,我觉得画的也蛮好,这个是那个,嗯叫什么?呃,拍拓是官网上关于sequence to sequence模型他们的一个图就是说。
07:15
啊,当然这里面可能会有一些不一样,比方说这里,比方说这个地方,呃呃,这这。这个语言它的一句话,他不光输入这句话,还输了结束标志,而这个PPT里面它是直接输入一句话,没有输入结束标志的啊,当然这个都无所谓了,因为大家可以去,这个要不要其实都是无所谓的,不用纠结这么多细节,然后呢,把它输入,输入得到这个context,比如说上下文的信息Co,那这里看你要是什么东西了,比方说你是RN或者是LSLSTM,它那么呢,这里contest就是不一样的东西,然把contest就是输入。作为这个一个初始的一个隐藏的东西,输。Enter第一个时刻我输入SOS,就是start of sequence,就是说一个句子的开始标志,然后呢,我要此时我要得到的是the这个英语单词,然后呢,下一个时刻我再输入一。
08:14
然后再输入,然后我输入的是输出的是cat,之后一直到最后,然后我要得到是end of end of sequence,那么从这里可以看出呢,它和我们传统的神经网络它不太一样,就我们传统神经网络,比方说你做分类啊,或者是什么样的,呃,一般都是一个输入,就是一个input。然后一个output,或者说叫target。就完事了,但是这里很明显会发现不一样,因为我这里有有两个输入,一个输出,首先这个叫coder input,就是你coder呃部分的一个输入,以及deco inputco input,还有就是deco output。呃,大概是这样子的。对,就是说嗯,所以我是有三个数据在里面去要进行计算的。
09:06
而不是两个传统的话,我们都是一个input,一个output,就两个数据就完事了。啊,大概就这么多吧,好,那我就呃对着代码给大家讲一遍,首先啊倒库,然后呃,然后我这里的话就是说呃。我用的一个是字母S表示的是就是一个句子的开头,字母E表示的是一个句子的终结,而问号啊,这个问号表示什么呢?等会再跟大家说吧。首先我是字母级别的,就是说,呃,首先看一下这个数据吧,这个data man woman,呃,这个怎么怎么理解呢,就是说我不想我我不想用什么英语啊到德语之类的翻译,我就想让men,然后我输入men,我让它翻译成woman,然后呢,我输入black,我让它输翻译成white,就是这个意思。然后呢,这个letter,呃,就是说字符,首先我哪些字符呢,我有SE,然后问号ABCD1直到Z这些字符,然后呢,我要把这些letter就说字母转换成索引,就这样子。
10:11
表示的是什么呢?就是我可以看到这里面,这里面所有单词,它字母个数最多的是五个字母对吧,像woman black white,它都是五个字母的,所以说我们n step就是说呃,我们必须要以五个字母为长度,那么不足就是说长度没有五个字母怎么办呢?比方说man。它只有三个字母,那我们就在后面补pad。补上两个,那么对于呃,大家可能看的比较多的是这样子。PA。补上两个pad。就给它补,补上那12345,这样就就是五个字符了,但是我这里是用的问号。这样的话给他补补上。呃,这样做,为什么这样做呢?我们可以想一下,比方说我这里就设置为三。
11:02
我就设置为三,那么man是刚好可以的,但是woman它很明显长度超过了三,那我总不能把它截取掉吧,那你说截取掉那就是WM,那是什么东西啊,这就不太不太不太对了,对吧。所以我们以最长的那个呃单词它的那个字符个数作为。也也可以理解为max,就是说你最长的是多长,然后N,嗯,N黑的就是说你RN的那个。输出的。向量的维度就是128。然后呢,N class就是因为我是一个分类问题,怎么解释呢。嗯。就比方说这里吧。比方说我输入的是。Ma。嗯。呃,问号问号,然后我是仿照的这个拍它的呃形式来输入的,那么这里还有一个结束标志,结束标志我用的是E。
12:06
那么他会。首先我用H0 H0是我自己,呃,初始化的,随便用一个全零的向量来表示,然后呢,和M进行一个呃输入,然后一依次往下,那么最后会得到一个out,但是这个其实没有任何用,这些都没有用,这些我都不需要。这个都不需要,我需要的是最后的HT时刻的一个hidden state,就是它隐藏状态,它隐藏状态的向量的维度我写在这里了,这个等会再说,然后呢,我会把这个。我会把这个作为输入,呃的呃,这个in code前面这个是一个inco的一个架构,就整个。是个codercoder,要是最后一个时刻的它的,然后传入下去,传入到一个coder,这整个后面这个是coder的一个架构,进去之后呢,我这个时候我一开始的时刻,我输个S。这个表示的是什么呢?这个表示的是。就是这里。
13:00
就是一个句子,它的开始的一个中,呃,呃,开始的一个标志就是呃,就是说呃。就是大家应该都理解了,就是说开始表示这个句子开始了,然后呢,我让他输出什么呢?我希望它输出的是W。因为man我要翻译成woman对吧,Man我要翻译成woman,那么W,然后他这里再输入W,然后我让他,我希望它的输入是O,然后这边输入O,我期望他的输出是。M,然后这里输入M,我期望它的输出是E,然后这里是E,我期望它的输出是N,然后这里是N,我期望它的输出是大意表示一个句子终结了,就是这样的东西,所以预测着呢。呃,比方说我现在输入这些东西之后呢,我预测值是不是五美是这样的一个东西,但是我希望他得到真实的是这样的东西。就是这样的一个意思。所以说嗯,我最终得到的这些东西啊。
14:01
比呢啊,我最终得到的是。就是字符,那么我希望得到哪一个字符呢?这不就是一个分类问题吗?就我就写了class classification就是class,那么你有多少类呢?比方说我这可能分类,诶比呢。啊,我希望把它分成W这一类,或者是分成O这一类,那么你有多少类呢?就是你有多少个这种字符,我就是多少类,当然它也可能效果不是很好,它一开始就分类分成了一个。分成了一个问号对吧,那也是有可能的,但是我会通过反向传播让他去更新参数,让他不断的去调整。涉及的是一个分类问题,然后size都没什么说的了。呃,之后是这里make data这个地方我就要详细说一下,首先我要把所有的数据都弄进来,那么这个呃,Input表示什么意思呢?就是说Co input。就是这里对应这个图的东西。就是Co input,然后deco input以及output。
15:03
那我们可以看见就是说。呃,Input就是原句子,就是原来的一个句子加上一个结束标志。所以呢,呃,我首先去遍历这里面的sequence。就是正面东西,然后呢,原句子是每一个list的第零个位置,Man black king girl这样的东西,所以我呃,去。首先我还是要补齐,因为我的如果比方说我的man他没有五个长度的话,那我就先补上问号,那么它比方说一开始进来,那么man就会加上两个问号,然后woman的话,它本来就是有长度为五,所以它就不会再加,然后呢,Input。它是什么呢?它就是。我会把所有的字母全部拆出来,那就是wa,然后问号,问号后面再加个E,就表示这个,呃,这个单词结束。然后呢,Input呢,我会在前面加一个S。就是表示这个单词的开始,所以加一个S,然后W。
16:03
然后deco output呢?我会在de output,其实和deco input有一部分重叠的地方,就是这个句子它是重叠的,只不过它的标志不一样,我抵扣output,我需要的标志是结束标志,我不需要开始标志。所以说它就会w men,然后后面加上一个结束标志,而不需要这个S开始标志。OK,我想这里的话大家应该都理解了。然后呢,我再把这些所有的就是这个。呃,Input部分我全部都用one hot来表示,那么就是把这些字母全部转换成索引,就是letter to转换成索引之后呢,我用一个啊one hot来表示,然后但是呢,这个output我是不需要用one hot表示的,我只需要它的索引就OK了。所以我就没有用呃派点I来获取它的one之类的,我就output,我直接是传入它的索引。然后呢,我就把它们转换成cancer。
17:02
这里要注意的是,Output cancer必须是long cancer类型。OK。然后呢,我们可以看一下它的呃维度是多少呢?首先对于input or来的input or来说,它是。啊啊,不对,这里应该是六。就一个我一共有六个样本,1234566个样本,就是这里是六,因为是all嘛,所有的样本都在这里了,所以是六个样本,然后呢,N step加1n step就是说你一个单词有多少个字母构成,但是为什么要加一呢?是因为E。我多加了个E,表示结束。字母在这里面,所以说加个一,然后呢n class,因为它是个one hot嘛,然后第input。是什么呢?N step加一,为什么要加个一呢?是因为我有开始的标志加进去了,所以说长度增加了一,然后n class,然后呢,De output,它就两个维度,一个是六,然后一个是N加一。
18:05
然后STEM加一是因为我加了个E,表示结束标志加进去了。那么这里大家都应该明白了。OK,然后我需要把它们就是构建data,然后定义data,那么构建data的话就不像之前那样。直接把X和Y传进去,因为这里面有三个数据。所以电压size是没办法的,所以我必须要自定义自己的电压size,那么自定义自己的电压size就是说class,然后定义一个类,要继承。继承什么呢?继承呃,Toch.data里面的data size这个类,然后里面实现三个方法,一个是initial初始化方法,呃,最重要的是这两个方法必须要实现,一个是你要返回你的数据集的大小,那么我有六个数,六个样本,所以我就只用返回嫩,然后self这个东西就可以了。还有一个方法就是说你要传入一个索引,那么我要返回对应这个索引的这个,呃,数据样本。
19:04
那么我传入IDX,那么我就要输出这三个样本的每一个idx位置的一个样本就。大概就这么多。然后呢,把这个电加size传进去,然后by size设定好SH否等于true,那么就有了,那么它每次就会给你返回三个数据出来。一个是Co input和Co input还有output,它就会传入,呃,我这里好写了,有点问题。啊,稍等一下。这里的话应该是O。这首歌。保存一下。好,那么数据的话,因为我不希望,不希望大家我我不希望这个代码有很多部分是关注于数据的,所以我数据的话写的特别少,因为最重要的还是模型的部分,嗯,因为数据你用不同的数据集啊,包括你在不同的呃。
20:06
就场合场景下去使用都是不一样的,所以说数据你会变来变去的,但是不变的是模型,所以说呃,大家。重点关注一下模型吧,数据的部分写的特别的短,不是很长,好,那么我就说一下模型,首先啊,你有个coder,有个coder,然后我coco都是用传统的RN去实现的,原因比较简单,然后用STM的话,它会比较训练的话会比较慢,时间会比较长,所以用一个传统的RN就可以了。那么传进来呢?首先有Co input以及hidden,这个Co hidden指的是什么呢?指的是。就是这个东西H0。大家明白吧。然后呢,还。指的就是。就是就是这个。
21:02
或者说这个东西。所以说我现在传的是两个东西,一个是。啊,插入三个东西,一个是这个,还有一个这个。以及这个。这三个东西我进来。那么传进来他们怎么用的呢?呃,首先我需要交换维度,因为RN就拍RN它那个官方API,它推荐是使它的默认的是使用的是。放在第二个维度,所以我就需要一,那么把到后面去,把STEP1前面去这样子,那么这两个都是这样子,都是这样要求的,OK,然后呢。我首先把Co input以及我的Co的hidden。这两个东西。传进去,然后最终会得到一个HT。它其实会得到一个out和HT output和HT,但是output我不需要,Output是这些东西。这些东西我根本就不需要,我只需要的是HT,所以我就嗯,只要HT保保留下来,然后呢,我再把HT和。
22:08
就说HT和input作为输入,那么就是这里input HT作为输入,那么最后输出也是两个东西,也是output和HT。但是我要的是output,因为我output里面才有这些东西,才有它预测的一些东西,所以我只要output。我想奥的,然后呢,嗯。关于output和H有什么区别,我希望大家能够,大家如果理解的话。我这里有一篇博客,希望大家好好去看一下。因为这里我讲我我略过了很多部分,因为我觉得大家应该是有这样的基础的。是这个吧,如果没有,如果你这里没听懂的话,不知道他们什么意思,希望你看一下,呃,我这边博客。
23:03
改成这样。就是our leader这篇博客里面有HT和out,它们的区别是什么东西?Out就是out,这里out就是out,然后这里HT就是这个HT。OK,那么呃,把这两个输入之后呢,他们它会得到一个output output就是这个东西保存了它里面所有的向量。然后呢,我就最后通过full connect,就是说经过一个网络,为什么呢?因为你这个output,你的输出的维度是step加。最麻烦是这里你最后这个维度是N黑的是128维的,但是呢,我需要的是一个n class,因为我最后要做一个要要去计算loss嘛,所以我必须要把你的维度匹配匹配上,所以我需要转换一下你的维度,然后通过一个全链接经网络把你最后的这个N的转换成n class。所以说选这个神经网络它的线一层,它里面有一个N黑的,然后呢,输出的这个n class就是这样子,那么它最后得到这个呃,Return的这个model呢,它的维度就是n step加一,然后BY,然后N这样的一个维度。
24:11
OK,我想的话,这里其实这个模型也非常简单啊。大家发现了吗?就是银扣袋,敌扣袋。然后呢,你去把它维度匹配上,然后得到你该要的东西就可以了。好,那么训练的部分,首先训练的部分呢,你肯定要先准备一下这个东西。Include的hidden,对吧,你肯定要准备一下,那么就是这里黑,或者说我给它重命名一下,我们叫做H0,它就是这里的。H。哦,看哪里还用了暗黑的。改了改一下H0,然后这里是H0。应该就OK了,好,那么我选有这个H0 H0的维度呢,就包括RN里面一些东西的维度,大家可以在我这里面看到,就是它是都是什么样的维度,大家要看一下,嗯,我就不解释了,就是这样的维度,然后呢,嗯。
25:04
我用的是我用的这个G,所以把device去。然后他们的维度也写在这里了。然后呢,我这里有个输出,首先我输入模型呢是input,然后呢,H0对吗?然后code input BA这三个东西作为输入,输入之后呢,得到一个输出的是什么呢?输出是个model model它是什么维度呢?是这样的一个维度。这里写了step加1BY size,然后class,那么我还我要计算loss,所以我要给它转换回来,就是把放到前面去,然后这里size,然step加一。Class OK,然后呢,嗯,因为我是就是说。对于第一个呃样本来说,比方说它是这样的一个呃,它是这样的一个预测结果,这是第一个样本,那我计算第一个样本的loss,比方说LOSS1。然后呢,我再去计算第二个样本的一个叫LOSS2。然后我再去计算第三个样本的loss,叫三之类的,那么我要把这些所有的加起来,那么这个。
26:07
就是对每一个样本,每一个Bach啊不不不是每一个Bach是对每一个样本,那么它执行了多少次呢?呃,循环了多少次呢?循环了这么多次。这个答案应该可以理解吧。这里不用这就这样。那么我每次取出来比方比方说predict I,那么它就没有BY这个维度啊,它就只下step加一和n class,然后呢,BA。就是我要输出了我需要的这个东西。就是这个,我计算他们俩的boss。然后它的维度是这个。算他俩的,然后把这个把所有整个办室的loss全部叠加起来。然后呢,去更新啊之类的可以了,对啊,大概就这么多,非常简单。然后后面的话就是做一个test test就是测试,测试的话这里我就不解释了,就大概就也是这么多东西,然后大家可以看一下我运行一下吧。
27:14
哦,还没有连接啊。啊,等会我会把这个PPT放到我的那个视频简介上里面去,大家可以看一下,觉得他这个PPT做的还是蛮好的。嗯,写的还是很清楚的。然后大家有什么不懂的话,不懂的地方也可以在评论区提一下,因为我也不知道我讲有没有讲清楚。包括这里面很多就是说。呃,它的那个维度啊,我都写在里面了,大家如果不懂的话,先看一下代码,把这个里面的维度搞清楚,只要搞清楚维度,我想的话应该都。呃,很容易理解,这其实就一个。
28:03
把你的原来的句子进行输入,然后得到一个最后经过RN,它会得到一个最后一个时刻的隐藏状态,然后把最后一个时刻隐藏状态作为初始的状态输入到D这样的一个R结构里面去,并且同时还要输入的是开始的一个标志,然后呢,我让它输出这,然后呢,我再得,然后这样子,这样这样。然后最后我输出结束的标志大概是这样子吧。也非常简单。呃,当然这里我有一个好奇的点,是我个人感觉很有意思的一个地方,就是说。我知道啊。我的。我觉得seconds two seconds。和那个auto。非常相似。但是他们呃都是怎么说呢,就是说好像你把一个句子啊输入,然后浓缩,浓缩成一个向量,就整个句子很大一个维度的东西,你给它浓缩成一个向量,然后呢,你把这个向量呢,再去拓展出来,拓展出来这样的东西,我感觉和C和奥尼克特很像,奥尼克特尔不也是吗?就是说比方说你输个是图片,然后呢,你给它把它浓缩成一个向量。
29:17
这是一个图片,然后你给浓缩成一个向量,然后你要把这个向量再给它,嗯,解解解出来再还原是一个图片。的输入,还有的输出,而它只有两,它只有两个变量,一个就是输入,一个就是输出,没有。大概就这样子。这是我个人发现比较有意思的一个地方。OK,训练完了,然后我们再测试一下,当然我就是用训练级去做测试,效果肯定很好,这个都没什么说了,那么大概是这么多吧。
30:00
嗯,就是sequence to sequence的一个。啊,包括它的原理啊,以及它的代码实现,我也我也给大家介绍了。OK,应该没有什么了,嗯,那我就本期视频就到这里,谢谢大家。
我来说两句