news 2026/8/11 3:57:59

序列到序列-seq2seq

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
序列到序列-seq2seq

编码器-解码器架构(序列到序列问题的基础框架)

机器翻译是序列转换模型的一个核心问题, 其输入和输出都是长度可变的序列

编码器(encoder): 它接受一个长度可变的序列作为输入, 并将其转换为具有固定形状的编码状态。
解码器(decoder): 它将固定形状的编码状态映射到长度可变的序列


架构代码体现:

Encoder接收输入序列 X,返回编码输出

Decoder先用 init_state 接收编码器的状态,再用 forward 逐步生成输出

把前两者串联起来,定义完整的数据流

Seq2seq(序列到序列学习)

核心思想:是用两个循环神经网络(RNN)分别充当编码器和解码器

以翻译模型为例:

特定的“<eos>”表示序列结束词元,一旦输出序列生成此词元,模型就会停止预测

特定的“<bos>”表示序列开始词元,它是解码器的输入序列的第一个词元。 其次,使用循环神经网络编码器最终的隐状态来初始化解码器的隐状态。

*训练翻译模型时因为知道具体的输入对应的输出,可以在解码器部分连续的更新
但是如果是句子推理模型就有点区别了

衡量生成序列的好坏:BLUE

BLEU 通过比较预测序列与标签(参考)序列之间的n-gram 重叠程度来衡量生成质量。

如何计算n-gram:
预测中某个 n-gram 的匹配次数,不能超过它在标签中出现的次数
【例】标签:A,B,C,D,E,F 序列:A,B,B,C,D
计算n= 1,p1

(第二个B的匹配次数大于标签出现次数不能匹配)

当n=2时,p2

如何计算BLUE?

左侧:长度惩罚,预测长度短于标签长度,min会取负数,exp一个负数就会降低分数
其余min取0,不会降低分数
右侧:加权几何平均

具体的实现:

编码器RNN的实现

嵌入层:vocab_size 个词,每个变成 embed_size 维向量,把词元索引变成稠密向量

*用低维稠密向量反应词义的远近(随机的索引反应不出)

GRU 循环网络:逐个读取词元,更新隐状态,最终把整句话"压缩"成一个状态向量

X为输入一批句子,每个句子有 num_steps 个词元索引

embedding 嵌入后形状: (batch_size, num_steps, embed_size)

output:所有时间步的输出(这里用不到)
state:最后一个时间步的隐藏状态(包含了对这个句子的最终理解)

解码器RNN的实现:

每个时间步t,解码器输出yt的概率取决于:

1.已经生成的词:y1,y2,...,yt′−1​

2.上下文变量:c (编码器给的整句语义)

因为要得到序列的输出,所以相比于incoder多了一个dense层

GRU 输入维度 =embed_size + num_hiddens

初始的隐藏状态为incoder最后的输出state

context = state[-1].repeat(X.shape[0], 1, 1)
# state[-1] 形状: (batch_size, num_hiddens) 最后一层的最终隐状态
# repeat 后形状: (num_steps, batch_size, num_hiddens)
为什么要repeat?
编码器的上下文c只有一个(对应最后一个时间步),但解码器要生成 num_steps 个词每个时间步生成都需要看到源句子的语义,所以把 c 复制 num_steps 次,让每个时间步都能"读到"它。

之前数据处理对于长度不足的数据进行了padding,我们应该将填充词元的预测排除在损失函数的计算之外

损失函数:

1.创建全1的权重矩阵,和 label 形状相同
2.用 sequence_mask 把填充位置置0,有效位置=1,填充位置=0
3设置 reduction='none',让父类返回每个位置的损失
4.计算交叉熵

训练:

训练时,解码器需要逐个词生成翻译。如果让模型自己生成:
第1步猜错了 -> 第2步基于错误输入继续错 -> 错误像滚雪球一样累积
Teacher Forcing 的解决方案:训练时,解码器的输入不用模型自己生成的,而是用真实标签(ground truth)。


初始化参数


优化器和损失函数

按epoch训练

构造一个<bos>列向量作为输入

每个时间步,解码器看到"正确答案的上一词",预测"当前词"。

反向传播,梯度裁剪,参数更新

预测:
和训练时最大的区别是:没有 Teacher Forcing 了,模型必须自己生成一个词,再用这个词作为下一步的输入。
核心部分:

BLUE的实现:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 3:54:03

Linux下GStreamer开发环境搭建与入门实战指南

1. 项目概述&#xff1a;为什么要在Linux上折腾GStreamer&#xff1f;如果你刚接触Linux多媒体开发&#xff0c;或者想给自己的应用加点音视频处理能力&#xff0c;GStreamer这个名字你肯定绕不过去。它不是什么新潮玩意儿&#xff0c;但在Linux世界里&#xff0c;它就像空气和…

作者头像 李华
网站建设 2026/8/11 3:53:04

【8月压轴会议投稿】18场EI高录用会议截稿倒计 | 2026年28-30日EIScopus国际学术会议合集:计算机//云计算/制造/人工智能等跨学科投稿优选清单,适用毕业结题/职称,高录用检索快!

2026年8月28-30日期间&#xff0c;中国多地将举办系列国际学术会议&#xff0c;涵盖水利工程、人工智能、智能交通、材料科学、信息技术等领域。主要会议包括&#xff1a;佛山HECT2026水利工程会议、青岛AIEE2026人工智能教育研讨会、武汉SSSD2026智能社会会议、广州ICAMIM2026…

作者头像 李华
网站建设 2026/8/11 3:52:35

WebSocket协议爬虫:Python实时抓取股票Level-2行情完全指南

前言 在量化交易和金融数据分析领域,Level-2行情数据(也称为"深度行情"或"逐笔数据")是比普通Level-1行情(盘口五档)更加细致、高频的市场数据。它包含了买卖盘的十档委托队列、逐笔成交明细、最优买卖价、委托总量等丰富信息,是专业交易者和量化策…

作者头像 李华
网站建设 2026/8/11 3:51:28

MySQL优化器选错索引?一文搞懂采样统计、基数偏差与3种避坑方案

课程&#xff1a;B站大学 记录学习极客时间团队MySQL45讲&#xff0c;进阶数据分析和数据处理 MySQL普通索引和唯一索引MySQL实战&#xff1a;普通索引和唯一索引&#xff0c;应该怎么选择&#xff1f;一、问题背景二、查询过程&#xff1a;性能差异微乎其微2.1 查找过程2.2 普…

作者头像 李华
网站建设 2026/8/11 3:50:17

LangGraph:构建复杂AI工作流的状态驱动图编程框架

1. 从LangChain到LangGraph&#xff1a;为什么我们需要一个新的“图”&#xff1f;如果你在过去一年里折腾过大模型应用开发&#xff0c;LangChain这个名字大概率不会陌生。它像是一套乐高积木&#xff0c;把提示词模板、记忆、工具调用这些组件都给你准备好了&#xff0c;让你…

作者头像 李华