RNN结构,双向LSTM,Transformer, BERT对比分析

RNN

RNN 按照时间步展开

Bi-RNN

向前和向后的隐含层之间没有信息流。

LSTM

长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失问题。

LSTM 对内部结构进行精心的设计,加入了输入门,遗忘门,输出门,和一个内部记忆单元\(c_t\)。输入门控制当前计算新状态以多大程度更新到记忆单元;遗忘门控制前一步记忆单元中的信息有多大程度被遗忘;输出门控制当前输出有多大程度上取决于当前的记忆单元。

和普通RNN相比,主要的输入输出区别如下

相比RNN只有一个传递状态\(h^t\),LSTM有两个传输状态,\(c^t\) (cell state)和 \(h^t\)(hidden state)。

计算公式

\[ f_t = \sigma(W_f*[x_t,h_{t-1}]+b_f) \\
i_t = \sigma(W_i*[x_t, h_{t-1}]+b_i) \\
o_t = \sigma(W_o*[x_t, h_{t-1}]+b_o) \\
\tilde{C_t} = tanh(W_c*[h_t-1,x_t]+b_c) \\
C_t = f_t\odot C_{t-1}+i_t\odot \tilde{C_t} \\
h_t = o_t\odot tanh(C_t)
\]

参数量计算

\((hidden size * (hidden size + x_dim ) + hidden size) *4\)

self-attention

李宏毅self-attention笔记

核心思想:用文本中的其他词来增强目标词的语义表示,从而更好地利用上下文信息。

计算步骤:

- 相似度计算

- softmax

- 加权平均



问题:常规的attention中,一般k=v, 那么self-attention中可以这样吗。

bert

推荐看原文哦: 超细节的BERT/Transformer知识点

史上最细节的自然语言处理NLP/Transformer/BERT/Attention面试问题与答案

上一个链接里问题的答案

论文

源码

问题

问题:为什么选择使用[cls]的输出代表整句话的语义表示?

或者说为什么不选择token1的输出

BERT在第一句前会加一个[CLS]标志,最后一层该位对应向量可以作为整句话的语义表示,从而用于下游的分类任务等。

为什么选它呢,

  • 因为与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。
  • 从上面self-attention图片中可以看出把cls位置当做q,类似于站在全局的角度去观察整个句子文本。

问题:为什么是双线性点积模型(经过线性变换Q != K)?

  • 双线性点积模型,引入非对称性,更具健壮性(Attention mask对角元素值不一定是最大的,也就是说当前位置对自身的注意力得分不一定最高)

展开解释:

  • self-attention中,sequence中的每个词都会和sequence中的每个词做点积去计算相似度,也包括这个词本身。
  • 对于 self-attention,一般会说它的 q=k=v,这里的相等实际上是指它们来自同一个基础向量,而在实际计算时,它们是不一样的,因为这三者都是乘了QKV参数矩阵的。那如果不乘,每个词对应的q,k,v就是完全一样的。
  • 在相同量级的情况下,\(q_i\) 与 \(k_i\) 点积的值会是最大的(可以从“两数和相同的情况下,两数相等对应的积最大”类比过来)。
  • 那在softmax后的加权平均中,该词本身所占的比重将会是最大的,使得其他词的比重很少,无法有效利用上下文信息来增强当前词的语义表示。
  • 而乘以QKV参数矩阵,会使得每个词的q,k,v都不一样,能很大程度上减轻上述的影响。

问题:self-attention的时间复杂度

  • 时间复杂复杂度为:\(O(n^2d)\)

    • 相似度计算可以看成矩阵(n×d)×(d×n),这一步的时间复杂度为O(n×d×n)
    • softmax的时间复杂度O(n^2)
    • 加权平均可以看成矩阵(n×n)×(n×d), 时间复杂度为O(n×n×d)

多头注意力机制的时间复杂度:

  • hidden_size (d) = num_attention_heads (m) * attention_head_size (a),也即 d=m*a
  • 并将 num_attention_heads 维度transpose到前面,使得Q和K的维度都是(m,n,a),这里不考虑batch维度。
  • 这样点积可以看作大小为(m,n,a)和(m,a,n)的两个张量相乘,得到一个(m,n,n)的矩阵,其实就相当于(n,a)和(a,n)的两个矩阵相乘,做了m次,时间复杂度是\(O(n^2×a×m) = O(n^2d)\)

