Transformer系列:Greedy Search贪婪搜索解码流程原理解析

解码器预测流程简述

Encoder-Decoder这类框架需要在解码器中分别拿到前文已经翻译的输入,以及编码器的输出这两个输入,一起预测出下一个翻译的单词。在训练阶段,一个句子通过右移一位的方式转化为从第二个词到最后一个词的逐位预测任务,一个答案句子通过shift right构造出两个句子分别作为输入和预测目标,如图所示

训练shifted right方式

训练阶段虽然输入的是完整的句子,但是配合下三角掩码使得自注意力层每个单词的信息聚合只能利用到该词和该词之前的单词,不许偷看后词,和实际的部署预测场景一致。
在预测场景下,解码器的工作流程变得简单,不再需要掩码,设置初始位置为单词,从开始逐位置开始预测下一个单词,而预测出的单词会和之前已经预测的结果进行拼接,以此继续迭代预测,不断重复这个过程直到预测到截止。

逐位预测方式


解码器自注意力层Q,K,V分配和维护

解码器有两个注意力层,分别是自注意力层和交互注意力层,其中交互注意力层中的采用全局可见的编码器输出,因此K,V固定为完整的编码器输出,而自注意力层不同,为了达到不偷看的目的,Q,K,V需要动态维护的。先上结论

Q:当前位置(上一个预测出的)单词的信息embedding
K:截止到当前位置的所有单词的信息embedding,保证每个词不能偷看到后词信息
V:截止到当前位置的所有单词的信息embedding,保证每个词不能偷看到后词信息

一般Q位置输入为[B,L,D]三维矩阵,其中L代表文本长度seq length,Q的seq length决定了自注意力输出的seq length,在预测阶段的解码器自注意层,Q的seq length长度为1,只需要输出当前词的信息即可,输出也是一个token的embedding表征,这个token天然地代表下一个需要预测的词,原因是shifted right的方式使得上一个单词的Decoder输出embedding成为了下一个单词计算概率分布的依据。
在训练阶段由于Q输入的是带有下三角掩码的完整答案句子,而K,V直接取和Q一致,不需要额外再给到K,V,但是在预测阶段由于每次Q只输入最新的一个token信息,除了位置Q,K,V三者相等,从第二个位置之后再也无法根据Q直接得到K,V,需要在每一步预测的时候记录下历史的K,V,然后将最新的Q信息拼接组合起来,注意K,V只能采用拼接的方式而不能采用模型重新计算的结果,如果重新计算代表K,V已经偷看了后词信息,计算示意图如下

预测阶段对解码器Q,K,V的维护示意图

以一个2层的Decoder为例,上图中||代表拼接, out代表第一层Decoder之后输出的token embedding,output1代表第二层Decoder的输出,output1直接用于翻译单词的概率分布预测。
对于Q:在第一层以源文本的embedding作为Q,在第二层以源文本的embedding经过第一层Decoder的输出embedding作为Q。在位置由于文本总长度也只有1,此时Q,K,V三者一致,从第二个单词开始,Q为当前位置单词。
对于K,V:K,V是截止到当前词之前的所有单词信息,此时需要额外对第一层和第二层的K,V进行维护,具体方式是将Q信息拼接到历史K,V上,对于第一层Decoder实际上是将源文本原始embedding拼接来得到完整的截止到当前的句子信息,而对于第二层Dcoder,这种拼接方式保证了对前词的Sefl Attention结果不做任何修改,例如在输入2的第二层,在 out后面直接拼接上<我> out,完整沿用了 out而没有重新计算,保证了的自注意表征没有偷看到后词。


解码器预测源码分析

在Keras实现的Transformer源码中(github:attention-is-all-you-need-keras),decode_batch_greedy函数以Greedy Search贪婪搜索策略为基础,实现了Transformer的逐位预测过程。

def decode_batch_greedy(src_seq, encode_model, decode_model, start_mark, end_mark, max_len=128):...

函数的输入如下:

  • src_seq:输入的待翻译文本
  • encode_model:编码器模型
  • decode_model:解码器模型
  • start_mark:位置对应的数值id标志
  • end_mark:位置对应的数值id标志
  • max_len:最长预测步长,即翻译的结果文本长度最大值为128

