O que você precisa fazer em Java para dar suporte total ao aprendizado de máquina

Olá colegas!

Das últimas notícias sobre nossas próximas inovações no campo de ML / DL:

Nishant Shakla, " Machine Learning with Tensorflow " - um livro em layout, esperado nas lojas em janeiro

Delip Rao, Brian McMahan, " Processamento de linguagem natural no PyTorch " - o contrato é assinado, planejamos iniciar a tradução em janeiro.

Nesse contexto, mais uma vez desejamos retornar a um tópico doloroso - um péssimo estudo do tema ML / DL na linguagem Java. Devido à aparente imaturidade dessas soluções e algoritmos Java, uma vez decidimos abandonar o livro DL4J de Gibson e Patterson, e o artigo de Humphrey Sheil publicado hoje sugere que provavelmente estávamos certos. Convidamos você a se familiarizar com os pensamentos do autor sobre como o Java finalmente poderia competir com o Python no aprendizado de máquina

Recentemente, dei uma palestra sobre o presente e o futuro da aprendizagem mecânica e profunda (ML / DL) na empresa. No contexto de uma grande empresa, tópicos e questões mais aplicados são relevantes do que em uma conferência de pesquisa - por exemplo, como minha equipe e eu podemos começar a usar o ML e a melhor forma de integrar o ML aos sistemas que temos em operação. Em seguida, iniciou um painel de discussão sobre Java e aprendizado de máquina.

A linguagem Java está praticamente ausente no segmento de aprendizado de máquina. Quase não existem estruturas ML que seriam escritas em Java (existe o DL4J , mas, pessoalmente, não conheço ninguém que a usaria, o MXNet tem uma API no Scala, mas não em Java, e essa estrutura em si não é escrita em Java) . O Tensorflow possui uma API Java incompleta ; no entanto, o Java tem uma grande participação no desenvolvimento empresarial; nos últimos 20 anos, trilhões de dólares foram investidos nessa linguagem em quase todas as áreas possíveis: serviços financeiros, transações eletrônicas, lojas on-line, telecomunicações - lista pode continuar para sempre. No aprendizado de máquina, o “primeiro entre iguais” é Python, não Java. Pessoalmente, gosto muito de programar em Python e Java, mas Frank Greco formulou uma pergunta interessante que me levou a pensar:
Por que o Java deve competir com o Python no ML? Por que não assumir a tarefa de trazer à mente um sério apoio a ML?

Isso é importante?

Vamos justificar este tópico. Desde 1998, a linguagem Java está na Premier League, sem ela não houve eventos evolutivos e revolucionários na empresa. Estamos falando de tecnologias da Web e móveis, de comparar soluções nativas e de navegador, de sistemas de mensagens, suporte à globalização i18n e l10n, suporte a escala horizontal e armazenamento para qualquer informação corporativa que você possa imaginar - de bancos de dados relacionais a Elasticsearch

Esse nível de suporte incondicional fornece uma cultura muito saudável que se desenvolveu nos comandos Java: "nós podemos", "arregaçar as mangas e escrever código". Não existe um componente mágico ou API que não possa ser complementado ou substituído por uma boa equipe de desenvolvedores Java.

Mas esse princípio não funciona no aprendizado de máquina. Aqui, os comandos Java têm duas opções:

  1. Treinar / treinar novamente em Python.
  2. Use uma API de terceiros para adicionar recursos de aprendizado de máquina ao sistema empresarial existente.

Nenhuma dessas opções pode ser chamada de inofensiva. O primeiro requer muito tempo e investimento adiantado, além dos custos contínuos de suporte. Na segunda opção, corremos o risco de nos tornar dependentes do fornecedor, perder o suporte do fornecedor, além de ter que trabalhar com componentes de terceiros (pagando o preço pela transição da rede ao mesmo tempo), migrando para um sistema em que possa haver requisitos críticos de segurança e que tenhamos que compartilhar informações com eles. por alguém fora da sua organização. Em algumas situações, isso é inaceitável.

O mais destrutivo nesse caso (na minha opinião) é o potencial de deterioração cultural - as equipes não podem alterar o código que não entendem ou não conseguem manter, portanto as responsabilidades são borradas e o trabalho principal deve ser delegado a outra pessoa. As equipes compostas apenas por desenvolvedores Java correm o risco de perder a próxima grande onda, que inundará a computação corporativa - a onda do aprendizado de máquina.

Portanto, é importante e desejável que o suporte de primeira classe ao aprendizado de máquina apareça na linguagem e na plataforma Java. Caso contrário, existe o risco de que nos próximos 5 a 10 anos o Java seja substituído por outras linguagens nas quais o ML é melhor suportado.

Por que o Python é tão dominante no ML?

