One-shot learning vs Classificação

Nem sempre a classificação é a melhor escolha

Luísa Mendes Heise
Turing Talks

--

Bem-vindo a mais um Turing Talks! Hoje, nesse post mais curto de terça-feira, vamos falar sobre o que é one-shot learning e como se diferencia de um problema de classificação clássico.

Acesso por reconhecimento facial é um problema que costuma ser atacado com one-shot learning

Classificação

Caso você seja um leitor assíduo do Turing Talks, já deve ter visto alguns posts aqui explicando o que é classificação e alguns modelos que podem ser utilizados para fazer esse tipo de tarefa.

Recapitulando um pouco disso, essa tarefa envolve atribuir certos labels a dados, ou seja, categorizar um determinado conjunto de dados em classes. Para isso, você deve ter uma base de treino em que estejam todas as categorias que você deseja prever. Ou seja, se quiser classificar imagens entre cães, gatos e patos, o seu dataset de treino deve ter imagens desses três animais.

Não somente você deve ter exemplos de todas as classes, mas vários deles. Se você já treinou um classificador na vida sabe que, em geral, dois ou três exemplos de uma classe não dão conta de treinar um bom classificador, mas sim algo na ordem de centenas ou milhares.

Em geral, uma das funções de custo mais utilizada para problemas de classificação é a perda de entropia cruzada (em inglês cross entropy loss). Essa função faz uso das probabilidades das classes, o que casa muito bem com o caso geral, pois o output dos modelos costuma ser um vetor de tamanho M que representa a probabilidade de cada uma das M classes.

Ou seja, se eu quisesse classificar se, numa imagem, tenho um cão, um gato ou um pato eu teria, por exemplo, um vetor [0.15, 0.45, 0.4] representado a probabilidade de cada uma dessas classes.

Matematicamente, essa função de custo pode ser expressa da seguinte maneira:

Em que:

  • yo,c é o label para a categoria (1 se c for a classificação correta para o exemplo o e 0 caso contrário)
  • po,c é a probabilidade de o exemplo o ser da classe c
  • M é o número de classes

Então, utilizando o vetor [0.15, 0.45, 0.4] para representar as probabilidades de cão, gato e pato, respectivamente, numa foto de um gato, teríamos L = -0*log(0.15) -1*log(0.45) -0*log(0.4) = 0.79.

One-shot learning

Vamos supor agora que querem instalar um sistema de reconhecimento facial no seu prédio residencial ou comercial para que a entrada no condomínio seja liberada. A abordagem por classificação seria tirar várias fotos de cada uma das pessoas que têm acesso ao prédio para montar o dataset e então treinar um modelo.

Bom, não é difícil enxergar várias inconveniências nesse processo…Por exemplo:

  1. Você teria que incomodar várias pessoas para obter diversas fotos delas
  2. A partir do momento que alguém novo se mudasse para o prédio/recebesse acesso, o sistema teria que ser retreinado

Nesses casos é melhor utilizar uma abordagem por one-shot learning. O princípio aqui é que o modelo deve aprender uma representação que nos permita extrair similaridade entre duas fotos, e não atribuir um label de forma direta a uma foto. Então, na prática, quando uma pessoa tentar acessar o prédio, nós faríamos a captura de uma imagem dela e, com a ajuda do nosso modelo, computaríamos scores de similaridade entre a foto da pessoa e as fotos de cada uma das pessoas autorizadas. Se algum desses scores fosse maior do que um certo número (99% similar, por exemplo), diríamos que a pessoa estaria liberada para o acesso. Caso contrário, ela estaria barrada.

Em processamento de linguagem natural, essa mesma abordagem pode ser utilizada para computar similaridade entre perguntas, por exemplo, e assim, dizer se duas perguntas são ou não duplicatas. Nesse caso, as perguntas “Qual é a sua idade?” e “Quantos anos você tem?” devem ter uma alta similaridade, enquanto “Qual é a sua idade?” e “Qual é a sua cor favorita?” devem ter baixa similaridade.

Utilizando deep learning, uma abordagem que pode ser utilizada é a de redes siamesas. O objetivo aqui é aprender representações para os dados que permitam o cálculo de métricas coerentes de (dis)similaridade, tais como distância euclidiana ou similaridade de cossenos. Em outras palavras, se fôssemos considerar o exemplo do prédio, dada uma imagem de uma pessoa, gostaríamos que o vetor gerado tivesse alta similaridade com outros vetores gerados por outras fotos dessa pessoa e baixa similaridade com vetores de fotos de outras pessoas.

No caso das redes siamesas, a similaridade entre dois inputs é obtida por meio da comparação dos outputs dados pela rede neural. É importante frisar que os dois inputs passarão pela mesma rede.

Bom, mas e durante o treino, como otimizamos essa rede para que ela produza vetores com alta similaridade para inputs da mesma classe e baixa similaridade para inputs de classes diferentes? Nesse caso, vamos otimizar o problema para que a função de custo triplet-loss seja minimizada.

Nessa função de custo, a similaridade entre imagens de mesma classe é premiada, enquanto a similaridade entre imagens de classes diferentes é penalizada. Para isso, são utilizadas as representações para três imagens — uma âncora, uma da mesma classe da âncora e outra que não seja da mesma classe da âncora — para realizar o cálculo do custo. Assim, para calcular gradientes para otimização da rede é necessário computar o forward pass para três inputs.

Então no caso em que estamos utilizando a distância euclidiana para medir a dissimilaridade (pois quanto menor mais similar) entre as nossas imagens, a fórmula da triplet-loss fica:

A intuição por trás dessa fórmula é de que queremos que a parcela ||f(A) — f(N)||² ,que se relaciona à distância entre a âncora e o exemplo negativo, seja proporcionalmente maior do que a parcela ||f(A) — f(P)||², que se relaciona à distância entre a âncora e o exemplo positivo. Dessa forma, idealmente, essa diferença tende a ficar negativa. O fator alpha representa uma margem para essa diferença. Por fim, o máximo entre esse cálculo e o zero é feito, já que não queremos que a função de custo seja negativa.

Conclusão

Nesse Turing Talks vimos as diferenças entre classificação e one-shot learning, explorando um pouco as funções de custo costumeiramente utilizadas em cada um desses casos.

Não deixe de acompanhar o Grupo Turing no Facebook, Linkedin, Instagram e nossos posts do Medium =)

Bons estudos e até a próxima!

--

--