🐬 门控循环单元 GRU
type
status
date
slug
summary
tags
category
icon
password
Property
🐬
目录

 
梯度异常在实践中的意义:
  • 可能会遇到这样的情况:早期观测值对预测所有未来观测值具有非常重要的意义。
    • 考虑一个极端情况,其中第一个观测值包含一个校验和, 目标是在序列的末尾辨别校验和是否正确。 在这种情况下,第一个词元的影响至关重要。 希望有某些机制能够在一个记忆元里存储重要的早期信息。 如果没有这样的机制,就将不得不给这个观测值指定一个非常大的梯度, 因为它会影响所有后续的观测值。
  • 可能会遇到这样的情况:一些词元没有相关的观测值。
    • 例如,在对网页内容进行情感分析时, 可能有一些辅助HTML代码与网页传达的情绪无关。 希望有一些机制来跳过隐状态表示中的此类词元。
  • 可能会遇到这样的情况:序列的各个部分之间存在逻辑中断。
    • 例如,书的章节之间可能会有过渡存在, 或者证券的熊市和牛市之间可能会有过渡存在。 在这种情况下,最好有一种方法来重置内部状态表示。
🐬 长短期记忆网络 LSTM
type
status
date
slug
summary
tags
category
icon
password
Property
🐬

 
 
长短期记忆网络的设计比门控循环单元稍微复杂一些, 却比门控循环单元早诞生了近20年

门控记忆元

长短期记忆网络的设计灵感来自于计算机的逻辑门。 长短期记忆网络引入了记忆元(memory cell),或简称为单元(cell)。 有些文献认为记忆元是隐状态的一种特殊类型, 它们与隐状态具有相同的形状,其设计目的是用于记录附加的信息。 为了控制记忆元,需要许多门。
  • 一个门用来从单元中输出条目,称为输出门(output gate)
  • 一个门用来决定何时将数据读入单元,称为输入门(input gate)
  • 一种机制来重置单元的内容,由遗忘门(forget gate)来管理, 这种设计的动机与门控循环单元相同, 能够通过专用机制决定什么时候记忆或忽略隐状态中的输入
🐬 深度循环神经网络
type
status
date
slug
summary
tags
category
icon
password
Property
🐬
目录

 
notion image
 
目前只讨论了具有一个单向隐藏层的循环神经网络。 隐变量和观测值与具体的函数形式的交互方式是相当随意的。 只要交互类型建模具有足够的灵活性,这就不是一个大问题。 然而,对于一个单层来说,这可能具有相当的挑战性。 之前在线性模型中,通过添加更多的层来解决这个问题。 而在循环神经网络中首先需要确定如何添加更多的层, 以及在哪里添加额外的非线性。
事实上,可以将多层循环神经网络堆叠在一起, 通过对几个简单层的组合,产生了一个灵活的机制。 特别是,数据可能与不同层的堆叠有关。 例如,可能希望保持有关金融市场状况 (熊市或牛市)的宏观数据可用, 而微观数据只记录较短期的时间动态。
🐬 双向循环神经网络
type
status
date
slug
summary
tags
category
icon
password
Property
🐬
目录

 
 
未来很重要
在序列学习中,以往假设的目标是: 在给定观测的情况下 (例如,在时间序列的上下文中或在语言模型的上下文中), 对下一个输出进行建模。 虽然这是一个典型情景,但不是唯一的。 还可能发生什么其它的情况呢? 考虑以下三个在文本序列中填空的任务:
  • ___
  • ___饿了。
  • ___饿了,我可以吃半头猪。
根据可获得的信息量,可以用不同的词填空, 如“很高兴”("happy")、“不”("not")和“非常”("very")。 很明显,每个短语的“下文”传达了重要信息, 而这些信息关乎到选择哪个词来填空, 所以无法利用这一点的序列模型将在相关任务上表现不佳。 例如,如果要做好命名实体识别 (例如,识别“Green”指的是“格林先生”还是绿色), 不同长度的上下文范围重要性是相同的。
🐬 机器翻译与数据集
type
status
date
slug
summary
tags
category
icon
password
Property

 
语言模型是自然语言处理的关键, 而机器翻译是语言模型最成功的基准测试。 因为机器翻译正是将输入序列转换成输出序列的序列转换模型(sequence transduction)的核心问题。 序列转换模型在各类现代人工智能应用中发挥着至关重要的作用, 为此,这里将介绍机器翻译问题及需要使用的数据集。
机器翻译(machine translation)指的是将序列从一种语言自动翻译成另一种语言。 事实上,这个研究领域可以追溯到数字计算机发明后不久的20世纪40年代, 特别是在第二次世界大战中使用计算机破解语言编码。 几十年来,在使用神经网络进行端到端学习的兴起之前, 统计学方法在这一领域一直占据主导地位。 因为统计机器翻译(statisticalmachine translation)涉及了 翻译模型和语言模型等组成部分的统计分析, 因此基于神经网络的方法通常被称为 神经机器翻译(neuralmachine translation), 用于将两种翻译模型区分开来。
这里关注点是神经网络机器翻译方法,强调的是端到端的学习。 与单一语言的语言模型问题存在不同, 机器翻译的数据集是由源语言和目标语言的文本序列对组成的。 因此需要一种完全不同的方法来预处理机器翻译数据集, 而不是复用语言模型的预处理程序。
 

下载和预处理数据集

首先,下载一个由Tatoeba项目的双语句子对组成的“英-法”数据集,数据集中的每一行都是制表符分隔的文本序列对,序列对由英文文本序列和翻译后的法语文本序列组成。 请注意,每个文本序列可以是一个句子, 也可以是包含多个句子的一个段落。 在这个将英语翻译成法语的机器翻译问题中, 英语是源语言(source language), 法语是目标语言(target language)
🐬 编码器-解码器架构
type
status
date
slug
summary
tags
category
icon
password
Property
🐬
目录

 
重新考察CNN
notion image
 
 
🐬 序列到序列学习 seq2seq
type
status
date
slug
summary
tags
category
icon
password
Property
🐬
目录

 
机器翻译中的输入序列和输出序列都是长度可变的。 为了解决这类问题,设计了一个通用的”编码器-解码器“架构。 这里将使用两个循环神经网络的编码器和解码器, 并将其应用于序列到序列(sequence to sequence,seq2seq)类的学习任务。
遵循编码器-解码器架构的设计原则, 循环神经网络编码器使用长度可变的序列作为输入, 将其转换为固定形状的隐状态。 换言之,输入序列的信息被编码到循环神经网络编码器的隐状态中。 为了连续生成输出序列的词元, 独立的循环神经网络解码器是基于输入序列的编码信息和输出序列已经看见的或者生成的词元来预测下一个词元。
 
下图演示了如何在机器翻译中使用两个循环神经网络进行序列到序列学习:
notion image
特定的“<eos>”表示序列结束词元。 一旦输出序列生成此词元,模型就会停止预测。 在循环神经网络解码器的初始化时间步,有两个特定的设计决定: 首先,特定的“<bos>”表示序列开始词元,它是解码器的输入序列的第一个词元。 其次,使用循环神经网络编码器最终的隐状态来初始化解码器的隐状态。 例如,在[Sutskever et al., 2014]的设计中, 正是基于这种设计将输入序列的编码信息送入到解码器中来生成输出序列的。 在其他一些设计中[Cho et al., 2014b], 如图所示, 编码器最终的隐状态在每一个时间步都作为解码器的输入序列的一部分。类似于语言模型的训练,可以允许标签成为原始的输出序列,从源序列词元“<bos>”、“Ils”、“regardent”、“.” 到新序列词元 “Ils”、“regardent”、“.”、“<eos>”来移动预测的位置。
notion image
🐬 束搜索
type
status
date
slug
summary
tags
category
icon
password
Property
🐬

 
seq2seq中,逐个预测输出序列, 直到预测序列中出现特定的序列结束词元“<eos>”。 这里将首先介绍贪心搜索(greedy search)策略, 并探讨其存在的问题,然后对比其他替代策略: 穷举搜索(exhaustive search)束搜索(beam search)
在任意时间步 ,解码器输出 的概率取决于时间步 之前的输出子序列 和对输入序列的信息进行编码得到的上下文变量 。 为了量化计算代价,用 表示输出词表, 其中包含“<eos>”, 所以这个词汇集合的基数 就是词表的大小。 我们还将输出序列的最大词元数指定为 。 因此,我们的目标是从所有 个可能的输出序列中寻找理想的输出。 当然,对于所有输出序列,在“<eos>”之后的部分(非本句) 将在实际输出中丢弃。
 
  • 贪心搜索所选取序列的计算量最小,但精度相对较低
  • 穷举搜索所选取序列的精度最高,但计算量最大
  • 束搜索通过灵活选择束宽,在正确率和计算代价之间进行权衡

贪心搜索

注意力提示
type
status
date
slug
summary
tags
category
icon
password
Property
 

生物学中的注意力提示

注意力是如何应用于视觉世界中的呢? 从当今十分普及的双组件的框架开始讲起: 这个框架的出现可以追溯到19世纪90年代的威廉·詹姆斯, 他被认为是“美国心理学之父”。 在这个框架中,受试者基于非自主性提示自主性提示 有选择地引导注意力的焦点。
非自主性提示是基于环境中物体的突出性和易见性。 想象一下,假如你面前有五个物品: 一份报纸、一篇研究论文、一杯咖啡、一本笔记本和一本书。 所有纸制品都是黑白印刷的,但咖啡杯是红色的。 换句话说,这个咖啡杯在这种视觉环境中是突出和显眼的, 不由自主地引起人们的注意。 所以你把视力最敏锐的地方放到咖啡上。
notion image
喝咖啡后,你会变得兴奋并想读书。 所以你转过头,重新聚焦你的眼睛,然后看看书。 与之前由于突出性导致的选择不同, 此时选择书是受到了认知和意识的控制, 因此注意力在基于自主性提示去辅助选择时将更为谨慎。 受试者的主观意愿推动,选择的力量也就更强大。
notion image

