|
|
||
|---|---|---|
| .. | ||
| lab | ||
| GenerativePyTorch.ipynb | ||
| GenerativeTF.ipynb | ||
| README.md | ||
README.md
Redes Generativas
Questionário pré-aula
Redes Neurais Recorrentes (RNNs) e suas variantes com células controladas, como Long Short Term Memory Cells (LSTMs) e Gated Recurrent Units (GRUs), fornecem um mecanismo para modelagem de linguagem, pois conseguem aprender a ordem das palavras e prever a próxima palavra em uma sequência. Isso nos permite usar RNNs para tarefas generativas, como geração de texto comum, tradução automática e até legendagem de imagens.
✅ Pense em todas as vezes que você se beneficiou de tarefas generativas, como a conclusão de texto enquanto você digita. Pesquise sobre seus aplicativos favoritos para ver se eles utilizam RNNs.
Na arquitetura de RNN que discutimos na unidade anterior, cada unidade RNN produzia o próximo estado oculto como saída. No entanto, também podemos adicionar outra saída a cada unidade recorrente, o que nos permitiria gerar uma sequência (que tem o mesmo comprimento da sequência original). Além disso, podemos usar unidades RNN que não aceitam uma entrada em cada etapa, mas apenas um vetor de estado inicial, e então produzem uma sequência de saídas.
Isso permite diferentes arquiteturas neurais, como mostrado na imagem abaixo:
Imagem do post no blog Unreasonable Effectiveness of Recurrent Neural Networks por Andrej Karpaty
- One-to-one é uma rede neural tradicional com uma entrada e uma saída.
- One-to-many é uma arquitetura generativa que aceita um valor de entrada e gera uma sequência de valores de saída. Por exemplo, se quisermos treinar uma rede de legenda de imagem que produza uma descrição textual de uma imagem, podemos usar a imagem como entrada, passá-la por uma CNN para obter seu estado oculto e, em seguida, usar uma cadeia recorrente para gerar a legenda palavra por palavra.
- Many-to-one corresponde às arquiteturas RNN que descrevemos na unidade anterior, como classificação de texto.
- Many-to-many, ou sequência-para-sequência, corresponde a tarefas como tradução automática, onde temos uma primeira RNN que coleta todas as informações da sequência de entrada no estado oculto, e outra cadeia RNN que desenrola esse estado na sequência de saída.
Nesta unidade, focaremos em modelos generativos simples que nos ajudam a gerar texto. Para simplificar, usaremos tokenização em nível de caracteres.
Treinaremos esta RNN para gerar texto passo a passo. Em cada etapa, pegaremos uma sequência de caracteres de comprimento nchars e pediremos à rede para gerar o próximo caractere de saída para cada caractere de entrada:
Ao gerar texto (durante a inferência), começamos com um prompt, que é passado pelas células RNN para gerar seu estado intermediário, e então a geração começa a partir desse estado. Geramos um caractere por vez e passamos o estado e o caractere gerado para outra célula RNN para gerar o próximo, até que tenhamos gerado caracteres suficientes.
Imagem do autor
✍️ Exercícios: Redes Generativas
Continue seu aprendizado nos notebooks a seguir:
Geração de texto suave e temperatura
A saída de cada célula RNN é uma distribuição de probabilidade de caracteres. Se sempre escolhermos o caractere com a maior probabilidade como o próximo caractere no texto gerado, o texto frequentemente pode se tornar "cíclico", repetindo as mesmas sequências de caracteres repetidamente, como neste exemplo:
today of the second the company and a second the company ...
No entanto, se analisarmos a distribuição de probabilidade para o próximo caractere, pode ser que a diferença entre algumas das maiores probabilidades não seja tão grande, por exemplo, um caractere pode ter probabilidade 0,2, outro 0,19, etc. Por exemplo, ao procurar o próximo caractere na sequência 'play', o próximo caractere pode ser tanto um espaço quanto e (como na palavra player).
Isso nos leva à conclusão de que nem sempre é "justo" selecionar o caractere com maior probabilidade, pois escolher o segundo maior ainda pode levar a um texto significativo. É mais sábio amostrar caracteres da distribuição de probabilidade fornecida pela saída da rede. Também podemos usar um parâmetro, temperatura, que ajustará a distribuição de probabilidade, caso queiramos adicionar mais aleatoriedade ou torná-la mais inclinada, se quisermos nos ater mais aos caracteres de maior probabilidade.
Explore como essa geração de texto suave é implementada nos notebooks vinculados acima.
Conclusão
Embora a geração de texto possa ser útil por si só, os maiores benefícios vêm da capacidade de gerar texto usando RNNs a partir de algum vetor de características inicial. Por exemplo, a geração de texto é usada como parte da tradução automática (sequência-para-sequência, neste caso o vetor de estado do encoder é usado para gerar ou decodificar a mensagem traduzida) ou para gerar descrições textuais de uma imagem (nesse caso, o vetor de características viria de um extrator CNN).
🚀 Desafio
Faça algumas lições no Microsoft Learn sobre este tópico:
- Geração de Texto com PyTorch/TensorFlow
Questionário pós-aula
Revisão e Autoestudo
Aqui estão alguns artigos para expandir seu conhecimento:
- Diferentes abordagens para geração de texto com Cadeia de Markov, LSTM e GPT-2: post no blog
- Exemplo de geração de texto na documentação do Keras
Tarefa
Vimos como gerar texto caractere por caractere. No laboratório, você explorará a geração de texto em nível de palavras.
Aviso Legal:
Este documento foi traduzido utilizando o serviço de tradução por IA Co-op Translator. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.

