简介
首先,我们从一个问题看:
你是否能理解下面这句话的意思吗?“肉喜欢如此我的吃是”,显然很难理解。那这句话呢?“我是如此的喜欢吃肉”,句子通顺了就很好理解了!从这里可以看出,一些词顺序的颠倒就使得整个句子不通顺。
在日常生活中也有许许多多这样的问题。例如:
+ 之前的那个句子——词语的顺序决定了它们的意义
+ 时间序列数据——事件的发生顺序由时间决定
+ 基因组序列数据——每个序列都有不同的含义
它们共同之处就是:序列的信息决定事件本身。传统的神经网络并不能很好地学习数据的先前知识(prior knowledge),来理解这些数据。因此,便有了循环神经网络(RNN)。
一个用于处理序列的神经网络可以实现什么任务:
RNN的优点在于其应用的多样性,他有强大的处理各种输入和输出类型的能力。例如:
+ 情感分析——这是可以把一段文字分成正负两种情绪。输入时任意长度的句子,输出是固定长度固定类型。
“这一场电影真不错。” ——> +
“这人演的真是烂啊。” ——> -
+ 图像标注——假设我们有一张图片,我们需要描述这张图片。所以,我们的输入是单一的图像,输出是单词或句子。这里图像可能是固定大小的,但是输出是不同长度的文字描述。
+ 语言翻译——如下图,英文翻译成法语。每种语言都有自己的语义,对同一句话有不同的长度。因此,这次的输入和输出是不同长度的。
因此,RNNs可用于将输入映射到不同类型、长度的输出,并根据实际应用泛化。让我们看看RNN的架构是怎样的。
什么是循环神经网络
RNN因为具有“记忆”功能,所以很擅于处理自然语言和其他序列任务。它可以一次读取一个输入(例如单词),并且从一个时间步到另一个时间步可以通过隐藏层的**函数记住一些信息/内容。这一点允许一个单向RNN从过去获取信息来处理稍后的输入。
接下来要用到的符号:
- 上标 表示与第 层相关联的对象。
- 例如: 是第 层的**函数。 和 是第 层的参数。
-
上标 表示与第 样本相关联的对象。
- 例如: 是第 训练样本的输入。
-
上标 在第 个时间步的对象。
- 例如: 是在第 时间步输入的 x 。 是样本 在第 时间步的输入。
-
下标 表示向量的第 个条目。
- 例如: 表示在 层的第 个**函数。
如下是一个RNN,有一个输入层(X),一个隐藏层(RNN)和一个输出层(Y),其中隐藏层RNN做一个自循环。
我们对该图进行展开,得到如下结构,其中分为T个时间步:
我们先来看单个RNN cell:
一个RNN可以看做是单个RNN-cell的循环。我们先来看单个时间步是怎么实现的。
其中:
+ 为当前输入。
+ 为之前的隐藏状态,包含来自上一个RNN-cell的信息,其中第一个隐藏状态由我们随机初始化。
+ 为当前RNN-cell的隐藏状态,作为下一个RNN-cell 的输入。
+ 则是根据输入和之前隐藏状态得到的预测值。
其计算步骤:
1. 用tanh作为**函数计算隐藏状态:。(其中表示的权值矩阵与相乘的权值矩阵,同理)。
2. 使用上一步的得到的隐藏状态 , 计算预测值 。
你可以把RNN看做RNN-cell的重复,如果输入的数据序列超过10个时间步,那么将重复十个RNN-cell,也就是下图的T=10。其中每个RNN-cell将前一个时间步的RNN-cell的隐藏状态 和当前时间步的输入数据 作为输入。在这个时间步它输出一个隐藏状态 和一个预测 。
其中输入序列可以是一个词的one-hot编码。例如”我喜欢这个东西”的one-hot编码序列为[1,0,0,0……,1,0,……,1],其中 就对应序列中的 1, 对应其中序列中的第二个数0,以此类推。
以上就是一个最基本的RNN。
本文参考自Fundamentals of Deep Learning – Introduction to Recurrent Neural Networks和吴恩达的深度学习。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个基本的循环神经网络(RNN) - Python技术站