studies
  • README
  • algorithms
    • <title - autoUpdate>
    • problems
      • 2021
        • 10
          • 两数之和
          • 两数相加
          • 最长回文子串
          • 盛最多水的容器
          • 三数之和
          • 最接近的三数之和
          • 合并两个有序链表
          • 两数相除
          • 搜索旋转排序数组
          • 接雨水
          • 分隔链表
          • 将数据流变为多个不相交区间
          • 排列硬币
          • 有效三角形的个数
        • 11
          • 下一个更大元素
          • 亲密字符串
          • 数组中重复的数字
          • 二维数组中的查找
          • 替换空格
          • 从尾到头打印链表
          • 重建二叉树
          • 用两个栈实现队列
          • 斐波那契数列
          • 跳台阶
          • 旋转数组的最小数字
          • 矩阵中的路径
          • 机器人的运动范围
          • 剪绳子(整数拆分)
          • 剪绳子
          • 二进制中1的个数
          • 数值的整数次方(快速幂)
          • 打印从1到最大的n位数(N叉树的遍历)
          • 删除链表的节点
          • 正则表达式匹配
          • 表示数值的字符串
          • 调整数组顺序使奇数位于偶数前面
          • 链表中倒数第k个节点
          • 反转链表
          • 合并两个排序的链表
          • 树的子结构
          • 二叉树的镜像
          • 对称的二叉树
          • 顺时针打印矩阵(3种思路4个写法)
          • 包含min函数的栈
          • 栈的压入、弹出序列
          • 层序遍历二叉树
          • 层序遍历二叉树
          • 层序遍历二叉树(之字形遍历)
        • 12
          • 整数拆分
          • 二叉搜索树的后序遍历序列
          • 二叉树中和为某一值的路径
          • 复杂链表的复制(深拷贝)
          • 二叉搜索树与双向链表
          • 序列化二叉树
          • 字符串的排列(全排列)
          • 数组中出现次数超过一半的数字(摩尔投票)
          • 最小的k个数(partition操作)
          • 数据流中的中位数
          • 连续子数组的最大和
          • 1~n整数中1出现的次数
          • 数字序列中某一位的数字
          • 把数组排成最小的数
          • 斐波那契数列-3(把数字翻译成字符串)
          • 礼物的最大价值
          • 最长不含重复字符的子字符串
          • 丑数
          • 第一个只出现一次的字符
      • 2022
        • 01
          • 划分2N个点
          • 正则表达式匹配
          • 删除链表的倒数第N个结点
          • 最大子数组和
          • 最小路径和
          • 爬楼梯
          • 数组中的逆序对
          • 两个链表的第一个公共节点
          • 求0~n-1中缺失的数字
          • 在排序数组中查找数字
          • 二叉搜索树的第k大节点
          • 求二叉树的深度
          • 判断是否为平衡二叉树
          • 数组中数字出现的次数
          • 数组中数字出现的次数
          • 和为s的两个数字
          • 和为s的连续正数序列
          • 翻转单词顺序
          • 左旋转字符串
          • 滑动窗口的最大值
          • 队列的最大值
          • n个骰子的点数
          • 扑克牌中的顺子
          • 圆圈中最后剩下的数字(约瑟夫环问题)
          • 买卖股票的最佳时机
          • 求1~n的和
          • 不用加减乘除做加法
          • 构建乘积数组
          • 把字符串转换成整数
          • 二叉搜索树的最近公共祖先
          • 二叉树的最近公共祖先
          • 大数加法
          • 重排链表
          • 链表中环的入口结点
          • 判断链表中是否有环
          • 二叉树根节点到叶子节点的所有路径和
          • 二叉树中的最大路径和
          • 买卖股票的最好时机(一)
          • 二叉树中和为某一值的路径(二)
          • 二叉树中和为某一值的路径(一)
          • 大数乘法
          • 将升序数组转化为平衡二叉搜索树
          • 重建二叉树
          • 二叉树的最大深度
          • 按之字形顺序打印二叉树
          • 求二叉树的层序遍历
          • 对称的二叉树
          • 最长回文子串
          • 顺时针旋转矩阵
          • 连续子数组的最大和
          • 数字字符串转化成IP地址
          • 链表内指定区间反转
          • 合并两个有序的数组
          • 划分链表
          • 删除有序链表中重复的元素-II
          • 删除有序链表中重复的元素-I
        • 02
          • 无重复字符的最长子串
          • 寻找两个正序数组的中位数
          • K个一组翻转链表
          • 解码方法
          • 二叉树中的最大路径和
          • 完全平方数
          • 括号生成
          • 集合的所有子集(一)
          • 最小覆盖子串
          • 二维数组中的查找
          • 缺失的第一个正整数
          • 第一个只出现一次的字符
          • 求平方根
          • 合并两个排序的链表
          • 求路径
          • 编辑距离(二)
          • 在两个长度相等的排序数组中找到上中位数
          • 合并区间
        • 03
          • 有效的括号
          • 不同的二叉搜索树
          • 验证二叉搜索树
          • 二叉树的完全性检验
          • 螺旋矩阵
          • N皇后问题
          • 链表相加(二)
          • 最长无重复子数组
          • 有重复项数字的全排列
          • 没有重复项数字的全排列
          • 通配符匹配
          • 实现二叉树先序、中序、后序遍历
          • 加起来和为目标值的组合(二)
          • 数独
          • 在旋转过的有序数组中寻找目标值
          • 最长的括号子串
          • 链表中的节点每k个一组翻转
          • 合并k个已排序的链表
          • 有效括号序列
          • 删除链表的倒数第n个节点
          • 三数之和
          • 最长公共前缀
          • 回文数字
          • 反转数字
          • 找到搜索二叉树中两个错误的节点
          • 矩阵的最小路径和
          • 判断一棵二叉树是否为搜索二叉树和完全二叉树
          • 两数之和
          • 判断是不是平衡二叉树
          • 扑克牌顺子
          • 二叉搜索树与双向链表
          • 斐波那契数列
          • 两个链表的第一个公共结点
          • 汉诺塔问题
          • 跳台阶
          • 链表中倒数最后k个结点
          • 单链表的排序
          • 旋转数组的最小数字
          • 二叉树的镜像
          • 数组中出现次数超过一半的数字
          • 数字在升序数组中出现的次数
          • 数组中只出现一次的两个数字
          • 用两个栈实现队列
          • 调整数组顺序使奇数位于偶数前面(一)
          • 反转链表
          • 丑数
          • 把二叉树打印成多行
          • 二叉搜索树的第k个节点
          • 滑动窗口的最大值
        • 04
          • 连续子数组的最大乘积
          • 完全二叉树结点数
          • 拼接所有的字符串产生字典序最小的字符串
          • 矩阵元素查找
          • 丢棋子问题(鹰蛋问题)
          • 寻找第K大
          • 字符串变形
          • 包含min函数的栈
          • 最长上升子序列(三)
          • 最长公共子序列(二)
          • 设计LRU缓存结构
          • 设计LFU缓存结构
          • 数组中的最长连续子序列
          • 判断一个链表是否为回文结构
          • 字符串出现次数的TopK问题
          • 判断t1树中是否有与t2树完全相同的子树
          • 多叉树的直径
          • 把字符串转换成整数(atoi)
          • 压缩字符串(一)
          • 在二叉树中找到两个节点的最近公共祖先
          • 反转字符串
          • 比较版本号
          • 二分查找-II
          • 三个数的最大乘积
          • 寻找峰值
          • 最大正方形
          • 岛屿数量
          • 旋转数组
          • 最大数
          • 进制转换
        • 05
          • 放苹果
          • 验证IP地址
          • 旋转字符串
          • 栈和排序
          • 把数字翻译成字符串
          • 合并二叉树
          • 数组中的逆序对
          • 最小的K个数
          • 二进制中1的个数
          • 字符串的排列
          • 正则表达式匹配
          • 序列化二叉树
          • 字典树的实现
          • 和为K的连续子数组
          • 兑换零钱(一)
          • 最长公共子串
          • 接雨水问题
          • 阶乘末尾0的数量
          • 分糖果问题
          • 01背包
        • 06
          • 编辑距离
          • 路径总和
          • 路径总和II
          • 三角形最小路径和
          • 买卖股票的最佳时机
          • 买卖股票的最佳时机II
          • 买卖股票的最佳时机III
          • 重排链表
          • 乘积最大子数组
          • 打家劫舍
          • 打家劫舍II
          • 最长递增子序列
          • 零钱兑换
          • 打家劫舍III
          • 路径总和III
          • 一和零
          • 零钱兑换II
          • 链表的中间结点
          • 分割数组
        • 07
          • 二叉树的最大深度
          • 二叉树的最小深度
          • 求根节点到叶节点数字之和
          • 两数之和II-输入有序数组
          • 重复的DNA序列
          • 搜索二维矩阵 II
          • 二叉树的所有路径
          • 字符串中的单词数
          • 从叶结点开始的最小字符串
        • 09
          • 平衡二叉树
          • 整数除法
          • 山峰数组的顶部
          • 数组中的第K大的数字
          • 判定字符是否唯一
          • 判定是否互为字符重排
        • 10
          • 电话号码的字母组合
          • 括号生成
          • 合并K个升序链表
          • 下一个排列
          • 最长有效括号
          • 在排序数组中查找元素的第一个和最后一个位置
          • 组合总和
          • 组合总和II
          • 全排列
          • 全排列II
          • 字母异位词分组
          • x 的平方根
          • 反转链表
          • 数组中的第K个最大元素
          • 滑动窗口最大值
  • Notes
    • 数据结构与算法
    • 深度学习
    • 机器学习
    • 自然语言处理
    • 计算机视觉
    • Python
    • Cpp
    • Linux
    • 大数据
    • Wiki
    • Notes
    • Todo
    • note_template
    • _archives
      • 2022
        • 04
          • GitBook 使用指南
          • Hive SQL 常用操作
          • 常用 LaTeX 公式
          • Markdown 语法备忘
          • BERT+CRF 等备忘
        • 05
          • Attention
          • BERT 常见面试问题
          • CNN
          • BERT + CRF
          • Obsidian
          • RNN
          • Sentence-BERT
          • Transformer Wiki
          • Transformer 常见问题
          • XGBoost 学习笔记
          • 装饰器的本质
          • 不平衡学习专题
          • 使用爱因斯坦标记法操作张量
          • 向后兼容(Backward-Compatible)的表示学习
          • 基于互信息的表示学习
          • 对比学习
          • 损失函数
          • 激活函数
          • 数据不平衡专题
          • Do We Really Need a Learnable Classifier at the End of Deep Neural Network?
          • 过拟合与正则化
          • 预训练模型的轻量化微调
        • 06
          • HuggingFace 套件离线使用方法
          • KDD 2022
          • Linux 后台执行
          • awk常用示例
          • Linux 解压缩
          • Markdown 简历工具
          • NLP 任务与应用
          • git-subtree 的基本用法
          • git 的基本使用
          • python 国内镜像源
          • class method 中 self 的含义
          • 常见面试问题
          • SMART Loss
          • 需求评估模型
        • 07
          • Mac 环境配置
          • PET 模型实践
          • PyCharm 常用配置
          • Shell 脚本备忘
          • PySpark SQL 使用指南
          • Python 函数声明中单独的正斜杠(/)和星号(*)是什么意思
          • 类变量、成员变量,与注解
          • 印尼语 NLP
          • 快捷键记录
          • 深度学习环境配置
          • 深度学习编程
          • 知识图谱概述
        • 08
          • Docker 学习笔记
          • Github Action 备忘
          • Python 容器基类的使用
          • SQL 字符串处理
          • glob 语法备忘
          • 标签体系构建
        • 09
          • WSL2 使用记录
          • dataclass 使用记录
          • requirements.txt 语法备忘
          • Python 标准项目实践
          • 设计模式 - 工厂模式
          • 设计模式 - 建造者模式
          • 设计模式
        • 10
          • Transformer/BERT 常见变体
          • GBDT/XGBoost 备忘
          • 从暴力递归到动态规划
          • 关系抽取
          • 树形递归技巧
          • 滑动窗口模板
          • 简历书写技巧 (算法)
          • 算法面试笔记
          • 语言模型
          • 链表常用操作备忘
        • 12
          • NER
          • NLP 标注工具
          • Jupyter & IPython 使用备忘
          • Label Studio 使用记录
          • NLP 领域术语 Wiki
          • Node.js 环境搭建
          • 基于 BERT/MLM 的查询扩展方法
          • Query 分析指南
          • Query 扩展 (电商领域)
          • query 理解参考资料
          • Query 纠错
          • 低资源训练
          • 同义与上下位关系挖掘
          • 同义词挖掘
          • 基于用户行为数据的同义词挖掘方法 (英文)
          • 实验报告模板
          • 搜索与 NLP
          • 搜索指标
          • 搜索相关阅读
          • 常见的文本相似度计算
          • 电商领域的 NER
          • 电商 NER 标签体系
          • 电商搜索
      • 2023
        • 01
          • PySpark 笔记
          • Windows 使用备忘
          • Hive/Spark SQL 常用查询记录
          • 基于 SQL 计算信息熵与信息增益
          • Hive/Spark/Presto SQL 备忘
          • 数仓基础概念
        • 02
          • SQL优化之暴力扫描
          • Transformer与长度外推性
          • Transformer 的优势与劣势
        • 03
          • Hive 常用 SQL 备忘
        • 05
          • 转正申请
        • 06
          • huggingface 套件使用备忘
          • LLM 应用收集
          • LLM 训练方案整理
