首页 > 其他分享 >Encoder

Encoder

时间:2024-07-23 20:07:50浏览次数:8  
标签:__ nn self Encoder init model dropout

Encoder
#导入包
import torch
from torch import nn
import torch.nn.functional as f 
import math 

class PositionwiseFeedForward(nn.Module):
    def __init__(self,d_model,hidden,dropout=0.1):
        """
            d_model:输入特征维度
            hidden:隐藏层的维度
            dropout:dropout的概率
        """
        super(PositionwiseFeedForward,self).__init__()
        #定义全连接层,和Dropout
        self.fc1 = nn.Linear(d_model,hidden)
        self.fc2 = nn.Linear(hidden,d_model)
        self.dropout = nn.Dropout(dropout)
    def forward(self,x):
        x = self.fc1(x)
        x = f.relu(x)
        x = self.dropout(x)
        x = self.fc2(x)
        return x

from typing import Self
from numpy import transpose
from torch import batch_norm


class MutiHeadAttention(nn.Module):
    def __init__(self,d_model,n_head):
        """
            d_model:输入向量的维度
            n_head:多头注意力机制的头数
        """
        super(MutiHeadAttention,self).__init__()
        #将参数赋予实例
        self.n_head = n_head #多头注意力的头数
        self.d_mouel = d_model #向量的维度
        #定义对q,k,v的线性变换
        self.w_q = nn.Linear(d_model,d_model)
        self.w_k = nn.Linear(d_model,d_model)
        self.w_v = nn.Linear(d_model,d_model)
        self.w_combine = nn.Linear(d_model,d_model)
        #dim=-1 表示Softmax操作将沿着最后一个维度进行。
        # 在多分类问题中,这通常意味着对每个样本的类别预测进行Softmax操作,将原始的类别得分(logits)转换为概率分布。
        self.softmax=nn.Softmax(dim=-1)
    def forward(self,q,k,v,mask=None):
        batch,time,dimension = q.shape
        #计算每个头处理的特征维度数。
        n_d = self.d_mouel//self.n_head
        #对q,k,v进行线性变换,并进行维度调整便于后续计算
        q,k,v = self.w_q(q),self.w_k(k),self.w_v(v)
        q = q.view(batch,time,self.n_head,n_d).permute(0,2,1,3)
        k = k.view(batch,time,self.n_head,n_d).permute(0,2,1,3)
        v = v.view(batch,time,self.n_head,n_d).permute(0,2,1,3)
        #进行赋分计算
        [email protected](2,3)/math.sqrt(n_d)
        #掩码机制
        if mask is not None:
            score = score.masked_fill(mask==0,-10000)
        #加权求和
        score = self.softmax(score)@v
        score = score.permute(0,2,1,3).contiguous().view(batch,time,dimension)
        out = self.w_combine(score)
        return out

from math import sqrt


class LayerNormal(nn.Module):
    def __init__(self,d_model,eps=1e-12):
        """
            d_model:数据维度
            eps:稳定系数
        """
        super(LayerNormal,self).__init__()
        #nn.Parameter所创造的张量会随着模型的训练而自动优化
        #初始化为全1的向量
        self.gamma = nn.Parameter(torch.ones(d_model))
        self.beta = nn.Parameter(torch.zeros(d_model))
        self.eps = eps
    def forward(self,x):
        #求平均值,keepdim=True保持维度数量不变
        mean = x.mean(-1,keepdim=True)
        #求方差,unbiased=False计算总体方差,keepdim=True保持维度不不变
        var = x.var(-1,unbiased=False,keepdim=True)
        out = (x-mean)/sqrt(var+self.eps)
        out = self.gamma*out + self.beta
        return out




