Continuando com o nosso módulo de redes neurais, vamos discutir as Generative Adversal Networks, também conhecidos como redes Guns. Bom, uma gã ela é composta de duas partes, como a gente mostra nessa figura aqui embaixo. A primeira é parte é um gerador que aprende a gerar dados plausíveis, né?
As instâncias geradas se tornam exemplos de treinamento negativos para a segunda parte da rede, que é o discriminador. O que que faz esse discriminador? Ele aprende a distinguir os dados falsos do gerador dos dados reais.
O discriminador penaliza o gerador por produzir resultados implausíveis, né? Então, se o gerador é ruim, ele é penalizado até que ele melhore. Tanto o gerador quanto o discriminador são redes neurais.
E aqui a gente pode ter qualquer tipo de rede neural nessa arquitetura de GAN. Isso aqui pode ser um MLP. Eh, a as redes podem ser CNNs, geralmente quando a gente fala de guns, né, redesativas de imagens, a gente geralmente usa algum esquema de CNN.
Eh, quando a gente discutiu a parte de data aumentation, a gente eh mostrou um exemplo de redes para gerar distribuição de dados. Naquele caso, as redes eram simplesmente MLPs gerando os dados. Então você pode ter qualquer tipo de rede neural que possa trein ser treinada aqui com com back propagation, né?
Eh, então através do back propagation, a classificação do discriminador fornece um sinal que o gerador usa para atualizar seus pesos. Então essa é a arquitetura, né? é como funciona.
Então, eh, a ideia por trás da GAN é você inicia, né, com com geralmente um exemplo eh aleatório, uma distribuição uniforme de dados, geralmente ruído. Eh, e ao longo do tempo, a rede discriminadora vai falar o que isso aqui é a é um exemplo eh falso, né? E aqui eu tenho um exemplo real, os dados reais.
E a ideia é que você consiga, que o gerador consiga ser tão bom ao fim, aprendendo, olha, ah, se isso é real, então deixa eu tentar melhorar a minha imagem aqui. Opa, tá um pouquinho melhor, mas ainda o discriminador discriminado diz que é falso. Até chegar um ponto aonde o dado gerado pelo gerador é tão bom que o discriminador não consegue dizer que isso aqui é falso, né?
Então essa essa é a ideia da rede. A gente começa com dados aleatórios, vai aprendendo com dados reais o que que é bom. Os pesos vão sendo atualizados até o momento em que a gente que a rede neural o que o discriminador consiga ser enganado, né?
Discrimin ele não consegue mais discriminar o que é verdadeiro e o que é falso, tá? Então é assim que funciona. Então vamos discutir um pouquinho cada um dos módulos dessa dessa da arquitetura gan, né?
Então, o primeiro seria o discriminador. Então, o discriminador é um classificador que tenta distinguir os dados reais, os dados criados pelo gerador, como eu citei anteriormente. Pode usar qualquer arquitetura de rede apropriada pro tipo de dado que tá sendo classificado, né?
Então, se a gente tem os dados dentro de um vetor ali, eh, que a gente precisa aumentar os dados, pode ser um MLP, se são imagens, uma CNN e assim por diante, tá? Os dados de treinamento então vem de duas fontes. Instâncias dados reais, como a nota de dólar que eu mostrei no exemplo anterior.
O discriminador usa essas instâncias como exemplos positivos durante o treinamento e as instâncias falsas são geradas, né, pelo pelo pela rede geradora ali, pelo Então, o discriminador usa essas instâncias como exemplos negativos durante o treinamento. Então, você tem o exemplo positivo e o exemplo negativo para treinar o discriminador, para ele saber o que que é verdadeiro, o que que é falso. Então você tem as duas classes num problema binário, né?
Tá? Então nessa figura abaixo aqui, a gente tem essas duas caixas chamadas de amostra que representam essas duas fontes de dados que alimentam o discriminador, os dados genuínos e os dados gerados pela rede geradora. Aqui então a gente tem as duas entradas de dados e durante o treinamento do discriminador, o gerador não é treinado, né?
Ele tá simplesmente tirando dados, os seus pesos permanecem constante enquanto produz exemplos para o discriminador treinar, tá? Então é assim que a gente treina esse discriminador. Depois a gente vai falar um pouquinho mais sobre o treinamento da rede completa.
O treinamento então do nosso discriminador eh ele se conecta a duas funções de perda, né? a perda do discriminador e a perda do gerador. O discriminador classifica os dados reais e dados falsos do gerador.
A perda, então, penaliza esse discriminador por classificar mal uma instância real como falsa ou uma instância falsa como real. Então, ambos tipos de erro são penalizados e os pesos são atualizados através do back propagation, da perda, né, do discriminador através da rede discriminatória. Então, o back propag atualiza, né, você calcula a perda aqui e atualiza os pesos desse dessa rede para ela melhorar na próxima na próxima época, na próxima interação de treinamento, tá?
Já o gerador, né? A parte geradora da GAN aprende a criar dados falsos incorporando o feedback do discriminador. Ah, isso aqui é falso.
OK, então deixa eu tentar melhorar. É isso que ele faz, né? Então ela vai aprender a fazer o que o discriminador classifica essa a sua produção, né?
Produção de dados sócios como real. né? A ideia é tentar enganar o discriminador.
O treinamento do gerador requer uma integração mais próxima, né, entre o gerador e o discriminador do que o treinamento discriminador. Temamento do discriminador mais simples, que é isso é falso, é verdadeiro, né? Então, a parte da GAN que treina, né?
Eh, o gerador inclui uma entrada aleatória, como a gente citou, a rede geradora que transforma essa entrada aleatória numa instância de dados. Então, se eu tô pensando numa imagem, eu tenho uma entrada, um vetor aleatório qualquer, isso vai ser transformado num numa imagem com dados aleatórios, né? Com pode ser uma distribuição uniforme.
Eh, a rede discriminadora que classifica os dados gerados, a saída do discriminador e a perda do gerador que penaliza o gerador por não enganar o discriminador. Você não tá conseguindo uma performance boa, você tem que penalizar ele para melhorar o desempenho desse gerador, tá? a entrada aleatória desse gerador.
Então, na forma mais básica, Magan recebe um ruído aleatório com uma entrada. O gerador então transforma esse ruído na saída significativa, por exemplo, uma imagem. A introduzir ruído, podemos fazer com que a G produza uma ampla variedade de dados, né?
Eh, agora, eh, tem vários experimentos mostrando, né, que a distribuição do wido não importa muito, você pode começar com qualquer distribuição de então geralmente se começa com uma distribuição uniforme porque não tem muito impacto no desempenho da rede da GAN como um todo, tá bom? Eh, então a gente vai usar o discriminador, né? Ele vai falar: "Ó, isso aqui é falso, você gerou alguma coisa, é falso.
Opa, eu quero, como que eu melhoro, então agora para tentar eh enganar o nosso discriminador. Então, treinamento do gerador segue esse procedimento aqui, né? Primeiro, amostra do ruído aleatório.
Produz a saída do gerador a partir de um ruído aleatório amostrado. Obtenho a classificação real ou falsa para a saída do gerador. Calcula a perda de classificação discriminadora.
Se o nosso discriminador vai calcular essa perda. Vou fazer a retropropagação do deus através do discriminador e do gerador para obter esses gradientes e vou usar os gradientes para terar os pesos do nosso gerador, assim tornando nosso gerador cada vez melhor, tá? Então ali é a treinamento de cada uma das redes, independentemente, mas a G é uma arquitetura.
Então como sendo uma arquitetura, eu preciso treinar essa arquitetura de uma maneira junta. em um certo momento eu vou ter que fazer esse treinamento combinado, porque é uma arquitetura, eu tenho que treinar a arquitetura, tá? Então, como que funciona isso?
Como eu tenho duas redes treinadas separadamente, eh, eu tenho que resolver dois problemas, né? A primeira é lidar com dois tipos diferentes de treinamento do gerador e discriminador e lidar com a convergência. Não é fácil, não é tão simples, por exemplo, como eu verificar se uma uma CNN ou uma mlp simples tá convergindo, né?
Você vai monitorando tua curva. Aqui eu tenho duas redes para monitorar essa convergência. Então, a pergunta é como o gerador e o discriminador eh tem processos de treinamento diferentes, como que eh eh como a gente treina a GAN de um de uma de um modo inteiro, né, como um todo.
Eh, esse treinamento para treinar a arquitetura completa, ele segue em períodos treinados. Então, eu treino eh o discriminador por algumas épocas, aí eu treino o gerador por algumas épocas e vou fazendo isso sucessivamente, né? Vou alternando essas essas o treinamento do vereador e do discriminador para melhor um, melhor o outro, melhor um, melhor o outro.
Ou seja, melhor o a capacidade do discriminador saber se é bom, se é falso ou se é verdadeiro. E melhor a capacidade do gerador gerar exemplos eh que vão eh confundir, né, o nosso discriminador, fazer com que ele cometa erros, tá? Então, eu mantenho o gerador constante durante a fase de treinamento do discriminador.
À medida que o treinamento discriminador tenta descobrir como distinguir dados reais de dados falsos, ele tem que aprender a reconhecer as falhas do gerador, tá? Esse problema, esse é um problema diferente para um gerador completamente treinado do que para um gerador não treinado que produz saída aleatória. Eu posso começar com gerador, né?
eh previamente treinado ou um gerador que não foi treinado simplesmente começa com dados aleatórios. Então, as duas as duas hipóteses são possíveis dentro desse contexto das ganas, tá? E da mesma forma nós mantemos o discriminador constante durante a fase de treinamento do gerador.
Se eu não fizer isso, né, o nosso gerador estaria tentando atingir um alvo em movimento. Po, e aí a gente nunca vai ter uma convergência, tá? Por isso que a gente faz essa essa alternância entre os dois.
Falando em convergência, uma medida que o gerador melhora com o treinamento, o desempenho do discriminador piora, né? A medida, né, que o nosso gerador melhora com treinamento, o desempenho do discriminador piora. Por quê?
O discriminador não consegue dizer facilmente a diferença entre o real e o falso. Quanto melhor for nosso gerador, mais dificuldade o nosso discriminador vai ter de falar se aquilo é real ou se é falso. Como aquele exemplo do dólar, das notas de dólar lá atrás no na terceira linha do nosso exemplo.
Tenho duas notas que o nosso discriminador já não consegue discriminar. Se eu tiver um gerador perfeito, ou seja, um gerador que que consiga enganar, né, sempre o nosso discriminador, o nosso discriminador vai ter um desempenho muito ruim, cerca de 50%, é como se jogar uma moeda, né, verdadeiro ou falso. Se ele tiver um desempenho de 50% do nosso discriminador, quer dizer que o nosso gerador é perfeito.
A gente tem tá gerando dados muito, muito bons, que o nosso discriminador já não consegue mais falar o que que é verdadeiro, o que que é falso. Essa progressão de melhora do nosso do nosso gerador representa um problema pra convergência da GAN como um todo, né? Feedback do discriminador se torna cada vez menos significativo ao longo do tempo, que se ele vira como uma moeda, né?
Ele não tem mais importância. Então, se a Gan continuar treinando, além de um ponto que o discriminador está dando feedback completamente aleatório, o nosso gerador começa a treinar com feedback indesejado, ou seja, começa a entrar em overfeit nosso, a gente não vai ter mais um desempenho eh satisfatório da nossa da nossa arquitetura, tá? Então, a gente pode entrar em colapso, né?
A nossa rede entra em colapso e já não faz mais sentido, tá? Eh, a gente viu na nossa nas nossas caixinhas que a gente tem duas funções de perdas que são utilizadas durante o treinamento. Eh, então nós temos uma para treinamento gerador e a outra pro discriminador.
Como duas funções de perda podem trabalhar juntas, então, para refletir uma medida de distância entre distribuições de probabilidade. As perdas do gerador e discriminador derivam de uma única medida de distância entre as distribuições de probabilidade, tá? O gerador só pode afetar um termo na medida de distância, o termo que reflete a distribuição dos dados falsos.
Então, durante o treinamento gerador, a gente abandona o outro ter que reflete a distribuição dos dados reais, tá? Eh, isso eh, tá nessa nessa equação aqui que é a função de de perda mais usada quando a gente treina. Tem outras, mas essa aqui eu acho que é a mais usada, é a min max, tá?
Eh, e aqui eu tenho, né, a descrição de cada um dos termos. Então, o nosso dx aqui é a estimativa do discriminador da probabilidade de que a distância de dados reais X seja real. O e de X aqui é o valor esperado em todas as instâncias dos dados reais.
O G de Z é a saída do gerador quando o ruído Z é dado, tá? O D de G de Z é estimativa do discriminador de probabilidade de que uma instância eh de que uma instância falsa seja real. O ID é o valor esperado sobre todas as entradas aleatórias para o gerador.
Essa fórmula deriva da entropia cruzada, né? entre as distribuições reais e geradas, as que foram geradas pelo nosso gerador. Então, o gerador não pode afetar diretamente o termo, né?
E esse termo log de x aqui na função. Portanto, para o gerador minimizar a perda é equivalente a minimizar o log de 1 men o d de g de z, né? Que é essa essa função aqui, tá?
Então essa é a função de perda mais utilizada. nas guns. Aqui a gente tem um exemplo, eh, e aqui tem um um link pro Google Colap dessas redes.
Então, essas essas eh, nesse exemplo aqui, as redes utilizadas são duas CNNs, tá? Eh, aqui a gente tem a primeira época, né, de desse desse gerador. O exemplo usado aqui a base em minist, que a gente já usou em outros exemplos da base são os números eh dígitos manuscritos, né, de 0 a 9.
Então, no começo, a rede gera basicamente ruído. A gente tem ruído aqui dentro. Então, o ruído gerado é transformado, como eu disse, numa imagem.
Então, ele gera um vetor com ruído, transformam isso numa imagem. Por exemplo, isso aqui é uma imagem com o IO gerado. E aqui eu tenho os exemplos reais.
Então vocês podem notar que eh o nossos exemplos gerados inicialmente pela rede é muito diferente do que a gente tem como exemplo real. O objetivo da rede é o quê? É eu conseguir gerar dados que sejam parecido com as reais, né?
Então depois de 90 épocas, vocês podem rodar esse exemplo depois. Vocês podem perceber que os dados que foram gerados estão todos rotulados com fake aqui, eh, estão muito mais parecido com dados reais. Aqui a gente não tem uma relação de um para um, tá?
É simplesmente são o que se parecem com dígitos e o que são dígitos. Então vocês podem ver que eu já tenho vários dados, várias imagens aqui que se parecem com dígito. Aqui eu tenho um oito perfeito, um cinco perfeito, um sete, um outro, um nove que tem ainda um um traço indesejado aqui, mas tá muito próximo.
Mas ainda eu tenho alguns algumas imagens que ainda a gente não sabe dizer que o que que dígitos são. Por quê? Porque a RID precisa de mais tempo de treinamento, mas a ideia é que treinando mais épocas, eu consiga melhorar isso aqui.
Eh, aonde que a gente usa, né? Eu posso então como data aumentation para ir para alguns tipos de classificadores, eu preciso de mais dados para treinar um classificador qualquer. Posso usar uma gun.
Então, eu tenho dados reais e com base nesses dados reais a gente gera gera cada vez mais dados. Eh, aplicações de guns hoje, por exemplo, para gerar imagens de face ou tanto por bem como por mal, né, para você gerar deep fakes, então que são imagens falsas tanto de fácil como vídeos falsos e assim por diante. É onde esse tipo de rede tem sido bastante utilizada, mas eu também posso usar pro lado bom, como eu disse, pra gente gerar dados para treinar um classificador melhor.
Eu tenho poucos dados. faço uma geração de dados para fazer um data aumentation para daí treinar meu classificador. Eu, por exemplo, eu tenho dados desbalanceados, eu posso gerar dados de uma outra classe usando uma rede desse tipo para balancear o o os dados e treinar um classificador eh melhor.
OK? Então, isso e conclui o nosso a nossa apresentação sobre redes eh generativas.