从RNN到Transformer:生成式AI自回归模型的全面剖析
个人主页:chian-ocean
文章专栏
生成式AI中的自回归模型详解
在生成式AI的飞速发展中,自回归模型作为核心技术之一,成为文本生成、语音合成、图像生成等领域的重要支柱。本文将全面探讨自回归模型的原理、架构、实际应用,并结合代码示例分析其在自然语言处理(NLP)中的实现。

1. 什么是自回归模型?
自回归模型的定义
自回归模型是一种基于历史信息预测未来的生成模型。它假设当前的输出可以完全由之前的输出推导而来。这种机制被广泛应用于时间序列分析,而在生成式AI中,它的核心理念体现在逐步生成目标内容(如文本、音频或图像)。
在自然语言生成任务中,自回归模型会基于前面的单词或字符,逐步预测序列中的下一个元素。一个典型的公式是:
[
P(x) = P(x_1) P(x_2 | x_1) P(x_3 | x_1, x_2) \dots P(x_n | x_1, x_2, \dots, x_{n-1})
]
其中:
- ( P(x_i | x_1, x_2, \dots, x_{i-1}) ) 表示在给定前序元素的条件下,生成第 ( i ) 个元素的概率。
2. 自回归模型在生成式AI中的架构
2.1 RNN与自回归生成
在生成式AI的发展初期,循环神经网络(RNN)被广泛用于构建自回归生成模型。它通过隐藏状态 ( h_t ) 来捕获序列中的历史信息:
[
h_t = f(h_{t-1}, x_t)
]
生成过程中,RNN依赖每一步的历史状态和当前输入来预测下一步的结果。
import torch
import torch.nn as nnclass RNNGenerator(nn.Module):def __init__(self, vocab_size, embedding_dim, hidden_dim):super(RNNGenerator, self).__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)self.rnn = nn.RNN(embedding_dim, hidden_dim, batch_first=True)self.fc = nn.Linear(hidden_dim, vocab_size)def forward(self, x, hidden):embeds = self.embedding(x)out, hidden = self.rnn(embeds, hidden)out = self.fc(out)return out, hidden# 初始化模型
vocab_size = 10000
embedding_dim = 128
hidden_dim = 256
model = RNNGenerator(vocab_size, embedding_dim, hidden_dim)
然而,RNN模型存在梯度消失和长距离依赖问题,这限制了其在复杂生成任务中的表现。
2.2 Transformer架构的引入
Transformer模型在自回归生成中的应用突破了RNN的限制,成为当前生成式AI的主流架构。Transformer通过注意力机制捕获全局上下文信息,并支持并行计算,极大地提高了生成速度和质量。
自回归生成的核心:掩码多头注意力
在自回归生成中,Transformer的解码器模块通过掩码多头注意力机制确保每一步的生成只依赖于之前的元素:
[
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
]
其中,掩码机制将未生成的部分屏蔽,以避免泄漏未来信息。
import torch.nn.functional as Fclass TransformerDecoder(nn.Module):def __init__(self, vocab_size, embedding_dim, num_heads, num_layers):super(TransformerDecoder, self).__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)self.layers = nn.ModuleList([nn.TransformerDecoderLayer(d_model=embedding_dim, nhead=num_heads)for _ in range(num_layers)])self.fc = nn.Linear(embedding_dim, vocab_size)def forward(self, x, memory, tgt_mask):x = self.embedding(x)for layer in self.layers:x = layer(x, memory, tgt_mask=tgt_mask)return self.fc(x)# 生成掩码矩阵
def generate_tgt_mask(size):mask = torch.triu(torch.ones(size, size), diagonal=1)mask = mask.masked_fill(mask == 1, float('-inf'))return mask
3. 自回归模型的实际应用
3.1 文本生成
自回归模型在文本生成中通过逐词生成句子。以下是使用Transformer架构进行文本生成的简化示例:
def generate_text(model, start_token, max_len, vocab):model.eval()generated = [start_token]for _ in range(max_len):input_seq = torch.tensor(generated).unsqueeze(0)tgt_mask = generate_tgt_mask(len(generated))logits = model(input_seq, None, tgt_mask)next_token = logits.argmax(-1).item()generated.append(next_token)if next_token == vocab['<eos>']:breakreturn ' '.join([vocab.itos[idx] for idx in generated])
3.2 图像生成
在图像生成领域,自回归模型(如PixelRNN、PixelCNN)逐像素生成图像,每个像素值依赖于之前生成的像素。
class PixelCNN(nn.Module):def __init__(self, input_channels, hidden_dim, kernel_size):super(PixelCNN, self).__init__()self.conv1 = nn.Conv2d(input_channels, hidden_dim, kernel_size, padding=kernel_size//2)self.conv2 = nn.Conv2d(hidden_dim, hidden_dim, kernel_size, padding=kernel_size//2)self.out = nn.Conv2d(hidden_dim, input_channels, kernel_size=1)def forward(self, x):x = F.relu(self.conv1(x))x = F.relu(self.conv2(x))return self.out(x)
PixelCNN通过条件概率的方式预测每个像素的值,适合于高分辨率图像的生成。
4. 自回归模型的局限性
尽管自回归模型在生成任务中表现出色,但其仍存在一些问题:
- 生成效率低下:逐步生成的方式导致推理速度较慢,尤其是处理长序列时。
- 错误累积问题:早期生成的错误可能会随着生成过程放大,导致生成质量下降。
- 上下文长度限制:对于非常长的序列,模型可能无法捕获远距离依赖。
5. 解决方案与改进方向
5.1 非自回归生成
非自回归生成通过并行方式生成所有输出元素,显著提高了生成速度。例如,模型可以在预测时同时输出整段文本。
# 非自回归Transformer
class NonAutoregressiveTransformer(nn.Module):def __init__(self, vocab_size, embedding_dim):super(NonAutoregressiveTransformer, self).__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)self.encoder = nn.TransformerEncoder(nn.TransformerEncoderLayer(d_model=embedding_dim, nhead=8), num_layers=6)self.decoder = nn.Linear(embedding_dim, vocab_size)def forward(self, x):x = self.embedding(x)encoded = self.encoder(x)return self.decoder(encoded)
5.2 混合策略
将自回归与非自回归生成结合,利用自回归模型的质量优势和非自回归模型的效率优势。
6. 总结
自回归模型作为生成式AI的核心技术,推动了文本、图像、音频等领域的革命性进展。从早期的RNN到如今的Transformer,自回归模型不断突破性能瓶颈。未来,通过引入更高效的非自回归生成方法,生成式AI将进一步释放其潜力,为更多领域带来技术革新。
相关文章:
从RNN到Transformer:生成式AI自回归模型的全面剖析
个人主页:chian-ocean 文章专栏 生成式AI中的自回归模型详解 在生成式AI的飞速发展中,自回归模型作为核心技术之一,成为文本生成、语音合成、图像生成等领域的重要支柱。本文将全面探讨自回归模型的原理、架构、实际应用,并结合…...
Java爬虫大冒险:如何征服1688商品搜索之巅
在这个信息爆炸的时代,数据就是力量。对于电商平台而言,数据更是金矿。今天,我们要踏上一场Java爬虫的冒险之旅,目标是征服1688这个B2B电商巨头,获取按关键字搜索的商品信息。这不仅是技术的挑战,更是智慧的…...
基于Spring Boot的无可购物网站系统
一、系统背景与意义 随着互联网的快速发展,电子商务已经成为人们日常生活的重要组成部分。构建一个稳定、高效、可扩展的电商平台后端系统,对于满足用户需求、提升用户体验、推动业务发展具有重要意义。Spring Boot作为当前流行的Java开发框架ÿ…...
智能人家谱程序创意
实现一个家谱程序,并结合自传、视频、图片资料和智能对话系统,涉及到多个领域的技术:自然语言处理(NLP)、机器学习、计算机视觉、多媒体处理和数据存储。下面,我为你制定一个可执行的计划,详细阐…...
Redis 7.x哨兵模式如何实现?基于Spring Boot 3.x版
大家好,我是袁庭新。 在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中࿰…...
解决QTCreator在Debug时无法显示std::string类型的问题
环境: 操作系统:Ubuntu 20.04.6 LTS QT版本:Qt Creator 4.11.0 问题: Debug时,无法显示std::string类型的值,如下图: 解决方法: 修改/usr/share/qtcreator/debugger/stdtypes.py…...
leetcode 面试经典 150 题:无重复字符的最长子串
链接无重复字符的最长子串题序号3类型字符串解题方法滑动窗口难度中等 题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 …...
0101多级nginx代理websocket配置-nginx-web服务器
1. 前言 项目一些信息需要通过站内信主动推动给用户,使用websocket。web服务器选用nginx,但是域名是以前通过阿里云申请的,解析ip也是阿里云的服务器,甲方不希望更换域名。新的系统需要部署在内网服务器,简单拓扑图如…...
【前端】Jquery拍照,通过PHP将base64编码数据转换成PNG格式,并保存图像到本地
目录 一、需求 二、开发语言 三、效果 四、业务逻辑: 五、web端调用摄像头 六、示例代码 1、前端 2、后端 一、需求 web端使用jquery调用摄像头拍照,并使用PHP把base64编码转换成png格式图片,下载到本地。 由于js不能指定图片存储的…...
websocket再项目中的使用
WebSocket在项目中的使用主要包括以下几个方面: WebSocket的基本概念和原理: 定义:WebSocket是一种基于TCP的协议,实现了浏览器与服务器之间的全双工通信。它通过HTTP/1.1协议的101状态码进行握手,建立连接…...
ajax同步执行async:false无效的解决方法
无效的情况: function ManHourCheck() {var StartDate $("#StartDate").val();//日报日期var EndDate $("#EndDate").val();//完成日期var UserID $("#UserID").val();//员工ID$.ajax({async: false,//加了这一行也没用!!!!!!!!!!…...
基于Qt的登陆界面设计
目标 自由发挥登录界面的应用场景,实现一个登录窗口的界面。 要求:每行代码都要有注释 代码 // 设置窗口大小为600x400像素 this->resize(600,400); // 设置窗口标题为"TheWitcher 巫师3:狂猎" this->setWindowTitle(&qu…...
HarmonyOS 输入框组件:TextInput 和 TextArea 深度解析
输入框组件是移动端开发中最常见的组件之一,常用于响应用户的输入操作,比如评论区的文本输入、聊天框的消息输入、表单内容填写等场景。在 HarmonyOS 中,TextInput 和 TextArea 分别用于单行和多行输入操作。除此之外,它们还可以与…...
【Golang】 Go 语言中的 Struct、JSON 和 Map 互转:详细指南
Go 语言中的 Struct、JSON 和 Map 互转:详细指南 在 Go 语言中,处理 JSON 数据、结构体类型和映射(map)是与 API、配置或数据库交互时非常常见的任务。理解如何在这些数据类型之间无缝转换对于高效的 Go 编程至关重要。以下是如何将 Go 结构体转换为 JSON、将 JSON 转换为…...
Azure Function流式返回
最近用azure function做了一个api和llm交互,需要流式返回。但是默认不支持流返回,搜索了一下。记录。 官方文档:https://techcommunity.microsoft.com/blog/azurecompute/azure-functions-support-for-http-streams-in-python-is-now-in-prev…...
智能座舱进阶-应用框架层-Jetpack主要组件
Jetpack的分类 1. DataBinding:以声明方式将可观察数据绑定到界面元素,通常和ViewModel配合使用。 2. Lifecycle:用于管理Activity和Fragment的生命周期,可帮助开发者生成更易于维护的轻量级代码。 3. LiveData: 在底层数据库更…...
GitLab分支管理策略和最佳实践
分支管理是 Git 和 GitLab 中非常重要的部分,合理的分支管理可以帮助团队更高效地协作和开发。以下是一些细化的分支管理策略和最佳实践: 1. 分支命名规范 • 主分支:通常命名为 main 或 master,用于存放稳定版本的代码。 • …...
【Unity】【VR开发】实现VR屏幕共享应用的几个重要插件和参考资料分享
【背景】 做了一个可以在局域网远程屏幕的VR应用,如果有相同兴趣的朋友也可以参考下我用的几个插件。 【使用或相关的关键插件】 piping server:这个是最基底的插件,基于它实现的信令通信。 https://github.com/nwtgck/piping-server/blob…...
数据结构---------二叉树前序遍历中序遍历后序遍历
以下是用C语言实现二叉树的前序遍历、中序遍历和后序遍历的代码示例,包括递归和非递归(借助栈实现)两种方式: 1. 二叉树节点结构体定义 #include <stdio.h> #include <stdlib.h>// 二叉树节点结构体 typedef struct…...
浏览器引入elasticsearch-head插件
elasticsearch-head插件下载: 链接: https://pan.baidu.com/s/1Dz3aU42HZCNg45iJoDOsMg?pwduvhg 提取码: uvhg 1、打开浏览器设置 2、选择拓展程序 3、选择elasticsearch-head插件下载 4、打开es-head插件 5、修改ip 6、登录...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14
什么是 Pattern Matching(模式匹配) ❝ 模式匹配就是一种“描述式”的写法,不需要你手动判断、提取数据,而是直接描述你希望的数据结构是什么样子,系统自动判断并提取。❞ 你给的定义拆解: ✴ Instead of …...
使用 uv 工具快速部署并管理 vLLM 推理环境
uv:现代 Python 项目管理的高效助手 uv:Rust 驱动的 Python 包管理新时代 在部署大语言模型(LLM)推理服务时,vLLM 是一个备受关注的方案,具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...
第2课 SiC MOSFET与 Si IGBT 静态特性对比
2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...
RFID推动新能源汽车零部件生产系统管理应用案例
RFID推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域,电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式,存在单点位单独头溯源、网关布线…...
World-writable config file /etc/mysql/mysql.conf.d/my.cnf is ignored
https://stackoverflow.com/questions/53741107/mysql-in-docker-on-ubuntu-warning-world-writable-config-file-is-ignored 修改权限 -> 重启mysql # 检查字符集配置 SHOW VARIABLES WHERE Variable_name IN (character_set_server, character_set_database ); --------…...
