【深度学习】循环神经网络(RNN)

本文为深度学习的学习总结,讲解循环神经网络(RNN)。欢迎在评论区与我交流 😃

序列模型的应用

在语音识别方面,输入 X X X 为语音序列,输出 Y Y Y 为一系列单词。常使用循环神经网络解决这类问题。

音乐生成问题中,只有输出数据 Y Y Y 是序列,输入 X X X 可以是空集、单一整数指代生成音乐的风格或曲子的头几个音符。

感情分类中,输入是序列。

DNA 序列分析中,给出一个 DNA 序列,标记哪部分匹配某种蛋白质。

视频行为识别中,输入一系列的视频帧,要求学习其中的行为。

命名实体识别中,给定一个句子,要求识别句中的人名。

在这里插入图片描述

这些所有问题都能使用标签数据 ( X , Y ) (X,Y) (X,Y) 作为训练集的监督学习。上面的问题包含许多类型的序列模型,有些输入和输出数据的类型各有不同,长度也会不一样。

数学符号

命名实体识别问题常用语搜索引擎,例如检索过去 24h 内新闻报道的所有人名,可以查找不同类型文本中的人名、时间、地点等。输入序列 x x x,想让序列模型输出 y y y,表示输入的单词是否是人名的一部分。当然这不是最好的输出形式,不仅能记录是否是人名,还能告诉我们人名在句子中的位置。

在这里插入图片描述

输入数据是 9 个单词组成的序列,因此我们最终会有 9 个特征集合表示这 9 个单词,并按序列中的位置进行索引,使用 x < 1 > , … , x < t > , … x < 9 > x^{<1>},…,x^{<t>},…x^{<9>} x<1>,,x<t>,x<9> 表示输入特征集, t t t 为时间序列,但此处无论是否为时间序列都使用 t t t。同样输出用 y < 1 > , … , y < t > , … y < 9 > y^{<1>},…,y^{<t>},…y^{<9>} y<1>,,y<t>,y<9> 表示。用 T x , T y T_x,T_y Tx,Ty 分别表示输入和输出序列长度,这里 T x = T y = 9 T_x=T_y=9 Tx=Ty=9

与以前的文章相同, x ( i ) < t > x^{(i)<t>} x(i)<t> 表示第 i i i 个输入样本的第 t t t 个元素, T x ( i ) T_x^{(i)} Tx(i) 为第 i i i 个训练样本的输出序列长度, y ( i ) y^{(i)} y(i) T y ( i ) T_y^{(i)} Ty(i) 同理。

在 NLP(自然语言处理)中,我们需要知道如何表示句子里的单词。首先要做一张单词表(词典),将可能用到的单词列成一列

在这里插入图片描述

通常在实际运用中使用的词典大小远大于 10000。构造词典的一种方法是遍历训练集或网络词典,找到前 10000 个常用词。然后用 one-hot 表示法表示词典中的每一个单词:

在这里插入图片描述

之所以称为 one-hot,是因为每个向量只有一个值是 1,其余全为 0。用序列模型在输入 X X X 和目标输出 Y Y Y 之间学习建立一个映射。这是一个监督学习的问题。

如果遇到了不在词典中的单词,需要创建一个新的标记,即叫做 Unknown Word 的伪造单词。用下标 UNK 表示不在单词表中的单词。后面会详细讲解。

RNN 模型

首先我们考虑使用标准的神经网络学习从输入 X X X 到输出 Y Y Y 的映射。将 9 个 one-hot 向量输入到标准神经网络中,经过隐藏层,最终输出 9 个值为 0 或 1 的项,表明输入单词是否为人名的一部分。但这种方法有很大的问题:

  • 输入和输出数据长度是不定的,即不一定有 T x = T y T_x=T_y Tx=Ty,即使将数据填充到最大长度,仍然不是一种很好的表达方式
  • 标准的神经网络不共享从文本不同位置上学到的特征。如果神经网络已经学习到了位置 1 出现的 Harry 可能是人名的一部分,但如果 Harry 出现在其它地方 x < t > x^{<t>} x<t>,则无法自动识别为人名的一部分。类似于卷积神经网络中,希望将部分图片里学到的内容快速推广到图像的其他部分
  • 模型参数过多。与卷积神经网络类似,用一个更好的表达方式可以减少模型中的参数。

我们从左到右读句子中的单词,首先将 x < 1 > x^{<1>} x<1> 输入到神经网络中,预测输出 y ^ < 1 > \hat{y}^{<1>} y^<1>。当读到句中的第 2 个单词 x < 2 > x^{<2>} x<2> 时,除了 x < 2 > x^{<2>} x<2>,神经网络还会输入一些来自时间步 1 的信息,即时间步 1 的激活值会传递到时间步 2。一直到最后一个时间步,输入 x < T x > x^{<T_x>} x<Tx> 输出 y < T y > y^{<T_y>} y<Ty>,此处 T x = T y T_x=T_y Tx=Ty。如果不相同,模型结构需要做出改变。

在这里插入图片描述

每个时间步传递一个激活值到下一个时间步中。在计算时,需要编造一个初始(伪)激活值 a < 0 > a^{<0>} a<0>,通常为零向量,有时也随机用其它方法初始化。

循环神经网络还可以表示为下面的样子,在每个时间步中,输入 x x x 输出 y y y,圆圈表示输回网络层,黑色方块表示延迟一个时间步。其展开后就是上图中的样子。

在这里插入图片描述

循环神经网络从左到右读输入数据,同时每个时间步的参数共享, W a x W_{ax} Wax 表示从 x < 1 > x^{<1>} x<1> 到隐藏层的连接的一系列参数,激活值(水平联系)由参数 W a a W_{aa} Waa 决定,输出结果由 W y a W_{ya} Wya 决定,每个时间步使用相同的参数。

在这里插入图片描述

对于预测 y ^ < 3 > \hat{y}^{<3>} y^<3>,不仅要使用 x < 3 > x^{<3>} x<3>,还要使用来自 x < 1 > , x < 2 > x^{<1>},x^{<2>} x<1>,x<2> 的信息。 x < 1 > x^{<1>} x<1> 可以通过红色的路径影响 y ^ < 3 > \hat{y}^{<3>} y^<3>
在这里插入图片描述

循环神经网络的一个缺点就是只能使用之前的信息做预测。对于下面两个句子,模型无法正确判断 Teddy 是否为人名:

在这里插入图片描述

双向循环神经网络(BRNN)可以处理这个问题,RNN 足够我们解释关键概念,之后只需要在此基础稍作修改就能使用前面和后面的信息进行预测了。

下面给出 RNN 的前向传播公式。
a < 0 > = 0 ⃗ a^{<0>}=\vec{0} a<0>=0

a < 1 > = g ( W a a a < 0 > + W a x x < 1 > + b a ) a^{<1>}=g(W_{aa}a^{<0>}+W_{ax}x^{<1>}+b_a) a<1>=g(Waaa<0>+Waxx<1>+ba)

y ^ < 1 > = g ( W y a a < 1 > + b y ) \hat{y}^{<1>}=g(W_{ya}a^{<1>}+b_y) y^<1>=g(Wyaa<1>+by)

这里 2 个函数 g g g 不一定相同。 W a x W_{ax} W

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值