GPT关键技术Transformer的运行过程
本文将会以人肉来简易运行一个极小规模transformer来演示其预测的工作过程
第一部分:基本计算
假设有一个教室,你坐在一张桌子前,桌子上有3张卡片,横向排开,从左到右分别写着“k卡”、“v卡”、“q卡”,每张卡片都是3x3的九宫格,九格里面写满了个数字。(k代表key也就是键,v代表value也就是值,q代表query也就是查询)
老师走进来了,他手上有一个电子词典,上面每个单词都有对应的三个数字的编码,也叫向量,比如 “I”在词典上的编码就是[ 0.18, 0.46, 0.29 ],又如“am”在词典的编码则是[ 0.54, 0.68, 0.49 ]。这个词典可以输入单词查出三数字向量,或者通过输入三数字向量得到最接近的单词。老师今天的任务就是负责查词典翻译输入输出。
假设你是一个学生,你需要完成一个伟大的任务,就是担任语言生成模型的人肉计算工作,通过针对前文计算来生成新内容。
虽然详细的计算逻辑你不知道,但是大致的工作你是了解的,假如已有10个单词,也就是10个向量,你要算第11个词,也就是第11个向量。首选通过三张卡,把10个单词向量的动态权重算出来,再把10个向量计算出10个新向量,然后用动态权重和10个新向量加权,就算出一个新向量,这个就是第11个词向量。然后又开始重复相同的过程来计算下一个词,这次可以使用一共11个向量,来计算第12个向量。重复这个过程直到算出来的向量是结束符。
此时老师从门口拿进来一段信息,上面写着“I am”,这就是输入,你的任务就是完成后面的信息补齐。计算开始。
Round ONE
老师打开词典查找了第一个单词“I”,把对应的三数字向量[ 0.18, 0.46, 0.29 ]写在第一张小纸条交给你。
Action #1,你开始做“k卡”的计算。
你先把这个单词“I”小纸条和“k卡”的九宫格第“一”行对齐
你开始第一步计算,第一列的上下俩数相乘0.38*0.18,第二列的上下俩数相乘0.19*0.46,第三列的上下俩数相乘0.69*0.29,再把三个结果再相加,得到0.38*0.18+0.19*0.46+0.69*0.29=0.3559。“v卡”第一行三数字是一个向量,单词“I”的三数字是另一个向量,刚才的计算就是两个向量的点乘。为了避免太累你选择只留两位小数结果是0.36(注1)。
同样的方式你继续拿灰色单词“I”小纸条往下移动,跟“k卡”的九宫格第“二”行对齐,然后同样的俩向量“点乘”,0.07*0.18+0.94*0.46+0.09*0.29=0.4711,同样留两位小数结果是0.47。
然后你继续拿灰色单词“I”小纸条往下移动,跟“k卡”的九宫格第“三”行对齐,做同样的俩向量“点乘”计算,0.22*0.18+0.41*0.46+0.75*0.29=0.4457,同样留两位小数结果是0.45。
这样你就完成了“k卡”的计算,把上面三步的结果并排一起,得到了一个新的三数字向量,[ 0.36, 0.47, 0.45 ],这个就是第一个词“I”的“k向量”。
Action #2,你用同样的方式做“v卡”的计算,把单词“I”的三数字依次跟“v卡”的第一行,第二行和第三行做三次“点乘”计算,分别得到三个数字,并排拼一起得到新的三数字向量,[ 0.54, 0.68, 0.48 ],这个就是第一个词“I”的“v向量”。
Action #3,同样方法你做了“q卡”的计算,把单词“I”的三数字依次跟“q卡”的第一行,第二行和第三行做三次“点乘”计算,分别得到三个数字,并排拼一起得到新的三数字向量,[ 0.46, 0.46, 0.37 ],这个就是第一个词“I”的“q向量”。
到此为止,回顾一下,你通过老师给的第一个词“I”的向量,跟三张计算卡卡“k卡”,“v卡”,“q卡”分别计算,得到三个新的向量。分别是“k向量”,“v向量”和“q向量”。
在此刻你可以只通过第一个词“I”的向量算出来的k向量,v向量和q向量,就开始对第二个词进行预测,但是因为第二个词老师那里已经有了,所以你问老师要了第二个词,“am”,老师查词典,把“am”的向量[ 0.54, 0.68, 0.49 ]写在第二个纸条上给了你。
Action #4,你用“am”的向量和“k卡”计算出“am”对应得“k向量”
Action #5,你用“am”的向量和“v卡”计算出“am”对应得“v向量”
Action #6,你用“am”的向量和“q卡”计算出“am”对应得“q向量”
你开始计算第三个词,首先是计算“I”和“am”分别对第三个词的贡献程度,也就是权重。“am”是已有句子的最后一个词,需要用最后一个词的q向量,分别点乘所有此也就是“I”和“am”的k向量。也就是用“I”的k向量和“am”的q向量点乘得到0.9997,用“am”的k向量和“am”的q向量点乘得到1.6997。老师的词典有另外一个功能(注2),就是计算相对权重,你把0.9997和1.6997输入,得到33.2%和66.8%。
有了权重你可以计算第三个词了,用“I”的权重33.2%乘“I”的v向量,用“am”的权重66.8%乘“am”的v向量,然后再全加起来,得到第三个词的向量[ 0.76, 1.00, 0.78 ](注3)。
你找老师查词典,得到[ 0.76, 1.00, 0.78 ]实际上是“an”这个词。
现在你已经有三个词了 “I” “am” “an”。
Round TWO
“I”和“am”的k向量,v向量和q向量都是已经计算好的,现在需要计算新的“an”的k向量,v向量和q向量。
你用k卡,v卡和q卡,针对“an”的向量[ 0.76, 1.00, 0.78 ]三次计算,得到对应的k向量,v向量和q向量。
你需要计算“I” “am” “an”对第四个词的贡献权重,一样是使用已有的句子的最后一个词“an”的q向量,分别点乘“I”和“am”和“an”的k向量,得到三个数字,1.43,1.89和1.79(注4),找老师词典算权重,输入前面三个数字,得到24.9%,39.4%和35.7%。
有了权重你可以计算第四个词了,用“I”的权重24.9%乘“I”的v向量,用“am”的权重39.4%乘“am”的v向量,用“an”的权重35.7%乘“an”的v向量,然后再全加起来,得到第四个词的向量[ 0.42, 0.39, 0.81 ](注5)。
找老师查词典,[ 0.42, 0.39, 0.81 ]实际上是“AI”这个词。
现在你已经有四个词了 “I” “am” “an” “AI”。
Round THREE
“I”和“am”和“an”的k向量,v向量和q向量都是已经计算好的,现在需要计算新的“AI”的k向量,v向量和q向量。
你用k卡,v卡和q卡,针对“AI”的向量[ 0.42, 0.39, 0.81 ]三次计算,得到对应的k向量,v向量和q向量。
你需要计算“I” “am” “an” “AI”对第五个词的贡献权重,一样是使用已有的句子的最后一个词“AI”的q向量,分别点乘“I”和“am”和“an”和“AI”的k向量,得到四个数字,1.21,1.33,1.18和1.25(注4),找老师词典算权重,输入前面四个数字,得到24.2%,27.2%,23.4%和25.2%。
有了权重你可以计算第五个词了,用“I”的权重24.2%乘“I”的v向量,用“am”的权重27.2%乘“am”的v向量,用“an”的权重23.4%乘“an”的v向量,用“AI”的权重25.2%乘“AI”的v向量,然后再全加起来,得到第五个词的向量[ 0.01, -0.01, 0.00 ](注5)。
找老师查词典,[ 0.01, -0.01, 0.00 ]实际上是“<end>”也就是结束符。
现在你已经有五个词了 “I” “am” “an” “AI” “<end>”。
本次生成完成。
注0:计算卡上也可以有负数的,此处均为示例。
注1:点乘后的结果还需要加上一个额外独立bias参数,并经过激活函数才输出。
注2:此处使用softmax计算权重,并且还需要先除以sqrt(dimensions)。
注3:此处向量还需再经过一个3x3的p卡计算,转换成一个新的向量才是最终输出。
注4:这里三个数字是示例并非真是计算结果。
注5:同注4向量是示例非真是计算,同注3也需要再经过p卡计算,再输出的向量才是最终输出
第二部分:multi head
现在只有一张桌子,只有你一个,也只有三张卡,这就是全部的参数了,没办法很准的去生成文字。所以扩展成一排比如8个桌子,每个桌子都有一个同学,做着和你一样的计算,但是,他们各自桌子上的三张kqv卡是不一样的,这个就是所谓的multi head,每个桌子是一个head,有自己的kqv卡参数。
所有的人都用自己的卡,从老师那里拿到已有句子的前面n个词输入向量,进行计算,并预测下一个也就是第n+1个输出。8个同学就有8个不同的输出结果。这个时候,会在这一排后面,增加一个独立的桌子,上面只有一张汇总卡,是3行x24列的参数卡,每行有24个数字,共三行。
8个同学输出了8份预测,每份预测是3个数字,都拼一起,就是24个数字。用这个拼起来的24个数字的向量和参数卡的第一行24个数字的向量执行一个点乘,就得到第一个数值。然后继续用24个数字的向量和第二行的向量点乘,得到第二个值。最后同样点乘第三行,得到第三个值。
此时用这三个值跟老师查词典,得到的才是第n+1个单词。
第三部分:decoder stack
只通过同一排扩展更多的桌子,效果有增加但是还有空间。另外一个方向是可以增加很多排的桌子,比如第二排,第三排,第四排,这个就是增加很多新的multi head decoder,从而形成一个stack。
第一排的同学是直接从老师那里获得输入的词,然后由第一排后面的汇总同学输出第一排全部人共同预测的下一个词的结果。第二排的同学是从第一排后面的汇总同学的结果作为第二排的输入词,然后进行同样的计算,并由第二排后面的汇总同学输出。以此类推。第三排第四排直到最后一排都完成计算,那么最后一排的汇总输出的三数字向量就可以跟老师查词典得到第n+1个词。