首先计算出待翻译文本在编码器的输出,该输出在整个预测过程的所有步长中全局可用

enc_ret = encode_model(src_seq).numpy()

然后开始准备逐步预测,初始化一个长度永远为1的当前词的数字id矩阵,初次使用以位置开始,矩阵每一行代表该批次下的一条样本。

bs = src_seq.shape[0]
# TODO 该批次下每个样本从<start>开始
target_one = np.zeros((bs, 1), dtype='int32')
target_one[:, 0] = start_mark  # 2

在逐步预测之前定了各层的K,V列表,ended标志列表,解码结果列表

dec_outputs = [np.zeros((bs, 1, d_model)) for _ in range(n_dlayers)]
ended = [0 for x in range(bs)]
decoded_indexes = [[] for x in range(bs)]
  • dec_outputs:K,V维护列表,用于记录历史K,V,已经每步拼接当前词的信息形成新的K,V
  • ended:该批次下每条样本的结束标志,如果已经结束该列表对应索引位置下改为1
  • decoded_indexes:翻译预测结果,list to list格式,记录了每条样本的翻译结果,每条翻译结果为字符的数字id列表

逐步预测代码在一个循环体中,代码注解如下

    for i in range(max_len - 1):print("max_len-1 {}".format(i))# TODO src_seq的作用是在交互注意力层添加encoder信息的mask# TODO target_one是上一个预测出的单词# TODO target_one和dec_outputs,是随着步长变化的,编码器的信息不变# TODO 在解码器内部 target_one 和 dec_outputs 会进行相加outputs = [x.numpy() for x in decode_model([target_one, src_seq, enc_ret] + dec_outputs)]# TODO 这个output [1, 1, softmax]是decoder最终输出+Linear映射的得分# TODO new_dec_outputs 上一个预测词的原始embedding输入,和经过一层decoder之后的embedding输入new_dec_outputs, output = outputs[:-1], outputs[-1]for dec_output, new_out in zip(dec_outputs, new_dec_outputs):# TODO new_out 永远等于[batch_size, 1, 256]# TODO 更新前词(不包含当前词)的向量信息dec_output[:, -1, :] = new_out[:, 0, :]# TODO [[batch_size, n+1, embedding], [batch_size, n+1, embedding]]# TODO 这个地方预留0是为了在Decoder里面和当前词相加,获得完整的k,vdec_outputs = [np.concatenate([x, np.zeros_like(new_out)], axis=1) for x in dec_outputs]# TODO output[:, 0, :] => [1, softmax]# TODO 每次取当前位置的最大预测结果 贪婪 不一定是全局最优sampled_indexes = np.argmax(output[:, 0, :], axis=-1)for ii, sampled_index in enumerate(sampled_indexes):if sampled_index == end_mark:# TODO 该批次下某条样本已经翻译结束ended[ii] = 1if not ended[ii]:# TODO 如果没有结束,收集每条样本的翻译token# TODO 之前已经结束的,也不会再增加新的翻译结果了decoded_indexes[ii].append(sampled_index)# TODO 该批次下所有样本翻译结束if sum(ended) == bs:break# TODO target_one 永远只记录上一个预测出来的最新的单词target_one[:, 0] = sampled_indexes

在循环体中不断更新target_one,dec_outputs,其中target_one只表征当前一个单词,dec_outputs表征截止当前词之前在两层Decoder的K,V信息,每步计算出最终的Decoder输出output,使用贪婪搜索策略argmax来拿到每步得分最大的单词作为预测结果。

sampled_indexes = np.argmax(output[:, 0, :], axis=-1)

如果某条样本没有预测到结束则添加到最新翻译结果,否则不再添加新的预测单词

if sampled_index == end_mark:ended[ii] = 1
if not ended[ii]:decoded_indexes[ii].append(sampled_index)

最终等到该批次样本哦每一条都预测到end,跳出循环体任务结束

if sum(ended) == bs:break

Greedy Search贪婪搜索简述

Greedy Search贪婪搜索比较简单,每一步都选择概率最大的单词输出,最后组成整个句子输出。这种方法给出的结果一般情况结果比较差,因为只考虑了每一步的最优解,并不一定是全局最优,因为贪婪搜索会错过隐藏在低概率单词后面的高概率单词,另外当如果每个位置选错了,后续位置生成的内容很可能也是错误的,具有错误的累加效果。
贪婪搜索由于每步只需要关注最大得分,考虑的因素少,因此实现容易,执行速度快,因此在源码中作者将Greedy Search封装在decode_sequence_fast方法下,代表对序列的快速解码。

