场景文本检测&识别学习 day05(Transformer论文精读)

发布于:2024-04-20 ⋅ 阅读:(20) ⋅ 点赞:(0)

Transformer论文精读

  • Transformer是第一个仅仅使用注意力机制来做序列转录的模型,它将所有的循环层都替换为了Multi-Head Self-Attention。
  • Multi-Head Self-Attention是为了模拟CNN中卷积核的多输出通道的效果,即每个卷积核的输出(卷积核的每个输出通道)都可以识别不一样的模式
  • 简要流程:
    1. 对于一个序列输入( x 1 x_1 x1,…, x n x_n xn),其中 x n x_n xn表示序列句子中的第n个词,这个序列经过编码器层得到Z = ( z 1 z_1 z1,…, z n z_n zn),其中 z n z_n zn表示序列句子中的第n个词的向量表示,即编码器层将输入变成机器可以理解的向量形式
    2. 解码器层就会拿到Z,最后生成一个序列( y 1 y_1 y1,…, y m y_m ym),这里的n和m可以不一样
  • 注意:在编码器层,模型可以一次看完整个输入,但是在解码器层,模型只能一个一个的输出,由于这里采用的自回归输出(输出又是输入,过去时刻的输出作为当前时刻的输入)
    在这里插入图片描述
  • Transformer的详细流程:
    1. 先将输入语句经过 input embedding 变成机器可以理解的向量形式,通常是使用已经训练好的生成词向量的模型来进行,但是这个词向量只能代表单个词,缺乏整体的语义特征和语法特征,也缺乏位置信息,因此这些词向量还不能完成更复杂的任务,机器翻译、文本生成等
  • 注意:在解码器层、编码器层的每一个子层中,都使用了残差连接,由于残差连接需要保持输入和输出的维度一致,如果不一致需要做投影,为了简化,Transformer将维度都设为512

batch normalization 和 layer normalization

在这里插入图片描述

  • batch normalization:通常使用在等长输出的应用里

  • 具体操作为:当输入数据为二维的,对于一个batch_size的数据,每一次把每一列的数据(每一个特征)均值变成0,方差变成1,即每个数据点都从原始数据值中减去均值,然后除以方差

  • 注意:在batch normalization中,训练时,均值和方差是对于一个batch_size中的该列(该特征)的所有数据来说。在预测时,是将所有训练集数据的该列(该特征)的均值和方差存起来,作为预测的均值和方差
    在这里插入图片描述

  • 注意:由于我们需要算一个batch_size的每一列的数据(每一个特征),而当我们一个batch_size的数据不等长,即有些样本没有某些特征,我们需要进行补0,
    在这里插入图片描述

  • layer normalization:通常使用在变长输出的应用里

  • 具体操作为:当输入数据为二维的,对于一个batch_size的数据,每一次把每一行的数据(每一个样本)均值变成0,方差变成1,即每个数据点都从原始数据值中减去均值,然后除以方差
    在这里插入图片描述

  • 注意:在batch normalization中,训练时,均值和方差是对于一个batch_size中的该行(该样本)的所有数据来说。在预测的时候,不需要再存训练数据集的数据了,直接算预测的样本的均值和方差即可

  • batch normalization:当输入数据为三维的,如下图:

  • 仍然是按列切,即我们需要该batch_size上所有样本的某个特征数据
    在这里插入图片描述

  • layer normalization:当输入数据为三维的,如下图:

  • 按行切,即我们需要该batch_size上某个样本的所有特征数据
    在这里插入图片描述

  • 综上:对于batch normalization,如果样本长度变化比较大的时候,那么batch_size间,计算得到的均值和方差会抖动很大,同时如果预测的是全新的样本且长度很大,那么之前保存的全部训练数据集的均值和方差不是很好用。

  • 对于layer normalization,由于我是对每个样本来算均值和方差,所以不需要存全局的均值和方差,同时由于只在自己样本内部进行计算,所以相对稳定一些

RNN

  • 在传统的RNN中,我们给一个序列,RNN会将序列从左往右一步一步地计算,如果给一个句子,那么RNN会一个词一个词地计算
  • RNN处理时序信息的过程:在计算第t个词时候,RNN会计算一个 h t h_t ht作为输出,叫做第t个词的隐藏状态(当前词之前的历史信息)。而 h t h_t ht是由 h t − 1 h_{t-1} ht1和当前第t个词本身决定的,即根据前一个词的历史信息 h t − 1 h_{t-1} ht1和当前词t进行计算,得到当前词的历史信息 h t h_t ht
  • 综上:RNN通过将之前的历史信息全部放在隐藏状态里,然后一步一步的传下去,得到最后的输出 h t h_t ht
  • 缺点:
    1. 由于是一步一步的计算,所以无法做并行,即当我们计算第t个词的时候,必须保证前t-1个词都计算完成,得到 h t − 1 h_{t-1} ht1后才可以
    2. 由于是一步一步的计算,所以如果当时序比较长,那么很早期的时序信息会在后面被丢掉,如果不想丢掉就需要一个很大的隐藏状态,但是这样的话,每一步都需要存一个很大的 h t h_t ht,这很占内存空间