
Позиционно-упреждающая сеть имеет следующие преимущества по сравнению с обычными позиционными вложениями в трансформаторах:
- Моделирование длинных последовательностей. Сеть с прямой связью по положению позволяет модели эффективно собирать информацию о местоположении, предоставляя обучаемое сопоставление индекса положения с непрерывным представлением. Это имеет решающее значение для моделирования долгосрочных зависимостей в последовательности.
- Обобщение до невидимых позиций. Сети с прямой связью по позициям позволяют модели хорошо обобщать невидимые позиции. Модель может изучать закономерности и отношения между различными позициями во время обучения, и эти знания можно применять к позициям, которые не встречались во время обучения. Эта гибкость важна при обработке последовательностей различной длины или при работе с данными вне предметной области.
- Эффективность параметров: для позиционных сетей с прямой связью требуется меньше параметров по сравнению с поворотными позиционными вложениями. В позиционной сети с прямой связью параметры являются общими для всех позиций, тогда как вращательные позиционные вложения требуют отдельных параметров для каждой позиции. Такое совместное использование параметров уменьшает объем памяти модели и повышает эффективность вычислений.
- Совместимость с предварительным обучением. Сети с прямой связью по положению чаще используются в сценариях предварительного обучения, таких как языковое моделирование. Это позволяет таким моделям, как 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