美文网首页TensorFlow for Machine Intelligence
[第6章翻译开篇]Tensroflow For Machine

[第6章翻译开篇]Tensroflow For Machine

作者: 斐波那契的数字 | 来源:发表于2018-01-02 20:36 被阅读27次

    Recurrent Neural Networks and Natural Language Processing

    先道个歉:拖着这么久才更新。第五章的后续几章已经翻译出来了,占时没有时间调试程序。所以也没有更新。等调试完程序以后,我会放到这里来。

    书籍封面

    此处给出本节的代码:https://github.com/Leechen2014/TensorFlow-for-Machine-Intelligence

    相关的文件描述在github中给出

    PS:翻译来源:TensorFlow-for-Machine-Intelligence

    在之前的几章中我们学会了对静态图像的分类。这属于机器学习中庞大的应用,机器学习的应用还有很多。在本章中我们会讲解序列模型。这些模型可以说是强大的模型:

    它们使我们能够对连续输入(sequential inputs)进行分类或标注,生成文本序列或将一个序列翻译成另一个序列。

    我们在这里学到的东西与静态分类和回归没有区别。递归神经网络(Recurrent neural networks,RNN)提供了适合全连接和卷积层的工具包的构建块。即便如此,我们也应该从基础开始。

    ============

    6.1 Introduction to Recurrent Networks

    在自然界中,很多实际性的问题都是时序性(sequential)的。这些问题几乎是囊括了所有的自然语言处理(natural language processing,NLP)的问题。段落(Paragraphs)可以看做句子组成的序列,句子可以看做是单词组成的序列,单词是字符组成的序列。还有更密切相关的-- 音频和视频剪辑是随时间变化的帧序列。甚至股票市场价格随着时间的推移也是有意义的。

                      以上这些所有的应用中,观察顺序都很重要。例如,“I had cleaned my car”这句话可以改成“I had my car cleaned,”,这就意味着你安排了某人去做这件事情了。口头语言中的这种时间依赖性甚至更强,因为有些单词可能发出相似的声音。例如,”wreck a nice beach”听起来就像recognize speech” ,这样的话,这个词只能从上下文中从建了。

    PS: 最近我在练习英语听了,真的是这样的,小伙伴们。

    如果从前馈神经网络(包括convnets)这个角度来考虑,这些模型的能力看起非常有限。这些网络模型都是接收数据后一次性的向前传播,然后反馈调节,这个过程就像光的反射。这些网络都是假设输入之间独立的丢失了许多模式。(These networks assume all of their inputs being independent missing out many patterns in the data.)。虽然可以传递等长的输入并将整个序列馈送到网络中,但是这并不能很好地捕捉到序列的性质。

    循环神经网络(Recurrent Neural Networks ,RNN)是一种明显时间模型的。RNN同样是在的神经元下构建,这些神经元会对输入(来自其他的神经)加权重以后求和。不过,RNN允许神经元连接到更高层和更低层并形成循环。网络隐藏的激活在相同序列的输入之间被记住。

    前馈神经网络和循环神经网络

    自20世纪80年代以来,RNN的各种变体已经出现,但是这些变体通常因为运算能力不足,训练难度大而不能广泛的使用,直到最近几年开始逐渐被应用。自2006年提出了LSTM结构以后,我们已经看到了很多非常强大的RNN应用程序。这些应用程序在诸多的领域上的序列任务上工作的很好,例如:语音识别、语音合成、手写草书识别(connected handwriting recognition)、时序预测、图像标题生成以及端到端的机器翻译。

    在本章的下一节中,我们首先深入了解RNN以及如何对其进行优化,包括所需的数学背景。然后我们介绍有助于克服了一些不足的(limitations)RNN变体。我们深入了解了四种自然语言处理任务,并通过使用这些RNN工具,将RNN应用于这些任务。接下来将逐步完成包括数据处理,模型设计,应用程序实现和TensorFlow训练在内的所有步骤。

    6.1.1 Approximating Arbitrary Programs

    首先介绍RNN,获得一下直观的感受。以前引入的前馈网络在固定大小(fixed size)的向量上运行。以将28x28图像的像素映射到10个可能类别的概率为例,计算发生在固定数量的步骤中,即层数。而循环神经网络恰恰相反,它可以在矢量的可变长度序列上进行操作,既可以作为输入,也可以作为输出,或者两者兼而有之。

    RNN基本上可以看作是神经元和权重随意的(arbitrary)构成的有向图(graph)。输入神经元(input neurons) 因为它们的激活由输入数据设置,所以具有输入连接功能。输出神经元只是我们从中读取预测的图中的神经元集合。图(graph)中的所有其他的神经元都被称为隐藏的神经元。

    RNN中的计算类似于(be analogous to)一个普通神经元的计算。在每个计算的时间步骤中,通过设置输入神经元来向神经网络现实输入序列的下一帧。与前馈神经网络不通的地方是: 在RNN中不能丢弃隐含层的激活,这是因为她们在下一个时间步骤中会作为额外的输入。在RNN中当前隐含层的激活叫做状态(state)。在每一个序列的开始,我们通常会用0来初始化空的状态。

    RNN的状态依赖于当前的输入状态以及之前输入状态,而这又取决于这个状态之前的输入和状态。因此,状态已经间接的访问序列的所有以前的输入,可以被称为工作记忆(working memory)。

    让我们来比喻一下电脑程序。假设我们要识别手写文本的图像中的字母。我们将尝试用Python中的变量,循环语句,条件语句来解决这个问题。随意尝试一下,但我认为这很难直接的实现。

    指的庆幸的是,我们可以用示例数据来训练一个RNN。由于我们将中间信息存储在变量中,所以RNN学习的东西会存储其状态中的中间信息中。类似地,RNN的权重矩阵定义了它所执行的程序,决定在隐藏的激活中存储什么输入,以及如何将激活与新的激活和输出相结合。

    事实上,在2016年,用Sigmoid激活的RNN已经由Schäfer 和Zimmermann 在Turing-complete 中提出:只要给出正确的权重,RNNs可以计算任何可计算的程序。由于没有办法在任务中找到完美的权重,目前这是一个理论性的成功。但是,我们已经可以使用渐变下降得到非常好的结果,正如下一节所述。

    在我们研究优化RNN之前,如果我们可以编写Python程序,你可能会问为什么我们甚至需要RNN?那么,可能的权重矩阵的空间比可能的C程序的空间更容易被自动探索。(这句话我并没有理解,所以贴出原文the space of possible weight matrices is much easier to explore automatically than the space of possible C programs.)

    6.1.2 Backpropagation Through Time (反向传播时间)

    现在我们已经知道什么是RNN, 以及RNN为何有如此特殊的结构,接下来会关注于如何找到好的权重矩阵或者说是如何优化权重。正如前馈神经网络一样,绝大多数流行的优化方法都是基于梯度下降的(Gradient Descent)。不过,在这个动态系统(RNN)中并不是直接的反向传播错误。(PS: 这点很好理解,因为在前馈神经网络中是直接进行梯度下降优化的,而在RNN由于结构是循环的,神经元cell 不仅仅要与后面的输入相连还和之前时刻的当前神经元相连)

    RNNs优化技巧就是可以将RNNs在时间上展开(unfolding,unrolling)并像优化前向网络一样优化RNN。假设这个操作在长度为10的序列上。将隐藏的神经元从一个副本到另一个副本,复制十次。通过这样做,我们摆脱了循环连接而不改变计算的语义。这就产生了一个前向网络,相应的时间步长之间的权重被绑定到相同的长度上。在时间上展开RNN不会改变计算结果,这只是从另一种角度看RNN。

    我们现在可以通过这个展开的RNN来应用标准的反向传播,以便计算关于权重的误差的梯度。该算法被称为反向传播时间算法(Back-Propagation Through Time ,BPTT)。(这句话不知道咋翻译,先放在这里:

    (It will return a derivative for each weight in time, including those that are tied together. To keep tied weights at the same value, we handle them as tied weights are normally handeled, that is, summing up their gradients. Note that this equals the way convolutional filters are handeled in convents. )

    6.1.3 Encoding and Decoding Sequences(序列的编码和解码)

    上一节中RNN的展开图不仅仅对有助于参数优化,还为RNN以及输入输出数据的可视化提供了直观的方法。在去实现RNN之前,本文会将快速的介绍RNNs可以执行的(can perform)映射。序列化的任务可以有多种形式:有时,输入是一个序列,输出是一个单独的矢量,或者相反。 RNN可以很好地处理这些和更复杂的情况。

    标签序列化是在早期的章节中曾经出现过的概念。将有序的序列列作为输入,训练网络为每个帧产生正确的输出。我们基本上是从一个序列映射到另一个相同长度的序列。

    序列分类设置(setting中,我们有顺序的输入,每个输入都有一个类。通过在上一个时间帧选择输出来训练RNN。在优化过程中,计算的误差error将通过所有的时间步骤的反馈来更新权重,以便在每个时间步骤收集和整合有用的信息。

    生成序列 未完待续 2017年12月18

    相关文章

      网友评论

        本文标题:[第6章翻译开篇]Tensroflow For Machine

        本文链接:https://www.haomeiwen.com/subject/mhwqnxtx.html