Breno

The forward in simple neural network

So, se inicializamos uma rede neural com os parâmetros que são aprendidos, como seria o forward pass?

Consideremos o caso do embedding model que discutimos. Foquemos no forward com um aprendizado simples.

Após a obtenção dos logits, como se procede? Com a loss. Para medir como a rede neural está em termos da tarefa. E a loss espera então os logits e os targets.

Consideremos o código para entender melhor.

logits = self.token_embedding_table(idx) # (B, T, C).

Essa linha de código gera os logits. Considera o que está no comentário. Seria o shape dos logits. O B seria o tamanho do batch, o T seria a dimensão de cada exemplo, no caso da aula do Karpathy, o T seria 8, o block_size, que no contexto da aula são os números de caracteres de treino para predição do próximo caractere e o C, a dimensão de channel, seria a representação de cada caractere como embedding de 65, que seria o número de caracteres do vocabulário. So, para obter a loss seria com a seguinte linha.

loss = F.cross_entropy(logits, targets)

So, aqui se dá o aprendizado do forward, porque com isso se fecha. A implementação da cross-entropy do PyTorch considera a dimensão de channel na segunda posição das dimensões. Então, com (B, T, C), dá erro.

Precisa então do reshape. O forward então fica do seguinte jeito.

def forward(self, idx, targets=None):
  logits = self.token_embedding_table(idx)
  B, T, C = logits.shape
  logits = logits.view(B*T, C)
  targets = targets.view(B*T)
  loss = F.cross_entropy(logits, targets)
  return logits, loss

So, o reshape considera então o número de batches, no exemplo seria 4, multiplicado pelo número de caracteres por exemplo, que seria 8, e, na segunda posição, o C. Desse modo, com o C na segunda posição, funciona. O targets precisa also realizar o reshape para acompanhar a dimensão dos logits e serem assim comparados.

Really great learning.