Powered by GitBook
On this page
  • Transformer Encoder 代码
  • Transformer 与 RNN/CNN 的比较
  • RNN
  • CNN
  • Transformer
  • Transformer 能完全取代 RNN 吗?
  • Transformer 中各模块的作用
  • QKV Projection
  • Self-Attention
  • Add & Norm
  • Feed-Forward Network
  • BERT 相关面试题
  • 参考资料
  1. Notes
  2. _archives
  3. 2022
  4. 05

Transformer 常见问题

PreviousTransformer WikiNextXGBoost 学习笔记

Last updated 2 years ago

last modify

Transformer Encoder 代码

Transformer Encoder(点击展开)
import math

import torch
import torch.nn as nn
import torch.nn.functional as F
import einops


class TransformerEncoder(nn.Module):

    def __init__(self, n_head, d_model, d_ff, act=F.gelu):
        super().__init__()

        self.h = n_head
        self.d = d_model // n_head
        # Attention
        self.Q = nn.Linear(d_model, d_model)
        self.K = nn.Linear(d_model, d_model)
        self.V = nn.Linear(d_model, d_model)
        self.O = nn.Linear(d_model, d_model)
        # LN
        self.LN1 = nn.LayerNorm(d_model)
        self.LN2 = nn.LayerNorm(d_model)
        # FFN
        self.W1 = nn.Linear(d_model, d_ff)
        self.W2 = nn.Linear(d_ff, d_model)
        self.act = act
        #
        self.dropout = nn.Dropout(0.2)

    def attn(self, x, mask):
        q, k, v = self.Q(x), self.K(x), self.V(x)
        q = einops.rearrange(q, 'B L (H d) -> B H L d', H=self.h)
        k = einops.rearrange(k, 'B L (H d) -> B H d L', H=self.h)
        v = einops.rearrange(v, 'B L (H d) -> B H L d', H=self.h)
        a = torch.softmax(q @ k / math.sqrt(self.d) + mask, dim=-1)  # [B H L L]
        o = einops.rearrange(a @ v, 'B H L d -> B L (H d)')
        o = self.O(o)
        return o

    def ffn(self, x):
        x = self.dropout(self.act(self.W1(x)))
        x = self.dropout(self.W2(x))
        return x

    def forward(self, x, mask):
        x = self.LN1(x + self.dropout(self.attn(x, mask)))
        x = self.LN2(x + self.dropout(self.ffn(x)))
        return x


