| # Copyright (c) Facebook, Inc. and its affiliates. | |
| # | |
| # This source code is licensed under the MIT license found in the | |
| # LICENSE file in the root directory of this source tree. | |
| """ | |
| See "Gaussian Error Linear Units (GELUs)" by Dan Hendrycks and Kevin Gimpel with | |
| the corresponding GitHub repo: https://github.com/hendrycks/GELUs | |
| """ | |
| import math | |
| import torch | |
| import torch.nn as nn | |
| def gelu_accurate(x): | |
| if not hasattr(gelu_accurate, "_a"): | |
| gelu_accurate._a = math.sqrt(2 / math.pi) | |
| return ( | |
| 0.5 * x * (1 + torch.tanh(gelu_accurate._a * (x + 0.044715 * torch.pow(x, 3)))) | |
| ) | |
| def gelu(x: torch.Tensor) -> torch.Tensor: | |
| return torch.nn.functional.gelu(x.float()).type_as(x) | |