问题:BERT 怎么处理长文本?

问题:BERT 比ELMO 效果好的原因

从网络结构以及最后的实验效果来看,BERT 比 ELMo 效果好主要集中在以下几点原因:

  • LSTM 抽取特征的能力远弱于 Transformer
  • 拼接方式双向融合的特征融合能力偏弱(没有具体实验验证,只是推测)
  • 其实还有一点,BERT 的训练数据以及模型参数均多余 ELMo,这也是比较重要的一点

知乎:transformer中multi-head attention中每个head为什么要进行降维?

link

简洁的说:在不增加时间复杂度的情况下,同时,借鉴CNN多核的思想,在更低的维度,在多个独立的特征空间,更容易学习到更丰富的特征信息。

问题:BERT中的mask

  1. 预训练的时候在句子编码的时候将部分词mask,这个主要作用是用被mask词前后的词来去猜测mask掉的词是什么,因为是人为mask掉的,所以计算机是知道mask词的正确值,所以也可以判断模型猜的词是否准确。
  2. Transformer模型的decoder层存在mask,这个mask的作用是在翻译预测的时候,如“我爱你”,翻译成“I love you”,模型在预测love的时候是不知道you的信息,所以需r要把后面“you”的信息mask掉。但是bert只有encoder层,所以这个算是transformer模型的特征。
  3. 每个attention模块都有一个可选择的mask操作,这个主要是输入的句子可能存在填0的操作,attention模块不需要把填0的无意义的信息算进来,所以使用mask操作。

问题:bert中进行ner为什么没有使用crf;使用DL进行序列标注问题的时候CRF是必备嘛(todo: in action)

link

  1. 进行序列标注时CRF是必须的吗?

    如果你已经将问题本身确定为序列标注了,并且正确的标注结果是唯一的,那么用CRF理论上是有正的收益的,但如果主体是BERT等预训练模型,那么可能要调一下CRF层的学习率,参考CRF层的学习率可能不够大

  2. 进行NER时必须转为序列标注吗?

    就原始问题而言,不论是NER、词性标注还是阅读理解等,都不一定要转化为序列标注问题,既然不转化为序列标注问题,自然也就用不着CRF了。不转化为序列标注的做法也有很多,比如笔者提的GlobalPointer

问题:BERT的初始标准差为什么是0.02?

Retrieved from https://kexue.fm/archives/8747

cnn vs rnn vs self-attention

原文

语义特征提取能力

  • 目前实验支持如下结论:Transformer在这方便的能力非常显著超过RNN和CNN,RNN和CNN两者能力差不多。

    长距离特征捕捉能力

    实验支持如下结论:

    • 原生CNN特征抽取器在这方面显著弱于RNN和Transformer
    • Transformer微弱优于RNN模型(距离小于13的时)
    • 在比较远的距离上RNN微弱优于Transformer

任务综合特征抽取能力(机器翻译)

Transformer > 原生CNN == 原生RNN

并行计算能力及运行效率

Transformer和CNN差不多,都强于RNN

