循环神经网络(RNN)

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_function

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.layers import SimpleRNN
from keras.initializations import normal, identity
from keras.optimizers import RMSprop
from keras.utils import np_utils

batch_size = 32
nb_classes = 10
nb_epochs = 200
hidden_units = 100

learning_rate = 1e-6
clip_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 /= 255
X_test /= 255
print('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 matrices
Y_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向量),输出是预测得到的词的序列。在训练网络是,设置,因为我们想要的时刻的输出是下一个词。

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

机器翻译

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

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

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

  • 1
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值