class EncoderLayer(nn.Module):
    """
        这是单个EncoderLayer的定义
        真正的Encoder是由多个EncoderLayer组成
    """
    def __init__(self,d_model,ffn_hidden,n_head,dropout=0.1):
        #初始化并定义各个模块
        super(EncoderLayer,self).__init__()
        self.attention = MutiHeadAttention(d_model,n_head)
        self.normal = LayerNormal(d_model)
        self.dropout1 = nn.Dropout(dropout)
        self.ffn = PositionwiseFeedForward(d_model=d_model,hidden=ffn_hidden,dropout=dropout)
        self.norma2 = LayerNormal(d_model)
        self.dropout2 = nn.Dropout(dropout)
    def forward(self,x,mask=None):
        #前向传播
        _x = x
        x = self.attention(x,x,x,mask)
        x = self.dropout1(x)
        x = self.normal(x + _x)
        _x = x 
        x = self.ffn(x)
        x = self.dropout2(x)
        x = self.norma2(x + _x)
        return x
#首先定义token embadding
"""
    将输入词汇表的索引转换成指定维度的Embedding
"""
from zmq import device


class TokenEmbedding(nn.Embedding):
    def __init__(self,vocab_size,d_model):
        """  
        初始化TokenEmbedding类。  
  
        参数:  
            vocab_size (int): 词汇表的大小。  
            d_model (int): Embedding的维度。  
  
        注意:  
            此类自动将索引为1的词汇视为填充词,并将其嵌入向量初始化为全零。  
            如果你不希望这样,可以手动设置padding_idx参数,或者将其设置为None。  
        """  
        super(TokenEmbedding,self).__init__(vocab_size,d_model,padding_idx=1)