RNN,LSTM,BERT的更多相关文章

  1. 从rnn到lstm,再到seq2seq(一)

    rnn的的公式很简单: 对于每个时刻,输入上一个时刻的隐层s和这个时刻的文本x,然后输出这个时刻的隐层s.对于输出的隐层s 做个ws+b就是这个时刻的输出y. tf.scan(fn, elems, i ...

  2. pytorch --Rnn语言模型(LSTM,BiLSTM) -- 《Recurrent neural network based language model》

    论文通过实现RNN来完成了文本分类. 论文地址:88888888 模型结构图: 原理自行参考论文,code and comment: # -*- coding: utf-8 -*- # @time : ...

  3. RNN,LSTM,GRU简单图解:

    一篇经典的讲解RNN的,大部分网络图都来源于此:http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 每一层每一时刻的输入输出:https ...

  4. 从rnn到lstm,再到seq2seq(二)

    从图上可以看出来,decode的过程其实都是从encode的最后一个隐层开始的,如果encode输入过长的话,会丢失很多信息,所以设计了attation机制. attation机制的decode的过程 ...

  5. RNN,LSTM中如何使用TimeDistributed包装层,代码示例

    本文介绍了LSTM网络中的TimeDistributed包装层,代码演示了具有TimeDistributed层的LSTM网络配置方法. 演示了一对一,多对一,多对多,三种不同的预测方法如何配置. 在对 ...

  6. tensorflow 笔记8:RNN、Lstm源码,训练代码输入输出,维度分析

    tensorflow 官网信息:https://www.tensorflow.org/api_docs/python/tf/contrib/rnn/BasicLSTMCell tensorflow 版 ...

  7. 深度学习--RNN,LSTM

    一.RNN 1.定义 递归神经网络(RNN)是两种人工神经网络的总称.一种是时间递归神经网络(recurrent neural network),另一种是结构递归神经网络(recursive neur ...

  8. 太深了,梯度传不下去,于是有了highway。 干脆连highway的参数都不要,直接变残差,于是有了ResNet。 强行稳定参数的均值和方差,于是有了BatchNorm。RNN梯度不稳定,于是加几个通路和门控,于是有了LSTM。 LSTM简化一下,有了GRU。

    请简述神经网络的发展史sigmoid会饱和,造成梯度消失.于是有了ReLU.ReLU负半轴是死区,造成梯度变0.于是有了LeakyReLU,PReLU.强调梯度和权值分布的稳定性,由此有了ELU,以及 ...

  9. RNN,LSTM

    RNN: Vanilla Neural Network :对单一固定的输入给出单一固定输出 Recurrent Neural Network:对单一固定的输入给出一系列输出(如:可边长序列),例:图片 ...

  10. RNN,GRU,LSTM

    2019-08-29 17:17:15 问题描述:比较RNN,GRU,LSTM. 问题求解: 循环神经网络 RNN 传统的RNN是维护了一个隐变量 ht 用来保存序列信息,ht 基于 xt 和 ht- ...

随机推荐

  1. Ubuntu docker安装、验证、卸载

    卸载Docker CE 卸载Docker CE软件包: sudo apt-get purge docker-ce 主机上的图像,容器,卷或自定义配置文件不会自动删除.要删除所有图像,容器和卷: sud ...

  2. iOS开发 调试技巧

    1.普通断点 2.条件断点 3.全局断点 4.analyze 分析器 5.leaks 检查器 6.僵尸对象 7.lldb 命令 8.instruments 9.xcode视图调试

  3. 查看git的用户名和密码

    转载自:https://www.cnblogs.com/xihailong/p/13354628.html 一.查看查看用户名 :git config user.name查看密码: git confi ...

  4. task 子线程添加数据到主线程 winfrom

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 记一次 turbostat 的使用

    场景:为了测试海光cpu的性能,从而使用turbostat 来监测cpu工作时候的相关频率. cpu 型号: 1.Hygon C86 7165 24-core Processor 1.9GHz 384 ...

  6. linux系统下命令行方式创建KVM虚拟机

      一:安装虚拟机 1:设备重启进入BIOS打开SMMU,F10保存退出. 2:进入系统安装相关组件 virt-install qemu-kvm qemu-img virt-manager libvi ...

  7. js 防抖

    // 防抖 作用:防止重复触发事件 var count = 1; var container = document.getElementById('container'); function getU ...

  8. [iOS] iPhone,开发工具的一些杂项

    1.在safari的开发菜单里一直不显示我当前的iPhone,后来机缘巧合在 设置- 开发者 - Clear Trusted Computers ,重新信任电脑之后,就OK了(️)

  9. 小白之Python-基础中的基础03

    序列,目前看来很基础,东西比较多,难度开始加大...加油吧,骚年 Python之序列 1.数据结构:序列.容器(序列:索引.映射:键).集合2.列表.元组.字符串.Unicode字符串.buffer对 ...

  10. K8s validating data: the server could not find the requested resource ... with --validate=false

    转载: https://blog.csdn.net/yangchao1125/article/details/106193107/