Para começar, vamos discutir por que o Python se tornou líder em aprendizado de máquina e aprendizado profundo.

Eu suspeito que tudo começou com um recurso completamente inocente - suporte para fatiar listas. Esse suporte é extensível: qualquer classe Python que implemente os métodos __setitem__ e __setitem__ pode ser cortada usando esta sintaxe. A lista a seguir demonstra como esse recurso do Python é simples e natural.

 a = [1, 2, 3, 4, 5, 6, 7, 8] print(a[1:4]) # [2, 3, 4] –      print(a[1:-1]) #  [2, 3, 4, 5, 6, 7] -  0-    print(a[4:]) # [5, 6, 7, 8] –      print(a[:4]) # [1, 2, 3, 4] –      print(a[:4:2]) # [1, 3] (    ) 

Claro, isso não é tudo. O código Python é muito mais compacto e conciso comparado ao código Java "antigo". Exceções são suportadas, mas não verificadas, e os desenvolvedores podem escrever facilmente scripts Python adequados como um item consumível - tente "como funciona" sem se afogar na visão de mundo Java "tudo é uma classe". É fácil se envolver com o Python.

No entanto, na minha opinião, o fator mais importante de superioridade (que não me impede de reconhecer o trabalho árduo que a comunidade Python está fazendo para manter a conexão entre o Python 2.7 e o Python 3) é que eles conseguiram criar uma biblioteca mais rápida e bem projetada para operações com números - NumPy. O Numpy é construído em torno do ndarray , um objeto que é uma matriz N-dimensional. Cito a documentação: “ O objeto principal do NumPy é uma matriz multidimensional homogênea. Esta é uma tabela de elementos (geralmente números), todos do mesmo tipo, indexados por uma tupla de números inteiros positivos. ” Todo o trabalho do NumPy é baseado na gravação de seus dados no ndarray e nas operações subseqüentes neles. O NumPy suporta uma variedade de opções de indexação, transmissão e vetorização para velocidade, e geralmente permite que os desenvolvedores criem e manipulem facilmente grandes matrizes numéricas.

A lista a seguir mostra na prática a indexação e transmissão no ndarray - essas são operações importantes no ML / DL.

 import numpy as np #    a = np.array([1.0, 2.0, 3.0]) b = 2.0 c = a * b print(c) #  [ 2. 4. 6.] -  b   /        c #2-d (   2)   NumPy –     - .e.  > 2 y = np.arange(35).reshape(5,7) print(y) # array([[ 0, 1, 2, 3, 4, 5, 6], # [ 7, 8, 9, 10, 11, 12, 13], # [14, 15, 16, 17, 18, 19, 20], # [21, 22, 23, 24, 25, 26, 27], # [28, 29, 30, 31, 32, 33, 34]]) print(y[0,0]) #     –    ,  0 print(y[4,]) #    4: array([28, 29, 30, 31, 32, 33, 34]) print(y[:,2]) #    2: array([ 2, 9, 16, 23, 30]) 

Trabalhando com grandes matrizes numéricas multidimensionais, marcamos o coração da programação para aprendizado de máquina e, em particular, aprendizado profundo. Redes neurais profundas são redes de nós e arestas modeladas no nível dos números. As operações de tempo de execução ao treinar uma rede ou executar uma saída com base nela requerem uma multiplicação rápida da matriz.

Graças ao NumPy, muito mais foi feito - scipy , pandas e muitas outras bibliotecas baseadas no NumPy. As principais bibliotecas de aprendizado profundo ( Tensorflow do Google, PyTorch do Facebook) estão desenvolvendo seriamente o Python. O Tensorflow possui outras APIs para Go, Java e JavaScript, mas são incompletas e são consideradas instáveis. O PyTorch foi originalmente escrito em Lua e experimentou um aumento real de popularidade quando, em 2017, passou dessa linguagem de nicho para o principal ecossistema do ML Python em 2017.

Falhas em Python

Python não é uma linguagem ideal, nem o tempo de execução mais popular, o CPython. Ele possui um bloqueio de intérprete global ( GIL ), portanto, o dimensionamento não é fácil. Além disso, as estruturas de aprendizado profundo do Python, como PyTorch e Tensorflow, ainda transmitem os principais métodos para implementações opacas. Por exemplo, a biblioteca cuDNN da NVidia teve um grande impacto no escopo da implementação do PyTorch RNN / LSTM . RNN e LSTM (redes neurais recorrentes e memória de curto prazo) são ferramentas de DL muito importantes para aplicativos de negócios, principalmente porque se especializam na classificação e previsão de séries sucessivas de comprimentos variáveis ​​- por exemplo. navegação na web, análise de fluxo de cliques, análise de fragmentos de texto, eventos do usuário etc.

