迁移学习与Transformer架构

2023-05-16

迁移学习

迁移学习干什么的?

迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务。

Eg:学习识别苹果可能有助于识别梨,学习骑自行车可能有助于学习骑摩托车,学习打羽毛球可能有助于学习打网球。

找到目标问题的相似性,迁移学习任务就是从相似性出发,将旧领域学习过的模型应用在新领域上,可以实现一个举一反三的效果。

为什么需要迁移学习?优势所在?

1.大数据与少标注的矛盾

在实际训练过程中,虽然有大量的数据可供使用,但往往都是没有标注的,人工进行数据标定过于耗时耗力,因此通过迁移学习,寻找与目标数据相近的有标注的数据,利用这些数据来进行建模,增加目标数据的标注。

2.大数据与弱计算的矛盾

普通人买不起3090,因此需要借助迁移学习,将Google这种大公司在大数据上训练好的模型,迁移到自己的学习任务中,之后针对任务进行微调,相当于自己也能在大数据上训练模型。将这些模型针对任务进行自适应更新,还可以取得更好的效果。

3.普适化模型与个性化需求的矛盾

退一万步将,就算是一个在学习任务中,一个模型也往往难以满足每个人的需求,比如特定的隐私设置,这就需要在不同人之间做模型的适配。通过自适应的学习,考虑到不同用户之间的相似性和差异性,对普适化模型进行灵活的调整。

4.特定应用的需求

为了满足特定领域应用的需求,可以从数据和模型上进行迁移学习。

 

迁移学习目前的应用

计算机视觉、文本分类、行为识别、自然语言处理、室内定位、视频监控、舆情分析、人机交互等。

如:

不同视角、背景、光照的图像识别

不同语言之间的翻译,德语翻译英语,英语翻译法语

不同领域和背景的文本翻译、舆情分析

不同用户、设备、位置的行为识别

不同用户、接口、情境的人机交互

不同场景、设备、时间的室内定位

 

Transformer模型

Transformer干什么的?

Transformer目前主要应用于NLP领域中,它是17年Google团队在论文《Attentionisallyourneed》中提出的。

读完这篇论文,总结了Transformer的三个主要亮点:

1.不同于以往主流机器翻译使用基于RNN的seq2seq模型框架,该论文用attention机制代替了RNN搭建了整个模型框架

 

Transformer是一个带有self-attention机制的seq2seq模型, Seq2Seq模型它的输入是一个sequence,输出也是一个sequence,是输出的长度不确定时采用的模型,这种情况一般是在机器翻译的任务中出现,将一句中文翻译成英文,那么这句英文的长度有可能会比中文短,也有可能会比中文长,所以输出的长度就不确定了。

如下:输入的中文长度为4,输出的英文长度为2

 

 

 

它的结构为encoder-decoder,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。

encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,如下图,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。

decoder则负责根据语义向量生成指定的序列,这个过程也称为解码,如下图,最简单的方式是将encoder得到的语义变量作为初始状态输入到decoder的RNN中,得到输出序列。可以看到上一时刻的输出会作为当前时刻的输入,而且其中语义向量C只作为初始状态参与运算,后面的运算都与语义向量C无关。

2.提出了多头注意力(Multi-headedattention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headedself-attention)。

context vector计算的是输入seq、目标seq间的关联,同时也成了限制模型性能的瓶颈,当要翻译的句子较长时,一个context可能存不下那么多信息,并且忽略了输入seq中文字间的关联、目标seq中文字间的关联性。因此引入注意力机制,将有限的认知资源集中到最重要的地方

 

 

注意力机制(Attention):

神经网络中的一种机制,模型可以通过选择性地关注给定的数据集来学习做出预测。

Eg:研表究明,汉字的序顺并不定一能影阅响读,比如当你看完这句话后,才发这现里的字全是都乱的。

上面的这段话,好几个词都存在顺序混乱,但是阅读的第一感受,不会感觉到这种乱序。因为大脑在识别文字的过程中,自动就把低可能的解释忽略了。

 

