Na Parte 1, descrevemos os desafios dos processos de otimização lentos e caros e o novo workflow Black Box implementado pelo Vertex AI Vizier. Na Parte 2, explicamos por que o Black Box oferece mais controle e escalabilidade do que os serviços comuns de tuning de hiperparâmetros. Neste artigo de encerramento, vamos falar sobre formas de configurar o Vizier para acelerar sua convergência rumo ao melhor modelo possível.
Plain Vanilla vs. configurabilidade
A sua conversa com o Vizier funciona assim: a entrada são os parâmetros mais a métrica de um trial que você executou; a saída são os parâmetros sugeridos para o próximo trial. Mas o Vizier oferece mais flexibilidade quando você precisa. Ainda assim, recomendo cautela ao mexer nessas opções avançadas de configuração. O Vizier faz uma otimização aninhada: os próprios trials são otimizações, e o Vizier busca convergir para a melhor resposta ao longo dessas repetições, cada uma delas custosa. Se, em cima disso, você adicionar mais uma camada de aninhamento e rodar vários estudos do Vizier sobre o mesmo problema, ajustando a configuração opcional do Vizier a cada rodada, é provável que o custo dessas otimizações supere os benefícios.
Algoritmo de busca
Você pode escolher o algoritmo de busca do próprio Vizier enquanto ele percorre o espaço de parâmetros em busca do melhor conjunto. O primeiro é o grid search, que avança de forma regular pelo espaço de parâmetros, testando o máximo de opções possível dentro do número limitado de iterações. Depois vem o random search: basicamente saltar pelo espaço de parâmetros, o que pode funcionar surpreendentemente bem. Esses dois algoritmos parecem bem básicos, e dá para executá-los sem o Vizier — seja percorrendo cuidadosamente a faixa de hiperparâmetros, seja testando combinações aleatórias —, com o mesmo resultado. Mas, ao usar o Vizier, ele acompanha e gerencia esse processo. O Vizier é gratuito com grid ou random search.
Mais sofisticado é o Bayesian search, no qual o Vizier cria seu próprio modelo interno para chegar às melhores sugestões. (Veja o artigo de pesquisa para mais detalhes.) Em contraste com saltos aleatórios ou em passos predeterminados, espera-se que essa abordagem convirja muito mais rápido.
O Bayesian search é o padrão e o único pelo qual você é cobrado: custa um dólar por trial após os primeiros 100 trials por mês, que são gratuitos. Como o Vizier foi criado para minimizar a repetição de processos de otimização caros, esse preço é insignificante perto, por exemplo, de uma única iteração de treinamento de ML que pode custar US$ 20, ou de um teste A/B que pode custar milhares em receita potencialmente perdida. E, ao oferecer um serviço de hiperotimização em vez de uma biblioteca para você mesmo implantar, o Vizier economiza o seu tempo e o custo de montar a arquitetura.
Parada
Como mencionamos, o Vizier consegue aconselhar você sobre quando parar. No gráfico abaixo, a curva pontilhada verde primeiro melhora e depois começa a piorar, então faz sentido parar — e o Vizier consegue detectar isso. Já a curva pontilhada laranja está melhorando rapidamente e vale a pena continuar; as curvas sólidas ficam num meio-termo. Você pode configurar o algoritmo que o Vizier usa para essa decisão: dá para pedir que ele recomende interromper o estudo quando a iteração mais recente não for melhor que a mediana de todas as iterações anteriores, ou não for melhor que as últimas.
Figura 1. Sugestões de parada (com base no artigo de pesquisa. )
Escolhendo o conjunto ótimo de parâmetros
Quando o estudo termina, o Vizier informa qual conjunto de parâmetros foi o melhor — e você pode dizer ao Vizier como fazer essa escolha. Pode parecer óbvio escolher o trial que produziu as melhores métricas, e esse é o padrão. Mas, se você tem um processo com muito ruído (veja a imagem abaixo), o pico pode ser apenas fruto da aleatoriedade, um repique momentâneo, às vezes chamado de Winner's Curse. Se você sabe que tem esse tipo de ruído, mas a tendência geral é de alta, pode dizer ao Vizier para simplesmente escolher o último trial.
Figura 2. Winner's Curse: por que talvez não convenha pegar o melhor
Transfer learning
O Vizier consegue aproveitar de forma incremental o aprendizado já adquirido, criando um novo estudo que se apoia em um estudo anterior parecido. Imagine que você otimizou seu site com testes A/B, com a orientação do Vizier, mas, algumas semanas depois, sai uma nova versão com recursos importantes e você quer ajustá-los também. Com o resumePreviousJobId, você transfere o aprendizado de outro estudo. Isso pode gerar uma grande economia de tempo e dinheiro, já que você reaproveita o esforço de modelagem existente e roda muito menos daqueles trials lentos e caros sobre os quais o Vizier está aconselhando.
Hoje, esse recurso só é suportado na versão interna do Vizier que alimenta o tuner de hiperparâmetros do AI Platform, e não em nenhuma das APIs com a marca Vizier.
As APIs
O Vizier oferece várias APIs.
A API do Vertex AI Vizier (às vezes chamada de "GAPIC", em referência ao gerador de cliente Protocol Buffer usado) é centrada em uma classe Python chamada VizierServiceClient. É um produto Generally Available e a direção preferencial do Google daqui para frente. Por isso, é a API principal em que focar.
O Vizier também é exposto como outra API, retroportada para o antigo GCP AI Platform e hoje em beta. Essa API é baseada em discovery: você não vê nenhuma função implementada na biblioteca; em vez disso, chama funções definidas por meio de uma camada wrapper dinâmica. Não é tão difícil quanto parece: a documentação, a experimentação e os códigos de exemplo (incluindo o meu, abaixo) tornam o uso viável.
A outra implementação do Vizier, como mencionamos, é o projeto open source, caso você queira gerenciá-lo por conta própria ou apenas ler o código.
Walkthrough do código
Existem poucos exemplos de código por aí. Na verdade, a documentação oficial do Vizier traz apenas um notebook de ML para a API retroportada do AI Platform Vizier, e nenhum para a API preferencial do Vertex AI Vizier. Por isso, preparei este notebook. Ele é construído em torno de um processo normal de treinamento de ML executado internamente no container (embora, como sabemos, o Vizier independa da forma como esse treinamento é feito). Dá para acompanhá-lo pelos comentários numerados #[0], #[1] etc.
Além disso, Ryan Holbrook criou este notebook open source. Talvez você prefira usar esta variante que criei: ela mostra a saída de uma execução bem-sucedida e tem pequenos ajustes para facilitar rodar de ponta a ponta, sem configuração adicional.
Você talvez já tenha usado um serviço de tuning de hiperparâmetros no seu ML: o Vizier é isso e muito mais. Como o Vizier não sabe nada sobre o ML — nem mesmo que você está fazendo ML —, dá para usá-lo em qualquer processo de otimização lento e custoso. Como serviço, é robusto e escalável, e praticamente gratuito perto dos processos caros que ele busca minimizar. Ele te dá a liberdade de seguir as recomendações ou não e, em qualquer um dos casos, aponta o caminho rumo à convergência mais rápida para a resposta ótima.