Я очень новичок в обучении нейронных сетей, но глупо пытался реализовать мою собственную новую архитектуру.Он очень похож на трансформатор в том, что конвейер принимает тензор «заголовков статей», пропускает его через половину преобразователя преобразователя, затем через несколько преобразований и версий преобразователя преобразователя.Выходные данные затем суммируются в один вектор и Softmaxed.Я также написал собственную функцию потерь.
Когда я строю график средних градиентов для слоя, это выглядит так: this .
(Градиенты последнего слоя огромны, а остальныеедва существуют. Это после обрезки градиента до 0,25, до этого градиент последнего слоя был около 1e7)
Вот мой соответствующий код:
def forward(self, example):
art_mask = Variable((example.Art[:,:,0] != 0).unsqueeze(-2)).cuda()
Art = Variable(example.Art).cuda()
# To give context to article embeddings, pass through Transformer Encoder block
Art = self.encoder_block(self.position_layer(Art), art_mask).cuda()
Tsf = example.Tsf.cuda().repeat((1,Art.shape[1],1)).cuda()
# Concanetante Tsf to Art
Art = torch.cat((Art, Tsf), dim=2).cuda()
# Convert Art to Ent and construct ent_mask
Ent = Art[example.EntArt[:,:,0], example.EntArt[:,:,1],:].cuda()
ent_mask = (example.EntArt[:,:,0] == -1).unsqueeze(-2).cuda()
# Pass to graph block, alternating layers of Relational Attn and Entity Self Attn
Ent = self.graph_block(Ent, ent_mask, example.RelEnt).cuda()
# Slice and reorder Ent into assets tensor
A = len(self.assets_list)
Ass = torch.full((A,1), -1, dtype=torch.long).cuda()
for i,uri in enumerate(self.assets_list):
if uri in example.AssetIndex:
Ass[i] = example.AssetIndex[uri]
Assets = Ent[Ass, :, :].squeeze(1).cuda()
mask = Ass.unsqueeze(2).repeat(1,Assets.shape[1],Assets.shape[2]).cuda()
Assets = Assets.masked_fill(mask == -1, -1e9).cuda()
Assets = Assets.sum(dim = 1).squeeze(1)
Assets = torch.matmul(Assets, self.W).cuda()
bias = torch.zeros((1)).cuda()
Assets = torch.cat((Assets, bias)).cuda()
return self.softmax(Assets)
"""
prices[i] is normalized closing / opening
:param prices <torch.Tensor(batch_size, len(assets))>
"""
def loss_f(model, XY):
examples, prices = XY
portfolios = torch.stack([model.forward(ex) for ex in examples], dim=0)
prices = Variable(prices)
# safe asset (US Dollars) at prices[:,-1]
prices = torch.cat((prices, torch.ones((prices.shape[0], 1), dtype=torch.float)), dim = 1).cuda()
return -torch.sum(portfolios * prices) / 4 # batch size
Слой с большими градиентамикоэффициенты и смещения для слоя LayerNorm в конце архитектуры преобразователя