class PositionalEmbedding(nn.Module):
    def __init__(self,d_model,max_len,device):
        """
            初始化位置矩阵
        """
        super(PositionalEmbedding,self).__init__()
        #初始化0矩阵
        self.encoding = torch.zeros(max_len,d_model,device=device)
        #位置编码不需要优化,就不需要梯度更新
        self.encoding.requires_grad = False
        #定义pos,生成位置索引
        pos = torch.arange(0,max_len)
        pos = pos.to(device)
        #类型转换为浮点型便于计算,在进行维度拓展为二维张量,利用广播机制自动对其
        pos = pos.float().unsqueeze(dim=1)
        #根据公式计算
        frequencies_indices = torch.arange(0, d_model, step=2, device=device).float()
        frequencies = 1.0/torch.pow(10000.0,frequencies_indices//d_model).unsqueeze(dim=0)
        self.encoding[:,0::2] = torch.sin(pos*frequencies)
        self.encoding[:,1::2] = torch.cos(pos*frequencies)
    def forward(self,x):
        #获取批量大小和序列长度
        batch_size,seq_len = x.size()
        return self.encoding[:seq_len,:]
    
class TransformerEmbedding(nn.Module):
    def __init__(self,vocab_size,d_model,max_len,drop_prob,device):
        super(TransformerEmbedding,self).__init__()
        self.tok_emb = TokenEmbedding(vocab_size=vocab_size,d_model=d_model)
        self.pos_emb = PositionalEmbedding(d_model=d_model,max_len=max_len,device=device)
        self.drop_out=nn.Dropout(p=drop_prob)
    
    def forward(self,x):
        tok_emb = self.tok_emb(x)
        pos_emb = self.pos_emb(x)
        return self.drop_out(tok_emb+pos_emb)


class Encoder(nn.Module):
    def __init__(self,enc_voc_size,max_len,d_model,ffn_hidden,n_head,n_layer,device,dropout=0.1):
        """
            enc_voc_size:词汇表的大小
            max_len:输入序列最大长度
            d_model:输入特征的维度
            ffn_hidden:隐藏层的神经元个数
            n_head:多头注意力机制的头数
            n_layer:Encoder有多少层
            dropout=0.1:dropout的概率
            divice:设备
        """
        super(Encoder,self).__init__()
        self.embedding = TransformerEmbedding(vocab_size=enc_voc_size,d_model=d_model,max_len=max_len,drop_prob=dropout,device=device)
        #定义layer
        self.layers = nn.ModuleList(
            [
                EncoderLayer(d_model=d_model,ffn_hidden=ffn_hidden,n_head=n_head,dropout=dropout)
                for _ in range(n_layer)
            ]
        )
    def forward(self,x,s_mask):
        #词汇映射
        x = self.embedding(x)
        for layer in self.layers:
            x = layer(x,s_mask)
        return x
        

标签:__,nn,self,Encoder,init,model,dropout
From: https://www.cnblogs.com/qian-li-xju/p/18319507

相关文章

  • Transformer模型:Encoder的self-attention mask实现
    前言         这是对Transformer模型的WordEmbedding、PostionEmbedding内容的续篇。视频链接:19、Transformer模型Encoder原理精讲及其PyTorch逐行实现_哔哩哔哩_bilibili文章链接:Transformer模型:WordEmbedding实现-CSDN博客          Transf......
  • VAE(Variational auto-encoder)
    1.VAE(Variationalauto-encoder)笔记来源及推荐文章:1.变分自编码器(一):原来是这么一回事2.变分自编码器(二):从贝叶斯观点出发3.变分自编码器(三):这样做为什么能成?4.变分自编码器(四):一步到位的聚类方案5.变分自编码器=最小化先验分布+最大化互信息6.变分自编码器(六):从几何......
  • T5架构和主流llama3架构有什么区别和优缺点、transformer中encoder 和decoder的不同、
    T5架构和主流llama3架构有什么区别和优缺点T5和LLaMA是两种在自然语言处理(NLP)领域广泛应用的大型语言模型,它们在架构和应用上有显著的区别和各自的优缺点。T5架构架构特点:Encoder-Decoder结构:T5(Text-to-TextTransferTransformer)采用了经典的Encoder-DecoderTransform......
  • jdk17 package sun.misc.BASE64Encoder 报找不到符号
    解决办法:对于只需要Base64编码的简单场景,可以考虑使用Java8及以上版本提供的内置`java.util.Base64`类,这是一个标准API,无需额外引入任何库: //importsun.misc.BASE64Encoder;//java8importjava.util.Base64;//java17publicclassBase64EncodingExample{......
  • 使用 PyTorch 创建的多步时间序列预测的 Encoder-Decoder 模型
    Encoder-decoder模型在序列到序列的自然语言处理任务(如语言翻译等)中提供了最先进的结果。多步时间序列预测也可以被视为一个seq2seq任务,可以使用encoder-decoder模型来处理。本文提供了一个用于解决Kaggle时间序列预测任务的encoder-decoder模型,并介绍了获得前10%结果......
  • AI模型大宗师Transformer的Encoder魔法棒
       在AI大模型数字王国里,有一位名叫Transformer的魔法大宗师。他有一个神奇的百宝箱,里面有很多魔法工具,其中有个工具叫Encoder,这个工具拥有一种神奇的力量,可以将复杂的输入信息进行编码,提取出关键的特征和依赖关系。   让我们来一起把这个工具掏出来细看一下,看看......
  • Transformer详解encoder
    目录1.InputEmbedding2.PositionalEncoding3.Multi-HeadAttention4.Add&Norm5.Feedforward+Add&Norm6.代码展示(1)layer_norm(2)encoder_layer=1最近刚好梳理了下transformer,今天就来讲讲它~        Transformer是谷歌大脑2017年在论文attention......
  • 最新最详细的media encoder安装包下载 附图文教程
    在我们学习英语的时候,有个ME的单词,代表“我”;同样,当我们学习视频编码的时候,ME代表了一款软件。AdobeMediaEncoder简称ME,是一款专业的视频编码软件。它主要用于将各种不同格式的视频、音频和图形文件转换成适合播放、流媒体传输或导出到其他项目中的格式。这个工具在音视频制......
  • 【异常】nested exception is java.lang.NoClassDefFoundError: redis/clients/jedis/
    原因是版本冲突。以下我原本使用的版本信息<!--SpringBootRedis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.1.8.RELEASE</version><......
  • LLM大模型: FlagEmbedding-BiEncoderModel原理和源码解析
    NLP常见的任务之一是高效检索:在大规模语料库中快速检索与查询相关的段落或文档;用户输入query,要在语料库中找到语义最接近、最匹配的回答!此外,还有文本分类、情感分析等下游任务需要先把文本的embedding求出来,这些功能都能通过"双塔结构"(Bi-Encoder)实现!核心思路很简单:用两个不同......