Machine Learning e a Copa do Mundo

Não adianta esbravejar pelo fato de que economistas, matemáticos e estatísticos gastam horas desenvolvendo modelos matemáticos sofisticados que apontam, basicamente, para o mesmo resultado quando se trata de estimar os resultados de um evento esportivo como a Copa do Mundo.

Adivinhar o campeão é apenas a cereja do bolo neste processo. Muito mais divertido é poder dar um palpite elegante sobre quem será o vencedor num confronto do tipo Bélgica e Inglaterra, principalmente para alguém que manja tanto de futebol quanto uma criança de 7 anos de idade – que é o caso dos autores desse estudo/blog; ou mesmo tentar prever quais seleções avançarão para cada etapa da competição, marcar alguns pontos a mais no bolão da firma e, com sorte, ganhar alguns trocados. Dito isso, aqui vai um alerta de spoiler: no exercício que se segue, Brasil e Alemanha têm chances muito próximas de ganhar a Copa do Mundo da Rússia, com ligeira vantagem para a seleção canarinho.

Mas antes de apresentarmos o modelo e seus resultados, o que explica essa concentração de apostas do “mercado” em torno de poucos países, como Brasil, Alemanha e Espanha?

O desempenho corrente e a experiência passada importam consideravelmente na avaliação do destino de cada seleção participante de uma Copa do Mundo. Dos 20 torneios mundiais disputados desde 1930, o Brasil ergueu cinco taças, a Itália e a Alemanha ganharam quatro vezes, a Argentina e o Uruguai saíram vitoriosos duas vezes cada, ao passo que Inglaterra, França e Espanha ganharam uma edição. Portanto, é impossível negar que a escolha de qualquer um desses times como campeão é uma aposta segura (com o cuidado de se observar o ranking atual e, obviamente, a presença deles no evento). A taxa de presença desses times nas Copas do Mundo ao longo da história e suas campanhas passadas reforçam esse tipo de aposta: o Brasil é o único time que participou de todas as edições, ao passo que a Alemanha não esteve presente em apenas dois torneios e a Itália deixou de ir ao maior evento esportivo do mundo em três ocasiões (já contabilizando 2018).

O número de vezes em que estes times disputaram as finais também é algo digno de nota: oito no caso da Alemanha, sete do Brasil e seis da Itália. É ainda mais impressionante o fato de que, até hoje, apenas oito times conseguiram chegar até a etapa final da competição, tendo como base as últimas 13 edições: além dos três destacados acima, foram os casos de Argentina, Espanha, França, Inglaterra e Holanda.

As semifinais são eventos um pouco mais imprevisíveis do que as finais. Vinte e quatro times chegaram até esta etapa ao longo da história do futebol. No entanto, uma vez mais, apenas cinco deles (Alemanha, Argentina, Brasil, França e Itália) responderam por mais de 50% das vagas nesta fase da competição. Vale destacar que, ao que parece, em todo torneio há pelo menos um azarão nas semifinais. Em 2002 foram dois países: Turquia e Coréia do Sul, apesar deste último ter sido uma das seleções da casa (o que confirma a relevância do fator-casa em modelos da Copa); em 2006, muitos apontam que foi o caso de Portugal; e em 2010 essa alcunha de azarão foi dada ao Uruguai.

Como destacado acima, ser seleção do país-sede certamente é uma vantagem. Os times da casa ergueram a taça em pouco menos de 1/3 das Copas organizadas até agora, chegaram às semifinais em 50% das vezes e estiveram presentes nas oitavas de final em todos os eventos desde 1986, exceto na África do Sul.

Neste momento o leitor já deve ter se convencido de que, embora diversos fatores (muitas vezes imprevisíveis) influenciem os resultados jogo-a-jogo, nenhum modelo estatístico bem-especificado poderia sugerir uma semifinal sem a presença de duas ou três das seleções destacadas acima. No mesmo sentido, vale destacar também que nem abastecido com todos os dados históricos do mundo um modelo poderia transformar um time pouco competitivo em um campeão. Exemplo disso é que algumas seleções reconhecidas por sua tradição no futebol ficaram de fora da Copa do Mundo de 2018, caso da Itália e da Holanda.

Mas é possível avaliar de forma objetiva o desempenho passado e corrente de uma seleção de modo a termos um bom palpite para os jogos da Copa da Rússia?

