循环神经网络

在阅读Learning Semantic-Aware Knowledge Guidance for Low-Light Image Enhancement论文的时候,遇到了NLP领域的编码器-译码器架构,于是开始补NLP的知识。为了学习编码器-译码器架构,可能需要涉及transformer,循环神经网络,序列到序列的知识,这里将循环神经网络作为起点进行学习,参考学习的是吴恩达深度学习课程。

本文主要涉及单隐层循环神经网络的架构的知识,不涉及现代循环神经网络,如门控循环单元GRU和长短期记忆网络LSTM。

符号约定:

1.对于一个给定的序列,通常是一个句子或者是句子的一部分,或者是某个段落的一部分,包含几个句子。我们用x,如x<1>,x<2>,x<3>...x...x表示这个序列的某个元素

同样的,用y表示预测、输出的结果,不同的nlp任务,y会不一样。如果是文本分类,将序列的每个元素进行分类,人名与否,分为1与0。

回顾之前在多层感知机神经网络中学习的符号约定,我们把x(i)作为第i个样本,那么这里,将x(i)作为第i个序列的第t个元素。同样,y(i)意为第i个序列的第t个元素的输出。

为了表示序列的长度,我们将Tx(i)表示第i个序列的长度,Ty(i)表示第i个序列输出的长度。

One-hot独热编码:

如何表示一个序列的单词呢?我们需要一个词典,这个词典是一个向量,包含了序列中可能出现的所有单词,我们通过下标索引就能得到这个单词。

循环神经网络_第1张图片

对于某个特定的序列,里面的单词可以通过独热编码得到一个独一无二的,只与这个单词有关的编码向量。规则很简单,编码向量的形状与词典向量形状相同。如果词典有10000个单词,那么编码向量就是10000个元素。独热编码向量只有一个元素是1,其他全为0。词典的单词和独热编码向量的每一个元素一一对应,如果词典的单词正好是某个序列的某个单词元素,那么这个单词元素的独热编码向量的值为1的下标就正好是词典中该单词的下标。以上面的序列为例,构建一个词典,以及某独热编码见下图:

循环神经网络_第2张图片

循环神经网络:

循环神经网络可以解决什么问题?

循环神经网络可以解决这两个问题:1.序列长度不一致        2.信息共享。

1.序列长度不一致,这主要是由于输入的句子长度不一致。以往我们的神经网络的输入长度都是一定的。输入的向量长度不一致,如果使用以往的网络当然不能应对这样的问题。尽管我们可以通过填充和截断操作将序列进行预处理,确定一个固定的长度,但这样也会损失一定的推理成本。

2.信息共享,即上下文信息共享。这是最为重要的需要解决的问题。即使我们解决了序列长度不一致的问题,损失了不少推理成本,我们还是无法解决上下文信息共享的问题。

时间步:

当处理序列的第t个单词时,称为第t个时间步。

隐状态:

我们用隐状态a表示第t个时间步所记载的前文信息。它通常是一个向量,称为隐向量。

循环神经网络架构与前向传播:

设计理念在于,与其一次性输入所有的单词进行学习分析,不如一个一个单词输入进行分析。先将第一个单词x<1>输入进行处理,然后更新隐状态为a<1>,预测出第一个输出y<1>,接着进入第二个时间步,以第二个单词x<2>为输入,结合前一个隐状态a<1>,更新为第二个时间步的隐状态a<2>,输出y<2>。依次重复,每个时间步都利用了历史信息,更新当下时间步的隐状态,生成当下时间步的输出,这就是前向传播。

循环神经网络_第3张图片

 需要说明一些细节。第一个时间步的输入x<1>根据的历史信息是隐状态a<0>,通常这个隐向量是一个零向量,这符合我们的常识。除此之外,网络存在三个权重:Wax,Wya,Waa。

在说明这三个符号前,我可以先讲一个观点。对于某个特定的时间步,我们可以将循环神经网络认为是双输入,双输出的网络,输入为隐状态a和单词x,输出为预测单词y和更新隐状态a

W代表权重,下标有两个字母,第一个字母的意思是经过计算,输出的权重,Wa表示a的权重,Wy表示y的权重。第二个字母的意思是在计算过程中,所使用的输入。Wax表示,使用输入单词x得到隐状态a的权重,Wya表示,使用t-1时间步的隐状态a作为输入,得到输出y的权重,Waa表示,使用t-1时间步的隐状态a作为输入,得到当下时间步的隐状态a的权重。

