96SEO 2026-02-19 11:02 14
几节进行了各种组件的学习和编码本节将组件组成transformer并对其进行测试

使用EncoderDeconder类实现编码器和解码器class
输出部分的类别生成器super(EncoderDecoder,self).__init__()self.encoder
self.encoder(self.src_embed(source),
self.decoder(self.tgt_embed(target),
self.decode(self.encode(source,
source_mask,target,target_mask)
-1.0851]]],grad_fnAddBackward0)
dropout0.1):该函数用来构建模型有7个参数分别是源数据特征(词汇)总数目标数据特征(词汇)总数编码器和解码器堆叠数词向量映射维度前馈全连接网络中变换矩阵的维度多头注意力结构中的多头数以及置零比率dropoutc
PositionalEncoding(d_mode,dropout)#
根据结构图最外层是EncoderDecoder在EncoderDecoder中#
分别是编码器层解码器层源数据Embedding层和位置编码组成的有序结构#
目标数据Embedding层和位置编码组成的有序结构以及类别生成器层。
在编码器层中有attention子层以及前馈全连接子层#
在解码器层中有两个attention子层以及前馈全连接层model
EncoderDecoder(Encoder(EncoderLayer(d_mode,
dropout),N),Decoder(DecoderLayer(d_mode,
c(attn),c(ff),dropout),N),nn.Sequential(Embeddings(d_mode,source_vocab),
c(position)),nn.Sequential(Embeddings(d_mode,
模型结构完成后接下来就是初始化模型中的参数比如线性层中的变换矩阵,这里一但判断参数的维度大于1#
p.dim()1:nn.init.xavier_uniform(p)return
subsequent_mask,attention,clones,MultiHeadedAttention,PositionwiseFeedForward,LayerNorm,SublayerConnection,Encoder,EncoderLayer
词嵌入维度self_attn:多头自注意对象需要QKVsrc_attn:多头注意力对象这里Q!KVfeed_forward:
前馈全连接层对象super(DecoderLayer,self).__init__()self.size
根据论文图使用clones克隆三个子层对象self.sublayer
clones(SublayerConnection(size,dropout),
源码数据掩码张量针对就是输入到解码器的数据target_mask:
目标数据掩码张量,针对解码器最后生成的数据一个一个的推理生成的词m
将x传入第一个子层结构第一个子层结构输入分别是x和self_attn函数因为是自注意力机制所以QKVx#
最后一个参数是目标数据掩码张量这时要对目标数据进行掩码因为此时模型可能还没有生成任何目标数据#
比如在解码器准备生成第一个字符或词汇时我们其实已经传入第一个字符以便计算损失#
但是我们不希望在生成第一个字符时模型能利用这个信息因为我们会将其遮掩同样生成第二个字符或词汇时#
模型只能使用第一个字符或词汇信息第二个字符以及以后得信息都不允许被模型使用x
self.self_attn(x,x,x,target_mask))#
紧接着第一层的输出进入第二个子层这个子层是常规的注意力机制但是q是输入xk、v是编码层输出memory#
但是进行源数据遮掩的原因并非是抑制信息泄露而是遮蔽掉对结果没有意义的的字符而产生的注意力#
self.src_attn(x,m,m,source_mask))#
最后一个子层就是前馈全连接子层经过他的处理后就可以返回结果这就是解码器层的结构return
self.sublayer[2](x,self.feed_forward)#
N解码器层的个数super(Decoder,self).__init__()self.layers
layer(x,memory,source_mask,target_mask)return
词表大小super(Generator,self).__init__()self.project
F.log_softmax(self.project(x),dim-1)#
使用EncoderDeconder类实现编码器和解码器class
输出部分的类别生成器super(EncoderDecoder,self).__init__()self.encoder
self.encoder(self.src_embed(source),
self.decoder(self.tgt_embed(target),
self.decode(self.encode(source,
source_mask,target,target_mask)#
dropout0.1):该函数用来构建模型有7个参数分别是源数据特征(词汇)总数目标数据特征(词汇)总数编码器和解码器堆叠数词向量映射维度前馈全连接网络中变换矩阵的维度多头注意力结构中的多头数以及置零比率dropoutc
PositionalEncoding(d_mode,dropout)#
根据结构图最外层是EncoderDecoder在EncoderDecoder中#
分别是编码器层解码器层源数据Embedding层和位置编码组成的有序结构#
目标数据Embedding层和位置编码组成的有序结构以及类别生成器层。
在编码器层中有attention子层以及前馈全连接子层#
在解码器层中有两个attention子层以及前馈全连接层model
EncoderDecoder(Encoder(EncoderLayer(d_mode,
dropout),N),Decoder(DecoderLayer(d_mode,
c(attn),c(ff),dropout),N),nn.Sequential(Embeddings(d_mode,source_vocab),
c(position)),nn.Sequential(Embeddings(d_mode,
模型结构完成后接下来就是初始化模型中的参数比如线性层中的变换矩阵,这里一但判断参数的维度大于1#
p.dim()1:nn.init.xavier_uniform(p)return
torch.LongTensor([[100,2,321,508],[321,234,456,324]])embr
512dropout0.2head8d_model512d_ff
MultiHeadedAttention(head,d_model,dropout)ff
PositionwiseFeedForward(d_model,d_ff,dropout)#
EncoderLayer(size,c(self_attn),c(ff),dropout)N8mask
en(x,mask)print(en_result.shape
,en_result.shape)print(en_result
512dropout0.2head8d_model512d_ff
MultiHeadedAttention(head,d_model,dropout)ff
PositionwiseFeedForward(d_model,d_ff,dropout)x
DecoderLayer(size,self_attn,src_attn,ff,dropout)dl_result
dl(x,memory,source_mask,target_mask)print(dl_result.shape
dl_result.shape)print(dl_result
512dropout0.2head8d_model512d_ff
MultiHeadedAttention(head,d_model,dropout)ff
PositionwiseFeedForward(d_model,d_ff,dropout)#
DecoderLayer(size,c(self_attn),c(self_attn),c(ff),dropout)N8mask
target_mask)print(de_result.shape
,de_result.shape)print(de_result
Generator(d_moded_model,vocab_sizevocab)gen_result
gen_result.shape)print(gen_result:
torch.LongTensor([[100,2,321,508],[321,234,456,324]])source_mask
target_mask)print(ed_result.shape:
ed_result.shape)print(ed_result:
target_vocab,6)print(res)打印模型层结构
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
MultiHeadedAttention((linears):
针对数字序列进行学习,学习的最终目标是使输出与输入的序列相同.如输入[1,5,8,9,3],输出也是[1,5,8,9,3].
copy任务在模型基础测试中具有重要意义因为copy操作对于模型来讲是一条明显规律,因此模型能否在短时间内小数据集中学会它可以帮助我们断定模型所有过程是否正常是否已具备基本学习能力.
该函数用于随机生成copy任务的数据它的三个输入参数是V:随机生成数字的最大值1#
batch:每次输送给模型更新一次参数的数据量num_batch:-共输送num_batch次完成一轮for
torch.from_numpy(np.random.randint(1,V,
size(batch,10),dtypeint64))data[:,0]1source
torch.tensor(data,requires_gradFalse)target
导入优化器工具包get_std_opt该工具用于获得标准的针对Transformer模型的优化器
导入标签平滑工具包该工具用于标签平滑标签平滑的作用就是小幅度的改变原有标签值的值域
因为在理论上即使是人工的标注数据也可能并非完全正确会受到一些外界因素的影响而产生一些微小的偏差
因此使用标签平滑来弥补这种偏差减少模型对某一条规律的绝对认知以防止过拟合。
通过下面示例了解更清晰
导入损失计算工具包该工具能够使用标签平滑后的结果进行损失的计算
第一个参数size代表目标数据的词汇总数也是模型最后一层得到张量的最后一维大小
这里是5说明目标词汇总数是5个第二个参数padding_idx表示要将那些tensor中的数字
替换成0一般padding_idx0表示不进行替换。
第三个参数smoothing表示标签的平滑程度
如原来标签的表示值为1则平滑后它的值域变为[1-smoothing1smoothing].
使用SimpleLossCompute获取到标签平滑结果的损失计算方法
SimpleLossCompute(model.generator,criterion,model_optimizer)#
训练时batchsize是20run_epoch(data_generator(V,8,20),model,loss)model.eval()run_epoch(data_generator(V,8,5),model,loss)if
的版本很低但是好像这个库也不升级了所以你如果想要跑通就需要修改下面两个地方
从上面可以看到get_std_opt需要用到嵌入向量的维度但是没有这个值这个时候可以从两个地方修改一个是我们embeding的类增加这个属性即
该函数用于随机生成copy任务的数据它的三个输入参数是V:随机生成数字的最大值1#
batch:每次输送给模型更新一次参数的数据量num_batch:-共输送num_batch次完成一轮for
torch.from_numpy(np.random.randint(1,V,
size(batch,10),dtypeint64))data[:,0]1source
torch.tensor(data,requires_gradFalse)target
导入优化器工具包get_std_opt该工具用于获得标准的针对Transformer模型的优化器
导入标签平滑工具包该工具用于标签平滑标签平滑的作用就是小幅度的改变原有标签值的值域
因为在理论上即使是人工的标注数据也可能并非完全正确会受到一些外界因素的影响而产生一些微小的偏差
因此使用标签平滑来弥补这种偏差减少模型对某一条规律的绝对认知以防止过拟合。
通过下面示例了解更清晰
导入损失计算工具包该工具能够使用标签平滑后的结果进行损失的计算
第一个参数size代表目标数据的词汇总数也是模型最后一层得到张量的最后一维大小
这里是5说明目标词汇总数是5个第二个参数padding_idx表示要将那些tensor中的数字
替换成0一般padding_idx0表示不进行替换。
第三个参数smoothing表示标签的平滑程度
如原来标签的表示值为1则平滑后它的值域变为[1-smoothing1smoothing].
使用SimpleLossCompute获取到标签平滑结果的损失计算方法
SimpleLossCompute(model.generator,criterion,model_optimizer)#
训练时batchsize是20run_epoch(data_generator(V,8,20),model,loss)model.eval()run_epoch(data_generator(V,8,5),model,loss)#
导入贪婪解码工具包greedy_decode该工具将对最终结进行贪婪解码贪婪解码的方式是每次预测都选择概率最大的结果作为输出
训练时batchsize是20run_epoch(data_generator(V,8,20),model,loss)model.eval()run_epoch(data_generator(V,8,5),model,loss)model.eval()#
torch.LongTensor([[1,8,3,4,10,6,7,2,9,5]])#
定义源数据掩码张量因为元素都是1在我们这里1代表不遮掩因此相当于对源数据没有任何遮掩.source_mask
最后将modelsrcsrc_mask解码的最大长度限制max_len默认为10#
max_len10,start_symbol1)print(result)if
torch.LongTensor([[1,8,3,4,10,6,7,2,9,5]])
推理出来的结果是完全正确的因为我把epoch设置为50了如果是10就会有错误的情况大家可以尝试
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback