小周带你读论文-2之“草履虫都能看懂的Transformer老活儿新整“Attention is all you need(2)

news2024/11/14 19:56:11

书接前文:小周带你读论文-2之"草履虫都能看懂的Transformer老活儿新整"Attention is all you need(1) (qq.com)

      上文书说到为什么我们要用casual-decoder架构,把Transformer的左边给省略了,于是得到下图这样的架构

Image

      上图是GPT-1的模型结构,那么casual-decoder和原始Transformer除了没有左边的encoder还有什么区别呢?

Image

      就是除了把左边红框的部分去掉了,右边中间的部分也给干掉了,精简到从多头注意力层之后过一层Layer Normal之后直接进FNN

      整个网络就被精简为:

      位置编码层--->N*(masked自注意力层--->第一层Layer normalization--->FFN--->第二层Layer Normalizattion)--->线性层

      不同的模型可能会有区别,但是大差不差,等于你记住了我这个顺序,就记住了Casual-decoder模式的LLM的网络架构

       首先一个大前提,我们应该了解Transformer模型本身肯定是看不懂你输入进去的文字的,最终是都要表示成为向量的模式,然后通过距离比较理解出你的输入大概率要对应什么输出的可能性百分率

      这部分不理解的基础方面的同学,可以阅读和参考以下文章:

      深度学习从入门到不想放弃-5 (qq.com)

      深度学习从入门到不想放弃-6 (qq.com)

      当你准备训练模型之前,首先是要定义自己的词典,也就是vocb,vocb是可以由纯粹的单字构成(汉语,估计也是唯一一门的表意文字),也可以由词组成(英语,拼音类文字,当然汉语也可以这么分),一般像Llama分词就用的BPE来分词,来支撑它的vocb,但是BPE中文用着就别扭,因为是基于字节的,也有自己写分词器的,按字来分,比如我哥们儿在做的项目就是自己做的汉字分词器,然后把5000多个汉字加入到Llama原本的vocb里面,也一样用

      分完了词我们就要做我们的tokenizer,就是下面这些文件

Image

      比如打开tokenizer.json就可以看到编码

Image

      然后再通过tokenizer的model去把数字转换成向量

      在NLP领域我们一般是不会采用one-hot编码的,都采用word2Vec的形式,尽量别那么稀疏,本来NLP的场景就很稀疏,所以我们要尽量省算力,省内存

      比如Llama32000个词,要是one-hot编码的话,就是[0,0,0,1,0,0......(第3200个0)]这种的,显然不能让人接受,如下图我用一个4维的向量来编码一个词(所对应的数字),只要词典里这些词的四个维度的数字有一点不一样就行了,这样就省了好多的空间,实际场景中了,为了特征值比较好出结果还有其他原因,一般维度也并不太小,GPT-1刚出的时候我记得是768维,和一般的word2vec相同,到了GPT-3已经是12288维

Image

      当一个句子中的所有词(或者字)被进行embedding处理之后,在进入模型训练之前,就会变成这样子,像是下图样子的Tensor

Image

      Tensor的形状就是( batchsize,seq_number,dimension_numer)

      当把训练数据按照batchsize封装成这个样子,就可以送入网络里进行训练了,比如RNN就直接开始训了,但是Transformer不太行,原因是因为RNN是具有时序控制的,通过类似门电路一样的遗忘门,输入输出门,来保留原来的时序信息,但是Transfoermer是个类词袋模型,它没有这个能力,类似于fasttext,它能力就是统计词频,也没有时序关联性,比如我们要预测两句话:

        "我爱你"

        "你爱我"

        这就是完全的两个意思,但是如果是正常做self-attention的话,其实这两句话,大概率最后输入softmax以后,值是相等的,这就属于不可用了,基于此,在做self-attention之前,我们要把embedding好的token给加点东西,来表示一个句子中不同词的顺序,在做self-attention的时候离的近的多少给点照顾,还有顺序也有前后,这样才能在训练之后的预测达到你想要的要求

       那么好,首先我们就进入到今天的环节,也是Transformer的网络入口位置编码层(positional-encoding):

      其实位置编码层,它严格来说,不属于Transformer网络的一部分,因为它本身这一层,不参与attention计算,但是它也是非常重要的,因为它的结果会导致attention计算的值的不同,所以很重要

      为什么要有位置编码,刚才讲完了,现在我们来讲一下这东西的实现方式,目前实现位置编码主要有3种:

  • 绝对位置编码

  • 相对位置编码

  • 旋转位置编码

          我这里就讲两种绝对Sinusoidal (GPT用),旋转RoPE(Llama用),这两个要能看懂也就够用了,相对基本也用不太上(听过的模型只有T5再用)

1-绝对位置编码

Image

      简单说就是把一个句子里的词(或者字)按着奇数和偶数的顺序分别拿正弦函数(偶数)和余弦函数(奇数)给求出来一系列值,然后把这个值给挂在embedding上面加一下,一起送入Attention层

      什么意思呢?

      我们以一个句子"I am a Robot"来看,假设dimension为4,n为用户定义的标量,Attention is all you Need的作者定义n为12000,我为了好算定义100

