手撕transformer-基于numpy实现

Attention is all you need
在这里插入图片描述

在Transformer模型中,输入首先通过一个嵌入层,得到每个词的嵌入表示,然后再加上位置编码(Positional Encoding)得到每个词的最终表示。得到这个最终表示后,为了计算注意力权重,我们需要为每个输入生成 Q (Query), K (Key), 和 V (Value)。

具体的转换过程如下:

  1. 词嵌入: 首先,我们有一个嵌入矩阵,其大小为 (vocab_size, d_model),其中 vocab_size 是词汇表的大小,d_model 是模型的维度。输入句子中的每个词都会通过查找这个嵌入矩阵得到其嵌入表示。

    embeddings = embedding_matrix[input_sentence]
    
  2. 位置编码: 之后,我们会加上位置编码。这一步是为了给模型提供词的位置信息,因为Transformer模型本身没有关于位置的固有概念。

    embeddings += positional_encoding
    
  3. 生成 Q, K, 和 V: 接下来,我们将嵌入结果(词嵌入+位置编码)传递给三个不同的全连接层(dense layers),分别得到 Q, K 和 V。

    Q = np.dot(embeddings, WQ)
    K = np.dot(embeddings, WK)
    V = np.dot(embeddings, WV)
    

    这里的 WQ, WK, 和 WV 是三个权重矩阵,它们是模型需要学习的参数。

简而言之,输入首先被转换为嵌入表示,然后加上位置编码,最后通过三个不同的全连接层得到 Q, K 和 V。

Scaled Dot-Product Attention

在这里插入图片描述
在这里插入图片描述

import numpy as np

def scaled_dot_product_attention(q, k, v, mask=None):
   matmul_qk = np.dot(q, k.T)
   d_k = k.shape[-1]
   scaled_attention_logits = matmul_qk / np.sqrt(d_k)

   if mask is not None:
       scaled_attention_logits += (mask * -1e9)

   attention_weights = np.exp(scaled_attention_logits) / np.sum(np.exp(scaled_attention_logits), axis=-1, keepdims=True)
   output = np.dot(attention_weights, v)
   return output, attention_weights

# 测试
d_k = 3
batch_size = 1

# Query: 我们要查询的内容,这里假设是一个批次中的两个句子,每个句子有3个词,每个词的嵌入维度是3。
q = np.array([[1, 0, 1], [0, 2, 0], [1, 1, 0]]) 

# Key: 我们要匹配的内容
k = np.array([[1, 1, 0], [0, 1, 1], [1, 0, 1]</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值