Traduzido do Inglês para o Português - www.onlinedoctranslator.com O desejo de aprendizado de máquina é um projeto deeplearning.ai. © 2018 Andrew Ng. Todos os direitos reservados. Página 2 Rascunho de aprendizado de máquina André Ng Índice 1 Por que estratégia de aprendizado de máquina 2 Como usar este livro para ajudar sua equipe 3 Pré-requisitos e Notação 4 A escala impulsiona o progresso do aprendizado de máquina 5 Seus conjuntos de desenvolvimento e teste 6 Seus conjuntos de desenvolvimento e teste devem vir da mesma distribuição 7 Qual deve ser o tamanho dos conjuntos de desenvolvimento/teste? 8 Estabeleça uma métrica de avaliação de número único para sua equipe otimizar 9 Otimizando e satisfazendo métricas 10 Ter um conjunto de desenvolvimento e uma métrica acelera as iterações 11 Quando alterar conjuntos e métricas de desenvolvimento/teste 12 Conclusões: Configurando conjuntos de desenvolvimento e teste 13 Construa seu primeiro sistema rapidamente e depois repita 14 Análise de erros: veja exemplos de conjuntos de desenvolvedores para avaliar ideias 15 Avaliando múltiplas ideias em paralelo durante a análise de erros 16 Limpando exemplos de conjuntos de testes e desenvolvedores com rótulos incorretos 17 Se você tiver um conjunto de desenvolvimento grande, divida-o em dois subconjuntos, dos quais apenas um será examinado 18 Qual deve ser o tamanho dos conjuntos de desenvolvimento Eyeball e Blackbox? 19 Conclusões: análise básica de erros 20 Viés e Variância: As duas grandes fontes de erro 21 exemplos de preconceito e variação 22 Comparando com a taxa de erro ideal 23 Lidando com preconceitos e variações 24 Compensação entre polarização e variância 25 técnicas para reduzir preconceitos evitáveis Página 3 Rascunho de aprendizado de máquina André Ng 26 Análise de erros no conjunto de treinamento 27 Técnicas para reduzir a variância 28 Diagnosticando viés e variância: curvas de aprendizado 29 Plotando erro de treinamento 30 Interpretando curvas de aprendizagem: Alto viés 31 Interpretando curvas de aprendizagem: Outros casos 32 Traçando curvas de aprendizado 33 Por que comparamos o desempenho em nível humano 34 Como definir o desempenho em nível humano 35 Superando o desempenho de nível humano 36 Quando você deve treinar e testar em diferentes distribuições 37 Como decidir se deseja usar todos os seus dados 38 Como decidir se deve incluir dados inconsistentes 39 Dados de ponderação 40 Generalizando do conjunto de treinamento para o conjunto de desenvolvimento 41 Identificando Erros de Viés, Variância e Incompatibilidade de Dados 42 Resolvendo a incompatibilidade de dados 43 Síntese de dados artificiais 44 O teste de verificação de otimização 45 Forma geral de teste de verificação de otimização 46 Exemplo de aprendizagem por reforço 47 A ascensão da aprendizagem de ponta a ponta 48 Mais exemplos de aprendizagem ponta a ponta 49 Prós e contras da aprendizagem ponta a ponta 50 Escolhendo componentes de pipeline: Disponibilidade de dados 51 Escolhendo componentes do pipeline: simplicidade da tarefa Página 4 Rascunho de aprendizado de máquina André Ng 52 Aprendendo diretamente com resultados ricos 53 Análise de erros por peças 54 Atribuindo erro a uma parte 55 Caso geral de atribuição de erro 56 Análise de erros por partes e comparação com o desempenho em nível humano 57 Identificando um pipeline de ML falho 58 Construindo uma equipe de super-heróis - Faça com que seus companheiros leiam isto Página 5 Rascunho de aprendizado de máquina André Ng 1 Por que estratégia de aprendizado de máquina O aprendizado de máquina é a base de inúmeras aplicações importantes, incluindo pesquisa na web, antispam de e-mail, reconhecimento de fala, recomendações de produtos e muito mais. Presumo que você ou sua equipe estejam trabalhando em um aplicativo de aprendizado de máquina e que queiram progredir rapidamente. Este livro irá ajudá-lo a fazer isso. Exemplo: Construindo uma startup de imagem de gato Digamos que você esteja construindo uma startup que fornecerá um fluxo interminável de fotos de gatos para os amantes de gatos. Você usa uma rede neural para construir um sistema de visão computacional para detectar gatos em fotos. Mas, tragicamente, a precisão do seu algoritmo de aprendizagem ainda não é boa o suficiente. Você está sob uma pressão tremenda para melhorar seu detector de gatos. O que você faz? Sua equipe tem muitas ideias, como: • Obtenha mais dados: colete mais fotos de gatos. • Colete um conjunto de treinamento mais diversificado. Por exemplo, fotos de gatos em posições inusitadas; gatos com coloração incomum; fotos tiradas com diversas configurações de câmera; …. • Treine o algoritmo por mais tempo, executando mais iterações de gradiente descendente. • Experimente uma rede neural maior, com mais camadas/unidades/parâmetros ocultos. Página 6 Rascunho de aprendizado de máquina André Ng • Experimente uma rede neural menor. • Tente adicionar regularização (como regularização L2). • Alterar a arquitetura da rede neural (função de ativação, número de unidades ocultas, etc.) • … Se você escolher bem entre essas direções possíveis, você construirá a plataforma líder de imagens de gatos e levará sua empresa ao sucesso. Se você escolher mal, poderá perder meses. Como você procede? Este livro lhe dirá como. A maioria dos problemas de aprendizado de máquina deixa pistas que indicam o que é útil tentar e o que não é útil. Aprender a ler essas pistas economizará meses ou anos de desenvolvimento. Página 7 Rascunho de aprendizado de máquina André Ng 2 Como usar este livro para ajudar sua equipe Depois de terminar este livro, você terá um conhecimento profundo de como definir a direção técnica para um projeto de aprendizado de máquina. Mas seus colegas de equipe podem não entender por que você está recomendando uma direção específica. Talvez você queira que sua equipe defina uma métrica de avaliação de número único, mas eles não estão convencidos. Como você os convence? É por isso que reduzi os capítulos: para que você possa imprimi-los e fazer com que seus colegas de equipe leiam apenas uma ou duas páginas que você precisa que eles saibam. Algumas mudanças na priorização podem ter um efeito enorme na produtividade da sua equipe. Ao ajudar sua equipe com algumas dessas mudanças, espero que você possa se tornar o super-herói de sua equipe! Página 8 Rascunho de aprendizado de máquina André Ng 3 Pré-requisitos e Notação Se você fez um curso de aprendizado de máquina, como meu MOOC de aprendizado de máquina no Coursera, ou se tem experiência na aplicação de aprendizado supervisionado, você será capaz de entender este texto. Presumo que você esteja familiarizado comaprendizagem supervisionada: aprendendo uma função que mapeia de x para y, usando exemplos de treinamento rotulados (x,y). Algoritmos de aprendizagem supervisionada incluem regressão linear, regressão logística e redes neurais. Existem muitas formas de aprendizado de máquina, mas a maior parte do valor prático do aprendizado de máquina hoje vem do aprendizado supervisionado. Frequentemente me referirei às redes neurais (também conhecidas como “aprendizado profundo”). Você só precisará de um conhecimento básico do que são para seguir este texto. Se você não está familiarizado com os conceitos mencionados aqui, assista aos vídeos das três primeiras semanas do curso de Machine Learning no Coursera emhttp://ml-class.org Página 9 Rascunho de aprendizado de máquina André Ng 4 A escala impulsiona o progresso do aprendizado de máquina Muitas das ideias de aprendizagem profunda (redes neurais) existem há décadas. Por que essas ideias estão decolando agora? Dois dos maiores impulsionadores do progresso recente foram: • Disponibilidade de dados. As pessoas agora passam mais tempo em dispositivos digitais (laptops, dispositivos móveis). Suas atividades digitais geram enormes quantidades de dados que podemos alimentar em nossos algoritmos de aprendizagem. • Escala computacional. Começamos há apenas alguns anos para sermos capazes de treinar redes neurais grandes o suficiente para aproveitar as vantagens dos enormes conjuntos de dados que temos agora. Em detalhes, mesmo quando você acumula mais dados, geralmente o desempenho de algoritmos de aprendizagem mais antigos, como a regressão logística, “platôs”. Isso significa que sua curva de aprendizado “se achata” e o algoritmo para de melhorar mesmo quando você fornece mais dados: Era como se os algoritmos mais antigos não soubessem o que fazer com todos os dados que temos agora. Se você treinar uma pequena rede neutra (NN) na mesma tarefa de aprendizagem supervisionada, poderá obter um desempenho um pouco melhor: Página 10 Rascunho de aprendizado de máquina André Ng Aqui, por “NN pequeno” queremos dizer uma rede neural com apenas um pequeno número de unidades/ camadas/parâmetros ocultos. Finalmente, se você treinar redes neurais cada vez maiores, poderá obter um desempenho ainda melhor:1 Assim, você obtém o melhor desempenho quando (i) treina uma rede neural muito grande, de forma que fique na curva verde acima; (ii) Possui uma grande quantidade de dados. Muitos outros detalhes, como a arquitetura da rede neural, também são importantes e tem havido muita inovação aqui. Mas uma das maneiras mais confiáveis de melhorar o desempenho de um algoritmo hoje ainda é (i) treinar uma rede maior e (ii) obter mais dados. Este diagrama mostra o desempenho das NNs melhor no regime de pequenos conjuntos de dados. Este efeito é menos 1 consistente do que o efeito do bom desempenho das NNs no regime de grandes conjuntos de dados. No regime de pequenos dados, dependendo de como os recursos são projetados manualmente, os algoritmos tradicionais podem ou não ter um desempenho melhor. Por exemplo, se você tiver 20 exemplos de treinamento, pode não importar muito se você usa regressão logística ou uma rede neural; a engenharia manual dos recursos terá um efeito maior do que a escolha do algoritmo. Mas se você tiver 1 milhão de exemplos, eu preferiria a rede neural. Página 11 Rascunho de aprendizado de máquina André Ng O processo de como realizar (i) e (ii) é surpreendentemente complexo. Este livro discutirá detalhadamente os detalhes. Começaremos com estratégias gerais que são úteis tanto para algoritmos de aprendizagem tradicionais quanto para redes neurais, e desenvolveremos as estratégias mais modernas para a construção de sistemas de aprendizagem profunda. Página 12 Rascunho de aprendizado de máquina André Ng Configurando Desenvolvimento e conjuntos de teste Página 13 Rascunho de aprendizado de máquina André Ng 5 Seus conjuntos de desenvolvimento e teste Voltemos ao nosso exemplo anterior de fotos de gatos: você executa um aplicativo móvel e os usuários estão enviando fotos de muitas coisas diferentes para seu aplicativo. Você deseja encontrar automaticamente as fotos dos gatos. Sua equipe recebe um grande conjunto de treinamento baixando fotos de gatos (exemplos positivos) e de não gatos (exemplos negativos) de diferentes sites. Eles dividiram o conjunto de dados 70%/30% em conjuntos de treinamento e teste. Usando esses dados, eles constroem um detector de gatos que funciona bem nos conjuntos de treinamento e teste. Mas quando você implanta esse classificador no aplicativo móvel, descobre que o desempenho é muito ruim! O que aconteceu? Você descobre que as fotos que os usuários estão enviando têm uma aparência diferente das imagens do site que compõem seu conjunto de treinamento: os usuários estão enviando fotos tiradas com telefones celulares, que tendem a ter resolução mais baixa, mais desfocadas e com pouca iluminação. Como seus conjuntos de treinamento/teste foram feitos de imagens de sites, seu algoritmo não generalizou bem para a distribuição real de seu interesse: imagens de telefones celulares. Antes da era moderna do big data, era uma regra comum no aprendizado de máquina usar uma divisão aleatória de 70%/30% para formar seus conjuntos de treinamento e teste. Esta prática pode funcionar, mas é uma má ideia em cada vez mais aplicações onde a distribuição de treinamento (imagens de sites em Página 14 Rascunho de aprendizado de máquina André Ng nosso exemplo acima) é diferente da distribuição que lhe interessa (imagens de telefones celulares). Geralmente definimos: • Conjunto de treinamento -No qual você executa seu algoritmo de aprendizagem. • Conjunto de desenvolvimento (desenvolvimento) -Que você usa para ajustar parâmetros, selecionar recursos e tomar outras decisões em relação ao algoritmo de aprendizagem. Às vezes também chamado de conjunto de validação cruzada hold-out. • Conjunto de testes-que você usa para avaliar o desempenho do algoritmo, mas não para tomar qualquer decisão sobre qual algoritmo ou parâmetros de aprendizagem usar. Depois de definir um conjunto de desenvolvimento (conjunto de desenvolvimento) e um conjunto de testes, sua equipe tentará várias ideias, como diferentes parâmetros de algoritmo de aprendizagem, para ver o que funciona melhor. Os conjuntos de desenvolvimento e teste permitem que sua equipe veja rapidamente o desempenho do seu algoritmo. Em outras palavras,o objetivo dos conjuntos de desenvolvimento e teste é direcionar sua equipe para as mudanças mais importantes a serem feitas no sistema de aprendizado de máquina. Então, você deve fazer o seguinte: Escolha conjuntos de desenvolvimento e teste para refletir os dados que você espera obter no futuro e deseja ter um bom desempenho. Em outras palavras, seu conjunto de teste não deve ser simplesmente 30% dos dados disponíveis, especialmente se você espera que seus dados futuros (imagens de telefones celulares) sejam de natureza diferente de seu conjunto de treinamento (imagens de sites). Se você ainda não lançou seu aplicativo móvel, talvez ainda não tenha nenhum usuário e, portanto, não consiga obter dados que reflitam com precisão o que você precisa fazer no futuro. Mas você ainda pode tentar aproximar isso. Por exemplo, peça a seus amigos para tirar fotos de gatos no celular e enviá-las para você. Depois que seu aplicativo for iniciado, você poderá atualizar seus conjuntos de desenvolvimento/teste usando dados reais do usuário. Se você realmente não tem como obter dados que se aproximem do que espera obter no futuro, talvez possa começar usando imagens de sites. Mas você deve estar ciente do risco de isso levar a um sistema que não generaliza bem. É necessário julgamento para decidir quanto investir no desenvolvimento de ótimos conjuntos de desenvolvimento e teste. Mas não presuma que sua distribuição de treinamento é igual à distribuição de testes. Tente escolher o teste Página 15 Rascunho de aprendizado de máquina André Ng exemplos que refletem aquilo em que você deseja ter um bom desempenho, em vez de quaisquer dados que você tenha para treinamento. Página 16 Rascunho de aprendizado de máquina André Ng 6 Seus conjuntos de desenvolvimento e teste devem vir da mesma distribuição Você tem os dados de imagem do seu aplicativo de gato segmentados em quatro regiões, com base em seus maiores mercados: (i) EUA, (ii) China, (iii) Índia e (iv) Outros. Para criar um conjunto de desenvolvimento e um conjunto de teste, digamos que colocamos os EUA e a Índia no conjunto de desenvolvimento; China e Outros no conjunto de testes. Em outras palavras, podemos atribuir aleatoriamente dois desses segmentos ao conjunto de desenvolvimento e os outros dois ao conjunto de teste, certo? Depois de definir os conjuntos de desenvolvimento e teste, sua equipe se concentrará em melhorar o desempenho do conjunto de desenvolvimento. Assim, o conjunto de desenvolvedores deve refletir a tarefa que você mais deseja melhorar: ter um bom desempenho em todas as quatro geografias, e não apenas em duas. Há um segundo problema em ter diferentes distribuições de conjuntos de desenvolvimento e de teste: há uma chance de que sua equipe construa algo que funcione bem no conjunto de desenvolvimento, apenas para descobrir que o desempenho é ruim no conjunto de teste. Já vi esse resultado em muita frustração e esforço desperdiçado. Evite deixar isso acontecer com você. Por exemplo, suponha que sua equipe desenvolva um sistema que funcione bem no conjunto de desenvolvimento, mas não no conjunto de testes. Se seus conjuntos de desenvolvimento e teste tivessem vindo da mesma distribuição, você teria um diagnóstico muito claro do que deu errado: você ajustou demais o conjunto de desenvolvimento. A cura óbvia é obter mais dados do conjunto de desenvolvedores. Mas se os conjuntos de desenvolvimento e teste vierem de distribuições diferentes, suas opções serão menos claras. Várias coisas poderiam ter dado errado: 1.Você se ajustou demais ao conjunto de desenvolvedores. 2.O conjunto de teste é mais difícil que o conjunto de desenvolvimento. Portanto, seu algoritmo pode estar funcionando tão bem quanto o esperado e nenhuma melhoria significativa é possível. Página 17 Rascunho de aprendizado de máquina André Ng 3.O conjunto de testes não é necessariamente mais difícil, mas apenas diferente do conjunto de desenvolvimento. Então, o que funciona bem no conjunto de desenvolvimento simplesmente não funciona bem no conjunto de teste. Nesse caso, muito do seu trabalho para melhorar o desempenho do conjunto de desenvolvedores pode ser um esforço desperdiçado. Trabalhar em aplicativos de aprendizado de máquina já é bastante difícil. Ter conjuntos de desenvolvimento e testes incompatíveis introduz incerteza adicional sobre se a melhoria na distribuição do conjunto de desenvolvimento também melhora o desempenho do conjunto de testes. Ter conjuntos de desenvolvimento e teste incompatíveis torna mais difícil descobrir o que está ou não funcionando e, portanto, torna mais difícil priorizar o que trabalhar. Se você estiver trabalhando em um problema de benchmark de terceiros, o criador deles pode ter especificado conjuntos de desenvolvimento e teste provenientes de distribuições diferentes. A sorte, e não a habilidade, terá um impacto maior no seu desempenho nesses benchmarks em comparação com se os conjuntos de desenvolvimento e teste vierem da mesma distribuição. É um importante problema de pesquisa desenvolver algoritmos de aprendizagem que sejam treinados em uma distribuição e generalizem bem para outra. Mas se o seu objetivo é progredir em um aplicativo específico de aprendizado de máquina, em vez de progredir na pesquisa, recomendo tentar escolher conjuntos de desenvolvimento e teste extraídos da mesma distribuição. Isso tornará sua equipe mais eficiente. Página 18 Rascunho de aprendizado de máquina André Ng 7 Qual deve ser o tamanho dos conjuntos de desenvolvimento/teste? O conjunto de desenvolvimento deve ser grande o suficiente para detectar diferenças entre os algoritmos que você está testando. Por exemplo, se o classificador A tiver uma precisão de 90,0% e o classificador B tiver uma precisão de 90,1%, então um conjunto de desenvolvimento de 100 exemplos não seria capaz de detectar essa diferença de 0,1%. Comparado a outros problemas de aprendizado de máquina que vi, um conjunto de desenvolvedores de 100 exemplos é pequeno. Conjuntos de desenvolvimento com tamanhos de 1.000 a 10.000 exemplos são comuns. Com 10.000 exemplos, você terá boas chances de detectar uma melhoria de 0,1%.2 Para aplicações maduras e importantes – por exemplo, publicidade, pesquisa na web e recomendações de produtos – também tenho visto equipes altamente motivadas para obter uma melhoria de até 0,01%, uma vez que isso tem um impacto direto nos lucros da empresa. Neste caso, o conjunto de desenvolvimento poderia ser muito maior que 10.000, para detectar melhorias ainda menores. E quanto ao tamanho do conjunto de teste? Deve ser grande o suficiente para proporcionar alta confiança no desempenho geral do seu sistema. Uma heurística popular era usar 30% dos seus dados para o conjunto de testes. Isso funciona bem quando você tem um número modesto de exemplos – digamos, 100 a 10.000 exemplos. Mas na era do big data, onde agora temos problemas de aprendizado de máquina com, às vezes, mais de um bilhão de exemplos, a fração de dados alocados para conjuntos de desenvolvimento/teste tem diminuído, mesmo que o número absoluto de exemplos nos conjuntos de desenvolvimento/teste tenha diminuído. vem crescendo. Não há necessidade de ter conjuntos de desenvolvimento/teste excessivamente grandes além do necessário para avaliar o desempenho de seus algoritmos. Em teoria, também se poderia testar se uma alteração em um algoritmo faz uma diferença estatisticamente significativa no conjunto de 2 desenvolvimento. Na prática, a maioria das equipes não se preocupa com isso (a menos que estejam publicando trabalhos de pesquisa acadêmica), e geralmente não considero os testes de significância estatística úteis para medir o progresso intermediário. Página 19 Rascunho de aprendizado de máquina André Ng 8 Estabeleça uma métrica de avaliação de número único para sua equipe otimizar A precisão da classificação é um exemplo demétrica de avaliação de número único: você executa seu classificador no conjunto de desenvolvimento (ou conjunto de teste) e recebe de volta um único número sobre qual fração de exemplos ele classificou corretamente. De acordo com essa métrica, se o classificador A obtiver 97% de precisão e o classificador B obtiver 90% de precisão, então consideramos o classificador A superior. Em contraste, Precisão e Recall3não é uma métrica de avaliação de número único: fornece dois números para avaliar seu classificador. Ter métricas de avaliação de vários números torna mais difícil comparar algoritmos. Suponha que seus algoritmos tenham o seguinte desempenho: Precisão Classificador Lembrar A 95% 90% B 98% 85% Aqui, nenhum dos classificadores é obviamente superior, portanto não o orienta imediatamente na escolha de um. Classificador A Precisão 95% Lembrar Pontuação F1 90% 92,4% Durante o desenvolvimento, sua equipe testará muitas ideias sobre arquitetura de algoritmo, parâmetros de modelo, escolha de recursos, etc.métrica de avaliação de número únicocomo a precisão, permite classificar todos os seus modelos de acordo com seu desempenho nessa métrica e decidir rapidamente o que funciona melhor. Se você realmente se preocupa com precisão e recall, recomendo usar uma das formas padrão de combiná-los em um único número. Por exemplo, pode-se calcular a média de precisão e recall para obter um único número. Alternativamente, você pode calcular o “F1 A precisão de um classificador de gato é a fração de imagens no conjunto de desenvolvimento (ou teste) rotuladas como gatos que 3 realmente são gatos. Sua recuperação é a porcentagem de todas as imagens de gatos no conjunto de desenvolvimento (ou teste) que foram corretamente rotuladas como gatos. Freqüentemente, há uma compensação entre alta precisão e alto recall. Página 20 Rascunho de aprendizado de máquina André Ng pontuação”, que é uma forma modificada de calcular a média e funciona melhor do que simplesmente calcular a média.4 Classificador Precisão Lembrar Pontuação F1 A 95% 90% 92,4% B 98% 85% 91,0% Ter uma métrica de avaliação de número único acelera sua capacidade de tomar uma decisão ao selecionar entre um grande número de classificadores. Dá uma classificação clara de preferência entre todos eles e, portanto, uma direção clara para o progresso. Como exemplo final, suponha que você esteja monitorando separadamente a precisão do seu classificador de gatos em quatro mercados principais: (i) EUA, (ii) China, (iii) Índia e (iv) Outros. Isso fornece quatro métricas. Ao calcular uma média ou média ponderada desses quatro números, você obtém uma única métrica numérica. Calcular uma média ou média ponderada é uma das maneiras mais comuns de combinar várias métricas em uma. Se você quiser saber mais sobre a pontuação da F1, consulte https://en.wikipedia.org/wiki/F1_score . 4 É a “média harmônica” entre Precisão e Recall e é calculada como 2/((1/Precisão)+(1/Recall)). Página 21 Rascunho de aprendizado de máquina André Ng 9 Otimizando e satisfazendo métricas Esta é outra maneira de combinar múltiplas métricas de avaliação. Suponha que você se preocupe tanto com a precisão quanto com o tempo de execução de um algoritmo de aprendizagem. Você precisa escolher entre estes três classificadores: Classificador Precisão Tempo de execução A 90% 80ms B 92% 95ms C 95% 1.500ms Não parece natural derivar uma única métrica colocando a precisão e o tempo de execução em uma única fórmula, como: Precisão - 0,5*Tempo de execução Aqui está o que você pode fazer: Primeiro, defina o que é um tempo de execução “aceitável”. Digamos que qualquer coisa que rode em 100ms seja aceitável. Em seguida, maximize a precisão, desde que seu classificador atenda aos critérios de tempo de execução. Aqui, o tempo de execução é uma “métrica satisfatória” – seu classificador só precisa ser “bom o suficiente” nessa métrica, no sentido de que deve levar no máximo 100 ms. A precisão é a “métrica de otimização”. Se você estiver negociando N critérios diferentes, como tamanho do arquivo binário do modelo (o que é importante para aplicativos móveis, já que os usuários não desejam baixar aplicativos grandes), tempo de execução e precisão, considere definir N-1 dos critérios como métricas “satisfatórias”. Ou seja, você simplesmente exige que eles atendam a um determinado valor. Em seguida, defina a última como a métrica de “otimização”. Por exemplo, defina um limite para o que é aceitável para o tamanho do arquivo binário e o tempo de execução e tente otimizar a precisão dadas essas restrições. Como exemplo final, suponha que você esteja construindo um dispositivo de hardware que usa um microfone para ouvir o usuário dizendo uma determinada “palavra de ativação”, que então faz com que o sistema seja ativado. Os exemplos incluem Amazon Echo ouvindo “Alexa”; Apple Siri ouvindo “Ei Siri”; Android ouvindo “Ok Google”; e aplicativos Baidu ouvindo “Hello Baidu”. Você se preocupa tanto com a taxa de falsos positivos – a frequência com que o sistema acorda mesmo quando ninguém disse a palavra de ativação – quanto com a taxa de falsos negativos – com que frequência ele não acorda quando alguém diz a palavra de ativação. Um objetivo razoável para o desempenho deste sistema é Página 22 Rascunho de aprendizado de máquina André Ng minimizar a taxa de falsos negativos (métrica de otimização), desde que não haja mais do que um falso positivo a cada 24 horas de operação (métrica de satisfação). Assim que sua equipe estiver alinhada com a métrica de avaliação para otimizar, eles poderão progredir mais rapidamente. Página 23 Rascunho de aprendizado de máquina André Ng 10 Ter um conjunto de desenvolvimento e uma métrica acelera as iterações É muito difícil saber antecipadamente qual abordagem funcionará melhor para um novo problema. Mesmo pesquisadores experientes em aprendizado de máquina geralmente experimentam dezenas de ideias antes de descobrirem algo satisfatório. Ao construir um sistema de aprendizado de máquina, frequentemente: 1.Comece com algunsideiasobre como construir o sistema. 2.Implemente a ideia emcódigo. 3.Realize umexperimentaro que me diz o quão bem a ideia funcionou. (Normalmente, minhas primeiras ideias não funcionam!) Com base nesses aprendizados, volte para gerar mais ideias e continue iterando. Este é um processo iterativo. Quanto mais rápido você contornar esse ciclo, mais rápido progredirá. É por isso que ter conjuntos de desenvolvimento/teste e uma métrica é importante: cada vez que você tenta uma ideia, medir o desempenho dela no conjunto de desenvolvimento permite que você decida rapidamente se está indo na direção certa. Por outro lado, suponha que você não tenha um conjunto de desenvolvimento e uma métrica específicos. Portanto, cada vez que sua equipe desenvolve um novo classificador de gatos, você precisa incorporá-lo ao seu aplicativo e brincar com o aplicativo por algumas horas para ter uma ideia se o novo classificador é uma melhoria. Isso seria incrivelmente lento! Além disso, se sua equipe melhorar a precisão do classificador de 95,0% para 95,1%, talvez você não consiga detectar essa melhoria de 0,1% ao brincar com o aplicativo. No entanto, muito progresso no seu sistema será feito acumulando gradualmente dezenas dessas melhorias de 0,1%. Ter um conjunto de desenvolvimento e uma métrica permite detectar rapidamente quais ideias estão proporcionando pequenas (ou grandes) melhorias com sucesso e, portanto, permite que você decida rapidamente quais ideias continuar refinando e quais descartar. Página 24 Rascunho de aprendizado de máquina André Ng 11 Quando alterar conjuntos e métricas de desenvolvimento/teste Ao iniciar um novo projeto, tento escolher rapidamente conjuntos de desenvolvimento/teste, pois isso dá à equipe um objetivo bem definido. Normalmente peço às minhas equipes que criem um conjunto inicial de desenvolvimento/teste e uma métrica inicial em menos de uma semana – raramente mais. É melhor inventar algo imperfeito e agir rapidamente, em vez de pensar demais. Mas este cronograma de uma semana não se aplica a inscrições maduras. Por exemplo, o antispam é um aplicativo maduro de aprendizado profundo. Já vi equipes trabalhando em sistemas já maduros gastarem meses para adquirir conjuntos de desenvolvimento/teste ainda melhores. Se mais tarde você perceber que seu conjunto ou métrica inicial de desenvolvimento/teste errou o alvo, altere-os rapidamente. Por exemplo, se o seu conjunto de desenvolvimento + métrica classifica o classificador A acima do classificador B, mas sua equipe acha que o classificador B é realmente superior para o seu produto, então isso pode ser um sinal de que você precisa alterar seus conjuntos de desenvolvimento/teste ou sua métrica de avaliação . Existem três causas principais possíveis para o conjunto de desenvolvimento/métrica classificar incorretamente o classificador A superior: 1. A distribuição real na qual você precisa ter um bom desempenho é diferente dos conjuntos de desenvolvimento/teste. Suponha que seu conjunto inicial de desenvolvimento/teste tivesse principalmente fotos de gatos adultos. Você envia seu aplicativo para gatos e descobre que os usuários estão enviando muito mais imagens de gatinhos do que o esperado. Portanto, a distribuição do conjunto de desenvolvimento/teste não é representativa da distribuição real na qual você precisa se sair bem. Nesse caso, atualize seus conjuntos de desenvolvimento/teste para serem mais representativos. Página 25 Rascunho de aprendizado de máquina André Ng 2. Você se ajustou demais ao conjunto de desenvolvimento. O processo de avaliação repetida de ideias no conjunto de desenvolvimento faz com que seu algoritmo gradualmente se “ajuste demais” ao conjunto de desenvolvimento. Quando terminar de desenvolver, você avaliará seu sistema no conjunto de testes. Se você achar que o desempenho do seu conjunto de desenvolvimento é muito melhor do que o desempenho do conjunto de testes, é um sinal de que você se ajustou demais ao conjunto de desenvolvimento. Nesse caso, obtenha um novo conjunto de desenvolvimento. Se precisar acompanhar o progresso da sua equipe, você também pode avaliar seu sistema regularmente – digamos, uma vez por semana ou uma vez por mês – no conjunto de testes. Mas não use o conjunto de testes para tomar qualquer decisão em relação ao algoritmo, inclusive se deve reverter para o sistema da semana anterior. Se você fizer isso, você começará a se ajustar demais ao conjunto de testes e não poderá mais contar com isso para fornecer uma estimativa completamente imparcial do desempenho do seu sistema (o que seria necessário se você estivesse publicando artigos de pesquisa ou talvez usando esta métrica para tomar decisões de negócios importantes). 3. A métrica mede algo diferente do que o projeto precisa otimizar. Suponha que, para seu aplicativo cat, sua métrica seja a precisão da classificação. Essa métrica atualmente classifica o classificador A como superior ao classificador B. Mas suponha que você experimente os dois algoritmos e descubra que o classificador A está permitindo a passagem de imagens pornográficas ocasionais. Embora o classificador A seja mais preciso, a má impressão deixada por uma imagem pornográfica ocasional significa que seu desempenho é inaceitável. O que você faz? Aqui, a métrica não consegue identificar o fato de que o Algoritmo B é de fato melhor que o Algoritmo A para o seu produto. Portanto, você não pode mais confiar na métrica para escolher o melhor algoritmo. É hora de mudar as métricas de avaliação. Por exemplo, você pode alterar a métrica para penalizar fortemente a transmissão de imagens pornográficas. Eu recomendaria fortemente escolher uma nova métrica e usá-la para definir explicitamente uma nova meta para a equipe, em vez de prosseguir por muito tempo sem uma métrica confiável e voltar a escolher manualmente entre os classificadores. É bastante comum alterar conjuntos de desenvolvimento/teste ou métricas de avaliação durante um projeto. Ter um conjunto inicial de desenvolvimento/teste e uma métrica ajuda você a iterar rapidamente. Se você descobrir que os conjuntos ou métricas de desenvolvimento/teste não estão mais apontando a direção certa para sua equipe, não é grande coisa! Basta alterá-los e garantir que sua equipe conheça a nova direção. Página 26 Rascunho de aprendizado de máquina André Ng 12 Conclusões: Configurando conjuntos de desenvolvimento e teste • Escolha conjuntos de desenvolvimento e teste de uma distribuição que reflita quais dados você espera obter no futuro e deseja ter um bom desempenho. Isso pode não ser igual à distribuição dos seus dados de treinamento. • Escolha conjuntos de desenvolvimento e teste da mesma distribuição, se possível. • Escolha uma métrica de avaliação de número único para sua equipe otimizar. Se houver vários objetivos importantes para você, considere combiná-los em uma única fórmula (como calcular a média de várias métricas de erro) ou definir métricas de satisfação e otimização. • O aprendizado de máquina é um processo altamente iterativo: você pode tentar dezenas de ideias antes de encontrar uma que lhe satisfaça. • Ter conjuntos de desenvolvimento/teste e uma métrica de avaliação de número único ajuda a avaliar algoritmos rapidamente e, portanto, a iterar com mais rapidez. • Ao iniciar um novo aplicativo, tente estabelecer conjuntos de desenvolvimento/teste e uma métrica rapidamente, digamos, em menos de uma semana. Pode ser normal demorar mais em aplicativos maduros. • A antiga heurística de uma divisão de treinamento/teste de 70%/30% não se aplica a problemas onde você tem muitos dados; os conjuntos de desenvolvimento e teste podem representar muito menos que 30% dos dados. • Seu conjunto de desenvolvimento deve ser grande o suficiente para detectar mudanças significativas na precisão do seu algoritmo, mas não necessariamente muito maior. Seu conjunto de testes deve ser grande o suficiente para fornecer uma estimativa confiável do desempenho final do seu sistema. • Se seu conjunto de desenvolvimento e métrica não estão mais apontando a direção certa para sua equipe, altere-os rapidamente: (i) Se você ajustou demais o conjunto de desenvolvimento, obtenha mais dados do conjunto de desenvolvimento. (ii) Se a distribuição real de seu interesse for diferente da distribuição do conjunto de desenvolvimento/teste, obtenha novos dados do conjunto de desenvolvimento/teste. (iii) Se sua métrica não mede mais o que é mais importante para você, mude a métrica. Página 27 Rascunho de aprendizado de máquina André Ng Erro Básico Análise Página 28 Rascunho de aprendizado de máquina André Ng 13 Construa seu primeiro sistema rapidamente e depois repita Você deseja construir um novo sistema anti-spam de e-mail. Sua equipe tem várias ideias: • Colete um enorme conjunto de treinamento de e-mails de spam. Por exemplo, configure um “honeypot”: envie deliberadamente endereços de e-mail falsos para spammers conhecidos, para que você possa coletar automaticamente as mensagens de spam que eles enviam para esses endereços. • Desenvolva recursos para compreender o conteúdo do texto do e-mail. • Desenvolva recursos para entender os recursos do envelope/cabeçalho do e-mail para mostrar por qual conjunto de servidores da Internet a mensagem passou. • e mais. Embora eu tenha trabalhado extensivamente com anti-spam, ainda teria dificuldade em escolher uma dessas direções. É ainda mais difícil se você não for um especialista na área de aplicação. Portanto, não comece tentando projetar e construir o sistema perfeito. Em vez disso, crie e treine um sistema básico rapidamente – talvez em apenas alguns dias.5Mesmo que o sistema básico esteja longe de ser o “melhor” sistema que você pode construir, é valioso examinar como o sistema básico funciona: você encontrará rapidamente pistas que mostram as direções mais promissoras nas quais investir seu tempo. Os próximos capítulos mostrarão como ler essas pistas. Este conselho destina-se a leitores que desejam construir aplicações de IA, e não àqueles cujo objetivo é 5 publicar artigos acadêmicos. Mais tarde retornarei ao tema da pesquisa. Página 29 Rascunho de aprendizado de máquina André Ng 14 Análise de erros: veja exemplos de conjuntos de desenvolvedores para avaliar ideias Ao brincar com seu aplicativo para gatos, você percebe vários exemplos em que ele confunde cães com gatos. Alguns cães parecem gatos! Um membro da equipe propõe a incorporação de software de terceiros que fará com que o sistema funcione melhor com imagens de cães. Essas mudanças levarão um mês e o membro da equipe está entusiasmado. Você deveria pedir a eles para irem em frente? Antes de investir um mês nesta tarefa, recomendo que você primeiro estime o quanto isso realmente melhorará a precisão do sistema. Então você pode decidir de forma mais racional se vale a pena o mês de desenvolvimento ou se é melhor usar esse tempo em outras tarefas. Em detalhes, aqui está o que você pode fazer: 1.Reúna uma amostra de 100 exemplos de conjuntos de desenvolvimento que seu sistemaclassificado incorretamente. Ou seja, exemplos em que seu sistema cometeu um erro. 2.Observe esses exemplos manualmente e conte que fração deles são imagens de cães. O processo de observar exemplos mal classificados é chamadoanálise de erro. Neste exemplo, se você descobrir que apenas 5% das imagens classificadas incorretamente são cães, não importa o quanto você melhore o desempenho do seu algoritmo em imagens de cães, você não se livrará de mais de 5% dos seus erros. Por outras palavras, 5% é um “tecto” (ou seja, o montante máximo possível) para o quanto o projecto proposto poderia ajudar. Assim, se o seu sistema geral estiver atualmente com 90% de precisão (10% de erro), essa melhoria provavelmente resultará em, na melhor das hipóteses, 90,5% de precisão (ou 9,5% de erro, que é 5% menos erro do que o erro original de 10%). Página 30 Rascunho de aprendizado de máquina André Ng Por outro lado, se você descobrir que 50% dos erros são cometidos por cães, poderá ter mais certeza de que o projeto proposto terá um grande impacto. Poderia aumentar a precisão de 90% para 95% (uma redução relativa de 50% no erro, de 10% para 5%). Este procedimento simples de contagem de análise de erros oferece uma maneira rápida de estimar o valor possível da incorporação de software de terceiros para imagens de cães. Fornece uma base quantitativa para decidir se deve fazer este investimento. A análise de erros muitas vezes pode ajudá-lo a descobrir o quão promissoras são as diferentes direções. Já vi muitos engenheiros relutantes em realizar análises de erros. Muitas vezes parece mais emocionante simplesmente entrar em ação e implementar alguma ideia, em vez de questionar se a ideia vale o investimento de tempo. Este é um erro comum: pode fazer com que sua equipe gaste um mês e depois perceba que isso resultou em poucos benefícios. Examinar manualmente 100 exemplos não demora muito. Mesmo se você tirar um minuto por imagem, você terminará em menos de duas horas. Essas duas horas podem economizar um mês de esforço desperdiçado. Análise de Erros refere-se ao processo de examinar exemplos de conjuntos de desenvolvedores que seu algoritmo classificou incorretamente, para que você possa entender as causas subjacentes dos erros. Isso pode ajudá-lo a priorizar projetos – como neste exemplo – e inspirar novos rumos, que discutiremos a seguir. Os próximos capítulos também apresentarão as melhores práticas para a realização de análises de erros. Página 31 Rascunho de aprendizado de máquina André Ng 15 Avaliando múltiplas ideias em paralelo durante a análise de erros Sua equipe tem várias ideias para melhorar o detector de gatos: • Resolva o problema de reconhecimento do seu algoritmocãescomo gatos. • Resolva o problema de reconhecimento do seu algoritmoótimos gatos(leões, panteras, etc.) como gatos domésticos (animais de estimação). • Melhorar o desempenho do sistema em embaçadoimagens. • … Você pode avaliar com eficiência todas essas ideias em paralelo. Normalmente crio uma planilha e a preencho enquanto examino cerca de 100 imagens de conjuntos de desenvolvedores classificadas incorretamente. Também anoto comentários que podem me ajudar a lembrar exemplos específicos. Para ilustrar esse processo, vejamos uma planilha que você pode produzir com um pequeno conjunto de quatro exemplos de desenvolvimento: Imagem Grande gato Cachorro 1 ✔ Comentários Cor incomum do pitbull 2 ✔ 3 ✔ 4 % Do total Embaçado ✔ ✔ 25% 50% Leão; foto tirada em zoológico em dia chuvoso Pantera atrás da árvore 50% A imagem nº 3 acima tem as colunas Great Cat e Blurry marcadas. Além disso, como é possível que um exemplo seja associado a múltiplas categorias, as percentagens na parte inferior podem não totalizar 100%. Embora você possa primeiro formular as categorias (Cachorro, Gato grande, Desfocado) e depois categorizar os exemplos manualmente, na prática, depois de começar a examinar os exemplos, você provavelmente se sentirá inspirado a propor novas categorias de erros. Por exemplo, digamos que você passe por uma dúzia de imagens e perceba que muitos erros ocorrem com fotos filtradas pelo Instagram. Você pode voltar e adicionar uma nova coluna “Instagram” à planilha. Observar manualmente exemplos que o algoritmo classificou incorretamente e perguntar como/se você, como humano, poderia ter rotulado o Página 32 Rascunho de aprendizado de máquina André Ng imaginar corretamente muitas vezes irá inspirá-lo a criar novas categorias de erros e soluções. As categorias de erros mais úteis serão aquelas que você tem uma ideia para melhorar. Por exemplo, a categoria Instagram será mais útil para adicionar se você tiver uma ideia de “desfazer” os filtros do Instagram e recuperar a imagem original. Mas você não precisa se restringir apenas às categorias de erros que sabe como melhorar; o objetivo deste processo é desenvolver sua intuição sobre as áreas mais promissoras nas quais focar. A análise de erros é um processo iterativo. Não se preocupe se começar sem nenhuma categoria em mente. Depois de observar algumas imagens, você poderá ter algumas ideias para categorias de erros. Depois de categorizar manualmente algumas imagens, você pode pensar em novas categorias e reexaminar as imagens à luz das novas categorias, e assim por diante. Suponha que você termine de realizar a análise de erros em 100 exemplos de conjuntos de desenvolvedores classificados incorretamente e obtenha o seguinte: Imagem Cachorro 1 Grande gato ✔ Cor normal do pitbull 2 ✔ 3 ✔ 4 … % Do total Comentários Embaçado ✔ ✔ … … 8% 43% Leão; foto tirada no zoológico em dia chuvoso Pantera atrás da árvore … ... 61% Agora você sabe que trabalhar em um projeto para solucionar os erros do Cachorro pode eliminar no máximo 8% dos erros. Trabalhar em erros de imagem de gato grande ou desfocado pode ajudar a eliminar mais erros. Portanto, você pode escolher uma das duas últimas categorias para focar. Se sua equipe tiver pessoas suficientes para seguir diversas direções em paralelo, você também pode pedir a alguns engenheiros para trabalharem em Grandes Gatos e outros para trabalharem em imagens desfocadas. A análise de erros não produz uma fórmula matemática rígida que diga qual deve ser a tarefa de maior prioridade. Você também deve levar em consideração quanto progresso espera fazer nas diferentes categorias e a quantidade de trabalho necessária para enfrentar cada uma delas. Página 33 Rascunho de aprendizado de máquina André Ng 16 Limpando exemplos de conjuntos de testes e desenvolvedores com rótulos incorretos Durante a análise de erros, você pode notar que alguns exemplos em seu conjunto de desenvolvimento estão rotulados incorretamente. Quando digo “rotuladas incorretamente” aqui, quero dizer que as imagens já foram rotuladas incorretamente por um rotulador humano antes mesmo de o algoritmo as encontrar. Ou seja, o rótulo da classe em um exemplo(x,y) tem um valor incorreto paravocê. Por exemplo, talvez algumas imagens que não sejam gatos sejam erroneamente rotuladas como contendo um gato e vice-versa. Se você suspeitar que a fração de imagens com rótulos incorretos é significativa, adicione uma categoria para controlar a fração de exemplos com rótulos incorretos: Imagem Cachorro Grande gato Embaçado Rotulado incorretamente Comentários ✔ Rotulador perdeu gato ✔ Desenho de um gato; não é … 98 99 ✔ 100 % Do total no fundo 8% 43% 61% um gato de verdade. 6% Você deve corrigir os rótulos em seu conjunto de desenvolvimento? Lembre-se de que o objetivo do conjunto de desenvolvimento é ajudálo a avaliar algoritmos rapidamente para que você possa saber se o Algoritmo A ou B é melhor. Se a fração do conjunto de desenvolvimento que está rotulada incorretamente impedir sua capacidade de fazer esses julgamentos, então vale a pena gastar tempo para corrigir os rótulos do conjunto de desenvolvimento rotulados incorretamente. Por exemplo, suponha que o desempenho do seu classificador seja: • • • Precisão geral no conjunto de desenvolvimento. 90% (erro geral de 10%). Erros devido a exemplos mal rotulados……. 0,6% (6% dos erros do conjunto de desenvolvimento). Erros devido a outras causas………………… 9,4% (94% dos erros do conjunto de desenvolvimento) Aqui, a imprecisão de 0,6% devido à rotulagem incorreta pode não ser significativa o suficiente em relação aos 9,4% de erros que você poderia estar melhorando. Não há mal nenhum em corrigir manualmente as imagens incorretamente rotuladas no conjunto de desenvolvimento, mas não é crucial fazer isso: pode ser bom não saber se o seu sistema tem um erro geral de 10% ou 9,4%. Suponha que você continue melhorando o classificador de gatos e alcance o seguinte desempenho: Página 34 Rascunho de aprendizado de máquina André Ng • • • Precisão geral no conjunto de desenvolvimento. 98,0% (erro geral de 2,0%). Erros devido a exemplos mal rotulados……. 0,6%. (30% dos erros do conjunto de desenvolvimento.) Erros devido a outras causas………………… 1,4% (70% dos erros do conjunto de desenvolvimento) 30% dos seus erros são devidos às imagens do conjunto de desenvolvedores rotuladas incorretamente, adicionando erros significativos às suas estimativas de precisão. Agora vale a pena melhorar a qualidade dos rótulos no conjunto de desenvolvimento. Lidar com os exemplos mal rotulados ajudará você a descobrir se o erro de um classificador está mais próximo de 1,4% ou 2% – uma diferença relativa significativa. Não é incomum começar a tolerar alguns exemplos de conjuntos de desenvolvimento/teste mal rotulados, só mais tarde mudar de idéia à medida que seu sistema melhora, de modo que a fração de exemplos mal rotulados cresça em relação ao conjunto total de erros. O último capítulo explicou como você pode melhorar categorias de erros como Cachorro, Grande Gato e Desfocado por meio de melhorias algorítmicas. Você aprendeu neste capítulo que também pode trabalhar na categoria rotulados incorretamente – melhorando os rótulos dos dados. Qualquer que seja o processo aplicado para corrigir os rótulos do conjunto de desenvolvimento, lembre-se de aplicá-lo também aos rótulos do conjunto de testes para que seus conjuntos de desenvolvimento e teste continuem a ser extraídos da mesma distribuição. Fixar seus conjuntos de desenvolvimento e de teste juntos evitaria o problema que discutimos no Capítulo 6, onde sua equipe otimiza o desempenho do conjunto de desenvolvimento apenas para perceber mais tarde que eles estão sendo julgados com base em um critério diferente com base em um conjunto de testes diferente. Se você decidir melhorar a qualidade do rótulo, considere verificar novamente os rótulos dos exemplos que seu sistema classificou incorretamente, bem como os rótulos dos exemplos que ele classificou corretamente. É possível que tanto o rótulo original quanto o seu algoritmo de aprendizagem estivessem errados em um exemplo. Se você corrigir apenas os rótulos dos exemplos que seu sistema classificou incorretamente, poderá introduzir preconceitos em sua avaliação. Se você tiver 1.000 exemplos de conjuntos de desenvolvimento e seu classificador tiver 98,0% de precisão, será mais fácil examinar os 20 exemplos classificados incorretamente do que examinar todos os 980 exemplos classificados corretamente. Como na prática é mais fácil verificar apenas os exemplos classificados incorretamente, o preconceito se insinua em alguns conjuntos de desenvolvimento. Esse viés é aceitável se você estiver interessado apenas em desenvolver um produto ou aplicativo, mas seria um problema se você planeja usar o resultado em um trabalho de pesquisa acadêmica ou precisa de uma medida completamente imparcial da precisão do conjunto de testes. Página 35 Rascunho de aprendizado de máquina André Ng 17 Se você tiver um conjunto de desenvolvimento grande, divida-o em dois subconjuntos, dos quais apenas um será examinado Suponha que você tenha um grande conjunto de desenvolvimento de 5.000 exemplos nos quais há uma taxa de erro de 20%. Portanto, seu algoritmo está classificando incorretamente cerca de 1.000 imagens de desenvolvimento. Leva muito tempo para examinar manualmente 1.000 imagens, então podemos decidir não usar todas elas na análise de erros. Nesse caso, eu dividiria explicitamente o conjunto de desenvolvimento em dois subconjuntos, um dos quais você olha e outro não. Você superajustará mais rapidamente a parte que está olhando manualmente. Você pode usar a parte que não está visualizando manualmente para ajustar os parâmetros. Vamos continuar nosso exemplo acima, no qual o algoritmo está classificando incorretamente 1.000 de 5.000 exemplos de conjuntos de desenvolvimento. Suponha que queiramos examinar manualmente cerca de 100 erros para análise de erros (10% dos erros). Você deve selecionar aleatoriamente 10% do conjunto de desenvolvimento e colocá-lo no que chamaremos deConjunto de desenvolvimento de globo ocularpara nos lembrarmos de que estamos olhando para isso com nossos olhos. (Para um projeto sobre reconhecimento de fala, no qual você ouviria clipes de áudio, talvez você chamasse esse conjunto de conjunto de desenvolvimento Ear). O conjunto de desenvolvimento Eyeball tem, portanto, 500 exemplos, dos quais esperaríamos que nosso algoritmo classificasse incorretamente cerca de 100. O segundo subconjunto do conjunto de desenvolvimento, chamadoConjunto de desenvolvimento Blackbox, terá os 4.500 exemplos restantes. Você pode usar o conjunto de desenvolvimento Blackbox para avaliar classificadores automaticamente medindo suas taxas de erro. Você também pode usá-lo para selecionar algoritmos ou ajustar hiperparâmetros. No entanto, você deve evitar olhar para ele com os olhos. Usamos o termo “Blackbox” porque usaremos apenas este subconjunto de dados para obter avaliações “Blackbox” dos classificadores. Página 36 Rascunho de aprendizado de máquina André Ng Por que separamos explicitamente o conjunto de desenvolvimento em conjuntos de desenvolvimento Eyeball e Blackbox? Como você ganhará intuição sobre os exemplos no conjunto de desenvolvimento Eyeball, você começará a ajustar o conjunto de desenvolvimento Eyeball mais rapidamente. Se você observar que o desempenho no conjunto de desenvolvimento Eyeball está melhorando muito mais rapidamente do que o desempenho no conjunto de desenvolvimento Blackbox, você superajustou o conjunto de desenvolvimento Eyeball. Nesse caso, pode ser necessário descartá-lo e encontrar um novo conjunto de desenvolvimento Eyeball movendo mais exemplos do conjunto de desenvolvimento Blackbox para o conjunto de desenvolvimento Eyeball ou adquirindo novos dados rotulados. Dividir explicitamente seu conjunto de desenvolvimento em conjuntos de desenvolvimento Eyeball e Blackbox permite que você saiba quando seu processo de análise de erro manual está fazendo com que você ajuste demais a parte Eyeball de seus dados. Página 37 Rascunho de aprendizado de máquina André Ng 18 Qual deve ser o tamanho dos conjuntos de desenvolvimento Eyeball e Blackbox? Seu conjunto de desenvolvimento Eyeball deve ser grande o suficiente para dar uma ideia das principais categorias de erros do seu algoritmo. Se você estiver trabalhando em uma tarefa que os humanos realizam bem (como reconhecer gatos em imagens), aqui estão algumas diretrizes básicas: • Um conjunto de desenvolvimento ocular em que seu classificador comete 10 erros seria considerado muito pequeno. Com apenas 10 erros, é difícil estimar com precisão o impacto das diferentes categorias de erros. Mas se você tiver poucos dados e não puder investir mais no conjunto de desenvolvimento do Eyeball, é melhor do que nada e ajudará na priorização do projeto. • Se o seu classificador cometer cerca de 20 erros em exemplos de desenvolvimento ocular, você começará a ter uma noção aproximada das principais fontes de erros. • Com cerca de 50 erros, você teria uma boa noção das principais fontes de erros. • Com cerca de 100 erros, você teria uma noção muito boa das principais fontes de erros. Já vi pessoas analisarem manualmente ainda mais erros – às vezes até 500. Não há mal nenhum nisso, desde que você tenha dados suficientes. Digamos que seu classificador tenha uma taxa de erro de 5%. Para garantir que você tenha cerca de 100 exemplos classificados incorretamente no conjunto de desenvolvimento Eyeball, o conjunto de desenvolvimento Eyeball teria que ter cerca de 2.000 exemplos (já que 0,05 * 2.000 = 100). Quanto menor a taxa de erro do seu classificador, maior será o seu conjunto de desenvolvimento Eyeball precisa ser para obter um conjunto grande o suficiente de erros para analisar. Se você estiver trabalhando em uma tarefa que nem mesmo os humanos conseguem realizar bem, o exercício de examinar um conjunto de desenvolvedores do Eyeball não será tão útil porque é mais difícil descobrir por que o algoritmo não classificou um exemplo corretamente. Nesse caso, você pode omitir um conjunto de desenvolvimento Eyeball. Discutiremos diretrizes para tais problemas em um capítulo posterior. Página 38 Rascunho de aprendizado de máquina André Ng Que tal o conjunto de desenvolvedores Blackbox? Dissemos anteriormente que conjuntos de desenvolvimento com cerca de 1.000 a 10.000 exemplos são comuns. Para refinar essa afirmação, um conjunto de desenvolvimento Blackbox de 1.000 a 10.000 exemplos geralmente fornecerá dados suficientes para ajustar hiperparâmetros e selecionar entre modelos, embora haja pouco dano em ter ainda mais dados. Um conjunto de desenvolvimento Blackbox de 100 seria pequeno, mas ainda assim útil. Se você tiver um conjunto de desenvolvimento pequeno, talvez não tenha dados suficientes para dividir em conjuntos de desenvolvimento Eyeball e Blackbox, ambos grandes o suficiente para atender a seus propósitos. Em vez disso, todo o seu conjunto de desenvolvimento pode ter que ser usado como o conjunto de desenvolvimento Eyeball - ou seja, você examinaria manualmente todos os dados do conjunto de desenvolvimento. Entre os conjuntos de desenvolvimento Eyeball e Blackbox, considero o conjunto de desenvolvimento Eyeball mais importante (supondo que você esteja trabalhando em um problema que os humanos podem resolver bem e que examinar os exemplos o ajude a obter insights). Se você tiver apenas um conjunto de desenvolvimento Eyeball, poderá realizar análises de erros, seleção de modelo e ajuste de hiperparâmetros, tudo nesse conjunto. A desvantagem de ter apenas um conjunto de desenvolvimento Eyeball é que o risco de superajuste do conjunto de desenvolvimento é maior. Se você tiver acesso suficiente aos dados, o tamanho do conjunto de desenvolvimento do Eyeball será determinado principalmente por quantos exemplos você tiver tempo para analisar manualmente. Por exemplo, raramente vi alguém analisar manualmente mais de 1.000 erros. Página 39 Rascunho de aprendizado de máquina André Ng 19 Conclusões: análise básica de erros • Quando você inicia um novo projeto, principalmente se for em uma área na qual você não é especialista, é difícil adivinhar corretamente os rumos mais promissores. • Portanto, não comece tentando projetar e construir o sistema perfeito. Em vez disso, construa e treine um sistema básico o mais rápido possível – talvez em alguns dias. Em seguida, use a análise de erros para ajudálo a identificar as direções mais promissoras e melhorar iterativamente seu algoritmo a partir daí. • Realize a análise de erros examinando manualmente cerca de 100 exemplos de conjuntos de desenvolvimento que o algoritmo classifica incorretamente e contando as principais categorias de erros. Use essas informações para priorizar quais tipos de erros devem ser corrigidos. • Considere dividir o conjunto de desenvolvimento em um conjunto de desenvolvimento Eyeball, que você examinará manualmente, e um conjunto de desenvolvimento Blackbox, que você não examinará manualmente. Se o desempenho no conjunto de desenvolvimento Eyeball for muito melhor do que o conjunto de desenvolvimento Blackbox, você superajustou o conjunto de desenvolvimento Eyeball e deve considerar adquirir mais dados para ele. • O conjunto de desenvolvimento Eyeball deve ser grande o suficiente para que seu algoritmo classifique incorretamente exemplos suficientes para você analisar. Um conjunto de desenvolvimento Blackbox de 1.000 a 10.000 exemplos é suficiente para muitas aplicações. • Se o seu conjunto de desenvolvimento não for grande o suficiente para ser dividido dessa forma, basta usar todo o conjunto de desenvolvimento como um conjunto de desenvolvimento Eyeball para análise manual de erros, seleção de modelo e ajuste de hiperparâmetros. Página 40 Rascunho de aprendizado de máquina André Ng Viés e Variância Página 41 Rascunho de aprendizado de máquina André Ng 20 Viés e Variância: As duas grandes fontes de erro Suponha que todos os seus conjuntos de treinamento, desenvolvimento e teste venham da mesma distribuição. Então você deve sempre tentar obter mais dados de treinamento, pois isso só pode melhorar o desempenho, certo? Embora ter mais dados não possa prejudicar, infelizmente nem sempre ajuda tanto quanto você espera. Pode ser uma perda de tempo trabalhar para obter mais dados. Então, como você decide quando adicionar dados e quando não se preocupar? Existem duas fontes principais de erro no aprendizado de máquina: viés e variância. Entendê-los ajudará você a decidir se adicionar dados, bem como outras táticas para melhorar o desempenho, é um bom uso do tempo. Suponha que você queira construir um reconhecedor de gatos com 5% de erro. No momento, seu conjunto de treinamento tem uma taxa de erro de 15% e seu conjunto de desenvolvimento tem uma taxa de erro de 16%. Neste caso, adicionar dados de treinamento provavelmente não ajudará muito. Você deve se concentrar em outras mudanças. Na verdade, adicionar mais exemplos ao seu conjunto de treinamento apenas torna mais difícil para o seu algoritmo ter um bom desempenho no conjunto de treinamento. (Explicaremos o porquê em um capítulo posterior.) Se sua taxa de erro no conjunto de treinamento for de 15% (ou 85% de precisão), mas sua meta for de 5% de erro (95% de precisão), então o primeiro problema a resolver é melhorar o desempenho do seu algoritmo em seu treinamento. definir. O desempenho do seu conjunto de desenvolvimento/teste geralmente é pior do que o desempenho do seu conjunto de treinamento. Portanto, se você está obtendo 85% de precisão nos exemplos que seu algoritmo viu, não há como obter 95% de precisão em exemplos que seu algoritmo nem viu. Suponha, como acima, que seu algoritmo tenha 16% de erro (84% de precisão) no conjunto de desenvolvimento. Dividimos o erro de 16% em dois componentes: • Primeiro, a taxa de erro do algoritmo no conjunto de treinamento. Neste exemplo, é 15%. Pensamos nisso informalmente como o algoritmopreconceito. • Em segundo lugar, quão pior o algoritmo se sai no conjunto de desenvolvimento (ou teste) do que no conjunto de treinamento. Neste exemplo, o desempenho é 1% pior no conjunto de desenvolvimento do que no conjunto de treinamento. Pensamos nisso informalmente como o algoritmovariação.6 O campo das estatísticas tem definições mais formais de viés e variância com as quais não nos preocuparemos. Aproximadamente, o 6 viés é a taxa de erro do seu algoritmo no seu conjunto de treinamento quando você tem um conjunto de treinamento muito grande. A variância é o quão pior você foi no conjunto de teste em comparação com o conjunto de treinamento em Página 42 Rascunho de aprendizado de máquina André Ng Algumas mudanças em um algoritmo de aprendizagem podem resolver o primeiro componente do erro –preconceito— e melhorar seu desempenho no conjunto de treinamento. Algumas mudanças abordam o segundo componente— variação—e ajude-o a generalizar melhor do conjunto de treinamento para os conjuntos de desenvolvimento/teste.7 Para selecionar as mudanças mais promissoras, é extremamente útil entender qual desses dois componentes do erro é mais urgente de resolver. Desenvolver uma boa intuição sobre preconceito e variância o ajudará a escolher mudanças eficazes para seu algoritmo. esta configuração. Quando sua métrica de erro é o erro quadrático médio, você pode escrever fórmulas especificando essas duas quantidades e provar que Erro Total = Viés + Variância. Mas para os nossos propósitos de decidir como progredir num problema de ML, a definição mais informal de preconceito e variância dada aqui será suficiente. Existem também alguns métodos que podem reduzir simultaneamente o viés e a variância, fazendo grandes 7 mudanças na arquitetura do sistema. Mas estes tendem a ser mais difíceis de identificar e implementar. Página 43 Rascunho de aprendizado de máquina André Ng 21 exemplos de preconceito e variação Considere nossa tarefa de classificação de gatos. Um classificador “ideal” (como um humano) pode alcançar um desempenho quase perfeito nesta tarefa. Suponha que seu algoritmo tenha o seguinte desempenho: • Erro de treinamento = 1% • Erro de desenvolvimento = 11% Que problema isso tem? Aplicando as definições do capítulo anterior, estimamos o viés em 1% e a variância em 10% (=11%-1%). Assim, temalta variação. O classificador tem um erro de treinamento muito baixo, mas não consegue generalizar para o conjunto de desenvolvimento. Isso também é chamadosobreajuste. Agora considere isto: • Erro de treinamento = 15% • Erro de desenvolvimento = 16% Estimamos o viés em 15% e a variância em 1%. Este classificador não se ajusta bem ao conjunto de treinamento com 15% de erro, mas seu erro no conjunto de desenvolvimento é pouco maior que o erro de treinamento. Este classificador, portanto, temalto preconceito, mas baixa variância. Dizemos que este algoritmo é adaptação. Agora, considere isto: • Erro de treinamento = 15% • Erro de desenvolvimento = 30% Estimamos o viés em 15% e a variância em 15%. Este classificador temalto viés e alta variância: Ele está indo mal no conjunto de treinamento e, portanto, tem alto viés, e seu desempenho no conjunto de desenvolvimento é ainda pior, portanto, também tem alta variância. A terminologia overfitting/underfitting é difícil de aplicar aqui, uma vez que o classificador é simultaneamente overfitting e underfitting. Página 44 Rascunho de aprendizado de máquina André Ng Finalmente, considere isto: • Erro de treinamento = 0,5% • Erro de desenvolvimento = 1% Este classificador está indo bem, pois tem baixo viés e baixa variância. Parabéns por alcançar esse ótimo desempenho! Página 45 Rascunho de aprendizado de máquina André Ng 22 Comparando com a taxa de erro ideal Em nosso exemplo de reconhecimento de gatos, a taxa de erro “ideal” – isto é, aquela que pode ser alcançada por um classificador “ideal” – é de quase 0%. Um ser humano olhando para uma foto seria capaz de reconhecer quase o tempo todo se ela contém um gato; assim, podemos esperar por uma máquina que funcione igualmente bem. Outros problemas são mais difíceis. Por exemplo, suponha que você esteja construindo um sistema de reconhecimento de fala e descubra que 14% dos clipes de áudio têm tanto ruído de fundo ou são tão ininteligíveis que mesmo um ser humano não consegue reconhecer o que foi dito. Neste caso, mesmo o sistema de reconhecimento de fala mais “ótimo” pode apresentar erros em torno de 14%. Suponha que neste problema de reconhecimento de fala seu algoritmo atinja: • Erro de treinamento = 15% • Erro de desenvolvimento = 30% O desempenho do conjunto de treinamento já está próximo da taxa de erro ideal de 14%. Assim, não há muito espaço para melhorias em termos de viés ou em termos de desempenho do conjunto de treinamento. No entanto, este algoritmo não está generalizando bem para o conjunto de desenvolvedores; portanto, há amplo espaço para melhorias nos erros devido à variância. Este exemplo é semelhante ao terceiro exemplo do capítulo anterior, que também teve um erro de treinamento de 15% e um erro de desenvolvimento de 30%. Se a taxa de erro ideal for de aproximadamente 0%, então um erro de treinamento de 15% deixa muito espaço para melhorias. Isto sugere que mudanças para reduzir preconceitos podem ser frutíferas. Mas se a taxa de erro ideal for 14%, então o mesmo desempenho do conjunto de treinamento nos diz que há pouco espaço para melhorias no viés do classificador. Para problemas onde a taxa de erro ideal está longe de zero, aqui está uma análise mais detalhada do erro de um algoritmo. Continuando com nosso exemplo de reconhecimento de fala acima, o erro total do conjunto de desenvolvimento de 30% pode ser dividido da seguinte forma (uma análise semelhante pode ser aplicada ao erro do conjunto de teste): • Taxa de erro ideal (“viés inevitável”) : 14%. Suponha que decidíssemos que, mesmo com o melhor sistema de fala possível no mundo, ainda sofreríamos um erro de 14%. Podemos pensar nisso como a parte “inevitável” do viés de um algoritmo de aprendizagem. Página 46 Rascunho de aprendizado de máquina André Ng • Viés evitável: 1%. Isto é calculado como a diferença entre o erro de treinamento e a taxa de erro ideal.8 • Variância : 15%. A diferença entre o erro de desenvolvimento e o erro de treinamento. Para relacionar isso com nossas definições anteriores, Viés e Viés Evitável estão relacionados da seguinte forma:9 Viés = Taxa de erro ideal (“viés inevitável”) + Viés evitável O “viés evitável” reflete o quão pior o desempenho do seu algoritmo no conjunto de treinamento do que o “classificador ideal”. O conceito de variância permanece o mesmo de antes. Em teoria, sempre podemos reduzir a variância a quase zero treinando em um conjunto de treinamento massivo. Assim, toda variação é “evitável” com um conjunto de dados suficientemente grande, portanto não existe “variância inevitável”. Considere mais um exemplo, onde a taxa de erro ideal é de 14%, e temos: • Erro de treinamento = 15% • Erro de desenvolvimento = 16% Enquanto no capítulo anterior chamamos isso de classificador de alto viés, agora diríamos que o erro do viés evitável é de 1% e o erro da variância é de cerca de 1%. Assim, o algoritmo já está indo bem, com pouco espaço para melhorias. É apenas 2% pior que a taxa de erro ideal. Vemos nestes exemplos que conhecer a taxa de erro ideal é útil para orientar nossos próximos passos. Nas estatísticas, a taxa de erro ideal também é chamadaTaxa de erro de Bayes, ou taxa de Bayes. Como sabemos qual é a taxa de erro ideal? Para tarefas nas quais os humanos são razoavelmente bons, como reconhecer imagens ou transcrever clipes de áudio, você pode pedir a um humano que forneça rótulos e depois medir a precisão dos rótulos humanos em relação ao seu conjunto de treinamento. Isso daria uma estimativa da taxa de erro ideal. Se você está trabalhando em um problema que até Se esse número for negativo, você está se saindo melhor no conjunto de treinamento do que na taxa de erro ideal. Isso significa 8 que você está ajustando demais o conjunto de treinamento e o algoritmo memorizou demais o conjunto de treinamento. Você deve se concentrar em métodos de redução de variância em vez de métodos adicionais de redução de viés. Essas definições são escolhidas para transmitir informações sobre como melhorar seu algoritmo de aprendizagem. Essas 9 definições são diferentes de como os estatísticos definem Viés e Variância. Tecnicamente, o que defino aqui como “preconceito” deveria ser chamado de “Erro que atribuímos ao preconceito”; e “Viés evitável” deveria ser “erro que atribuímos ao viés do algoritmo de aprendizagem que está acima da taxa de erro ideal”. Página 47 Rascunho de aprendizado de máquina André Ng os humanos têm dificuldade em resolver (por exemplo, prever que filme recomendar ou que anúncio mostrar a um usuário), pode ser difícil estimar a taxa de erro ideal. Na seção “Comparando com o desempenho em nível humano (capítulos 33 a 35), discutirei com mais detalhes o processo de comparação do desempenho de um algoritmo de aprendizagem com o desempenho em nível humano. Nos últimos capítulos, você aprendeu como estimar tendências e variâncias evitáveis/inevitáveis observando as taxas de erro dos conjuntos de treinamento e desenvolvimento. O próximo capítulo discutirá como você pode usar os insights de tal análise para priorizar técnicas que reduzem o viés versus técnicas que reduzem a variância. Existem técnicas muito diferentes que você deve aplicar dependendo se o problema atual do seu projeto é um viés alto (evitável) ou uma variância alta. Leia! Página 48 Rascunho de aprendizado de máquina André Ng 23 Lidando com preconceitos e variações Aqui está a fórmula mais simples para lidar com questões de preconceito e variação: • Se você tiver um viés evitável alto, aumente o tamanho do seu modelo (por exemplo, aumente o tamanho da sua rede neural adicionando camadas/neurônios). • Se você tiver uma variação alta, adicione dados ao seu conjunto de treinamento. Se você conseguir aumentar o tamanho da rede neural e aumentar os dados de treinamento sem limites, será possível se sair muito bem em muitos problemas de aprendizado. Na prática, aumentar o tamanho do seu modelo acabará por causar problemas computacionais porque o treinamento de modelos muito grandes é lento. Você também pode esgotar sua capacidade de adquirir mais dados de treinamento. (Mesmo na internet, há apenas um número finito de fotos de gatos!) Diferentes arquiteturas de modelos – por exemplo, diferentes arquiteturas de redes neurais – terão diferentes quantidades de tendência/variância para o seu problema. Muitas pesquisas recentes de aprendizado profundo desenvolveram muitas arquiteturas de modelos inovadores. Portanto, se você estiver utilizando redes neurais, a literatura acadêmica pode ser uma grande fonte de inspiração. Existem também muitas implementações de código aberto excelentes no GitHub. Mas os resultados da tentativa de novas arquiteturas são menos previsíveis do que a simples fórmula de aumentar o tamanho do modelo e adicionar dados. Aumentar o tamanho do modelo geralmente reduz o viés, mas também pode aumentar a variância e o risco de overfitting. No entanto, esse problema de overfitting geralmente surge apenas quando você não está usando a regularização. Se você incluir um método de regularização bem projetado, geralmente poderá aumentar com segurança o tamanho do modelo sem aumentar o sobreajuste. Suponha que você esteja aplicando aprendizado profundo, com regularização ou abandono L2, com o parâmetro de regularização que apresenta melhor desempenho no conjunto de desenvolvimento. Se você aumentar o tamanho do modelo, normalmente seu desempenho permanecerá o mesmo ou melhorará; é improvável que piore significativamente. A única razão para evitar o uso de um modelo maior é o aumento do custo computacional. Página 49 Rascunho de aprendizado de máquina André Ng 24 Compensação entre polarização e variância Você deve ter ouvido falar da “compensação entre preconceito e variância”. Das alterações que você poderia fazer na maioria dos algoritmos de aprendizagem, há algumas que reduzem os erros de polarização, mas ao custo de aumentar a variância e vice-versa. Isso cria uma “compensação” entre viés e variância. Por exemplo, aumentar o tamanho do seu modelo – adicionar neurônios/camadas em uma rede neural ou adicionar recursos de entrada – geralmente reduz o viés, mas pode aumentar a variância. Alternativamente, adicionar regularização geralmente aumenta o viés, mas reduz a variância. Na era moderna, muitas vezes temos acesso a dados abundantes e podemos usar redes neurais muito grandes (aprendizado profundo). Portanto, há menos trocas e agora há mais opções para reduzir o viés sem prejudicar a variância e vice-versa. Por exemplo, geralmente você pode aumentar o tamanho de uma rede neural e ajustar o método de regularização para reduzir o viés sem aumentar visivelmente a variância. Ao adicionar dados de treinamento, geralmente você também pode reduzir a variação sem afetar o viés. Se você selecionar uma arquitetura de modelo adequada à sua tarefa, também poderá reduzir o viés e a variação simultaneamente. Selecionar tal arquitetura pode ser difícil. Nos próximos capítulos, discutiremos técnicas específicas adicionais para lidar com viés e variância. Página 50 Rascunho de aprendizado de máquina André Ng 25 técnicas para reduzir preconceitos evitáveis Se o seu algoritmo de aprendizagem sofre de um alto viés evitável, você pode tentar as seguintes técnicas: • Aumentar o tamanho do modelo(como número de neurônios/camadas): Esta técnica reduz o viés, pois deve permitir que você se ajuste melhor ao conjunto de treinamento. Se você achar que isso aumenta a variância, use a regularização, que geralmente eliminará o aumento da variância. • Modifique recursos de entrada com base em insights de análise de erros: digamos que sua análise de erros inspire você a criar recursos adicionais que ajudem o algoritmo a eliminar uma categoria específica de erros. (Discutiremos isso mais detalhadamente no próximo capítulo.) Esses novos recursos podem ajudar tanto no viés quanto na variância. Em teoria, adicionar mais recursos poderia aumentar a variância; mas se você achar que esse é o caso, use a regularização, que geralmente eliminará o aumento na variância. • Reduzir ou eliminar a regularização (Regularização L2, regularização L1, abandono): Isso reduzirá o viés evitável, mas aumentará a variância. • Modificar arquitetura do modelo(como arquitetura de rede neural) para que seja mais adequado ao seu problema: Esta técnica pode afetar tanto o viés quanto a variância. Um método que não é útil: • Adicione mais dados de treinamento: Esta técnica ajuda com problemas de variância, mas geralmente não tem efeito significativo no viés. Página 51 Rascunho de aprendizado de máquina André Ng 26 Análise de erros no conjunto de treinamento Seu algoritmo deve ter um bom desempenho no conjunto de treinamento antes que você possa esperar que ele tenha um bom desempenho nos conjuntos de desenvolvimento/teste. Além das técnicas descritas anteriormente para lidar com o alto viés, às vezes também realizo uma análise de erro no dados de treinamento, seguindo um protocolo semelhante à análise de erros no conjunto de desenvolvimento Eyeball. Isso pode ser útil se o seu algoritmo tiver alto viés – ou seja, se não estiver se ajustando bem ao conjunto de treinamento. Por exemplo, suponha que você esteja construindo um sistema de reconhecimento de fala para um aplicativo e tenha coletado um conjunto de treinamento de clipes de áudio de voluntários. Se o seu sistema não estiver indo bem no conjunto de treinamento, você pode considerar ouvir um conjunto de cerca de 100 exemplos nos quais o algoritmo está indo mal para entender as principais categorias de erros do conjunto de treinamento. Semelhante à análise de erros do conjunto de desenvolvimento, você pode contar os erros em diferentes categorias: Fundo alto Clipe de áudio barulho 1 ✔ 2 ✔ 3 4 % Do total O usuário falou rapidamente Longe de microfone Barulho do carro ✔ ✔ ✔ ✔ 75% Comentários Barulho do restaurante Usuário gritando na sala de estar? Cafeteria 25% 50% Neste exemplo, você pode perceber que seu algoritmo está tendo dificuldades particularmente com exemplos de treinamento que apresentam muito ruído de fundo. Assim, você pode se concentrar em técnicas que permitam ajustar melhor os exemplos de treinamento com ruído de fundo. Você também pode verificar se é possível para uma pessoa transcrever esses clipes de áudio, dado o mesmo áudio de entrada do seu algoritmo de aprendizagem. Se houver tanto ruído de fundo que seja simplesmente impossível para alguém entender o que foi dito, então pode não ser razoável esperar que qualquer algoritmo reconheça corretamente tais declarações. Discutiremos os benefícios de comparar seu algoritmo com o desempenho de nível humano em uma seção posterior. Página 52 Rascunho de aprendizado de máquina André Ng 27 Técnicas para reduzir a variância Se o seu algoritmo de aprendizagem sofre de alta variação, você pode tentar as seguintes técnicas: • Adicione mais dados de treinamento: esta é a maneira mais simples e confiável de lidar com a variação, desde que você tenha acesso a um número significativamente maior de dados e poder computacional suficiente para processá-los. • Adicionar regularização (Regularização L2, regularização L1, abandono): Esta técnica reduz a variância, mas aumenta o viés. • Adicionar parada antecipada (ou seja, interromper a descida do gradiente mais cedo, com base no erro do conjunto de desenvolvimento): Esta técnica reduz a variância, mas aumenta o viés. A parada antecipada se comporta de maneira muito parecida com os métodos de regularização, e alguns autores a chamam de técnica de regularização. • Seleção de recursos para diminuir o número/tipo de recursos de entrada: Essa técnica pode ajudar com problemas de variância, mas também pode aumentar o viés. É improvável que reduzir ligeiramente o número de recursos (digamos, passar de 1.000 para 900) tenha um grande efeito no viés. Reduzi-lo significativamente (digamos, passar de 1.000 recursos para 100 – uma redução de 10x) tem mais probabilidade de ter um efeito significativo, desde que você não exclua muitos recursos úteis. No aprendizado profundo moderno, quando os dados são abundantes, houve uma mudança na seleção de recursos, e agora é mais provável que forneçamos todos os recursos que temos ao algoritmo e deixemos o algoritmo decidir quais usar com base nos dados . Mas quando o seu conjunto de treinamento é pequeno, a seleção de recursos pode ser muito útil. • Diminuir o tamanho do modelo(como número de neurônios/camadas): Use com cuidado. Esta técnica poderia diminuir a variância, ao mesmo tempo que possivelmente aumentaria o viés. No entanto, não recomendo esta técnica para lidar com a variação. Adicionar regularização geralmente proporciona melhor desempenho de classificação. A vantagem de reduzir o tamanho do modelo é reduzir o custo computacional e, assim, acelerar a rapidez com que você pode treinar modelos. Se acelerar o treinamento do modelo for útil, considere diminuir o tamanho do modelo. Mas se o seu objetivo é reduzir a variância e você não está preocupado com o custo computacional, considere adicionar a regularização. Aqui estão duas táticas adicionais, repetidas do capítulo anterior sobre como lidar com o preconceito: • Modifique recursos de entrada com base em insights de análise de erros: digamos que sua análise de erros inspire você a criar recursos adicionais que ajudem o algoritmo a eliminar uma categoria específica de erros. Esses novos recursos podem ajudar tanto no preconceito quanto na variação. Em Página 53 Rascunho de aprendizado de máquina André Ng teoria, adicionar mais recursos poderia aumentar a variância; mas se você achar que esse é o caso, use a regularização, que geralmente eliminará o aumento na variância. • Modificar arquitetura do modelo(como arquitetura de rede neural) para que seja mais adequado ao seu problema: Esta técnica pode afetar tanto o viés quanto a variância. Página 54 Rascunho de aprendizado de máquina André Ng Curvas de aprendizagem Página 55 Rascunho de aprendizado de máquina André Ng 28 Diagnosticando viés e variância: curvas de aprendizado Vimos algumas maneiras de estimar quanto erro pode ser atribuído ao viés evitável versus variância. Fizemos isso estimando a taxa de erro ideal e calculando o conjunto de treinamento do algoritmo e os erros do conjunto de desenvolvimento. Vamos discutir uma técnica ainda mais informativa: traçar uma curva de aprendizado. Uma curva de aprendizado representa o erro do conjunto de desenvolvimento em relação ao número de exemplos de treinamento. Para plotá-lo, você executaria seu algoritmo usando diferentes tamanhos de conjuntos de treinamento. Por exemplo, se você tiver 1.000 exemplos, poderá treinar cópias separadas do algoritmo em 100, 200, 300,…, 1.000 exemplos. Então você poderia traçar como o erro do conjunto de desenvolvimento varia com o tamanho do conjunto de treinamento. Aqui está um exemplo: À medida que o tamanho do conjunto de treinamento aumenta, o erro do conjunto de desenvolvimento deve diminuir. Freqüentemente teremos alguma “taxa de erro desejada” que esperamos que nosso algoritmo de aprendizagem acabe alcançando. Por exemplo: • Se esperarmos um desempenho de nível humano, então a taxa de erro humano poderia ser a “taxa de erro desejada”. • Se nosso algoritmo de aprendizado servir algum produto (como entregar fotos de gatos), poderemos ter uma intuição sobre qual nível de desempenho é necessário para proporcionar aos usuários uma ótima experiência. Página 56 Rascunho de aprendizado de máquina André Ng • Se você trabalha em um aplicativo importante há muito tempo, então pode ter uma intuição sobre quanto progresso pode razoavelmente fazer no próximo trimestre/ ano. Adicione o nível de desempenho desejado à sua curva de aprendizado: Você pode extrapolar visualmente a curva vermelha de “erro de desenvolvimento” para adivinhar o quanto mais próximo você poderia chegar do nível de desempenho desejado adicionando mais dados. No exemplo acima, parece plausível que duplicar o tamanho do conjunto de treinamento possa permitir alcançar o desempenho desejado. Mas se a curva de erro de desenvolvimento tiver “estagnado” (ou seja, achatado), então você pode dizer imediatamente que adicionar mais dados não o levará ao seu objetivo: Observar a curva de aprendizado pode, portanto, ajudá-lo a evitar passar meses coletando o dobro de dados de treinamento, apenas para perceber que isso não ajuda. Página 57 Rascunho de aprendizado de máquina André Ng Uma desvantagem desse processo é que, se você observar apenas a curva de erro do desenvolvedor, pode ser difícil extrapolar e prever exatamente para onde irá a curva vermelha se você tiver mais dados. Há um gráfico adicional que pode ajudá-lo a estimar o impacto da adição de mais dados: o erro de treinamento. Página 58 Rascunho de aprendizado de máquina André Ng 29 Plotando erro de treinamento O erro do conjunto de desenvolvimento (e conjunto de teste) deve diminuir à medida que o tamanho do conjunto de treinamento aumenta. Mas o erro do seu conjunto de treinamento geralmenteaumentaà medida que o tamanho do conjunto de treinamento aumenta. Vamos ilustrar esse efeito com um exemplo. Suponha que seu conjunto de treinamento tenha apenas 2 exemplos: uma imagem de gato e uma imagem de não gato. Então é fácil para os algoritmos de aprendizagem “memorizar” ambos os exemplos no conjunto de treinamento e obter 0% de erro no conjunto de treinamento. Mesmo que um ou ambos os exemplos de treinamento tenham sido rotulados incorretamente, ainda é fácil para o algoritmo memorizar ambos os rótulos. Agora suponha que seu conjunto de treinamento tenha 100 exemplos. Talvez até alguns exemplos estejam mal rotulados ou sejam ambíguos – algumas imagens são muito desfocadas, por isso mesmo os humanos não conseguem dizer se existe um gato. Talvez o algoritmo de aprendizagem ainda consiga “memorizar” a maior parte ou todo o conjunto de treinamento, mas agora é mais difícil obter 100% de precisão. Ao aumentar o conjunto de treinamento de 2 para 100 exemplos, você descobrirá que a precisão do conjunto de treinamento cairá ligeiramente. Finalmente, suponha que seu conjunto de treinamento tenha 10.000 exemplos. Neste caso, torna-se ainda mais difícil para o algoritmo ajustar perfeitamente todos os 10.000 exemplos, especialmente se alguns forem ambíguos ou mal rotulados. Assim, seu algoritmo de aprendizado terá um desempenho ainda pior neste conjunto de treinamento. Vamos adicionar um gráfico de erro de treinamento aos nossos números anteriores: Você pode ver que a curva azul de “erro de treinamento” aumenta com o tamanho do conjunto de treinamento. Além disso, seu algoritmo geralmente funciona melhor no conjunto de treinamento do que no conjunto de desenvolvimento; portanto, a curva de erro de desenvolvimento vermelha geralmente fica estritamente acima da curva de erro de treinamento azul. Vamos discutir a seguir como interpretar esses gráficos. Página 59 Rascunho de aprendizado de máquina André Ng 30 Interpretando curvas de aprendizagem: Alto viés Suponha que sua curva de erro de desenvolvimento seja assim: Dissemos anteriormente que, se sua curva de erro de desenvolvimento estabilizar, é improvável que você alcance o desempenho desejado apenas adicionando dados. Mas é difícil saber exatamente como será uma extrapolação da curva vermelha de erro de desenvolvimento. Se o conjunto de desenvolvimento fosse pequeno, você teria ainda menos certeza porque as curvas poderiam ser barulhentas. Suponha que adicionemos a curva de erro de treinamento a este gráfico e obtenhamos o seguinte: Agora, você pode ter certeza absoluta de que adicionar mais dados não será, por si só, suficiente. Por que é que? Lembre-se de nossas duas observações: Página 60 Rascunho de aprendizado de máquina André Ng • À medida que adicionamos mais dados de treinamento, o erro de treinamento só pode piorar. Assim, a curva de erro de treinamento azul só pode permanecer a mesma ou subir e, portanto, só pode se afastar ainda mais do nível (linha verde) de desempenho desejado. • A curva de erro de desenvolvimento vermelha geralmente é maior que o erro de treinamento azul. Portanto, quase não há como adicionar mais dados permitir que a curva vermelha de erro de desenvolvimento caia para o nível de desempenho desejado, mesmo quando o erro de treinamento é superior ao nível de desempenho desejado. Examinar a curva de erro de desenvolvimento e a curva de erro de treinamento no mesmo gráfico nos permite extrapolar a curva de erro de desenvolvimento com mais segurança. Suponha, para efeitos de discussão, que o desempenho desejado seja a nossa estimativa da taxa de erro ideal. A figura acima é então o exemplo padrão de “livro didático” de como é uma curva de aprendizado com alto viés evitável: No maior tamanho do conjunto de treinamento – presumivelmente correspondendo a todos os dados de treinamento que temos – há uma grande lacuna entre o erro de treinamento e o desempenho desejado, indicando grande viés evitável. Além disso, a lacuna entre as curvas de treinamento e desenvolvimento é pequena, indicando pequena variância. Anteriormente, medimos o erro de treinamento e de desenvolvimento apenas no ponto mais à direita deste gráfico, o que corresponde ao uso de todos os dados de treinamento disponíveis. Traçar a curva de aprendizado completa nos dá uma imagem mais abrangente do desempenho dos algoritmos em diferentes tamanhos de conjuntos de treinamento. Página 61 Rascunho de aprendizado de máquina André Ng 31 Interpretando curvas de aprendizagem: Outros casos Considere esta curva de aprendizado: Este gráfico indica alto viés, alta variância ou ambos? A curva de erro de treinamento azul é relativamente baixa e a curva de erro de desenvolvimento vermelha é muito maior do que o erro de treinamento azul. Assim, o viés é pequeno, mas a variância é grande. Adicionar mais dados de treinamento provavelmente ajudará a diminuir a lacuna entre o erro de desenvolvimento e o erro de treinamento. Agora, considere isto: Desta vez, o erro de treinamento é grande, pois é muito superior ao nível de desempenho desejado. O erro de desenvolvimento também é muito maior que o erro de treinamento. Portanto, você tem um viés significativo e uma variação significativa. Você terá que encontrar uma maneira de reduzir o preconceito e a variação em seu algoritmo. Página 62 Rascunho de aprendizado de máquina André Ng 32 Traçando curvas de aprendizado Suponha que você tenha um conjunto de treinamento muito pequeno de 100 exemplos. Você treina seu algoritmo usando um subconjunto escolhido aleatoriamente de 10 exemplos, depois 20 exemplos, depois 30, até 100, aumentando o número de exemplos em intervalos de dez. Em seguida, você usa esses 10 pontos de dados para traçar sua curva de aprendizado. Você pode descobrir que a curva parece um pouco barulhenta (o que significa que os valores são maiores/inferiores do que o esperado) nos tamanhos menores dos conjuntos de treinamento. Ao treinar com apenas 10 exemplos escolhidos aleatoriamente, você pode ter azar e ter um conjunto de treinamento particularmente “ruim”, como um com muitos exemplos ambíguos/mal rotulados. Ou você pode ter sorte e conseguir um conjunto de treinamento particularmente “bom”. Ter um pequeno conjunto de treinamento significa que os erros de desenvolvimento e treinamento podem flutuar aleatoriamente. Se seu aplicativo de aprendizado de máquina for fortemente direcionado para uma classe (como uma tarefa de classificação de gatos em que a fração de exemplos negativos é muito maior do que exemplos positivos) ou se tiver um grande número de classes (como reconhecer 100 espécies animais diferentes) , então a chance de selecionar um conjunto de treinamento especialmente “não representativo” ou ruim também é maior. Por exemplo, se 80% dos seus exemplos são exemplos negativos (y=0) e apenas 20% são exemplos positivos (y=1), então há uma chance de que um conjunto de treinamento de 10 exemplos contenha apenas exemplos negativos, tornando assim é muito difícil para o algoritmo aprender algo significativo. Se o ruído na curva de treinamento dificulta a visualização das verdadeiras tendências, aqui estão duas soluções: • Em vez de treinar apenas um modelo em 10 exemplos, selecione vários (digamos 3-10) diferentes conjuntos de treinamento de 10 exemplos escolhidos aleatoriamente por amostragem com substituição10 do seu conjunto original de 100. Treine um modelo diferente em cada um deles e calcule o erro do conjunto de treinamento e desenvolvimento de cada um dos modelos resultantes. Calcule e represente graficamente o erro médio de treinamento e o erro médio do conjunto de desenvolvimento. • Se o seu conjunto de treinamento for direcionado para uma classe, ou se tiver muitas classes, escolha um subconjunto “equilibrado” em vez de 10 exemplos de treinamento aleatoriamente do conjunto de 100. Por exemplo, você pode ter certeza de que 2/10 do exemplos são exemplos positivos e 8/10 são Aqui está o que amostragemcom substituiçãosignifica: você escolheria aleatoriamente 10 exemplos diferentes entre 100 para formar seu primeiro 10 conjunto de treinamento. Então, para formar o segundo conjunto de treinamento, você escolheria novamente 10 exemplos, mas sem levar em conta o que foi escolhido no primeiro conjunto de treinamento. Assim, é possível que um exemplo específico apareça tanto no primeiro quanto no segundo conjunto de treinamento. Em contraste, se você estivesse amostrandoSem substituição, o segundo conjunto de treinamento seria escolhido apenas entre os 90 exemplos que não foram escolhidos na primeira vez. Na prática, a amostragem com ou sem reposição não deveria fazer grande diferença, mas a primeira é uma prática comum. Página 63 Rascunho de aprendizado de máquina André Ng negativo. De forma mais geral, você pode garantir que a fração de exemplos de cada classe seja o mais próxima possível da fração geral no conjunto de treinamento original. Eu não me preocuparia com nenhuma dessas técnicas, a menos que você já tenha tentado traçar curvas de aprendizado e concluído que as curvas são muito barulhentas para ver as tendências subjacentes. Se o seu conjunto de treinamento for grande – digamos, mais de 10.000 exemplos – e a distribuição das aulas não for muito distorcida, você provavelmente não precisará dessas técnicas. Por fim, traçar uma curva de aprendizado pode ser caro do ponto de vista computacional: por exemplo, você pode ter que treinar dez modelos com 1.000, depois 2.000, até 10.000 exemplos. O treinamento de modelos com pequenos conjuntos de dados é muito mais rápido do que o treinamento de modelos com grandes conjuntos de dados. Assim, em vez de espaçar uniformemente os tamanhos dos conjuntos de treinamento em uma escala linear como acima, você pode treinar modelos com 1.000, 2.000, 4.000, 6.000 e 10.000 exemplos. Isso ainda deve lhe dar uma noção clara das tendências nas curvas de aprendizado. É claro que esta técnica só é relevante se o custo computacional de treinamento de todos os modelos adicionais for significativo. Página 64 Rascunho de aprendizado de máquina André Ng Comparando à nível humano desempenho Página 65 Rascunho de aprendizado de máquina André Ng 33 Por que comparamos o desempenho em nível humano Muitos sistemas de aprendizado de máquina visam automatizar coisas que os humanos fazem bem. Os exemplos incluem reconhecimento de imagem, reconhecimento de fala e classificação de spam de e-mail. Os algoritmos de aprendizagem também melhoraram tanto que agora estamos ultrapassando o desempenho do nível humano em cada vez mais dessas tarefas. Além disso, há vários motivos pelos quais construir um sistema de ML é mais fácil se você estiver tentando realizar uma tarefa que as pessoas possam realizar bem: 1. Facilidade de obtenção de dados de rotuladores humanos. Por exemplo, como as pessoas reconhecem bem as imagens de gatos, é fácil fornecer rótulos de alta precisão para o seu algoritmo de aprendizagem. 2. A análise de erros pode basear-se na intuição humana. Suponha que um algoritmo de reconhecimento de fala tenha um desempenho pior do que o reconhecimento em nível humano. Digamos que transcreva incorretamente um clipe de áudio como “Esta receita pede umpêrade maçãs”, confundindo “par” com “pêra”. Você pode recorrer à intuição humana e tentar entender quais informações uma pessoa usa para obter a transcrição correta e usar esse conhecimento para modificar o algoritmo de aprendizagem. 3. Use o desempenho de nível humano para estimar a taxa de erro ideal e também definir uma “taxa de erro desejada”.Suponha que seu algoritmo atinja 10% de erro em uma tarefa, mas uma pessoa atinja 2% de erro. Então sabemos que a taxa de erro ideal é de 2% ou menos e o viés evitável é de pelo menos 8%. Portanto, você deve tentar técnicas de redução de preconceito. Embora o item 3 possa não parecer importante, acho que ter uma taxa de erro alvo razoável e alcançável ajuda a acelerar o progresso de uma equipe. Saber que seu algoritmo tem um alto viés evitável é extremamente valioso e abre um menu de opções para experimentar. Existem algumas tarefas nas quais nem mesmo os humanos são bons. Por exemplo, escolher um livro para recomendar a você; ou escolher um anúncio para mostrar a um usuário em um site; ou prever o mercado de ações. Os computadores já superam o desempenho da maioria das pessoas nessas tarefas. Com esses aplicativos, encontramos os seguintes problemas: • É mais difícil obter rótulos. Por exemplo, é difícil para os rotuladores humanos anotar em um banco de dados de usuários a recomendação de livro “ideal”. Se você opera um site ou aplicativo que vende livros, poderá obter dados mostrando os livros aos usuários e vendo o que eles compram. Se você não opera esse site, precisará encontrar maneiras mais criativas de obter dados. Página 66 Rascunho de aprendizado de máquina André Ng • A intuição humana é mais difícil de contar. Por exemplo, praticamente ninguém pode prever o mercado de ações. Portanto, se nosso algoritmo de previsão de ações não for melhor do que adivinhações aleatórias, será difícil descobrir como melhorá-lo. • É difícil saber qual é a taxa de erro ideal e a taxa de erro razoável desejada. Suponha que você já tenha um sistema de recomendação de livros que esteja indo muito bem. Como você sabe o quanto mais pode melhorar sem uma linha de base humana? Página 67 Rascunho de aprendizado de máquina André Ng 34 Como definir o desempenho em nível humano Suponha que você esteja trabalhando em um aplicativo de imagens médicas que faz diagnósticos automaticamente a partir de imagens de raios X. Uma pessoa típica, sem formação médica anterior, além de algum treinamento básico, atinge 15% de erro nesta tarefa. Um médico júnior atinge 10% de erro. Um médico experiente atinge 5% de erro. E uma pequena equipe de médicos que discute e debate cada imagem chega a 2% de erro. Qual dessas taxas de erro define “desempenho em nível humano”? Nesse caso, eu usaria 2% como proxy de desempenho em nível humano para nossa taxa de erro ideal. Você também pode definir 2% como o nível de desempenho desejado porque todos os três motivos do capítulo anterior para comparação com o desempenho em nível humano se aplicam: • Facilidade de obtenção de dados rotulados de rotuladores humanos. Você pode solicitar que uma equipe de médicos forneça rótulos com uma taxa de erro de 2%. • A análise de erros pode basear-se na intuição humana. Ao discutir imagens com uma equipe de médicos, você pode aproveitar suas intuições. • Use o desempenho de nível humano para estimar a taxa de erro ideal e também definir a “taxa de erro desejada” alcançável.É razoável usar um erro de 2% como estimativa da taxa de erro ideal. A taxa de erro ideal pode ser ainda inferior a 2%, mas não pode ser superior, pois é possível que uma equipe de médicos atinja 2% de erro. Em contrapartida, não é razoável utilizar 5% ou 10% como estimativa da taxa de erro óptima, uma vez que sabemos que estas estimativas são necessariamente demasiado elevadas. Quando se trata de obter dados rotulados, talvez você não queira discutir cada imagem com uma equipe inteira de médicos, pois seu tempo é caro. Talvez você possa fazer com que um único médico júnior rotule a grande maioria dos casos e leve apenas os casos mais difíceis aos médicos mais experientes ou à equipe de médicos. Se o seu sistema está atualmente com 40% de erro, então não importa muito se você usa um médico júnior (erro de 10%) ou um médico experiente (erro de 5%) para rotular seus dados e fornecer intuições. Mas se o seu sistema já estiver com 10% de erro, definir a referência de nível humano como 2% fornecerá ferramentas melhores para continuar melhorando seu sistema. Página 68 Rascunho de aprendizado de máquina André Ng 35 Superando o desempenho de nível humano Você está trabalhando no reconhecimento de fala e possui um conjunto de dados de clipes de áudio. Suponha que seu conjunto de dados tenha muitos clipes de áudio barulhentos, de modo que até mesmo os humanos tenham 10% de erro. Suponha que seu sistema já atinja 8% de erro. Você consegue usar qualquer uma das três técnicas descritas no Capítulo 33 para continuar progredindo rapidamente? Se você conseguir identificar um subconjunto de dados em que os humanos superam significativamente o seu sistema, ainda poderá usar essas técnicas para impulsionar o progresso rápido. Por exemplo, suponha que seu sistema seja muito melhor do que o das pessoas no reconhecimento de fala em áudio barulhento, mas os humanos ainda sejam melhores na transcrição da fala falada muito rapidamente. Para o subconjunto de dados com fala falada rapidamente: 1.Você ainda pode obter transcrições de humanos com qualidade superior à saída do seu algoritmo. 2.Você pode recorrer à intuição humana para entender por que eles ouviram corretamente uma expressão falada rapidamente e o seu sistema não. 3.Você pode usar o desempenho de nível humano na fala falada rapidamente como uma meta de desempenho desejada. De forma mais geral, desde que existam exemplos de desenvolvimento em que os humanos estão certos e seu algoritmo está errado, muitas das técnicas descritas anteriormente serão aplicadas. Isso é verdade mesmo que, na média de todo o conjunto de desenvolvimento/teste, seu desempenho já esteja ultrapassando o desempenho de nível humano. Existem muitas aplicações importantes de aprendizado de máquina em que as máquinas superam o desempenho do nível humano. Por exemplo, as máquinas são melhores para prever classificações de filmes, quanto tempo leva para um carro de entrega chegar a algum lugar ou aprovar pedidos de empréstimo. Apenas um subconjunto de técnicas se aplica quando os humanos têm dificuldade em identificar exemplos em que o algoritmo está claramente errando. Consequentemente, o progresso é geralmente mais lento em problemas onde as máquinas já ultrapassam o desempenho do nível humano, enquanto o progresso é mais rápido quando as máquinas ainda estão a tentar alcançar os humanos. Página 69 Rascunho de aprendizado de máquina André Ng Treinando e testando em diferentes distribuições Página 70 Rascunho de aprendizado de máquina André Ng 36 Quando você deve treinar e testar em diferentes distribuições Os usuários do seu aplicativo de fotos de gatos enviaram 10.000 imagens, que você rotulou manualmente como contendo gatos ou não. Você também tem um conjunto maior de 200.000 imagens baixadas da Internet. Como você deve definir conjuntos de treinamento/desenvolvimento/teste? Como as 10.000 imagens do usuário refletem de perto a distribuição de probabilidade real dos dados nos quais você deseja ter um bom desempenho, você pode usar isso para seus conjuntos de desenvolvimento e teste. Se você estiver treinando um algoritmo de aprendizado profundo que consome muitos dados, poderá fornecer a ele 200.000 imagens adicionais da Internet para treinamento. Assim, seus conjuntos de treinamento e desenvolvimento/teste vêm de diferentes distribuições de probabilidade. Como isso afeta seu trabalho? Em vez de particionar nossos dados em conjuntos de treinamento/desenvolvimento/teste, poderíamos pegar todas as 210.000 imagens que temos e embaralhá-las aleatoriamente em conjuntos de treinamento/desenvolvimento/teste. Neste caso, todos os dados vêm da mesma distribuição. Mas eu não recomendo esse método, porque cerca de 205.000/210.000 ≈ 97,6% dos seus dados de desenvolvimento/teste viriam de imagens da Internet, o que não reflete a distribuição real na qual você deseja ter um bom desempenho. Lembre-se de nossa recomendação sobre a escolha de conjuntos de desenvolvimento/teste: Escolha conjuntos de desenvolvimento e teste para refletir os dados que você espera obter no futuro e deseja ter um bom desempenho. A maior parte da literatura acadêmica sobre aprendizado de máquina assume que o conjunto de treinamento, o conjunto de desenvolvimento e o conjunto de teste vêm todos da mesma distribuição.11Nos primeiros dias do aprendizado de máquina, os dados eram escassos. Normalmente tínhamos apenas um conjunto de dados extraído de alguma distribuição de probabilidade. Portanto, dividiríamos aleatoriamente esses dados em conjuntos de treinamento/desenvolvimento/teste, e a suposição de que todos os dados vinham da mesma fonte geralmente era satisfeita. Existem algumas pesquisas acadêmicas sobre treinamento e testes em diferentes distribuições. Os exemplos incluem 11 “adaptação de domínio”, “aprendizagem por transferência” e “aprendizagem multitarefa”. Mas ainda existe uma enorme lacuna entre teoria e prática. Se você treinar no conjunto de dados A e testar em algum tipo de dados muito diferente B, a sorte poderá ter um grande efeito no desempenho do seu algoritmo. (Aqui, “sorte” inclui os recursos projetados manualmente pelo pesquisador para a tarefa específica, bem como outros fatores que ainda não entendemos.) Isso torna difícil realizar o estudo acadêmico de treinamento e teste em diferentes distribuições em uma forma sistemática. Página 71 Rascunho de aprendizado de máquina André Ng Mas na era do big data, agora temos acesso a enormes conjuntos de treinamento, como imagens de gatos na Internet. Mesmo que o conjunto de treinamento venha de uma distribuição diferente do conjunto de desenvolvimento/teste, ainda queremos usá-lo para aprendizado, pois ele pode fornecer muitas informações. Para o exemplo do detector de gatos, em vez de colocar todas as 10.000 imagens enviadas pelo usuário nos conjuntos de desenvolvimento/teste, poderíamos colocar 5.000 nos conjuntos de desenvolvimento/teste. Podemos colocar os 5.000 exemplos restantes enviados pelos usuários no conjunto de treinamento. Dessa forma, seu conjunto de treinamento de 205.000 exemplos contém alguns dados provenientes de sua distribuição de desenvolvimento/teste junto com as 200.000 imagens da Internet. Discutiremos em um capítulo posterior por que esse método é útil. Vamos considerar um segundo exemplo. Suponha que você esteja construindo um sistema de reconhecimento de fala para transcrever endereços de ruas para um aplicativo móvel de mapa/navegação controlado por voz. Você tem 20.000 exemplos de usuários falando endereços. Mas você também tem 500.000 exemplos de outros clipes de áudio com usuários falando sobre outros tópicos. Você pode pegar 10.000 exemplos de endereços para os conjuntos de desenvolvimento/teste e usar os 10.000 restantes, mais os 500.000 exemplos adicionais, para treinamento. Continuaremos assumindo que seus dados de desenvolvimento e seus dados de teste vêm da mesma distribuição. Mas é importante entender que diferentes distribuições de treinamento e desenvolvimento/ teste oferecem alguns desafios especiais. Página 72 Rascunho de aprendizado de máquina André Ng 37 Como decidir se deseja usar todos os seus dados Suponha que o conjunto de treinamento do seu detector de gatos inclua 10.000 imagens enviadas pelo usuário. Esses dados vêm da mesma distribuição de um conjunto de desenvolvimento/teste separado e representam a distribuição na qual você deseja ter um bom desempenho. Você também tem 20.000 imagens adicionais baixadas da Internet. Você deve fornecer todas as 20.000 + 10.000 = 30.000 imagens ao seu algoritmo de aprendizagem como conjunto de treinamento ou descartar as 20.000 imagens da Internet por medo de distorcer seu algoritmo de aprendizagem? Ao usar gerações anteriores de algoritmos de aprendizagem (como recursos de visão computacional projetados à mão, seguidos por um classificador linear simples), havia um risco real de que a fusão dos dois tipos de dados causasse um desempenho pior. Assim, alguns engenheiros irão alertá-lo contra a inclusão das 20.000 imagens da internet. Mas na era moderna de algoritmos de aprendizagem poderosos e flexíveis – como grandes redes neurais – esse risco diminuiu bastante. Se você puder construir uma rede neural com um número grande o suficiente de unidades/ camadas ocultas, poderá adicionar com segurança as 20.000 imagens ao seu conjunto de treinamento. É mais provável que adicionar as imagens aumente seu desempenho. Esta observação se baseia no fato de que existe algum mapeamento x -> y que funciona bem para ambos os tipos de dados. Em outras palavras, existe algum sistema que insere uma imagem da Internet ou de um aplicativo móvel e prevê o rótulo com segurança, mesmo sem saber a origem da imagem. Adicionar 20.000 imagens adicionais tem os seguintes efeitos: 1.Ele fornece à sua rede neural mais exemplos de como os gatos são ou não. Isso é útil, pois as imagens da Internet e as imagens de aplicativos móveis enviadas pelo usuário compartilham algumas semelhanças. Sua rede neural pode aplicar parte do conhecimento adquirido em imagens da Internet em imagens de aplicativos móveis. 2.Isso força a rede neural a gastar parte de sua capacidade para aprender sobre propriedades específicas de imagens da Internet (como resolução mais alta, distribuições diferentes de como as imagens são enquadradas, etc.). Se essas propriedades diferirem muito das imagens de aplicativos móveis, ela irá “esgotar” parte da capacidade representacional da rede neural. Assim, há menos capacidade de reconhecimento de dados extraídos da distribuição de imagens de aplicativos móveis, que é o que realmente importa para você. Teoricamente, isso poderia prejudicar o desempenho dos seus algoritmos. Página 73 Rascunho de aprendizado de máquina André Ng Para descrever o segundo efeito em termos diferentes, podemos recorrer ao personagem fictício Sherlock Holmes, que diz que seu cérebro é como um sótão; ele tem apenas uma quantidade finita de espaço. Ele diz que “a cada acréscimo de conhecimento, você esquece algo que sabia antes. É da maior importância, portanto, não permitir que fatos inúteis excluam os úteis.”12 Felizmente, se você tiver a capacidade computacional necessária para construir uma rede neural grande o suficiente – ou seja, um sótão grande o suficiente – então isso não será uma preocupação séria. Você tem capacidade suficiente para aprender tanto com a Internet quanto com imagens de aplicativos móveis, sem que os dois tipos de dados concorram por capacidade. O “cérebro” do seu algoritmo é grande o suficiente para que você não precise se preocupar em ficar sem espaço no sótão. Mas se você não tiver uma rede neural grande o suficiente (ou outro algoritmo de aprendizado altamente flexível), deverá prestar mais atenção aos dados de treinamento que correspondem à distribuição do conjunto de desenvolvimento/teste. Se você acha que tem dados que não trazem nenhum benefício, você deve simplesmente omitir esses dados por motivos computacionais. Por exemplo, suponha que seus conjuntos de desenvolvimento/teste contenham principalmente imagens casuais de pessoas, lugares, pontos de referência, animais. Suponha que você também tenha uma grande coleção de documentos históricos digitalizados: Esses documentos não contêm nada parecido com um gato. Eles também parecem completamente diferentes da sua distribuição de desenvolvimento/teste. Não faz sentido incluir esses dados como exemplos negativos, porque o benefício do primeiro efeito acima é insignificante – não há quase nada que sua rede neural possa aprender com esses dados que possa aplicar à distribuição do seu conjunto de desenvolvimento/teste. Incluí-los desperdiçaria recursos computacionais e capacidade de representação da rede neural. 12 Um estudo em escarlate por Arthur Conan Doyle Página 74 Rascunho de aprendizado de máquina André Ng 38 Como decidir se deve incluir dados inconsistentes Suponha que você queira aprender a prever os preços das moradias na cidade de Nova York. Dado o tamanho de uma casa (característica de entrada x), você deseja prever o preço (rótulo alvo y). Os preços da habitação na cidade de Nova York são muito altos. Suponha que você tenha um segundo conjunto de dados de preços de moradias em Detroit, Michigan, onde os preços de moradias são muito mais baixos. Você deve incluir esses dados em seu conjunto de treinamento? Dado o mesmo tamanho x, o preço de uma casa y é muito diferente dependendo se ela está na cidade de Nova York ou em Detroit. Se você se preocupa apenas em prever os preços das moradias na cidade de Nova York, juntar os dois conjuntos de dados prejudicará seu desempenho. Neste caso, seria melhor deixar de fora os dados inconsistentes de Detroit.13 Qual a diferença entre este exemplo de Nova York x Detroit e o exemplo de aplicativo móvel x imagens de gatos da Internet? O exemplo da imagem do gato é diferente porque, dada uma imagem de entrada x, pode-se prever com segurança o rótulo y indicando se existe um gato, mesmo sem saber se a imagem é uma imagem da Internet ou de um aplicativo móvel. Ou seja, existe uma função f(x) que mapeia de forma confiável da entrada x para a saída alvo y, mesmo sem conhecer a origem de x. Assim, a tarefa de reconhecimento de imagens da internet é “consistente” com a tarefa de reconhecimento de imagens de aplicativos móveis. Isso significa que houve poucas desvantagens (além do custo computacional) em incluir todos os dados, e algumas possíveis vantagens significativas. Em contraste, os dados da cidade de Nova Iorque e de Detroit, Michigan, não são consistentes. Dado o mesmo x (tamanho da casa), o preço é muito diferente dependendo de onde fica a casa. Existe uma maneira de resolver o problema de os dados de Detroit serem inconsistentes com os dados da cidade de 13 Nova York, que é adicionar um recurso extra a cada exemplo de treinamento que indica a cidade. Dada uma entrada x – que agora especifica a cidade – o valor alvo de y agora é inequívoco. Porém, na prática não vejo isso sendo feito com frequência. Página 75 Rascunho de aprendizado de máquina André Ng 39 Dados de ponderação Suponha que você tenha 200.000 imagens da Internet e 5.000 imagens de usuários de seu aplicativo móvel. Há uma proporção de 40:1 entre o tamanho desses conjuntos de dados. Em teoria, desde que você construa uma enorme rede neural e treine-a por tempo suficiente em todas as 205.000 imagens, não há mal nenhum em tentar fazer com que o algoritmo tenha um bom desempenho tanto em imagens da Internet quanto em imagens móveis. Mas, na prática, ter 40 vezes mais imagens da Internet do que imagens de aplicativos móveis pode significar que você precisará gastar 40 vezes (ou mais) mais recursos computacionais para modelar ambas, em comparação com se você treinasse apenas com 5.000 imagens. Se você não tiver grandes recursos computacionais, poderá dar às imagens da Internet um peso muito menor como meio-termo. Por exemplo, suponha que seu objetivo de otimização seja um erro quadrático (esta não é uma boa escolha para uma tarefa de classificação, mas simplificará nossa explicação). Assim, nosso algoritmo de aprendizagem tenta otimizar: A primeira soma acima é superior a 5.000 imagens de celular e a segunda soma é superior a 200.000 imagens de internet. Em vez disso, você pode otimizar com um parâmetro adicional : Se você definir =1/40, o algoritmo daria peso igual às 5.000 imagens de celular e às 200.000 imagens de internet. Você também pode definir o parâmetro para outros valores, talvez ajustando o conjunto de desenvolvimento. Ao ponderar menos as imagens adicionais da Internet, você não precisa construir uma rede neural tão grande para garantir que o algoritmo funcione bem em ambos os tipos de tarefas. Este tipo de reponderação é necessário apenas quando você suspeita que os dados adicionais (imagens da Internet) têm uma distribuição muito diferente do conjunto de desenvolvimento/teste, ou se os dados adicionais são muito maiores que os dados que vieram da mesma distribuição que o conjunto de desenvolvimento/teste (imagens móveis). Página 76 Rascunho de aprendizado de máquina André Ng 40 Generalizando do conjunto de treinamento para o conjunto de desenvolvimento Suponha que você esteja aplicando ML em um ambiente onde o treinamento e as distribuições de desenvolvimento/teste são diferentes. Digamos que o conjunto de treinamento contenha imagens da Internet + imagens móveis e os conjuntos de desenvolvimento/teste contenham apenas imagens móveis. No entanto, o algoritmo não está funcionando bem: ele tem um erro de conjunto de desenvolvimento/teste muito maior do que você gostaria. Aqui estão algumas possibilidades do que pode estar errado: 1.Não funciona bem no conjunto de treinamento. Este é o problema do alto viés (evitável) na distribuição do conjunto de treinamento. 2.Funciona bem no conjunto de treinamento, mas não generaliza bem para dados inéditos extraído da mesma distribuição do conjunto de treinamento. Esta é uma variação alta. 3.Ele generaliza bem para novos dados extraídos da mesma distribuição do conjunto de treinamento, mas não para dados extraídos da distribuição do conjunto de desenvolvimento/teste. Chamamos esse problemaincompatibilidade de dados, pois é porque os dados do conjunto de treinamento não correspondem aos dados do conjunto de desenvolvimento/teste. Por exemplo, suponha que os humanos alcancem um desempenho quase perfeito na tarefa de reconhecimento de gatos. Seu algoritmo consegue isso: • Erro de 1% no conjunto de treinamento • Erro de 1,5% em dados extraídos da mesma distribuição do conjunto de treinamento que o algoritmo não viu • Erro de 10% no conjunto de desenvolvimento Nesse caso, você claramente tem um problema de incompatibilidade de dados. Para resolver isso, você pode tentar tornar os dados de treinamento mais semelhantes aos dados de desenvolvimento/teste. Discutiremos algumas técnicas para isso mais tarde. Para diagnosticar até que ponto um algoritmo sofre de cada um dos problemas 1 a 3 acima, será útil ter outro conjunto de dados. Especificamente, em vez de fornecer ao algoritmo todos os dados de treinamento disponíveis, você pode dividi-lo em dois subconjuntos: o conjunto de treinamento real no qual o algoritmo treinará e um conjunto separado, que chamaremos de conjunto “Desenvolvedor de treinamento”, que iremos não vai treinar. Agora você tem quatro subconjuntos de dados: Página 77 Rascunho de aprendizado de máquina André Ng • Conjunto de treinamento. Estes são os dados com os quais o algoritmo aprenderá (por exemplo, imagens da Internet + imagens móveis). Isso não precisa ser extraído da mesma distribuição com a qual realmente nos importamos (a distribuição do conjunto de desenvolvimento/teste). • Conjunto de desenvolvimento de treinamento: esses dados são extraídos da mesma distribuição do conjunto de treinamento (por exemplo, imagens da Internet + imagens móveis). Geralmente é menor que o conjunto de treinamento; ele só precisa ser grande o suficiente para avaliar e acompanhar o progresso do nosso algoritmo de aprendizagem. • Conjunto de desenvolvimento: é extraído da mesma distribuição do conjunto de teste e reflete a distribuição de dados nos quais nos preocupamos em ter um bom desempenho. (Por exemplo, imagens móveis.) • Conjunto de teste: é extraído da mesma distribuição do conjunto de desenvolvimento. (Por exemplo, imagens móveis.) Armado com esses quatro conjuntos de dados separados, agora você pode avaliar: • Erro de treinamento, avaliando no conjunto de treinamento. • A capacidade do algoritmo de generalizar para novos dados extraídos da distribuição do conjunto de treinamento, avaliando no conjunto de desenvolvimento de treinamento. • O desempenho do algoritmo na tarefa de seu interesse, avaliando os conjuntos de desenvolvimento e/ou teste. A maioria das diretrizes nos Capítulos 5 a 7 para escolher o tamanho do conjunto de desenvolvimento também se aplica ao conjunto de desenvolvimento de treinamento. Página 78 Rascunho de aprendizado de máquina André Ng 41 Identificando Erros de Viés, Variância e Incompatibilidade de Dados Suponha que os humanos alcancem um desempenho quase perfeito (≈0% de erro) na tarefa de detecção de gatos e, portanto, a taxa de erro ideal seja de cerca de 0%. Suponha que você tenha: • Erro de 1% no conjunto de treinamento. • Erro de 5% no conjunto de desenvolvimento de treinamento. • Erro de 5% no conjunto de desenvolvimento. O que isso diz a você? Aqui, você sabe que tem uma variância alta. As técnicas de redução de variância descritas anteriormente devem permitir que você progrida. Agora, suponha que seu algoritmo atinja: • Erro de 10% no conjunto de treinamento. • Erro de 11% no conjunto de desenvolvimento de treinamento. • Erro de 12% no conjunto de desenvolvimento. Isso indica que você tem um alto viés evitável no conjunto de treinamento. Ou seja, o algoritmo está indo mal no conjunto de treinamento. As técnicas de redução de preconceito devem ajudar. Nos dois exemplos acima, o algoritmo sofreu apenas um alto viés evitável ou alta variância. É possível que um algoritmo sofra de qualquer subconjunto de alto viés evitável, alta variância e incompatibilidade de dados. Por exemplo: • Erro de 10% no conjunto de treinamento. • Erro de 11% no conjunto de desenvolvimento de treinamento. • Erro de 20% no conjunto de desenvolvimento. Este algoritmo sofre de um alto viés evitável e de incompatibilidade de dados. No entanto, não sofre de grande variação na distribuição do conjunto de treinamento. Pode ser mais fácil entender como os diferentes tipos de erros se relacionam entre si, desenhando-os como entradas em uma tabela: Página 79 Rascunho de aprendizado de máquina André Ng Continuando com o exemplo do detector de imagem de gato, você pode ver que existem duas distribuições diferentes de dados no eixo x. No eixo y, temos três tipos de erro: erro de nível humano, erro em exemplos nos quais o algoritmo treinou e erro em exemplos nos quais o algoritmo não treinou. Podemos preencher as caixas com os diferentes tipos de erros que identificamos no capítulo anterior. Se desejar, você também pode preencher as duas caixas restantes nesta tabela: Você pode preencher a caixa superior direita (Desempenho de nível humano em imagens móveis) pedindo a alguns humanos que rotulem os dados de suas imagens móveis de gatos e meçam seus erros. Você pode preencher a próxima caixa pegando as imagens do gato móvel (Distribuição B) e colocando uma pequena fração no conjunto de treinamento para que a rede neural também aprenda com elas. Em seguida, você mede o erro do modelo aprendido nesse subconjunto de dados. O preenchimento dessas duas entradas adicionais pode, às vezes, fornecer informações adicionais sobre o que o algoritmo está fazendo nas duas distribuições diferentes (Distribuição A e B) de dados. Ao compreender quais tipos de erros o algoritmo mais sofre, você estará em melhor posição para decidir se deve se concentrar na redução do viés, na redução da variância ou na redução da incompatibilidade de dados. Página 80 Rascunho de aprendizado de máquina André Ng 42 Resolvendo a incompatibilidade de dados Suponha que você tenha desenvolvido um sistema de reconhecimento de fala que funcione muito bem no conjunto de treinamento e no conjunto de desenvolvimento de treinamento. No entanto, o desempenho é ruim no seu conjunto de desenvolvimento: você tem um problema de incompatibilidade de dados. O que você pode fazer? Eu recomendo que você: (i) Tente entender quais propriedades dos dados diferem entre o treinamento e as distribuições do conjunto de desenvolvimento. (ii) Tente encontrar mais dados de treinamento que correspondam melhor aos exemplos do conjunto de desenvolvimento com os quais seu algoritmo tem problemas.14 Por exemplo, suponha que você realize uma análise de erros no conjunto de desenvolvedores de reconhecimento de voz: você analisa manualmente 100 exemplos e tenta entender onde o algoritmo está cometendo erros. Você descobre que seu sistema funciona mal porque a maioria dos clipes de áudio no conjunto de desenvolvimento foi tirada dentro de um carro, enquanto a maioria dos exemplos de treinamento foi gravada em um fundo silencioso. O ruído do motor e da estrada pioram drasticamente o desempenho do seu sistema de fala. Nesse caso, você pode tentar adquirir mais dados de treinamento, incluindo clipes de áudio gravados em um carro. O objetivo da análise de erros é compreender as diferenças significativas entre o conjunto de treinamento e o conjunto de desenvolvimento, que é o que leva à incompatibilidade de dados. Se o seu treinamento e conjuntos de desenvolvimento de treinamento incluírem áudio gravado dentro de um carro, você também deverá verificar novamente o desempenho do seu sistema nesse subconjunto de dados. Se estiver indo bem com os dados do carro no conjunto de treinamento, mas não com os dados do carro no conjunto de desenvolvimento de treinamento, isso validará ainda mais a hipótese de que obter mais dados do carro ajudaria. É por isso que discutimos a possibilidade de incluir em seu conjunto de treinamento alguns dados extraídos da mesma distribuição de seu conjunto de desenvolvimento/ teste no capítulo anterior. Isso permite que você compare seu desempenho nos dados do carro no conjunto de treinamento com o conjunto de desenvolvimento/teste. Infelizmente, não há garantias neste processo. Por exemplo, se você não tiver como obter mais dados de treinamento que correspondam melhor aos dados do conjunto de desenvolvedores, talvez não tenha um caminho claro para melhorar o desempenho. Há também algumas pesquisas sobre “adaptação de domínio” – como treinar um algoritmo em uma distribuição e 14 generalizá-lo para uma distribuição diferente. Esses métodos são normalmente aplicáveis apenas em tipos especiais de problemas e são muito menos usados do que as ideias descritas neste capítulo. Página 81 Rascunho de aprendizado de máquina André Ng 43 Síntese de dados artificiais Seu sistema de fala precisa de mais dados que soem como se tivessem sido obtidos de dentro de um carro. Em vez de coletar muitos dados enquanto você dirige, pode haver uma maneira mais fácil de obter esses dados: sintetizando-os artificialmente. Suponha que você obtenha uma grande quantidade de clipes de áudio de ruído de carro/estrada. Você pode baixar esses dados de vários sites. Suponha que você também tenha um grande grupo de treinamento de pessoas falando em uma sala silenciosa. Se você pegar um clipe de áudio de uma pessoa falando e “adicionar” a ele um clipe de áudio de ruído de carro/ estrada, você obterá um clipe de áudio que soa como se essa pessoa estivesse falando em um carro barulhento. Usando esse processo, você pode “sintetizar” enormes quantidades de dados que parecem ter sido coletados dentro de um carro. De forma mais geral, há várias circunstâncias em que a síntese artificial de dados permite criar um enorme conjunto de dados que corresponda razoavelmente ao conjunto de desenvolvimento. Vamos usar o detector de imagens de gatos como segundo exemplo. Você percebe que as imagens do conjunto de desenvolvedores têm muito mais desfoque de movimento porque tendem a vir de usuários de celulares que movem levemente o telefone enquanto tiram a foto. Você pode obter imagens não desfocadas do conjunto de treinamento de imagens da Internet e adicionar desfoque de movimento simulado a elas, tornando-as mais semelhantes ao conjunto de desenvolvimento. Tenha em mente que a síntese artificial de dados tem os seus desafios: por vezes é mais fácil criar dados sintéticos que pareçam realistas para uma pessoa do que criar dados que pareçam realistas para um computador. Por exemplo, suponha que você tenha 1.000 horas de dados de treinamento de fala, mas apenas 1 hora de ruído de carro. Se você usar repetidamente a mesma 1 hora de ruído do carro com porções diferentes das 1.000 horas originais de dados de treinamento, você terminará com um conjunto de dados sintético onde o mesmo ruído do carro é repetido continuamente. Embora uma pessoa que ouça este áudio provavelmente não seja capaz de dizer – todo ruído de carro soa igual para a maioria de nós – é possível que um algoritmo de aprendizagem se “ajuste demais” ao ruído de 1 hora do carro. Assim, poderia generalizar mal para um novo clipe de áudio onde o ruído do carro soa diferente. Alternativamente, suponha que você tenha 1.000 horas únicas de ruído de carro, mas tudo isso foi obtido de apenas 10 carros diferentes. Nesse caso, é possível que um algoritmo se “ajuste demais” a esses 10 carros e tenha um desempenho ruim se for testado no áudio de um carro diferente. Infelizmente, esses problemas podem ser difíceis de detectar. Página 82 Rascunho de aprendizado de máquina André Ng Para dar mais um exemplo, suponha que você esteja construindo um sistema de visão computacional para reconhecer carros. Suponha que você faça parceria com uma empresa de videogame que possui modelos de computação gráfica de vários carros. Para treinar seu algoritmo, você usa os modelos para gerar imagens sintéticas de carros. Mesmo que as imagens sintetizadas pareçam muito realistas, esta abordagem (que foi proposta de forma independente por muitas pessoas) provavelmente não funcionará bem. O videogame pode ter cerca de 20 designs de carros em todo o videogame. É muito caro construir um modelo 3D de um carro; se você estivesse jogando, provavelmente não notaria que está vendo os mesmos carros repetidamente, talvez apenas pintados de forma diferente. Ou seja, esses dados parecem muito realistas para você. Mas comparado ao conjunto de todos os carros nas estradas – e, portanto, ao que você provavelmente verá nos conjuntos de desenvolvimento/teste – este conjunto de 20 carros sintetizados captura apenas uma fração minúscula da distribuição mundial de carros. Portanto, se todos os seus 100.000 exemplos de treinamento vierem desses 20 carros, seu sistema se “ajustará demais” a esses 20 designs de carros específicos e não conseguirá generalizar bem para conjuntos de desenvolvimento/teste que incluam outros designs de carros. Ao sintetizar dados, pense se você está realmente sintetizando um conjunto representativo de exemplos. Tente evitar fornecer aos dados sintetizados propriedades que possibilitem a um algoritmo de aprendizagem distinguir exemplos sintetizados de exemplos não sintetizados - como se todos os dados sintetizados viessem de um dos 20 designs de carros ou todo o áudio sintetizado viesse de apenas 1 hora. do barulho do carro. Este conselho pode ser difícil de seguir. Ao trabalhar na síntese de dados, minhas equipes às vezes levam semanas até produzirmos dados com detalhes suficientemente próximos da distribuição real para que os dados sintetizados tenham um efeito significativo. Mas se você conseguir acertar os detalhes, poderá acessar repentinamente um conjunto de treinamento muito maior do que antes. Página 83 Rascunho de aprendizado de máquina André Ng Depuração inferência algoritmos Página 84 Rascunho de aprendizado de máquina André Ng 44 O teste de verificação de otimização Suponha que você esteja construindo um sistema de reconhecimento de fala. Seu sistema funciona inserindo um clipe de áudioUm, e calculando alguma pontuaçãoUm( S) para cada frase de saída possívelS. Por exemplo, você pode tentar estimar a pontuaçãoUm( S) =P( S| Um), a probabilidade de que a transcrição de saída correta seja a sentençaS, dado que o áudio de entrada foiA. Dada uma maneira de calcular a pontuaçãoUm( S), você ainda precisa encontrar a frase em inglêsSque o maximiza: Como você calcula o “arg max” acima? Se a língua inglesa tem 50.000 palavras, então existem (50.000) Npossíveis sentenças de comprimentoN- muitos para serem enumerados exaustivamente. Então, você precisa aplicar um algoritmo de busca aproximado, para tentar encontrar o valor deSque otimiza (maximiza) a pontuaçãoUm( S). Um exemplo de algoritmo de pesquisa é “beam search”, que mantém apenasK principais candidatos durante o processo de pesquisa. (Para os propósitos deste capítulo, você não precisa entender os detalhes da pesquisa de feixe.) Algoritmos como esse não garantem encontrar o valor de Sque maximiza a pontuaçãoUm( S). Suponha que um clipe de áudioUmregistra alguém dizendo “Eu adoro aprendizado de máquina”. Mas em vez de gerar a transcrição correta, seu sistema exibe o incorreto “Eu amo robôs”. Existem agora duas possibilidades para o que deu errado: 1.Problema de algoritmo de pesquisa . O algoritmo de pesquisa aproximada (pesquisa de feixe) não conseguiu encontrar o valor deSque maximiza a pontuaçãoUm( S). 2.Problema objetivo (função de pontuação). Nossas estimativas para pontuação Um( S) =P( S| Um) eram imprecisos. Em particular, a nossa escolha de Pontuação Um( S) não conseguiu reconhecer que “Eu adoro aprendizado de máquina” é a transcrição correta. Dependendo de qual delas foi a causa da falha, você deve priorizar seus esforços de maneira muito diferente. Se o problema for o número 1, você deve trabalhar para melhorar o algoritmo de pesquisa. Se o problema for o número 2, você deve trabalhar no algoritmo de aprendizagem que estima a pontuaçãoUm( S). Diante dessa situação, alguns pesquisadores decidirão aleatoriamente trabalhar no algoritmo de busca; outros trabalharão aleatoriamente em uma maneira melhor de aprender os valores da pontuaçãoUm(S). Mas, a menos que você saiba qual delas é a causa subjacente do erro, seus esforços poderão ser desperdiçados. Como você pode decidir de forma mais sistemática no que trabalhar? Página 85 Rascunho de aprendizado de máquina André Ng Deixe Sforaseja a transcrição de saída (“Eu amo robôs”). Seja S* a transcrição correta (“Eu adoro aprendizado de máquina”). Para entender se o problema é #1 ou #2 acima, você pode executar oTeste de verificação de otimização : Primeiro, calcule a pontuaçãoUm( S*) e pontuação Um( Sfora). Em seguida, verifique se a pontuaçãoUm( S* ) >PontuaçãoUm( Sfora). Existem duas possibilidades: Caso 1: Pontuação Um(S*) > Pontuação Um(Sfora) Neste caso, seu algoritmo de aprendizagem deu corretamente a S* uma pontuação mais alta do que S fora. No entanto, nosso algoritmo de busca aproximado escolheu S foraem vez de S*. Isso indica que seu algoritmo de busca aproximado não está conseguindo escolher o valor de S que maximiza PontuaçãoUm( S). Nesse caso, o teste de Verificação de Otimização informa que você tem um problema de algoritmo de busca e deve focar nisso. Por exemplo, você pode tentar aumentar a largura do feixe de busca do feixe. Caso 2: Pontuação Um(S*) ≤ Pontuação Um(Sfora) Nesse caso, você sabe que a maneira como está calculando a pontuaçãoUm(.) é o culpado: falha em atribuir uma pontuação estritamente mais alta à saída correta S* do que o incorretoSfora. O teste de verificação de otimização informa que você tem um problema de função objetiva (pontuação). Portanto, você deve se concentrar em melhorar a forma como aprende ou aproxima a pontuaçãoUm( S) para frases diferentesS. Nossa discussão se concentrou em um único exemplo. Para aplicar o teste de verificação de otimização na prática, você deve examinar os erros em seu conjunto de desenvolvimento. Para cada erro, você testaria se a pontuaçãoUm (S*) > Pontuação Um(Sfora). Cada exemplo de desenvolvimento para o qual esta desigualdade é válida será marcado como um erro causado pelo algoritmo de otimização. Cada exemplo para o qual isso não se aplica (Pontuação Um (S*) ≤ Pontuação Um(Sfora)) é contado como um erro devido à maneira como você está calculando a pontuação Um(.). Por exemplo, suponha que você descubra que 95% dos erros foram devidos à função de pontuação Score Um (.), e apenas 5% devido ao algoritmo de otimização. Agora você sabe que não importa o quanto melhore seu procedimento de otimização, você eliminaria realisticamente apenas cerca de 5% de nossos erros. Portanto, você deve se concentrar em melhorar a forma como estima a pontuaçãoUm(.). Página 86 Rascunho de aprendizado de máquina André Ng 45 Forma geral de teste de verificação de otimização Você pode aplicar o teste de verificação de otimização quando, com alguma informaçãox, você sabe como calcular a pontuaçãox( sim) que indica quão boa é uma respostavocêé para uma entradax. Além disso, você está usando um algoritmo aproximado para tentar encontrar arg max vocêPontuaçãox( sim) ,mas suspeite que o algoritmo de busca às vezes não consegue encontrar o máximo. Em nosso exemplo anterior de reconhecimento de fala,x = UMAera um clipe de áudio ey = Sfoi a transcrição de saída. Suponha que y* seja a saída “correta”, mas o algoritmo produz y fora. Então o teste principal é medir se a pontuaçãox(s*) > Pontuação x(vocêfora). Se esta desigualdade se mantiver, culparemos o algoritmo de otimização pelo erro. Consulte o capítulo anterior para ter certeza de que entendeu a lógica por trás disso. Caso contrário, culpamos o cálculo da pontuaçãox(s). Vejamos mais um exemplo. Suponha que você esteja construindo um sistema de tradução automática de chinês para inglês. Seu sistema funciona inserindo uma frase em chinêsC, e calculando alguma pontuaçãoC( E) para cada tradução possívelE. Por exemplo, você pode usar Pontuação C( E) = P( E| C), a probabilidade da tradução ser E dado que a sentença de entrada eraC. Seu algoritmo traduz frases tentando calcular: No entanto, o conjunto de todas as sentenças possíveis em inglêsEé muito grande, então você depende de um algoritmo de pesquisa heurística. Suponha que seu algoritmo produza uma tradução incorretaEforaem vez de alguma tradução corretaE*. Em seguida, o teste de verificação de otimização solicitará que você calcule se a pontuaçãoC( E*) > PontuaçãoC( Eó fora). Se esta desigualdade for válida, então a pontuaçãoC(.) reconheceu corretamente E* como uma saída superior a Efora; portanto, você atribuiria esse erro ao algoritmo de pesquisa aproximado. Caso contrário, você atribui esse erro ao cálculo da pontuaçãoC(.). É um “padrão de design” muito comum em IA aprender primeiro uma função de pontuação aproximada Pontuação x(.), então use um algoritmo de maximização aproximado. Se você conseguir identificar esse padrão, poderá usar o teste de verificação de otimização para entender a origem dos erros. Página 87 Rascunho de aprendizado de máquina André Ng 46 Exemplo de aprendizagem por reforço Suponha que você esteja usando aprendizado de máquina para ensinar um helicóptero a realizar manobras complexas. Aqui está uma foto de lapso de tempo de um helicóptero controlado por computador executando um pouso com o motor desligado. Isso é chamado de manobra de “autorotação”. Ele permite que helicópteros pousem mesmo que seu motor falhe inesperadamente. Os pilotos humanos praticam esta manobra como parte do seu treinamento. Seu objetivo é usar um algoritmo de aprendizagem para pilotar o helicóptero através de uma trajetóriaTisso termina em um pouso seguro. Para aplicar o aprendizado por reforço, você deve desenvolver uma “função de recompensa”R (.) que dá uma pontuação que mede quão boa é cada trajetória possível Té. Por exemplo, seTresulta na queda do helicóptero, então talvez a recompensa sejaR(T) = -1.000 – uma enorme recompensa negativa. Uma trajetória Tresultando em um pouso seguro pode resultar em um resultado positivoR(T) com o valor exato dependendo de quão suave foi o pouso. A função de recompensaR (.) é normalmente escolhido à mão para quantificar quão desejáveis são diferentes trajetórias.Tsão. Ele tem que avaliar o quão difícil foi o pouso, se o helicóptero pousou exatamente no local desejado, quão difícil foi a descida para os passageiros e assim por diante. Não é fácil projetar boas funções de recompensa. Página 88 Rascunho de aprendizado de máquina André Ng Dada uma função de recompensaR(T), o trabalho do algoritmo de aprendizagem por reforço é controlar o helicóptero para que ele atinja o máximoTR(T).H no entanto, algoritmos de aprendizagem por reforço fazer muitas aproximações e pode não conseguir alcançar esta maximização. Suponha que você tenha escolhido alguma recompensaR(.) e executei seu algoritmo de aprendizagem. No entanto, seu desempenho parece muito pior do que o do piloto humano – os pousos são mais acidentados e parecem menos seguros do que um piloto humano consegue. Como você pode saber se a falha está no algoritmo de aprendizagem por reforço - que está tentando realizar uma trajetória que atinge o máximoT R(T)- ou se a falha for da função de recompensa - que tenta medir e também especificar a compensação ideal entre os solavancos do percurso e a precisão do local de pouso? Para aplicar o teste de verificação de otimização, vamosThumanoseja a trajetória alcançada pelo piloto humano, e deixeTforaseja a trajetória alcançada pelo algoritmo. De acordo com nossa descrição acima,Thumanoé uma trajetória superior aTfora. Assim, o teste chave é o seguinte: É verdade queR ( Thumano)>R ( Tfora)? Caso 1: Se esta desigualdade for válida, então a função de recompensaR (.) está classificando corretamenteT como superior aTfora. Mas nosso algoritmo de aprendizagem por reforço está encontrando o inferiorTó fora. humano Isso sugere que vale a pena trabalhar para melhorar nosso algoritmo de aprendizagem por reforço. Caso 2: A desigualdade não é válida: R ( Thumano) ≤R ( Tfora). Isso significaR (.) atribui uma pontuação pior para T mesmo que seja a trajetória superior. Você deve trabalhar para melhorarR (.) para melhor capturar as humano compensações que correspondem a um bom pouso. Muitos aplicativos de aprendizado de máquina têm esse “padrão” de otimização de uma função de pontuação aproximada Pontuação x(.) usando um algoritmo de busca aproximado. Às vezes, não há entrada especificadax, então isso se reduz a apenas Score(.). Em nosso exemplo acima, a função de pontuação era a função de recompensa Score( T)=R( T), e o algoritmo de otimização foi o algoritmo de aprendizagem por reforço tentando executar uma boa trajetóriaT. Uma diferença entre este e os exemplos anteriores é que, em vez de comparar com um resultado “ótimo”, você estava comparando com o desempenho em nível humano.Thumano.Nós assumimosThumanoé muito bom, mesmo que não seja o ideal. Em geral, contanto que você tenha algum y* (neste exemplo, T humano ) que é uma saída superior ao desempenho do seu algoritmo de aprendizagem atual – mesmo que não seja a saída “ideal” – então o teste de Verificação de Otimização pode indicar se é mais promissor melhorar o algoritmo de otimização ou a função de pontuação. Página 89 Rascunho de aprendizado de máquina André Ng De ponta a ponta aprendizagem profunda Página 90 Rascunho de aprendizado de máquina André Ng 47 A ascensão da aprendizagem de ponta a ponta Suponha que você queira construir um sistema para examinar análises de produtos on-line e informar automaticamente se o redator gostou ou não daquele produto. Por exemplo, você espera reconhecer a seguinte avaliação como altamente positiva: Este é um ótimo esfregão! e o seguinte como altamente negativo: Este esfregão é de baixa qualidade - me arrependo de comprá-lo. O problema de reconhecer opiniões positivas versus negativas é chamado de “classificação de sentimento”. Para construir este sistema, você pode construir um “pipeline” de dois componentes: 1. Analisador: Sistema que anota o texto com informações que identificam as palavras mais importantes.15Por exemplo, você pode usar o analisador para rotular todos os adjetivos e substantivos. Você obteria, portanto, o seguinte texto anotado: Este é um ótimoAdjetivoesfregãoSubstantivo! 2. Classificador de sentimento: um algoritmo de aprendizagem que toma como entrada o texto anotado e prevê o sentimento geral. A anotação do analisador pode ajudar muito esse algoritmo de aprendizado: ao dar aos adjetivos um peso maior, seu algoritmo será capaz de aprimorar rapidamente as palavras importantes, como “ótimo”, e ignorar palavras menos importantes, como “isto”. Podemos visualizar seu “pipeline” de dois componentes da seguinte forma: Tem havido uma tendência recente de substituição dos sistemas de pipeline por um único algoritmo de aprendizagem. Umalgoritmo de aprendizagem ponta a pontapara esta tarefa simplesmente pegaria como entrada o texto original e bruto “Este é um ótimo esfregão!”, e tentaria reconhecer diretamente o sentimento: Um analisador fornece uma anotação do texto muito mais rica do que esta, mas esta descrição simplificada será suficiente 15 para explicar o aprendizado profundo de ponta a ponta. Página 91 Rascunho de aprendizado de máquina André Ng As redes neurais são comumente usadas em sistemas de aprendizagem ponta a ponta. O termo “ponta a ponta” refere-se ao fato de que estamos pedindo ao algoritmo de aprendizagem para ir diretamente da entrada para a saída desejada. Ou seja, o algoritmo de aprendizagem conecta diretamente a “extremidade de entrada” do sistema à “extremidade de saída”. Em problemas onde os dados são abundantes, os sistemas ponta a ponta têm sido notavelmente bem-sucedidos. Mas nem sempre são uma boa escolha. Os próximos capítulos darão mais exemplos de sistemas ponta a ponta, bem como conselhos sobre quando você deve ou não usá-los. Página 92 Rascunho de aprendizado de máquina André Ng 48 Mais exemplos de aprendizagem ponta a ponta Suponha que você queira construir um sistema de reconhecimento de fala. Você pode construir um sistema com três componentes: Os componentes funcionam da seguinte forma: 1.Recursos de computação: extraia recursos projetados manualmente, como recursos MFCC (coeficientes cepstrum de frequência Mel), que tentam capturar o conteúdo de um enunciado enquanto desconsideram propriedades menos relevantes, como o tom do locutor. 2.Reconhecedor de fonemas: alguns linguistas acreditam que existem unidades básicas de som chamadas “fonemas”. Por exemplo, o som inicial “k” em “keep” é o mesmo fonema que o som “c” em “cake”. Este sistema tenta reconhecer os fonemas no clipe de áudio. 3.Reconhecedor final: pegue a sequência de fonemas reconhecidos e tente juntá-los em uma transcrição de saída. Em contraste, um sistema ponta a ponta pode inserir um clipe de áudio e tentar gerar a transcrição diretamente: Até agora, descrevemos apenas “pipelines” de aprendizado de máquina que são completamente lineares: a saída é passada sequencialmente de um estágio para o próximo. Pipelines podem ser mais complexos. Por exemplo, aqui está uma arquitetura simples para um carro autônomo: Página 93 Rascunho de aprendizado de máquina André Ng Possui três componentes: um detecta outros carros usando as imagens da câmera; um detecta pedestres; em seguida, um componente final planeja um caminho para nosso próprio carro que evite carros e pedestres. Nem todos os componentes de um pipeline precisam ser aprendidos. Por exemplo, a literatura sobre “planejamento do movimento do robô” possui numerosos algoritmos para a etapa final de planejamento do caminho do carro. Muitos desses algoritmos não envolvem aprendizagem. Em contraste, uma abordagem ponta a ponta pode tentar receber as entradas do sensor e gerar diretamente a direção da direção: Embora a aprendizagem ponta a ponta tenha tido muitos sucessos, nem sempre é a melhor abordagem. Por exemplo, o reconhecimento de fala ponta a ponta funciona bem. Mas sou cético quanto ao aprendizado de ponta a ponta para direção autônoma. Os próximos capítulos explicam o porquê. Página 94 Rascunho de aprendizado de máquina André Ng 49 Prós e contras da aprendizagem ponta a ponta Considere o mesmo pipeline de fala do nosso exemplo anterior: Muitas partes deste pipeline foram “projetadas manualmente”: • MFCCs são um conjunto de recursos de áudio projetados à mão. Embora forneçam um resumo razoável da entrada de áudio, eles também simplificam o sinal de entrada, descartando algumas informações. • Os fonemas são uma invenção dos linguistas. Eles são uma representação imperfeita dos sons da fala. Na medida em que os fonemas são uma aproximação pobre da realidade, forçar um algoritmo a usar uma representação de fonemas limitará o desempenho do sistema de fala. Esses componentes projetados manualmente limitam o desempenho potencial do sistema de fala. No entanto, permitir componentes projetados manualmente também traz algumas vantagens: • Os recursos do MFCC são robustos para algumas propriedades da fala que não afetam o conteúdo, como o tom do orador. Assim, eles ajudam a simplificar o problema do algoritmo de aprendizagem. • Na medida em que os fonemas são uma representação razoável da fala, eles também podem ajudar o algoritmo de aprendizagem a compreender os componentes sonoros básicos e, portanto, melhorar o seu desempenho. Ter mais componentes projetados manualmente geralmente permite que um sistema de fala aprenda com menos dados. O conhecimento projetado manualmente, capturado por MFCCs e fonemas, “suplementa” o conhecimento que nosso algoritmo adquire a partir dos dados. Quando não temos muitos dados, esse conhecimento é útil. Agora, considere o sistema ponta a ponta: Página 95 Rascunho de aprendizado de máquina André Ng Este sistema carece de conhecimento de engenharia manual. Assim, quando o conjunto de treinamento é pequeno, ele pode ter um desempenho pior do que o pipeline projetado manualmente. No entanto, quando o conjunto de treinamento é grande, ele não é prejudicado pelas limitações de um MFCC ou de uma representação baseada em fonemas. Se o algoritmo de aprendizagem for uma rede neural grande o suficiente e for treinado com dados de treinamento suficientes, ele terá potencial para funcionar muito bem e talvez até se aproximar da taxa de erro ideal. Os sistemas de aprendizagem ponta a ponta tendem a funcionar bem quando há muitos dados rotulados para “ambas as extremidades” – a extremidade de entrada e a extremidade de saída. Neste exemplo, exigimos um grande conjunto de dados de pares (áudio, transcrição). Quando este tipo de dados não estiver disponível, aborde a aprendizagem de ponta a ponta com muito cuidado. Se você estiver trabalhando em um problema de aprendizado de máquina em que o conjunto de treinamento é muito pequeno, a maior parte do conhecimento do seu algoritmo terá que vir do seu insight humano. Ou seja, dos seus componentes de “engenharia manual”. Se você optar por não usar um sistema ponta a ponta, terá que decidir quais são as etapas do seu pipeline e como elas devem ser conectadas. Nos próximos capítulos, daremos algumas sugestões para projetar tais pipelines. Página 96 Rascunho de aprendizado de máquina André Ng 50 Escolhendo componentes de pipeline: Disponibilidade de dados Ao construir um sistema de pipeline completo, quais são os bons candidatos para os componentes do pipeline? A maneira como você projeta o pipeline terá um grande impacto no desempenho geral do sistema. Um fator importante é se você pode coletar dados facilmente para treinar cada um dos componentes. Por exemplo, considere esta arquitetura de direção autônoma: Você pode usar o aprendizado de máquina para detectar carros e pedestres. Além disso, não é difícil obter dados para estes: existem numerosos conjuntos de dados de visão computacional com um grande número de carros e pedestres rotulados. Você também pode usar crowdsourcing (como Amazon Mechanical Turk) para obter conjuntos de dados ainda maiores. Portanto, é relativamente fácil obter dados de treinamento para construir um detector de automóveis e um detector de pedestres. Em contraste, considere uma abordagem pura de ponta a ponta: Para treinar este sistema, precisaríamos de um grande conjunto de dados de pares (imagem, direção de direção). É muito demorado e caro fazer com que as pessoas dirijam carros e registrem a direção da direção para coletar esses dados. Você precisa de uma frota de carros especialmente instrumentados e de muita condução para cobrir uma ampla gama de cenários possíveis. Isso torna um sistema ponta a ponta difícil de treinar. É muito mais fácil obter um grande conjunto de dados de imagens rotuladas de carros ou pedestres. De forma mais geral, se houver muitos dados disponíveis para treinar “módulos intermediários” de um pipeline (como um detector de carros ou um detector de pedestres), então você pode considerar usar um Página 97 Rascunho de aprendizado de máquina André Ng pipeline com vários estágios. Essa estrutura poderia ser superior porque você poderia usar todos os dados disponíveis para treinar os módulos intermediários. Até que mais dados de ponta a ponta estejam disponíveis, acredito que a abordagem não ponta a ponta é significativamente mais promissora para a condução autônoma: sua arquitetura corresponde melhor à disponibilidade de dados. Página 98 Rascunho de aprendizado de máquina André Ng 51 Escolhendo componentes do pipeline: simplicidade da tarefa Além da disponibilidade de dados, você também deve considerar um segundo fator ao escolher os componentes de um pipeline: quão simples são as tarefas resolvidas pelos componentes individuais? Você deve tentar escolher componentes de pipeline que sejam individualmente fáceis de construir ou aprender. Mas o que significa um componente ser “fácil” de aprender? Considere estas tarefas de aprendizado de máquina, listadas em ordem crescente de dificuldade: 1.Classificando se uma imagem está superexposta (como no exemplo acima) 2. Classificar se uma imagem foi tirada em ambiente interno ou externo 3. Classificando se uma imagem contém um gato 4. Classificar se uma imagem contém um gato com pelo preto e branco 5. Classificar se uma imagem contém um gato siamês (uma raça específica de gato) Cada uma delas é uma tarefa de classificação de imagem binária: você precisa inserir uma imagem e gerar 0 ou 1. Mas as tarefas anteriores na lista parecem muito “mais fáceis” para uma rede neural aprender. Você poderá aprender as tarefas mais fáceis com menos exemplos de treinamento. O aprendizado de máquina ainda não possui uma boa definição formal do que torna uma tarefa fácil ou difícil. Com o surgimento do aprendizado profundo e das redes neurais multicamadas, às vezes dizemos que uma 16 tarefa é “fácil” se puder ser realizada com menos etapas de computação (correspondendo a uma rede neural superficial) e “difícil” se exigir mais computação. etapas (exigindo uma rede neural mais profunda). Mas estas são definições informais. A teoria da informação tem o conceito de “Complexidade de Kolmogorov”, que diz que a complexidade de uma função aprendida é o 16 comprimento do menor programa de computador que pode produzir essa função. No entanto, este conceito teórico encontrou poucas aplicações práticas em IA. Veja também: https://en.wikipedia.org/wiki/Kolmogorov_complexity Página 99 Rascunho de aprendizado de máquina André Ng Se você for capaz de realizar uma tarefa complexa e dividi-la em subtarefas mais simples, ao codificar explicitamente as etapas das subtarefas, você estará fornecendo ao algoritmo conhecimento prévio que pode ajudá-lo a aprender uma tarefa com mais eficiência. Suponha que você esteja construindo um detector de gatos siameses. Esta é a arquitetura pura de ponta a ponta: Por outro lado, você pode usar alternativamente um pipeline com duas etapas: A primeira etapa (detector de gatos) detecta todos os gatos na imagem. Página 100 Rascunho de aprendizado de máquina André Ng A segunda etapa então passa imagens recortadas de cada um dos gatos detectados (um de cada vez) para um classificador de espécies de gatos e, finalmente, gera 1 se algum dos gatos detectados for um gato siamês. Em comparação com o treinamento de um classificador puramente ponta a ponta usando apenas rótulos 0/1, cada um dos dois componentes do pipeline – o detector de gatos e o classificador de raças de gatos – parece muito mais fácil de aprender e exigirá significativamente menos dados.17 Se você estiver familiarizado com algoritmos práticos de detecção de objetos, reconhecerá que eles não aprendem apenas com rótulos 17 de imagem 0/1, mas são treinados com caixas delimitadoras fornecidas como parte dos dados de treinamento. Uma discussão sobre eles está além do escopo deste capítulo. Veja a especialização Deep Learning no Coursera ( http://deeplearning.ai ) se quiser saber mais sobre esses algoritmos. Página 101 Rascunho de aprendizado de máquina André Ng Como exemplo final, vamos revisitar o pipeline de condução autônoma. Ao usar esse pipeline, você informa ao algoritmo que existem três etapas principais para dirigir: (1) Detectar outros carros, (2) Detectar pedestres e (3) Planejar um caminho para seu carro. Além disso, cada uma delas é uma função relativamente mais simples – e pode, portanto, ser aprendida com menos dados – do que a abordagem puramente ponta a ponta. Em resumo, ao decidir quais devem ser os componentes de um pipeline, tente construir um pipeline onde cada componente seja uma função relativamente “simples” que possa, portanto, ser aprendida apenas com uma quantidade modesta de dados. Página 102 Rascunho de aprendizado de máquina André Ng 52 Aprendendo diretamente com resultados ricos Um algoritmo de classificação de imagem inserirá uma imagemxe produza um número inteiro indicando a categoria do objeto. Em vez disso, um algoritmo pode produzir uma frase inteira descrevendo a imagem? Por exemplo: x= você= “Um ônibus amarelo dirigindo por uma estrada com árvores verdes e grama verde no fundo." Aplicações tradicionais de aprendizagem supervisionada aprenderam uma funçãoh: X→ S, onde a saída você geralmente era um número inteiro ou um número real. Por exemplo: X Problema S Classificação de spam E-mail Spam/Não é spam (0/1) Reconhecimento de imagem Imagem Rótulo inteiro Previsão do preço da habitação Características da casa Preço em dólares Recomendação de produto Recursos do produto e do usuário Chance de compra Um dos desenvolvimentos mais interessantes no aprendizado profundo de ponta a ponta é que ele nos permite aprender diretamentevocêque são muito mais complexos que um número. No exemplo de legenda de imagem acima, você pode fazer com que uma rede neural insira uma imagem ( x) e gerar diretamente uma legenda ( você). Página 103 Rascunho de aprendizado de máquina André Ng Aqui estão mais exemplos: X Problema S Citação de exemplo Legendagem de imagens Imagem Texto Mao et al., 2014 Maquina de tradução texto em inglês Texto francês Suskever et al., 2014 Resposta a perguntas Par (Texto, Pergunta) Texto de resposta Bordes et al., 2015 Reconhecimento de fala Áudio Transcrição Hannun et al., 2015 TTS Características do texto Áudio van der Oord et al., 2016 Esta é uma tendência acelerada no aprendizado profundo: quando você tem os pares rotulados corretos (entrada, saída), às vezes você pode aprender de ponta a ponta, mesmo quando a saída é uma frase, uma imagem, áudio ou outras saídas que são mais ricas. do que um único número. Página 104 Rascunho de aprendizado de máquina André Ng Erro de análise por partes Página 105 Rascunho de aprendizado de máquina André Ng 53 Análise de erros por peças Suponha que seu sistema seja criado usando um pipeline complexo de aprendizado de máquina e você queira melhorar o desempenho do sistema. Qual parte do pipeline você deve trabalhar para melhorar? Ao atribuir erros a partes específicas do pipeline, você pode decidir como priorizar seu trabalho. Vamos usar nosso exemplo de classificador de gato siamês: A primeira parte, o detector de gatos, detecta gatos e os recorta da imagem. A segunda parte, o classificador da raça do gato, decide se é um gato siamês. É possível passar anos trabalhando na melhoria de qualquer um desses dois componentes do pipeline. Como você decide em quais componentes focar? Ao realizaranálise de erros por partes , você pode tentar atribuir cada erro cometido pelo algoritmo a uma (ou às vezes a ambas) das duas partes do pipeline. Por exemplo, o algoritmo classifica erroneamente esta imagem como não contendo um gato siamês (y=0), embora o rótulo correto seja y=1. Vamos examinar manualmente o que as duas etapas do algoritmo fizeram. Suponha que o detector de gatos siameses tenha detectado um gato da seguinte forma: Página 106 Rascunho de aprendizado de máquina André Ng Isso significa que o classificador da raça do gato recebe a seguinte imagem: O classificador de raça de gato classifica corretamente esta imagem como não contendo um gato siamês. Assim, o classificador de raça de gato é inocente: foi dado a partir de uma pilha de pedras e gerou um rótulo bastante razoável y = 0. Na verdade, um humano classificando a imagem recortada acima também teria previsto y=0. Assim, você pode atribuir claramente esse erro ao detector de gatos. Se, por outro lado, o detector de gatos tivesse gerado a seguinte caixa delimitadora: então você concluiria que o detector de gatos fez seu trabalho e que o culpado foi o classificador da raça do gato. Digamos que você passe por 100 imagens de conjuntos de desenvolvedores classificadas incorretamente e descubra que 90 dos erros são atribuíveis ao detector de gatos e apenas 10 erros são atribuíveis ao classificador de raça de gatos. Você pode concluir com segurança que deve concentrar mais atenção no aprimoramento do detector de gatos. Página 107 Rascunho de aprendizado de máquina André Ng Além disso, você também encontrou convenientemente 90 exemplos em que o detector de gatos gerou caixas delimitadoras incorretas. Você pode usar esses 90 exemplos para realizar um nível mais profundo de análise de erros no detector de gatos e ver como melhorá-lo. Nossa descrição de como você atribui erro a uma parte do pipeline tem sido informal até agora: você olha a saída de cada uma das partes e vê se consegue decidir qual delas cometeu um erro. Este método informal pode ser tudo que você precisa. Mas no próximo capítulo você também verá uma maneira mais formal de atribuir erros. Página 108 Rascunho de aprendizado de máquina André Ng 54 Atribuindo erro a uma parte Vamos continuar usando este exemplo: Suponha que o detector de gatos tenha gerado esta caixa delimitadora: O classificador de raça de gato recebe, portanto, esta imagem recortada, e então gera incorretamente y = 0, ou que não há gato na imagem. O detector de gatos fez mal o seu trabalho. No entanto, um ser humano altamente qualificado ainda poderia reconhecer o gato siamês pela imagem mal cortada. Então, atribuímos esse erro ao detector de gatos, ao classificador de raças de gatos, ou a ambos? É ambíguo. Se o número de casos ambíguos como esses for pequeno, você poderá tomar a decisão que desejar e obter um resultado semelhante. Mas aqui está um teste mais formal que permite atribuir o erro de forma mais definitiva a exatamente uma parte: 1. Substitua a saída do detector de gatos por uma caixa delimitadora etiquetada à mão. Página 109 Rascunho de aprendizado de máquina André Ng 2.Execute a imagem recortada correspondente através do classificador de raça de gato. Se o classificador de raça de gato ainda o classificar incorretamente, atribua o erro ao classificador de raça de gato. Caso contrário, atribua o erro ao detector de gatos. Em outras palavras, execute um experimento no qual você fornece ao classificador de raça de gato uma entrada “perfeita”. Existem dois casos: ● Caso 1: Mesmo com uma caixa delimitadora “perfeita”, o classificador de raça de gato ainda gera incorretamente y = 0. Neste caso, claramente o culpado é o classificador da raça do gato. ● Caso 2: Dada uma caixa delimitadora “perfeita”, o classificador de raça agora produz corretamente y=1. Isso mostra que se apenas o detector de gatos tivesse fornecido uma caixa delimitadora mais perfeita, então a saída geral do sistema teria sido correta. Portanto, atribua o erro ao detector de gatos. Ao realizar esta análise nas imagens do conjunto de desenvolvimento classificadas incorretamente, agora você pode atribuir inequivocamente cada erro a um componente. Isso permite estimar a fração de erros devido a cada componente do pipeline e, portanto, decidir onde concentrar sua atenção. Página 110 Rascunho de aprendizado de máquina André Ng 55 Caso geral de atribuição de erro Aqui estão as etapas gerais para atribuição de erros. Suponha que o pipeline tenha três etapas A, B e C, onde A alimenta diretamente B e B alimenta diretamente C. Para cada erro que o sistema comete no conjunto de desenvolvimento: 1. Tente modificar manualmente a saída de A para ser uma saída “perfeita” (por exemplo, a caixa delimitadora “perfeita” para o gato) e execute o restante do pipeline B, C nesta saída. Se o algoritmo agora fornecer uma saída correta, isso mostra que, se apenas A tivesse fornecido uma saída melhor, a saída geral do algoritmo teria sido correta; portanto, você pode atribuir esse erro ao componente A. Caso contrário, vá para a Etapa 2. 2. Tente modificar manualmente a saída de B para ser a saída “perfeita” para B. Se o algoritmo agora fornecer uma saída correta, atribua o erro ao componente B. Caso contrário, vá para a Etapa 3. 3. Atribua o erro ao componente C. Vejamos um exemplo mais complexo: Seu carro autônomo usa esse pipeline. Como você usa a análise de erros por partes para decidir em quais componentes focar? Você pode mapear os três componentes para A, B, C da seguinte forma: R: Detectar carros B: Detectar pedestres C: Planeje o caminho para o carro Página 111 Rascunho de aprendizado de máquina André Ng Seguindo o procedimento descrito acima, suponha que você teste seu carro em uma pista fechada e encontre um caso em que o carro escolhe uma direção de direção mais irregular do que um motorista experiente faria. No mundo da direção autônoma, esse caso é geralmente chamado decenário. Você então: 1. Tente modificar manualmente a saída de A (detecção de carros) para que seja uma saída “perfeita” (por exemplo, entre manualmente e diga onde estão os outros carros). Execute o restante do pipeline B, C como antes, mas permita que C (caminho do plano) use a saída agora perfeita de A. Se o algoritmo planeja agora um caminho muito melhor para o carro, então isso mostra que, se apenas A tivesse dado um resultado melhor, o resultado geral do algoritmo teria sido melhor; Assim, você pode atribuir esse erro ao componente A. Caso contrário, vá para a Etapa 2. 2. Tente modificar manualmente a saída B (detectar pedestres) para ser a saída “perfeita” para B. Se o algoritmo agora fornecer uma saída correta, atribua o erro ao componente B. Caso contrário, vá para a Etapa 3. 3. Atribua o erro ao componente C. Os componentes de um pipeline de ML devem ser ordenados de acordo com um gráfico acíclico direcionado (DAG), o que significa que você deve ser capaz de calculá-los em uma ordem fixa da esquerda para a direita, e os componentes posteriores devem depender apenas das saídas dos componentes anteriores. Contanto que o mapeamento dos componentes para a ordem A-> B-> C siga a ordem DAG, a análise de erros estará correta. Você pode obter resultados ligeiramente diferentes se trocar A e B: R: Detectar pedestres (anteriormenteDetectar carros) B: Detectar carros (anteriormenteDetectar pedestres) C: Planeje o caminho para o carro Mas os resultados desta análise ainda seriam válidos e dariam uma boa orientação sobre onde concentrar a sua atenção. Página 112 Rascunho de aprendizado de máquina André Ng 56 Análise de erros por partes e comparação com o desempenho em nível humano Realizar análise de erros em um algoritmo de aprendizagem é como usar a ciência de dados para analisar os erros de um sistema de ML a fim de obter insights sobre o que fazer a seguir. Em sua forma mais básica, a análise de erros por partes nos diz qual(is) desempenho(s) de componente(s) vale(m) o maior esforço para melhorar. Digamos que você tenha um conjunto de dados sobre clientes que compram coisas em um site. Um cientista de dados pode ter muitas maneiras diferentes de analisar os dados. Ela pode tirar muitas conclusões diferentes sobre se o site deve aumentar os preços, sobre o valor vitalício dos clientes adquiridos através de diferentes campanhas de marketing e assim por diante. Não existe uma maneira “certa” de analisar um conjunto de dados e há muitos insights úteis possíveis que podem ser obtidos. Da mesma forma, não existe uma maneira “certa” de realizar a análise de erros. Nestes capítulos, você aprendeu muitos dos padrões de design mais comuns para obter insights úteis sobre seu sistema de ML, mas também deve se sentir à vontade para experimentar outras maneiras de analisar erros. Vamos voltar ao aplicativo de direção autônoma, onde um algoritmo de detecção de carros fornece a localização (e talvez a velocidade) dos carros próximos, um algoritmo de detecção de pedestres fornece a localização dos pedestres próximos e essas duas saídas são finalmente usadas para planejar um caminho. para o carro. Para depurar esse pipeline, em vez de seguir rigorosamente o procedimento visto no capítulo anterior, você poderia perguntar de maneira mais informal: 1. Qual é a distância entre o componente Detectar carros e o desempenho de nível humano na detecção de carros? 2. Qual é a distância entre o componente Detectar pedestres e o desempenho em nível humano? Página 113 Rascunho de aprendizado de máquina André Ng 3. Qual é a distância entre o desempenho geral do sistema e o desempenho a nível humano? Aqui, o desempenho no nível humano pressupõe que o ser humano tenha que planejar um caminho para o carro, considerando apenas as saídas dos dois componentes anteriores do pipeline (em vez do acesso às imagens da câmera). Em outras palavras, como o desempenho do componente do caminho do plano se compara ao desempenho de um ser humano, quando o ser humano recebe apenas a mesma entrada? Se você achar que um dos componentes está longe do desempenho de nível humano, agora você tem um bom argumento para se concentrar na melhoria do desempenho desse componente. Muitos processos de análise de erros funcionam melhor quando tentamos automatizar algo que os humanos podem fazer e, assim, podemos comparar o desempenho em nível humano. A maioria dos nossos exemplos anteriores tinha esta suposição implícita. Se você estiver construindo um sistema de ML em que o resultado final ou alguns dos componentes intermediários façam coisas que nem mesmo os humanos conseguem fazer bem, alguns desses procedimentos não se aplicarão. Esta é outra vantagem de trabalhar em problemas que humanos podem resolver – você tem ferramentas de análise de erros mais poderosas e, assim, pode priorizar o trabalho da sua equipe com mais eficiência. Página 114 Rascunho de aprendizado de máquina André Ng 57 Identificando um pipeline de ML falho E se cada componente individual do seu pipeline de ML estiver apresentando desempenho de nível humano ou quase humano, mas o pipeline geral estiver muito aquém do nível humano? Isso geralmente significa que o pipeline tem falhas e precisa ser redesenhado. A análise de erros também pode ajudá-lo a entender se você precisa redesenhar seu pipeline. No capítulo anterior, colocamos a questão de saber se o desempenho de cada um dos três componentes está no nível humano. Suponha que a resposta a todas as três perguntas seja sim. Aquilo é: 1. O componente Detectar carros tem desempenho (aproximadamente) de nível humano para detectar carros a partir das imagens da câmera. 2. O componente Detectar pedestres tem desempenho (aproximadamente) de nível humano para detectar carros a partir das imagens da câmera. 3.Comparado a um ser humano que precisa planejar um caminho para o carro com base apenas nas saídas dos dois componentes do pipeline anteriores (em vez do acesso às imagens da câmera), o desempenho do componente Caminho do plano está em um nível semelhante. No entanto, o desempenho geral do seu carro autônomo está significativamente abaixo do desempenho do nível humano. Ou seja, os humanos com acesso às imagens da câmera podem planejar caminhos significativamente melhores para o carro. Que conclusão você pode tirar? A única conclusão possível é que o pipeline de ML é falho. Nesse caso, o componente Planejar caminho está funcionando tão bem quanto podedadas as suas entradas, mas as entradas não contêm informações suficientes. Você deve se perguntar quais outras informações, além das saídas dos dois componentes anteriores do pipeline, são necessárias para planejar muito bem os caminhos para um carro dirigir. Em outras palavras, de que outras informações um motorista humano qualificado precisa? Página 115 Rascunho de aprendizado de máquina André Ng Por exemplo, suponha que você perceba que um motorista humano também precisa saber a localização das marcações da pista. Isso sugere que você deve redesenhar o pipeline da seguinte maneira18: Em última análise, se você não acha que seu pipeline como um todo alcançará desempenho de nível humano, mesmo que cada componente individual tenha desempenho de nível humano (lembre-se de que você está comparando a um ser humano que recebe a mesma informação que o componente), então o pipeline está falho e deve ser redesenhado. 18No exemplo de direção autônoma acima, em teoria, esse problema poderia ser resolvido alimentando também a imagem bruta da câmera no componente de planejamento. No entanto, isso violaria o princípio de design de “simplicidade de tarefa” descrito no Capítulo 51, porque o módulo de planejamento de caminho agora precisa inserir uma imagem bruta e tem uma tarefa muito complexa para resolver. É por isso que adicionar um componente Detectar marcações de pista é uma escolha melhor - ele ajuda a obter informações importantes e anteriormente ausentes sobre marcações de pista para o módulo de planejamento de caminho, mas evita tornar qualquer módulo específico excessivamente complexo para construir/treinar. Página 116 Rascunho de aprendizado de máquina André Ng Conclusão Página 117 Rascunho de aprendizado de máquina André Ng 58 Construindo uma equipe de super-heróis - Faça com que seus companheiros leiam isto Parabéns por terminar este livro! No Capítulo 2, falamos sobre como este livro pode ajudá-lo a se tornar o super-herói de sua equipe. A única coisa melhor do que ser um super-herói é fazer parte de uma equipe de super-heróis. Espero que você dê cópias deste livro para seus amigos e colegas de equipe e ajude a criar outros super-heróis! Página 118 Rascunho de aprendizado de máquina André Ng