查询、键和值

自主性的与非自主性的注意力提示解释了人类的注意力的方式, 下面看看如何通过这两种注意力提示, 用神经网络来设计注意力机制的框架,
首先,考虑一个相对简单的状况, 即只使用非自主性提示。 要想将选择偏向于感官输入, 我们可以简单地使用参数化的全连接层, 甚至是非参数化的最大汇聚层或平均汇聚层。
因此,“是否包含自主性提示”将注意力机制与全连接层或汇聚层区别开来。 在注意力机制的背景下,我们将自主性提示称为查询(query)。 给定任何查询,注意力机制通过注意力汇聚(attention pooling) 将选择引导至感官输入(sensory inputs,例如中间特征表示)。 在注意力机制中,这些感官输入被称为值(value)。每个值都与一个键(key)配对, 这可以想象为感官输入的非自主提示。
如图所示,可以设计注意力汇聚, 以便给定的查询(自主性提示)可以与键(非自主性提示)进行匹配, 这将引导得出最匹配的值(感官输入)。
注意力汇聚:Nadaraya-Watson 核回归
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
1964年提出的Nadaraya-Watson核回归模型来演示具有注意力机制的机器学习

生成数据集

考虑这个回归问题: 给定的成对的“输入-输出”数据集 , 如何学习来预测任意新输入的输出
根据下面的非线性函数生成一个人工数据集, 其中加入的噪声项为
服从均值为和标准差为的正态分布。
生成 个训练样本和 个测试样本,为了更好地可视化之后的注意力模式,将训练样本进行排序。
下面函数绘制所有的训练样本(样本由圆圈表示), 不带噪声项的真实数据生成函数(标记为“Truth”), 以及学习得到的预测函数(标记为“Pred”)
注意力评分函数
type
status
date
slug
summary
tags
category
icon
password
Property
 
Nadaraya-Watson 核回归中, 我们使用高斯核来对查询和键之间的关系建模。 可以将高斯核指数部分视为注意力评分函数, 简称评分函数, 然后把这个函数的输出结果输入到softmax函数中进行运算。 通过上述步骤,将得到与键对应的值的概率分布(即注意力权重)。 最后,注意力汇聚的输出就是基于这些注意力权重的值的加权和。
从宏观来看,可以使用上述算法来实现图中的注意力机制框架,表示注意力评分函数。 由于注意力权重是概率分布, 因此加权和其本质上是加权平均值。
notion image
用数学语言描述,假设有一个查询 个“键-值”对 , 其中 。 注意力汇聚函数就被表示成值的加权和:
其中查询 和键 的注意力权重(标量) 是通过注意力评分函数将两个向量映射成标量, 再经过softmax运算得到的:
选择不同的注意力评分函数会导致不同的注意力汇聚操作,这里介绍两个流行的评分函数。
 

掩蔽softmax操作

softmax操作用于输出一个概率分布作为注意力权重,在某些情况下,并非所有的值都应该被纳入到注意力汇聚中。 例如,为了高效处理小批量数据集, 某些文本序列被填充了没有意义的特殊词元, 为了仅将有意义的词元作为值来获取注意力汇聚, 可以指定一个有效序列长度(即词元的个数), 以便在计算softmax时过滤掉超出指定范围的位置。 通过这种方式,可以在下面的masked_softmax函数中实现这样的掩蔽softmax操作, 其中任何超出有效长度的位置都被掩蔽并置为0。
Bahdanau 注意力
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
之前探讨了机器翻译问题: 通过设计一个基于两个循环神经网络的编码器-解码器架构, 用于序列到序列学习。 具体来说,循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量, 然后循环神经网络解码器根据生成的词元和上下文变量 按词元生成输出(目标)序列词元。 然而,即使并非所有输入(源)词元都对解码某个词元都有用, 在每个解码步骤中仍使用编码相同的上下文变量。 有什么方法能改变上下文变量呢?
在为给定文本序列生成手写的挑战中, Graves设计了一种可微注意力模型, 将文本字符与更长的笔迹对齐, 其中对齐方式仅向一个方向移动。 受学习对齐想法的启发,Bahdanau等人提出了一个没有严格单向对齐限制的可微注意力模型。 在预测词元时,如果不是所有输入词元都相关,模型将仅对齐(或参与)输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现的。

模型

下面描述的Bahdanau注意力模型将遵循seq2seq中的相同符号表达。 这个新的基于注意力的模型与seq2seq中的模型相同, 只不过seq2seq中的上下文变量 在任何解码时间步 都会被 替换。 假设输入序列中有个词元, 解码时间步 的上下文变量是注意力集中的输出:
其中,时间步 时的解码器隐状态 是查询, 编码器隐状态 既是键,也是值, 注意力权重是使用加性注意力打分函数计算的。
seq2seq中的循环神经网络编码器-解码器架构略有不同,下图描述了Bahdanau注意力的架构。
notion image

定义注意力解码器

其实,只需重新定义解码器即可。 为了更方便地显示学习的注意力权重, 以下AttentionDecoder类定义了带有注意力机制解码器的基本接口