zoukankan      html  css  js  c++  java
  • Transform模型

    Transform是在神经网络之后又发展的一个比较流行的深度模型,今天就给大家解释一下这个模型的原理。首先先抛出一个问题?神经网络有哪些缺点,或者是LSTM有什么不足之处,以至于让我们又发展了Transform这个深度模型?在这里我自己总结出了几点:

       

    1、 难解释性,神经网络的一个通病,做出来的好坏都比较难解释,

       

    2、 梯度消失和梯度爆炸的问题。

       

    3、 LSTM只能串行计算,不能并行,因为它是一个时序类的模型。

       

    4、 对于翻译这类生成模型计算起来比较复杂,耗时比较长而且效果也不是很好。

       

    5、 由于梯度消失而导致的忽略了部分的特征提取。

       

    等等还有其他原因导致我们在一些任务上处理的不是很好,但是神经网络还在发展阶段,我很看好它们后续的发展。

       

    其实对于nlp常用的LSTM和GRU来说最大的问题还是在于梯度消失和不能并行计算,因此后来的科学家发展了另外一种特征提取的方式或者模型叫做Self-Attention,这也是transform最核心的部分,所以想要了解transform先要了解self-Attention的原理

       

       

    self-Attention

       

    self-attention的原理很简单,就是计算每个词与所有词之间的"关系",举个例子:比如有这样的一句话:"今天天气很好天空特别蓝"分完词后:"今天""天气""很好""天空""特别蓝",他们对应的词向量是V(今天)V(天气)V(很好)V(天空)V(特别蓝)self-attention处理过程如图:

       

    由self-attention计算出"今天"与所有单词之间的关系(包括自己),比如与天气的关系是0.3、与很好的关系是0.2等等,然后利用关系加权求和形成新的词向量Z(今天)。这就是self-attention的计算流程。此时的Z(今天)包含了所有单词的信息,也就是上下文信息,如果我们对句子中的每个单词都进行这样的操作,更新每个单词的向量,这样所有词向量就都包含了上下文信息,

       

       

    这样做的好处是什么呢?

       

    1、 解决了梯度消失的问题,因为我们是计算了两两单词之间的关系,对于每个单词是公平的,所以没有忽略部分特征的提取

    2、 解决了LSTM的不能并行计算的问题,计算单词时并没有依赖的条件,所以完全可以同时计算,也就是并行计算。

    3、 比神经网络更具有可解释性

       

       

    self-attention核心计算

    下图就是单词"Thinking"计算与单词"Machines"在self-attention中关系计算的流程图。

       

    1, X1表示"Thinking"的词向量,X2表示"Machines"的词向量也就是模型的输入,需要先做embedding

    2, 在X下面有三个向量"q","k","v",他们的计算方式如图:

       

      

       

    3, 计算出了向量"q","k","v",下面计算"Thinking"与其它词之间的关系,这里使用"q""k"来计算,q1k1表示"Thinking"与"Thinking"之间的关系,q1*k2表示"Thinking"与"Machines"之间的关系结果为score。

       

    4,然后我们进行尺度缩放:由于这样计算出来的差异性可能比较大,因此将score除以dk,dk表示的是维度,64也就是8这里就是将sore除8

       

    5,将所有score使用softmax进行分类,得出最终的关系概率比如这里"Thinking"与自己的关系是0.88与"Machines"的关系是0.12

       

    6,最后将0.88V1+0.12V2得出计算后"Thinking"的词向量

       

       

       

       

       

    transform

    Transform类似seq2seq模型。分为编码(Encode)解码(Decoder)两个模块,如下图,将句子输入到Encoder模型中不断计算,直到计算到最后一层,再映射到Decoder模型中进行解码最后输出结果

       

    再看一下Encoder模块和Decoder模块是什么样子的如下图,Encoder模块是由一个self-attention和一个Feed Forward组成的也就是说:

    1、 句子输入到Encoder中使用Self-Attention进行运算

       

    2、 然后使用一个Feed Forward进行非线性的转化,得出每个单词的对应的词向量

       

    3、 将输入再转入到下一个Encoder中进行计算,以此类推直,到最后一层Encoder,

       

    4、 Encoder中将最后一层的输出映射到在Decoder中解码。

       

    5、 Encoder和Decoder中的计算核心就是Self-Attention,只是Decoder中多了一个Encoder-Decoder Attention。其实计算原理和Self-Attention是一样的,只是在Encoder-Decoder Attention中V的值是来自最后一层的Encoder

    这样Transform的工作流程为下图,先在Encoder中计算然后将最后一层的输出映射到在Decoder中解码,用到的核心技术就是Self-Attention

  • 相关阅读:
    整理公共基础库子系统和系统属性组件
    鸿蒙轻内核M核源码分析系列六 任务及任务调度(1)任务栈
    HarmonyOS三方件开发指南(19)-BGABadgeView徽章组件
    鸿蒙的DFX子系统
    安卓to鸿蒙系列:ButterKnife(一)
    基于Neptune开发板的键盘蓝牙模块DIY指南
    徒手撸一个Spring Boot中的starter
    这三道最基础的java面试题,你真的答得上来吗?
    奇葩java迭代器面试题,还真有很多人踩坑
    15道类和对象面试题,快看看自己会几道
  • 原文地址:https://www.cnblogs.com/MaggieForest/p/13070323.html
Copyright © 2011-2022 走看看