文章目录
- RNN
- Transformer是干什么的?
- 什么是 Word Embedding ?
- 什么是 Word2vec ?
- CBOW(Continuous Bag-of-Words Model)
- Skip-gram(Continuous Skip-gram Model)
- Word2vec 的优缺点
- Transformer整体架构
- 注意力机制
- self-attention(自注意力机制)?
- self-attention如何计算?
- multi-headed机制(多头注意力机制)
- 整体梳理
- Bert
- 如何训练Bert
RNN
RNN称为循环神经网络,即一个序列当前的输出与前面的输出也有关
。用于处理序列数据。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中
,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。输入是有顺序的,有时间先后关系的,当数据呈现出序列关系有顺序关系的时候,就要用神经网络捕捉我们上下文的关系。
输入x0计算得出结果h0,输入x1+x0隐层特征得出结果h1,之后就都要考虑当前自身的特征,又要考虑前一时刻隐层的特征,信息就会越考虑越多,也就是说x3也会考虑x1的特征(因为x1的特征融入到了x2中,x3会考虑x2的特征),最后一个输出层帮我们预测结果,前面h0、h1、h2…都是铺垫,最终是ht帮我们预测出结果
这是一个串行计算
,最大问题就是消耗时间,因为当下基本上都是大模型
RNN如果往多层去堆叠,堆的层越多,算的越慢,所以RNN常见是三、四层的样子
x1会考虑x0的信息,x2会考虑x1也会考虑x0的信息,也就是说只能看到过去的信息,不能看到未来的信息,是单向结构
后来做成了双向的,并将两者的特征一起拼接得到特征
U:输入参数 W:隐层参数 V:输出参数,对所有的timesteps都共用一套参数
RNN的U、W、V是使用的一套参数,是共享的
RNN正式退出历史舞台是2017年,当年封神的一篇论文《Attention is all you need》也叫做transformer的一个前身,当时transformer是在这篇论文里面提出来的,但是当时transformer还没有那么火,2018年谷歌的Bert是基于纯transformer去做的,大家都开始用transformer去写论文做预测,将transformer推向了高潮,其实当年Bert和GPT-1本质上没啥太大区别,Bert是做完形填空,GPT-1是一个词一个词去生成做预测,都是预训练模型,但是Bert占到了百分之九十九的市场,大家都忽略了GPT-1,这是发生在18年,而国内GPT是20年开始考虑,晚了两年左右
Bert和chatgpt都是基于transformer训练的,包括百度的文心一言
Transformer是干什么的?
人工智能Ai的本质就是去提特征
,transformer其实就是帮我们整合特征的,让平平无奇的数据整合成有层次鲜明的特征数据,让模型学起来很轻松的记住,模型是需要去学特征的
所以transformer就是将平平无奇的数据整理成有特点的特征数据
transformer最核心的一件事词向量word2vec
训练一个词,更新的是权重,更新的是模型,同样一个词在不同的语境中有不同的含义,我们要想一个问题,如何让一个词融入上下文的关键信息?,这就要用到word2vec
什么是 Word Embedding ?
在说明 Word2vec 之前,需要先解释一下 Word Embedding
Word embedding:叫做词嵌入
或词向量
。它就是将「不可计算」「非结构化」的词转化为「可计算」「结构化」的向量。
这一步解决的是”将现实问题转化为数学问题“,是人工智能非常关键的一步。
这种方式在 2018 年之前比较主流,但是随着 BERT、GPT2.0 的出现,这种方式已经不算效果最好的方法了
文本表示(Representation):文本是一种非结构化的数据信息,是不可以直接被计算的。
文本表示的作用就是将这些非结构化的信息转化为结构化的信息
,这样就可以针对文本信息做计算,来完成我们日常所能见到的文本分类,情感判断等任务。
文本表示的方法有很多种,下面只介绍 3 类方式:
- 独热编码| one-hot representation
- 整数编码
- 词嵌入 | word embedding
词嵌入并不特指某个具体的算法,跟上面2种方式相比,这种方法有几个明显的优势:
他可以将文本通过一个低维向量来表达,不像 one-hot 那么长。
语意相似的词在向量空间上也会比较相近。
通用性很强,可以用在不同的任务中。
更加详细的解释:https://easyai.tech/ai-definition/word-embedding/
什么是 Word2vec ?
这是一种基于统计方法来获得词向量的方法,Word2vec 是 Word Embedding 的方法之一。他是 2013 年由谷歌的 Mikolov 提出了一套新的词嵌入方法
这种算法有2种训练模式:CBOW和Skip-gram,是Word2vec 的两种训练模式。下面简单做一下解释:
- 通过上下文来预测当前词(
CBOW
) - 通过当前词来预测上下文(
Skip-gram
)
CBOW(Continuous Bag-of-Words Model)
通过上下文
来预测当前值。相当于一句话中扣掉一个词,让你猜这个词是什么
Skip-gram(Continuous Skip-gram Model)
用当前词来预测上下文。相当于给你一个词,让你猜前面和后面可能出现什么词
优化方法
为了提高速度,Word2vec 经常采用 2 种加速方式:
- Negative Sample(负采样)
- Hierarchical Softmax
具体加速方法就不详细讲解了,感兴趣的可以自己查找资料。
Word2vec 的优缺点
需要说明的是:Word2vec 是上一代的产物(18 年之前), 18 年之后想要得到最好的效果,已经不使用 Word Embedding 的方法了,所以也不会用到 Word2vec。
优点:
1.由于 Word2vec 会考虑上下文,跟之前的 Embedding 方法相比,效果要更好(但不如 18 年之后的方法)
2.比之前的 Embedding方 法维度更少,所以速度更快
3.通用性很强,可以用在各种 NLP 任务中
缺点:
1.由于词和向量是一对一的关系,所以多义词的问题无法解决。
2.Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化
Transformer整体架构
我们主要看注意力机制Self-Attention
注意力机制
什么是注意力机制?注意力通常来说就是我们关注的点(比如说我去商场会看什么,看衣服,看首饰,那我的注意力就放在了衣服和首饰上)
而对于输入的一句话当中,需要分析重点是哪几个字
。无论是视觉还是文本,都是有侧重点的,
并不是每个词都重要,哪个字重要这件事,是由谁决定的呢?是由你的算法,你的模型结合当前语境来看这件事要怎么做
self-attention(自注意力机制)?
同样一个词在不同的语境中表达的结果是不同的,比如下图的第一句话和第二句话的it指的就是不同的含义。所以我们需要让模型来学一学,通过上下文关系,上下文的语境来判断当前词的含义。
词向量含义就是每个词都是一个向量
。
比如今天(向量)晚上(向量)吃(向量)你(向量),在这些词中,每一个词都是独立的,只考虑自身的特征,那“今天”这个词怎么融入上下文语境呢?我们需要考虑“今天”这个词和其他每个词的关系,需要考虑所有上下文,而上下文对“今天”这个词是有影响的,那上下文跟“今天”这个词的关系是怎么样的呢?假设计算一下“今天”这个词跟自己的关系(“今天”)是0.5(百分之五十)
,这个0.5是哪来的?这里假设是初始化的,其实实际上是模型算出来的一个结果,“今天”这个词和“晚上”这个词的关系是0.1(百分之十),和其他词关系看下图的红色数字。那“今天”这个词和其他上下文所有词都有关系概率,那就去其他上下文所有词计算出来的概率
乘以本身词
之后拼接(“今天”x0.5+“晚上”x0.1+“吃”x0.3+“你”x0.1=“今天”)得到一个新的特征结果:“今天”。
也就是说当我们得到权重(比如0.5、0.1、0.3、0.1等权重值)之后,我们要利用这些权重去更新我们的特征,得到一个新的特征结果
。
同理。“晚上”这个词也是像“今天”这个词这么算。
那也就是说,我们一旦我们结合上下文信息之后,这一回我们每个词都和语境有关系了,一旦我们换了语境,我们得到的特征也会变。
注意力机制能解决:在不同的语境,在不同的上下文信息当中,每个词在重构的时候,重构出来的结果是不变的。
现在有一个问题:权重是哪来的?---->训练得到的
,这就要涉及到self-attention如何计算。
self-attention如何计算?
如何训练呢?
首先我们输入两个词
,一个是x1,一个是x2(和下图的绿色的对应)
已知:x1是四维向量,x2是四维向量
目的:我们要算x1跟自己的关系,x1跟x2的关系,怎么算相互的关系呢个?
–>通过内积来算,内积越小关系越差,内积越大关系越好 ;内积为0,表示关系极差
算权重就等于算关系,算关系就是算内积
如何算内积呢?
我们让每一个向量(x1)构建出来三个辅助向量(Queries、Keys、Values)
我们理解:从x1出发,x1要问问题,要问这个问那个的,所以说问问题的时候要提一个问题出来。
Queries:相当于抛出来一个问题
Keys:相当于别人问你问题,你的回答
Values:自身的一个特征
Queries是一个向量,那向量要怎么去算才能得到一个值呢?
从谁出发问,就谁来提供q(问题),谁来回答谁就提供k(回答)
从x1出发问问题
x1跟x1
:x1提供一个q1,x1提供一个k1(x1问x1回答),q1 x k1=值
,这个值先暂时当做一个权重
x1跟x2
:x1提供一个q1,x2提供一个k2
(x1问x2
回答),q1 x k2=值
同理:从x2出发问问题
x2跟x1:q2 x k1=值
x2跟x2:q2 x k2=值
注意:v是由k这边提供的
所以说内积是怎么来的呢?是由我们的辅助向量queries和keys去做的,内积算出来之后是一个值
那queries和keys都是怎么来的呢?
queries和keys都是非常重要的东西,一旦Q和K不同了得到的权重是完全不一样的,最关键的就是这个权重,所以说queries和keys一定不是认为给定的,一定是模型需要训练得到的一个结果
q1一定是和x1有关系,q2一定是和x2有关系,此时是由x1得到q1,由x2得到q2,那怎么得到呢?
x1乘以W(Q)得到q1,x1乘以W(k)得到k1,x1乘以W(v)得到v1;x2乘以W(Q)得到q2,x2乘以W(k)得到k2,x2乘以W(v)得到v2;W(Q)、W(k)、W(v)是共用的
x和q都是矩阵,我们可以对矩阵做一个乘法。同理,k1也是由x1来的,k2是由x2来的,再同理,v也是如此,v1是x1来的,v2是x2来的。所以,我们三个辅助向量q、k、v都是通过一组全连接(我们额外再设置的一组权重参数)得到的一个结果
这里的全连接是一个wx+b的操作,由我们的输入x得到我们的q、k、v向量
但是一开始,我们的模型算出来的权重,啥也不是,啥也不好。我们需要去慢慢更新权重,一旦更新权重,q、k、v向量变了,得到权重也不一样,这样能更好的聚合特征
,所以说transformer在本质上就是去提取特征的一件事,因为它就是需要训练q、k、v向量怎么样和全局跟每一个把关系算好,我们可以这么认为W(Q)和W(k)和W(v)一开始是随机初始化的,实际上后续还需要去更新的一件事
在代码中就是wx+b,要训练一个w,要训练一个b
W一开始是随机初始化的,后续我们要去更新的,就和正常神经网络训练是一样的
Q和K说完了,还有V呢?那V是怎么来的呢?
要得到:x1的特征 = 0.5(v1)+0.3(v2)+0.1(v3)+0.1(v4)
v是什么?v是自身的一个特征
,(举例子)0.5、0.3、0.1、0.1这些数是模型学出来的向量算出来的一个权重(q向量学出来的值和k向量学出来的值的内积=权重
),同理,x2也是一样
所以:v是通过学习完之后更好的理解自己。注意:v是由k这边提供的
算完内积得到的是值,而我们要的是概率
softmax:用来做归一化
的设置,目的就是将值变成概率
根号dk是向量维度
向量维度越大,得到的内积也就越大,得到的特征也就越重要
可是假设我们衡量一个人的标准用100的向量维度,也可以用200的向量维度,用200的向量维度会造成内积很大,我们除以根号dk是为了做一个均衡化处理
内积是可能会出现负数,但是在神经网络中,这件事不会经常出现,因为不合适,所以一般很少很少会出现负值这个东西,模型学习有它的世界,不用管为啥
multi-headed机制(多头注意力机制)
RNN处理是一个个处理有时序,是串行化,而Transformer有多头注意力机制,可以多个单词一起处理,是并行化,大大增加了处理速度
希望模型去学一些东西,学到更多的特征。---->引入多头注意力机制
拓展:输入词的维度是怎么确定的?
输入词的维度一般是固定的,一般这个维度是七六八,Q的维度是七六八,V的维度是七六八,特征的维度也是七六八,那为什么是七六八呢?这是2018年谷歌给出来的,我们也可以用别的比如七八零什么的,但是尊重经典还是用七六八
什么叫多头?用这个机制可以得到更多的更丰富的特征
每一个词x1和x2都有它的q、k、v,假设每一个词都有q、k、v两种,把每个词的q、k、v计算出来的权重
进行拼接,这样就会得到两组向量(如下图中红色的一种,蓝色的一种)
那这东西到底具体是怎么计算的呢?比如说x1想得到一个500维向量,我们可以分5组不同的权重去做,每组q、k、v都100维最后拼在一起就500维了,为什么要这么做呢?
我们提特征没有对错之分,没有说哪个特征是对的,哪个特征是错的,我们也很难去分析中间的特征是对的还是错的,所以最好的方式就是将多种特征进行合并
,所以说多头注意力机制就是给特征做的更丰富,给特征做的更多样。更多样的特征能让模型做的更好。
假设我们现在有两组词,一组是:我打你,一组是:你打我,这两组词代表着不同的含义,其中每一组的“你”字所更新完的特征是不变的,意思就是说“你”这个字,无论它放在哪个位置,它所对应的q、k、v都是不变的,(就好比如说我有一个手机,无论我去哪,我的这个手机都是属于我的),同理,其他字也是一样,只要q、k、v不变,关系不变,无论这个字放在哪里,特征融合后的结果也是不变的,但是这对模型来说是不好的,因为这两组话是不同的含义
所以说在transformer当中还需要再考虑一件事:位置编码
位置不变,但是每个位置都有一个编码,位置的编码不一样,x1加上位置编码,加出来的结果也不一样
在后续的任务当中,transformer是**必须**要加位置编码的,因为人家本质对位置信息不敏感
,所以需要额外补充位置编码,在向量维度上对**对应位置**做一个加法
位置编码其实有挺多的,有正余弦的、有图像位置的等等不同的位置编码,
Self-Attention,是Transformer里面的一部分,也是最主要的一部分,Self-Attention在做一件什么事?输入是这个词的特征,输出也是这个词的特征,它把这个词的特征融入了一些上下文语境,对这个词重构了一下
x是输入
,经过Self-Attention
,得到输出z
,维度不变,特征个数也是不变的,但是特征值变了
那能不能再连1层Self-Attention呢?能不能再连10层Self-Attention呢?能不能再连20层Self-Attention呢?其实是可以的,因为你的输入的格式和输出的格式完全一模一样,写个for循环再去堆叠这个东西就完事了,常规一般是自己玩是4、6、8、10、12层,但是NLP可能是上百层,chatgpt那就不知道多少层了,哈哈哈,反正也是堆叠这种Self-Attention结构
Self-Attention自注意力机制做了之后得到了什么?得到的是一个特征,得到的是一个向量,输入是特征,输出也是特征,但是我们最终要的是什么?我们要的不是特征,我们要的是结果,要看产出,怎么看产出,是不是看怎么能预测出一个结果,怎么能得到最后想要的一个值?
Self-Attention叫做Encoder,叫做一个编码层的操作,这时候我们还需要Decoder解码层的操作:
用这些特征,去输出一个结果
。不同任务,解码层设计的方法是不一样的。
我们用机器翻译来举个例子,我们输入3个词(不知道是哪个国家的语言)将它翻译成英文,通过融入上下文关系之后,再通过Encoder
,得到3个词的向量(特征)。我们知道翻译是需要一个词一个词去翻译,比如说我要翻译出来第一个词,我需要对第一个词做预测做一个全连接层。机器翻译本质上就是分类任务,比如要翻译成英文,假设英文单词有2w个,那就要做一个2w分类,看一看第一个词是2w个词当中的哪一个,就是做一个多分类任务。
想要把这个多分类任务做的准,需要考虑什么?----->需要考虑前文,考虑第一个词有什么特征,第二个词有什么特征,第三个词有什么特征。需要梳理前文提供了什么样的特征。
v是由k这边提供的 ,解码器提供q向量,编码器提供k和v向量,Decoder需要的特征是从Encoder里面去找的,所以Decoder提供q,Encoder提供k和v
q2要和q1算关系(就是Self-Attention),q1不能和q2算关系,因为q2是需要等q1算完之后才有的,只能考虑过去,不能考虑未来
**MASK机制:**q1看不到q2、q3、q4,不能考虑它们对q1的影响,不能算未来的关系,只能算过去的关系。mask就是一个遮挡,考虑谁不考虑谁就是一个遮挡。
接下来我们要怎么去用这个东西,怎么去训练这个模型?
输入是一个特征,一个向量,通过全连接层wx+b的操作得到一个预测值,再经过Softmax操作得到想要的概率
拓展:文本任务都是分类吗?
文本任务基本上都是分类,无论是GPT生成的方法,还是机器翻译还是语言模型,在文本任务当中,都是做分类的
视觉任务可以做一些全连接,做一些回归,一些分类
整体梳理
Encoder:第一步:输入原始的词,进行词嵌入,得到向量,现在向量跟位置信息是不敏感的,需要加上一个位置编码,再进行多头注意力机制,之后进行Norm批处理,BN是做归一化,Add参加连接,Feed Forward做全连接的,然后再去走Self-Attention
Decoder:前几步和Encoder一样,做完Self-Attention,之后再融入cross-attention,交替进行
,得到特征拿全连接取自己想要的,之后再去做一个多分类
什么叫词嵌入?把词转换成对应的向量,转成特征
什么是cross-attention?交叉注意力机制,会取上下文信息,除了句子的词和词之间还会跨越句子变成句子与句子之间(自己和别人),而Self-Attention只是句子的词和词之间(自己)
多模态:cross-attention会到处去学东西,把有用的特种权重大的特征拿过来用,聚合多个尺度,多个维度,多种模态的信息(例如:无人驾驶)
Bert
如何训练Bert
文本中:bert做随机,当时它是选了15%的词干啥,15%的词给它随机遮挡(mask)掉,再让你去猜这个遮挡的词
中文比英文更加难训练,中文同样一句话有太多含义了
例如:赶紧上号,准备打排位,然后中间引一个间隔符,那此时我想问问你这两句话之间是相关的还是不相关的?这时模型在学,它会学什么?它会跟上下文都做考虑,考虑这两句话,它是有没有关联的,从而做一个二分类
,大家想想这样是不是也在训练模型的一个思维能力啊,另外一个例子:赶紧上号,老师马上点名。老师都点名了,可能就不上号了。是不是这两句话之间可能就没有啥没有这个东西了呀,所以说在我们这个任务当中啊,就是bert就是在学一个思维能力
bert、transformer要训练的究竟是什么?—>模型的一个学习能力,所以说咱们的大模型究竟要解决一件什么事儿,既然是个大模型,它学习能力强,就能学到聚合很多东西