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