Eu trabalhei com um cientista de dados como engenheiro de software. Aqui está minha experiência.

Falando sobre minha experiência como desenvolvedor Java / Kotlin enquanto trabalhava com nosso cientista de dados

Ben Daniel A. 24 de dezembro Foto por Daniel Cheung em Unsplash

fundo

No final de 2017, comecei a desenvolver interesse no campo Machine Learning. Eu falei sobre minha experiência quando comecei minha jornada. Em resumo, foi preenchido com desafios divertidos e muita aprendizagem. Eu sou um engenheiro de Android, e esta é minha experiência trabalhando em projetos de ML com nosso cientista de dados.

Lembro-me de tentar resolver um problema de classificação de imagem que surgiu em um de nossos aplicativos. Precisávamos diferenciar entre imagens válidas e inválidas com base em um conjunto definido de regras. Eu modifiquei imediatamente este exemplo do Deeplearning4J (dl4j) e tentei usá-lo para lidar com a tarefa de classificação. Não obtive os resultados esperados, mas continuei otimista.

Minha abordagem com o código de exemplo dl4j não foi bem-sucedida, devido ao tipo de precisão que obtive e ao tamanho final do modelo treinado. Isso não podia ser feito porque precisávamos de um modelo com tamanho de arquivo compacto, o que é especialmente importante para dispositivos móveis.

Digite o cientista de dados

Foto por rawpixel no Unsplash

Foi nessa época que nós contratado um cientista de dados, e ele veio com um monte de experiência relevante. Mais tarde eu aprenderia muito com ele. Eu tinha relutantemente começado a aprender o básico do Python depois que descobri que a maioria dos problemas de ML poderia ser resolvida com o Python. Mais tarde, descobri que algumas coisas eram mais fáceis de implementar em Python, pois já existe um enorme suporte para ML na comunidade Python.

Começamos com pequenas sessões de aprendizado. Neste ponto, os outros membros da minha equipe ficaram interessados e também participaram das sessões. Ele nos deu uma introdução ao Jupyter Notebooks e ao Cloud Machine Learning Engine . Nós rapidamente nos sujamos ao tentar a classificação da imagem usando o exemplo de conjunto de dados de flor .

Depois que todos na equipe se basearam nos fundamentos do treinamento e na implantação de um modelo, fomos direto para as tarefas pendentes. Como membro da equipe, concentrei-me em duas tarefas neste momento: o problema de classificação de imagens e um problema de segmentação. Ambos seriam implementados posteriormente usando Redes Neurais de Convolução (CNNs).

Preparar os dados de treinamento não é fácil

Foto de Jonny Caspari em Unsplash

Ambas as tarefas exigiam muitos dados de treinamento. A boa notícia foi que tínhamos muitos dados. A má notícia foi que eles não foram classificados / não anotados. Eu finalmente entendi o que os especialistas da ML disseram sobre gastar mais tempo preparando os dados de treinamento ao invés de treinar o modelo em si.

Para a tarefa de classificação, precisávamos organizar centenas de milhares de imagens em diferentes classes. Este foi um trabalho tedioso. Eu tive que invocar minhas habilidades em Java Swing para construir GUIs que facilitassem essa tarefa, mas, no geral, a tarefa era monótona para todos os envolvidos na classificação manual.

O processo de segmentação foi um pouco mais complicado. Nós tivemos sorte o suficiente para encontrar alguns modelos que eram bons em segmentação já, mas infelizmente eles eram muito grandes. Também queríamos que o modelo fosse executado em dispositivos Android com especificações muito baixas. Em um momento de brilhantismo, o cientista de dados sugeriu que usássemos o enorme modelo para gerar os dados de treinamento que seriam usados para construir nosso próprio mobilenet.

Treinamento

Nós finalmente mudamos para o AWS Deep Learning AMI . Nós já estávamos confortáveis com a AWS e foi uma vantagem que eles ofereceram um serviço como esse. O processo de treinamento do modelo para a segmentação de imagens foi totalmente tratado pelo nosso cientista de dados, e eu fiquei ao lado dele, tomando notas :).

Aqueles não são os logs reais, LOL.

Treinar este modelo foi uma tarefa computacionalmente intensiva. Foi quando vi a importância de treinar em um computador com GPU (s) e RAM suficientes. O tempo que levou para treinar foi razoavelmente curto porque usamos esses computadores para nosso treinamento. Levaria semanas, se não meses, se tivéssemos usado um computador básico.

Eu lidei com o treinamento do modelo de classificação de imagens. Nós não precisamos treiná-lo na nuvem, e na verdade, eu treinei no meu Macbook pro. Isso porque eu estava treinando apenas a camada final da rede neural em comparação com o treinamento completo da rede que fizemos para o modelo de segmentação.

Nós fizemos isso para prod

Ambos os modelos chegaram ao nosso ambiente de produção após testes rigorosos ?. Um membro da equipe foi encarregado de construir as bibliotecas do wrapper Java. Isso foi feito para que os modelos pudessem ser usados de forma a abstrair toda a complexidade envolvida na alimentação do modelo com as imagens e extrair resultados significativos do tensor das probabilidades. Esta é a matriz que contém o resultado da previsão que o modelo fez em uma única imagem. Eu também estava envolvido um pouco nesse ponto, já que alguns dos códigos hacky que eu havia escrito anteriormente foram limpos e reutilizados aqui.

Desafios, desafios em todos os lugares

Desafios são o que tornam a vida interessante. Superá-los é o que os torna significativos. – anônimo

Eu me lembro quando meu maior desafio foi trabalhar com matrizes tridimensionais. Ainda me aproximo deles com cautela. Trabalhar em projetos de ML com nosso cientista de dados foi o incentivo que eu precisava para continuar minha aventura de ML.

Meu maior desafio ao trabalhar nesses projetos foi tentar construir, a partir da fonte, a biblioteca Java Tensorflow para sistemas de 32 bits usando o Bazel. Eu não fui bem sucedido nisso.

Também experimentei outros desafios, um deles foi frequente: traduzir as soluções Python para Java. Como o Python já criou suporte para tarefas de ciência de dados, o código pareceu mais conciso no Python. Lembro-me de arrancar os cabelos quando tentei literalmente traduzir um comando: dimensionar um array 2D e adicioná-lo como uma camada transparente a uma imagem. Nós finalmente conseguimos que funcionasse e todos estavam animados.

Agora, os modelos em nosso ambiente de produção estavam indo muito bem, mas quando eles produziam um resultado errado, os resultados errados estavam ridiculamente muito errados. Isso me lembrou da citação que vi neste excelente post sobre transformar os modelos ML em produtos e serviços reais.

… Os modelos realmente se degradarão em qualidade – e rápido – sem um feed constante de novos dados. Conhecida como desvio de conceito , isso significa que as previsões oferecidas pelos modelos estáticos de aprendizado de máquina se tornam menos precisas e menos úteis à medida que o tempo passa. Em alguns casos, isso pode acontecer em questão de dias. – David Talby

Isso significa que teremos que continuar melhorando o modelo, e não há modelo final, o que é interessante.