news 2026/6/10 0:51:51

AI大模型实战——深入理解Seq2Seq

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI大模型实战——深入理解Seq2Seq

目录

    • 一、Seq2Seq
    • 二、基本概念
      • 2.1、编码器
      • 2.2、解码器
      • 2.3、注意力机制(可选)
    • 三、工作原理
      • 3.1、模型训练
      • 3.2、模型验证
      • 3.3、完整代码

本文来源:极客时间vip课程笔记

注:后续技术类文章会同步到我的公众号里,搜索公众号小志的博客感兴趣的读友可以去找来看看。

一、Seq2Seq

  • Seq2Seq(Sequence-to-Sequence),顾名思义是从一个序列到另一个序列的转换。它不仅仅能理解单词之间的关系,而且还能把整个句子的意思打包,并解压成另一种形式的表达。如果说 Word2Vec 是让我们的机器学会了理解词汇的话,那 Seq2Seq 则是教会了机器如何理解句子并进行相应地转化。
  • 在这个过程中,我们会遇到两个核心的角色:编码器(Encoder)和解码器(Decoder)。编码器的任务是理解和压缩信息,就像是把一封长信函整理成一个精简的摘要;而解码器则需要将这个摘要展开,翻译成另一种语言或形式的完整信息。这个过程有一定的挑战,比如如何确保信息在这次转换中不丢失精髓,而是以新的面貌精准地呈现出来,这就是我们接下来要探索的内容之一。

二、基本概念

  • Seq2Seq 也是一种神经网络架构,模型的核心由两部分组成:编码器(Encoder)和解码器(Decoder)。你可以看一下这个架构的示意图。

2.1、编码器

  • 编码器的任务是读取并理解输入序列,然后把它转换为一个固定长度的上下文向量,也叫作状态向量。这个向量是输入序列的一种内部表示,捕捉了序列的关键信息。编码器通常是一个循环神经网络(RNN)或其变体,比如长短期记忆网络(LSTM)或门控循环单元(GRU),它们能够处理不同长度的输入序列,并且记住序列中的长期依赖关系。

2.2、解码器

  • 解码器的任务是接收编码器生成的上下文向量,并基于这个向量生成目标序列。解码过程是一步步进行的,每一步生成目标序列中的一个元素,比如一个词或字符,直到生成特殊的结束符号,表示输出序列的结束。解码器通常也是一个 RNN、LSTM 或 GRU,它不仅依赖于编码器的上下文向量,还可能依赖于自己之前的输出,来生成下一个输出元素。

2.3、注意力机制(可选)

  • 在编码器和解码器之间,可能还会有一个注意力机制(Attention Mechanism)。注意力机制使解码器能够在生成每个输出元素时“关注”输入序列中的不同部分,从而提高模型处理长序列和捕捉复杂依赖关系的能力。编码器、解码器、注意力机制之间是怎样协作的呢?你可以看一下我给出的示意图。

三、工作原理

  • 我们先从模型的训练开始,Seq2Seq 的训练和 Word2Vec 不太一样,因为我们讲解的是中英文翻译场景,所以训练的时候,训练数据是中英文数据对。Seq2Seq 的训练会比 Word2Vec 更加复杂一些。上节课的 Word2Vec,我们使用的是 gensim 库提供的基础模型,直接进行训练,这节课我们完全从头写起,训练一个 Seq2Seq 模型。

