当前位置: 首页 > news >正文

网站建设费如何入帐织梦门户网站

网站建设费如何入帐,织梦门户网站,中山市两学一做网站,网站制作多久能完成#x1f468;‍#x1f393;作者简介#xff1a;一位即将上大四#xff0c;正专攻机器学习的保研er #x1f30c;上期文章#xff1a;机器学习深度学习——自注意力和位置编码#xff08;数学推导代码实现#xff09; #x1f4da;订阅专栏#xff1a;机器… ‍作者简介一位即将上大四正专攻机器学习的保研er 上期文章机器学习深度学习——自注意力和位置编码数学推导代码实现 订阅专栏机器学习深度学习 希望文章对你们有所帮助 transformer机器翻译的再实现 引入模型基于位置的前馈网络残差连接和层规范化为何使用层规范化 编码器解码器训练小结 引入 上一节比较了CNN、RNN和self-attention。容易知道自注意力同时具有并行计算力强和最大路径长度的两个有点因此使用self-attention来设计模型架构是很有吸引力的。 而transformer模型就是完全基于注意力机制且其没有任何的卷积层和循环神经网络层。transformer最初是应用在文本数据上的序列到序列学习现在也已经推广到了语言、视觉、语音和强化学习等领域。 而在之前我们已经使用了seq2seq来实现了英语到法语的翻译那时候发现训练后的效果并不是很好接下来将边讲解transformer边用transformer来进行机器翻译。 模型 transformer是编码器-解码器架构的一个实例整体实例的架构图如下所示 可以看出transformer的编码器和解码器时基于自注意力的模块叠加而成的源输入序列和目标输出序列的嵌入embedding表示将加上位置编码再分别输入到编码器和解码器中。 宏观角度上进行结构上的解释transformer的编码器是由多个相同的层叠加而成的每个层都有两个子层sublayer。第一个子层是多头注意力multi-head self-attention池化第二个子层是基于位置的前馈网络positionwise feed-forward networkFFT。也就是说计算编码器的自注意力时查询、键和值都来自前一个编码器层的输出。 受残差网络ResNet的启发具体可以自行去了解一下原理主要优点是残差网络的使用使得模型更容易优化每个子层都使用了残差连接。在transformer中对于序列中任何位置的任何输入x∈Rd都要求满足sublayer(x)∈Rd一遍残差连接满足xsublayer(x)∈Rd。在残差连接的加法运算后要紧接着进行应用层规范化layer normalization。因此输入序列对应的每个位置编码器都将输出一个d维表示向量。 transformer的解码器也是由多个相同的层叠加而成的也使用了残差连接和层规范化。除了编码器中描述的两个子层之外解码器还在这两个子层之间插入了第三个子层称为编码器解码器注意力层。这个层的query为前一解码器层的输出而key和value都是来自编码器的输出。在解码器自注意力中query、key、value都来自上一个解码器层的输出。但是解码器中的每个位置只能考虑该位置之前的所有位置这和我们之前见过的掩蔽很相似事实上这种掩蔽注意力就保留了自回归属性确保预测仅仅依赖于已生成的输出词元。 import math import pandas as pd import torch from torch import nn from d2l import torch as d2l基于位置的前馈网络 基于位置的前馈网络对序列中的所有位置的表示进行变换时使用的是同一个多层感知机MLP这就是称前馈网络是基于位置的原因。下面进行实现下面代码中输入X的形状为批量大小时间步数或序列长度隐单元数或特征维度将被一个两层感知机转换成形状为批量大小时间步数ffn_num_outputs的输出张量。 #save class PositionWiseFFN(nn.Module):基于位置的前馈网络def __init__(self, ffn_num_input, ffn_num_hiddens, ffn_num_outputs,**kwargs):super(PositionWiseFFN, self).__init__(**kwargs)self.dense1 nn.Linear(ffn_num_input, ffn_num_hiddens)self.relu nn.ReLU()self.dense2 nn.Linear(ffn_num_hiddens, ffn_num_outputs)def forward(self, X):return self.dense2(self.relu(self.dense1(X)))残差连接和层规范化 现在关注加法和规范化addnorm组件如前面所说这是由残差连接和紧随其后的层规范化组成的这两个都是关键。 规范化也叫归一化他将其改变成均值为0方差为1。 在计算机视觉中常用批量规范化也就是在一个小批量的样本内基于批量规范化对数据进行重新中心化和重新缩放的调整。层规范化是基于特征维度进行规范化。而在NLP输入通常是变长序列中通常使用层规范化。 为何使用层规范化 也就是为啥使用LayerNorm而不使用BatchNorm呢如下图 其中b为batch_size也就是批量大小len是指代序列的长度。 那么我们知道批量规范化是对每个特征/通道里的元素进行归一化把d规范化了len留着但是对于序列长度会变的NLP并不适合这样就会不稳定。 而层规范化则是对每个样本里面的元素进行规范化相对更稳定。 通过以下的代码来对比不同维度的层规范化和批量规范化的效果 ln nn.LayerNorm(2) bn nn.BatchNorm1d(2) X torch.tensor([[1, 2], [2, 3]], dtypetorch.float32) # 在训练模式下计算X的均值和方差 print(layer norm:, ln(X), \nbatch norm:, bn(X))运行结果 可以很清楚看出来使用层规范化以后会对每一个批量中的每一个样本的不同特征来进行规范化使用批量规范化以后会对每一个批量中的每个样本的同一特征来进行规范化。 接着就可以使用残差连接和层规范化来实现AddNorm类dropout也被作为正则化方法使用 #save class AddNorm(nn.Module):残差连接后进行层规范化def __init__(self, normalized_shape, dropout, **kwargs):super(AddNorm, self).__init__(**kwargs)self.dropout nn.Dropout(dropout)self.ln nn.LayerNorm(normalized_shape)def forward(self, X, Y):return self.ln(self.dropout(Y) X)残差连接要求两个输入的形状相同以便加法操作后输出张量的形状相同。 add_norm AddNorm([3, 4], 0.5) add_norm.eval() print(add_norm(torch.ones((2, 3, 4)), torch.ones((2, 3, 4))).shape)输出结果 torch.Size([2, 3, 4]) 编码器 有了组成Transformer编码器的基础组件现在可以先实现编码器中的一个层。下面的EncoderBlock类包含两个子层多头自注意力和基于位置的前馈网络这两个子层都使用了残差连接和紧随的层规范化。 #save class EncoderBlock(nn.Module):Transformer编码器块def __init__(self, key_size, query_size, value_size, num_hiddens,norm_shape, ffn_num_input, ffn_num_hiddens, num_heads,dropout, use_biasFalse, **kwargs):super(EncoderBlock, self).__init__(**kwargs)self.attention d2l.MultiHeadAttention(key_size, query_size, value_size, num_hiddens, num_heads, dropout,use_bias)self.addnorm1 AddNorm(norm_shape, dropout)self.ffn PositionWiseFFN(ffn_num_input, ffn_num_hiddens, num_hiddens)self.addnorm2 AddNorm(norm_shape, dropout)def forward(self, X, valid_lens):Y self.addnorm1(X, self.attention(X, X, X, valid_lens))return self.addnorm2(Y, self.ffn(Y))下面实现的Transformer编码器的代码中堆叠了num_layers个EncoderBlock类的实例。由于这里使用的是值范围在-1和1之间的固定位置编码因此通过学习得到的输入的嵌入表示的值需要先乘以嵌入维度的平方根进行重新缩放然后再与位置编码相加。 #save class TransformerEncoder(d2l.Encoder):Transformer编码器def __init__(self, vocab_size, key_size, query_size, value_size,num_hiddens, norm_shape, ffn_num_input, ffn_num_hiddens,num_heads, num_layers, dropout, use_biasFalse, **kwargs):super(TransformerEncoder, self).__init__(**kwargs)self.num_hiddens num_hiddensself.embedding nn.Embedding(vocab_size, num_hiddens)self.pos_encoding d2l.PositionalEncoding(num_hiddens, dropout)self.blks nn.Sequential()for i in range(num_layers):self.blks.add_module(blockstr(i),EncoderBlock(key_size, query_size, value_size, num_hiddens,norm_shape, ffn_num_input, ffn_num_hiddens,num_heads, dropout, use_bias))def forward(self, X, valid_lens, *args):# 因为位置编码值在-1和1之间# 因此嵌入值乘以嵌入维度的平方根进行缩放# 然后再与位置编码相加。X self.pos_encoding(self.embedding(X) * math.sqrt(self.num_hiddens))self.attention_weights [None] * len(self.blks)for i, blk in enumerate(self.blks):X blk(X, valid_lens)self.attention_weights[i] blk.attention.attention.attention_weightsreturn X解码器 Transformer解码器也是由多个相同的层组成在DecoderBlock类中实现的每个层包含了三个子层解码器自注意力、“编码器-解码器”注意力和基于位置的前馈网络。这些子层也都被残差连接和紧随的层规范化围绕。 在掩蔽多头解码器自注意力层第一个子层中查询、键和值都来自上一个解码器层的输出。关于序列到序列模型sequence-to-sequence model在训练阶段其输出序列的所有位置时间步的词元都是已知的然而在预测阶段其输出序列的词元是逐个生成的。 因此在任何解码器时间步中只有生成的词元才能用于解码器的自注意力计算中。为了在解码器中保留自回归的属性其掩蔽自注意力设定了参数dec_valid_lens以便任何查询都只会与解码器中所有已经生成词元的位置即直到该查询位置为止进行注意力计算。 class DecoderBlock(nn.Module):解码器中第i个块def __init__(self, key_size, query_size, value_size, num_hiddens,norm_shape, ffn_num_input, ffn_num_hiddens, num_heads,dropout, i, **kwargs):super(DecoderBlock, self).__init__(**kwargs)self.i iself.attention1 d2l.MultiHeadAttention(key_size, query_size, value_size, num_hiddens, num_heads, dropout)self.addnorm1 AddNorm(norm_shape, dropout)self.attention2 d2l.MultiHeadAttention(key_size, query_size, value_size, num_hiddens, num_heads, dropout)self.addnorm2 AddNorm(norm_shape, dropout)self.ffn PositionWiseFFN(ffn_num_input, ffn_num_hiddens,num_hiddens)self.addnorm3 AddNorm(norm_shape, dropout)def forward(self, X, state):enc_outputs, enc_valid_lens state[0], state[1]# 训练阶段输出序列的所有词元都在同一时间处理# 因此state[2][self.i]初始化为None。# 预测阶段输出序列是通过词元一个接着一个解码的# 因此state[2][self.i]包含着直到当前时间步第i个块解码的输出表示if state[2][self.i] is None:key_values Xelse:key_values torch.cat((state[2][self.i], X), axis1)state[2][self.i] key_valuesif self.training:batch_size, num_steps, _ X.shape# dec_valid_lens的开头:(batch_size,num_steps),# 其中每一行是[1,2,...,num_steps]dec_valid_lens torch.arange(1, num_steps 1, deviceX.device).repeat(batch_size, 1)else:dec_valid_lens None# 自注意力X2 self.attention1(X, key_values, key_values, dec_valid_lens)Y self.addnorm1(X, X2)# 编码器解码器注意力。# enc_outputs的开头:(batch_size,num_steps,num_hiddens)Y2 self.attention2(Y, enc_outputs, enc_outputs, enc_valid_lens)Z self.addnorm2(Y, Y2)return self.addnorm3(Z, self.ffn(Z)), state现在我们构建了由num_layers个DecoderBlock实例组成的完整的Transformer解码器。最后通过一个全连接层计算所有vocab_size个可能的输出词元的预测值。解码器的自注意力权重和编码器解码器注意力权重都被存储下来方便日后可视化的需要。 class TransformerDecoder(d2l.AttentionDecoder):def __init__(self, vocab_size, key_size, query_size, value_size,num_hiddens, norm_shape, ffn_num_input, ffn_num_hiddens,num_heads, num_layers, dropout, **kwargs):super(TransformerDecoder, self).__init__(**kwargs)self.num_hiddens num_hiddensself.num_layers num_layersself.embedding nn.Embedding(vocab_size, num_hiddens)self.pos_encoding d2l.PositionalEncoding(num_hiddens, dropout)self.blks nn.Sequential()for i in range(num_layers):self.blks.add_module(blockstr(i),DecoderBlock(key_size, query_size, value_size, num_hiddens,norm_shape, ffn_num_input, ffn_num_hiddens,num_heads, dropout, i))self.dense nn.Linear(num_hiddens, vocab_size)def init_state(self, enc_outputs, enc_valid_lens, *args):return [enc_outputs, enc_valid_lens, [None] * self.num_layers]def forward(self, X, state):X self.pos_encoding(self.embedding(X) * math.sqrt(self.num_hiddens))self._attention_weights [[None] * len(self.blks) for _ in range (2)]for i, blk in enumerate(self.blks):X, state blk(X, state)# 解码器自注意力权重self._attention_weights[0][i] blk.attention1.attention.attention_weights# “编码器解码器”自注意力权重self._attention_weights[1][i] blk.attention2.attention.attention_weightsreturn self.dense(X), statepropertydef attention_weights(self):return self._attention_weights训练 依照Transformer架构来实例化编码器解码器模型。在这里指定Transformer的编码器和解码器都是2层都使用4头注意力。为了进行序列到序列的学习下面将在之前所说的机器翻译数据集上进行transformer模型的训练。 num_hiddens, num_layers, dropout, batch_size, num_steps 32, 2, 0.1, 64, 10 lr, num_epochs, device 0.005, 200, d2l.try_gpu() ffn_num_input, ffn_num_hiddens, num_heads 32, 64, 4 key_size, query_size, value_size 32, 32, 32 norm_shape [32]train_iter, src_vocab, tgt_vocab d2l.load_data_nmt(batch_size, num_steps)encoder TransformerEncoder(len(src_vocab), key_size, query_size, value_size, num_hiddens,norm_shape, ffn_num_input, ffn_num_hiddens, num_heads,num_layers, dropout) decoder TransformerDecoder(len(tgt_vocab), key_size, query_size, value_size, num_hiddens,norm_shape, ffn_num_input, ffn_num_hiddens, num_heads,num_layers, dropout) net d2l.EncoderDecoder(encoder, decoder) d2l.train_seq2seq(net, train_iter, lr, num_epochs, tgt_vocab, device) d2l.plt.show()运行输出 loss 0.032, 5786.9 tokens/sec on cpu 运行图片 训练完后我们可以将一些英语句子翻译成法语并且计算翻译后的BLEU分数和之前的seq2seq实现的训练模型一样的计算方式 engs [go ., i lost ., he\s calm ., i\m home .] fras [va !, j\ai perdu ., il est calme ., je suis chez moi .] for eng, fra in zip(engs, fras):translation, dec_attention_weight_seq d2l.predict_seq2seq(net, eng, src_vocab, tgt_vocab, num_steps, device, True)print(f{eng} {translation}, ,fbleu {d2l.bleu(translation, fra, k2):.3f})运行结果 go . va !, bleu 1.000 i lost . j’ai perdu ., bleu 1.000 he’s calm . il est mouillé ., bleu 0.658 i’m home . je suis chez moi ., bleu 1.000 这次的效果比起上一次明显还是好了很多的。 小结 1、Transformer是编码器解码器架构的一个实践尽管在实际情况中编码器或解码器可以单独使用。 2、在Transformer中多头自注意力用于表示输入序列和输出序列不过解码器必须通过掩蔽机制来保留自回归属性。 3、Transformer中的残差连接和层规范化是训练非常深度模型的重要工具。 4、Transformer模型中基于位置的前馈网络使用同一个多层感知机作用是对所有序列位置的表示进行转换。
http://www.huolong8.cn/news/17081/

