对话大模型底层逻辑(一)Transformer模型的输入表示部分

Transformer模型的输入表示部分是通过以下步骤生成的:

  1. 词汇表(Vocabulary):需要建立一个包含所有可能词汇的词汇表。词汇表通常是按照词频排序的,以便模型能够更有效地学习常见的词汇。

  2. 分词(Tokenization):文本数据被分割成一系列的词或子词(tokens)。这个过程可能涉及到单词分割、去除标点符号等。

  3. 索引化(Indexing):将分词后的词转换为词汇表中的索引。每个索引代表词汇表中对应的词。

  4. 嵌入层(Embedding Layer):索引化的词汇通过嵌入层转换为密集的向量表示。嵌入层通常是一个可学习的参数矩阵,其中每一行代表词汇表中一个词的向量表示。

  5. 位置编码(Positional Encoding):由于Transformer模型没有递归和卷积层,无法自动捕获序列中的位置信息,因此需要手动添加位置编码。位置编码通常是基于正弦和余弦函数的固定模式,添加到嵌入向量中。

以下为一个简化的Python代码示例,说明如何实现上述步骤:

import torch
import torch.nn as nn
import torch.nn.functional as F

# 假设我们已经有了一个词汇表,并定义了一些基本的参数
vocab_size = 10000
embed_dim = 512
max_seq_len = 100

# 嵌入层
embedding = nn.Embedding(vocab_size, embed_dim)

# 位置编码
pos_encoding = torch.zeros(max_seq_len, embed_dim)
position = torch.arange(0, max_seq_len, dtype=torch.float).unsqueeze(1)
div_term = torch.exp(torch.arange(0, embed_dim, 2).float() * (-math.log(10000.0) / embed_dim))
pos_encoding[:, 0::2] = torch.sin(position * div_term)
pos_encoding[:, 1::2] = torch.cos(position * div_term)

# 假设我们有一段文本数据,已经被分词并转换为索引序列
text_indices = [...]  # 例如:[123, 456, 789, ...]

# 将索引序列转换为张量,并嵌入词汇
text_embedding = embedding(torch.LongTensor(text_indices))

# 添加位置编码
text_embedding_pos = text_embedding + pos_encoding[:text_embedding.size(0)]

# 现在text_embedding_pos包含了模型输入的表示

在这个示例中,embedding是嵌入层,pos_encoding是位置编码,text_indices是分词后文本的索引序列。
整个代码实现过程中,首先将索引序列通过嵌入层转换为词向量,然后将位置编码加到这些词向量上,以形成模型的输入表示。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值