(三)自然语言处理笔记——Transformer

(三)自然语言处理笔记------Transformer

1、Transformer结构

2、Transformer输入部分代码实现

python 复制代码
import torch
import torch.nn as nn
import math
from torch.autograd import Variable
import matplotlib.pyplot as plt
import numpy as np


# Embeddings 类 实现思路分析
# 1 init函数 准备1个层 self.lut层 def __init__(self, d_model, vocab)
# 2 forward(x)函数 self.lut(x) * math.sqrt(self.d_model)
class Embeddings(nn.Module):
    def __init__(self, d_model, vocab):
        super(Embeddings, self).__init__()
        self.d_model = d_model
        self.vocab = vocab

        # self.lut层
        self.lut = nn.Embedding(vocab, d_model)

    def forward(self, x):
        x = self.lut(x) * math.sqrt(self.d_model)
        return  x


def dm01_test_Embeddings():
    # 1 准备数据
    x = torch.tensor([[100, 2, 421, 508], [491, 998, 1, 221]])

    # 2 实例化文本词嵌入层
    myembeddings = Embeddings(512, 1000)   # 传入的是嵌入的维度,单词数量
    print('myembeddings-->', myembeddings)

    # 3 给模型喂数据 [2,4] ---> [2,4,512]
    embed_res = myembeddings(x)
    print('embed_res-->', embed_res.shape, embed_res)
    pass



# 位置编码器类 PositionalEncoding 实现思路分析
# 1 init函数  (self, d_model, dropout, max_len=5000)
#   super()函数 定义层self.dropout
#   定义位置编码矩阵pe  定义位置列-矩阵position 定义变化矩阵div_term 套公式
        # position = torch.arange(0, max_len).unsqueeze(1)
        # div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0)/d_model))
#   位置列-矩阵*变化矩阵 阿达码积 my_matmulres, 给pe矩阵偶数列奇数列赋值 pe[:, 0::2] pe[:, 1::2]
#   pe矩阵注册到模型缓冲区 pe.unsqueeze(0)三维 self.register_buffer('pe', pe)
# 2 forward(self, x) 返回self.dropout(x)
#   给x数据添加位置特征信息 x = x + Variable( self.pe[:,:x.size()[1]], requires_grad=False)
class PositionalEncoding(nn.Module):
    def __init__(self, d_model,  dropout=0.1, max_len=5000):
        super(PositionalEncoding, self).__init__()
        self.dropout = nn.Dropout(p=dropout)

        #  定义位置编码矩阵pe
        pe = torch.zeros(max_len, d_model)
        # 定义位置列-矩阵position [60,1]
        position = torch.arange(0, max_len).unsqueeze(1)
        # 定义变化矩阵div_term 套公式 [1,256]
        div_term = torch.exp( torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model) )

        #   位置列-矩阵*变化矩阵 阿达码积 my_matmulres, 给pe矩阵偶数列奇数列赋值 pe[:, 0::2] pe[:, 1::2]
        my_matmulres = position * div_term # [60,1] * [1,256]==> [60, 256]
        pe[:, 0::2] = torch.sin(my_matmulres)
        pe[:, 1::2] = torch.cos(my_matmulres)

        #   pe矩阵注册到模型缓冲区 pe.unsqueeze(0)三维 self.register_buffer('pe', pe)
        pe = pe.unsqueeze(0) #[60, 256]--> [1,60,256]
        self.register_buffer('pe', pe)

    def forward(self, x):
        tmp = x.size()[1]
        x = x + Variable( self.pe[:, :x.size()[1]], requires_grad=False )
        return  x


def dm02_test_PositionalEncoding():
    # 1 准备数据
    x = torch.tensor([[100, 2, 421, 508], [491, 998, 1, 221]])

    # 2 实例化文本词嵌入层
    myembeddings = Embeddings(512, 1000)
    print('myembeddings-->', myembeddings)

    # 3 给模型喂数据 [2,4] ---> [2,4,512]
    embed_res = myembeddings(x)
    print('embed_res-->', embed_res.shape, embed_res)

    # 4 添加位置信息
    mypositionalencoding = PositionalEncoding(d_model=512,  dropout=0.1, max_len=60)
    print('mypositionalencoding-->', mypositionalencoding)

    pe_res = mypositionalencoding(embed_res)
    print('添加位置特征以后的x-->', pe_res.shape)



if __name__ == '__main__':
    dm01_test_Embeddings()
    dm02_test_PositionalEncoding()
    print('输入部分 End')



python 复制代码
import torch
import torch.nn as nn
import math
from torch.autograd import Variable
import matplotlib.pyplot as plt
import numpy as np


# Embeddings 类 实现思路分析
# 1 init函数 准备1个层 self.lut层 def __init__(self, d_model, vocab)
# 2 forward(x)函数 self.lut(x) * math.sqrt(self.d_model)
class Embeddings(nn.Module):
    def __init__(self, d_model, vocab):
        super(Embeddings, self).__init__()
        self.d_model = d_model
        self.vocab = vocab

        # self.lut层
        self.lut = nn.Embedding(vocab, d_model)

    def forward(self, x):
        x = self.lut(x) * math.sqrt(self.d_model)
        return  x