Por uma questão de imparcialidade para o Python, deve-se notar que essa opacidade / limitação se aplica a quase qualquer estrutura para ML / DL, exceto escrita em C ou C ++. Porque Como para alcançar o desempenho máximo para operações básicas e altamente carregadas, como a multiplicação de matrizes, os desenvolvedores ficam o mais próximo possível do metal.

O que o Java precisa para competir nesse campo?

Presumo que a plataforma Java precise de três adições principais. Se implementado, um ecossistema saudável e próspero para aprendizado de máquina começará a se espalhar:

  1. Adicione suporte nativo à indexação / fatia ao núcleo da linguagem, para que você possa competir com o Python com toda a sua facilidade de uso e expressividade. É possível que esses recursos sejam construídos em Java em torno de uma coleção ordenada existente, a interface List <E> . Para esse suporte, também será necessário reconhecer a necessidade de sobrecarga - é necessário para cumprir o ponto 2.
  2. Crie uma implementação de tensor - provavelmente no pacote java.math , mas também com uma saída para a API Collections. Esse conjunto de classes e interfaces poderia funcionar equivalente ao ndarray e fornecia suporte adicional para indexação, em particular os três tipos de indexação disponíveis no NumPy: acesso a campos, fatias simples e indexação avançada necessária para a programação.
  3. Fornecer transmissão - escalares e tensores de dimensões arbitrárias (mas compatíveis).

Se essas três tarefas pudessem ser executadas no núcleo da linguagem Java e no tempo de execução, teríamos aberto o caminho para criar o "NumJava" , equivalente ao NumPy. O projeto do Panamá também pode ser útil para fornecer acesso vetorial de baixo nível a operações rápidas de tensores realizadas em CPUs, GPUs, TPUs e não apenas para que o Java ML possa se tornar o mais rápido do gênero.

Não digo que esses complementos sejam triviais - não, longe disso, mas seus benefícios potenciais para toda a plataforma Java são enormes.

A lista a seguir mostra como o exemplo de transmissão e indexação do NumPy pode ser exibido no NumJava com a classe Tensor , com suporte para a sintaxe de fatiamento baseada em idioma e as restrições atuais de sobrecarga do operador.

 //      Java    //  var-  Java 10   //  Java    ,      "a * b" //       ? var a = new Tensor([1.0, 2.0, 3.0]); var b = 2.0; var c = a.mult(b); /** *    , ,      Tensor  Java. */ import static java.math.Numeric.arange; //arange   ,  reshape    var y = arange(35).reshape(5,7); System.out.println(y); // tensor([[ 0, 1, 2, 3, 4, 5, 6], // [ 7, 8, 9, 10, 11, 12, 13], // [14, 15, 16, 17, 18, 19, 20], // [21, 22, 23, 24, 25, 26, 27], // [28, 29, 30, 31, 32, 33, 34]]) System.out.println(y[0,0]); //     –    ,  0 System.out.println(y[4,]); //    4-  (5-     0): tensor([28, 29, 30, 31, 32, 33, 34]) System.out.println(y[:,2]); //    2-  (3-     0): tensor([ 2, 9, 16, 23, 30]) 

Perspectiva e Apelo à Ação

Todos sabemos que o aprendizado de máquina transformará o mundo dos negócios não menos do que em seu tempo - bancos de dados relacionais, Internet e tecnologias móveis. Há muita publicidade em torno dele, mas alguns artigos e conclusões muito convincentes aparecem. Por exemplo, este artigo descreve o futuro em que o sistema pode aprender as configurações ideais do servidor de banco de dados, servidor da Web e servidor de aplicativos em segundo plano, usando o aprendizado de máquina. Você nem precisa implantar o ML em seu próprio sistema - definitivamente, um de seus fornecedores poderá fazer isso.

Com base nas posições pragmáticas apresentadas neste artigo, você pode escrever em Java estruturas menos para aprendizado de máquina e aprendizado profundo (trabalhando em JRE) do que estruturas existentes para a Web, armazenamento de longo prazo ou análise de XML - imagine! Você pode imaginar estruturas Java com suporte para redes neurais convolucionais (CNNs) para implementações de visão computacional de ponta, tais implementações de LSTMs de redes neurais recorrentes para conjuntos de dados seriais (que são de importância fundamental para os negócios), com os recursos mais avançados de ML, como diferenciação automática e muito mais. Essas estruturas ajudariam a implementar e alimentar a próxima geração de sistemas corporativos que poderiam ser perfeitamente integrados aos sistemas Java existentes usando todas as mesmas ferramentas - IDEs, estruturas de teste e integração contínua. Mais importante ainda, eles serão escritos e apoiados por nosso povo. Se você é fã de Java - não gosta dessa perspectiva?

Source: https://habr.com/ru/post/pt429596/


All Articles