循环神经网络(RNN)

来源:互联网 发布:美工工资高吗 编辑:程序博客网 时间:2024/05/02 01:02

1.NN & RNN

在神经网络从原理到实现一文中已经比较详细地介绍了神经网络,下面用一张图直观地比较NN与RNN地不同。从图1中可以看出,RNN比NN多了指向自己的环,即图1中的7,8,9,10节点及其连线。图2显示RNN展开的网络结构。

在传统的神经网络中,我们假设所有的输入(包括输出)之间是相互独立的。对于很多任务来说,这是一个非常糟糕的假设。如果你想预测一个序列中的下一个词,你最好能知道哪些词在它前面。RNN之所以循环的,是因为它针对系列中的每一个元素都执行相同的操作,每一个操作都依赖于之前的计算结果。换一种方式思考,可以认为RNN记忆了到当前为止已经计算过的信息。理论上,RNN可以利用任意长的序列信息,但实际中只能回顾之前的几步。


图1


图2

2.demo

Character Language Model,通过预测下一个字符,从而产生整篇文章。代码:min-char-rnn.py

3.前向传播


图3

在图3中

4.后向传播

一共有T个时刻,参数求导如下:

对t时刻求导,需要用到前面k=1到t的信息:

[k,t]之间的求导,可以转换为[k+1,t]对前一时刻求导的乘积:

其中,对前一时刻进行求导:

所以,最终参数更新公式如下:

4.简单应用

from __future__ import print_functionfrom keras.datasets import mnistfrom keras.models import Sequentialfrom keras.layers import Dense, Activationfrom keras.layers import SimpleRNNfrom keras.initializations import normal, identityfrom keras.optimizers import RMSpropfrom keras.utils import np_utilsbatch_size = 32nb_classes = 10nb_epochs = 200hidden_units = 100learning_rate = 1e-6clip_norm = 1.0# the data, shuffled and split between train and test sets(X_train, y_train), (X_test, y_test) = mnist.load_data()X_train = X_train.reshape(X_train.shape[0], -1, 1)X_test = X_test.reshape(X_test.shape[0], -1, 1)X_train = X_train.astype('float32')X_test = X_test.astype('float32')X_train /= 255X_test /= 255print('X_train shape:', X_train.shape)print(X_train.shape[0], 'train samples')print(X_test.shape[0], 'test samples')# convert class vectors to binary class matricesY_train = np_utils.to_categorical(y_train, nb_classes)Y_test = np_utils.to_categorical(y_test, nb_classes)print('Evaluate IRNN...')model = Sequential()model.add(SimpleRNN(output_dim=hidden_units,                    init=lambda shape, name: normal(shape, scale=0.001, name=name),                    inner_init=lambda shape, name: identity(shape, scale=1.0, name=name),                    activation='relu',                    input_shape=X_train.shape[1:]))model.add(Dense(nb_classes))model.add(Activation('softmax'))rmsprop = RMSprop(lr=learning_rate)model.compile(loss='categorical_crossentropy',              optimizer=rmsprop,              metrics=['accuracy'])model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epochs,          verbose=1, validation_data=(X_test, Y_test))scores = model.evaluate(X_test, Y_test, verbose=0)print('IRNN test score:', scores[0])print('IRNN test accuracy:', scores[1])

5.RNN还可以做什么

语言模型和文本生成

给定一个词的序列,我们想预测在前面的词确定之后,每个词出现的概率。语言模型可以度量一个句子出现的可能性,这可以作为机器翻译的一个重要输入(因为出现概率高的句子通常是正确的)。能预测下一个词所带来的额外效果是我们得到了一个生成模型,这可以让我们通过对输出概率采样来生成新的文本。根据训练数据的具体内容,我们可以生成任意东西。在语言模型中,输入通常是词的序列(编码成one hot向量),输出是预测得到的词的序列。在训练网络是,设置,因为我们想要的时刻的输出是下一个词。

关于语言模型和文本生成的研究论文:

  • Recurrent neural network based language model
  • EXTENSIONS OF RECURRENT NEURAL NETWORK LANGUAGE MODEL
  • Generating Text with Recurrent Neural Networks

机器翻译

机器翻译与语言模型相似,输入是源语言中的一个词的序列(例如,德语),输出是目标语言(例如,英语)的一个词的序列。一个关键不同点在于在接收到了完整的输入后才会开始输出,因为我们要翻译得到的句子的第一个词可能需要前面整个输入序列的信息。

关于机器翻译的研究论文:

  • A Recursive Recurrent Neural Network for Statistical Machine Translation
  • Sequence to Sequence Learning with Neural Networks
  • Joint Language and Translation Modeling with Recurrent Neural Networks

6.扩展

(1)百度PRNN:增强GPU伸缩性,RNN训练最高提速30倍
(2)PRNN github
(3)Inferring Algorithmic Patterns with Stack-Augmented Recurrent Nets
(4)Facebook Stack-RNN github

参考文献
(1)A Simple Way to Initialize Recurrent Networks of Rectified Linear Units
(2)https://keras.io/initializations/
(3)http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/
(4)Deep Learning for NLP
(5)https://github.com/karpathy/karpathy.github.io/blob/master/assets/rnn/charseq.jpeg

0 0
原创粉丝点击