GELU(Gaussian Error Linear Unit,高斯误差线性单元)激活函数在 NLP 任务中被广泛使用,例如:BERT、ALBERT、GPT 等模型都用到 GELU 激活函数。其公式如下:

GELU 函数通过将激活值乘以 1 或 0,实现将不重要的信息设置为 0。那么,如何确定激活值是乘以 0 还是乘以 1 呢?
如果神经网络的激活值越小,其被保留的概率也就越低,即: 乘以1的概率也越低,反之则乘以 0 的概率很高。这种引入概率的机制,能够更好的保持网络对输入的依赖性。
公式中的 φ 函数就是根据激活值的分布来计算出的 0 或者 1 的概率,从而最终产生 0 或 1,该函数可能存在不同的计算方法。
在 PyTorch 中 GELU 的函数图像、导数图像如下:

以上函数图像由下列代码产生:
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F
def test():
_, axes = plt.subplots(1, 2)
# 函数图像
x = torch.linspace(-20, 20, 1000)
y = F.gelu(x)
axes[0].plot(x, y)
axes[0].grid()
axes[0].set_title('GELU 函数图像')
# 导数图像
x = torch.linspace(-20, 20, 1000, requires_grad=True)
F.gelu(x).sum().backward()
axes[1].plot(x.detach(), x.grad)
axes[1].grid()
axes[1].set_title('GELU 导数图像')
plt.show()
if __name__ == '__main__':
test()
在 PyTorch 中 φ 函数计算的是激活值的高斯分布的累计分布。
论文地址:https://arxiv.org/pdf/1606.08415.pdf

冀公网安备13050302001966号