bert,transformer架构图及面试题

Transformer详解 - mathor

atten之后经过一个全连接层+残差+层归一化

python 复制代码
`class BertSelfOutput(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.dense = nn.Linear(config.hidden_size, config.hidden_size)
        self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
        self.dropout = nn.Dropout(config.hidden_dropout_prob)

    def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor:
        hidden_states = self.dense(hidden_states)  # 全连接 768->768
        hidden_states = self.dropout(hidden_states)
        hidden_states = self.LayerNorm(hidden_states + input_tensor) # 残差和层归一化
        return hidden_states`

残差的作用:避免梯度消失

归一化的作用:避免梯度消失和爆炸,加速收敛

然后再送入一个两层的前馈神经网络

python 复制代码
`class BertIntermediate(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.dense = nn.Linear(config.hidden_size, config.intermediate_size)
        if isinstance(config.hidden_act, str):
            self.intermediate_act_fn = ACT2FN[config.hidden_act]
        else:
            self.intermediate_act_fn = config.hidden_act

    def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
        hidden_states = self.dense(hidden_states)  # [1, 16, 3072] 映射到高维空间:768 -> 3072
        hidden_states = self.intermediate_act_fn(hidden_states)
        return hidden_states`
python 复制代码
`class BertOutput(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.dense = nn.Linear(config.intermediate_size, config.hidden_size)
        self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
        self.dropout = nn.Dropout(config.hidden_dropout_prob)

    def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor:
        hidden_states = self.dense(hidden_states)  # 3072 -> 768
        hidden_states = self.dropout(hidden_states)
        hidden_states = self.LayerNorm(hidden_states + input_tensor)  # 残差和层归一化
        return hidden_states`

面试题:为什么注意力机制中要除以根号dk

答:因为q和k做点积后值会很大,会导致反向传播时softmax函数的梯度很小。除以根号dk是为了保持点积后的值均值为0,方差为1.(q和k都是向量)

证明:已知q和k相互独立,且是均值为0,方差为1。

则D(qi*ki)=D(qi)*D(ki)=1

除以dk则D((qi*ki)/根号dk)=1/dk,每一项是这个值,但是根据上面红框的公式,一共有dk项求和,值为1

所以(q*k)/dk的方差就等1

(背景知识)方差性质:

D(CX)=C^2D(X) ,其中C是常量

相关推荐
秋93 分钟前
《世界的本质》的深度分析与解读,给出了如何“顺天应人”以实现个人价值最大化的行动指南
人工智能
卡梅德生物科技小能手6 分钟前
免疫检查点核心机制解析:CD274(分化抗原274)的信号通路与药物研发进展
经验分享·深度学习·生活
阿钱真强道11 分钟前
04 从 MLP 到 LeNet:sigmoid 和 softmax 到底在做什么?为什么输出层需要它们?
人工智能·机器学习·softmax·分类模型·sigmoid·深度学习入门
Forrit12 分钟前
Agent长期运行(Long-Running Tasks)实现方案与核心挑战
大数据·人工智能·深度学习
不熬夜的熬润之15 分钟前
APCE-平均峰值相关能量
人工智能·算法·计算机视觉
人工智能训练27 分钟前
从 1.1.3 到 1.13.2!Ubuntu 24.04 上 Dify 升级保姆级教程(零数据丢失 + 一键迁移)
linux·运维·人工智能·windows·ubuntu·dify
醉舞经阁半卷书127 分钟前
从零到1了解Agent Skills
人工智能·机器学习
冰西瓜60029 分钟前
深度学习的数学原理(二十二)—— Seq2Seq编码器-解码器基础框架
人工智能·深度学习
袖手蹲29 分钟前
Arduino UNO Q 板载 Nanobot 自动化编程指南之七
运维·人工智能·自动化
AI医影跨模态组学30 分钟前
J Immunother Cancer(IF=10.6)中山大学孙逸仙纪念医院陈柏深等团队:动态时间数据预测NSCLC新辅助免疫化疗主要病理反应
人工智能·深度学习·机器学习·医学·医学影像