def dm01_test_Embeddings():
    # 1 准备数据
    x = torch.tensor([[100, 2, 421, 508], [491, 998, 1, 221]])

    # 2 实例化文本词嵌入层
    myembeddings = Embeddings(512, 1000)   # 传入的是嵌入的维度,单词数量
    print('myembeddings-->', myembeddings)

    # 3 给模型喂数据 [2,4] ---> [2,4,512]
    embed_res = myembeddings(x)
    print('embed_res-->', embed_res.shape, embed_res)
    pass



# 位置编码器类 PositionalEncoding 实现思路分析
# 1 init函数  (self, d_model, dropout, max_len=5000)
#   super()函数 定义层self.dropout
#   定义位置编码矩阵pe  定义位置列-矩阵position 定义变化矩阵div_term 套公式
        # position = torch.arange(0, max_len).unsqueeze(1)
        # div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0)/d_model))
#   位置列-矩阵*变化矩阵 阿达码积 my_matmulres, 给pe矩阵偶数列奇数列赋值 pe[:, 0::2] pe[:, 1::2]
#   pe矩阵注册到模型缓冲区 pe.unsqueeze(0)三维 self.register_buffer('pe', pe)
# 2 forward(self, x) 返回self.dropout(x)
#   给x数据添加位置特征信息 x = x + Variable( self.pe[:,:x.size()[1]], requires_grad=False)
class PositionalEncoding(nn.Module):
    def __init__(self, d_model,  dropout=0.1, max_len=5000):
        super(PositionalEncoding, self).__init__()
        self.dropout = nn.Dropout(p=dropout)

        #  定义位置编码矩阵pe
        pe = torch.zeros(max_len, d_model)
        # 定义位置列-矩阵position [60,1]
        position = torch.arange(0, max_len).unsqueeze(1)
        # 定义变化矩阵div_term 套公式 [1,256]
        div_term = torch.exp( torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model) )

        #   位置列-矩阵*变化矩阵 阿达码积 my_matmulres, 给pe矩阵偶数列奇数列赋值 pe[:, 0::2] pe[:, 1::2]
        my_matmulres = position * div_term # [60,1] * [1,256]==> [60, 256]
        pe[:, 0::2] = torch.sin(my_matmulres)
        pe[:, 1::2] = torch.cos(my_matmulres)

        #   pe矩阵注册到模型缓冲区 pe.unsqueeze(0)三维 self.register_buffer('pe', pe)
        pe = pe.unsqueeze(0) #[60, 256]--> [1,60,256]
        self.register_buffer('pe', pe)

    def forward(self, x):
        tmp = x.size()[1]
        x = x + Variable( self.pe[:, :x.size()[1]], requires_grad=False )
        return  x


def dm02_test_PositionalEncoding():
    # 1 准备数据
    x = torch.tensor([[100, 2, 421, 508], [491, 998, 1, 221]])

    # 2 实例化文本词嵌入层
    myembeddings = Embeddings(512, 1000)
    print('myembeddings-->', myembeddings)

    # 3 给模型喂数据 [2,4] ---> [2,4,512]
    embed_res = myembeddings(x)
    print('embed_res-->', embed_res.shape, embed_res)

    # 4 添加位置信息
    mypositionalencoding = PositionalEncoding(d_model=512,  dropout=0.1, max_len=60)
    print('mypositionalencoding-->', mypositionalencoding)

    pe_res = mypositionalencoding(embed_res)
    print('添加位置特征以后的x-->', pe_res.shape)



if __name__ == '__main__':
    dm01_test_Embeddings()
    dm02_test_PositionalEncoding()
    print('输入部分 End')

3、Transformer编码器部分

掩码张量


python 复制代码
def dm01_test_nptriu():
    # m:表示一个矩阵
    # K:表示对角线的起始位置(k取值默认为0)
    # return: 返回函数的上三角矩阵

    # 测试产生上三角矩阵
    print('k=1\n', np.triu([[1, 1, 1, 1, 1],
                   [2, 2, 2, 2, 2],
                   [3, 3, 3, 3, 3],
                   [4, 4, 4, 4, 4],
                   [5, 5, 5, 5, 5]], k=1))
    print('k=0\n', np.triu([[1, 1, 1, 1, 1],
                   [2, 2, 2, 2, 2],
                   [3, 3, 3, 3, 3],
                   [4, 4, 4, 4, 4],
                   [5, 5, 5, 5, 5]], k=0))
    print('k=-1\n', np.triu([[1, 1, 1, 1, 1],
                   [2, 2, 2, 2, 2],
                   [3, 3, 3, 3, 3],
                   [4, 4, 4, 4, 4],
                   [5, 5, 5, 5, 5]], k=-1))
    pass

自注意力机制模块

相关推荐
星恒随风6 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
2603_969694859 小时前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
可乐ea9 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
Go Work13 小时前
两个等值条件摆着,MySQL 偏要全表扫
经验分享·笔记
Oll Correct13 小时前
Adobe illustrator 案例十四:花元素标志草图绘制
笔记·ui·adobe·illustrator
每月一号准时摆烂18 小时前
服务器运维笔记(一)——使用shell编写实时查看BMC功率的脚本
运维·服务器·笔记
柳鲲鹏2 天前
内斗学概论:43、平级内斗
笔记
星恒随风2 天前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Z21-X2 天前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
晓梦林2 天前
BUUCTF-菜刀流量-MISC-学习笔记
笔记·学习