Coletânea Python do ZERO às Redes Neurais Artificiais
Sistemas de Recomendação – Boltzmann Machines
Boltzmann Machines são modelos de redes neurais que são comumente usadas em sistemas de recomendação. Em algum momento você já deve ter terminado de assistir um vídeo no YouTube, Netflix ou até mesmo no Facebook e se deparou ao final do vídeo com uma série de sugestões apresentadas com base no vídeo que você acabou de assistir, muitas vezes essas recomendações parecem não fazer sentido, mas em boa parte das vezes ela realmente recomenda algo de relevância com base na sua última experiência, isto se dá por um modelo de rede neural bem característico, capaz de aprender os padrões de escolha do usuário e fazer recomendações.
Uma máquina de recomendação possui algumas particularidades, o
primeiro grande destaque é o fato de as células de entrada, nesse tipo de rede, fazer parte dos nós da rede, se atualizando junto com o processamento da mesma, pois não há uma camada de entrada definida como nos outros modelos, da mesma forma não existe uma camada específica de saída.
Em outros modelos havia uma fase supervisionada, onde apontávamos para a rede onde estava o erro para que ela aprendesse, neste modelo de rede neural não há supervisionamento. Dessa forma, raciocine que uma Boltzmann Machine é um tipo de rede onde todos neurônios estão conectados entre si, e não por camadas, assim a rede identifica e aprende qual é o comportamento padrão de um sistema para que possa identificar alterações, ou identificar qualquer coisa fora do padrão.
Em suma, uma Boltzmann Machine é um modelo que quando instanciado em uma determinada plataforma ou contexto, imediatamente irá identificar os objetos desse contexto (assim como suas características e classificações) e a partir daí ela reforça os padrões aprendidos e monitora qualquer padrão desconhecido.
Como exemplo vamos simular um sistema de recomendação de filme. Supondo que você é usuário de uma plataforma de streaming que ao final da visualização de um vídeo pede que você avalie o mesmo simplesmente dizendo se gostou ou se não gostou, com base nessas respostas o sistema de recomendação irá aprender que tipo de vídeo você gosta para que posteriormente possa fazer recomendações.
Dando início criamos nosso arquivo Boltzmann.py e em seguida já realizamos as primeiras importações. Importamos a biblioteca numpy e a ferramenta RBM (Restricted Boltzmann Machine). Para que esse processo ocorra de forma correta é necessário o arquivo rbm.py estar na mesma paste de Boltzmann.py.
Em seguida criamos nossa variável rbm que inicializa a ferramenta RBM lhe passando como parâmetros num_visible referente ao número de nós dessa rede (lembrando que aqui não são tratados como neurônios de uma camada de entrada...) e num_hidden que define o número de nós na camada oculta.
Na sequência criamos nossa variável base que tem como atributo uma array numpy onde estamos simulando 6 usuários diferentes (cada linha) e que filmes assistiu ou deixou de assistir respectivamente representado em 1 ou 0.
Se o processo foi feito corretamente, sem erros de sintaxe, a devida variável é criada.
Logo após é criada nossa variável filmes que recebe em formato de lista o nome de 6 filmes, aqui neste exemplo, apenas diferenciados quanto ao seu estilo. Um de terror, um de comédia, um de ficção científica, um drama, um documentário e uma animação.
Na sequência executamos duas funções de nossa rbm, .train( ) parametrizado com os dados de nossa base e max_epochs que define quantas vezes ocorrerão as atualizações dos pesos. Por fim são inicializados os pesos.
Selecionado e executado o bloco de código anterior é possível ver a rede sendo treinada via console assim como a margem de erro calculada.
Da mesma forma é criada uma array com os dados dos pesos. Aqui a maneira correta de fazer a leitura dessa matriz é não considerar nem a primeira linha nem a primeira coluna pois esses são dados de bias, a leitura é feita a partir da segunda linha da segunda coluna em diante. Dessa forma a rmb encontrará os padrões que dão característica a cada tipo de filme, por exemplo na segunda linha, referente ao filme O Exorcista, 1.26 e 6.97. A partir desse ponto, podemos simular um usuário e fazer a recomendação do próximo filme ao mesmo.
Começando com a fase de previsão e recomendação, inicialmente criamos uma variável de nome usuario, que por sua vez, com base em sua array, assistiu O Exorcista, American Pie e Forrest Gump, deixando de assistir outros títulos (essa array em outro contexto também pode significar que o usuário assistiu todos os 6 filmes mas gostou apenas do nº 1, 2 e 4.
Em seguida criamos o mecanismo que fará a identificação do usuário (suas preferências). Para isso usamos a função .run_visible( ) parametrizada com os dados de usuario. Na sequência é criada a variável camada_oculta que possui uma array para classificação binária, ou um tipo de filme ou outro com base na proximidade de suas características.
Por fim é criada a variável recomendacao que roda a função .run_hidden( ) sobre camada_oculta. Desta maneira será identificado e recomendado um próximo filme com base nas preferências do usuário. Lembrando que aqui temos uma base de dados muito pequena, o ideal seria um catálogo de vários títulos para que se diferenciasse com maior precisão os estilos de filme.
Note que executado o bloco de código anterior, é criada a variável recomendacao onde podemos ver que há o registro do primeiro e do segundo filme, ao lado agora está ativado o registro correspondente ao terceiro filme, como o usuário ainda não viu este, essa coluna agora marcada como 1 será a referência para sugestão desse filme.
Para deixar mais claro esse processo, criamos um laço de repetição que percorre todos os registros de usuário (toda a linha), com base nisso é impresso o padrão das preferências desse usuário. Em seguida é criada uma estrutura condicional que basicamente verifica que se os registros do usuario forem igual a – e os registros de recomendacao na mesma posição da lista for igual a 1, é impresso o nome do filme desta posição da lista, como recomendação.
Note que o processo executado dentro do laço de repetição confere com a projeção anterior.
Sendo assim, é impresso o nome do filme a ser recomendado a este usuário com base em suas preferências, nesse caso, Matrix.
Código Completo: