【机器学习】详解 RNN

本文详细介绍了循环神经网络(RNN)的概念、原理和应用,包括基本RNN、双向RNN和深度RNN。RNN因其能够处理序列数据和短期记忆能力而在自然语言处理等领域广泛应用。文章还探讨了RNN在处理长序列时面临的梯度消失/爆炸问题,并提出了改进措施,如梯度截断和LSTM。此外,文章提供了一个从零开始实现RNN语言模型的实例,以及基于PyTorch的RNN模型定义和训练过程。
摘要由CSDN通过智能技术生成

相关文章

        【机器学习】详解 RNN

        【机器学习】详解 LSTM

        【机器学习】详解 GRU


目录

一、概述

二、语言模型 与 N 元语法 (N-Gram)

三、循环神经网络的原理

3.1 基本 RNN

3.2 双向 RNN

3.3 深度 RNN

四、循环神经网络的特点

五、循环神经网络的例子

六、循环神经网络的实现

6.1 从头实现

6.1.1 one-hot 向量

6.1.2 初始化模型参数

6.1.3 定义模型

6.1.4 定义预测函数

6.1.5 裁剪梯度

6.4.6 困惑度

6.4.7 定义模型训练函数

6.4.8 训练模型并创作歌词

6.2 基于 PyTorch 实现

6.2.1 定义模型

6.2.2 训练模型


一、概述

        为什么需要序列模型呢?在前馈神经网络中,信息的传递是单向的,这种限制虽然使得网络变得更容易学习,但在一定程度上也减弱了神经网络模型的能力。前馈神经网络可以看作一个复杂的函数,每次输入都是独立的,即网络的输出只依赖于当前的输入。但在很多现实任务中,网络的输入不仅和当前时刻的输入相关,也和其过去一段时间的输出相关。比如一个 有限状态自动机,其下一个时刻的状态 (输出) 不仅仅和当前输入相关, 也和当前状态 (上一个时刻的输出) 相关。此外,前馈网络难以处理长度通常并不固定的时序数据,如视频、语音、文本等。而前馈神经网络却要求输入和输出的维数/长度/尺寸都是固定的,不能任意改变。当然,可以将所有输入数据填充到相同的固定长度。然而,这样做的表现仍不如序列模型,因为这些 前馈模型不了解给定输入的上下文环境。这是序列模型和前馈模型的主要区别之一。从另一角度看,前馈模型作为 “静态模型”,通常不会对处理过的信息保留记忆,而 序列模型则能够实现某种记忆功能。如同人类能够凭借过去的认知记忆更好地认识当下和未来一样。这使得序列模型成为了序列信息分析和处理的最佳选择之一。例如,对于一个句子,当看到一个词时,序列模型试图从同一句子中前面的词推导出关系。当读一个句子时,不会每次遇到一个新词都从头开始,而是会根据对所读过单词的理解来处理后续的每个单词。

        本文要介绍的 序列模型 ——  循环神经网络 (Recurrent Neural Network, RNN) 是一类具有 短期记忆能力 的神经网络,可以适应 不同长度 / 尺寸的输入数据。在 RNN 中,神经元不但可以接受其它神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。RNN 已被广泛应用在语音识别、语言模型以及自然语言生成等任务上。RNN 的参数学习可通过随时间反向传播算法实现,即按照时间的逆序将错误信息一步步地往前传递。当输入序列较长时,会存在 梯度爆炸和消失问题,也称为 长程依赖问题。为解决该问题,人们对循环神经网络进行了很多的改进,其中最有效的改进方式引入 门控机制。 此外,RNN 可以很容易地扩展到两种更广义的记忆网络模型:递归神经网络 (Recursive Neural Network) 和 图网络 (Graph Network)


二、语言模型 与 N 元语法 (N-Gram)

        语言模型 (language model) 是自然语言处理的重要技术。自然语言处理中最常见的数据类型是文本,以下不妨把一段 自然语言文本 看作一段 离散时间序列。假设一段长度为 T 的文本,其中的词 (words) 依次为 w_1, w_2, \ldots, w_T,那么在离散时间序列中,w_t (1 \le t \le T) 可视为在 时间步 (time step) t 的 输出或标签。给定一个长度为 T 的词的序列 w_1, w_2, \ldots, w_T,语言模型将计算该序列的概率:

        语言模型可用于提升语音识别和机器翻译的性能。例如,在语音识别中,给定一段 “没有海豹” 的语音,可能识别出 “没有海豹” 和 “没有海报” 这两段读音相同但语义有别的文本序列。若语言模型判断出前者概率大于后者,则最终会决定输出 “没有海豹” 的文本序列。在机器翻译中,若将英文 “you go first” 逐词翻译成中文,可能得到 “你走先”、“你先走” 等具有不同排列方式的文本序列。若语言模型判断 “你先走” 的概率大于其他排列方式的概率,则可将 “you go first” 翻译为 “你先走”。

        关于语言模型的计算,设序列 w_1, w_2, \ldots, w_T 中的每个词是根据顺序依次生成的,则所有词同时出现的 联合概率 为:

        例如,一段含有 4 个词的文本序列的概率为:

        为计算语言模型,需要计算词的概率,以及一个词在给定前几个词的情况下的条件概率,即 语言模型参数。设训练数据集为一个大型文本语料库,如维基百科的所有条目。词的概率可通过该词在训练数据集中的 相对词频 计算得到。例如,P(w_1) 可计算为 w_1 在训练数据集中的词频 与 训练数据集总词数 之比。同理,根据条件概率定义,一个词在给定前几个词的情况下的条件概率,也可通过训练数据集中的 相对词频 计算。例如,P(w_2 | w_1) 可计算为 w_1, w_2 两词相邻出现的频率与 w_1 的词频 之比,即 P(w_1, w_2) / P(w_1)。以此类推,可计算任意词的的条件概率。

        当序列长度增加时,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。而 n 元语法 (N-Grams) 通过 马尔可夫假设 (虽然并不一定成立) 简化了语言模型的计算。此处的马尔可夫假设是指 一个词的出现只与前面 n 个词 (对应于前 n 个状态) 相关,即 n 阶马尔可夫链 (Markov chain of order n)。若 n = 1,那么有 P(w_3 \mid w_1, w_2) = P(w_3 \mid w_2)。若基于 n-1 阶马尔可夫链,可将语言模型改写为:

        以上即为 n 元语法 (N-Grams)。它是基于 n−1 阶马尔可夫链的概率语言模型。当 n 分别为1、2、3 时,分别称作 一元语法 (unigram)二元语法 (bigram) 三元语法 (trigram)。例如,长度为 4 的序列 w_1, w_2, w_3, w_4 在一元语法、二元语法和三元语法中的概率分别为:

        当 n 较小时,n 元语法往往并不准确。例如,在一元语法中,由三个词组成的句子 “你走先” 和 “你先走” 的概率是一样的,只是连乘的顺序不同罢了。然而,当 n 较大时,n 元语法需计算并存储大量的词频和多词相邻频率,成本较高。那么,有没有方法在语言模型中更好地平衡以上这两点呢?


三、循环神经网络的原理

3.1 基本 RNN

        由上节可知,n 元语法下,时间步 t 的词 w_t 基于前面所有词的条件概率只考虑了最近时间步的 n-1 个词。若要考虑比 t - (n-1) 更早时间步的词对 w_t 的可能影响,需要增大 n。但这样将导致模型参数呈指数级增长。本节将介绍循环神经网络,以下简称为 RNN。RNN 不是刚性地记忆所有固定长度的序列,而是通过隐藏状态来存储之前时间步的信息

典型的 RNN 是有环结构

        由上图可见:一个典型的 RNN 网络架构包含一个输入 x_t,一个输出 h_t 和一个神经网络单元 A。和普通的前馈神经网络的区别在于,RNN 的神经网络单元 A 不但与输入 x_t 和输出 h_t 存在联系,而且自身也存在一个 循环 / 回路 / 环路 / 回环 (loop)。这种回路允许信息从网络中的一步传递到下一步。

        同时,RNN 还能按 时间序列展开循环 (unroll the loop) 为如下形式:

展开的 RNN

        以上架构不仅揭示了 RNN 的实质:上一个时刻的网络状态将会作用于 / 影响到下一个时刻的网络状态,还表明 RNN 和序列数据密切相关。同时,RNN 要求每一个时刻都有一个输入,但是不一定每个时刻都需要有输出。

        进一步地,公式化 RNN 的结构:

单个展开的 RNN 的结构
单个展开的 RNN 的结构 (带图例)

        设在时刻 t,RNN 的输入为 x_t,输出表示为 h_t,隐藏层状态为 h_t,则 h_t 不但与当前时刻 t 的输入 x_t 相关,还与上一个时刻 t-1 的隐藏层状态 h_{t-1} 有关,此时有:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值