Image

      是不是就算出了关于词不同维的向量值,以及他们分别代表的正弦和余弦函数的值?

      我们都知道三角函数的特性:

   

Image

      通过这种三角函数式的递进位置编码,模型能够分辨出每个token的绝对位置,也能进一步推断出token之间的相对位置

     假设位置M、N两个token,其中N>M,二者相差P,则根据上述公式

Image


       对于sin变换,能够清晰地看出位置N和query的位置M之间的关系,前者相比后者的位置多P个距离,相当于多乘出来一个(cosP sinP) (罗起来的实在打不出来。。。),cos也一样,这样就能在计算M和N之间的位置了

2-RoPE

     RoPE旋转编码是苏剑林大师提出的,最早用在他自己自研的RoFormer,Llama就采用了。目前看也是为数不多的,在Transformer领域里,国人贡献的顶级技术能力和思想,下面我用几何方式来解释,还可以用复数来解释(那个我也解释不明白,大家可以自己找资料看)

        

Image

      刚才我们讲的相对位置编码,主要是利用三角函数相关的算法和逻辑来判断位置,RoPE不是,它的逻辑是

       对于自注意力矩阵X1位置和X2位置来求attention, RoPE先将对应token的特征向量两维度一组切分,如上图,对切分后的每个二维向量旋转,得到X'1和X'2;如上图所示,旋转角的取值与三角式位置编码相同,即采样频率θ乘上token下标,旋转完将所有切分拼接,就得到了含有位置信息的特征向量

Image

       比如要求t位置和s位置上的向量X的位置相关性如上面公式所示,RoPE通过旋转矩阵不只可以分别乘在向量qt和ks上(qk做内积求attetion,这块看不明白下节课讲),表达绝对位置,也可以乘在self-attention矩阵At,s的中间,表达相对位置,所以RoPE实现了绝对位置和相对位置的统一

      RoPE的实现思路或者说本质,其实就是特征向量的旋转操作,拿一个2维的向量举例(好理解)当以下条件成立

     

Image

      则只可能有一个θ角和它对应,然后我们把旋转矩阵给展开,就能得到qt和ks旋转后的结果,如果维度大于2,其实也是一个道理

Image

     上述式子继续推导,合并cos和sin就可以发现,qt,ks旋转后的结果,实质上,就是qt,ks乘上cos再加上qt,ks翻转维度并取反一维后再乘上sin的结果,程序里实现叫rotate_half

     本节完,写了2章,1万多字,还没进到Transformer的门

Image

,刚在门外打理完,可见我写的多细,大家别吝惜点赞,转发,收藏,一键三连啥的,谢谢

      

Image

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

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

相关文章

leetcode2312卖木头块

其实不难&#xff0c;主要是你得一眼看出来这个问题缩小规模然后就可以用DP来做了 using ll long long; class Solution { public:long long sellingWood(int m, int n, vector<vector<int>>& prices) {ll f[m10][n10];ll p[m10][n10];memset(p,0,sizeof p)…

AI时代—ChatGPT-4.5的正确打开方式

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

数据结构——Java实现栈和队列

一、栈 Stack 1.特点 &#xff08;1&#xff09;栈是一种线性数据结构 &#xff08;2&#xff09;规定只能从栈顶添加元素&#xff0c;从栈顶取出元素 &#xff08;3&#xff09;是一种先进后出的数据结构&#xff08;Last First Out&#xff09;LIFO 2.具体实现 Java中可…

win系统环境搭建(十二)——Windows系统下使用docker安装redis

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;十二&#xff09;——Windows系统下使用docker安装redis 文章目录 win系统环境搭建&#xff08;十二&#xff09;——Windows系统下使用docker安装redis1.创建文件夹2.docker-compose.yaml配置文件3.red…

《WebKit 技术内幕》之四(1): 资源加载和网络栈

第四章 资源加载和网络栈 使用网络栈来下载网页和网页资源是渲染引擎工作的第一步 1.WebKit 资源加载机制 1.1 资源 网页本身就是一种资源、网页还需要依赖很多其他的资源(图片、视频) &#xff08;1&#xff09;HTML 支持的资源主要包括以下几种类型&#xff1a; HTML 页…

【动态规划】【C++算法】741摘樱桃

作者推荐 【动态规划】【数学】【C算法】18赛车 涉及知识点 动态规划 LeetCode741 摘樱桃 给你一个 n x n 的网格 grid &#xff0c;代表一块樱桃地&#xff0c;每个格子由以下三种数字的一种来表示&#xff1a; 0 表示这个格子是空的&#xff0c;所以你可以穿过它。 1 表…

Golang 搭建 WebSocket 应用(六) - 监控

我在上一篇文章中&#xff0c;提到了目前的认证方式存在一些问题&#xff0c;需要替换为一种更简单的认证方式。 但是最后发现&#xff0c;认证这个实在是没有办法简单化&#xff0c;认证本身又是另外一个不小的话题了&#xff0c;因此关于这一点先留个坑。 本文先讨论一下另外…

前端开发必备 HTML的常用标签(二)

目录 一、HTML语言 二、水平线标签 三、字体样式标签 四、注释和特殊符号 一、HTML语言 HTML&#xff08;Hypertext Markup Language&#xff09;是一种标记语言&#xff0c;用于创建网页的结构和内容。它由一系列的标签组成&#xff0c;这些标签定义了网页中各个元素的结…

商铺工厂119消防火灾SOS声光一键报警器平台联网

商铺工厂119消防火灾SOS声光一键报警器平台联网 1.设有火灾自动报警系统的建筑&#xff0c;宜选择符合相关现行国家技术标准的消防应急广播、火灾声光警报类产品&#xff0c;由火灾报警或消防联动控制器进行控制&#xff0c;在消防控制室应能一键启动全楼火灾声光警报或向全楼进…

阿里云腾讯七牛内容安全配置

一&#xff0c;阿里云 1&#xff0c;配置RAM角色权限 向RAM用户授权系统策略权限&#xff1a;AliyunYundunGreenWebFullAccess 2&#xff0c;内容安全控制台——授权访问OSS 不授权——会报错——no permission(not authorized about role AliyunCIPScanOSSRole)

Pytest插件“pytest-selenium” - 让自动化测试更简洁

在现代Web应用的开发中,自动化测试成为确保网站质量的重要手段之一。而Pytest插件 pytest-selenium 则为开发者提供了简单而强大的工具,以便于使用Python进行Web应用的自动化测试。本文将深入介绍 pytest-selenium 插件的基本用法和实际案例,助你轻松进入无忧的Web应用测试之…

LeetCode 9.回文数(python版)

需求 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xff0c;121 是回文&#xff0…

【惠友小课堂】正确认识「股骨头坏死」,必读!

在上一篇门诊故事中讲到的孙女士&#xff0c;一开始觉得自己腿疼的原因可能是股骨头坏死&#xff0c;结果在王教授的诊断下发现其实是髋关节发育不良&#xff0c;给出的专业建议是需要进行髋关节置换手术治疗。这恰恰反映了一个情况&#xff0c;很多病人会把“腿疼”的原因归咎…

【GitHub项目推荐--微软开源的可视化工具】【转载】

说到数据可视化&#xff0c;大家都很熟悉了&#xff0c;设计师、数据分析师、数据科学家等&#xff0c;都需要用各种方式各种途径做着数据可视化的工作.....当然许多程序员在工作中有时也需要用到一些数据可视化工具&#xff0c;如果工具用得好&#xff0c;就可以把原本枯燥凌乱…

中国电子学会2021年12月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)

一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1.点击下列哪个按钮&#xff0c;可以让正在运行的程序停下来&#xff1f;&#xff08;&#xff09;(2分) A. B. C. D. 2.小乔完成了一个编程作品后&#xff0c;点击“文件”中的“保…

【Linux】Linux基本操作(二):rm rmdir man cp mv cat echo

承接上文&#xff1a; 【【Linux】Linux基本操作&#xff08;一&#xff09;&#xff1a;初识操作系统、ls、cd、touch、mkdir、pwd 】 目录 1.rmdir指令 && rm 指令&#xff1a; rmdir -p #当子目录被删除后如果父目录也变成空目录的话&#xff0c;就连带父目录一…

【设计模式】文件目录管理是组合模式吗?

组合模式是什么&#xff1f; 组合模式是一种将对象组合成树形结构以表示"部分-整体"的层次结构的设计模式。它使得用户对单个对象和组合对象的使用具有一致性。 组合模式在什么情况下使用&#xff1f; 当你发现你需要在代码中实现树形数据结构&#xff0c;让整体-部…

户外机器人区域覆盖算法仿真测试平台设计与实现(预告)

要求14周完成。一定要熟练掌握人工智能工具的使用。 起伏地形环境多机器人编队运动控制与路径规划研究_2016年中小结-CSDN博客 简要版本 随着机器人技术的快速发展&#xff0c;户外机器人在农业、环境监测、搜索与救援等领域的应用日益广泛。为了实现高效、准确的区域覆盖&…

基于docker创建nginx容器

docker一键安装可以参考我这个博客&#xff1a;一键安装docker 1.创建基础容器 docker run -p280:280 --name nginx -d nginx创建挂载到容器的宿主机文件夹 mkdir -p /home/000nginx-ebrms-ftp/html mkdir -p /home/000nginx-ebrms-ftp/logs mkdir -p /home/000nginx-ebrms-f…

FPGA高端项目:Xilinx Artix7 系列FPGA纯verilog图像缩放工程解决方案 提供4套工程源码和技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我这里已有的FPGA图像缩放方案本方案在Xilinx Kintex7 系列FPGA上的应用本方案在国产FPGA紫光同创系列上的应用本方案在国产FPGA高云系列上的应用 3、设计思路框架设计框图视频源选择o…