循环神经网络_第4张图片

 输出函数表达式:

通常两个输出函数的激活函数并不一样,隐状态a的激活函数是tanh或者是relu。输出单词y的激活函数是sigmoid(二分类输出)或者是softmax(多分类输出)。

循环神经网络_第5张图片

简化输出函数表达式:

观察a的表达式,我们可以将权重矩阵,输入向量堆叠起来。

通常权重矩阵的行是一致的,比如Waa和Wax都可以是100行,而列数根据输入向量的元素个数而定。如果a是个100*1的向量,那么根据矩阵乘法,Waa就是一个100*100的矩阵。如果x是一个10000*1的向量,那么Wax就是一个100*10000的矩阵。

这时候由于权重矩阵行是一致的,可以将他们两个按行堆叠为同一个矩阵Wa,表示输出隐状态a的权重矩阵。

循环神经网络_第6张图片

同时,由于输入向量x和隐状态a的列数,都是1列,可以将他们按列堆叠为一个向量。如a是一个100*1的向量,x是一个10000*1的向量,按列堆叠就得到了10100*1的向量。

循环神经网络_第7张图片

堆叠后的权重矩阵和输入向量依然满足矩阵乘法,可以相乘,于是输出a表达式可以得到简化。 

困惑度与损失函数:

通常,在特定的时间步t,一个输入序列经过循环神经网络预测得到的下一个序列,与我们期待的得到的序列有一定的误差。定义这个误差,我们使用交叉熵。L表示,在时间步t的损失。

定义整个过程的损失(总损失),则是将所有时间步的损失累加在一起,表示为L

困惑度的定义是特定时间步t下,损失的自然指数,即exp(L)。

不同结构的循环神经网络:

一对多结构:

在第一个时间步,只需要输入一个序列,经过处理,更新隐状态,预测出第一个单词,然后作为第二个时间步的输入,以此类推,得到一批长度为Ty的序列。

通常这种结构的应用场景为音乐生成,输入一个音乐风格类型,然后生成一段音符。

循环神经网络_第8张图片

多对一结构:

多对一结构是在第一个时间步时输入第一个序列,然后不输出序列,只是更新隐状态,然后在第二个时间步继续输入一个序列,继续更新隐状态,以此类推,在输入完所有的共Tx个序列后,更新出最后的隐状态,根据这个最后的隐状态输出一个序列y。

这种结构可运用到情感分析,输入一段长为Tx的序列,输出经过分析,这个序列的内容所隐含的情感。

循环神经网络_第9张图片 
 多对多结构版本1:

这种结构的第一个版本的特点是,输入序列总个数和输出序列总个数一样。输入了Tx个序列,输出了Ty个序列,有Tx = Ty。

在运行过程中,每个时间步都输入一个序列,然后输出预测序列。

 循环神经网络_第10张图片

多对多结构版本2——编码器译码器架构之一:

这种结构是广为人知的编码器译码器架构之一,前面从第一个时间步开始,输入序列,然后不输出,只更新隐状态。等到输入的所有序列结束输入,将最后的隐状态不断输出。其中,前面输入序列而不输出序列称为编码,编码的结果是得到一个隐状态,包含了输入的所有信息,然后通过后面部分的译码,将隐状态输出为输出序列。

循环神经网络_第11张图片

这种结构可以运用到机器翻译上,输入一段英语段落,经过编码,译码,得到翻译后的法语段落。

然而,这只是编码器译码器架构的一种,因为这种情况的编码器和译码器都由一个单隐层的循环神经网络担任。编码器译码器架构也可以是两个循环神经网络,前面的循环神经网络担任编码器(Encoder)工作,将输入序列编码为一段状态信息,然后后面的循环神经网络担任译码器(Decoder)工作,将状态信息译码为输出序列。

当然,编码器译码器架构可能还有很多种,在此不列举。

 循环神经网络_第12张图片

经过这部分的学习,我们应该基本了解编码器译码器的架构,可以阅读相关的论文了。后续可以继续学习序列到序列的理念,以及注意力机制,Transformer了。

不断前进是一个令人兴奋的过程,加油!

你可能感兴趣的:(深度学习,rnn,神经网络,深度学习,人工智能)