Позиционно-упреждающая сеть имеет следующие преимущества по сравнению с обычными позиционными вложениями в трансформаторах:

  1. Моделирование длинных последовательностей. Сеть с прямой связью по положению позволяет модели эффективно собирать информацию о местоположении, предоставляя обучаемое сопоставление индекса положения с непрерывным представлением. Это имеет решающее значение для моделирования долгосрочных зависимостей в последовательности.
  2. Обобщение до невидимых позиций. Сети с прямой связью по позициям позволяют модели хорошо обобщать невидимые позиции. Модель может изучать закономерности и отношения между различными позициями во время обучения, и эти знания можно применять к позициям, которые не встречались во время обучения. Эта гибкость важна при обработке последовательностей различной длины или при работе с данными вне предметной области.
  3. Эффективность параметров: для позиционных сетей с прямой связью требуется меньше параметров по сравнению с поворотными позиционными вложениями. В позиционной сети с прямой связью параметры являются общими для всех позиций, тогда как вращательные позиционные вложения требуют отдельных параметров для каждой позиции. Такое совместное использование параметров уменьшает объем памяти модели и повышает эффективность вычислений.
  4. Совместимость с предварительным обучением. Сети с прямой связью по положению чаще используются в сценариях предварительного обучения, таких как языковое моделирование. Это позволяет таким моделям, как Transformer XL, согласовываться с существующими методами и моделями предварительного обучения, облегчая интеграцию и перенос обучения.

Встраивание можно реализовать с помощью следующего кода, написанного в этом репозитории:

class PositionwiseFF(nn.Module):
    def __init__(self, d_model, d_inner, dropout, pre_lnorm=False):
        super(PositionwiseFF, self).__init__()

        self.d_model = d_model
        self.d_inner = d_inner
        self.dropout = dropout

        self.CoreNet = nn.Sequential(
            nn.Linear(d_model, d_inner), nn.ReLU(inplace=True),
            nn.Dropout(dropout),
            nn.Linear(d_inner, d_model),
            nn.Dropout(dropout),
        )

        self.layer_norm = nn.LayerNorm(d_model)

        self.pre_lnorm = pre_lnorm

    def forward(self, inp):
        if self.pre_lnorm:
            # layer normalization + positionwise feed-forward
            core_out = self.CoreNet(self.layer_norm(inp))

            # residual connection
            output = core_out + inp
        else:
            # positionwise feed-forward
            core_out = self.CoreNet(inp)

            # residual connection + layer normalization
            output = self.layer_norm(inp + core_out)

        return output