赞
踩
这节课介绍RNN的一个应用:文本生成。我们可以训练一个RNN来自动生成文本。
我们以一个例子开始,假设输入半句话,“The cat sat on the ma”,要求预测下一个字符。我们可以训练一个神经网络来预测下一个字符,训练数据是很多文本,把文本分割成字符,用One-hot encoding来表示字符。把这些One-Hot向量依次输入RNN,RNN的状态向量h会积累看到的信息。RNN返回最后一个向量h,在RNN上面是一个Softmax分类器,把h与参数矩阵W相乘得到的向量经过Softmax输出每个类别的概率。
假设这个网络已经训练好了,Softmax层则会输出如下概率值。我们选择最大的概率值对应的字符输出,或者按概率值做随机抽样。然后把t接到输入的文本末尾。
然后把"The cat sat on the mat"作为输入,计算下一个字符的输出,从而生成下一个字符。很可能是句号.再这样如此下去就可以生成很长的内容。
现在来看下怎样训练这个RNN,训练数据是文本,比如英文维基百科的所有文章。把文章划分为很多片段。这些片段可以有重叠。
比如红色片段作为输入文本,后面的蓝色字符a作为标签。设置seg_len=40意思是红色片段长度为40,设置步长stride=3,意思是下一个步骤红色片段会向右平移3个字符,以此类推。
假如这篇文章有3000个字符,那么我们就能得到大概1000个红色片段和1000个蓝色的标签。
训练神经网络的目的是给定输入片段,神经网络可以给出下一个字符。其实这就是一个多分类问题。假如包括空格、字母、标点在内一共有50个不同的字符,那么类别数目就是50。
训练的神经网络的输出风格取决于训练用的文本。如果用莎士比亚的书做训练,那么输出就是莎士比亚的风格文本。
文本生成可以用来做有趣的事情。比如生成新的英文名。
如果用Linux源代码作为训练数据,那么神经网络就会生成这样的文本
使用latex源代码可以自动生成latex源代码
我们用Python读取一本书的文本,这里不考虑字母大小写。每次取60个字符作为输入数据,一个字符为label
首先将字符做一个字典。然后把文本转换为One-Hot向量。
做完One-hot encoding后,一个字符串就背编码成为一个数值矩阵。矩阵的行数为字符串长度,列数为字典大小。这里没有做word embedding是因为字典中字符数目其实很少了,只有57维。
Keras实现略
在模型搭建好后,我们有以下三种策略来选择下一个字符。
第一种方法是进行贪婪选择,直接选最大概率的那个。但这种方法生成的文本是确定的,文章都是固定的,可读性极差。
第二种方法是根据输出的各个字符概率值进行多项式分别抽样,这种情况下具有随机性,生成效果较好。
第三种方式则是在原始概率分布上加幂次再重新计算概率分别,这种情况下,会使得在方法二中概率大的更大一些。效果也更好一些。
想要生成文本,需要先生成一个循环神经网络。第一步是将文本划分成很多的segment片段。segment是输入,next_char是标签。第二步是对字符做One-hot encoding,把字符编码成向量,v是词表数目,l是segment长度。第三步是搭一个神经网络。
在生成文本时,需要给一个种子片段作为输入,然后就可以进行生成,重复进行以下几步:
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。