循环神经网络

到⽬前为⽌我们默认数据都来⾃于某种分布,并且所有样本都是独⽴同分布的(independently and identically distributed,i.i.d.)。然⽽,⼤多数的数据并⾮如此。例如,⽂章中的单词是按顺序写的,如 果顺序被随机地重排,就很难理解⽂章原始的意思。同样,视频中的图像帧、对话中的⾳频信号以及⽹站上 的浏览⾏为都是有顺序的。因此,针对此类数据⽽设计特定模型,可能效果会更好。

简言之,循环神经网络可以有效地处理空间信息,循环神经⽹络通过引⼊状态变量存储过去的信息和当前的输⼊,从⽽可以确定当前的输出。

1.序列模型

处理序列模型需要统计数据和新的神经网络架构。例如,股票是一个与时间有关的模型,可以用自回归模型做策略;第⼀种策略,假设在现实情况下相当⻓的序列 xt−1, . . . , x1可能是不必要的,因此我们只需要满⾜某个⻓度 为τ的时间跨度,即使⽤观测序列xt−1, . . . , xt−τ。当下获得的最直接的好处就是参数的数量总是不变的,⾄少 在t > τ时如此,这就使我们能够训练⼀个上⾯提及的深度⽹络。这种模型被称为⾃回归模型(autoregressive models),因为它们是对⾃⼰执⾏回归。第⼆种策略,如 图1所⽰,是保留⼀些对过去观测的总结ht,并且同时更新预测xˆt和总结ht。这就产⽣了 基于xˆt = P(xt | ht)估计xt,以及公式ht = g(ht−1, xt−1)更新的模型。由于ht从未被观测到,这类模型也被称 为 隐变量⾃回归模型(latent autoregressive models)。

 图1

2.文本预处理

对于序列数据处理问题,例如,⼀篇⽂章可以被简单地看作⼀串单词序列,甚⾄是⼀串字符序列。本 节中,我们将解析⽂本的常⻅预处理步骤。这些步骤通常包括: 1. 将⽂本作为字符串加载到内存中。 2. 将字符串拆分为词元(如单词和字符)。 3. 建⽴⼀个词表,将拆分的词元映射到数字索引。 4. 将⽂本转换为数字索引序列,⽅便模型操作。

主要有词元化、词表、整合功能

3.学习语言模型

显⽽易⻅,我们⾯对的问题是如何对⼀个⽂档,甚⾄是⼀个词元序列进⾏建模。假设在单词级别对⽂本数据 进⾏词元化,我们可以依靠在 8.1节中对序列模型的分析。让我们从基本概率规则开始: P(x1, x2, . . . , xT ) = ∏ T t=1 P(xt | x1, . . . , xt−1). (8.3.2) 例如,包含了四个单词的⼀个⽂本序列的概率是: P(deep, learning, is,fun) = P(deep)P(learning | deep)P(is | deep, learning)P(fun | deep, learning, is). (8.3.3) 为了训练语⾔模型,我们需要计算单词的概率,以及给定前⾯⼏个单词后出现某个单词的条件概率。这些概 率本质上就是语⾔模型的参数。 这⾥,我们假设训练数据集是⼀个⼤型的⽂本语料库。⽐如,维基百科的所有条⽬、古登堡计划101,或者 所有发布在⽹络上的⽂本。训练数据集中词的概率可以根据给定词的相对词频来计算。例如,可以将估计 值Pˆ(deep) 计算为任何以单词“deep”开头的句⼦的概率。⼀种(稍稍不太精确的)⽅法是统计单词“deep” 在数据集中的出现次数,然后将其除以整个语料库中的单词总数。这种⽅法效果不错,特别是对于频繁出现 的单词。接下来,我们可以尝试估计 Pˆ(learning | deep) = n(deep, learning) n(deep) , (8.3.4) 其中n(x)和n(x, x′ )分别是单个单词和连续单词对的出现次数。不幸的是,由于连续单词对“deep learning” 的出现频率要低得多,所以估计这类单词正确的概率要困难得多。特别是对于⼀些不常⻅的单词组合,要想 找到⾜够的出现次数来获得准确的估计可能都不容易。⽽对于三个或者更多的单词组合,情况会变得更糟。 许多合理的三个单词组合可能是存在的,但是在数据集中却找不到。除⾮我们提供某种解决⽅案,来将这些 单词组合指定为⾮零计数,否则将⽆法在语⾔模型中使⽤它们。如果数据集很⼩,或者单词⾮常罕⻅,那么 这类单词出现⼀次的机会可能都找不到。 ⼀种常⻅的策略是执⾏某种形式的拉普拉斯平滑(Laplace smoothing),具体⽅法是在所有计数中添加⼀个 ⼩常量。⽤n表⽰训练集中的单词总数,⽤m表⽰唯⼀单词的数量。此解决⽅案有助于处理单元素问题,例如 通过: Pˆ(x) = n(x) + ϵ1/m n + ϵ1 , Pˆ(x ′ | x) = n(x, x′ ) + ϵ2Pˆ(x ′ ) n(x) + ϵ2 , Pˆ(x ′′ | x, x′ ) = n(x, x′ , x′′) + ϵ3Pˆ(x ′′) n(x, x′) + ϵ3 . (8.3.5) 其中,ϵ1, ϵ2和ϵ3是超参数。以ϵ1为例:当ϵ1 = 0时,不应⽤平滑;当ϵ1接近正⽆穷⼤时,Pˆ(x)接近均匀概率分 布1/m。上⾯的公式是 (Wood et al., 2011) 的⼀个相当原始的变形。 然⽽,这样的模型很容易变得⽆效,原因如下:⾸先,我们需要存储所有的计数;其次,这完全忽略了单词 的意思。例如,“猫”(cat)和“猫科动物”(feline)可能出现在相关的上下⽂中,但是想根据上下⽂调整这 类模型其实是相当困难的。最后,⻓单词序列⼤部分是没出现过的,因此⼀个模型如果只是简单地统计先前 “看到”的单词序列频率,那么模型⾯对这种问题肯定是表现不佳的。