比如这张图,第一眼就会看见麻雀,主动的忽略掉了不重要的环境信息。

Attention机制可以它认为是一种资源分配的机制,可以理解为对于原本平均分配的资源根据Attention对象的重要程度重新分配资源,重要的单位就多分一点,不重要或者不好的单位就少分一点,在深度神经网络的结构设计中,Attention所要分配的资源就是权重。 在生成Target序列的每个词时,用到的中间语义向量context是Source序列通过Encoder的隐藏层的加权和,而不是只用Encoder最后一个时刻的输出作为context,这样就能保证在解码不同词的时候,Source序列对现在解码词的贡献是不一样的。

自注意力机制:

注意力机制关注的是重要特征,自注意力机制让每个输入都会彼此交互(自),然后找到它们应该更加关注的输入(注意力)。自注意力模块的输出是这些交互的聚合和注意力分数。

Eg:Thecathatesthemouses,iteatsit.

Attention关注的终点是cat和mouse,Self-Attention更加关注语句内部的交互联系,本来cat和mouse没有关系,但通过与hates的组合就能对这个句子的情感有认识,并且通过交互聚合,能将两个it和前面的cat与mouse联系起来。

多头注意力机制:

将多个自注意力连接起来,通过减低维度来减少总的计算消耗。

Eg:例子出处:https://blog.csdn.net/Oscar6280868/article/details/97623488

假设有x1、x2、x3和x4这四个序列,首先进行一次权重的乘法得到新的序列a1、a2、a3和a4。示意图如下所示:

将输入a分别乘以三个不同的权重矩阵W分别得到q、k、v三个向量,这里面q表示的是query,是需要match其他的向量的;k表示的是key,是需要被q来match的,v表示value,表示需要被抽取出来的信息。

接下来将每一个query q对每一个key k做attention操作,目的是输入两个向量,输出一个分数,将这两个向量做内积。其中,Attention的操作可以用很多方法来做,论文中采用了scaled-dot-product,这里的d表示q和v的维度。

scaled-dot-product只是多除了一个(为K的维度)起到调节作用,使得内积不至于太大。

有了softmax 的输出之后,再将α1,i与Vi做点乘求和后就能得到b1

通过控制 α1,i 来控制当前输出所关注的序列权重,如果某一块序列需要被关注,那么就赋予对应 α值高权重,反之则相反。这是用q1做attention可以求得整个的输出b1,同理可以用q2、q3和q4分别做attention求得b2、b3和b4。而且b1、b2、b3和b4是平行被计算出来的,互相是没有先后顺序的影响的。所以整个中间的计算过程可以看做是一个self-attention layer,输入x1、x2、x3和x4,输出是b1、b2、b3和b4

接下来看论文中Transformer的结构: 

Encoder和Decoder各6层,每层结构一样。

Transformer舍弃掉了RNN与CNN,因此需要加入位置信息(相对位置或绝对位置)。

 add & norm操作就是将muti-head attention的input和output进行相加,然后进行layer normalization操作。layer normalization和batch normalization刚好相反,batch normalization表示在一个batch里面的数据相同的维度进行normalization,而 layer normalization 表示在对每一个数据所有的维度进行normalization操作。

 masked muti-head attention就是对之前产生的序列进行attention,之后再进行add&norm操作,之后再将encoder的输出和上一轮add&norm的操作进行muti-head attention和add&norm操作,最后再进行一个feed forward和add&norm操作,这整个的过程可以重复N次。输出的时候经过一个线性层和一个softmax层,就输出最终的结果了

