本文是根据WildML的Recurrent Neural Networks Tutorial写的学习笔记。
循环神经网络
循环神经网络适用于处理序列化信息,比如:语言翻译,语音识别等。
如果,我们要实现一个翻译功能。首先需要理解原句中每个单词的含义。
这就需要根据上下文来理解。
假如:原句中的每个单词,以此对应神经网络中一个隐藏层。
在传统的神经网络框架中,隐藏层直接传递的是一个矢量Out。
这个Out矢量是原句当前每个词的一个输出,比如:含义等等。
那么,如何保存和传递上下文这个信息呢?
循环神经网络提出一个状态(state)的概念,用于传递上下文。
图
- 折叠图
- 展开图
循环神经网络框架的一点解释
与传统的神经网络架构有许多不同之处。
-
输入方式不同
传统的神经网络架构是静态输入,输入数据在开始前已经准备好了,并且一次全部从输入层导入。
循环神经网络是动态输入,每个隐藏层有一个输入,表示在时间t上的输入。 -
隐藏层,每层的节点数不同
传统的神经网络架构,每个隐藏层有多个节点。
循环神经网络,每个隐藏层有一个节点。 -
输出不同
循环神经网络,每个隐藏层有两个输出: output和state。 -
权重
循环神经网络需要计算三个权重(w, b),分别是\(U,V,W\)。
这三个权重是在隐藏层上共享的。
原文的例子
原文中计划实现一个循环神经网络,用于发现自然语言句子中单词出现的模式,最终可以生成一些合理的句子。
-
数据来源
原文中,从网上下载了很多条句子(英文的)。 -
数据的前期处理
首先,统计了所有单词(包括标点符号)。
取出最常见的7997单词,并且编号,每个单词有一个token。
设置了3个特殊的token:
UNKNOWN_TOKEN:匹配没有在8000列表中的单词。
SENTENCE_START: 表示句子开始。
SENTENCE_END: 表示句子结束。 -
输入和输出
输入x的维度是8000,意味着可以接受的句子长度最大是8000。
输出y的维度是8000,和x一一对应。
下面是一个句子构造后的实际例子:
x:
SENTENCE_START what are n't you understanding about this ? !
[0, 51, 27, 16, 10, 856, 53, 25, 34, 69]
y:
what are n't you understanding about this ? ! SENTENCE_END
[51, 27, 16, 10, 856, 53, 25, 34, 69, 1]
理解:y的每n位是x前n位的期望输出。
每个输入\(X_t\)(尽管有8000维),只有一个维度有值且为1,代表第\(t\)的单词的token的维度。
比如:what的token是51。那么\(X_t\)只有第51位为1,其它都是0。
这个叫做one-hot vector。
输出:每个token的可能性。
state的维度是100。
- 计算公式和维度
o_t = softmax(s_tV) \\
where \\
x_t.dimension = 8000 \\
o_t.dimension = 8000 \\
s_t.dimension = 100 \\
U.dimension = 100 * 8000 : x_tU \text{ is a 100 dimension vector} \\
W.dimension = 100 * 100 : s_{t-1}W \text{ is a 100 dimension vector} \\
V.dimension = 8000 * 100 : s_tV \text{ is a 8000 dimension vector}
\]
- 初始化U,V,W
初始化很重要。跟激活函数(这里是tanh)有关。
U,V,W每个元素是一个位于区间\(\left [ -\sqrt{n}, \sqrt{n} \right ]\)的随机数。\(n\)是输入数的长度。
循环神经网络训练流程
长短期记忆网络 - LSTM (Long Short Term Memory) Network
i \text{: input gate, defines how much of the newly computed state for the current input you want to let through.} \\
\]
f \text{: forget gate, defines how much of the previous state you want to let through.} \\
\]
o \text{: output gate, defines how much of the internal state you want to expose to the external network.} \\
\]
g \text{: a candidate hidden state.} \\
c_t = c_{t-1} \circ f + g \circ i \\
c_t \text{: the internal memory of the unit.} \\
s_t = tanh(c_t) \circ o
\]
门控循环单元 - GRUs (Gated Recurrent Units)
先看看计算公式:
z = \sigma(U^zx_e + W^zs_{t-1} + b^z) \\
r = \sigma(U^rx_e + W^rs_{t-1} + b^r) \\
h = tanh(U^hx_e + W^h(s_{t-1} \circ r) + b^h) \\
s_t = (1 - z) \circ h + z \circ s_{t-1} \\
o_t = Vs_t + c
\]
参照
- Recurrent Neural Networks Tutorial, Part 1 – Introduction to RNNs
- softmax损失函数的求导
- Understanding LSTM Networks
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:神经网络学习笔记-02-循环神经网络 - Python技术站