3.1、模型训练

  • 我们先准备训练数据,可以在网上找公开的翻译数据集,我们用的是 AIchallenger 2017,这个数据集有 1000 万对中英文数据,不过因为电脑配置问题,我直接从里面中文和英文的部分各取了 10000 条进行训练。数据集名称是 train_1w.zh和 train_1w.en。

    cn_sentences=[]zh_file_path="train_1w.zh"# 使用Python的文件操作逐行读取文件,并将每一行的内容添加到列表中withopen(zh_file_path,"r",encoding="utf-8")as file:forline in file:# 去除行末的换行符并添加到列表中 cn_sentences.append(line.strip())en_sentences=[]en_file_path="train_1w.en"# 使用Python的文件操作逐行读取文件,并将每一行的内容添加到列表中withopen(en_file_path,"r",encoding="utf-8")as file:forline in file:# 去除行末的换行符并添加到列表中 en_sentences.append(line.strip())
  • 接下来,基于训练数据集构建中文和英文的词汇表,将每个词映射到一个唯一的索引(integer)。

    # cn_sentences 和 en_sentences 分别包含了所有的中文和英文句子 cn_vocab=build_vocab(cn_sentences,tokenize_cn,max_size=10000,min_freq=2)en_vocab=build_vocab(en_sentences,tokenize_en,max_size=10000,min_freq=2)
  • 我们再来看 biild_vocab 的源码。

    defbuild_vocab(sentences,tokenizer,max_size,min_freq):token_freqs=Counter()forsentence in sentences:tokens=tokenizer(sentence)token_freqs.update(tokens)vocab={token:idx+4foridx,(token,freq)inenumerate(token_freqs.items())iffreq>=min_freq}vocab['<unk>']=0vocab['<pad>']=1vocab['<sos>']=2vocab['<eos>']=3returnvocab
  • 思路就是把所有的句子读进去,循环分词,放入字典,放的时候要判断一下是否大于等于 min_freq,用来过滤掉出现频率较低的词汇,最后构建出来的词汇表如下:

    vocab={'<unk>':0,'<pad>':1,'<sos>':2,'<eos>':3,'i':4,'like':5,'learning':6,'machine':7,'is':8,'very':9,'interesting':10,...}
  • 我们来看一下里面比较重要的几个部分。

    < unk >:未知单词,表示在训练数据中没有出现过的单词。当模型在处理输入文本时遇到未知单词时,会用这个标记来表示。

    < pad>:填充单词,用于将不同长度的序列填充到相同的长度。在处理批次数据时,由于不同序列的长度可能不同,因此需要用这个标记把短序列填充到与最长序列相同的长度,以便进行批次处理。

    < sos>:句子起始标记,表示句子的开始位置。在 Seq2Seq 模型中,通常会在目标句子的开头添加这个标记,以指示解码器开始生成输出。

    < eos>:句子结束标记,表示句子的结束位置。在 Seq2Seq 模型中,通常会在目标句子的末尾添加该标记,以指示解码器生成结束。

  • 创建训练数据集,将数据处理成方便训练的格式:语言序列,比如 [1,2,3,4]。

    dataset=TranslationDataset(cn_sentences,en_sentences,cn_vocab,en_vocab,tokenize_cn,tokenize_en)train_loader=DataLoader(dataset,batch_size=32,collate_fn=collate_fn)
  • 然后检测是否有显卡:

    # 检查是否有可用的GPU,如果没有,则使用CPUdevice=torch.device("cuda"iftorch.cuda.is_available()else"cpu")print("训练设备为:",device)
  • 创建模型,参数的解释可以参考代码注释。

    # 定义一些超参数 INPUT_DIM=10000# 输入语言的词汇量 OUTPUT_DIM=10000# 输出语言的词汇量 ENC_EMB_DIM=256# 编码器嵌入层大小,也就是编码器词向量维度 DEC_EMB_DIM=256# 解码器嵌入层大小,解码器词向量维度 HID_DIM=512# 隐藏层维度 N_LAYERS=2# RNN层的数量 ENC_DROPOUT=0.5# 编码器神经元输出的数据有50%会被随机丢掉 DEC_DROPOUT=0.5# 解码器同上 enc=Encoder(INPUT_DIM,ENC_EMB_DIM,HID_DIM,N_LAYERS,ENC_DROPOUT)dec=Decoder(OUTPUT_DIM,DEC_EMB_DIM,HID_DIM,N_LAYERS,DEC_DROPOUT)model=Seq2Seq(enc,dec,device).to(device)# 假定模型已经被实例化并移到了正确的设备上 model.to(device)# 定义优化器和损失函数 optimizer=optim
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 15:03:05

用AI撰写高质量网络小说:脑洞生成实操指南

网络小说的核心竞争力&#xff0c;往往藏在“脑洞”里——一个新奇、合理又有延展性的脑洞&#xff0c;能快速抓住读者注意力&#xff0c;让作品在海量内容中脱颖而出。但脑洞的诞生并非偶然&#xff0c;很多创作者都会陷入“灵感枯竭”的困境&#xff0c;反复纠结于设定老套、…

作者头像 李华
网站建设 2026/6/9 23:38:10

AI辅助网络小说创作:高质量脑洞生成实操(附Python代码)

网络小说的出圈关键&#xff0c;往往在于“脑洞”的独特性——一个新奇、逻辑自洽且有延展性的脑洞&#xff0c;能快速打破内容同质化困境&#xff0c;抓住读者注意力。但灵感枯竭是创作者的常态&#xff0c;反复陷入设定老套、剧情俗套、反转生硬的瓶颈&#xff0c;耗时费力却…

作者头像 李华
网站建设 2026/6/6 16:00:28

Angular 前端端口号修改的几种方式

4200 被占是 Angular 开发里最常见的问题之一。 按 从“临时 → 永久” 给你排一下&#xff0c;挑最适合你的。 方法一&#xff08;最快&#xff09;&#xff1a;启动时指定端口【最常用】 在项目根目录直接运行&#xff1a; ng serve --port 4300或者顺手把 host 也一起指定&a…

作者头像 李华
网站建设 2026/6/9 23:35:38

百度AI:让电脑和手机也能像人一样操作屏幕的智能助手诞生了

想象一下&#xff0c;如果你的电脑或手机能像真人一样看懂屏幕上的内容&#xff0c;知道哪个按钮该点击&#xff0c;哪个输入框该填写&#xff0c;甚至还能帮你完成复杂的多步操作任务&#xff0c;那会是什么样的体验&#xff1f;这听起来像是科幻电影里的情节&#xff0c;但百…

作者头像 李华
网站建设 2026/6/5 9:52:10

备份了,却救不了你?警惕这三种“伪备份”陷阱

很多企业都以为自己有备份——U盘拷过、网盘同步过、甚至买了专业备份软件……可当勒索病毒真正来袭、硬盘突然崩溃时&#xff0c;却发现&#xff1a;备份根本用不了。这不是危言耸听&#xff0c;而是无数中小企业踩过的坑。今天&#xff0c;我们不谈功能多强大&#xff0c;只聊…

作者头像 李华
网站建设 2026/6/5 8:56:43

【软件测试】9_性能测试实战 _性能测试监控

文章目录一、性能测试监控关键指标1.1 系统指标1.2 硬件服务器资源指标1.2.1 CPU、内存、磁盘1.2.2 CPU使用率1.2.3 CPU占用分类1.2.4 内存和虚拟内存1.2.5 磁盘IO1.2.6 网络1.3 JAVA应用1.3.1 JVM-java虚拟机1.3.2 JAVA虚拟机内存1.3.3 FULL GC机制1.4 数据库监控1.4.1 慢查询…

作者头像 李华