model = TransformerEncoder(2, 4, 8)
x = torch.randn(2, 3, 4)
mask = torch.randn(1, 1, 3, 3)
o = model(x, mask)

model.eval()
traced_model = torch.jit.trace(model, (x, mask))

x = torch.randn(2, 3, 4)
mask = torch.randn(1, 1, 3, 3)

assert torch.allclose(model(x, mask), traced_model(x, mask))

Transformer 与 RNN/CNN 的比较

其他提法:Transformer 为什么比 RNN/CNN 更好用?优势在哪里? 参考资料:

RNN

  • 特点/优势(Transformer之前):

    • 适合解决线性序列问题;天然能够捕获位置信息(相对+绝对);

      绝对位置:每个 token 都是在固定时间步加入编码;相对位置:token 与 token 之间间隔的时间步也是固定的;

    • 支持不定长输入;

    • LSTM/Attention 的引入,加强了长距离语义建模的能力;

  • 劣势:

    • 串行结构难以支持并行计算;

    • 依然存在长距离依赖问题;

      有论文表明:RNN 最多只能记忆 50 个词左右的距离(How Neural Language Models Use Context);

    • 单向语义建模(Bi-RNN 是两个单向拼接)

CNN

  • 特点/优势:

    • 捕获 n-gram 片段信息(局部建模);

    • 滑动窗口捕获相对位置特征(但 Pooling 层会丢失位置特征);

    • 并行度高(滑动窗口并行、卷积核并行),计算速度快;

  • 劣势:

    • 长程建模能力弱:受感受野限制,无法捕获长距离依赖,需要空洞卷积或加深层数等策略来弥补;

    • Pooling 层会丢失位置信息(目前常见的作法会放弃 Pooling);

    • 相对位置敏感,绝对位置不敏感(平移不变性)

