transformer 最简单学习1 输入层embeddings layer,词向量的生成和位置编码

[图片]
[图片]

词向量的生成可以通过嵌入层(Embedding Layer)来完成。嵌入层是神经网络中的一种常用层,用于将离散的词索引转换为密集的词向量。以下是一个典型的步骤:
建立词表:首先,需要从训练数据中收集所有的词汇,并为每个词汇分配一个唯一的索引。这个过程称为建立词表。词表中包含了所有可能的词汇以及它们的索引,通常是一个字典或者哈希表的形式。
初始化词向量矩阵:对于每个词汇,都会有一个对应的词向量。可以随机初始化这些词向量,也可以使用预训练的词向量,比如Word2Vec、GloVe或FastText。
嵌入层映射:嵌入层将词索引作为输入,并输出对应的词向量。在训练过程中,这些词向量会被优化以最大化模型的性能。
词向量缩放:在Transformer模型中,通常会对词向量进行缩放,以确保它们具有适当的尺度。这个缩放因子通常是词向量的维度的平方根,如示例中的 math.sqrt(self.d_model)。
具体到代码中的示例,self.lut(x) 可以理解为嵌入层,它接收一个词的索引作为输入,然后从词向量矩阵中检索对应的词向量。乘以 math.sqrt(self.d_model) 的操作则是对词向量进行缩放,以确保其数值范围适合模型的需求。

在这里插入图片描述

找到单词在词表中对应的索引:首先,根据单词在词汇表中的位置或唯一标识,找到该单词在词表中的索引位置。
将索引映射为512维的向量:通过嵌入层,将单词的索引映射为一个固定维度的向量,通常这个向量的维度是预先指定的,比如512维。
这样,每个单词都被映射为一个固定长度的密集向量,而这些向量通常包含了单词的语义信息。这些向量随后将作为模型的输入,用于进行后续的计算,比如在Transformer模型中进行自注意力机制等操作。

import torch
import torch.nn as nn

# 假设词表大小为100,即有100个不同的单词
vocab_size = 100
# 定义嵌入层,将索引映射为10维的向量
embedding_layer = nn.Embedding(vocab_size, 10)

# 定义一个输入单词的索引
word_index = torch.tensor([5])  # 假设单词的索引是5

# 通过嵌入层,将索引映射为10维的向量
embedded_vector = embedding_layer(word_index)

print("嵌入后的向量:", embedded_vector)

embedding = nn.Embedding(10,3,padding_idx=0)  #,padding_idx=0 数字0转换的多维度数据都是0
# input1 =  torch.LongTensor([[1,2,4,5],[3,2,4,6]])
input1 =  torch.LongTensor([[1,0,4,0]])
print(embedding(input1))


###########################

tensor([[[ 0.1610, -1.2377,  1.3285],
         [ 0.0000,  0.0000,  0.0000],
         [ 2.4994,  0.9405, -0.8696],
         [ 0.0000,  0.0000,  0.0000]]], grad_fn=<EmbeddingBackward>)

2、位置编码

计算结果一致,结论是sin-cos这种位置编码方式,任意位置的位置编码都可以表达为一个已
知位置的位置编码的关于距离的线性组合。也是因为有这个特质采用三角函数表征位置信息,
同时由于padding的词不需要存在这种相对位置表达性质,因此对padding的位置向量做了全
0处理。

同一个单词相对位置进行记录,同时值在-1,1 之间比较小
位置编码的介绍:https://zhuanlan.zhihu.com/p/525552086

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单Transformer模型的代码示例: ```python import tensorflow as tf from tensorflow.keras.layers import Input, Dense, Dropout, LayerNormalization, MultiHeadAttention, \ SpatialDropout1D, GlobalAveragePooling1D, Concatenate def transformer_model(num_tokens, max_seq_length, num_heads, hidden_size, dropout_rate): # Input token and position embeddings input_layer = Input(shape=(max_seq_length,)) x = tf.keras.layers.Embedding(num_tokens, hidden_size)(input_layer) positional_encoding = tf.keras.layers.Embedding(max_seq_length, hidden_size)(tf.range(start=0, limit=max_seq_length, delta=1)) x = tf.keras.layers.Add()([x, positional_encoding]) # Transformer layers for i in range(num_heads): attention = MultiHeadAttention(num_heads=num_heads, key_dim=hidden_size//num_heads)(x, x) x = Concatenate()([x, attention]) x = LayerNormalization()(x) x = SpatialDropout1D(dropout_rate)(x) feed_forward = Dense(hidden_size, activation='relu')(x) feed_forward = Dense(hidden_size)(feed_forward) x = Concatenate()([x, feed_forward]) x = LayerNormalization()(x) x = SpatialDropout1D(dropout_rate)(x) # Global average pooling and output layer x = GlobalAveragePooling1D()(x) output_layer = Dense(1, activation='sigmoid')(x) model = tf.keras.models.Model(inputs=input_layer, outputs=output_layer) return model ``` 该Transformer模型包括以下组件: - 输入输入序列的token索引,最大序列长度为`max_seq_length`。 - 位置向量嵌入:将每个token的位置嵌入到词嵌入向量中,以便模型能够理解序列中每个token的位置信息。 - Transformer:由多个Transformer块组成,每个块包含一个多头自注意力和一个前馈网络。 - 全局平均池化:对序列中的所有token进行平均池化,以便最终输出一个固定长度的向量。 - 输出:使用sigmoid激活函数输出二分类预测结果。 该模型可以通过调用`transformer_model()`函数来创建,需要提供以下参数: - `num_tokens`:输入序列中的唯一token数量。 - `max_seq_length`:输入序列的最大长度。 - `num_heads`:Transformer自注意力中的头数。 - `hidden_size`:Transformer模型中的隐藏维度。 - `dropout_rate`:用于在模型中添加dropout的dropout率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值