A explosão do Machine Learning e das soluções de IA é inegável. Há uma infinidade de coisas habilitadas por IA, desde a otimização de diagnósticos médicos até processos de RH e de fabricação de cerveja.Mas, graças a essa explosão, também percebemos que o processo de desenvolver produtos e introduzi-los no mercado é muito difícil. E não levou tanto tempo até começarmos a ver estes tipos de artigo aparecendo em todos os lugares:
https://www.wired.com/story/artificial-intelligence-confronts-reproducibility-crisis/
Hutson M., revista Science, fevereiro de 2018, vol. 359 pp. 725
Um resultado é reproduzível quando as mesmas etapas de análise executadas no mesmo conjunto de dados produzem consistentemente a mesma resposta.O Machine Learning reproduzível pode evitar erros e custos significativos no futuro. Além disso, ele facilita as tarefas de rastrear e explicar os insights/previsões gerados.
Além disso, trabalhar de maneira reproduzível facilita os processos de colaboração e revisão, garante a continuidade do seu trabalho e mantém o conhecimento institucional e as provas futuras de seu trabalho. Isso é extremamente importante porque, na maioria das vezes, não trabalhamos sozinhos, mas com um grupo de cientistas de dados, engenheiros de software e muitos outros stakeholders.
A verdade é que a reprodutibilidade em Machine Learning é um problema que todos os praticantes enfrentam diariamente.
Você já se fez uma das perguntas a seguir?
Foto de autoria de Paolo Nicolello no Unsplash
Acredite, todos passamos por isso.
Portanto, sem mais delongas, vamos nos aprofundar em como tornar seus fluxos de trabalho mais reproduzíveis.
A base dos fluxos de trabalho reproduzíveis está na capacidade de rastrear e reproduzir os seus dados, o ambiente computacional e o código.Portanto, você observará que a maioria das recomendações aqui é relacionada a esses três ativos críticos:
Não vou me aprofundar muito sobre isso (pois isso merece uma postagem exclusiva). Mas, idealmente, você deseja tornar todo o seu trabalho reproduzível em três níveis:
Todos nós sabemos o quanto dados de boa qualidade são vitais para um aprendizado de máquina confiável e de boa qualidade. Portanto, sempre devemos saber o que estamos esperando de nossos dados, em todos os momentos: quais tipos, distribuições, intervalos e esquemas.
Uma das minhas ferramentas favoritas para fazer isso é a Great Expectations, pois ela se integra a outras ferramentas que uso como Spark, Airflow, Jupyter Notebooks e pandas (entre outras). Ela é uma excelente ferramenta para validação, teste e documentação de dados.
Por exemplo, se você tiver uma fonte de dados brutos na qual faça alguma manipulação antes de armazená-la em um banco de dados, poderá adicionar várias etapas de validação para os dados de entrada e de saída.
Se você estiver coletando dados de APIs de terceiros, poderá usar o esquema JSON para validar os dados com base no metaesquema.
A melhor maneira de manter o controle de todas as suas saídas, entradas, métricas, modelos e dados mesmo antes de usar ferramentas especiais é a capacidade de controlar cada tarefa que você está executando.
Muitas ferramentas permitem que você crie pipelines robustos. Muitos deles giram em torno do conceito de grafos direcionados acíclicos. Alguns dos meus favoritos são:
Isso adiciona muito mais complexidade:
No entanto, se você decidir implementar seus pipelines, mantenha esta regra geral em mente:
✨ Dica especial: divida suas tarefas em unidades atômicas de trabalho. Nelas, cada nó de seu DAG ou cada etapa em seu pipeline realiza uma única tarefa.
Isso ajuda a evitar o problema de “alterar qualquer coisa equivale a alterar tudo” (Scully et al).
Há aleatoriedade em tudo:
O conselho sensato que você encontrará em qualquer lugar é sempre definir e salvar sua semente.
A solução: corrigir as divisões de treinamento e validação antes do treinamento. Se você usar métodos como test_split_train
do scikit-learn, precisará também especificar o argumento seed
.
Encontrar os hiperparâmetros corretos para seus modelos pode ser um processo bastante complexo. Eles podem ser particularmente problemáticos quando você está executando vários experimentos com diferentes arquiteturas de rede.
✨ Dica especial: como regra prática, não mantenha o controle apenas dos parâmetros, mas também das métricas de saída de cada modelo associado e da sua linha de base/processo de seleção.
Um exemplo excelente de como controlar seus hiperparâmetros de maneira confortável pode ser encontrado no exemplo de ajuste de hiperparâmetros distribuídos do Pachyderm.
O uso de pipelines para dividir, treinar, testar e selecionar os modelos e hiperparâmetros facilita muito o controle das saídas em todos os estágios, bem como a geração de relatórios sobre a lógica por trás do porquê de você escolher hiperparâmetros específicos.
Com que frequência você trabalhou em trechos de código que tinham linhas como esta:
import pandas as pd
df = pd.read_csv("../../../data.csv")
Nesse cenário, os dados e o código estão estreitamente ligados. Para garantir a reprodutibilidade, convém que você mantenha o controle do seu código e de suas versões de dados. Isso deve ser feito não apenas para as saídas finais, mas também para os resultados intermediários.
Imagine que você tenha um fluxo de trabalho como este:
Embora esse seja um pipeline um pouco simplificado, ainda há várias saídas que você deseja controlar (dados, código e arquivos serializados).
Uma excelente ferramenta para isso é o dvc, que permite manter o controle de todos os seus ativos com o Git sem armazenar seus dados no Git.Isso permite que você desacople dados, código e as respectivas versões para garantir a reprodutibilidade:
O teste no Machine Learning pode ser bastante complexo. Mais uma vez, não vou me aprofundar muito sobre isso porque essas estratégias de teste merecem uma postagem própria. Aqui está uma lista de verificação de estratégias de teste e itens cuja testagem você precisa considerar:
✨ Dica especial: um pacote que eu uso com muita frequência é o Hypothesis para testes baseados em propriedades. Ele não apenas simplificou as estratégias de teste, mas também aumentou minha confiança nos testes.
Há extensões para o Hypothesis que vale a pena verificar: https://hypothesis.readthedocs.io/en/latest/strategies.html.
Para que uma parte do trabalho seja reproduzível, o ambiente computacional em que ele foi conduzido deve ser capturado para que outras pessoas possam replicá-lo.
Muitas ferramentas permitem que você crie ambientes reproduzíveis ou pelo menos que chegue perto disso.
Dependendo dos projetos nos quais estou trabalhando, tenho a tendência de misturar algumas destas ferramentas:
E ainda sou fã do Make, pois ele é fantástico.
✨ Dicas especiais:
Muitos erros podem ser introduzidos quando dependemos muito do humano no processo para nossos fluxos de trabalho.Assim, sempre que for possível automatizar as coisas, isso não apenas economizará tempo, mas otimizará seus fluxos de trabalho e aumentará sua confiança.
Algumas ótimas ferramentas que uso para a automação são:
✨ Dica especial: comece a automatizar as partes mais importantes (implantação, criação de contêiner, teste) e parta daí.
Com a infinidade de ferramentas e fluxos de trabalho que existem, não há uma solução universal para o problema de reprodutibilidade.
Mas o que descobri é que a consistência é fundamental. Aqui estão minhas últimas ✨ dicas especiais:
Isso é tudo! Essas são algumas dicas práticas para ajudar você a começar a usar aprendizado de máquina reproduzível.
Você tem alguma outra dica que eu deixei de fora? Avise-me nos comentários.
Autora: Tania Allard