文献 On Position Embeddings in BERT
给出 sinusoidal PE (正弦位置嵌入) 在 0 到 50 内满足单调性 (The proximity of embedded positions decreases when positions are further apart), 但没有给出证明. 自己首先想用公式推导一下, 但无从下手, 于是尝试用代码验证一下, 如下.
代码结果与论文结果相差不大. 详细地, 不同嵌入维度的单调区间不一样, 例如: 当维度为 768 (BERT base 的 hidden_dim) 时, sinusoidal PE 在 0 到 45 内满足单调性; 当维度为 1024 (BERT large 的 hidden_dim) 时, sinusoidal PE 在 0 到 64 内满足单调性.
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':
d_model = 768
omega = (1 / 10000) ** (2 * np.arange(1, d_model // 2 + 1) / d_model)
# omega = (1 / 10000) ** (2 * np.arange(d_model // 2 ) / d_model)
x_y = np.expand_dims(np.arange(0, 100), axis=-1)
# 两个不同位置的 sinusoidal PE 的内积
inner_products = np.sum(np.cos(omega * x_y), axis=-1)
# 不使用导数, 而是使用离散差分, 因为 x_y 是整数, 不是连续的实数
forward_differences = inner_products[1:] - inner_products[:-1]
inds = np.nonzero(forward_differences * forward_differences[0] < 0)
sign_change_at = np.min(inds)
print(sign_change_at + 1)
plt.subplot(121)
plt.plot(inner_products)
plt.subplot(122)
plt.axhline(y=0, color='r', linestyle='-.')
plt.plot(np.sign(forward_differences))
plt.show()
修改历史
- 20240419 发布
版权声明
署名-非商业性使用-相同方式共享 4.0 国际许可协议