贪婪搜索示意图


解码器和贪婪搜索总结
  • 1.解码器在预测阶段从初始的占位符开始,利用历史前词和全局编码器结果,逐位预测下一个单词,知道预测到end停止
  • 2.解码器的输入作为Query,Query只输入当前最新单词信息,自注意力层的Key,Value需要手动维护历史并且拼接当前最新信息
  • 3.贪婪搜索的优点是实现简单,可作为解码的快速实现,但是它只考虑了每一步的局部最优并不一定是全局最优,往往效果较差

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

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

相关文章

Springboot vue elementui 前后端分离 事故灾害案例管理系统

源码链接 系统演示:https://pan.baidu.com/s/1hZQ25cpI-B4keFsZdlzimg?pwdgw48

Java集合概述

分类 分为两大类&#xff1a;Collection接口类和Map接口类 这两个接口都继承自一个共同的接口&#xff1a;Iterable接口&#xff0c;意为可迭代的 Iterable接口当中有一个Iterator迭代器接口对象&#xff0c;作为接口的变量&#xff08;public static final修饰&#xff09;…

Win10字体模糊?记好这5个方法,解决问题很简单!

“我的电脑是win10的&#xff0c;不知道是什么原因&#xff0c;电脑字体总是很模糊&#xff0c;大家有什么方法可以解决这个问题吗&#xff1f;” 在数字时代的浪潮中&#xff0c;Win10以其出色的性能和丰富的功能赢得了广大用户的青睐。然而&#xff0c;就像任何一款操作系统一…

广东电网突破2亿千瓦,华火新能源电燃灶引领绿色烹饪“灶”未来

近日&#xff0c;广东电网统调装机容量历史性突破2亿千瓦&#xff0c;标志着广东省在电力发展上迈出了坚实的步伐。这一重大成就不仅彰显了广东在能源领域的强劲实力&#xff0c;也为华火新能源电燃灶等绿色技术的普及应用提供了有力的支撑。 广东电网统调装机容量的突破&#…

【 0 基础 Docker 极速入门】镜像、容器、常用命令总结

Docker Images&#xff08;镜像&#xff09;生命周期 Docker 是一个用于创建、部署和运行应用容器的平台。为了更好地理解 Docker 的生命周期&#xff0c;以下是相关概念的介绍&#xff0c;并说明它们如何相互关联&#xff1a; Docker&#xff1a; Docker 是一个开源平台&#…

重生奇迹mu五大王国

勇者大陆王国 奇迹大陆的战士&#xff0c;他们因为非常重视剑&#xff0c;而且穿着黑色的衣服&#xff0c;所以叫他们魔剑士。古代勇者大陆王国的魔剑士们都是用铠甲伪装自己的。但是这些个联合国统一成一个帝国之后&#xff0c;勇者大陆王国渐渐成为一个小城市。千年之后的现…

数据持久化第七课-URL重写与Ajax

数据持久化第七课-URL重写与Ajax 一.预习笔记 1.URL重写(对网页地址进行保护) 首先编写module,实现对网络地址的处理 其次就是module的配置 最后验证url重写技术 2.Ajax数据交互 编写后端响应数据 处理跨域的配置问题 运行项目得到后端响应数据的地址 编写前端ajax进行数据请…

AI产品经理系列-如何使用kimi快速撰写用户故事(含提示词)

在AI时代&#xff0c;可能人人都可成为产品经理。 之前我们聊过如何使用kimi协助完成产品需求文档&#xff0c;如何写竞品分析报告&#xff0c;这一篇我们聊聊用户故事&#xff0c;如何使用kimi协助撰写产品需求文档中的用户故事。 在此之前我们先了解下什么是用户故事&#…

车牌号码智能监测识别摄像机

车牌号码智能监测识别摄像机是一项革命性的技术&#xff0c;为交通管理和安全提供了全新的解决方案。这种摄像机利用先进的人工智能和图像识别技术&#xff0c;能够实时监测道路上的车辆&#xff0c;并准确识别车辆的车牌号码&#xff0c;为交通管理和安全提供了强有力的支持。…

