Bert源码解读

本文深入探讨Transformer的实现细节,包括Q、K、V的设计,并解析Bert在TensorFlow 2.4.1中的源码实现,涉及预训练数据创建、注意力机制和预训练模型的训练过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Transformer

讲的最好的一篇(我认为) 用pytorch一步步实现

  • 他的multihead应该是错的,不应该吧embediing分开,而应该有多个Q,K,V
    在这里插入图片描述
    错误解决方案请看这篇或者中文版,并且讲述了bert,吧所有head的output拼在一起,并训练 W o W_o Wo使其回归到原来的大小
    attention的输出是每一个词的embedding,somehow有其他词的attention。每个词是v1*attention_v1 + v2*attention_v2 …

第一层attention的每个词size都是embedding,其余的都是num_attention_heads
* size_per_head
The feed-forward layer is not expecting eight matrices

  • 不完全是,Bert里面就没有进行“压缩”。 不一定需要 W o W^o Wo

Q和K长度要一致,V不一定

Bert

在这里插入图片描述

本篇基于tensorflow.2.4.1, 源码在library里面
直接看github上的源码, from Google-research
首先看前两个argument,from_tensorto_tensor. 可以吧第一个理解为input句子,

  • from_tensor 和 to_tensor
    • batch_size: 多少个句子
    • from_seq_length(每个句子多少个单词),
    • from_width: 每个单词的长度*head的数量
    • 源码其实已经压缩成了2d tensor, 为了方便矩阵相乘(line 823)

Bert只用self-attention, 在833行可以看到

          attention_head = attention_layer(
              from_tensor=layer_input,
              to_tensor=layer_input

两行的input是一样的

W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV在line 666-687被定义

  query_layer = tf.layers.dense(
      from_tensor_2d,
      num_attention_heads * size_per_head,
      activation=query_act,
      name="query",
      kernel_initializer=create_initializer(initializer_range))
      ...

接下来算attention
A t t e n t i o n ( Q , K , V ) = softmax ( Q K T d k ) V Attention(Q, K, V ) = \text{softmax}(\frac{QK^T}{ \sqrt d_k} )V Attention(Q,K,V)=softmax(d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值