-
LSTM时间顺序迭代,Ti时刻只有之前的上下文信息,是单向的,而BERT通过QK注意力矩阵权重把所有上下文信息通过点积给V加权,使的当前字的embed.dim包含前后上下文信息
-
BERT预训练模型只用到了编码器的部分, 也就是先用编码器训练一个语言模型, 然后再把它适配给其他的任务.
-
首先来说一下transformer和LSTM的最大区别, 就是LSTM的训练是迭代的, 是一个接一个字的来, 当前这个字过完LSTM单元, 才可以进下一个字, 而transformer的训练是并行了, 就是所有字是全部同时训练的, 这样就大大加快了计算效率, transformer使用了位置嵌入 (𝑝𝑜𝑠𝑖𝑡𝑖𝑜𝑛𝑎𝑙 𝑒𝑛𝑐𝑜𝑑𝑖𝑛𝑔) 来理解语言的顺序, 使用自注意力机制和全连接层来进行计算, 这些后面都会详细讲解.
-
transformer模型主要分为两大部分, 分别是编码器和解码器, 编码器负责把自然语言序列映射成为隐藏层, 含有自然语言序列的数学表达. 然后解码器把隐藏层再映射为自然语言序列, 从而使我们可以解决各种问题, 如情感分类, 命名实体识别, 语义关系抽取, 摘要生成, 机器翻译等等
-
𝑠𝑒𝑙𝑓 𝑎𝑡𝑡𝑒𝑛𝑡𝑖𝑜𝑛 𝑚𝑒𝑐ℎ𝑎𝑛𝑖𝑠𝑚 , 自注意力机制
Attention Mask
注意, 在上面 𝑠𝑒𝑙𝑓 𝑎𝑡𝑡𝑒𝑛𝑡𝑖𝑜𝑛 的计算过程中, 我们通常使用 𝑚𝑖𝑛𝑖 𝑏𝑎𝑡𝑐ℎ 来计算, 也就是一次计算多句话, 也就是 𝑋 的维度是 [𝑏𝑎𝑡𝑐ℎ 𝑠𝑖𝑧𝑒, 𝑠𝑒𝑞𝑢𝑒𝑛𝑐𝑒 𝑙𝑒𝑛𝑔𝑡ℎ] , 𝑠𝑒𝑞𝑢𝑒𝑛𝑐𝑒 𝑙𝑒𝑛𝑔𝑡ℎ 是句长, 而一个 𝑚𝑖𝑛𝑖 𝑏𝑎𝑡𝑐ℎ 是由多个不等长的句子组成的, 我们就需要按照这个 𝑚𝑖𝑛𝑖 𝑏𝑎𝑡𝑐ℎ 中最大的句长对剩余的句子进行补齐长度, 我们一般用 0 来进行填充, 这个过程叫做 𝑝𝑎𝑑𝑑𝑖𝑛𝑔 .但这时在进行 𝑠𝑜𝑓𝑡𝑚𝑎𝑥 的时候就会产生问题, 回顾 𝑠𝑜𝑓𝑡𝑚𝑎𝑥 函数 𝜎(𝐳)𝑖=𝑒𝑧𝑖∑𝐾𝑗=1𝑒𝑧𝑗 , 𝑒0 是1, 是有值的, 这样的话 𝑠𝑜𝑓𝑡𝑚𝑎𝑥 中被 𝑝𝑎𝑑𝑑𝑖𝑛𝑔 的部分就参与了运算, 就等于是让无效的部分参与了运算, 会产生很大隐患, 这时就需要做一个 𝑚𝑎𝑠𝑘 让这些无效区域不参与运算, 我们一般给无效区域加一个很大的负数的偏置,经过上式的 𝑚𝑎𝑠𝑘𝑖𝑛𝑔 我们使无效区域经过 𝑠𝑜𝑓𝑡𝑚𝑎𝑥 计算之后还几乎为 0 , 这样就避免了无效区域参与计算.
- 𝐿𝑎𝑦𝑒𝑟 𝑁𝑜𝑟𝑚𝑎𝑙𝑖𝑧𝑎𝑡𝑖𝑜𝑛 和残差连接
1). 残差连接: 我们在上一步得到了经过注意力矩阵加权之后的 𝑉 , 也就是 𝐴𝑡𝑡𝑒𝑛𝑡𝑖𝑜𝑛(𝑄, 𝐾, 𝑉) , 我们对它进行一下转置, 使其和 𝑋𝑒𝑚𝑏𝑒𝑑𝑑𝑖𝑛𝑔 的维度一致, 也就是 [𝑏𝑎𝑡𝑐ℎ 𝑠𝑖𝑧𝑒, 𝑠𝑒𝑞𝑢𝑒𝑛𝑐𝑒 𝑙𝑒𝑛𝑔𝑡ℎ, 𝑒𝑚𝑏𝑒𝑑𝑑𝑖𝑛𝑔 𝑑𝑖𝑚𝑒𝑛𝑠𝑖𝑜𝑛] , 然后把他们加起来做残差连接, 直接进行元素相加, 因为他们的维度一致:𝑋𝑒𝑚𝑏𝑒𝑑𝑑𝑖𝑛𝑔+𝐴𝑡𝑡𝑒𝑛𝑡𝑖𝑜𝑛(𝑄, 𝐾, 𝑉)
在之后的运算里, 每经过一个模块的运算, 都要把运算之前的值和运算之后的值相加, 从而得到残差连接, 训练的时候可以使梯度直接走捷径反传到最初始层: 𝑋+𝑆𝑢𝑏𝐿𝑎𝑦𝑒𝑟(𝑋)(eq. 5) 2). 𝐿𝑎𝑦𝑒𝑟𝑁𝑜𝑟𝑚 : 𝐿𝑎𝑦𝑒𝑟𝑁𝑜𝑟𝑚𝑎𝑙𝑖𝑧𝑎𝑡𝑖𝑜𝑛 的作用是把神经网络中隐藏层归一为标准正态分布, 也就是 𝑖.𝑖.𝑑 独立同分布, 以起到加快训练速度, 加速收敛的作用
用每一行的每一个元素减去这行的均值, 再除以这行的标准差, 从而得到归一化后的数值, 𝜖 是为了防止除 0 ; 之后引入两个可训练参数 𝛼, 𝛽 来弥补归一化的过程中损失掉的信息, 注意 ⊙ 表示元素相乘而不是点积, 我们一般初始化 𝛼 为全 1 , 而 𝛽 为全 0 .
何理解Transformer论文中的positional encoding,和三角函数有什么关系?
#对于transformer模型的positional encoding有两种主流方式:
绝对位置编码
现在普遍使用的一种方法 Learned Positional Embedding编码绝对位置,相对简单也很容易理解。直接对不同的位置随机初始化一个postion embedding,加到word embedding上输入模型,作为参数进行训练。
相对位置编码
使用绝对位置编码,不同位置对应的positional embedding固然不同,但是位置1和位置2的距离比位置3和位置10的距离更近,位置1和位置2与位置3和位置4都只相差1,这些关于位置的相对含义模型能够通过绝对位置编码get到吗?使用Learned Positional Embedding编码,位置之间没有约束关系,我们只能期待它隐式地学到,是否有更合理的方法能够显示的让模型理解位置的相对关系呢?
所以就有了另一种更直观地方法——相对位置编码。下面介绍两种编码相对位置的方法:Sinusoidal Position Encoding和Complex embedding。
1. Sinusoidal Position Encoding
使用正余弦函数表示绝对位置,通过两者乘积得到相对位置: 这样设计的好处是位置pos+k的positional encoding可以被位置pos线性表示,反应其相对位置关系。 内积会随着相对位置的递增而减小,从而表征位置的相对距离。但是不难发现,由于距离的对称性,Sinusoidal Position Encoding虽然能够反映相对位置的距离关系,但是无法区分方向
2. Complex embedding
为了更好的让模型捕获更精确的相对位置关系,比如相邻,前序(precedence)等,ICLR 2020发表的文章《Encoding Word Oder In Complex Embeddings》使用了复数域的连续函数来编码词在不同位置的表示。
不管是Learned Postional Embdedding还是Sinusoidal Position Encoding,某个词Wj在pos位置上的表示为其word embedding加上对应位置的embedding
以上三种positional encoding都不同程度、各有侧重的编码了文本数据中的顺序关系,那么到底哪个更好?我们在平时使用的时候应该如何选择呢?
结果导向的话,肯定是哪种方法效果好选哪种啦~~在《Attention is all you need》[2]里面提到,Learned Positional Embedding和Sinusoidal Position Encoding两种方式的效果没有明显的差别。在论文[3],实验结果表明使用Complex embedding相较前两种方法有较明显的提升。
AUC在数据不平衡时,指标表达更合理
Doc2Vec 文本转向量的方式【mean_max_pool】