01. 小白要怎么学习Transfomer?


对于每一个想要跨领域了解AI的人来说,Transfomer是一座不可能绕过的高峰。

经常看到AI offer的咨询广告会把Transfomer面试问题提出来说。不管是不是真的,也不管有没有用,提起这个让ChatGPT一举成名的架构,都高低需要说上一两句,主要是表现一种态度上的真诚(bushi。

但是对于一个完全零基础的人来说,理解Transformer并不是一件容易的事。这个零基础的人就是我,第一次装逼打开《Attention is all you need》,然后骂骂咧咧退出去。

我想说这篇文章真的不长,而且引用文献仅有区区40篇,但就是哪儿哪儿都让人觉得“雾草,到底是什么?”

(看看我的写写画画版本)

然后我去查找了一下关于Transformer的讲解资料,感谢各路大神的无私奉献,终于能够差不多知道Transformer架构是在干什么了。但主要停留在“硬背”的层面,就是记住“设计如此”,好像是英语阅读这道题就是自然选C一样。

这很正常,因为这篇《Attention is all you need》用了非常精炼的篇幅讲完一个简洁优雅的架构设计,重点突出了Attention机制。

但是你仔细看就会发现里面整合了很多纯熟的、经典的训练模型的技巧,简直是各种技巧的集大成者,完全想象不出作者是有着多么深厚的功底,才能把这么多的东西糅合得举重若轻。

如果一点都不了解前史,就会心里充满了疑问,这大大削弱了硬背效果。于是我希望找到一个辅助我自己理解问题的角度,这个角度就是,Transformer从何而来?是为了解决什么问题而来?怎么就能够想到这样“神来一笔”的架构?

于是有了这篇文章。这是一篇面向非AI专业朋友的Transformer前传,从一个需要解决的问题开始,一步一步往上叠加解决方案,用来展示Transformer是在什么样的基础上形成的。
这篇文章会从一个直觉的层面去简单介绍:

  • 分词(Tokenization)
  • 词嵌入(Word Embedding)
  • RNN
  • Attention机制起源(会稍微涉及一点模型)

我个人是觉得有了这些重要的铺垫,对Transformer的理解会更加顺理成章。当然了这只是一种叙事,不是真相。

就当听了一个故事,希望能给大家理解Transformer带来一丝灵感~

关于Transformer本身的介绍我会放在下篇文章。不关注前史的朋友可以跳过这篇。

02. 一个古老而朴素的愿望


对不起,我要稍微偏题到盘古开天地的时候。

有效的用计算机来处理"序列数据"一直是学者们的愿望。什么是序列数据?就是"出场顺序"有意义,彼此之间非独立的一串数据,比如股市一个月的涨跌点数,再比如自然语言。

在自然语言领域,学者们想要用计算机干很多事情。最自然的莫过于"完成问答",就是我们如今跟ChatGPT交互的这种方式:我们输入一串东西,然后AI回答一串东西。还有就是实现"机器翻译",我们输入一种语言,让机器来翻译成为另外一种语言。

把这类问题抽象一下,可以统一表达为:我们要设计一个系统,让这个系统吸收一串序列数据(在这里具体指自然语言),然后预测跟着这串序列数据后面的是什么。

这样问题就变成了:要怎么去设计这个系统呢?

03. 让自然语言穿越的基础:tokenization


先不管其他东西,我们首先面临的一个问题是——计算机是不懂语言的,无法直接处理"自然语言"。没有被数字化的东西和计算机是有次元壁的。因此第一步是要让"自然语言"穿越到计算机的领域里面,也就是用一串数字来表达自然语言。

自然语言本身就是一个十分神奇的存在,它是人类思想的一种投影,它的表达是无穷的,我们无法直接穷举世界上每一种自然语言表达来为其编码。

但是好在组成自然语言的元素是有限的。英语现在就固定使用26个字母,中文的基本字符要多一些,但是普通人常用的词汇也就几千个。那么可行的办法就是把自然语言的"基本组成元素"用数字来表达。

当学者们仔细去分析基本组成元素这个东西的时候,一些微妙的情况出现了。拿英语来举例,假如就使用26个字母作为基础元素来进行编码。基础元素的个数是控制得比较小,但是一串序列表达起来很长,这让计算复杂度增加。

并且字母并不能表达单独的语义,一个孤立的"c",你不能说明有什么含义,这导致单纯把字母给数字化意义有限,大语言模型要起作用,需要进行非常复杂的学习。

那么如果直接使用"单词"来作为"基础的组成元素"呢?当然可以罗列出常用单词形成一个基础词汇表进行编码。但是这会导致词汇表很大(可能直接扩充到百万级别)。

并且一旦有一个词汇没有在这个词汇表中出现过,大模型就无法处理了。说白了还是"词"作为一个基础元素依然级别过高。

于是大家想到需要字母和词汇"中间的"一个媒介——subwords(子词级别)来作为基础元素,比如"subword"可能会被划分为"sub"和"word"两个部分。

BPE(Byte Pair Encoding)和WordPiece就是两种流行的分词算法,擅长从一大堆的语料中,把作为语义最小单元的subwords给找出来,形成一个大的基础元素表,我们把这种基础元素叫做token。我们的数字化就从这里开始。
分词算法会把最终找到的token集合和对应的索引返回。你可能会得到这样一个集合:

512 → “low”

893 → “est”

2765 → “##ing”

现在有了基础元素集合,并且每一个token都有数字ID。

但是这个数字ID只是一个找到token的索引,并不是对于某个token的实质的表达——就像是字典的页码并不能形容出词条真正的含义一样。

我们转入了下一个问题,要用什么来表达出这些token的语义实质?

04. 万物皆可向量化:embedding


我们需要用数字来表达出token的实质,一个索引数字是不够的,那么多几个数字排列起来呢?有一个用一串数字有序排列在一起的东西叫做"向量"。

向量是一个极其简洁又强大的表达。

我们用向量来数字化一个东西是一种非常自然的。想象一个东西,如果你能够捕捉到它每一个维度的特征,那么提起这串描述的时候,是不是可以与它们背后的概念一一对应?

比如有一个实体存在的房子,你用经度、纬度、面积、单位售价来描述它,那么这个房子的实体投影到数字空间就是一个向量[117,39,120,3.2]。

当然这个数字空间的投影是有信息损耗的,房子肯定不止这4个维度,但这是一种非常有用的抽象。

你可以想象推到极端情况,允许你用无穷多的维度来进行描述,那么这个向量就可以无限逼近某个特定存在。甚至让想象再飞远一点,如果能够某种方法量化关于你自己的所有维度,那么你自己就可以穿越进入数字空间。

向量完全是数值的,这意味着是计算机可以处理的。

向量是有几何意义的,一个向量表达可以看成是空间中“点”的坐标。比如一个二维向量(3,4)是平面上的一个点,一个三维向量是(1,2,3)三维空间中的一个点,一个512维的向量是512维空间中的一个点。

这让我们可以用这些点来衡量****各种空间关系*,比如平移、远近、旋转。这有助于我们对向量抽象对象之间的关系*进行理解。

向量是可以运算的,这种运算在数值意义和几何意义上都成立。

这些特征让我们特别喜欢用向量来作为运算的对象。

于是我们的问题就变成了:要如何用向量来表达我们已经确认为基础元素的token呢?

第一步当然是要确认我们要用多少个维度来描述token。

这个其实并没有什么确定的结论,更多的是一些经验数据——下至128维,上至2048维都有学者使用。

也有的学者们用控制变量法研究过词嵌入维度对于模型表现的影响,看起来过高的维度对模型表现提升有限(Britz et al.,2017)。

下图展示了“词嵌入维度”不同带来的“参数量级”以及“模型表现”的不同。可以看见词嵌入维度更多是学者们依据实验情况和算力约束自行权衡决定的。

现在让我们保持跟Transformer论文一样的选择,就是512维。对于一个token“sub”,我们要用512向量来代表它,但是每个维度的数值到底应该是多少呢?

维度多了之后,每一个维度的含义并不是我们人为显式定义的,更别说人为去确认具体数值了。这个时候就要用到我们的万能解法——神经网络模型,让它自己去学习每一个维度应该是什么数值。

首先我们先给基础元素表里每一个token一个初始化的向量,直接暴力用随机数填充所有维度就行了。接下来的问题是要怎么学习?

我们知道监督式学习是需要把正确答案提供给模型的,这样模型才能够依据答案修正自己的参数。但是对于“要把token转换为向量”这个问题(也就是embedding问题),正确答案是什么我们根本不知道,毕竟token变成向量之后我们人类就无法解读了。

我们只能够从侧面去形容一下什么答案是我们喜欢的,比如我们喜欢这个向量能够表达出语义的相似性,apple和orange之间的距离比apple和hemmer之间的距离近。我们喜欢这个向量能够表征关系,比如经典的king - man + woman = queen。

直接解不行,那么更加暴力的解法就是,就用这些随机的向量代表tokens,扔到一项语言学习任务中去使用,给它们加上一层变换,也就是乘以一个系数矩阵W。这样模型在学习语义任务的过程中,自然就学到了一个参数矩阵W,用这个参数W乘以原来的token向量,就得到了模型通过学习调整后的向量!

word2vec就是一系列这样把词汇变成向量的研究,提出了两个流行又简单的模型——CBOW(Continuous Bag of Words)和skip-gram来实现词嵌入。

它们都围绕着一个思想,那就是“一个词究竟是什么,是由经常出现在它周围的词汇一起来定义的”。emmm,就像是人是社会关系的总和,你的社会关系交织在一起定义了你,经常和某个词汇一起出现的上下文定义了这个词汇的含义。

CBOW训练的是这样一个语言任务:知道上下文,预测中间一个词是什么。skip-gram就反过来:知道中心词是什么,预测固定窗口下的上下文是什么。

模型在这两个任务上训练好,模型找出来的词嵌入方法就是好方法。作者在发表了论文之后还公开了自己训练的代码和已经训练好的向量,后续的语言类任务就可以用这套已经嵌入好的向量作为基础,或者是使用相同的方法来训练自己的向量。当然也可以在自己的语言任务中来端到端的训练词嵌入。

好了,现在已经有了一个自然语言的基础元素表,也把这些基础元素用向量表达了出来。回到我们的问题,要怎么让模型吸收一串自然语言表达,然后预测出下一个token是什么呢?

05. 一种处理上文的办法:RNNs


对于语言任务,或者说对于一系列跟序列数据相关的任务来说,上下文是重要的。要透彻地理解一个词的含义,就一定要看那个词出现的语境。我们上面讲到的word2vec的办法,虽然能够在一定程度上表达出token的语义,但它是从一个比较宏观的视角来表达的。就像是在写一本新华词典,抽离了非常具体的语境。

但我们在做“问答”或者是“翻译”的时候,语义是微妙的,语境是细分的,“good”是在反讽还是夸奖,不放在具体的情景里面你根本就分不出来。

这就意味word2vec只是处理自然语言任务的一个起点,我们需要更加巧妙的办法把上文信息进行编码,才能更好地进行预测。

“上文信息不要丢掉,一直通过编码进行传递到直到最后得出一个向量”这件事,RNN就开始做了。

简单来说,最最最朴素的想法就是在输入第一个token之后,把这个信息进行处理然后存下来,等到下一个输入来了,把存下来的信息想办法跟新的信息融合在一起,再进行处理。

这种设计导致RNN处理序列是一个串行的操作,对于一个拥有1000个token的序列来说,RNN要一个一个一个进行计算,计算时间很长。

更加致命的是,RNN会把第一个token的信息通过一个共享的参数矩阵依次传递下去,这产生了参数矩阵的累乘,在训练中容易导致梯度爆炸或者梯度消失。

简言之,要么就是训练收敛不了,要么就是直接遗忘早期的信息。

06. Attention机制的提出


Attention机制并不是由Transformer那篇论文首次提出的,而是来自2015年的一篇文章——《NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE》。

曾经流行的翻译类任务处理的结构是这样的:设计一个encoder,一个decoder。这个encoder,多半有RNN/CNN结构,用来把一串序列信息全部编码进入最后一个固定长度的向量里面。

这个decoder就负责把这个压缩了完整序列信息的向量解码出来,跟自己的历史预测融合在一起,给出当前这一步的回答。

学者们(Bahdanau et al., 2015)猜测这个用“*固定长度向量压缩序列所有信息*”的方式成为了提升模型表现的瓶颈。

从直觉上也感觉到不合理,就好像一个内存固定的硬盘,你不可能往里面塞入任意多的信息,它的储存空间是有限的。

在“信息传递的窗口”始终是有限的这个前提下,怎么处理超长序列?一个比较自然的想法是,在翻译一个token的时候,找到跟这个token“最有关的信息”传递下去,而不是无脑把全部信息抛给下游——这就叫做“Attention”~

也就是说,如果我们有一种衡量方式,使得我们能够判断“输入”的所有词语对于“当前这一步预测”的重要性,我们就可以“按照重要性”来把输入词语进行“加权平均”,这会让模型的decoder更加专注于那些“权重大”的输入。

输入词语相对于输出词语之间的“重要性权重”是模型在完成“翻译”任务中学习出来的,而不是人为指定的。

为了理解Attention在干什么,我还是会简单介绍论文里面的模型,如果看起来感觉有点困难的话,强烈建议先看一下上面提到的讲解简单RNN的文章。

如果不想看也没有关系,记住刚刚提到的Attention机制是为了“把最相关的信息找出来加权平均”就可以了,之后可以直接跳转到讲解Transformer的文章。

论文使用了双向RNN和前面提到的encoder和decoder架构。长这个样子:

假设输入的序列是[x_1, x_2, x_3…x_T],encoder是一个双向RNN,也就是把数据按照“正序”依次输入模型生成一系列隐藏状态:

然后再把数据按照“逆序”输入模型生成一系列的隐藏状态:

这样对于任意一个时间步t,encoder都能够看到双向的信息,也就是有下面这个拼接向量带来的信息:

对于任意一个时间步t,模型输出的其实是一个条件概率分布。也就是把已知信息作为“条件”,然后输出一串0-1之间的数字,这串数字对应着具体的token——表示当前这个时间步,对应token出现的概率。

最后大模型会选择“概率高”的token成为真实的输出。

要怎么样估计条件概率?使用下面这样一个函数:

先不管这个g函数长什么样子,让我们来分别介绍一下条件概率的决定因素:*y_(i-1)、s_i和c_i。*

y_(i-1)很好理解,就是模型上一步的真实预测。

s_i是一个难理解一点的概念,注意看模型的这个结构图,s_i是由模型****真实历史预测*经过处理*形成的RNN隐藏状态****。

它的计算方式见下方公式,保留了经典RNN隐藏状态的结构,由“上一个”隐藏状态s_(i-1)、上一个真实预测y_(i-1)和一个由论文提出来的新变量c_i共同决定。

这个神秘的c_i被论文称为上下文向量(context vector),就是Attetion机制的核心。(我终于讲到这里了,bushi)

这个c_i计算方式如下,就是一连串h_j加权平均得到的:

记得这个h_j吗,是encoder双向RNN形成的隐藏状态:

对于任意一个h_j,加权系数alpha_ij的算法是:

其中:

加权系数其实就是把e_ij带入了一个Softmax函数,这样带入是为了把计算出来的e_ij转化成0-1之间,并且“和”也为1的形式,让它能够代表权重。真正重要的是这个e_ij。

e_ij表达的就是“输出i”(用s_(i-1)来传递信息)与“输入j”(用h_j来传递信息)之间的相关性。

这个函数a,在实现上是一个“学会找相关性”的前馈神经网络,现在还不知道长什么样,是在训练过程中一起训出来的。
象征相关性的alpha_ij与h_j的乘积表示“输入j”对于“输出i”的贡献。

看到了吗?绕了这么一大圈,就是想要在输出y_i的时候,考虑一下输入序列[x_1,x_2…,x_T]中,哪些信息与y_i相关,然后调整对应权重。作者把这个方法称为一种“自动(软)搜索(automatically soft-search)”。

最后作者提出的这种模型在翻译数据集上的BULES得分要高于传统的RNN架构模型。

把刚刚提到的相关性分数alpha_ij给打印出来,会发现它展示了“被翻译句子”和“翻译结果”之间的一种对应关系。

在上图中,顶端是被翻译的句子,左侧是翻译结果,格子的颜色越白代表相关性越高。可以看见模型正确地将短语 [European Economic Area] 翻译成了 [zone économique européen]。

注意在这个短语里面,英语和法语词汇的顺序是不一致的。但是这个拥有了Attention机制的模型能够正确对齐 [zone] 和 [Area],跳过了两个单词([European] 和 [Economic]),然后每次回看一个单词,最终完成了整个短语 [zone économique européen] 的翻译。

与显式地划分单词的对应关系相比,这种方式的灵活性大大提高。

07. 小结


到这里Attention机制出现了,让模型能够自动化搜索然后专注于“最相关”的信息来做任务。

但是我们可以看见,这个模型还是在使用RNN结构,上面我们提到的RNN结构串行计算慢,梯度爆炸、梯度消失的问题并没有被解决。那么下次伟大的Transformer就要来大展宏图了。

鉴于字数实在有点多,Transformer本身的部分我拆解到下篇文章来说了。感兴趣的朋友可以先点一个关注呀~

从解决问题的角度来看,直接让机器进行自然语言问答是一件并不容易的事情。

但是学者们把问题拆解成多个基础步骤,从分词、词嵌入到RNN再到Attention机制。一步一步搭建起来有效的自然语言处理模块,这种发展本身让我觉得很壮观也很有趣。

我不止一次打开过《Attention is all you need》,但是我总是心里充满了疑问,当欣赏一个不知道从何而来的精巧杰作时,“从何而来”对于我来说变成了一个很有吸引力的问题。

虽然这篇文章并没有讲到Transformer本身细节,还是希望能给大家带来一些灵感。

鉴于我不是这个专业的,有错漏的话欢迎批评指正。

普通人如何抓住AI大模型的风口?

领取方式在文末

为什么要学习大模型?

目前AI大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。

目前,开源人工智能大模型已应用于医疗、政务、法律、汽车、娱乐、金融、互联网、教育、制造业、企业服务等多个场景,其中,应用于金融、企业服务、制造业和法律领域的大模型在本次调研中占比超过 30%。
在这里插入图片描述

随着AI大模型技术的迅速发展,相关岗位的需求也日益增加。大模型产业链催生了一批高薪新职业:
在这里插入图片描述

人工智能大潮已来,不加入就可能被淘汰。如果你是技术人,尤其是互联网从业者,现在就开始学习AI大模型技术,真的是给你的人生一个重要建议!

最后

只要你真心想学习AI大模型技术,这份精心整理的学习资料我愿意无偿分享给你,但是想学技术去乱搞的人别来找我!

在当前这个人工智能高速发展的时代,AI大模型正在深刻改变各行各业。我国对高水平AI人才的需求也日益增长,真正懂技术、能落地的人才依旧紧缺。我也希望通过这份资料,能够帮助更多有志于AI领域的朋友入门并深入学习。

真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发

【附赠一节免费的直播讲座,技术大佬带你学习大模型的相关知识、学习思路、就业前景以及怎么结合当前的工作发展方向等,欢迎大家~】
在这里插入图片描述

大模型全套学习资料展示

自我们与MoPaaS魔泊云合作以来,我们不断打磨课程体系与技术内容,在细节上精益求精,同时在技术层面也新增了许多前沿且实用的内容,力求为大家带来更系统、更实战、更落地的大模型学习体验。

图片

希望这份系统、实用的大模型学习路径,能够帮助你从零入门,进阶到实战,真正掌握AI时代的核心技能!

01 教学内容

图片

  • 从零到精通完整闭环:【基础理论 →RAG开发 → Agent设计 → 模型微调与私有化部署调→热门技术】5大模块,内容比传统教材更贴近企业实战!

  • 大量真实项目案例: 带你亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事‌!

02适学人群

应届毕业生‌: 无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌: 非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能突破瓶颈: 传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

image.png

vx扫描下方二维码即可
【附赠一节免费的直播讲座,技术大佬带你学习大模型的相关知识、学习思路、就业前景以及怎么结合当前的工作发展方向等,欢迎大家~】
在这里插入图片描述

本教程比较珍贵,仅限大家自行学习,不要传播!更严禁商用!

03 入门到进阶学习路线图

大模型学习路线图,整体分为5个大的阶段:
图片

04 视频和书籍PDF合集

图片

从0到掌握主流大模型技术视频教程(涵盖模型训练、微调、RAG、LangChain、Agent开发等实战方向)

图片

新手必备的大模型学习PDF书单来了!全是硬核知识,帮你少走弯路(不吹牛,真有用)
图片

05 行业报告+白皮书合集

收集70+报告与白皮书,了解行业最新动态!
图片

06 90+份面试题/经验

AI大模型岗位面试经验总结(谁学技术不是为了赚$呢,找个好的岗位很重要)图片
在这里插入图片描述

07 deepseek部署包+技巧大全

在这里插入图片描述

由于篇幅有限

只展示部分资料

并且还在持续更新中…

真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发

【附赠一节免费的直播讲座,技术大佬带你学习大模型的相关知识、学习思路、就业前景以及怎么结合当前的工作发展方向等,欢迎大家~】
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