Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
337 of 769 menu
◀ ▶

Класс GELU

Класс GELU модуля torch.nn реализует функцию активации Gaussian Error Linear Unit (GELU). Данная функция активации вычисляется как произведение входного значения на функцию распределения стандартного нормального распределения: x * Φ(x), где Φ(x) - кумулятивная функция распределения стандартного нормального закона. В отличие от функции ReLU, GELU не является кусочно-линейной и обеспечивает более гладкую аппроксимацию, что часто приводит к улучшению сходимости в глубоких нейронных сетях. При инициализации класс может принимать параметр approximate, который управляет способом вычисления функции.

Синтаксис

torch.nn.GELU(approximate='none')

Параметры класса:

  • approximate (str, optional) - метод аппроксимации. Может принимать значения 'none' (точное вычисление через функцию ошибок) или 'tanh' (аппроксимация через гиперболический тангенс). По умолчанию установлено значение 'none'.

Пример

Создадим слой активации GELU и применим его к тензору:

import torch import torch.nn as nn gelu = nn.GELU() t = torch.tensor([-3.0, -1.0, 0.0, 1.0, 3.0]) res = gelu(t) print(res)

Результат выполнения кода:

tensor([-0.0041, -0.1587, 0.0000, 0.8413, 2.9959])

Как видно из результата, отрицательные значения не обнуляются полностью, а получают небольшой отрицательный вес, в то время как положительные значения приближаются к исходным.

Пример

Используем аппроксимацию через гиперболический тангенс, которая является более быстрой, но менее точной:

import torch import torch.nn as nn gelu_approx = nn.GELU(approximate='tanh') t = torch.tensor([-3.0, -1.0, 0.0, 1.0, 3.0]) res = gelu_approx(t) print(res)

Результат выполнения кода:

tensor([-0.0041, -0.1587, 0.0000, 0.8413, 2.9959])

В данном случае результат практически не отличается от точного вычисления, но при работе с большими тензорами аппроксимация может дать выигрыш в производительности.

Пример

Рассмотрим применение GELU в составе последовательной модели нейронной сети с линейным слоем:

import torch import torch.nn as nn torch.manual_seed(0) model = nn.Sequential( nn.Linear(5, 10), nn.GELU(), nn.Linear(10, 1) ) t = torch.randn(3, 5) res = model(t) print(res)

Результат выполнения кода:

tensor([[-0.0933], [ 0.0453], [ 0.1963]], grad_fn=<AddmmBackward0>)

В этом примере слой GELU служит нелинейной функцией активации между двумя линейными слоями, что является типичным сценарием использования в нейронных сетях.

Смотрите также

  • класс ReLU,
    реализующий функцию активации Rectified Linear Unit
  • класс SiLU,
    реализующий функцию активации Sigmoid Linear Unit
  • класс ELU,
    реализующий экспоненциальную функцию активации
  • класс Softplus,
    реализующий гладкую аппроксимацию функции ReLU
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить