Source code for xmodaler.modeling.decoder.transformer_decoder
# Copyright 2021 JD.com, Inc., JD AI
"""
@author: Yehao Li
@contact: yehaoli.sysu@gmail.com
"""
import torch
from torch import nn
from xmodaler.config import configurable
from xmodaler.config import CfgNode as CN
from xmodaler.config import kfg
from .decoder import Decoder
from ..layers.bert import BertGenerationLayer
from .build import DECODER_REGISTRY
__all__ = ["TransformerDecoder"]
[docs]@DECODER_REGISTRY.register()
class TransformerDecoder(Decoder):
[docs] @configurable
def __init__(
self,
*,
num_generation_layers: int,
bert_generation_layers
):
super(TransformerDecoder, self).__init__()
self.num_generation_layers = num_generation_layers
if self.num_generation_layers > 0:
self.g_layers = bert_generation_layers
[docs] @classmethod
def from_config(cls, cfg):
bert_generation_layers = nn.ModuleList(
[BertGenerationLayer(cfg) for _ in range(cfg.MODEL.BERT.NUM_GENERATION_LAYERS)]
)
return {
"num_generation_layers": cfg.MODEL.BERT.NUM_GENERATION_LAYERS,
"bert_generation_layers": bert_generation_layers,
}
[docs] def forward(self, batched_inputs):
ret = {}
vfeats = batched_inputs[kfg.ATT_FEATS]
ext_vmasks = batched_inputs[kfg.EXT_ATT_MASKS]
history_states = batched_inputs.get(kfg.HISTORY_STATES, None)
g_tfeats_arr = []
g_tfeats = batched_inputs[kfg.G_TOKEN_EMBED]
ext_g_tmasks = batched_inputs[kfg.EXT_G_TOKENS_MASKS]
if len(g_tfeats.size()) == 2:
g_tfeats = g_tfeats.unsqueeze(1)
if kfg.TIME_STEP in batched_inputs:
time_step = batched_inputs[kfg.TIME_STEP]
ext_g_tmasks = ext_g_tmasks[:,:, time_step:time_step+1, 0:time_step+1]
if kfg.HISTORY_STATES not in batched_inputs:
shape = list(g_tfeats.size())
shape[1] = 0
history_states = [g_tfeats.new(torch.Size(shape))] * self.num_generation_layers
batched_inputs[kfg.HISTORY_STATES] = history_states
else:
history_states = [None] * self.num_generation_layers
for i, layer_module in enumerate(self.g_layers):
if history_states[i] is not None:
history_states[i] = torch.cat([history_states[i], g_tfeats], dim=1)
g_tfeats = layer_module(g_tfeats, vfeats, ext_g_tmasks, ext_vmasks, history_states[i])
g_tfeats_arr.append(g_tfeats)
ret.update({ kfg.G_HIDDEN_STATES: g_tfeats_arr })
return ret