深度学习-循环神经网络(RNN)、Seq2Seq、注意力机制(Attention)

使用前馈神经网络时,对于一个输入得到一个输出,但是这没办法处理一个序列数据输入的情况,例如语音的输入。这时就出现了这样一种模型-循环神经网络,专门用于处理序列数据的神经网络。

一.循环神经网络(RNN)

1.网络结构

基础仍然是一个前馈神经网络,重点在于随着序列的输入,这个网络在重复地被使用,所以称为循环神经网络。所以一般我们见到的RNN的结构图都是将一个普通网络随着序列输入展开,或者说沿着时间轴展开的。
截图来自https://www.bilibili.com/video/BV1z5411f7Bm?spm_id_from=333.337
将(结构图+时间轴)抽象为简单循环计算图,RNN的重点就是,此刻网络的计算是和前一刻网络的计算相联系的
截图来自https://www.bilibili.com/video/BV1z5411f7Bm?spm_id_from=333.337

2.普通RNN的前向计算

按这张计算图理解前向计算x是输入,o是输出,h是隐藏层计算出的特征。输入层x到隐藏层h的参数权重矩阵是U,隐藏层h到输出层o的权重是V。前一时刻隐藏层   h t − 1 \ h_{t-1}  ht1到后一时刻隐藏层   h t \ h_t  ht的参数权重是W。

t时刻输入 x t x_t xtt-1时刻的隐藏层提取的特征是   h t − 1 \ h_{t-1}  ht1
  a t = b + W h t − 1 + U x t \ a_t = b + Wh_{t-1} +Ux_t  at=b+Wht1+Uxt隐藏层的权重和偏执的线性变换
  h t = t a n h ( a t ) \ h_t = tanh(a_t)  ht=tanh(at)隐藏层的激活函数
  o t = c + V h t \ o_t = c + Vh_t  ot=c+Vht输出根据需要选择全连接层或者其他

图中从输入到输出只有一层隐藏层,只不过这个隐藏层被重复使用,并且留下特征给下一刻使用。

3.用伪代码描述

import numpy as np
class RNN:
    def __init__(self):
        self.W = np.random.random()
        self.U = np.random.random()
        self.b = np.random.random()

    def forward(self, x,h):
        if(x == "结束"):
            return h
        else:
            a = np.dot(self.W, h) + np.dot(self.U, x) + self.b
            h = np.tanh(a)
            x = get_data()
            return self.forward(x,h)

h_0 = np.zeros()
x_1 = get_data()
rnn = RNN()
h = rnn.forward(x_1,h_0)
#这个伪代码中只是描述了前向循环计算了中间层h的结果,省略了输出层o的描述

二.Seq2Seq

理解注意力机制之前,先了解一个循环网络的变种,序列到序列架构(Seq2Seq)。这个模型是一个RNN的变种,从一个序列生成另外一个序列,但是输出序列长度不确定。

1.网络结构

Seq2Seq由两个RNN组成,前一个叫编码器,后一个叫解码器。图中的C代表context,意思是上下文。编码器把所有的输入序列都编码成一个固定长度的上下文,然后再由解码器解码。
在这里插入图片描述

2.解码器工作流程

从普通RNN的角度理解编码器很好理解了,那么解码器是如何工作的呢?
解码这个过程的任务是负责根据上下文C生成指定的序列,方式不固定。

(1)上面的结构图中表示的,语义向量C参与了序列所有时刻的运算,上一时刻的输出转而作为当前时刻的输入,但语义向量C会参与所有时刻的运算。

(2)如果想用最简单的方式,那就是将C作为初始状态输入到解码器的RNN中。
截图来自https://www.bilibili.com/video/BV1xS4y1k7tn/?spm_id_from=333.788

三.NLP中的注意力机制(Attention)

Seq2Seq有局限性:(1)上下文向量C的长度是固定的,如果原始序列的信息太多,它的长度就成了限制模型性能的瓶颈。(2)上下文只来自编码器的最后一次隐藏层输出,解码的时候,不同时刻使用的上下文信息是同样的,输出序列与输入序列在不同时刻的对应关系不能很好的捕获。就像是只能交替传译而不能同声传译。

1.网络结构

为了能实现同声传译,有学者研究建议,将C向量变为一个长度可变的序列,将输出序列的每一个元素关联匹配不同的上下文C,这一机制称为注意力机制
截图来自https://www.bilibili.com/video/BV1xS4y1k7tn/?spm_id_from=333.788

2.前向传播中的注意力矩阵

编码器的不同时刻隐藏层,到上下文这一层,可以看作一层全连接,注意力大小,就是权重,注意力矩阵是我们要训练的东西。
在这里插入图片描述

3.总结

核心思想:在序列到序列的这种结构中,输出序列的每一部分对输入序列的上下文Context的理解和关注点应该是不同的。
1.相比普通RNN ,参数更少。
2.Attention的计算可以并行处理,速度更快。
3.长序列最开始的信息没有被弱化,效果更好。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
seq2seq-attention是指在seq2seq模型中引入了注意力机制Attention)。在传统的seq2seq模型中,编码器将输入序列转化为一个固定长度的向量,然后解码器将这个向量解码成输出序列。而在seq2seq-attention模型中,解码器在每个时间步都会根据输入序列的不同部分给予不同的注意力权重,从而更加关注与当前时间步相关的输入信息。这样可以提高模型对输入序列的理解能力,进而提升预测的准确性。引入注意力机制后,seq2seq-attention模型在翻译、文本摘要和问答等任务上有着更好的表现。\[1\]\[2\] #### 引用[.reference_title] - *1* [NLP自然语言处理之RNN--LSTM--GRU--seq2seq--attention--self attetion](https://blog.csdn.net/weixin_41097516/article/details/103174768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [自注意力机制(Self-Attention):从Seq2Seq模型到一般RNN模型](https://blog.csdn.net/qq_24178985/article/details/118683144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值