V,K,Q首先通过一个线性变换,然后输入到放缩点积attention,做h次,也就是所谓的多头,每一次算一个头,每次Q,K,V进行线性变换的参数W是不一样的。将h次的放缩点积attention结果进行拼接,再进行一次线性变换得到的值作为多头attention的结果。论文提出的多头attention的不同之处在于进行了h次计算而不仅仅算一次,说这样做的好处是可以允许模型在不同的表示子空间里学习到相关的信息 。所谓的muti-headattention就是可以同时生成多个q、k、v分别进行attention,可以获取更多的上下文信息,每个head可以关注各自所注意的重点所在。

3.在WMT2014语料中的英德和英法任务上取得了先进结果,并且训练速度比主流模型更快,在NLP领域中如语言模型和机器翻译领域表现优异。

 

如果把self-attention替换成RNN,那么在输出b2的时候,那么一定会读取前一个序列的输出b1,输出b3的时候一定会先读取之前序列的输出b1和b2,同理在输出当前序列的时候,都要将之前序列的输出作为输入,所以在seq2seq模型中使用RNN,那么输出序列就不能高效的平行化。使用CNN就可以平行化输出序列了,使用CNN确实是可以将序列平行化,但是CNN的感受野有限,不能很好地兼顾序列前后的上下文关系,或者说是要很多层才能看到前后序列的关系,所以CNN也是有一定缺陷的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迁移学习与Transformer架构 的相关文章

