机器学习思考题目——14循环神经网络(RNN)

本文直译自《hands on ML》课后题。(有改动的以【】表示)。

1.sequence-to-sequence RNN有那些应用?sequence-to-vector RNN和vector-to-sequence RNN呢?

(1)sequence-to-sequence RNN:
预测天气(或其他时间序列)、机器翻译(用encoder-decoder架构)、视频捕捉(video captioning)、语音转文字、音乐生成(或其他序列生成)、识别歌曲的和弦。
(2)sequence-to-vector RNN:
按音乐类型对音乐样本进行分类、分析书评的情绪、根据大脑植入物的读数预测失语症患者正在考虑什么词、根据用户的观影记录预测她看一部电影的概率(这是协作过滤的许多可能实现之一)。
(3)vector-to-sequence RNN:
图片捕捉(Image captioning)、基于当前艺术家生成音乐播放列表、基于一组参数生成一个曲子,在图片中定位行人。

2.为什么encoder-decoder RNN来做自动翻译而不是用纯sequence-to-sequence?

一般而言,如果一次只翻译句子中的一个单词,结果会很差。例如法语句子“Je vous en prie”意思是“You are welcome”,但是如果一次只翻译一个单词,结果是“I you in pray”。因此读完整个句子再翻译要好得多。一个纯sequence-to-sequence RNN读入句子中第一个单词就立刻开始翻译。

3.怎样把CNN和RNN结合起来对视频进行分类?

要基于视觉内容对视频进行分类,一个可能的架构是每秒选取一帧(frame),然后把每一帧放到CNN中,CNN的输出放到一个sequence-to-sequence RNN中,最后输入softmax层,会输出所有类的概率。训练中用交叉熵(cross entropy)作为损失函数。如果还想用视频的声音,可以把每秒的音频转化成spectrograph(摄谱仪),然后把spectrograph输入到CNN中,把CNN的输出(与图像的CNN一起)输入RNN。

4.(用tensorflow)构建RNN的时候,dynamic_rnn()相对于static_rnn()有什么优势?

(a)它是基于while_loop()操作的,在反向传播中可以把GPU的存储交换到CPU的存储中,这避免了存储溢出(out-of-memory)错误。
(b)可以说它用起来更简单,它可以直接用一个tensor作为输入、输出,而不是一个tensor的列表(每个时间步一个tensor)。不需要stack、unstack、transpose。
(c)它生成了一个更小的计算图,在tensorflow更容易可视化。

5.怎样处理变化长度的输入序列(variable-length input sequences)?怎样处理变化长度的输出序列?

(1)处理变化长度的输入序列的时候,最简单的办法是当调用static_rnn()或dynamic_rnn()的时候设置sequence_length参数。另一个办法是把较短的input补全(例如补0),使得它们的长度和最长的输入是相等的(当所有的输入长度差不多的时候,这可能比第一个方法快一些)。
(2)处理变化长度的输出序列,假如已经事先知道每个输出序列的长度,可以用 sequence_length参数(例如,考虑一个sequence-to-sequence RNN,把视频中的每一帧标记一个暴力值(violence score):输出的长度等于输入的长度)。如果事先不知道输出序列的长度,可以用填充技巧(padding trick):总是输出相同大小的序列,但忽略序列结束标记(end-of-sequence)之后的任何输出。

6.在多GPU上分布式计算和执行一个深度RNN最常用的方法是什么?

把每一层放到不同的GPU上。

你可能感兴趣的