自然语言处理:transfomer架构

介绍

transfomer是自然语言处理中的一个重要神经网络结构,算是在传统RNN和LSTM上的一个升级,接下来让我们来看看它有处理语言序列上有哪些特殊之处

模型整体架构

原论文中模型的整体架构如下,接下来我们将层层解析各层的作用和代码实现

该模型架构主要包含的基本层有

  • 嵌入层(Input Embedding)
  • 位置编码层(Positional Encoding)
  • 多头注意力层(Multi-Head Attention)
  • 全连接层(Feed Forward)

位置编码层

作用

顾名思义,位置编码层使模型能够记住输入句子的位置信息,语序在理解自然语言方面起到很大的作用

位置编码层的结构

  • 嵌入层(Input Embedding)
  • 位置编码层(Positional Encoding)

嵌入层扩充句子维度,这也是模型训练的关键数据,位置编码层则给句子中的每个词赋予位置信息,因为嵌入层在torch中有函数可以直接调用,所以这里和位置编码层放在一起处理

位置编码的方法

我们将pe当作位置编码,pos为句子当中的第pos个词,i是第i个词向量维度,dmodel为编码维度总数。则

P E p o s , 2 i = s i n ( p o s 1000 0 i / d m o d e l ) PE_{pos, 2i}=sin(\frac{pos}{10000^{i/dmodel}}) PEpos,2i=sin(10000i/dmodelpos)

P E p o s , 2 i + 1 = c o s ( p o s 1000 0 i / d m o d e l ) PE_{pos, 2i+1}=cos(\frac{pos}{10000^{i/dmodel}}) PEpos,2i+1=cos(10000i/dmodelpos)

使用正弦和余弦函数有几个原因:

  • 可学习性: 通过使用正弦和余弦函数,模型可以学习位置编码的参数。这允许模型自动调整和适应不同任务和数据集的序列长度,而无需手动调整位置编码的固定参数。

  • 连续性: 正弦和余弦函数是连续的,这有助于确保位置编码的连续性。这对于模型学习和推广到未见过的序列长度是有益的。

  • 相对位置信息: 正弦和余弦函数的组合能够编码相对位置信息。这意味着不同位置之间的距离和关系可以以一种更灵活的方式进行编码,而不是简单的线性关系。

  • 周期性: 正弦和余弦函数具有周期性,这有助于模型在处理不同尺度的序列时更好地捕捉全局位置信息。

具体代码

接下来我们来看实现位置编码层的代码

这里以输入句子长度为50来举例

python 复制代码
# 定义位置编码层
class PositionEmbedding(torch.nn.Module) :
    def __init__(self):
        super().__init__()
        # pos是第几个词,i是第几个词向量维度,d_model是编码维度总数
        def get_pe(pos, i, d_model):
            d = 1e4**(i / d_model)
            pe = pos / d
            if i % 2 == 0:
                return math.sin(pe) # 偶数维度用sin
            return math.cos(pe) # 奇数维度用cos
        # 初始化位置编码矩阵
        pe = torch.empty(50, 32)
        for i in range(50):
            for j in range(32):
                pe[i, j] = get_pe(i, j, 32)
        pe = pe. unsqueeze(0) # 增加一个维度,shape变为[1,50,32]
        # 定义为不更新的常量
        self.register_buffer('pe', pe)
        # 词编码层
        self.embed = torch.nn.Embedding(39, 32) # 39个词,每个词编码成32维向量
        # 用正太分布初始化参数
        self.embed.weight.data.normal_(0, 0.1)
    def forward(self, x):
        # [8,50]->[8,50,32]
        embed = self.embed(x)
        # 词编码和位置编码相加
        # [8,50,32]+[1,50,32]->[8,50,32]
        embed = embed + self.pe
        return embed

文章将三天一更,将结构详细解析完为止,下一次将讲解掩码Mask的作用...

相关推荐
中电金信14 分钟前
开发更高效、监控更实时、运维更省心,源启数据开发平台构筑一站式数据开发新底座
网络·数据库·人工智能
科技云报道14 分钟前
从佩戴到交互全面升级:乐奇Rokid发布Rokid Glasses 2,让AI眼镜更自然地融入日常
人工智能
小亮_money15 分钟前
Agent开发工程师-Python环境搭建
人工智能·python
rolt17 分钟前
04 ESLint和Dijkstra-评点茹炳晟文章中的一段话
人工智能·软件工程·ddd·领域驱动设计·敏捷开发
AI_Cloud_推荐20 分钟前
一张图 15,000 tokens:生成侧与理解侧不是一套算法
人工智能
AIGS00126 分钟前
业务录一遍、样品组再录一遍,AI该替谁改?
人工智能·数字员工·流程优化·企业ai落地·本体语义
AI天行健34 分钟前
广告团队用 AI 视频生成无限画布做多版本投放素材:流程与成本拆解
人工智能
利威尔xu37 分钟前
RAG 检索面试十连问:召回率从 92% 掉到 61%,答案句被拦腰截断怎么排查
人工智能·后端·大模型·向量数据库·rag
4SAPI37 分钟前
多模态 AI 应用统一接入网关生产选型指南:4SAPI、硅基流动与 OpenRouter 的架构权衡
大数据·人工智能·架构·php·1024程序员节
自动化测试行业观察1 小时前
AI智能测试用例生成技术解析:多源融合+LLM混合生成方案与实践
自动化测试·人工智能·科技·测试用例·智能化测试·ai测试平台·ai智能遍历