相关文章:

  • 西安做网站广告的公司网页版梦幻西游金色伙伴推荐
  • 怎么做自己的销售网站app推广刷量
  • 专做商品折扣的网站wordpress google字体删除
  • 溧阳市建设局网站6婚纱摄影 网站关键词 优化
  • 汕头网站搭建公积金网站建设方案
  • 哪个网站做国内销海外的dede网站管理系统演示
  • 网站建设专项检查织梦 xml网站地图
  • 陕西网站建设哪家专业wordpress阿里云虚拟主机安装教程
  • 两学一做网站答题网址佛山网站设计模板
  • 苏州网站建设在哪里公司做两个网站有影响吗
  • 建筑网站设置工资单人换了怎么换官网建设费用怎么算
  • 简述网站制作的一般流程艺术家个人网站设计
  • 国际贸易网站哪家好前端程序员需要掌握哪些基本技术
  • 婚纱网站建设微信群动漫制作专业在国企
  • 效果型网站建设wordpress整合dplayer插件
  • 外贸网站怎么做站长之家查询域名
  • 简洁网站欣赏成都市建筑设计研究院有限公司
  • 论坛类网站如何备案搜索推广是什么
  • 网站开发的形式有( )怎么仿制网站
  • 上海自助建站手机网站不收录
  • 外贸一般在哪些网站凡客诚品商品来源
  • 昆山网站开发建设公司做网站用的什么服务器吗
  • 老域名对做网站的宁波免费建站外包公司
  • 网站建设2018域名网安备案
  • 广东成都网站建设推广公司小程序二次开发多少钱
  • 搜索引擎网站提交网站一个人可以做吗
  • 做网站需要的照片购物商城类网站备案
  • 网站母版页怎么做杭州旅游网站建设
  • 北京市两学一做网站wordpress 一键 样式
  • 东营建网站公司河南郑州天气预报15天