递归神经网络

https://tensorflow.google.cn/tutorials/recurrent?hl=zh-CN

简介

看一看这篇伟大的文章,介绍了循环神经网络和LSTM。
Understanding LSTM Networks
https://blog.csdn.net/xingzhedai/article/details/53144126

语言建模

在本教程中,我们将展示如何在一个具有挑战性的语言建模任务上训练一个循环神经网络。
问题的目标是:要fit一个概率模型, 将概率分配给句子。
通过预测文本中的下一个单词来实现。
为了这个目的,我们将使用Penn Tree Bank (PTB)数据集,该数据集是衡量这些模型质量的一个流行基准,这个数据集小而且训练相对快。
语言建模是许多有趣问题的关键,如语音识别、机器翻译或图像字幕
这也很有趣——看看这里。
为了本教程的目的,我们将重现来自【Zaremba et al., 2014 (pdf)】的结果,它在PTB数据集上获得了非常好的质量。


教程文件

本教程引用了[TensorFlow models repo]中“models/tutorials/rnn/ptb”中的以下文件:

  • ptb_word_lm.py
    在PTB数据集上训练语言模型的代码。
  • reader.py
    读取数据集的代码

下载并准备数据。

本教程所需的数据来自于Tomas Mikolov网站的“data/”目录(PTB数据集)
数据集已经被预处理,包含了10000个不同的单词,包括句尾标记和一个特殊符号()。
在“reader.py ',我们将每个单词转换为一个唯一的整数标识符,以便使神经网络更容易处理数据。


模型

LSTM(Long Short-Term Memory)

该模型的核心是一个LSTM单元,它一次处理一个单词,并计算句子中下一个单词可能值的概率。
网络的内存状态用一个0向量初始化,读取每个单词后得到更新。
由于计算原因,我们将处理小批量的batch_size的数据。
在本例中,需要注意的是current_batch_of_words不对应单词的“句子”。
批次中的每一个字都对应一个时间t。
TensorFlow将自动对每个批次的渐变进行求和。
For example:

 t=0  t=1    t=2  t=3     t=4
[The, brown, fox, is,     quick]
[The, red,   fox, jumped, high]

words_in_dataset[0] = [The, The]
words_in_dataset[1] = [brown, red]
words_in_dataset[2] = [fox, fox]
words_in_dataset[3] = [is, jumped]
words_in_dataset[4] = [quick, high]
batch_size = 2, time_steps = 5

The basic pseudocode is as follows:

words_in_dataset = tf.placeholder(tf.float32, [time_steps, batch_size, num_features])
lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
# Initial state of the LSTM memory.
hidden_state = tf.zeros([batch_size, lstm.state_size])
current_state = tf.zeros([batch_size, lstm.state_size])
state = hidden_state, current_state
probabilities = []
loss = 0.0
for current_batch_of_words in words_in_dataset:
    # The value of state is updated after processing each batch of words.
    output, state = lstm(current_batch_of_words, state)

    # The LSTM output can be used to make next word predictions
    logits = tf.matmul(output, softmax_w) + softmax_b
    probabilities.append(tf.nn.softmax(logits))
    loss += loss_function(probabilities, target_words)

截断反向传播(Truncated Backpropagation)

按照设计,递归神经网络(RNN)的输出依赖于任意距离的输入。
不幸的是,这使得反向传播计算变得困难。
I为了使学习过程易于处理,创建一个“未滚动”的网络版本是很常见的做法,该版本包含了LSTM输入和输出的固定数字(num_steps)。
然后将模型训练到RNN的有限逼近。
这可以通过每次输入长度num_steps的输入来实现,并在每个输入块后执行向后传递。
下面是一个简化的代码块,用于创建一个执行截断反向传播的图:

# Placeholder for the inputs in a given iteration.
words = tf.placeholder(tf.int32, [batch_size, num_steps])

lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
# Initial state of the LSTM memory.
initial_state = state = tf.zeros([batch_size, lstm.state_size])

for i in range(num_steps):
    # The value of state is updated after processing each batch of words.
    output, state = lstm(words[:, i], state)

    # The rest of the code.
    # ...

final_state = state

这是如何在整个数据集上实现迭代:

# A numpy array holding the state of LSTM after each batch of words.
numpy_state = initial_state.eval()
total_loss = 0.0
for current_batch_of_words in words_in_dataset:
    numpy_state, current_loss = session.run([final_state, loss],
        # Initialize the LSTM state from the previous iteration.
        feed_dict={initial_state: numpy_state, words: current_batch_of_words})
    total_loss += current_loss

输入

在向LSTM输入之前,单词id将被嵌入到一个密集的表示中(参见向量表示教程)。
这使得模型能够有效地表示特定单词的知识。
It is also easy to write:

# embedding_matrix is a tensor of shape [vocabulary_size, embedding size]
word_embeddings = tf.nn.embedding_lookup(embedding_matrix, word_ids)

The embedding matrix will be initialized randomly and the model will learn to differentiate the meaning of words just by looking at the data.
嵌入矩阵将被随机初始化,模型将学习通过查看数据来区分单词的含义。

损失函数

我们希望最小化目标词的负对数平均概率:


loss

它并不很难实现,但是函数sequence_loss_by_example已经可用,所以我们可以在这里使用它。
在论文中所报道的典型措施是平均每个词的复杂度(通常被称为复杂度),它等于:


loss

我们将在整个培训过程中监控其值。

叠加多个LSTMs

为了让模型更有表现力,我们可以添加多层LSTMs来处理数据。
第一层的输出将成为第二个的输入,以此类推。
我们有一个名为MultiRNNCell的类,它能无缝实现:

def lstm_cell():
  return tf.contrib.rnn.BasicLSTMCell(lstm_size)
stacked_lstm = tf.contrib.rnn.MultiRNNCell(
    [lstm_cell() for _ in range(number_of_layers)])

initial_state = state = stacked_lstm.zero_state(batch_size, tf.float32)
for i in range(num_steps):
    # The value of state is updated after processing each batch of words.
    output, state = stacked_lstm(words[:, i], state)

    # The rest of the code.
    # ...

final_state = state

运行代码

在运行代码之前,下载PTB数据集,如本教程的开头所述。
Then, extract the PTB dataset underneath your home directory as follows:
然后,在您的主目录下提取PTB数据集如下:

tar xvfz simple-examples.tgz -C $HOME

(Note: On Windows, you may need to use other tools.)

Now, clone the TensorFlow models repo from GitHub. Run the following commands:
现在,从GitHub上克隆TensorFlow models repo。运行以下命令:

cd models/tutorials/rnn/ptb
python ptb_word_lm.py --data_path=$HOME/simple-examples/data/ --model=small

在教程代码中有3个支持的模型配置:“small”、“medium”和“large”。
它们之间的区别在于LSTMs的大小和用于训练的超参数的集合。
模型越大,得到的结果就越好。
这个“small”模型应该能够在测试集上达到120以下的复杂度,而“large”模型达到80以下,但是可能需要几个小时的时间来训练。

下一步?

有几个使模型更好的技巧我们没有提到,包括:
减少学习速率时间计划,
在LSTM层之间dropout 。
研究代码并修改它以进一步改进模型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容