Transformer

  • 特点/优势:

    • 通过位置编码(position embedding)建模相对位置和绝对位置特征;

    • Self-Attention 同时编码双向语义和解决长距离依赖问题;

    • 支持并行计算;

  • 缺点/劣势:

    • 不支持不定长输入(通过 padding 填充到定长);

    • 计算复杂度高;

Transformer 能完全取代 RNN 吗?

  • 不行;

Transformer 中各模块的作用

QKV Projection

为什么在 Attention 之前要对 Q/K/V 做一次投影?

  • 首先在 Transformer-Encoder 中,Q/K/V 是相同的输入;

  • 加入这个全连接的目的就是为了将 Q/K/V 投影到不同的空间中,增加多样性;

  • 如果没有这个投影,在之后的 Attention 中相当于让相同的 Q 和 K 做点击,那么 attention 矩阵中的分数将集中在对角线上,即每个词的注意力都在自己身上;这与 Attention 的初衷相悖——让每个词去融合上下文语义;

Self-Attention

为什么要使用多头?

其他提法:多头的加入既没有增加宽度也没有增加深度,那加入它的意义在哪里?

  • 这里的多头和 CNN 中多通道的思想类似,目的是期望不同的注意力头能学到不同的特征;

为什么 Transformer 中使用的是乘性 Attention(点积),而不是加性 Attention?

  • 在 GPU 场景下,矩阵乘法的效率更高(原作说法);

  • 在不进行 Scaled 的前提下,随着 d(每个头的特征维度)的增大,乘性 Attention 的效果减弱,加性 Attention 的效果更好(原因见下一个问题);

