00:00
嗯,大家好,今天大家讲一个就是NLM模型,以及它的拓去实现。这个模型的全称叫做neural network model。嗯,是这样的,它主要是通呃通过神经网络实现了一个语言模型,然后这篇论文是这个,呃,大家如果有兴趣的话,可以自己下载下来读一下,虽然它的年代很久远了,但是如果是呃作为NLP入门的话,还是非常需要一下的,并且这篇论文对于后续的影响也是非常重要的。那么,呃。我接下来实现的话是一个任务,就是说给定一个句子的前N减一个单词,然后去预测出下一个单词,比方说我现在有三句话,然后呃,这三句话呃作为输入,呃作为训练,然后呢,我我输入的是这三句话当中的前两个词,每一句话的前两个词。然后我要去预测后一个词。呃,比方说这个我输入I like,然后我要让它输出cat,然后我输入I love,我输入输出coffee啊,当然输入肯定不是词,而是它的呃索引,所以我就把这些。
01:08
十构建一个语料。将这些词,呃,将这些句子分词以后。我可以得到呃一些词嘛,然后把这些词进行去重,然后构建一个索引,那么这些词对应的索引就在这边,比方说是这样子的。呃,然后他就是输入的是索引,然后索引通过查表,这个表是什么呢?是word inting表,就是词向量,就说I这个词,我查它的词向量是什么,比如说I这个词它的所以是零,那么它的在这个词向量表当中就查第零行。然后这个M表示的是这个词向量它的维度,比方说我要用一个两维的向量去表示一个词。或者是我想更高维度,那么我就在后面再加那变成三维的,然后变成四维的,变成五维的都可以,但是因为我这里料比较少,我就呃设置的小一点,两维就可就够了,一般情况下都是50~200维。
02:05
呃,然后呃,输入索引之后查表,然后得到它的词向量。然后再将这些输入的词向量拼接起来。进行一个。然后传入到下层隐藏层。之后再到最后一层。当然最后一层输出层。它不光是有隐藏层呃的输输出作为输入,还有就是你的输入。就是通过这里,呃,向量也要输入到最后一层输出层去进行运算,具体来说就是这个公式。但是这些公式里面可能有一些呃字母,大家不知道什么意思,就先解释一下。首先啊,这里就不多说了,这个C就是呃,Marix就是矩阵,就是这个词向量的表,然后V它表示的词词汇表大小,就是对于这个问题来说,它去重以后就有七个词,所以说它的词汇表就是词向量表,它有七行。
03:00
就是这个意思,然后M就是词向量的维度就是多少列。就是表示一个词,用多少维的向量来表示,H是隐藏层的位呃,权重,D是隐藏层的偏呃呃,偏置。什么意思呢?就是对于这个。就是首先将呃将输入的N减一个单词,就是前N减一个单词。它的索引转为词向量。然后将这N减一的向量进行形成一个。N减一乘以W的向量用X来表示什么意思呢?比方说现在我有一个呃,我把这这个语料,这些三个句子都弄成了。这样一个矩阵。那么这个矩阵里面它有多少行呢?你有多少条句子,我就多少行,它有多少列呢。你通过几个单词作为输入,我就多少列,比方说我通过前两个单词作为输入,那么我就两列,我用我如果说这里有四个单词。这里有四单词,比A,我有四个单词,然后我通过前三个单词作为输入,然后预测第四个单词,那么这里就就会有三列。
04:08
这个意思,当然我这里只有两列。所以它的呃矩阵大小就是三乘二的,这是X,所以输入Y就是这个。嗯,就是后面最后一个单词,它的索引。然后呢,呃,通过查inbedding。得到这个,呃,一个新的矩阵,对,然后呢,将新的矩阵送入隐藏层进行计算。首先它是通过将X乘以一个呃,就是里面进行一个反射变换,就是说呃,线性变换是乘以一个值,反射变换就是乘以一个值再加上一个数,就是这么简单,就它点来去作为奇函数就很简单,就是说将它。接以后呢,入到一,然后。
05:02
嗯,完了以后呢,它作为输出就是hidden out就是这条线。传入下去。还没有结束,它这里除了这条绿线以外,还有一些虚线,这里也是要传入到最后一层的,那么这里是怎么传入到最后一层的?我们知道这里是X对吧?好,然后就是X再乘以一个新的一个啊,权重W加上这个黑灯就是输出再乘以一个矩阵。加上那个偏值,就得到最后真正的这个输出了。就是大概这么多,就很简单。那么我先呃编写吧,如果有问题的话,我再中间再说一下。先入一些常用的库。呃,这里虽然我自定义的是只有三个句子,语料很短,但是我还是就是。
06:04
啊,用那种mini data的方式去读入数据,这样的话大家呃,以后如果是数据集比较大的话,也比较好拓展,知道怎么修。嗯,先定义三条句子。OK,然后把这三个句子。嗯。就是说把这些词全部取出来。组成一个list,就把这些句子的词全部出来,组成一个list。
07:02
嗯。这一步的,呃,功能就是说。它会把呃,这个list里面的所有的元素通过空格来拼接起来,那么它就是I like cat,然后空格I love coffee,然后空格I hate milk,之后呢,再split一下。那么他就会。以空格为分隔。呃,组成一个list,就是就大概是这样子。I。然后后面也是一样的。就后面的三个单词。嗯,然后呢,我要去构建一个词汇表。
08:08
词汇表的话是要去的,因为这里面你看有很多。我这个单词对吧,所以说要去掉,所以就用一个set去除,然后再转换成list。啊之后呢,我要定义两个字典,就是首先是词转为索引的字典。以及索引转为词的字典。嗯。嗯,OK,然后呢,我要我还要获取个词汇表,到底有多少个词。这是有多少类吧?N class等于。
09:01
或者这个n class其实就是尾就是尾,因为你你有多少个词就是多少行吗。这。好,然后呢,嗯。之后。在就是我要把这个X给构建出来。嗯。
10:10
这一步就是说我去遍历这些句子,我一共有三条句子,那我就遍历每一条句子,首先遍历到第一条句子,之后呢,我用空格把把这第一条句子当中的。就做一个分词,那么这个得到的就是,比方说对于第一条句子,那么它得到就是。就是这样子,对于第二条句子也是一样,用空格分开,然后呢,呃,我要。前两个词作为input data,然后最后一个词作为out。或者是叫他给他吧。那我先给他。临时变了。
11:00
等于什么?等于一个?呃,首先取出前两个。就是说啊,并且我获得是索引,不是这个词,所以我就要通过word to把这个得到这个词之后转成索引。嗯。我只要的是从最开始的词到倒数第二个词,最后这个词我是不要的,是作为预测的。然后把它们全部喷进去。嗯,然后返回。
12:05
好,然后呃,我定义data load,呃,先定义data set,然后定义首先是把这个数据获取出来。之后我对他赛。对于。前面是X。后面是Y。之后是data。首先第一个参数是data数据集,第二个参数是。你的大小时我设为16,第三个子就是呃,第三个参数是你的,呃,是否要打乱数据是。
13:05
哦。哦,我返回的是list,我给他转成pencil才行。好了,然后接下来这啊,网络结构NL。
14:02
OK,然后嗯。就是根据这个流程,首先经过一个embedding。C就是那个embedding的矩阵。词汇表痛。嗯。它的第一个参数就是说你的有多少行。就是V这么多行。第二个参数就是说你每一个词要多少维的向量去表示。M为,那么这个M是多少呢?我在这里定义一些参数。首先是你的M,就是你每个多少维向量去表示,用两维的,然后呢啊。二呃,这个a step就是是什么意思,就是。
15:00
你的。呃,输入数据的长度。我是通过两个单词,然后作为输入的,所以我是二,那如果你比方说你这有四个,嗯,比方说你这有四个单词,A12344个单词,然后你要通过前三个单词。这里作为输出,那么你就把这改成三。老是隐藏层神经元个数。绑了十个。OK,然后嗯,就这么多。这里X。X,它的输入是by side乘以的就是这。呃,这个是我总的X的数据样本嘛,比方说我这里设置为二贝塔,就是说我每次训练是两个数样本去代入,那么我就会从中选两个数据,这两个数据。
16:19
啊,就会把这两个数据选出来。那么它就有两行多尔列呢,有两列n step列,这个应该很好理解吧,N,嗯。OK,那么他通过这个东西之后,转成了什么样的维度呢?就是。羊肉。不看这。那么这里就是X。就是说它的呃,一个批量的X的作为输入,然后经过inding之后呢,它会变成这样子。
17:02
啊,首先它有多少行,还是白棋赛,呃,巴棋赛怎么导行对吧。差多少列呢?列还是TE这么多列?但它的高是多少呢?就是说它原来这个零位置啊,它这个零就是说这个索引这个值零,它会变成。被这个。0.2和0.6来替换掉。而这个一,它会被0.3和0.8替换掉,那么这个为什么呢?因为它会去查这个inbding表,Word in bedding的表,然后把这个值替换成呃词向量。所以它就会增加一个维度。它是一个三维的矩阵。现在。呃,如果不理解的话,大家就就。仔细看一下我这个,嗯,图这里红色的会转换成这个红色,然后这个蓝色的会转换成这个蓝色,这个绿色的会转换成这个绿色。
18:03
就而且然后然后对照一下这个word in bedding这个表,看一下就好好理解一下。这是一个三维的。那么呃,这里计算流程当中还要就是将这N减一个项来进行contact。就是要将这两个词向量要进行的诶。手写笔有问题。嗯,就是将他们进行contact,他们现在是分开的,就是说把这。打开。然后加个逗号,就是这个意思,拼接在一起。那么拼接之后呢?这个向量就明显少了一个维度。
19:02
对吧,它的行还是size,那么列就变成了M乘以n step这么多列。所以说X就等于。我用一下扇子,然后。Step。乘以M。此时,它的维度变成S。就变成这个维度。我会变成这个维度之后呢,就去做矩阵乘法。首先有一个,还有个D。它的纬度是多少呢?要跟这匹配嘛,X乘以H,所以说你的第一个维度要和X的第二个维度相匹配,X第二维度是这个。
20:06
那么它也是,然后。你的H的第二位就是黑。然后还有D。这里的n.parameter是什么意思?就是说。可以看,这里就是将这个参数添加进模型当中。就是这个。它使用方非非常简单,就是N,然后里面写上data,它的默认的request就是true,所以不用写啊,其中data是个嗯,这个data这个作用的就是说。
21:00
它会将这个data数据添加到这个模型参数里面去,这样的话,你通过model.parameters。就当你在定义优化器的时候,你要去呃更新这些参数的话,你就可以通过这个找到,然后就可以通过它管理并且更新。OK,然后嗯。去做计算。这里。三减H,然后D加X乘以H。加。取证乘法。X乘H。
22:00
嗯,这里就这么,就是说就把这一条已经计算出来了,然后还有这些要计算一下。还需要什么U啊,BW和U。啊,W。呃,那么这里的参数多少呢?首先。W是跟X直接相乘的,所以说W的第一个,呃,它的维度的第一个位置肯定是N乘以M的。要把维度匹配上,那么它第二个位置是多少呢?是这样的,输出层共有这么多个节点,因为我这是一个分类问题,我最后会得到一个。
23:07
就是我最后的Y输出的这个,嗯,不叫叫。它是什么呢?它是一个。这个长度是一个。这么大的一个,然后里面是一些概率值,比方说0.8,然后0.7,然后负0.3反有这么多。有一些有很多很多值,然后在里面取,比方说这个0.8是最大的,它最大的下标是多少,是零,那就是说,呃,我预测。单词索引为零的。这个词就是我的预测值,就是这个意思。所以说我需要。呃,我需要把它转换成一个V这么大小维度的一个向量。因此相乘以后,我要给它转换成V这么大小的向量。同样的,这里相乘以后也要也要是V,然后B也是V。
24:01
所以B也是V,然后U的话就是。啊,这个相乘之后,它的维度是S乘以。黑的。那呃,U就好说了,就是hidden,然后B。之后把它们进行运算,Y output嘛,就会等于。self.b。嗯。X乘以。H吧。XW。我在家。嗯。Out。点U。然后呃,定义优化器。
25:13
In function。因为我这是分类问题,所以用cross control pills。嗯。二。哦,这里没有运行啊。好了就可以了。呃,那么接下来就是训练就行了。现在5000个IPO好。HXHY。
26:03
Order。嗯,之后呢。预测时等于model,把BYX进去。老。剔透心灵。洛回传,Backward。打印呃,中间打印一下看一下。
27:17
好,然后嗯,大概就这样子就训练完了,我们可以测试一下。嗯。我看看。不对。嗯。我取他max。哦,我们可以看,先看一下这个东西,它取出来是什么,它是一个二维的向量。哦不,它是啊,它是两个向量,首先第一个是就是说你取出来,嗯,怎么说呢。
28:05
嗯,先这样吧。看一下这样子它会取出来什么?它会取出来是呃行有by size列是七列,因为你的列有七列,就是说你有七个词,然后它分别对应的是每个词它的概率,然后它的概率大小是多少。然后取当中,我取最大的max。然后这里面它会就它就会取啊,012345,它会取五,然后这里它会取。四。五四。这样子的。好看一下。啊,它会取五和四,那么这个就是它的值,这个是它的索引,我取它的值,所以加个一。就把542出来,然后我再打印出来看一下,通过。
29:04
WW。Or?嗯。这个。Or squeeze?因为它的我要把它维度给呃展开,变成542。哦,这里要加太长。那就是cat coffee milk。嗯,就是就是这样子了。因为我的input data。
30:00
就是按照这个顺序来input的,然后它的输出也是cat coffee和milk是对的。嗯,所以就这么多了吧。嗯,再过一遍吧,首先呃导入一些库,然后呃制定一些书的句子,我有三个句子,哎,呃分别就是三个,然后呢,我去构建一个词汇表,我把这些句子都取出来,然后对于每个句子去分词,把每个词都添加进来,然后呃去重,去重之后得到一个词汇表,之后呃构建一个。Word到索引的映射,以及索引到单词的映射,映射,然后嗯。去获取这个手表的长度。之后呢,呃,构建数据。构建数据的时候就按照按照这个格式来的,你有三条数据,那么我就构建三行。这里是I hate就是。
31:00
零五。这样。然后多少就是就是这个样子。这里看一下就明白了。之后呢,定义data size,然后把data set传入data load里去。定义一些参数,然后构建模型架构。这模型架构其实主要就是根据这个公式来的。就是这里计算的流程,这里有一些公式。然后去训练。最后测试一下。啊,这也不叫测试吧,就是因为我也没有测试级。啊,毕竟我数据很少,就在训练集上做一下测试。就是这样子了,好,那么呃,大概就这么多啊,谢谢观看。
我来说两句