能模仿韩寒小四写作的神奇循环神经网络

作者:寒小阳 && 龙心尘
时间:2016年4月
出处:http://blog.csdn.net/han_xiaoyang/article/details/51253274
声明:版权所有,转载请联系作者并注明出处
特别鸣谢:北京大学焦剑博士对Recurrent Neural Networks Tutorial part1一文的翻译和部分内容提供

1.引言

在离人工智能越来越近的今天,研究界和工业界对神经网络和深度学习的兴趣也越来越浓,期待也越来越高。
我们在深度学习与计算机视觉专栏中看过计算机通过卷积神经网络学会了识别图片的内容——模仿人类的看,而工业界大量的应用也证明了神经网络能让计算机学会听(比如百度的语音识别),于是大量的精力开始投向NLP领域,让计算机学会写也一定是非常有意思的事情,试想一下,如果计算机通过读韩寒和小四的小说,就能写出有一样的调调的文字,这是多带劲的一件事啊。
你还别说,还真有这么一类神经网络,能够在NLP上发挥巨大的作用,处理从语言模型(language model)到双语翻译,到文本生成,甚至到代码风格模仿的问题。这就是我么今天要介绍的RNN(循环神经网络)。


2.神奇的RNN,不可思议的表现

RNN是一个和时间序列有关系的神经网络,大家想想,对单张图片而言,像素信息是静止的,而对于一段话而言,里面的词的组成是有先后的,而且通常情况下,后续的词和前面的词有顺序关联。这时候,独立层级结构的卷积神经网络通常就很难处理这种时序关联信息了,而RNN却能有效地进行处理。

RNN在处理时间序列的内容有多有效呢,咱们列一些RNN处理的例子来一起看看。

我们知道卷积神经网络在0-9数字识别上已经能有人类的识别精确度了,但是对于一连串的数字,还是得有一些特殊的处理的。比如说,下面是让RNN学会了从左到右读数字门牌号。


RNN读门牌号

我们也能让RNN学着从右到左自己绘出门牌号图片:



RNN能模仿各种格式的文件,比如说下面是RNN学习出来的XML文件,和Latex代数几何文件样本:

<page>
  <title>Antichrist</title>
  <id>865</id>
  <revision>
    <id>15900676</id>
    <timestamp>2002-08-03T18:14:12Z</timestamp>
    <contributor>
      <username>Paris</username>
      <id>23</id>
    </contributor>
    <minor />
    <comment>Automated conversion</comment>
    <text xml:space="preserve">#REDIRECT [[Christianity]]</text>
  </revision>
</page>

Latex
Latex2
我们暂时不管内容正确性,这个格式编排能力,已经让我瞠目结舌。

爱折腾的程序猿GG们,当然会把握住一切可学习的资源,于是乎,他们把github上linux的源码拉下来了,然后喂给循环神经网络学习,两三天后…我们发现它能自己生成如下的代码块了

/*
 * Increment the size file of the new incorrect UI_FILTER group information
 * of the size generatively.
 */
static int indicate_policy(void)
{
  int error;
  if (fd == MARN_EPT) {
    /*
     * The kernel blank will coeld it to userspace.
     */
    if (ss->segment < mem_total)
      unblock_graph_and_set_blocked();
    else
      ret = 1;
    goto bail;
  }
  segaddr = in_SB(in.addr);
  selector = seg / 16;
  setup_works = true;
  for (i = 0; i < blocks; i++) {
    seq = buf[i++];
    bpf = bd->bd.next + i * search;
    if (fd) {
      current = blocked;
    }
  }
  rw->name = "Getjbbregs";
  bprm_self_clearl(&iv->version);
  regs->new = blocks[(BPF_STATS << info->historidac)] | PFMR_CLOBATHINC_SECONDS << 12;
  return segtable;
}

且不说代码内容是否有意义,这标准的C代码风格,看完已有吓尿的趋势。

哦,对,刚才我们提了RNN对文字的处理能力。我们来看看,Andrej Karpathy自己做了一个实验,把所有莎士比亚的作品串起来组成一个单一的(4.4MB)文件。训练了一个512个隐藏节点的3层RNN网络。训练网络几小时后,得到了如下样本结果:

PANDARUS:
Alas, I think he shall be come approached and the day
When little srain would be attain'd into being never fed,
And who is but a chain and subjects of his death,
I should not sleep.

