第(2/3)页 “你们把每一个词想象成带着三个不同身份去参加相亲大会。我们管这三个身份叫Q、K和V。” 顾屿竖起三根手指。 这其实是一个非常直白的查询匹配逻辑。 Q代表QUery,也就是查询。相当于你带着一个问题去图书馆找书。 K代表Key,也就是键值。相当于书架上每一本书的标签和简介。 V代表ValUe,也就是内容。相当于那本书里真正写着的知识。 “当一个词想要理解自己在句子中的含义时,它就拿着自己的Q,去和句子里所有其他词的K进行匹配打分。谁的分数高,就说明谁跟它关系最紧密。然后把高分对应的V提取出来,融合到自己身上。” 顾屿看着屏幕那头目瞪口呆的三人,做出了最终的总结陈词。 “不需要排队。所有的词在同一时间,拿着自己的Q去和别人的K进行矩阵相乘。这完全是一个可以用GPU暴力加速的并行矩阵运算。” 安德烈根本没等顾屿把话说完。他直接抄起一支红色的马克笔,转身扑向了背后的白板。 笔尖在白板上疯狂摩擦,发出一连串刺耳的吱吱声。一串串极其复杂的矩阵变换公式被他写了出来。 “对。对。矩阵乘法。Q的转置乘以K。太优美了。这就解决了并行的计算瓶颈。” 安德烈一边写一边用俄语大声感叹。 但他写着写着,动作突然停住了。 “等等,有个数学上的漏洞。”安德烈盯着白板上的一个点积运算式, “如果序列变长,维度变大。Q和K的点积结果会变得极其庞大。这丢进SOftmaX函数里,会导致梯度直接消失。模型根本无法训练。” 任少卿也看出了这个问题,脸色变得有些凝重。 这就是新架构在理论推导时最容易死掉的环节。 顾屿坐在北京的办公室里,极其随意地掸了掸袖口。 “那就给它套个缰绳。”顾屿语气平缓,循循善诱, “安德烈,既然是向量维度变大导致点积结果的方差变大,作为一个数学家,你通常用什么工具把它的分布重新拉回标准差为1的平滑状态?” 白板前的安德烈猛地一僵。 他脑子里灵光乍现,几乎是咆哮着用俄语喊了出来: “除以方差的平方根!对!除以维度的平方根!” 他赶紧用袖子擦掉一半的算式,重新把那个代表缩放因子的分母加了进去。 他快速心算了几十秒,然后扔掉马克笔,转头看着屏幕里的顾屿,眼神里全是难以置信的震撼。 “平滑了!数据分布完美平滑了!”安德烈双眼通红地盯着屏幕, “顾,你简直是个魔鬼。” 顾屿当然不会说这是前世无数个秃头算法工程师在论文里写明的现成答案。 他只是耸了耸肩,保持着那份高深莫测。 “所以,RNN可以扔进历史的垃圾堆了吗?”顾屿看向楼天城。 楼天城这时候已经完全从刚才的萎靡中复活了。 “绝对可以。但这套玩意的计算复杂度是跟着序列长度的平方增长的。序列越长,显存占用越恐怖。” 楼天城摸了摸下巴,“要是处理超长文本,一样会爆显存。” 第(2/3)页