漫谈四种神经网络序列解码模型【附示例代码】

以下为漫谈,即瞎聊,利用通俗的语言来谈谈神经网络模型中4种序列解码模型,主要是从整体概念和思路上进行通俗解释帮助理解。预警,以下可能为了偷懒就不贴公式了,一些细节也被略过了,感兴趣的可以直接去阅读原文[1][2][3]。 [1] Sequence to Sequence Learning with Neural Networks [2] Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation [3] Neural Machine Translation by Jointly Learning to Align and Translate 利用神经网络进行序列编码的模型主要为RNN,目前比较火的一些变种模型有LSTM和GRU,只是cell单元不同而已。以下统统用RNN来代表。 编码模型比较简单,如下图所示,输入文本{X1-X6}经过循环迭代编码,在每个时刻得到当前时刻的一个隐层状态,最后序列结束后进行特征融合得到句子的表示。注意,一种比较常用的方式是将编码模型最后一个时刻的隐层状态做为整个序列的编码表示,但是实际应用中这种效果并不太好,因而我们的图例中直接采用了整个序列隐层编码进行求和平均的方式得到序列的编码向量。 早期的一些任务主要是做一些主题分类、情感检测等等分类任务,那么在编码向量上面添加一个softmax就可以解决问题。但是对于机器翻译和语音识别等问题则需要进行序列化解码。 注意到,编码时RNN每个时刻除了自己上一时刻的隐层状态编码外,还有当前时刻的输入字符,而解码时则没有这种输入。那么,一种比较直接的方式是把编码端得到的编码向量做为解码模型的每时刻输入特征。如下图所示: 简单直观而且解码模型和编码模型并没有任何区别,然而学者感觉该模型并不优雅,那么接下来我们就来介绍一些精巧点的吧。 =============此处开始转入瞎聊模式============== 我们用考试作弊来做为一个通俗的例子来解释一下模型。 首先我们假设输入文本是所学课本,编码端则是对课本的理解所整理的课堂笔记。解码端的隐层神经网络则是我们的大脑,而每一时刻的输出则是考试时要写在卷子上的答案。在上面最简单的解码模型中,可以考虑成是考试时一边写答案一边翻看课堂笔记。如果这是一般作弊学生的做法,学霸则不需要翻书,他们有一个强大的大脑神经网络,可以记住自己的课堂笔记。解码时只需要回顾一下自己前面写过什么,然后依次认真的把答案写在答卷上,就是下面这种模型了[1]: 还有很多学弱,他们不只需要作弊,而且翻看笔记的时候还需要回顾自己上一时刻写在答卷上的答案(学弱嘛,简直弱到连自己上一时刻写在答卷上的文字都记不住了),就是下面的答题模式了[2]: … 继续阅读

DeepLearning常用库简要介绍与对比

