相加的等价形式
将输入的每个位置对应的Token Embedding, Segment Embedding, Position Embedding相加, 然后输入到后面的网络中, 共享后面网络的参数.
而三者相加得到的结果, 实际上等价于将三个one-hot向量concat起来, 然后经过三个Embedding矩阵拼接得到新Embedding矩阵得到的结果. 相当于是three-hot
的Embedding转换.
假设BERT的token词表大小为20000, position共有512个位置, segment表示只有两种. 则三者的输入分别为:
token one-hot: 20000维
position one-hot: 512维
segment one-hot: 2维
因此将这三个one-hot向量拼接起来, 得到20514维的向量, 其中有三个位置为1, 相当于是three-hot
. 然后将三个Embedding矩阵也拼接起来, 得到一个(20514, 768)
维(base模型)的新的embedding矩阵. three-hot
矩阵经过新embedding矩阵后, 得到的值就等价于将原来的三个one-hot向量分别经过各自embedding矩阵得到embedding向量再加在一起.
为什么可以相加
理论上, Token Embedding, Segment Embedding, Position Embedding应当分别处于三个不同的空间中, 那么将这三个空间的向量直接相加合适吗?
可以理解为信号融合
就如同声音, 图像等信号, 一个时序波可以表示为多个不同频率波的叠加表示. 三个不同空间Embedding向量相加, 也相当于不同空间信息的融合, 是一种特征融合的方法.
梯度可拆解
在反向传播时, 来自损失函数的梯度更新三个空间的Embedding矩阵参数时, 可以做到互不影响:
有了反向传播时三者梯度相互不影响的保证, 就可以希望三个空间分别学习到不同的信息了. 也是上面所说的特征融合的保证.
信息损失
判断在Embedding阶段是否有信息损失, 就要看得到的最终Embedding向量能否还原为操作前的三个Embedding向量, 甚至是三个one-hot向量. 显然三者相加这种操作是会带来信息损失的.
这里考虑两种不会在Embedding转换层带来信息损失的操作方法.
第一种是不再将原来的三个one-hot向量拼接在一起, 而是枚举它们所有可能的组合, 得到一个超长的one-hot向量. 例如token, position, segment分别有20000, 512, 2种可能情况, 可能的组合共有20000 * 512 * 2 = 20480000
种可能性, 因此可以将三个one-hot输入映射为长度为20480000
维的one-hot向量, 然后需要配合一个(20480000, 768)
大小的新的Embedding矩阵使用, 转换得到新的Embedding向量表达.
这种情况第一个问题是组合数量爆炸, 带来了超大Embedding矩阵, 是资源无法承担的. 另外对于一些组合在整个语料里出现的频率都很少, 得不到充分的训练, 没有意义.
第二种是不在one-hot处进行concat, 而是在得到三个Embedding向量后, 将它们再concat在一起, 相当于是在Embedding结果层进行concat. 这种虽然在目前层没有信息损失, 但在进入到后续的神经网络中, 还是需要通过全连接层降维, 而降维压缩是一定会带来信息损失的.
总结
使用相加的形式处理三个Embedding是会带来一些信息损失, 但梯度可拆解保证了在相同的优化目标下, 每一路输入都能独立学习, 保证了各个空间学习到自己的知识.
参考资料
最后更新于