java 工作排序(Job Sequencing Problem)

给定一个作业数组&#xff0c;其中每个作业都有一个截止期限&#xff0c;如果作业在截止期限之前完成&#xff0c;则可获得相关利润。此外&#xff0c;每个作业都占用一个单位时间&#xff0c;因此任何作业的最小可能截止期限都是 1。如果一次只能安排一项作业&#xff0c;则最…

解决使用Python检查本地网络中运行的Web服务器的问题

如果我们要检查本地网络中运行的 Web 服务器&#xff0c;可以使用 Python 的 socket 模块来进行网络连接测试。以下是一个简单的示例代码&#xff0c;演示如何检查本地网络中运行的 Web 服务器&#xff1a; 1、问题背景 在学习如何使用 Python 时&#xff0c;一位用户希望编写…

从零开始:腾讯云轻量应用服务器上部署MaxKB项目(基于LLM大语言模型的知识库问答系统)

使用腾讯云轻量应用服务器部署和使用MaxKB项目 前言 一&#xff0c; MaxKB介绍 MaxKB是基于LLM大语言模型的知识库问答系统&#xff0c;旨在成为企业的最强大脑。它支持开箱即用&#xff0c;无缝嵌入到第三方业务系统&#xff0c;并提供多模型支持&#xff0c;包括主流大模型…

我们如何收到卫星信号?(导航电文,载波与测距码)

卫星信号 在介绍所有卫星信号之前&#xff0c;首先要明确一些概念&#xff1a; 所有的卫星信号&#xff0c;都是一段电磁波&#xff0c;用户接收的&#xff0c;也是一段电磁波。 但是我们认知中的电磁波&#xff0c;就是一段波&#xff0c;就像我们打出去的交一样&#xff0c…

【UML用户指南】-03-UML的14种图

目录 1、结构图 1、类图&#xff08;class diagram&#xff09; 2、对象图&#xff08;object diagram&#xff09; 3、构件图 &#xff08;component diagram&#xff09; 4、组合结构图 5、包图&#xff08;package diagram&#xff09; 6、部署图&#xff08;deploym…

零基础入门学习Python第二阶04SQL详解03

MySQL 新特性 JSON类型 很多开发者在使用关系型数据库做数据持久化的时候&#xff0c;常常感到结构化的存储缺乏灵活性&#xff0c;因为必须事先设计好所有的列以及对应的数据类型。在业务发展和变化的过程中&#xff0c;如果需要修改表结构&#xff0c;这绝对是比较麻烦和难…

如何用TCC方案轻松实现分布式事务一致性

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 哈喽,大家好!我是小米,一个热爱技术的活力小青年,今天要和大家分享的是一种在分布式系统中实现事务的一种经典方案——TCC(Try Confirm Canc…

【Ubuntu】超详细安装Ubuntu系统

鉴于有些小伙伴在安装Ubuntu系统的时候遇到很多问题&#xff0c;因此打算编写一篇记录一下安装Ubuntu系统的整个过程~互相学习&#xff01; 一、制作U盘启动 准备一个大于8G以上的U盘&#xff0c;这里我使用的是16G的U盘下载UltraISO工具 网站地址&#xff1a;UltraISO准备Ub…

C++ Primer 第五版 第15章 面向对象程序设计

面向对象程序设计基于三个基本概念&#xff1a;数据抽象、继承和动态绑定。 继承和动态绑定对编写程序有两方面的影响&#xff1a;一是我们可以更容易地定义与其他类相似但不完全相同的新类&#xff1b;二是在使用这些彼此相似的类编写程序时&#xff0c;我们可以在一定程度上…

HTML静态网页成品作业(HTML+CSS)—— 金宝贝儿童教育机构介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

Stable diffusion prompts 使用语法、参数讲解、插件安装教程

Stable diffusion prompts 使用语法、参数讲解、插件安装教程 本文基于 Stable diffusion WebUI 进行讲解&#xff08;安装在 AutoDL 上&#xff0c;安装在本地电脑上的也同样适用本教程&#xff09;。 初始界面&#xff1a; 文件目录结构&#xff1a; 上图红框中的 4 个文件…