4.循环神经网络

对于时 间步t − (n − 1)之前的单词,如果我们想将其可能产⽣的影响合并到xt上,需要增加n,然⽽模型参数的数量 也会随之呈指数增⻓,因为词表V需要存储|V|n个数字,因此与其将P(xt | xt−1, . . . , xt−n+1)模型化,不如使 ⽤隐变量模型: P(xt | xt−1, . . . , x1) ≈ P(xt | ht−1), (8.4.1) 其中ht−1是隐状态(hidden state),也称为隐藏变量(hidden variable),它存储了到时间步t − 1的序列信 息。通常,我们可以基于当前输⼊xt和先前隐状态ht−1 来计算时间步t处的任何时间的隐状态: ht = f(xt, ht−1). (8.4.2) 对于 (8.4.2)中的函数f,隐变量模型不是近似值。毕竟ht是可以仅仅存储到⽬前为⽌观察到的所有数据,然⽽ 这样的操作可能会使计算和存储的代价都变得昂贵。 回想⼀下,我们在 4节中讨论过的具有隐藏单元的隐藏层。值得注意的是,隐藏层和隐状态指的是两个截然 不同的概念。如上所述,隐藏层是在从输⼊到输出的路径上(以观测⻆度来理解)的隐藏的层,⽽隐状态则是 在给定步骤所做的任何事情(以技术⻆度来定义)的输⼊,并且这些状态只能通过先前时间步的数据来计算。 循环神经⽹络(recurrent neural networks,RNNs)是具有隐状态的神经⽹络。

 有隐状态地循环神经网络

a.困惑度

困惑度的最好的理解是“下⼀个词元的实际选择数的调和平均数”。我们看看⼀些案例。 • 在最好的情况下,模型总是完美地估计标签词元的概率为1。在这种情况下,模型的困惑度为1。 • 在最坏的情况下,模型总是预测标签词元的概率为0。在这种情况下,困惑度是正⽆穷⼤。 • 在基线上,该模型的预测是词表的所有可⽤词元上的均匀分布。在这种情况下,困惑度等于词表中唯⼀ 词元的数量。事实上,如果我们在没有任何压缩的情况下存储序列,这将是我们能做的最好的编码⽅ 式。因此,这种⽅式提供了⼀个重要的上限,⽽任何实际模型都必须超越这个上限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值