Attention 计算中 Scaled 操作的目的是什么?

  • 目的:防止梯度消失;

  • 解释:在 Attention 模块中,注意力权重通过 Softmax 转换为概率分布;但是 Softmax 对输入比较敏感,当输入的方差越大,其计算出的概率分布就越“尖锐”,即大部分概率集中到少数几个分量位置。极端情况下,其概率分布将退化成一个 One-Hot 向量;其结果就是雅可比矩阵(偏导矩阵)中绝大部分位置的值趋于 0,即梯度消失;通过缩放操作可以使注意力权重的方差重新调整为 1,从而缓解梯度消失的问题;

    • 假设 $Q$ 和 $K$ 的各分量 $\vec{q_i}$ 和 $\vec{k_i}$ 相互独立,且均值为 $0$,方差为 $1$;

      在 Embedding 和每一个 Encoder 后都会过一个 LN 层,所以可以认为这个假设是合理的;

    • 则未经过缩放的注意力权重 $A$ 的各分量 $\vec{a_i}$ 将服从均值为 $0$,方差为 $d$ 的正态分布;

    • $d$ 越大,意味着 $\vec{a_i}$ 中各分量的差越大,其结果就是经过 softmax 后,会出现数值非常小的分量;这样在反向传播时,就会导致梯度消失的问题;

    • 此时除以 $\sqrt{d}$ 会使 $\vec{a_i}$ 重新服从标准的正态分布,使 softmax 后的 Attention 矩阵尽量平滑,从而缓解梯度消失的问题;

    • 数学推导:

      • 定义 $Q=[\vec{q_1}, \vec{q_2}, .., \vec{q_n}]^T$, $K=[\vec{k_1}, \vec{k_2}, .., \vec{k_n}]^T$,其中 $\vec{q_i}$ 和 $\vec{k_i}$ 都是 $d$ 维向量;

      • 假设 $\vec{q_i}$ 和 $\vec{k_i}$ 的各分量都是服从标准正态分布(均值为 0,方差为 1)的随机变量,且相互独立,记 $q_i$ 和 $k_i$,即 $E(q_i)=E(k_i)=0$, $D(q_i)=D(k_i)=1$;

      • 根据期望与方差的性质,有 $E(q_ik_i)=0$ 和 $D(q_ik_i)=1$,推导如下:

      • 进一步,有 $E(\vec{q_i}\vec{k_i}^T)=0$ 和 $D(\vec{q_i}\vec{k_i}^T)=d$,推导如下:

      • 根据 attention 的计算公式(softmax 前), $A'=\frac{QK^T}{\sqrt{d}}=[\frac{\vec{q_1}\vec{k_1}^T}{\sqrt{d}}, \frac{\vec{q_2}\vec{k_2}^T}{\sqrt{d}}, .., \frac{\vec{q_n}\vec{k_n}^T}{\sqrt{d}}]=[\vec{a_1}, \vec{a_2}, .., \vec{a_n}]$,可知 $E(\vec{a_i})=0$, $D(\vec{a_i})=1$,推导如下:

    • 代码验证

      import torch
      
      def get_x(shape, eps=1e-9):
          """创建一个 2d 张量,且最后一维服从正态分布"""
          x = torch.randn(shape)
          mean = x.mean(-1, keepdim=True)
          std = x.std(-1, keepdim=True)
          return (x - mean) / (std + eps)
      
      d = 400  # 数字设大一些,否则不明显
      q = get_x((2000, d))
      k = get_x((2000, d))
      
      # 不除以 根号 d
      a = torch.matmul(q, k.transpose(-1, -2))  # / (d ** 0.5)
      print(a.mean(-1, keepdim=True))  # 各分量接近 0
      print(a.var(-1, keepdim=True))  # 各分量接近 d
      
      # 除以根号 d
      a = torch.matmul(q, k.transpose(-1, -2)) / (d ** 0.5)
      print(a.mean(-1, keepdim=True))  # 各分量接近 0
      print(a.var(-1, keepdim=True))  # 各分量接近 1

