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

网站以个人名义备案现在做网站建设都是自建

网站以个人名义备案,现在做网站建设都是自建,东莞最新新闻,网站内页怎么做301定向资源来自#xff1a;DataWhale 学习资料 最近看了DataWhale 的Transformer图解#xff0c;突然对Transformer的结构图有了更加清晰的理解#xff0c;特此记录。 1、大框架 Transformer是由6个encoder和6个decoder组成#xff0c;模型的具体实现是model变量里边#xff0…资源来自DataWhale 学习资料 最近看了DataWhale 的Transformer图解突然对Transformer的结构图有了更加清晰的理解特此记录。 1、大框架 Transformer是由6个encoder和6个decoder组成模型的具体实现是model变量里边参数有Encoder[编码器]、Decoder[解码器]、Embedding(src_vocab)[输入文本进行词向量化]、Embedding(tgt_vocab)[目标文本进行词向量化]Generator[生成器]。 def make_model(src_vocab, tgt_vocab, N6, d_model512, d_ff2048, h8, dropout0.1):Helper: Construct a model from hyperparameters.c copy.deepcopy#多头注意力attn MultiHeadedAttention(h, d_model)#前馈神经网络ff PositionwiseFeedForward(d_model, d_ff, dropout)#位置编码position PositionalEncoding(d_model, dropout)#模型定义model EncoderDecoder(Encoder(EncoderLayer(d_model, c(attn), c(ff), dropout), N),Decoder(DecoderLayer(d_model, c(attn), c(attn), c(ff), dropout), N),nn.Sequential(Embeddings(d_model, src_vocab), c(position)),nn.Sequential(Embeddings(d_model, tgt_vocab), c(position)),Generator(d_model, tgt_vocab))# This was important from their code. # Initialize parameters with Glorot / fan_avg.for p in model.parameters():if p.dim() 1:nn.init.xavier_uniform(p)return model 查看EncoderDecoder函数搭建了一个seq2seq框架即包含encoder和decoder在EncoderDecoder函数中变量src是输入文本tgt是输出文本src_mask是输入文本的掩码tgt_mask是输出文本的掩码memory是encoder的最终输出。 class EncoderDecoder(nn.Module):基础的Encoder-Decoder结构。A standard Encoder-Decoder architecture. Base for this and many other models.def __init__(self, encoder, decoder, src_embed, tgt_embed, generator):super(EncoderDecoder, self).__init__()self.encoder encoderself.decoder decoderself.src_embed src_embedself.tgt_embed tgt_embedself.generator generatordef forward(self, src, tgt, src_mask, tgt_mask):Take in and process masked src and target sequences.return self.decode(self.encode(src, src_mask), src_mask,tgt, tgt_mask)def encode(self, src, src_mask):return self.encoder(self.src_embed(src), src_mask)def decode(self, memory, src_mask, tgt, tgt_mask):return self.decoder(self.tgt_embed(tgt), memory, src_mask, tgt_mask)2、Encoder 1clone 由于Transformer是有6个encoder组成则使用clone函数进行EncodeLayer层的复制 def clones(module, N):产生N个完全相同的网络层Produce N identical layers.return nn.ModuleList([copy.deepcopy(module) for _ in range(N)]) 解释nn.ModuleList 函数是保存子模块列表通过for循环建立6个Encoder 2Encoder class Encoder(nn.Module):完整的Encoder包含N层def __init__(self, layer, N):super(Encoder, self).__init__()self.layers clones(layer, N)self.norm LayerNorm(layer.size)def forward(self, x, mask):每一层的输入是x和maskfor layer in self.layers:x layer(x, mask)return self.norm(x) Encoder需要进行“层归一化”因此是在encoder建立之后进行了LayerNorm操作。 3EncoderLayer 先介绍EncoderLayer层一个编码器encoder编码器的构成部分是self_Attention-SubLayerConnection(层归一化和残差连接)-FFNN-SubLayerConnection(层归一化和残差连接). 代码中对SubLayerConnection复制两份分别加入在self-Attention和FFNN之后。 class EncoderLayer(nn.Module):Encoder is made up of self-attn and feed forward (defined below)def __init__(self, size, self_attn, feed_forward, dropout):super(EncoderLayer, self).__init__()self.self_attn self_attnself.feed_forward feed_forwardself.sublayer clones(SublayerConnection(size, dropout), 2)self.size sizedef forward(self, x, mask):Follow Figure 1 (left) for connections.x self.sublayer[0](x, lambda x: self.self_attn(x, x, x, mask))return self.sublayer[1](x, self.feed_forward)4LayerNorm ‘层归一化’是该层的输入值进行对归一化处理公式为,层归一化分别在Encoder中的Attention自身注意力和FFNN(前馈神经网络)模块后。 class LayerNorm(nn.Module):Construct a layernorm module (See citation for details).def __init__(self, features, eps1e-6):super(LayerNorm, self).__init__()self.a_2 nn.Parameter(torch.ones(features))self.b_2 nn.Parameter(torch.zeros(features))self.eps epsdef forward(self, x):mean x.mean(-1, keepdimTrue)std x.std(-1, keepdimTrue)return self.a_2 * (x - mean) / (std self.eps) self.b_2 5残差连接 所进行的操作时对输入数据进行层归一化然后进行sublayer操作此时sublayer传入的操作是self.attn和self.feed_forward. class SublayerConnection(nn.Module):A residual connection followed by a layer norm.Note for code simplicity the norm is first as opposed to last.def __init__(self, size, dropout):super(SublayerConnection, self).__init__()self.norm LayerNorm(size)self.dropout nn.Dropout(dropout)def forward(self, x, sublayer):Apply residual connection to any sublayer with the same size.return x self.dropout(sublayer(self.norm(x)))因为self-Attention和FFNN在encoder和decoder有异同下边进行集中梳理。 3、Decoder 1Decoder 在Decoder中也进行了clone操作此处相较于encoder多了一个memory和src、tgt的掩码mask。 class Decoder(nn.Module):Generic N layer decoder with masking.def __init__(self, layer, N):super(Decoder, self).__init__()self.layers clones(layer, N)self.norm LayerNorm(layer.size)def forward(self, x, memory, src_mask, tgt_mask):for layer in self.layers:x layer(x, memory, src_mask, tgt_mask)return self.norm(x)2DecoderLayer 相较于EncoderLayer层多了一个attention操作即self_attn是在decoder的注意力机制即增加了mask机制src_attn是encoder的输出结果q是decoder层k,v是encoder的输出。 模块1是self_attn,模块2是src_attn 由于新增一个attention模块SubLayerConnection就有三层解码器的构成部分是self_Attention-SubLayerConnection(层归一化和残差连接)-src_Attention-SubLayerConnection(层归一化和残差连接)-FFNN-SubLayerConnection(层归一化和残差连接). class DecoderLayer(nn.Module):Decoder is made of self-attn, src-attn, and feed forward (defined below)def __init__(self, size, self_attn, src_attn, feed_forward, dropout):super(DecoderLayer, self).__init__()self.size sizeself.self_attn self_attnself.src_attn src_attnself.feed_forward feed_forwardself.sublayer clones(SublayerConnection(size, dropout), 3)def forward(self, x, memory, src_mask, tgt_mask):Follow Figure 1 (right) for connections.m memoryx self.sublayer[0](x, lambda x: self.self_attn(x, x, x, tgt_mask))x self.sublayer[1](x, lambda x: self.src_attn(x, m, m, src_mask))return self.sublayer[2](x, self.feed_forward)4、Embedding  src_vocab tgt_vocab Embedding是对文本进行词向量转换调用函数为nn.Embedding,且进行了math.sqrt(self.d_model)操作。 class Embeddings(nn.Module):def __init__(self, d_model, vocab):super(Embeddings, self).__init__()self.lut nn.Embedding(vocab, d_model)self.d_model d_modeldef forward(self, x):return self.lut(x) * math.sqrt(self.d_model)5、额外实现 1self-Attention Attention计算 目前Atention机制的演变过程是加法和点积计算加法计算是计算q,k的相似度点积是计算q,k的点积公式为点积计算。 在进行Attention计算时特别注意mask参数 当mask不为None时则加入了Mask机制 def attention(query, key, value, maskNone, dropoutNone):Compute Scaled Dot Product Attentiond_k query.size(-1)scores torch.matmul(query, key.transpose(-2, -1)) \/ math.sqrt(d_k)if mask is not None:scores scores.masked_fill(mask 0, -1e9)p_attn F.softmax(scores, dim -1)if dropout is not None:p_attn dropout(p_attn)return torch.matmul(p_attn, value), p_attn Multi-Head 只计算单个Attention很难捕捉输入句中所有空间的讯息为了优化模型论文提出了一个multi head的概念把key,value,query线性映射到不同空间h次但是在传入Scaled-Dot-Product Attention中时需要固定的长度因此再对head进行concat。 代码如下 class MultiHeadedAttention(nn.Module):def __init__(self, h, d_model, dropout0.1):Take in model size and number of heads.super(MultiHeadedAttention, self).__init__()assert d_model % h 0# We assume d_v always equals d_kself.d_k d_model // hself.h hself.linears clones(nn.Linear(d_model, d_model), 4)self.attn Noneself.dropout nn.Dropout(pdropout)def forward(self, query, key, value, maskNone):Implements Figure 2if mask is not None:# Same mask applied to all h heads.mask mask.unsqueeze(1)nbatches query.size(0)# 1) Do all the linear projections in batch from d_model h x d_k query, key, value \[l(x).view(nbatches, -1, self.h, self.d_k).transpose(1, 2)for l, x in zip(self.linears, (query, key, value))]# 2) Apply attention on all the projected vectors in batch. x, self.attn attention(query, key, value, maskmask, dropoutself.dropout)# 3) Concat using a view and apply a final linear. x x.transpose(1, 2).contiguous() \.view(nbatches, -1, self.h * self.d_k)return self.linears[-1](x)定义了4个linear层前三个分别对q,v,k进行分解维度是(h,d_k,关系是d_model h*d_kh是head的数量)最后一个linear层是对多头的连接之后的数据进行线性变换。 mask机制 mask机制就是防止在训练的时候使用未来的输出的单词确保对位置i的预测仅依赖于已知的位置i之前的输出而不会依赖于位置i之后的输出。 比如训练时 第一个单词是不能参考第二个单词的生成结果的。 mask就会把这个信息变成0 用来保证预测位置 i 的信息只能基于比 i 小的输出 def subsequent_mask(size):Mask out subsequent positions.attn_shape (1, size, size)subsequent_mask np.triu(np.ones(attn_shape), k1).astype(uint8)return torch.from_numpy(subsequent_mask) 0 生成一个上三角矩阵令size3测试结果为 2FFNN FFNN有两层线性变换结构是linear-relu-dropout-linear。 class PositionwiseFeedForward(nn.Module):Implements FFN equation.def __init__(self, d_model, d_ff, dropout0.1):super(PositionwiseFeedForward, self).__init__()self.w_1 nn.Linear(d_model, d_ff)self.w_2 nn.Linear(d_ff, d_model)self.dropout nn.Dropout(dropout)def forward(self, x):return self.w_2(self.dropout(F.relu(self.w_1(x))))3位置编码 encoder的输入层和decoder的输入层是一样的结构都是token embedding词向量 positional embedding位置向量得到最终的输入向量。之所以引入positional embedding主要是解决单单使用token embedding类似于词袋子并没有词序的概念的问题。因为该模型并不包括任何的循环或卷积神经网络所以模型添加了位置编码为模型提供了关于单词再句子中相对位置的信息。这个向量能决定当前词的位置或者说在一个句子中不同的词之间的距离。计算方法如下 pos表示单词的位置i是指单词的维度偶数位置用正弦奇数位置用余弦。 class PositionalEncoding(nn.Module):Implement the PE function.def __init__(self, d_model, dropout, max_len5000):super(PositionalEncoding, self).__init__()self.dropout nn.Dropout(pdropout)# Compute the positional encodings once in log space.pe torch.zeros(max_len, d_model)position torch.arange(0, max_len).unsqueeze(1)div_term torch.exp(torch.arange(0, d_model, 2) *-(math.log(10000.0) / d_model))pe[:, 0::2] torch.sin(position * div_term)pe[:, 1::2] torch.cos(position * div_term)pe pe.unsqueeze(0)self.register_buffer(pe, pe)def forward(self, x):x x Variable(self.pe[:, :x.size(1)], requires_gradFalse)return self.dropout(x)squeeze和unsqueeze函数对张量Tensor的维度进行压缩或者扩充 6、实现顺序 1模拟数据 def data_gen(V, batch, nbatches):Generate random data for a src-tgt copy task.for i in range(nbatches):data torch.from_numpy(np.random.randint(1, V, size(batch, 10)))data[:, 0] 1src Variable(data, requires_gradFalse)tgt Variable(data, requires_gradFalse)yield Batch(src, tgt, 0)2批处理和掩码 class Batch:Object for holding a batch of data with mask during training.def __init__(self, src, trgNone, pad0):self.src srcself.src_mask (src ! pad).unsqueeze(-2)if trg is not None:self.trg trg[:, :-1]self.trg_y trg[:, 1:]self.trg_mask \self.make_std_mask(self.trg, pad)self.ntokens (self.trg_y ! pad).data.sum()staticmethoddef make_std_mask(tgt, pad):Create a mask to hide padding and future words.tgt_mask (tgt ! pad).unsqueeze(-2)tgt_mask tgt_mask Variable(subsequent_mask(tgt.size(-1)).type_as(tgt_mask.data))return tgt_mask3模型优化 class NoamOpt:Optim wrapper that implements rate.def __init__(self, model_size, factor, warmup, optimizer):self.optimizer optimizerself._step 0self.warmup warmupself.factor factorself.model_size model_sizeself._rate 0def step(self):Update parameters and rateself._step 1rate self.rate()for p in self.optimizer.param_groups:p[lr] rateself._rate rateself.optimizer.step()def rate(self, step None):Implement lrate aboveif step is None:step self._stepreturn self.factor * \(self.model_size ** (-0.5) *min(step ** (-0.5), step * self.warmup ** (-1.5)))def get_std_opt(model):return NoamOpt(model.src_embed[0].d_model, 2, 4000,torch.optim.Adam(model.parameters(), lr0, betas(0.9, 0.98), eps1e-9))4标签平滑 class LabelSmoothing(nn.Module):Implement label smoothing.def __init__(self, size, padding_idx, smoothing0.0):super(LabelSmoothing, self).__init__()self.criterion nn.KLDivLoss(size_averageFalse)self.padding_idx padding_idxself.confidence 1.0 - smoothingself.smoothing smoothingself.size sizeself.true_dist Nonedef forward(self, x, target):assert x.size(1) self.sizetrue_dist x.data.clone()true_dist.fill_(self.smoothing / (self.size - 2))true_dist.scatter_(1, target.data.unsqueeze(1), self.confidence)true_dist[:, self.padding_idx] 0mask torch.nonzero(target.data self.padding_idx)if mask.dim() 0:true_dist.index_fill_(0, mask.squeeze(), 0.0)self.true_dist true_distreturn self.criterion(x, Variable(true_dist, requires_gradFalse))5损失函数计算 class SimpleLossCompute:A simple loss compute and train function.def __init__(self, generator, criterion, optNone):self.generator generatorself.criterion criterionself.opt optdef __call__(self, x, y, norm):x self.generator(x)loss self.criterion(x.contiguous().view(-1, x.size(-1)), y.contiguous().view(-1)) / normloss.backward()if self.opt is not None:self.opt.step()self.opt.optimizer.zero_grad()return loss.item() * norm6批次运行 def run_epoch(data_iter, model, loss_compute):Standard Training and Logging Functionstart time.time()total_tokens 0total_loss 0tokens 0for i, batch in enumerate(data_iter):out model.forward(batch.src, batch.trg, batch.src_mask, batch.trg_mask)loss loss_compute(out, batch.trg_y, batch.ntokens)total_loss losstotal_tokens batch.ntokenstokens batch.ntokensif i % 50 1:elapsed time.time() - startprint(Epoch Step: %d Loss: %f Tokens per Sec: %f %(i, loss / batch.ntokens, tokens / elapsed))start time.time()tokens 0return total_loss / total_tokens7调用 # Train the simple copy task. V 11 #标签平滑 criterion LabelSmoothing(sizeV, padding_idx0, smoothing0.0) #定义模型 model make_model(V, V, N2) #模型优化采用Adam model_opt NoamOpt(model.src_embed[0].d_model, 1, 400,torch.optim.Adam(model.parameters(), lr0, betas(0.9, 0.98), eps1e-9))#训练10次并进行损失函数计算 for epoch in range(10):model.train()run_epoch(data_gen(V, 30, 20), model, SimpleLossCompute(model.generator, criterion, model_opt))model.eval()print(run_epoch(data_gen(V, 30, 5), model, SimpleLossCompute(model.generator, criterion, None)))参考教程 1、learn-nlp-with-transformers/2.2.1-Pytorch编写Transformer.md at main · datawhalechina/learn-nlp-with-transformers · GitHub 原文链接The Annotated Transformer2、Datawhale-零基础入门NLP-新闻文本分类Task06_樱缘之梦-CSDN博客
http://www.pierceye.com/news/689726/

