1.1 为什么选择序列模型
序列模型的应用
- 语音识别:将输入的语音信号直接输出相应的语音文本信息。无论是语音信号还是文本信息均是序列数据。
- 音乐生成:生成音乐乐谱。只有输出的音乐乐谱是序列数据,输入可以是空或者一个整数。
- 情感分类:将输入的评论句子转换为相应的等级或评分。输入是一个序列,输出则是一个单独的类别。
- DNA序列分析:找到输入的DNA序列的蛋白质表达的子序列。
- 机器翻译:两种不同语言之间的想换转换。输入和输出均为序列数据。
- 视频行为识别:识别输入的视频帧序列中的人物行为。
- 命名实体识别:从输入的句子中识别实体的名字。
1.2 数学符号
符号含义
- 表示输入 x 中的第 t 个符号(单词)
- 表示输出 y 中的第 t 个符号(单词)
- 表示第 i 个输入样本中的第 t 个符号(单词)
- 表示第 i 个输出样本中的第 t 个符号(单词)
- 表示输入 x 的长度
- 表示处处 y 的长度
字典编码
- 利用一个字(词)典向量,通常有3-5万个字(词)。
- 可以利用one-hot编码,指出输入的序列中每个单词的向量
- 与字典向量大小一致
- 是单词的索引位置1,其他位置0
1.3 循环神经网络模型
传统神经网络
试想我们如果将输入拆成每个字的 One-Hot 编码输入传统的深度神经网络中,经过一些隐藏层的计算得到输出 Y。
问题:
- 输入和输出数据在不同的例子中可以有不同的长度;
- 不能共享从文本不同位置所学习到的特征
- 参数数量过多
循环神经网络
循环神经网络,从左到右一个字计算一步,每一步的计算不仅来自这一步的输入,也来自上一步的激活函数值。
- 最左侧第一层假设了一个来自第零层的激活值向量(零向量或随机向量)
- 有的研究论文上将循环神经网络的结构写成右边的形式,其和左边的形式是一致的。
循环神经网络是从左到右扫描数据的,同时共享每个时间步的参数。
- Wax 管理从输入 到隐藏层的连接
- Waa 管理激活值 到隐藏层的连接
- Wya 管理隐藏层到激活值y的连接
- 每个时间步都使用相同的 Wax,Waa,Wya
循环神经网络的前向传播
- 计算每步的激活函数a: Tanh/ReLu
- 计算每步的输出函数
- 每一步都有一个激活函数 和一个输出函数
- 激活函数 来自于输入 和上一步的激活函数 , 输出函数 来自于激活函数
- 激活函数或者输出函数都是 g(WX+b) 这一点没有改变
- 参数W,b 的第一个下标表示是激活函数a 的参数还是输出函数 y 的参数, W的第二个下标表示这个参数是用来乘以那个输入的
前向传播参数的简化
下面参数可以精简合并为WX+b
精简合并参数
其中
1.4 穿越时间的反向传播
损失函数
前向传播从左到右,按照输入的次序进行,反向传播从右到左,好似穿越时间的传播。
1.5 不同类型的循环神经网络
输入和输出的长度不一定一样(Tx ?=? Ty)
- One-to-one: 一个输入一个输出,相当于传统的简单神经网络
- One-to-many: 音乐生成的例子,输入一个音乐的类型或者空值,直接生成一段音乐序列或者音符序列
- Many-to-one: 情感分类问题中,我们要对某个序列进行正负判别或者打星操作。
- Many-to-many (Tx equal Ty): 上几节介绍的命名实体识别
- Myny-to-many (Tx not equal Ty): 语言翻译 (前一段都是输入的 encode,后一段都是输出的 decode)
1.6 语言模型和序列生成
在NLP中,构建语言模型是最基础也是最重要的工作之一,我们可以通过RNN来很好的实现。
什么是语言模型?
- 语音识别中,两句话有相似的发音,但是实际中正确性却不相同
- 如何让语音识别系统能够输出正确地给出想要的输出。
- 也就是从输入的句子中,评估各个句子中各个单词出现的可能性,进而给出整个句子出现的可能性。
- 语言模型在语音识别和语言翻译中都是基础的模型。
语言模型:具有语言结构和内在语法和单词顺序的模型,可以用来预测句子下一个单词是某个单词的概率,通过训练大量的语料库可以训练出语言模型。
使用RNN构建语言模型
- 训练集:一个很大的语言文本语料库
Tokenize:将句子使用字典库标记化(反向索引)
未出现在字典库中的词使用“UNK”来表示
- 使用零向量对输出进行预测,即预测第一个单词是某个单词的可能性
- 通过前面的输入,逐步预测后面一个单词出现的概率;
- 使用softmax损失函数计算损失,对网络进行参数更新,提升语言模型的准确率
原理:
1. 基于字典库,通过句子前面的输入预测该位置各个单词出现的概率;
2. 最后将各个位置单词的概率相乘得到句子的概率。
1.7 对新序列采样
对训练完的语言模型进行采样
训练完一个语言模型后,我们想知道模型学到了什么,可以从该模型中进行一次新序列采样来观察模型学到的知识。(非正式的方法)
采样的过程就是根据模型预测第一个单词是什么,然后根据第一个单词预测第二个单词是什么,以此类推。
字符模型
除了基于词汇的模型,还可以构建基于字符的模型。
- 难以捕捉句子前后依赖关系
- 会得到太多太长的输出序列
- 训练代价比较高
- 仅在特殊情况下使用
模型采样的例子
下图是一个新闻模型和一个莎士比亚模型的采样结果。
1.8 带有神经网络的梯度消失
梯度消失
看个例子
- The cat, which already ate ………..,was full;
- The cats, which already ate ………..,were full.
这两个句子,应该识别cat … was 识别 cats … were 但是中间部分单词可以很长,也就是单复数的依赖关系是长期依赖(long-term dependencies)
基本的RNN模型,不擅长捕获这种长期依赖,因为输出y得到的梯度很难通过反向传播再传播回去,也就是很难对前面几层的权重产生影响,这就是梯度消失的问题。
梯度爆炸
如果梯度指数级增大,会让参数变得太大而溢出,所以梯度爆炸比梯度消失更容易发现。解决方法就是用梯度修剪,也就是观察梯度向量,如果其大于某个阈值,则对其进行缩放,保证它不会太大。
1.9 GRU 单元
门控循环单元(Gated Recurrent Unit, GRU)改变了RNN的隐藏层,使其能够更好地捕捉深层次连接,并改善了梯度消失的问题。
RNN 单元
对于RNN的一个时间步的计算单元,在计算a也就是下图右边的公式,能以左图的形式可视化呈现:
简化的GRU单元
时间步从左到右进行计算的时候,在GRU单元中,存在一个新的变量称为c,(代表cell),作为“记忆细胞”,其提供了长期的记忆能力。
- ,实际上记忆细胞输出的是在t时间步上的激活值a;
- ,在每一个时间步上,给定一个候选值 ,用以替代原本的记忆细胞 ;
- ,代表更新门,是一个0-1的值,用以决定是否对当前时间步的记忆细胞用候选值更新替代;
- ,记忆细胞的更新规则,门控值处于0-1之间,根据更新公式能够有效地缓解梯度消失的问题。
- 其中, 、 、 均具有相同的维度;
因为Γu通常非常小,趋近于0,所以 大多情况下都保持 不变,所以解决了深度网络中的长期依赖问题。
完整的 GRU 单元
完整的GRU单元还存在另外一个门 ,来决定候选值 与原值 的相关程度。
1.10 长短期记忆(LSTM)
GRU能够让我们在序列中学习到更深的联系
长短期记忆(long short-term memory, LSTM)对捕捉序列中更深层次的联系要比GRU更加有效。
LSTM中,使用了单独的更新门Γu
和遗忘门Γf,以及一个输出门Γo
可以将多个 LSTM 单元连接起来,可以看出,适当的参数可以使记忆细胞顺利向更深层传递。
在实际使用时,几个门值不仅仅取决于 和 ,还可能会取决于上一个记忆细胞的值 ,这也叫做偷窥孔连接。
选择
- GRU 有两个门,比较简单,计算快
- LSTM 有三个门,复杂但是灵活(推荐)
1.11 双向神经网络
如下图仅通过前三个单词很难判断是否是人名,需要后面第四个单词进行佐证。
双向 RNN(bidirectional RNNs) 模型能够在序列的某处,不仅可以获取之前的信息,还可以获取未来的信息。
在双向 RNN 中,有一个从左到右再从右到左的环形前向传播,结果 的预测依赖于从左到右的激活函数 a1 和从右向左的激活函数 a2。
双向 RNN 模型更复杂,需要知道整个完整的输入才能预测值。在NLP问题中,常用的就是使用双向RNN的LSTM。
1.12 深层循环神经网络
与标准神经网络不同,深度循环神经网络每个激活值在每个层次,每个时间点都进行计算。
与其他深度神经网络不同,深度循环神经网络通常3层就算多的了,因为计算非常耗时。更常见的是在一定层次(比如三层)循环神经网络的基础上到预测结果之间加入其他的神经网络层,来增加预测的准确度。