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