在 Softmax 之前加上 Mask 的作用是什么?

相关问题:为什么将被 mask 的位置是加上一个极小值(-1e9),而不是置为 0?

  • 回顾 softmax 的公式;

  • 其目的就是使无意义的 token 在 softmax 后得到的概率值(注意力)尽量接近于 0;从而使正常 token 位置的概率和接近 1;

Add & Norm

加入残差的作用是什么?

  • 在求导时加入一个恒等项,以减少梯度消失问题;

加入 LayerNorm 的作用是什么?

  • 提升网络的泛化性;(TODO:详细解释)

  • 加在激活函数之前,避免激活值落入饱和区,减少梯度消失问题;

Pre-LN 和 Post-LN 的区别

  • Post-LN(BERT 实现): xn+1=LN(xn+f(xn))x_{n+1} = \text{LN}(x_n + f(x_n))xn+1​=LN(xn​+f(xn​))

    • 先做完残差连接,再归一化;

    • 优点:保持主干网络的方程比较稳定,是模型泛化能力更强,性能更好;

    • 缺点:把恒等路径放在 norm 里,使模型收敛更难(反向传播时梯度变小,残差的作用被减弱)

  • Pre-LN: xn+1=xn+f(LN(xn))x_{n+1} = x_n + f(\text{LN}(x_n))xn+1​=xn​+f(LN(xn​))

    • 先归一化,再做残差连接;

    • 优点:加速收敛

    • 缺点:效果减弱

