• 【自然语言处理】: transformer原理实现


    1.seq2seq

    一般在我们序列模型当中,都会分为encoder和decoder两个部分,如下图所示:

     而我们的transformer变形金刚其实相当于是一种对我们seq2seq的一种升级版本,也就是在seq2seq上加上了self-attention,也就变成了我们的transformer,我们可以看到transformer的结构如下所示:

    在上面这张图当中,左边的就是我们的的encoder,而右边则是我们的decoder。只是这个encoder和decoder都特别的大哈哈哈

    2.Encoder的架构

    encoder的架构总体来说是这样的,我们输入一排向量,然后相应的,会输出一排向量。而在我们的输入和输出之间,输入最先经过的层是一个self-attention层。

     对于上图当中的第一个蓝色向量而言,首先会经过self-attention层,得到一个向量a,然后这个向量a再和之前原来初始的向量,我们成称为向量b,进行相加。得到新的向量a+b,十分类似于残差神经网络当中的一个short-cut,也就是进行一个skip connection,进行一个跳级连接。之后再进行一个layer normilization。

    而这个layer normalization是什么意思呢?

    也就是将我们这个layer当中所有的数值做一个正太化的处理,也就是使用公式(x-mean)/standard deviation ,就可以得到一个新的数值了。这样所有的数值也会投射到0-1的一个范围内。

    做了这样的处理之后,我们看这张图的最右边,我们拿到这个normalize之后的向量c,经过一个全连接神经网络得到d,d和原来的c又进行shortcut,也就是一个risidual的连接。连接之后,再经过一个layer normilization层,这样就得到最后我们transformer encoder的一个对某一个向量的输出。

    2.Decoder

    如果我们把下面这张图,也就是decoder的中间,将其遮住,那么我们就可以发现其实encoder和decoder的结构几乎是一样的,如下所示:

     我们除了在最下方的一个attenton机制,这里加入的是masked multi head attention,而非普通的multi-head attention.

    masked attention和我们普通self attention不同的地方也就是后面一个向量的输出只会考虑到前面向量的输入,而不会考虑到后面的的输入。这个其实是和RNN的道理是相似的,也很有道理。因为我们的self-attention是考虑到的整个input的输入。

    然后我们的encoder是如何和decoder进行连接的呢?我们的encoder的资讯最后是传递到了decoder的中间的multihead attention进行了一个这样的连接。同时,decoder中间的multihead

     attention和自己的输入,从masked multi head attention也进行了一个连接。因此我们的decoder中间层拥有了encoder传递过来的两个信息,以及masked multi head attention传递过来的一个信息,最终进行我们的训练。局部的流程图如下图所示:

     整体的流程图如下所示:

     这就是tranformer的原理啦,希望大家看了之后有所收获!如有不足,也请大家多多指正!

  • 相关阅读:
    iOS:真机调试
    iOS:MBProgressHUD的基本使用
    CocoaPods安装小步骤
    PictureBox 双缓冲防止闪屏
    两招小办法对付宝宝发烧、咳嗽。超级管用哈
    (转)经纬度坐标转换为屏幕坐标
    解决eclipse不识别Android手机的问题
    利用FFmpeg将RTSP转码成RTMP发布在RED5
    vlc做转发的命令
    字符编码
  • 原文地址:https://www.cnblogs.com/geeksongs/p/15531230.html
Copyright © 2020-2023  润新知