00:00
呃,大家好,今天给大家讲一个directional ls TM模型以及它的应用。OK啊,首先你看这个视频的话,需要各位有LSTM的基础,就是你要明白LTM它大概的工作流是什么。然后他为什么会有STM,为什么不用R,这个需要大家去了解,如果不了解的话,可以看一下我这篇文章STM啊,看完之后你会对STM在理论上有一个明确的认识,然后呢,你再去看这我的这篇章拓的S需要些是些入的值,它的维度是什么样子的。这样话就就就会很好理解,OK,那我现在开始讲一下这个直接就讲代码吧,啊首先我还是给大家一个,呃,问题的背景,就是我现在有有这么一句话。啊,这个这个是一句话,而不是两句话。嗯。稍等我打印一下给他看一下就知道了。
01:05
呃,我打印这个sentence,它其实是一句话,并且它就是一个string string类型的一个呃数据。OK,那么现在有这么一句话,然后呢,我要输入一句话,比方说我输入这个词get up,然后呢,后面全部都是用。就是说用我不知道什么词,比方说我就用叉叉叉叉叉来来代替,然后呢,我比方说我输入对,然后叉叉叉叉,然后他让我,他输出的是什么呢?输出actions actions,呃,再比方说我输入get actions,然后后面叉叉叉叉。不知道什么东西他要输出,什么他要输出。然后呢,我输入gith action,然后叉叉叉,它要输出it。就是这样的一个问题。也就是说给你一个长句子,然后呢,我要输出这个长句子的下一个单词是什么。就是这样的一个意思。
02:01
呃,OK,好,那么呃,我先倒库,然后嗯。定义,这是一个数据,我就用一句话来测试就行了,然后呢,呃,Word to idx idx word,这都老生常谈了,我就不说了,然后就是说。实际上,这也是个分类问题。就是你输入get up,然后呢,你让他下一个词,你让他输出什么,那不就是从你的词库当中选择一个词来输出吗?那其实就是个分类问题,所以说n class,然后等于。等于里面不同词的个数。OK,然后ma。指的就是这一句话呢,它的到底有多少个单词,有多长?呃,为什么要这样子,为什么要保持这个东西呢?因为你的输入啊,比方说我输入get up,然后呃。然后我需要让他预测出。Action,那么呃,但是我其实不单输入的是get up,我输入的是get up,然后问号,然后问号,然后问号,然后问号。
03:03
那么有多少个这个问号呢?有。比方说我这个这句话,比方说它有21个单词。那么我这已经有了给一个给塔,所以我需,那么我一共就还需要20个问号,这个问号你可以理解为什么呢?理解为占位符,比方说A,诶。就是它并不是一句完整的句子,但是呢,我需要用一个东西把它把这个单词所在的位置占住。然后呢,我输入guar,然后AA,然后输出actions,那么还有就是我输入AR。Actions or a a。然后我让他预测出什么呢?预测出X。那么这里有多少A呢?就应该有。21减去二个A,那这里有多少个A呢?就21减去一个A,减去一是因为我这里已经有一个我已知的单词了,减去二是因为我里已经有两个已知的单词。
04:08
所以说这个ma。指的就是这一句话到底有多长,那么对于这个问题来说,就是21个单词。所以需要保存一下,因为我获取这个时候,我后面还需要补多少个占位的东西呢?那我就要用max减去我已有的单词的个数,就是我要补多少个位置。就是这个意思。OK,然后hidden就是hidden size这个呃,大家如果不了解的话,可以看一下我之前有一篇视频,有一个视频就是test rn。大家可以看一下啊。里面详细介绍了很多参数,OK,然后呃,定义数据。这里的话就比较呃比较麻烦了,但是我前面其实已经讲了,首先啊。啊。我先把这个句子做以空格作为切分,那么这个里面得到这个list,所有单词的list啊,给它。
05:07
Actions。然后后面后面。X。然后这样子。然后呢,I。黄沙循环max论减一次。也就是循环20次。那么它每次循环。都。呃,取出来什么数据呢?首先对于第一次啊,我们我我写个注释,那么第一次I等于零对吧。那么这里的时候呢。I加一就是一,那么它取出的就是words的。第零个数到第一个数,那其实就是。的D0高位置上的值,那么就是get,它会把get up出来。然后呢,这个N就是get up,然后get up放到word to X,那么它就会获得get的索引。
06:00
但是这里索引我就懒得看了。啊。呃呃,这看不到那就算了,呃,反正就是取出get up索引放到input里面去了。比方说它这个索引是我,我举个例子,比方说它是18 OK,那么他这个时候此时。Input其实就等于18 OK,这里大家应该可以理解,然后呢,它这里又有一个负值,Input等于什么呢?Input等于input加上零。乘以max减去一,那么它就是。Input等于。18加上。零乘以。是21对吧,因为这个句子有21个单词,那么就是。21减去我,此时input里面有多少个单词呢?已经有了一个单词了,所以说减去一个。那么这里是20。20。那这就是20个零。0000,然后。
07:01
20个零。然后20个零,再加上这一个18,那就变成21个数。所以说最后最终啊,这个list input里面,它就是一个18,然后000,那么整个它的长度就是21,为了保证和我这个呃。就说这个输入句子是一模一样的,就是这样子,OK,然后呢,我呃。然后此时这个台给的是什么呢?这个台给的就是。Target等于。哦,不对,是action对应的索引,比方说actions对应的索引是呃,七,因为我不知道actions这个单词,它对应的索引是多少。啊,没有,那我假设它就是七吧。OK,那就是七,那就这样子了,就是个七,然后呢。然后我input,呃,我用一个one hot来表示,比如说这个18,它对应的词是get up,然后呢,呃,我要用一个one hot,那么one hot的。
08:03
多少维呢?我有多少个单,我有多少分类,就是说我有多少不不同的词,我就有多少维,那么我这一共有19个不同的词,比如说class分类问题嘛,那我就要呃有19维,然后呢,把大放进去。那么它就会取出,首先取出第18行,然后取出第零行,取出第零行,取出第零行,然后后面全部都是取出第零行,然后构建一个。啊。就是刚单看这个的话,单看这个我我。蓝色框住的这块代码,它会取出是一个二维的一个。举证。一共有多少行呢,有。Max这么多行有多少列呢?有n class这么多列,这样大家应该可以理解吧,然后呢,它再放到input半面去,那么最终input半它是个三维的一个一个立方体,然后三维立方体啊。等会再说他的事吧,OK。
09:00
那么这是第一次循环,第二次循环的时候I等于一,那么它取出就是X对吧,然后它会呃时。他会啊。就是说was。它会取到从零开始,然后一直到二,对吧?那么它会取出哪两个词呢?它会取出get up和actions。取出这两个词对应的一个索引,那么此时input就会等于18,然后七。然后再到这,那么它input就会等于什么呢?等于十八七再加零。乘上一个21减去二。21减二就是19,那么他就会就是这样。零零。反正总之它整个input的最后还是一个max长度的。
10:01
这么一个向量。然后此时target给的什么等于什么呢?Target的其实就是指到那个mix,然后呢,它会取出mix索引。比方说mix索引是三。那么就是这样子。然后他再把这个东西,呃,取出它的one hot,每一个索引用一个one hot来表示,然后再放进去,OK,然后我最后再讲一遍吧,I等于二的时候,它会取什么呢?它会取出。十八七和三对吧,这前三个词对应的一个索引。然后此时就是十八七三,然后后面是呃,21减去三就是18,它会有18个零。然后这里的话就会是makes,后面是it it对应的,所以。是零。这就会是零。那有人可能会说啊,那你一开,那你这里写个零啊,不就不就代表全是it吗。对吧,不代表全是it吗?那这个会不会有什么问题呢?因为你前面都是一个正确单词,然后后面是也是一个正确单词,它会不会训练错误啊,这个其实是不会的,当然当然他训练效果可能会不是很好。
11:14
但是它还是会有效果的,懂吗?这就是说。就是说我这只需要一个站位的站位而已,至于我到底用零或者呃一,我我也可以用一,比方说用一来占位或者二都可以的,都都无所谓,只不过随便都可以,当然你也可以怎么做呢,比方说我再加一个。十。比如K就是未定义的,然后给他一个索引,比方说给他索引22。然后这里全部用22来代替。那么这里就全部都是UK了。就是说这里面词全部都是K,这样也可以。啊,这里如果没有听懂的话,大家可以在评论区给我留言,因为我也不知道这里能不能讲懂,就是说这里不管是多少都无所谓的,都是无所谓。
12:00
只要这里有站位服就可以了。不会绕,那么呃,这这一段代码就应该清楚了。呃,我这里还专门写了个话,写了一下,就是说一开始第一次循环input它里面。呃,因为我不知道它的索引是多少,我就用词来代替了,这其实这个里面放的索引啊。呃,它是放的get up,然后eat eat,然后全是it,然后此时target actions,然后第二次呢,第二次循环,它放的是get up actions,然后eat it,然后呢,它的target是makes这样子,然后一直到20次,第20次循环,它放的是get actions,然后and。And,然后最后这个词用it来代替,然后这个target就是最后这个词more OK,那么input它的维度是多少呢?虽然我有20次循环,所以说。它的呃,第一就是max,减一就是21,减一就是20。也就是跟我这循环的次数是一样的。
13:01
然后中间这里呢,第二个维度是max,因为我呃。就是说每每一个音input它都是麦这么长这里。每个它都是ma那么长,然后呢,呃,然后每个词它是用一个什么样的维度去编码的呢?是用一个n class,一个one hot编码的,就是说这里它会是一个向量,它是一个比001000那种one hot,它是个n class。OK,这样的话,维度我也讲清楚了,Input就是这个维度。这里写了ma克顿减一,然后max class。行,那就呃,这里的话就是数据部分就讲清楚了。之后是这呃定义网络结构,呃,Input size是你每个词用多少维的向量去编码。然后hidden size,就是说你输出之后,你要转换成多少维的。这里啊。
14:03
因为我用的是by directional l SM,所以说我的by directional这个参数要设置为true,默认不设置的话,它会它是false。啊之后。呃,我就先先讲下下面的吧,虽然我取出白菜子。然后呢,等于X,就是说因为呃,STEM和RN一样,它要求的第一维度不是BY,它的必须要放在第二个位置上,所以说我需要把零位置和一位置进行交换,然后把麦放前面去,把size放到后面去,这样子了。然后呢,啊,因为。因为你的输入。就是。需要hidden state,还有state。这两个东西。然后他们的维度分别是多少呢?他们的维度分别是number of,就是说你有几层,我就设置为一层,然后但是呢,还要乘以一个number of directions,就说你的呃,是不是双向,如果你是双向的话。
15:07
你是什么方向的,如果你是两个方向的话,那这里就是二,所以说这里要乘以一个二,这里要大家记住,然后呢,Be,然后hidden state。啊,Hidden set hidden set,所以说就是by side,然后hidden hidden就是hidden set嘛,然后sales state也是一模一样的,OK,那么它的输出是什么样的呢?输出有个output hn和CN,这里我只需要output,我不需要HN和CN,所以我就呃用一个下划线来表示我不获取。呃,Output,它的维度是six,其实就是ma。嗯。这里写一下吧。就是说就是你就是这里。Excellent。然后呢,Hidden state a hidden size number of directions就是。
16:05
乘以二。会。呃,然后呢,呃,我去,但是我要的是最后一个。就是说最后一个细胞,它的输出是我取负一。那么这个维啊,哦,对,它应该是三维的是是呃。我看一下啊。啊,对,三维的。然后我要选的是最后一个,所以说这个维度就没有了,那你只下by size,然后N可以乘以二。然后我最后通过connect全连接神经网络,那么全连接神经网络的输入维度是N乘以二的。因为这个是想乘以二输出的话是n class。然后OK,那么这个网络架构也讲解完了。呃,我想的话,我给大家介绍讲一下,就是说它双向STM,它是怎么运作的。
17:06
就他怎么做到双向的。哦,我给你看这里这张图。啊,首先你input,然后它有个lay,这里的back不是我们度学习提前反向,而是指。呃,正向和反向。它没有传播的意思啊,首先我们看吧,比方说比方说我现在有这里,比方说我现在有一句话,嗯,I like your friends,那么单向的SM,它它就没有,没有中没有这个没有backward layer,它就只有forward lay。它就会把I like,呃,Your I like your,它就会输入,输入之后呢,得到一个输出,那么这个地方输出应该是France,或者说对应的向量,对吧?那么双向LTM的话,它会把I like your和your like I,它会把这个输入反向在输入里边,大家看这个顺序,它是反向在输入一遍,这个正向输入里面得到的一个向量。
18:06
反向输入的得到了向量。看到没,这里它会有两个向量进行一个,所以这也是为什么你的双向STM,它会,它这里会乘以二,就是因为你的。你得到那个向量和它得到向量,你会,你们会进行一个拼接,拼接之后你的维度就会变为原来两倍。就是这个意思,然后呢,啊,这样的话,我就会得到我的输出,然后再取最后一个值。这样的话它就相当于什么?它会啊,然后将对ball layer和backward layer的output进行contact,就是他们一个拼接,这样做可以理解为就是同时汲取正向和反向的信息。我同时获取了I like your和your like I这两个东西的一个信息。然后呢,这里要输出friends。OK,这里的话我应该讲清楚了,包括他为什么这里是两倍的一个关系,我也讲清楚了吧,好,那么下面就是训练和测试啊,这都没什么好说的,因为呃,这个训练还是蛮久的,所以我就不运行给大家看了,就直接看下结果吧,说啊就是。
19:12
训练效果,然后呢,他这里测试的话,我前面说了这个,说这个东西的话,测试效果不一定好,但是他还是会有一定效果的,比方说。呃,因为我一开始的输入是get,那么它输出的应该是action对吧。啊,但是这里它输出的是it,那就说没预测对,然后呢,我第二个输入的是get up action这样东西,那么它输出应该是makes对吧。它也没输入,对它还是一,然后下面呢是NEX,然后我让他预测一。OK,他预测对了it,然后呢,看它it后面这个是easy对了,Easy后面是to对了,To后面是automatic对了,然后or your都对了,然后最后more也对了,And也对了,然后这里这个东西它没对,反正就是还是有效果的吧,大家可以看到。
20:03
中,尤其是中间效果会挺好的。开始一开头啊和。一开头的时候效果可能不太好,为什么呢?呃,这个也可以很可以理解,因为比方说你一开始输的时候,你是get up,然后后面全是it。然后你让他预测action,确实有一点困难。而一开始你有get action,这也有点困难。但是到中间的时候。就是说已有的词越来越多了,然后让你去预测,让你可能效果会好一些,这个可以理解。啊,我想的话大概就这么多吧。呃,应该也没有什么漏掉了,我看看。OK,行啊,如果不了解的话啊,大家可以看一下我这篇文章,就是最新的这篇文章。这里BYM的式应用。呃,这篇文章的话,主要就是把这个代码讲解了一遍,然后如果呃视频没有看懂的话,再去看一下这个文字解释可能会更好一点,OK,那么呃,今天这个就讲到这里。
我来说两句