相关文章:

  • 自助网站建设推广优化策略wordpress中文采集插件
  • 网站开发及运营成本做网站 公司 个体
  • 永久免费建站地址苏州h5网站建设价钱
  • 室内设计网站网站建设中请稍后再访问
  • 十堰网站开发培训编程软件手机
  • 南京网站优化推广微网站缺点
  • 大连零基础网站建设培训哪里有固安县建设局网站
  • 怎么制作网站首页培训心得体会总结简短
  • 商务网站建设 模板长春高端品牌网站建设
  • 做网站比较便宜办公资源网
  • 公司怎么做网页网站遵义网站设计公司
  • 网站建设毕业设计yy直播回放
  • 响应式网站有哪些2017淮南网络推广报价
  • 兰州公司网站建设网站建设筹备方案
  • 租房网站建设做一个跨境电商网站
  • 网站设计制作过程容桂做pc端网站
  • 宜昌市上海中学官网seo文章外包
  • 加强普法网站建设的通知制作婚恋网站
  • 北大荒建设集团有限公司网站网站添加在线qq聊天
  • 网站首页被k咋办上海市企业服务云登录
  • 长安镇网站建设公司大网站制作公司
  • 衡水做网站推广找谁廊坊百度推广排名优化
  • 网站建设毕业报告wordpress微信登录页面
  • 外包网站建设费用包括网站备份crm系统有哪些
  • 高端网站设计推广v信haotg8wordpress 付费后查看
  • cms管理手机网站长春做网站好的公司
  • 可信网站认证 技术支持单位沈阳又一烂尾项目复工
  • 南昌网站建设培训学校做幼儿网站的目标
  • 装饰网站建设的背景怎么做原创动漫视频网站
  • 电脑购物网站模板c2c商城网站建设二次开发