文献阅读:Foundation Transformers

news2024/9/21 11:15:16
  • 文献阅读:Foundation Transformers
    • 1. 文章简介
    • 2. 模型结构
      • 1. Sub-LN
      • 2. Initialization
    • 3. 实验效果
      • 1. NLP任务
        • 1. 语言模型上效果
        • 2. MLM模型上效果
        • 3. 翻译模型上效果
      • 2. Vision任务上效果
      • 3. Speech任务上效果
      • 4. 图文任务上效果
    • 4. 结论 & 思考
  • 文献链接:https://arxiv.org/abs/2210.06423
  • GitHub: https://github.com/microsoft/unilm

1. 文章简介

这篇工作是DeepNet的一个后续工作,本质上就是deepnet解决了深层transformer的稳定性的情况下,考察其在各类任务下的泛用性。

关于DeepNet的工作,我司已经将其开源了(https://github.com/microsoft/unilm),网上也有不少关于DeepNet的文章解读,我自己也写过一篇拙作(文献阅读:DeepNet: Scaling Transformers to 1,000 Layers)。

本质上来说,DeepNet的工作就是通过优化transformer模型的参数初始化的方式增加模型参数反向传递的稳定性,从而可以达到超多层模型的训练。

模型的参数初始化方式推导其实还是挺繁琐的,不过真到实现上倒还是挺简单的,改改也化不了太多的时间,不过比较苦逼的是我在我们自己的场景下面试了一下,倒是没有看到很好的一个效果,深层的也没train起来,估摸着哪里理解还是有问题吧,不过整体的效果倒是应该没啥怀疑了,而且貌似这玩意也已经被用到了GPT4里面,应该是一个确实有效的策略,后面还是得回去检查检查自己的code……

Anyway,话扯远了,回来说这篇工作吧,除了DeepNet中介绍的参数初始化方式之外,文中还引入了Sub-LN这个简单的策略,从而给出了文中的Foundation Transformer的架构,使得其可以在各类任务的transformer架构当中都获得较好的效果,而在此之前,各类任务当中的主流模型的transformer架构是略有不同的。

在这里插入图片描述

下面,我们就来具体看看这篇工作的细节。

2. 模型结构

下面,我们来看一下文中对于模型结构的细节描述,如前所述,主要就是以下两方面的内容介绍:

  1. Sub-LN
  2. Initialization

下图就是文中的两个技术点的一个整体描述:

在这里插入图片描述

下面,我们来分别对两者进行一下考察。

1. Sub-LN

首先,我们来看一下Sub-LN的内容。

如上图所示,所谓的Sub-LN层,本质上就是对self-attention层以及FFN层的Layer Normalization方式进行一定的优化,不再是在最前侧或者最后侧使用一个Layer Normalization,而是在输入与输出的两个线性层之前均加入一个Layer Normalization。

其具体的函数表达如下:

  1. Self-Attention

    { Q = W Q L N ( x ) K = W K L N ( x ) V = W V L N ( x ) y = x + W O L N ( A t t n ( Q , K , V ) ) \left\{ \begin{aligned} Q &= W^{Q}LN(x) \\ K &= W^{K}LN(x) \\ V &= W^{V}LN(x) \\ y &= x + W^{O}LN(Attn(Q,K,V)) \end{aligned} \right. QKVy=WQLN(x)=WKLN(x)=WVLN(x)=x+WOLN(Attn(Q,K,V))

  2. FFN

    { z = W 1 L N ( x ) y = x + W 2 L N ( ϕ ( z ) ) \left\{ \begin{aligned} z &= W^{1} LN(x) \\ y &= x + W^{2} LN( \phi(z)) \end{aligned} \right. {zy=W1LN(x)=x+W2LN(ϕ(z))

    其中, ϕ \phi ϕ为激活函数,图示当中使用Relu作为激活函数。

2. Initialization

而关于文中的intialization的部分,其实和前作DeepNet是基本保持一致的,其中的推理部分这里就不过多展开了,事实上也不算看的很明白,但是结果倒是比较简单,如上图所示,只需要满足:

def subln_init(w):
    if w in ["ffn", "v_proj", "out_proj"]:
        nn.init.xavier_normal_(w, gain=γ)
    elif w in ["q_proj", "k_proj"]:
        nn.init.xavier_normal_(w, gain=1.0)

其中,xavier_normal_是pytorch当中的一个初始化函数,其文档链接如下:

  • https://pytorch.org/docs/stable/nn.init.html

简言之,它就是一个正态分布 N ( μ , σ 2 ) N(\mu, \sigma^2) N(μ,σ2),对应参数为:

w ∼ N ( 0 , 2 γ 2 f i n + f o u t ) w \sim N(0, \frac{2\gamma^2}{f_{in} + f_{out}}) wN(0,fin+fout2γ2)

其中, f i n f_{in} fin f o u t f_{out} fout为参数矩阵 w w w的维度,对于二维矩阵,他就是矩阵的行数和列数。

换用tensorflow的代码实现的话,就是:

import tensorflow as tf

def cal_fan_in_and_fan_out(shape):
    if len(shape) < 2:
        raise ValueError("Fan in and fan out can not be computed for tensor with fewer than 2 dimensions")
    fan_out, fan_in = shape[:2]
    receptive_field_size = 1
    if len(shape) > 2:
        for d in shape[2:]:
            receptive_field_size *= d
    fan_in, fan_out = fan_in * receptive_field_size, fan_out * receptive_field_size
    return fan_in, fan_out

def xavier_normal_initializer(gain, fan_in, fan_out):
    std = gain * tf.sqrt(2.0 / (fan_in + fan_out))
    return tf.random_normal_initializer(stddev=std)

而具体到模型结构, γ \gamma γ的取值详见上表,这里转录一下如下:

ArchitectureEncoderDecoder
Encoder-Only
(e.g. BERT)
l o g 2 N \sqrt{log2N} log2N -
Decoder-Only
(e.g. GPT)
- l o g 2 M \sqrt{log2M} log2M
Encoder-Decoder
(e.g. NMT,T5)
1 3 l o g 3 M ⋅ l o g 2 N \sqrt{\frac{1}{3}log3M \cdot log2N} 31log3Mlog2N l o g 3 M \sqrt{log3M} log3M

3. 实验效果

下面,我们给出文中的实验结果。

1. NLP任务

1. 语言模型上效果

首先,对于语言模型,也就是文中所说的纯Decoder结构,实验结果如下:

在这里插入图片描述

在这里插入图片描述

可以看到:

  • 对比Pre-LN和Normformer,Foundation Transformer训练得到的LLM模型无论是在zero-shot, one-shot还是few-shot上面都获得了更好的效果。

2. MLM模型上效果

在这里插入图片描述

可以看到:

  • 在MLM预训练模型当中,Foundation Transformer训练得到的MAGNETO模型同样可以获得更好的模型效果表达。

3. 翻译模型上效果

文中同样在翻译任务上对Encoder-Decoder架构的模型效果进行了考察,得到结果如下:

在这里插入图片描述

可以看到:

  • MAGNETO模型在翻译任务上同样可以获得更好的模型效果表达。

2. Vision任务上效果

除了NLP任务之外,文中还考察了Foundation Transformer在CV任务当中的效果,即对比了Foundation Transformer以及ViT。

得到结果如下:

在这里插入图片描述

可以看到:

  • MAGNETO在CV任务当中也同样是有效的。

3. Speech任务上效果

同样的,文中还在语音识别任务当中对Foundation Transformer进行了一下考察,得到结果如下:

在这里插入图片描述

可以看到:

  • 结论与之前相同,Foundation Transformer在语音识别任务当中同样有效。

4. 图文任务上效果

最后,文中还在多模态任务当中进行了考察,得到结果如下:

在这里插入图片描述

结论同样成立,Foundation Transformer依然是work的。

4. 结论 & 思考

整体来说,文中给出的Foundation Transformer框架算是一个更加robust且效果更优的transformer架构,不但可以适用于各类任务,且对应的模型效果也更加优秀。

其对应的关于sub-ln的部分,事实上个人觉得配合苏剑林的下面这篇博客一起看效果更优:

  • 为什么Pre Norm的效果不如Post Norm?

不过原理层面坦率地说我倒是一直没有仔细去按照他的思路完整推导过一遍,因此就不发表评论了,只是就结论和代码迁移应用而言,倒是还算简单,后续可以在我们实际的工作当中使用一下看看效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

卡尔曼滤波器使用原理以及代码编写

注&#xff1a;要视频学习可以去B站搜索“DR_CAN”讲解的卡尔曼滤波器&#xff0c;深有体会&#xff01; 一、为啥需要卡尔曼滤波器 卡尔曼滤波器在生活中应用广泛&#xff0c;因为在我们生活中存在着不确定性&#xff0c;当我去描述一个系统&#xff0c;这个不确定性就包涵一…

源码编译LAMP与论坛安装

目录 Apache网站服务&#xff08;著名的开源Web服务软件&#xff09; Apache的主要特点 软件版本 如何创建论坛 安装相关服务Apache 安装MySQL数据库 安装PHP框架 然后进行论坛安装 第一步 先进入到MySQL内 第二步 授权bbs数据库 第三步 刷新数据库 第四步 解压指定…

【Windows】虚拟串口工具VSPD7.2安装

【Windows】虚拟串口工具VSPD7.2安装 1、背景2、VSPD7.2安装3、创建虚拟串口 1、背景 ​Virtual Serial Ports Driver​是由著名的软件公司Eltima制作的一款非常好用的​虚拟串口工具​&#xff0c;简称&#xff1a;VSPD。 VSPD其功能如同 Windows机器上COM 串行端口的仿真器…

Go-unsafe详解

Go语言unsafe包 Go语言的unsafe包提供了一些底层操作的函数&#xff0c;这些函数可以绕过Go语言的类型系统&#xff0c;直接操作内存。虽然这些函数很强大&#xff0c;但是使用不当可能会导致程序崩溃或者产生不可预料的行为。因此&#xff0c;使用unsafe包时必须小心谨慎。 …

小白必看!渗透测试的8个步骤

渗透测试与入侵的区别 渗透测试&#xff1a;以安全为基本原则&#xff0c;通过攻击者以及防御者的角度去分析目标所存在的安全隐患以及脆弱性&#xff0c;以保护系统安全为最终目标。 入侵&#xff1a;通过各种方法&#xff0c;甚至破坏性的操作&#xff0c;来获取系统权限以…

C++ 教程(15)——数组(包含实例)

C 支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量&#xff0c;比如 number0、number1、...、number99&#xff0c;而是声…

[架构之路-215]- 系统分析-领域建模基本概念

目录 1. 什么是领域或问题域 2. 什么面向对象的“类” 》 设计类 3. 什么是概念类 4. 什么是领域建模 5. 领域建模与DDD&#xff08;领域驱动架构设计&#xff09;的关系 6. 领域建模的UML方法 7. 领域建模的案例 其他参考&#xff1a; 1. 什么是领域或问题域 领域&a…

Spring AOP之MethodInterceptor原理

文章目录 引言Spring AOP组成先看一下Advice 示例提问 原理 引言 之前我们讨论过了HandlerInterceptor&#xff0c;现在我们来看一下MethodInterceptor。 MethodInterceptor是Spring AOP中的一个重要接口,用来拦截方法调用&#xff0c;它只有一个invoke方法。 Spring AOP组成…

Laya3.0游戏框架搭建流程(随时更新)

近两年AI绘图技术有了长足发展&#xff0c;准备把以前玩过的游戏类型重制下&#xff0c;也算是圆了一个情怀梦。 鉴于unity商用水印和启动时间的原因&#xff0c;我决定使用Laya来开发。目前laya已经更新到了3.0以上版本&#xff0c;就用目前比较新的版本。 之后关于开发中遇到…

HashMap学习:1.7 迁移死循环分析(通俗易懂)

前言 JDK1.7由于采用的头插法&#xff0c;所以多线程情况下可能会产生死循环问题。 正文 头插法 就是每次从旧容器中的hash桶中取出数据后&#xff0c;放到新容器的头节点问题&#xff0c;如果此时头结点位置为空&#xff0c;直接放置即可&#xff0c;如果不为空将头节点的数…

C语言strncpy的使用缺陷和实现,strncat的使用缺陷和实现,strncmp的使用和实现。

1.strncpy 函数原型&#xff1a; char *strncpy( char *strDest, const char *strSource, size_t count );char *strDest 目标字符串首元素地址const char *strSource 源字符串(需要拷贝过去的字符串)size_t count 拷贝字符的个数char *strncpy 拷贝结束后&#xff0c;返回目…

Micormeter实战

Micrometer 为基于 JVM 的应用程序的性能监测数据收集提供了一个通用的 API&#xff0c;支持多种度量指标类型&#xff0c;这些指标可以用于观察、警报以及对应用程序当前状态做出响应。 前言 可接入监控系统 监控系统的三个重要特征&#xff1a; 维度&#xff08;Dimensio…

[保姆教程] Windows平台OpenCV以及它的Golang实现gocv安装与测试(亲测通过)

一、MinGW & CMake 预备步骤 首先打开cmd: c: md mingw-w64 md cmake下载安装MinGW-W64 访问&#xff1a; https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.3.0/ 下载&#xff1a; MinGW-W64 GCC-8…

一文详解Softmax的性质与Self-Attention初步解析

概述 最近研究超平面排列(Hyperplane Arrangement)问题的时候&#xff0c;发现ReLU有其缺陷&#xff0c;即举例来说&#xff0c;ReLU 无法使用单一的超平面将分离的所有数据&#xff0c;完整的输出&#xff0c;即只会输出半个空间映射的数据&#xff0c;而另一半空间的数据被置…

面试---简历

项目 1.1、商品管理 新增商品 同时插入商品对应的使用时间数据&#xff0c;需要操作两张表&#xff1a;product&#xff0c;product_usetime。在productService接口中定义save方法&#xff0c;该方法接受一张Dto对象&#xff0c;dto对象继承自product类&#xff0c;并将prod…

学习open62541 --- [78] 单线程和多线程的使用场景

open62541提供多线程功能&#xff0c;默认不开启&#xff0c;即单线程&#xff0c; 把UA_MULTITHREADING的值设置为 > 100就可以开启多线程了。 这里单线程/多线程的意思是基于open62541运行的server内部是否使用锁去保护数据。只要server运行后还有读写操作需要做&#x…

从源码全面解析 dubbo 消费端服务调用的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

3D 顶点着色与Phong 反射模型

Phong 反射模型有时被称为“Phong 照明”或“Phong 照明”。它由环境光照、漫反射&#xff08;朗伯反射&#xff09;、镜面反射三部分组成。 Phong 反射模型提供了一个方程式&#xff0c;用于计算表面上每个点的光照&#xff0c;I_p&#xff1a; 第一部分代表环境光项。在GLSL代…

X书hmac参数

被删重新发送 全文可以查看&#xff1a; 上面一遍unidbg解密shield文章 unidbg - 》 callObjectMethodV方法填写你的小红书路径下s.xml里的值: 或者在抓包响应头中: 查找xy-ter-str hmac 结果都是在&#xff0c;响应头里&#xff0c;所以 hmac 是服务器下发给客户端的. Over…

黑马头条.

文章目录 前言一、项目概述1.1 能收获什么1.2 项目概述1.3 项目术语1.4 业务说明 二、技术栈2.1技术栈整体框架图2.2技术栈简介 三、nacos环境搭建3.1 虚拟机镜像准备3.2 nacos的安装 四、初始工程搭建4.1 开发环境准备 五、实现登录功能5.1 需求分析5.2 表结构分析5.3 思路分析…