Feed-Forward Network

  • 前向公式 W2⋅ReLU(W1x+b1)+b2W_2 \cdot \text{ReLU}(W_1x + b_1) + b_2W2​⋅ReLU(W1​x+b1​)+b2​

FFN 层的作用是什么?

  • 功能与 1*1 卷积类似:1)跨通道的特征融合/信息交互;2)通过激活函数增加非线性;

  • 之前操作都是线性的:1)Projection 层并没有加入激活函数;2)Attention 层只是线性加权;

FFN 中激活函数的选择

相关问题:BERT 为什么要把 FFN 中的 ReLU 替换为 GeLU?

  • 背景:原始 Transformer 中使用的是 ReLU;BERT 中使用的是 GeLU;

  • GeLU 在激活函数中引入了正则的思想,越小的值越容易被丢弃;相当于综合了 ReLU 和 Dropout 的功能;而 ReLU 缺乏这个随机性;

  • 为什么不使用 sigmoid 或 tanh?——这两个函数存在饱和区,会使导数趋向于 0,带来梯度消失的问题;不利于深层网络的训练;

BERT 相关面试题

参考资料

相似提法:为什么在计算 Q 和 K 的点积时要除以根号 d? 参考内容:

自然语言处理三大特征抽取器(CNN/RNN/Transformer)比较 - 知乎
CNN/RNN/Transformer比较 - 简书
NLP常用特征提取方法对比 - CSDN博客
有了Transformer框架后是不是RNN完全可以废弃了? - 知乎
小莲子的回答 - 知乎
Transformer 中的 attention 为什么要 scaled? - 知乎
Transformer 中的 attention 为什么要 scaled? - TniL的回答(已删除)
1*1卷积核的作用_nefetaria的博客-CSDN博客
daily-interview/BERT面试题.md at master · datawhalechina/daily-interview
深入剖析PyTorch中的Transformer API源码_哔哩哔哩_bilibili
超硬核Transformer细节全梳理!_哔哩哔哩_bilibili
Transformer、RNN 与 CNN 三大特征提取器的比较_Takoony的博客-CSDN博客
Transformer Encoder 代码
Transformer 与 RNN/CNN 的比较
RNN
CNN
Transformer
Transformer 能完全取代 RNN 吗?
Transformer 中各模块的作用
QKV Projection
为什么在 Attention 之前要对 Q/K/V 做一次投影?
Self-Attention
为什么要使用多头?
为什么 Transformer 中使用的是乘性 Attention(点积),而不是加性 Attention?
Attention 计算中 Scaled 操作的目的是什么?
在 Softmax 之前加上 Mask 的作用是什么?
Add & Norm
加入残差的作用是什么?
加入 LayerNorm 的作用是什么?
Pre-LN 和 Post-LN 的区别
Feed-Forward Network
FFN 层的作用是什么?
FFN 中激活函数的选择
BERT 相关面试题
参考资料