Os sites de aposta (como o Bet365 e Betfair) podem ser um bom ponto de partida como uma medida subjetiva de força de cada seleção. Também é possível basear-se no ranking oficial da FIFA, apesar de a instituição ter declarado recentemente que a fórmula de cálculo do ranking sofrerá alteração. Nesta simulação nos baseamos no rating ELO, justamente por ser uma base padronizada e bem organizada de todas as partidas oficiais (desde 1872!) envolvendo times nacionais. A partir destes dados temos algo em torno de 45 mil jogos para alimentar nossos modelos de previsão.

Aqui vale uma pequena pausa para explicar o que é o ELO rating e como este indicador é calculado. O ELO foi desenvolvido por um físico Húngaro-Americano chamado Arpad Elo (1903-1992), com o objetivo de medir e ranquear a habilidade de jogadores de xadrez. Os ratings ELO têm sido utilizados em diversos esportes, como o tênis, mas a sua aplicação no mundo do futebol ganhou relevância nos últimos anos por se tratar de uma métrica de habilidade (ou força) dos times com qualidade superior ao ranking da FIFA.

O método ELO de ranqueamento leva em conta não só o número de vitórias, derrotas e empates de cada time, mas também as condições sob as quais o evento ocorreu. Como resultado, derrotar um time forte como o Brasil ou a Alemanha aumentará o ELO do time vencedor numa proporção muito maior do que uma vitória sobre Andorra ou Zâmbia. Além disso, uma vitória fora de casa gera um incremento maior sobre o ELO do que uma vitória dentro do próprio país; ganhar uma qualificatória é melhor que ganhar um amistoso; ou ainda, uma goleada de 7 a 0 gera mais pontos que uma vitória de 2 a 1. A partir do ELO também é possível comparar a força de cada seleção ao longo do tempo. Por exemplo, o time alemão que venceu a Copa do Brasil de 2014 era mais forte (no início do torneio) do que as seleções germânicas que venceram a competição em 1954, 1974 e 1990.

