Sampling novel sequences 对新序列采样

当训练完一个序列模型之后,我们要想了解到这个模型学到了什么,一种非正式的方法就是进行一次新序列采样(have a),来看看到底应该怎么做 。
注意序列模型模拟了任意特定单词序列的概率 , 我们需要对这些概率分布进行采样()来生成一个新的单词序列 。如上图所示:
①第一步:对你想要模型生成的一个词进行采样,输入(input)x^=0和a^=0,现在第一个时间步得到的输出是经过层后得到的概率 , 然后根据这个的分布进行随机采样 。分布给你的信息就是第一个词a的概率是多少 , 第一个词是aaron的概率是多少,第一个词是zulu的概率是多少,还有第一个词是UNK(未知标识)的概率是多少,这个标识可能代表句子的结尾,然后对这个向量使用numpy命令为:
【Sampling novel sequences对新序列采样】np.. , 来根据向量中这些概率的分布( to )进行采样 , 这样就能对第一个词进行采样了 。
②然后继续下一个时间步,把采样得到的y帽^作为输入(input),现在x^ = y帽^ , 放入到a^中,同样层也会预测y帽^ 。注意到不管第一个时间步得到的是什么词,都要传递到下一个位置作为输入(input) 。

Sampling novel sequences  对新序列采样

文章插图
③然后再到下一个时间步,无论你得到什么样的用one-hot码表示的选择结果 , 都把它传递到下一个时间步,然后对第三个词进行采样 。不管得到什么都把它传递下去 , 一直这样直到最后一个时间步 。
那么我们要怎样知道一个句子结束了呢?(1)方法之一是,如果你的字典中有代表句子结尾的标识,当采样得到EOS标识时 , 这代表着已经抵达结尾,可以停止采样了 。(2)另一种方法是,如果你的字典中没有EOS标识 , 你可以决定从20个或100个或其他个单词进行采样 , 然后一直将采样进行下去直到达到所设定的时间步 。不过这种方法可能会产生一些未知标识,如果你要确保你的算法不会输出这种标识 , 可以拒绝采样过程中产生任何未知的标识,一旦出现就继续在剩下的词中进行重采样,直到得到一个不是未知标识的词 。如果你不介意有未知标识产生的话,你也可以完全不管它们 。
这就是你如何从你的RNN语言模型中生成一个随机选择的句子 。直到现在我们所建立的是基于词汇的RNN模型,意思就是字典中的词都是英语单词 。
在实际应用中,我们还可以构建一个基于字符的RNN结构( level RNN) , 字典不仅包含从a到z的字母,可能还会有空格符,需要的话,还可以有数字0到9,如果你想区分字母大小写,可以再加上大写的字母,还可以实际地看一看训练集中可能会出现的字符,然后用这些字符组成你的字典 。
使用基于字符的语言模型有优点也有缺点 。(1)优点(pros)就是不必担心会出现未知的标识,例如基于字符的语言模型会将Mau这样的序列也视为可能性非零的序列 。而对于基于词汇的语言模型,如果Mau不在字典中,你只能把它当作未知标识UNK 。(2)主要缺点(cons)是最后会得到太多太长的序列,大多数英语句子只有10到20个的单词 , 但却可能包含很多字符 。所以基于字符的语言模型在捕捉句子中的依赖关系(也就是句子较前部分如何影响较后部分)不如基于词汇的语言模型那样可以捕捉长范围的关系 , 并且基于字符的语言模型训练起来计算成本比较高昂 。所以见到的自然语言处理的趋势就是 , 绝大多数都是使用基于词汇的语言模型 。但随着计算机性能越来越高,在一些特殊情况下,会开始使用基于字符的模型 。但是这需要更昂贵的计算力来训练,所以现在并没有得到广泛地使用 。
总之,在现有的方法下,我们可以构建一个RNN结构,看一看英文文本的语料库,然后建立一个基于词汇的或者基于字符的语言模型,然后从训练的语言模型中进行采样 。
如上图,有一些样本(),它们是从一个语言模型中采样得到的,准确来说是基于字符的语言模型 。如果模型是用新闻文章训练的,它就会生成左边这样的文本;用莎士比亚的文章训练后生成了右边这篇东西 。
这些就是基础的RNN结构和如何去建立一个语言模型并使用它,对于训练出的语言模型进行采样 。在之后的学习中,想探讨在训练RNN时一些更加深入的挑战以及如何适应这些挑战,特别是梯度消失问题来建立更加强大的RNN模型 。下节课,我们将谈到梯度消失并且会开始谈到GRU(门控循环单元)和LSTM(长期记忆网络模型) 。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我 。