网上近日流传一张DL相关库在Github上的受关注度对比(数据应该是2016/03/15左右统计的): 其中tensorflow,caffe,keras和Theano排名比较靠前。 今日组会报告上tj师弟从个人使用经验上做了简单介绍与对比,分享给大家。 ===================华丽的分隔线==================== 师弟的原文出处:http://tianjun.me/essays/102/ 本文将从deep learning 相关工具库的使用者角度来介绍下github上stars数排在前面的几个库(tensorflow, keras, torch, theano, skflow, lasagne, blocks)。由于我的主要研究内容为文本相关的工作,所以各个库的分析带有一定主观因素,以RNN模型为主,CNN相关的内容了解得不是特别深入(本文没有比较caffe和mxnet,其实主要原因还是自己C++太久没用了……)。 阅读本文你会了解: 1. 各个库是如何对神经网络中的结构和计算单元进行抽象的; 2. 如何用每个库跑RNN相关的模型; 3. 各个库学习和使用的难以程度对比; 4. 在各个库基础之上进一步改进和开发的难易程度. 本文不会涉及: 1. 各个库运行时间效率的对比(我没有自己做过相关的对比实验,但是网上有很多数据可以查); 2. CNN相关模型的构建(前面提到了自己最近对这块了解得不多); 3. RNN相关模型的原理和解释(网上很多资料,可以先学习后再进一步阅读). 先说说这几个库之间的大致关系 对于一个优秀的深度学习系统,或者更广来说优秀的科学计算系统,最重要的是编程接口的设计。他们都采用将一个领域特定语言(domain specific language)嵌入到一个主语言中。例如numpy将矩阵运算嵌入到python中。这类嵌入一般分为两种,其中一种嵌入的较浅,其中每个语句都按原来的意思执行,且通常采用命令式编程(imperative programming),其中numpy和Torch就是属于这种。而另一种则用一种深的嵌入方式,提供一整套针对具体应用的迷你语言。这一种通常使用声明式语言(declarative programing),既用户只需要声明要做什么,而具体执行则由系统完成。这类系统包括Caffe,theano和刚公布的TensorFlow。 以上是摘自MXNet设计和实现中的一段话。理解了这段话后,对后面各个库的进一步理解很有帮助。MXNet的设计者表示融合了这两种编程模式,我们先抛开mxnet,如上所述torch是采用命令式编程,然后theano和tensorflow是采用声明式编程,skflow对常用的tensorflow的封装,lasagne是对theano的封装,blocks除了对theano进行封装之外还提供了额外的处理机制,keras则是用一套接口同时封装了theano和tensorflow,如下图所示。 从theano说起 前面说theano是声明式语言,其基本过程可以描述为以下几步: 1. … 继续阅读

基于Theano的DNN框架Blocks使用简要总结

Blocks官方代码地址:https://github.com/mila-udem/blocks Blocks是加拿大Montreal大学Bengio实验室牵头开发的基于Python的神经网络模型框架,可方便地在大规模数据上进行复杂神经网络模型的训练。它包含有很多外置工具包如,logging, monitoring, visualization, and serialization,而Fuel则提供了数据格式的标准化。 Fuel官方代码地址:https://github.com/mila-udem/fuel 由于Blocks仍在进一步开发中,以下说明中遇到的错误可能已被修复,因而只可作为参考[注:当前时间2016/03/01]。 1. 安装Blocks和Fuel: 安装git,git的安装和使用可参考[Bitbucket-团队开发私有库使用指南, http://jacoxu.com/?p=1611] 接下来安装blocks,由于需要通过github下载,进入git bash,输入: pip install git+git://github.com/mila-udem/blocks.git \ -r https://raw.githubusercontent.com/mila-udem/blocks/master/requirements.txt 注:a). 实际运行中,可修改一下requirements.txt文件中所定义的库,如numpy等在安装ANACOND的时候都已经安装,那么可以删除掉requirements.txt文件中对应依赖行。 b). 若执行过程中有错误可能会导致blocks没有正常安装,则需要重新执行一下 pip install git+git://github.com/mila-udem/blocks.git 若安装成功则在c:\anaconda2\lib\site-packages 目录下可以看到和blocks及fuel相关的4个文件夹,并且在在python模式下执行如下两行命令,不报错即可: from blocks.bricks import Tanh from fuel.datasets import MNIST 说明Blocks和Fuel已经可以正常调用。 2. 利用Fuel下载数据集 … 继续阅读

神经记忆网络、神经机器翻译和神经图灵机的初步探讨

近期看过神经记忆网络、神经机器翻译和神经图灵机三篇工作之后在基于对话历史的信息抽取工作上进行了初步对比尝试,根据自己的理解进行了模型对比。欢迎大家一起讨论。 首先三篇工作的文献分别出自: [1] 神经记忆网络:2015 NIPS, End-To-End Memory Networks (Facebook AI) [2] 神经机器翻译:2015 ICLR, Neural Machine Translation by Jointly Learning to Align and Translate [3] 神经图灵机:2014 ArXiv, Neural Turing Machines (Google DeepMind) 其中神经记忆网络和神经机器翻译的模型框图如下: 实验数据:1000轮垂直领域完整对话历史的信息抽取问题 – 神经记忆网络数据格式: 1 小姐 您 怎么 称呼 … 继续阅读