Olhando um pouco para o histórico do ELO, em nenhuma ocasião o time vencedor iniciou o torneio com rating abaixo de 2030 pontos, exceto na vitória surpresa do Uruguai sobre o Brasil na Copa de 1950. O time mais forte a ganhar uma Copa do Mundo foi o da Alemanha de 2014, com um ELO de partida de 2223 pontos (mais informações em https://www.eloratings.net/).

A Copa do Mundo de 2018, que possui um ELO médio de 1828 para todos os 32 times envolvidos, é o terceiro torneio mais fraco da história sob esta ótica, ficando à frente apenas dos mundiais de 1930 e 1938. No evento deste ano, apenas três seleções contam com rating superior a 2000, ao passo que em 2014 cinco times iniciaram o torneio com ELO acima desse patamar. Mas o outlier nesse caso foi a Copa passada. Desde 1994, apenas 3 seleções, em média, iniciaram a Copa com ratings superiores a 2000.

Com relação ao rating da seleção brasileira no evento deste ano, com 2142 pontos temos a segunda escalação mais forte a participar de uma Copa do Mundo, ficando atrás apenas daquela que entrou em campo em 2014.  No caso da Alemanha, a seleção de hoje é a terceira mais forte a participar de um mundial (ELO 2077), ficando atrás dos times de 1978 (ELO 2083) e 2014 (ELO 2109).

Metodologia

Como destacado acima, utilizamos resultados de cerca de 45 mil jogos extraídos do site ELO ratings. Neste conjunto de dados constam diversas informações referentes a cada partida, como data do jogo, nome e código dos países, número de gols marcados pelas seleções, local (país) do jogo e nome do campeonato, além, é claro, do rating ELO das respectivas seleções, calculado ao final de cada partida.

Para esta simulação decidimos não percorrer o perigoso caminho de prever o país que tem maior probabilidade de vencer a Copa do Mundo da Rússia. Ao invés disso, nos debruçamos em estimar probabilidades jogo-a-jogo, o que nos dá a composição dos grupos durante a primeira fase (a colocação de cada seleção ao final desta etapa) e os resultados das oitavas, quartas, semifinais e, por fim, as probabilidades para os dois times que disputam a final do campeonato. Nos próximos parágrafos esmiuçamos um pouco mais a metodologia. De antemão peço desculpas pelo trecho carregado de termos técnicos. Ao leitor que não interessar este tipo detalhamento, recomendamos pular direto para a seção de resultados.

Tivemos como objetivo principal gerar probabilidades de vitória, empate e derrota para cada jogo da Copa da Rússia. Para isso utilizamos a abordagem de regressão logística multinomial, pois desta forma pode-se ter mais de duas categorias em sua variável dependente.

Definimos, portanto, três classes para determinar as probabilidades de vitória do time A sobre o time B, do time B sobre o time A e de empate nessa partida, tendo como variáveis/features (i) o rating ELO corrente e suas defasagens, (ii) uma variável binária para descontar o “fator casa”, (iii) médias móveis de gols a favor e (iv) médias móveis de gols contra. Para agregar mais features às simulações, criamos transformações polinomiais de 2o e 3o grau dessas variáveis, totalizando cerca de 100 variáveis no modelo.

O próximo passo foi utilizar a técnica de validação cruzada k-fold para treinar e testar nosso modelo de Machine Learning com as variáveis mais importantes, selecionadas pelo método LASSO (Least Absolute Shrinkage and Selection Operator). Nesta etapa, o algoritmo divide os dados de entrada em subconjuntos de dados (chamados de folds); depois o modelo é treinado em todos os subconjuntos, exceto um (k-1), e avaliado neste subconjunto que não foi usado para o treinamento. Este processo é repetido k vezes, cada uma com um subconjunto diferente reservado para avaliação (e excluído do treinamento).

A figura abaixo mostra de forma mais clara como a metodologia de validação cruzada 4-fold foi aplicada ao nosso modelo, gerando subconjuntos de treinamento e avaliação. A primeira iteração usa os primeiros 25% dos dados para avaliação e os 75% restantes para treinamento. A iteração seguinte usa o segundo quartil (de 25% a 50%) para avaliação e os três quartis restantes para treinamento, e assim por diante. Na próxima seção apresentamos os resultados dessa simulação.

 Copa2018_01

Resultados

A tabela abaixo mostra as probabilidades de vitória, empate e derrota para cada partida durante a fase de grupos. A última coluna indica o time com maior probabilidade de sair vitorioso. Os dados estão ordenados por grupo.

Os resultados das simulações mostram que a Rússia deve se beneficiar do “fator-casa” no confronto contra a Arábia Saudita.  Além disso, o modelo sugere o empate como uma boa aposta nos confrontos entre Rússia e Egito, Peru e Dinamarca, Islândia e Croácia, dentre outros.

Com base nestas simulações, os primeiros e segundos colocados dos grupos seriam, respectivamente: Uruguai e Rússia (A), Espanha e Portugal (B), França e Peru (C), Argentina e Croácia (D), Brasil e Suíça (E), Alemanha e México (F), Inglaterra e Bélgica (G) e Colômbia e Polônia (H).

Copa2018_02

Partindo dos resultados da fase de grupos, os resultados simulados para as demais etapas são apresentados na figura abaixo. Como destacado no início deste artigo, Brasil e Alemanha devem disputar a partida final e as simulações apontam para ligeiro favoritismo do Brasil. Rumo ao Hexa!

Copa2018_03

Advertisements

Install Tensorflow with GPU support on Windows 10

I am writing this little guide for people who, like myself, have the following characteristics:

  • Have a computer with a decent enough GPU
  • Use this computer to play games
  • Would like to use it also to run experiments on Tensorflow
  • Are too lazy to build a dual boot with linux to proper run it
  • Are also too lazy to install packages and prefer using Anaconda

I remember it was a huge pain to make Tensorflow work with my GPU (980ti) the first time I tried and recently my Windows 10 machine crashed and I had to install it all again (thank you Microsoft!)

Bear in mind that this guide was written in 2017-June and given the speed in which Tensorflow related stuff moves it has an increasing probability of being outdated the farther you are reading it from this date

Steps:

1 – Download and install Anaconda 3.6

https://www.continuum.io/downloads

1.1 Add Anaconda to the Path variable

  • Windows+Break / advanced system settings / system properties / advanced / environment variables
    • under System Variables add   “<your path>\Anaconda3” and “<your path>\Anaconda3\Scripts”

2 – Create a virtual environment:

  • Tensorflow works with Python 3.5 so we will have to create a virtual environment for this.
  • It is important to copy everything when creating this environment otherwise you will have to install it all again
  • In the Windows Command Prompt: “conda create -n tf python=3.5 anaconda”

3 – Install Tensorflow-gpu

  • At the time of this writing the conda instructions on Tensorflow’s website did not work for me, so I had to use pip
  • In the Windows Command Prompt: “pip install –upgrade tensorflow-gpu “

4 – Requirements

5 – Test it

  • Now you should be able to open the Command Prompt and use the following commands
    • activate tensorflow
    • python
    • import tensorflow as tf
    • hello = tf.constant(‘Hello, TensorFlow!’)
    • sess = tf.Session()
    • print(sess.run(hello))
  • If everything was ok, you should see a message telling that it was running on the GPU and the print

Never leave it in the hands of the judges

Como a grande maioria dos pre-adolescentes bobos nos anos 90 eu adorava assistir filmes de luta como “O grande dragão branco”, “Leão branco”, “Kickboxer”, você já entendeu a tendência…Todos os filmes do Van Damme, basicamente.

Porém, toda a graça acabou como um passe de mágica quando um colega e eu alugamos 3 fitas de video com os primeiros “The ultimate fighting championship” (UFC), era como se um sonho tivesse virado realidade já que era possível ver lutadores de diferentes estilos em combates totalmente livres de regras, era como “O grande dragão branco” com muito menos carisma.

Vinte e poucos anos se passaram desde aquele momento de descoberta e aquilo que era considerado uma barbárie ganhou regras, se profissionalizou e hoje é um dos esportes que mais cresce no mundo conseguindo chegar a um tamanho inimaginável pelos fans do esporte, sendo recentemente vendido por $4 bilhões de dólares.

Provavelmente assisti 90% de todos os eventos oficiais (os numerados), alguns UFC fight nights e até alguns “The ultimate fighters”, então é bem provável que eu tenha assistido alguns milhares de combates, porém em uma recente conversa com amigos, declarei que não tenho mais o interesse que tinha antes pelo esporte, exceto por algumas poucas lutas principais, o problema é que não consegui explicar o porque disso.

Os fãs citam diversos fatores, entre eles o principal sendo o excesso de exposição, já que é possível ver eventos praticamente todas as semanas, então não é mais um bem tão escasso como era antigamente, porém eu desconfio que não é só isso, minha opinião é que os eventos estão mais chatos* na média, que muitos lutadores lutam para não perder ao invés de ganhar e que a grande maioria de técnicas já está arbitrada, portanto é mais difícil surpreender o oponente e principalmente a audiência com uma técnica nova, como a revolução que o jiu-jitsu Brasileiro fez no esporte.

Primeiramente tenho que definir o que é um ‘evento chato’. Nocautes e Submissões são legais, são surpreendentes e inesperados, não existe uma forma melhor de definir o triunfo de um lutador sobre o outro. Em contraste, lutas que terminam por pontos são menos interessantes, pois elas terminam (na grande maioria dos casos) sem um vencedor claro e esse término é artificial, forçado e, pior ainda, são 15 ou 25 minutos em que nada aconteceu. Portanto, um evento como um todo pode ser definido como chato ou interessante baseado no número de KOs/Submissões sobre o número total de lutas.

Dada esta definição, vamos olhar para o comportamento dos eventos ao longo do tempo. No gráfico abaixo calculo a razão entre KO+Sub sobre o número total de lutas. Os eventos vão desde o primeiro UFC em 1993 até o Fight Night 83 em 2016-02-21, para um total de 3.569 lutas (os dados podem ser encontrados nesse link)

ko_sub

Nos primeiros eventos, até o final dos anos 90, as regras eram poucas (bem poucas) e as lutas não eram divididas em rounds, o que obviamente infla o número de finalizações de lutas, mas mesmo com uma grande variância entre os eventos, na média o número de finalizações caiu de 3 em cada 4 para pouco mais que 1 a cada 2 lutas.

Uma das explicações para esse número em declínio pode ser que o Jiu Jitsu foi assimilado pelos lutadores e atualmente finalizações por submissão são bem mais raras do que antigamente. Olhando para o gráfico abaixo é difícil tomar essa explicação como sendo a maior causa do problema, pois o o número de KOs em relação as Submissões aumentou um pouco ao longo do tempo, mas ainda 1 em cada 3 finalizações é devido a submissões.

ko_sub

Outra explicação pode ser dada com a introdução de categorias de peso mais baixas, principalmente depois da compra do WEC (World Extreme Cagefighting) a qual era a casa dos lutadores menores. O gráfico abaixo mostra o percentual de lutas finalizadas por classe de peso.

weight

Tem um tempo que comento com meus colegas que pouca coisa é mais legal que luta de pesos pesados no UFC, imagine duas pessoas que possuem mais músculos e gordura do que é humanamente aceitável, os quais possuem força para nocautear seus oponentes com apenas 1 soco e são incapazes de se esquivar tão bem quanto as categorias mais leves. Toda luta é uma surpresa, nenhum campeão dos pesos pesados conseguiu manter seu cinturão por muito tempo, é a roleta russa do UFC, por isso uma de minhas lutas preferidas foi a do Minotauro vs Bob Sapp em 2002. Ok, o Bob Sapp nem era um oponente tão respeitado assim, mas vale lembrar que sem o espetáculo não teríamos uma empresa tão grande quanto o UFC é hoje.

Acredito que consegui quantificar parte da minha insatisfação com o UFC atualmente, não é o excesso de eventos, mas sim o excesso de lutas em que nada acontece, com lutadores pequenos que ficam pulando por 25 minutos na tela incapazes de realizar qualquer movimento remotamente ameaçador. O UFC tem feito um bom trabalho em manter o evento interessante e os lutadores chatos são removidos dos eventos principais através da seleção natural, mas dificilmente retornaremos para os números do passado, não enquanto os lutadores estiverem lutando para não perder ao invés de lutando para ganhar.

Por fim, existe uma probabilidade de 29% de uma luta acabar no primeiro round com um KO ou Submissão, se isso não aconteceu, essa probabilidade cai para 23% de acontecer no segundo round, porém se a luta não terminou ainda, a probabilidade de uma finalização no terceiro round cai para 15,5% nos próximos rounds (caso a luta vá até 5), ou seja, se nada aconteceu no primeiro round, pode até ser que ocorra no segundo, caso nada ocorra, pode ser um bom motivo para desligar a televisão e ir dormir mais cedo, visitar o banheiro, buscar uma cerveja, abrir o facebook etc, pois é bem provável que nada aconteça mesmo…

Dinâmica da pirâmide etária entre 1990 e 2050 e a reforma da previdência

Recentemente a equipe econômica do presidente interino Michel Temer anunciou um conjunto de medidas para tentar conter a rápida deterioração das contas públicas brasileiras. A mais importante delas, que será apresentada a partir de uma Proposta  de Emenda Constitucional, tem como objetivo limitar o crescimento das despesas primárias à inflação do ano anterior. O governo também pretende que o BNDES antecipe a devolução de pelo menos R$ 100 bilhões em recursos repassados pelo Tesouro (de um total de mais de R$ 500 bilhões) e indicou, dentre outras coisas, que poderá extinguir o Fundo Soberano Nacional e utilizar os R$ 2 bilhões de seu patrimônio atual. Foi a raspa do tacho na tentativa de reduzir em alguma medida o enorme déficit primário herdado da administração Dilma, sem propor (por enquanto!) nova rodada de aumento de impostos, mudança nas regras de benefícios sociais e/ou venda de ativos da União.

Embora o pacote de medidas tenha agradado o mercado, o governo preferiu por ora não entrar no debate da questão previdenciária. Michel Temer apenas indicou que discutirá a reforma da previdência com centrais sindicais e classe política e que nenhuma medida econômica será tomada sem a “concordância” da sociedade. Fato é que nós brasileiros precisamos nos preocupar com essa questão, pois o Estado já gasta mais de 12% do PIB com previdência (incluindo BPC-LOAS, de uma arrecadação total de cerca de 25% do PIB) e, se nada for feito, a situação se tornará insustentável em pouquíssimo tempo, uma vez que o processo de envelhecimento da população brasileira será muito rápido. O gráfico abaixo mostra de forma mais clara a velocidade deste processo de envelhecimento da população entre 1990 e 2050, utilizando as projeções do U.S. Census Bureau.

brazil_pyramid

Pelo estreitamento da base da pirâmide é possível notar que a proporção de crianças e adolescentes com até 14 anos vem caindo rapidamente nos últimos anos, reflexo da menor taxa de fecundidade das mulheres. Segundo o IBGE, o número médio de filhos passou de 2,4 nos anos 2000 para 1,7 em 2015, uma queda de quase 30%. Com efeito, a expectativa é de um aumento expressivo da população de idosos nos próximos 30-40 anos, característica bastante distinta da observada no início da década de 90, quando predominavam crianças e jovens na pirâmide etária brasileira.

O próximo gráfico mostra, a partir da mesma base do U.S. Census Bureau, que a taxa de fecundidade brasileira também é a menor da América Latina. Para visualizar os valores, basta clicar no gráfico.Taxa de Fertilidade, 2016 <br> Elaboração: dadosdadosdados. Fonte: U.S. Census BureauSe as informações demográficas apresentadas acima ainda não forem suficientes para convencer o leitor de que o debate sobre a reforma da previdência deve ser tratado em regime de urgência, sugiro a leitura da última versão (de março de 2015) do relatório de Projeções Financeiras e Atuariais para o Regime Geral de Previdência Social, disponível neste link. Na página 28 encontram-se as projeções oficiais (ou seja, do próprio governo), que indicam que, nas condições atuais, a despesa do INSS e o déficit da Previdência como proporção do PIB seguirão em tendência de crescimento até 2060, assim como mostrado nos gráficos abaixo. Importante também destacar que essas projeções levavam em conta um PIB de -0,9% em 2015, de +1,30% em 2016 e de +1,9% em 2017. A atualização do modelo com o recuo de -3,8% observado em 2015 e com as projeções mais recentes do Boletim Focus (-3,8% em 2016 e +0,55% em 2017), além de inflação mais elevada e crescimento nominal da massa salarial bem mais fraco, influenciará negativamente a estimativa de arrecadação, aumentando a previsão para o déficit da Previdência.

Despesa (azul) e Déficit (laranja) da Previdência como % do PIB <br> Elaboração: dadosdadosdados. Fonte: Previdência SocialOBS: para elaborar os gráficos deste post utilizei diversas bibliotecas do software R, sendo que as principais foram a idbr (que faz conexão direta com o API do US Census Bureau para obter os dados demográficos), ggplot e plotly (para criar os gráficos) e a animation (responsável por criar a animação do gráfico em GIF).

Arborização e o preço dos imóveis em São Paulo

Parece meio óbvio, mas será que é possível verificar uma correlação positiva entre a arborização de um local e os preços dos imóveis?

Outro dia, ao ir almoçar sozinho debaixo de um belo sol ‘de rachar’, de camiseta preta e sem uma única sombra para me ajudar comecei a delirar divagar sobre os prós e contras daquele local de trabalho. Por conta do momento, a falta de arborização naquele local era um ‘contra’, mas em oposição um fator positivo era o custo do aluguel (entre outros).

Por sorte temos o site http://geosampa.prefeitura.sp.gov.br/ que disponibiliza dados gerais sobre a cidade, como arborização, por exemplo:

arvores

Com esses dados, agregados aos da prefeitura de tamanho das subprefeituras e distritos podemos calcular o número de árvores por km²

top10

Eu poderia parar a análise por aqui já que quem mora/conhece a cidade de São Paulo sabe que esses são os bairros mais caros, porém vale a pena dar uma olhada nos preço médio do m² e comparar com a arborização do local.

Usando dados do properatidata.cartodb.com de preço de m² por distrito é possível criar o gráfico abaixo:

modelo

Razoável…

Obviamente existem diversos fatores que contribuem para o preço de um imóvel e é bem possível que a arborização de um local tenha uma importância boa em um modelo para prever preços de imóveis, como um modelo mais complexo que criei há um tempo atrás…

https://dadosdadosdados.wordpress.com/2015/09/15/alugueis-em-sao-paulo-um-benchmark/

Deep Learning com CUDA em tempos de crise

‘Neural Networks are cool again’ – Autor desconhecido

De quando em quando aparece uma notícia de um algoritmo mirabolante capaz de fazer alguma façanha que ninguém achava possível, porém ultimamente essas notícias estão ficando cada vez mais consistentes

Recentemente o Google anunciou algo que os especialistas achavam que demoraríamos pelo menos mais 10 anos para alcançar. Eles conseguiram montar um algoritmo capaz vencer um dos maiores campeões de GO do mundo.

http://www.wired.com/2016/03/googles-ai-wins-first-game-historic-match-go-champion/

Eu não conhecia o jogo GO a fundo. Joguei algumas vezes na infância porque alguém tinha o tabuleiro, mas nunca dei muita bola; e uma coisa que me deixou impressionado com essa notícia é a complexidade do GO em relação a outros jogos como jogo da velha e Xadrez.

https://en.wikipedia.org/wiki/Game_complexity#Complexities_of_some_well-known_games

‘Game-tree complexity’:
– Jogo da Velha = 10^5
– Xadrez = 10^123
– GO = 10^360

Só para se ter uma ideia, quando o Deep Blue venceu o Kasparov, apesar de ter sido um grande feito na época, ele ‘apenas’ buscava a melhor sequencia de jogadas dentro de um banco de jogadas, ou, para quem gosta de Excel, imagine um ‘super procv()’.

Já no caso do GO, isso ainda é uma impossibilidade por conta da complexidade do jogo, então o pessoal do DeepMind tentou outra abordagem onde eles ensinaram o computador a jogar GO olhando para milhares e milhares de partidas e até mesmo jogando contra outros computadores.

Usando a tecnologia
Diferente da postura usada pela IBM nos casos do Deepblue e mais recentemente do Watson, a tecnologia usada pelo Google está aí para brincarmos, principalmente agora que o Google abriu o código fonte das suas bibliotecas de Machine Learning

https://www.tensorflow.org/

Não é nada demais e é até inferior em alguns aspectos a bibliotecas que já estão por aí a algum tempo, como o Theano, mas o importante é que essas tecnologias estão aí, disponíveis para usarmos.

Na pratica:
As tecnologias estão disponíveis, mas um limitante para utiliza-las é o tempo de processamento,  por exemplo: Para um projeto que estou trabalhando eu preciso rodar diversos modelos e combina-los para fazer uma previsão. Uma das pernas desse processo é um modelo de Deep Learning, relativamente simples com 2 hidden layers, 2 dropout e alguns outros detalhes.

Considerando o problema inteiro o que eu teria que fazer é rodar esse modelo com 400 epochs, em um cross-validation de pelo menos 5 folds, com no mínimo 30 combinações diferentes de parâmetros. Com um tempo médio de processamento de 14.5s por epoch eu levaria 14.5 x 400 x 5 x 30 / 60 / 60 =~240 horas para rodar esse processo.

Processamento
Como as redes neurais são extremamente flexíveis e sua ‘profundidade’ pode afetar significativamente os resultados, chegamos em uma situação em que os recursos computacionais são limitadores na hora de criar redes maiores e mais complexas. Não são raros exemplos de pessoas que deixam suas redes treinando por dias ou semanas.

Uma solução para isso foi mudar o local de processamento das redes do processador para a Placa de vídeo pois como elas são feitas para trabalhar com gráficos pesados, são capazes de realizar muito mais operações por segundo chegando a ser até 20x mais rápidas que um processador equivalente.

Todo esse poder de processamento tem seu custo, é claro, geralmente a placa de vídeo é o componente mais caro de um PC e uma placa top não sai por menos de R$3.500,00

Ok, ok, estamos em crise e vai ser bem difícil arrumar R$10.000,00++ para comprar um PC novinho para brincar de Data Scientist, então o que dá para fazer?

CUDA on a Budget
CUDA é a Tecnologia usada pelas placas de video Nvidia que se comunica com as bibliotecas de Deep Learning (Theano ou Tensorflow) para mandar os cálculos para a GPU, então teoricamente qualquer PC com uma placa de vídeo que suporte CUDA pode ser usada para treinar uma rede Neural.

Tenho um notebook da Asus que por acaso vem com uma placa integrada GeForce 740m, que é uma porcaria de uma placa (do ponto de vista de um Gamer), mas é o que tem para hoje.

Instalando o CUDA no Linux
Eu já tinha visto diversos comentários sobre o quão chato é fazer esse troço funcionar, mas nada como testar na pele para ver como é.

Vou passar o passo a passo, mas já aviso que coisas podem ‘quebrar’ e isso vai variar por sistema, versão, hardware e etc, então tenha paciência, vai funcionar, mas nunca na primeira tentativa.

  • Faça o download do driver em:
    https://developer.nvidia.com/cuda-downloads
  • Vá para o terminal com CTRL+ALT+F1
  • Pare o ‘X server’, no meu caso ‘sudo service mdm stop’
  • sudo init 3
  • sudo sh cuda_7.5.18_linux.run

A partir de agora é só seguir a instalação e adicionar algumas linhas no .bashrc

export CUDA_HOME=/usr/local/cuda-7.5
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64

PATH=${CUDA_HOME}/bin:${PATH}
export PATH

Obviamente, no meu caso a instalação do Driver de vídeo falhou, tentei de tudo e não deu certo e acabei instalando pelo Driver Manager do Linux mesmo (versão 352.63).

Como eu uso o Theano como motor eu precisei configura-lo para aceitar minha GPU, as instruções não são muito claras, mas eu criei um arquivo no root chamado ‘.theanorc’ com o seguinte conteúdo:

[cuda]
root = /usr/local/cuda-7.5

[global]
floatX = float32
device = gpu0

Isso deve ser o suficiente, com exceção de um detalhe que está marcado como Bug no site da Nvidia, mas eu não consegui resolver que é o seguinte, independente do programa que você usar (R ou Python) você deve abri-lo como administrador (sudo), caso contrário ele não reconhece a placa.

Resultados:
Na média, por epoch, consegui obter desta plaquinha uma velocidade 6x mais rápida para treinar minha network. Para diminuir o tempo de processamento de 10 dias para um pouco menos de 2 realmente fez valer a pena o trabalho com a instalação do CUDA.

chart1

Aquilo que não sei

Eu estava lendo o livro Rise of the “Robots: Technology and the Threat of a Jobless Future” e logo no começo o autor começa com a argumentação de que a produtividade do trabalho vem crescendo continuamente ao longo dos anos após a segunda guerra mundial.

us_productivity_and_real_wages

https://en.wikipedia.org/wiki/Workforce_productivity

Olhando para o gráfico, especialmente para a curva de produtividade (a de salários é um assunto para um outro momento) e pensando na maneira como trabalhamos hoje em dia é até difícil imaginar como era trabalhar na era ‘pre-Google’.

Vamos imaginar uma situação, você está em 1995 e precisa montar um report com alguns gráficos para seu chefe, porém você gostaria que os gráficos compartilhassem os eixos, mas você não faz ideia de como fazer isso. Você tinha basicamente três opções:

  • Perguntar para seus colegas de trabalho
  • Encontrar um livro
  • Tentativa e erro

Com um pouco de sorte existe um colega mais experiente ou você já possui um livro com a solução, mas a probabilidade era pequena, principalmente para problemas específicos.

Hoje em dia, por outro lado:

“matplotlib subplot”

O exemplo acima parece irrelevante, mas a quantidade de vezes que isso acontece é gigantesca, vou exemplificar:

Google Search History

O Google disponibiliza o histórico das suas pesquisas em:

https://history.google.com/history/

Nos últimos 1.000 dias eu realizei pouco mais de 17.000 pesquisas!!! E os sites mais acessados foram:

  1. stackoverflow.com
  2. en.wikipedia.org
  3. cran.r-project.org
  4. steamcommunity.com
  5. http://www.gamefaqs.com

Trabalho e jogos basicamente, porém é possível fazer o download de todas essas pesquisas, então é possível ir mais longe. Vamos analisar o número de pesquisas por dia da semana:

f1

f2

Bem, nenhuma novidade aqui, o número de pesquisas de Sábados e Domingos é menor e ao longo do mês as pesquisas são consistentes com exceção do dia 31, mas isso era esperado.

f3

A utilização desde 2013 aumentou consideravelmente, não só eu já utilizo bastante o Google como essa dependência tem aumentado ao longo do tempo.

Por fim, selecionei alguns dos termos que mais pesquisei para compara-los no tempo e o gráfico abaixo é o mesmo que dei como exemplo acima, onde eu apanhei um pouco para montar um gráfico que compartilhasse os eixos no Python (como vocês podem ver, eu só comecei a estudar Python recentemente)

f4

Alguns pontos são interessantes.

  • Wikipedia é uma constante em nossas vidas
  • Meu interesse pelo R provavelmente cresceu na mesma velocidade que a adoção do pacote ‘Dplyr’, que foi lançado no começo de 2014, até lá eu só o utilizava para rodar alguns modelos, mas não para ‘brincar’ com dados
  • Ultimamente, por conta do trabalho, tenho substituído o R pelo Python
  • As pesquisas sobre jogos costumam ter a mesma duração que meu interesse sobre eles e olhando para esse gráfico eu joguei muito mais Dota do que eu gostaria de admitir.
  • Apesar de parecer, não há correlação entre as pesquisas de jogos e trabalho, eu só não incluí mais gráficos…