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是常量

相关推荐
lixin55655615 分钟前
基于迁移学习的图像风格增强器
java·人工智能·pytorch·python·深度学习·语言模型
byzh_rc17 分钟前
[数学建模从入门到入土] 评价模型
网络·人工智能·深度学习·数学建模·回归·ar
阡陌..21 分钟前
浅谈SAR图像处理---形态学滤波
图像处理·人工智能·python
renhongxia128 分钟前
多机器人环境监测中的异质性,用于解决时间冲突任务
人工智能·信息可视化·语言模型·自然语言处理·数据分析·机器人
源于花海43 分钟前
迁移学习的第三类方法:子空间学习(2)——流形学习
人工智能·机器学习·迁移学习·流形学习·子空间学习
方安乐1 小时前
杂记:文档解析器之MinerU
人工智能
AI猫站长1 小时前
快讯|星海图、众擎机器人、魔法原子释放IPO信号,2026年或成上市大年
人工智能·机器人·具身智能·灵心巧手·上市·星海图·众擎机器人
鲁邦通物联网1 小时前
基于容器化的边缘计算网关应用部署实践:Python+MQTT
人工智能·边缘计算·数据采集·工业数据采集·边缘计算网关·5g数采
方安乐1 小时前
杂记:文档解析器
人工智能
+电报dapp1291 小时前
2025区块链革命:当乐高式公链遇见AI预言机,三大行业已被颠覆
人工智能·金融·web3·去中心化·区块链·哈希算法·零知识证明