随机推荐

  • JavaSE-回溯+自定义类栈实现Puzzle问题

    Puzzle问题描述 如图有一个一维数组 xff0c 上面的数字表示可以移动的步数 xff0c 每个结点都有左右两个方向可以移动 xff0c 例如第一个结点4 xff0c 它只能往右移动4格到3的位置 xff0c 而3左右都可以移动 xff
  • JavaSE-泛型类、接口、方法、擦除机制

    1 泛型定义 泛型是JavaSE 1 5的新特性 xff0c 本质是参数化类型 xff0c 也就是所操作的数据类型被指定为一个参数 xff0c 将类型由原来的具体的参数类型化 xff0c 类似于方法中的变量参数 xff0c 此时类型也定义成
  • JavaSE-十分钟写个五子棋

    1 设计说明 1 1 简介 其实很久之前就写过五子棋 xff0c 当时拿AWT写的界面 xff0c 后面通过socket通信实现了联机对战操作 xff0c 当时写五子棋写的可费劲了 xff0c 现在又要写一次五子棋 xff0c 不过是简单版
  • JavaSE-类加载过程及反射

    目录 一 类加载过程 1 装载阶段 1 1执行过程 1 2 类加载器 1 3 双亲委派模型 1 4 类加载时机 2 链接阶段 2 1验证阶段 2 2准备阶段 2 3解析阶段 3 初始化阶段 二 反射 1 定义 2 用途 3 步骤 4 代码实
  • STM32F407-基于AD7606进行多路数据采集

    1 原理图 2 管脚定义 2 1 OS2 OS1 OS0 查阅数据手册 这三个管脚组合控制过采样模式 000 表示无过采样 xff0c 最大 200Ksps 采样速率 001 表示 2 倍过采样 xff0c 也就是硬件内部采集 2 个样本求
  • caffeine 与 reactor mono 一起使用产生的缓存错误问题

    现象 与reactor mono一起使用 xff0c 发现get key时 xff0c 返回的一直都是抛出的错误信息 xff0c 没有预期中的如果cache loader 返回null 或 错误时 xff0c caffeine自动剔除key
  • EBYTE E103-W02 WIFI模块配置总结(TCP+UDP+HTTP+云透传)

    目录 1 硬件配置 1 1 原理图 1 2 管脚配置 2 AT指令集 3 AP模式配置 3 1AP介绍 3 2 AP配置TCP通信 3 3 AP配置UDP通信 4 STA模式配置 4 1STA介绍 4 2配置过程 4 3网页配置 5 基于亿
  • JavaSE-自定义单链表

    目录 1 自定义链表实现 2 基础操作 2 1 链表打印操作 2 2 链表逆序打印 2 3 链表逆置 3 进阶操作 3 1查找倒数第K个结点 3 2 不允许遍历链表 xff0c 在pos结点之前插入 3 3两个链表相交 xff0c 输出相交
  • SRGAN实现超分辨率图像重建之模型复现

    1 论文介绍 1 1简介 论文名称 Photo Realistic Single Image Super Resolution Using a Generative Adversarial Ledig C Theis L Huszar F
  • JavaSE-自定义队列+两栈实现队列+两队列实现栈

    1 顺序队列实现 与栈一样 xff0c 队列也是一种操作受限制的线性表 xff0c 但与栈不同的是 xff0c 栈是后进先出 xff0c 队列的特点是先进先出 实现与栈类似 xff0c 队列有一个队头指针和一个队尾指针 xff0c 入队的时
  • JavaSE-八大经典排序算法及优化算法思路与实现

    目录 1 冒泡排序 1 1算法思想 1 2 算法实现 1 3 算法优化 1 4 算法分析 2 简单选择排序 2 1 算法思想 2 2 算法实现 2 3 算法优化 2 4 算法分析 3 直接插入排序 3 1 算法思想 3 2 算法实现 3 3
  • 快速超分辨率重建卷积网络-FSRCNN

    1 网路结构图 2 改进点 SRCNN缺点 xff1a SRCNN将LR送入网络前进行了双三次插值上采样 xff0c 产生于真实图像大小一致的图像 xff0c 会增加计算复杂度 xff0c 因为插值后图像更大 xff0c 输入网络后各个卷积
  • PriorityQueue(优先级队列)的解读与底层实现

    目录 1 什么是优先级队列 xff1f 2 优先级队列的特性 3 如何使用优先级队列 4 JDK源码分析 4 1类的继承关系 4 2类的属性 4 3常用的方法 5 自定义优先级队列实现 5 1 优先级队列类定义 5 2 add 方法 5 3
  • HashMap的使用与底层结构剖析

    目录 一 基础概念 二 先使用再了解 三 底层结构 1 HashMap结构 xff08 JDK1 8以前 xff09 2 HashMap结构 xff08 JDK1 8以后 xff09 四 HashMap实现 1 成员变量 2 put实现 3
  • 线程基础与使用测试

    目录 一 进程和线程 二 线程的创建 1 继承Thread类 xff0c 重写run 方法 2 实现Runnable接口 xff0c 重写run方法 3 匿名线程 xff0c 匿名内部类 4 实现Callable接口 xff0c 重写cal
  • 线程生命周期及常用方法的使用

    一 守护线程 守护线程是什么 xff1f 守护线程是一类比较特殊的线程 xff0c 一般用于处理后台的工作 xff0c 比如JDK的垃圾回收线程 守护线程的作用 xff1f JVM xff08 Java Virtual Machine xf
  • git合并被fork的仓库的远程分支

    如果你 fork 了一个仓库并在自己的 forked 仓库中进行了更改 xff0c 而原始仓库也有一些更新 xff0c 此时想将原始仓库的更新合并到你的 forked 仓库 xff0c 可以按照以下步骤 xff1a 1 将原始仓库添加为远程
  • Linux-基础知识及常见操作命令汇总

    目录 1 终端操作 2 命令手册 3 关机重启 4 runlevel 5 目录结构 6 文件属性 7 Linux文件属主和属组 8 目录常用命令 9 VIM命令 10 进程管理命令 1 进程状态 2 ps命令 3 pstree命令 jobs
  • 关键字synchronized与volatile详解

    在多线程并发编程中synchronized和volatile都扮演着重要的角色 xff0c synchronized一直是元老级角色 xff0c 很多人都会称呼它为重量级锁 但是 xff0c 随着Java SE 1 6对synchroniz
  • 迁移学习与Transformer架构

    迁移学习 迁移学习干什么的 xff1f 迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务 Eg xff1a 学习识别苹果可能有助于识别梨 xff0c 学习骑自行车可能有助于学习骑摩托车 xff0c 学习打羽毛球可能有助于学习打网