Transformer 大语言模型(LLM)基石 - Transformer架构详解 - 输入嵌入层(Input Embeddings)详解以及算法实现

锋哥原创的Transformer 大语言模型(LLM)基石视频教程:

https://www.bilibili.com/video/BV1X92pBqEhV

课程介绍

本课程主要讲解Transformer简介,Transformer架构介绍,Transformer架构详解,包括输入层,位置编码,多头注意力机制,前馈神经网络,编码器层,解码器层,输出层,以及Transformer Pytorch2内置实现,Transformer基于PyTorch2手写实现等知识。

Transformer 大语言模型(LLM)基石 - Transformer架构详解 - 输入嵌入层(Input Embeddings)详解以及算法实现

前面我们说过输入嵌入层的作用是将原始的词语表示(通常是单词或子词)转换为高维的密集向量。每个单词或子词通过词嵌入(Embedding)转化为向量,模型之后将处理这些向量。

  • 功能:将输入的离散单词映射为连续的高维空间向量,便于后续的处理。

  • 结构:该层的输出是一个序列的嵌入矩阵,矩阵的维度为batch_size, seq_len, embedding_dim。

比如我们有一组数据集:

仅仅包含三个句子

N 表示总数,最后的结果是去重之后的词汇量

注意点:这里举例比较简单,是英文,我们直接空格分词就行。如果是中文的话,我们一般用jieba分词。分词结果去重后,就是总的词汇量。

如何将这些词在计算机中表示,以及进行运算。

我们这里介绍先对词进行编码,然后向量化。

首先是Encoding 编码

为每个单独的单词分配一个唯一的数字。

然后就是计算 Embeding

然后我们设计好每个词的词嵌入维度,比如是6,相当于每个词有6个特征。

原始论文使用 512 维向量,这里使用嵌入向量的维度为 6,上面是原始数据,下面是解析之后的数据。

我们新建一个Python项目,终端安装下PyTorch

复制代码
pip install torch==2.9.1 torchvision==0.24.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

代码实现:

复制代码
import math
​
import torch
from torch import nn
​
​
# 输入嵌入层类
class Embeddings(nn.Module):
    def __init__(self, vocab_size, embedding_dim):  # vocab_size:词表大小 embedding_dim:词嵌入维度的大小
        super().__init__()
        self.embedding_dim = embedding_dim
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
​
    def forward(self, x):
        embed = self.embedding(x)
        # 缩放词嵌入(原始Transformer论文中的关键细节) 防止向量初始值过大,稳定训练
        return embed * math.sqrt(self.embedding_dim)
​
​
if __name__ == '__main__':
    vocab_size = 2000  # 词表大小
    embedding_dim = 512  # 词嵌入维度的大小
    embeddings = Embeddings(vocab_size, embedding_dim)
    embed_result = embeddings(torch.tensor([[1999, 2, 99, 4, 5], [66, 2, 3, 22, 5], [66, 2, 3, 4, 5]]))
    print(embed_result.shape)
    print(embed_result)

运行结果:

复制代码
torch.Size([3, 5, 512])
tensor([[[ -6.6145,   0.7250, -25.3896,  ...,   1.6865, -12.6732,  -5.5132],
         [ 19.5802,  -1.6906, -36.3070,  ...,  -5.9230,   9.9505,  49.2125],
         [  7.9797,  11.9496, -15.4930,  ...,  72.7194,  10.6238, -19.9825],
         [ 16.5478,  16.9025,  33.3123,  ..., -14.4243,  12.2261,  53.3915],
         [  5.8041,   7.9344,  -8.1885,  ..., -45.0107,  30.0579,  21.0987]],
​
        [[-24.4609,  12.4930, -24.3712,  ...,  13.3388, -16.3208, -23.2783],
         [ 19.5802,  -1.6906, -36.3070,  ...,  -5.9230,   9.9505,  49.2125],
         [ 58.9308,   2.7596,   2.6795,  ...,   0.6120,  10.8724,  12.0722],
         [  0.4406, -24.8641, -19.6754,  ..., -21.1263, -13.1530,  35.8521],
         [  5.8041,   7.9344,  -8.1885,  ..., -45.0107,  30.0579,  21.0987]],
​
        [[-24.4609,  12.4930, -24.3712,  ...,  13.3388, -16.3208, -23.2783],
         [ 19.5802,  -1.6906, -36.3070,  ...,  -5.9230,   9.9505,  49.2125],
         [ 58.9308,   2.7596,   2.6795,  ...,   0.6120,  10.8724,  12.0722],
         [ 16.5478,  16.9025,  33.3123,  ..., -14.4243,  12.2261,  53.3915],
         [  5.8041,   7.9344,  -8.1885,  ..., -45.0107,  30.0579,  21.0987]]],
       grad_fn=<MulBackward0>)

注意点:传入的词向量数值大小不能大于等于定义的vocab_size词表大小。否则越界报错

比如 改成2000

就会报错:

相关推荐
Rocky Ding*7 小时前
深入解析GPT-6 Astra提示词工程:从Skills、AGENTS.md到可验证的Agent交付
论文阅读·人工智能·深度学习·机器学习·aigc·ai-native·提示词工程
江润舟8 小时前
万物|炼器:从零手搓工业级旋转目标检测网络·卷5 —— YAML蓝图与parse_model动态引擎(一)
人工智能·深度学习
EasyGBS8 小时前
水域乱象难管控?国标GB28181视频平台EasyGBS视频+AI双引擎赋能河湖监管
深度学习·安全·gb28181
紧跟先前的步伐10 小时前
Go AI Agent 实战 02|大语言模型(LLM)到底是怎么工作的
人工智能·语言模型·golang
老鱼说AI10 小时前
脉冲神经网络:神经网络发展历史背景
人工智能·深度学习·神经网络·机器学习·自然语言处理·学习方法
frankzch11 小时前
Claude 刷新量子电路最优:LLM 与评估器的进化循环怎么搭
人工智能·深度学习·机器学习·语言模型·量子计算
拜小白11 小时前
【论文解读】PanoSwin:为全景理解打造的“全景版“ Swin Transformer
深度学习·计算机视觉·全景图
打工仔折腾 AI12 小时前
从零开始大模型微调:基于 PyTorch 与 ChatGLM 的 LoRA 实践指南
人工智能·pytorch·后端·python·深度学习·性能优化·ai agent 实战
高洁0112 小时前
具身智能感知系统底层原理
人工智能·python·深度学习·机器学习·transformer
在所不辞兄14 小时前
为什么残差连接能够缓解深层神经网络的退化问题,而不仅仅是改善梯度传播?
人工智能·深度学习·神经网络·机器学习