Second Senator:
They are away this miseries, produced upon my soul,
Breaking and strongly should be buried, when I perish
The earth and thoughts of many states.

DUKE VINCENTIO:
Well, your wit is in the care of side and that.

Second Lord:
They would be ruled after this chamber, and
my fair nues begun out of the fact, to be conveyed,
Whose noble souls I'll have the heart of the wars.

Clown:
Come, sir, I will make did behold your worship.

VIOLA:
I'll drink it.

恩,作为一个文学功底弱哭的码农,莎士比亚这样的大文豪,文笔风格我是读不出来的。但是我们有韩寒啊,我们有广大女中学生稀饭的四娘啊,于是我们去github上扒了一份能处理中文的char-rnn代码下来。把四娘的大作集合,从《幻城》到《左手倒影右手年华》,再到《悲伤逆流成何》和《小时代》,处理了处理,放在一起(咳咳,我只是拿来做实验学习的,不传播…版权问题表找博主…),丢给RNN学习了,然后,恩,我们看看它能学到什么。

每个人,闭上眼睛的时候,才能真正面对光明

他们在吱呀作响的船舷上,静静看着世界,没有痛苦的声音,碎裂的海洋里摇晃出阵阵沉默,吞噬过来。他们的躯体,一点,一点,逐渐暗淡在巨浪中,下沉。温润、潮湿、环抱,他手中兰花草磨成的微笑已经腐烂。记忆破蛹而出,翻滚着随风摆动的兰花草,气味扑鼻,海潮依旧。

你们虔诚的看着远方,我抬起头,不经意间,目光划过你们的面庞,上面淡淡的倔强印,那么坚强

尘世凡间
沉睡亿万光年的年轻战士
萦绕不散的寂寞烟云中
静候在末世岛屿之上
守候,女王何时归来
你的目光延向她迟归的方向
缓缓推进的海浪
这最后一夜
荡漾

小四的文字我是看不懂的,不过RNN生成的这些文字,却让我也隐约感受到了一些“45度角仰望天空,眼泪才不会掉下来”的气息,当然,这几段已是输出结果中比较好的内容,也有一些通畅程度一般的,但足以证明循环神经网络在NLP上有不可思议的学习能力。

3.循环神经网络浅解

刚才被循环经网络惊呆的小伙伴们,咱们把目光先从小四那里收回来。看看这神奇的循环神经网络到底是何许神物,背后的原理又是什么样的。

传统的神经网络(包括CNN)中我们假定所有输入和输出都是相互独立的。很遗憾,对于许多任务而言,这一个假设是不成立的。如果你想预测下一个单词或一个句子,你就需要知道前面的词。循环神经网络之所以被称作循环,是因为每个元素都执行相同的任务序列,但输出依赖之前的计算结果。我们换一种方法说明一下RNN:大家可以想象RNN模型是有“记忆”的,“记忆”中存储着之前已经计算的信息。理论上说RNN可以记得并使用任意长度的序列中的信息,不过实际应用中,我们通常只回溯几个步骤(后面详细讨论)。我们先一起来看一个典型的RNN的图例:
RNN图例

上图显示了将RNN展开成一个完整的网络的过程。之所以我们用展开这个字眼,因为循环神经网络每一层(或者我们叫做每个时间点t)到下一层(下一个时间点),其变换的过程(权重W)是一致的。举个例子说,如果我们关注的序列是包含5个单词的句子,循环神经网络将会依据先后顺序展开成五层神经网络,每个单词为一层。RNN是根据下面的步骤来迭代和做计算的:

  • 假定 xt 是时间 t 处的输入,比如 x1 可以是句子中第二个单词one-hot编码后的词向量。

  • 假定 st 是次数t的隐藏状态,哈哈,这就是我们提到的神经网络的“记忆大脑”。 st 由当前步骤的输入和先前隐藏状态共同计算求得: st=f(Uxt+Wst1) 。这个计算函数f通常是非线性的,比如说神经网络里经常用到的tanhReLU. s1 是第一个隐藏状态,通常我们把它初始化为0。

  • ot 是第t步的输出。举个例子说,如果我们要预测在之前的词序列下,下一个词是什么,那我们可能拿到的是整个词表中,每个词的概率(通过softmax得到的),即 ot=softmax(Vst)

  • 17
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值