a beleza das línguas funcionais na aprendizagem profunda – Clojure e Haskell

a aprendizagem profunda é um subconjunto de métodos de aprendizagem de máquinas que são baseados em redes neurais artificiais. Estes são inspirados pelo processamento de informação e nós de comunicação distribuídos em sistemas biológicos como o cérebro. No aprendizado profundo, cada nível aprende a transformar os dados de entrada em uma representação um pouco mais abstrata e composta. Por exemplo, em um sistema de reconhecimento facial, pixels podem ser uma camada do sistema, enquanto as arestas podem ser outra, os olhos podem ser outra, e o rosto pode ser outra. A complexidade dos métodos de aprendizagem profunda torna o uso de pacotes existentes populares na comunidade de programação. TensorFlow e PyTorch em Python são populares, como é o Keras pacote em R. no Entanto, na produção de profunda dos sistemas de aprendizagem, o desempenho e a segurança são duas questões que impulsionam as empresas a escolher funcionais linguagens de programação, tais como Clojure e Haskell em vez disso.

image

as dificuldades de implementações de aprendizagem profunda

em colocar Sistemas de aprendizagem profunda na produção, redes neurais podem conter um milhão de parâmetros. Os dados podem explodir rapidamente para treinar estes parâmetros. Esta explosão de dados requer um desempenho que só pode ser alcançado por uma linguagem de programação eficiente com uma concorrência segura e capacidades de paralelismo. Devido à complexidade das redes neurais, com dados passados de camada para camada, simplicidade e consistência na forma como a linguagem de programação lida com esses dados é importante. De segurança, neste caso, significa a capacidade de preservar o estado dos dados originais, de modo consistente, enquanto que simplicidade significa ser capaz de ler e manter a base de código facilmente ao maximizar o desempenho.

Por que a programação funcional é mais adequado para uma aprendizagem mais profunda

Em uma tentativa de resolver algumas das dificuldades que podem ocorrer durante a execução de uma aprendizagem mais profunda, os programadores estão descobrindo que os funcionais linguagens de programação podem fornecer soluções.

em Ciência da computação, programação funcional é um paradigma de programação que trata a computação como a avaliação de funções matemáticas e evita mudanças de estado e dados mutáveis. É um padrão de programação que está mais perto do pensamento matemático.

modelos de aprendizagem profunda são essencialmente modelos matemáticos. Por exemplo, redes neurais artificiais compreendem nós conectados, cada um dos quais realiza operações matemáticas simples. Usando uma linguagem de programação funcional, os programadores são capazes de descrever essas operações matemáticas em uma linguagem que está mais perto das próprias operações. A forma explícita como estes programas são escritos torna a leitura e a manutenção da base de código muito mais fácil. Ao mesmo tempo, a natureza da composição de algoritmos de aprendizagem profunda significa que, em cada camada do trabalho neural, as camadas ou as funções tendem a se unir para executar tarefas. Isto pode ser facilmente implementado usando o encadeamento funcional de uma linguagem de programação funcional.

image

além disso, na aprendizagem profunda, quando as funções são aplicadas aos dados, os dados não mudam. Novos valores podem ser de saída sequencialmente abaixo da linha, mas os próprios dados permanecem consistentes. A característica de imutabilidade de uma linguagem de programação funcional permitirá ao programador criar um novo conjunto de dados cada vez que novos valores são gerados sem alterar o conjunto de dados imutáveis original. Isso torna mais fácil manter a consistência dos dados em toda a rede neural. Finalmente, o grande número de parâmetros e dados de formação envolvidos na implementação da aprendizagem profunda significa que o paralelismo e a concorrência são as chaves para a criação de sistemas de aprendizagem profunda a nível da produção. Paralelismo significa executar tarefas em diferentes CPUs para acelerar o processo de aprendizagem. Concorrência significa a capacidade de gerenciar threads para evitar conflitos. A programação funcional permite concurrenciação e paralelismo sem custo. Isto significa que, por sua natureza, programação funcional, onde a função pura é apátrida, sempre produzirá a mesma saída para uma dada entrada, leva à capacidade de isolar qualquer função, e executar sempre que você quiser. Isto torna a concorrência e o paralelismo muito mais fáceis de gerir. Você não tem que lidar com questões como cadeados e condições de corrida. Diferentes threads acessando diferentes CPUs serão capazes de executar independentemente, sem contendas. Com a programação funcional ganhando popularidade no ensino profundo, e com os pacotes robustos disponíveis para o ensino profundo, o Clojure é agora favorecido por empresas como o Walmart e o Facebook. É uma linguagem de programação funcional dinâmica e de alto nível baseada na linguagem de programação LISP e tem compiladores que permitem executar tanto no ambiente Java quanto no.NET.

o poder da programação concorrente em Clojure

Clojure não substitui o sistema de linhas Java, mas funciona com ele. Uma vez que as estruturas de dados do núcleo são imutáveis, elas podem ser compartilhadas prontamente entre threads. Ao mesmo tempo, mudanças de Estado no programa são possíveis, mas a Clojure fornece mecanismos para garantir que os Estados permaneçam consistentes. Se ocorrerem conflitos entre 2 transações tentando modificar a mesma referência, uma delas se retirará. Não há necessidade de bloqueio explícito.

(import '(java.util.concurrent Executors))(defn test-stm (let (fn (dotimes (dosync (doseq (alter r + 1 t)))))) (range nthreads))] (doseq (.get future)) (.shutdown pool) (map deref refs)))(test-stm 10 10 10000) -> (550000 550000 550000 550000 550000 550000 550000 550000 550000 550000)

fonte

o paralelismo na Clojure é barato

na aprendizagem profunda, os modelos têm de treinar em grandes quantidades de dados. O paralelismo implica executar vários tópicos em diferentes CPUs. O paralelismo que é barato significará melhorias significativas no desempenho. Usando partição em conjunto com mapa pode alcançar paralelismo que é menos caro.

(defn calculate-pixels-2 (let (doall (map (fn (let (get-color (process-pixel (/ row (double *width*)) (/ col (double *height*)))))) x))) work)] (doall (apply concat result))))

Fonte

Encadeamento de funções em Clojure significa clareza

Em Clojure, há muitas funções para muito poucos tipos de dados. Funções também podem ser passadas como argumentos para outras funções, o que torna possíveis funções de encadeamento em aprendizagem profunda. Com a implementação mais próxima do modelo matemático real, o código Clojure pode ser simples de ler e manter.

;; pipe arg to function(-> "x" f1) ; "x1";; pipe. function chaining(-> "x" f1 f2) ; "x12"

fonte

identidade e estado em Clojure fornecer segurança

em Clojure, a identidade de cada modelo tem um estado em qualquer momento. Esse estado é um valor verdadeiro que nunca muda. Se a identidade parece mudar, é porque está associada a um estado diferente. Novos valores são funções antigas. Dentro de cada camada da rede neural, o estado dos dados originais é sempre preservado. Cada conjunto de dados com novos valores que são saídas de funções pode operar de forma independente. Isso significa que as ações podem ser realizadas sobre esses conjuntos de dados com segurança ou sem consideração à disputa. Podemos voltar ao estado original dos dados a qualquer momento. Por conseguinte, coerência, neste caso, significa segurança.

Bibliotecas e limitações

historicamente, a cortex machine learning library contém tudo o que você precisa para implementar algoritmos de aprendizagem de máquinas em Clojure. Com a recente crescente popularidade do framework MXNet de código aberto para a aprendizagem profunda, é mais fácil implementar a aprendizagem profunda usando a API MXNet-Clojure.

embora existam Agora diferentes APIs e bibliotecas de aprendizagem de máquinas disponíveis para o Clojure, ainda há uma curva de aprendizagem íngreme para se tornar fluente nele. As mensagens de erro podem ser crípticas e as empresas terão que estar dispostas a investir adiantado para usá-lo para escalar seus sistemas de aprendizagem de máquina. Como mais exemplos de sistemas prontos para a produção são escritos em Clojure, a linguagem vai ganhar mais popularidade nos próximos anos, mas apenas se o número e o tamanho das bibliotecas que acompanham o uso do Clojure crescer de forma consistente.

Haskell

Haskell é uma linguagem funcional que é estaticamente tipada com inferência de tipo e avaliação preguiçosa. Baseia-se na semântica da linguagem de programação Miranda e é considerada mais expressiva, mais rápida e mais segura para implementar a aprendizagem de máquinas.

segurança do tipo em Haskell fornece segurança e flexibilidade

segurança do tipo define restrições sobre os tipos de valores que uma variável pode manter. Isso ajudará a prevenir operações ilegais, fornecer melhor segurança de memória e levar a menos erros lógicos. A avaliação preguiçosa significa que Haskell vai atrasar a avaliação de uma expressão até que seu valor seja necessário. Também evita avaliações repetidas, o que economizará tempo de execução. Ao mesmo tempo, a avaliação preguiçosa permite que estruturas de dados infinitas sejam definidas. Isto dá a um programador possibilidades matemáticas ilimitadas.

Simples de código explícito em Haskell fornece implementações

Um dos maiores benefícios do Haskell é que ele pode descrever algoritmos em muito explícita construções matemáticas. Você pode representar um modelo em algumas linhas de código. Você também pode ler o código da mesma forma que você pode ler uma equação matemática. Isso pode ser muito poderoso em algoritmos complexos como algoritmos de aprendizagem profunda na aprendizagem de máquinas. Por exemplo, a implementação abaixo de uma única camada de uma rede neural feed-forward mostra o quão legível o código pode ser.

import Numeric.LinearAlgebra.Static.Backproplogistic :: Floating a => a -> alogistic x = 1 / (1 + exp (-x))feedForwardLog :: (KnownNat i, KnownNat o) => Model (L o i :& R o) (R i) (R o)feedForwardLog (w :&& b) x = logistic (w #> x + b)

fonte

paralelismo Multicore em Haskell fornece desempenho

na aprendizagem profunda, redes neurais típicas conterão um milhão de parâmetros que definem o modelo. Além disso, uma grande quantidade de dados é necessária para aprender estes parâmetros, que, computacionalmente, é muito demorado. Em uma única máquina, usar múltiplos núcleos para compartilhar a memória e o processo em paralelo pode ser muito poderoso quando se trata de implementar o aprendizado profundo. Em Haskell, no entanto, implementar paralelismo multicore é fácil.

Bibliotecas e limitações

Haskell’s HLearn library contains machine learning algorithm implementations, while the tensor-flow binding for Haskell can be used for deep learning. Paralelo e concorrente, enquanto isso, são usados para o paralelismo e a concorrência.

embora existam algumas bibliotecas de aprendizagem de máquinas desenvolvidas em Haskell, implementações básicas ainda precisam ser feitas para implementações Haskell prontas para a produção. Enquanto as bibliotecas públicas disponíveis para tarefas específicas de aprendizagem profunda e de aprendizagem de máquinas são limitadas, o uso de Haskell na AI também será limitado. Empresas como Aetion Technologies e Credit Suisse Global Modeling and Analytics Group estão usando Haskell em suas implementações—aqui está uma lista completa das organizações que o usam.

Conclusion

Deep learning models are complex mathematical models that require specific layering of functions. Linguagens de programação funcionais como Clojure e Haskell muitas vezes podem representar a complexidade com código mais limpo que está mais perto da matemática do modelo. Isso leva a economia de tempo, eficiência e fácil gestão da base de código. Propriedades específicas de programação funcional permitem que as implementações nestas linguagens sejam mais seguras do que as de outras linguagens. À medida que o desenvolvimento da tecnologia de IA progride, a avaliação dessas línguas para as necessidades de projetos de desenvolvimento de sistemas em grande escala em AI se tornará mais prevalente.

este artigo faz parte do código, a mídia para desenvolvedores, por desenvolvedores. Descubra mais artigos e vídeos visitando por trás do Código!

quer contribuir? Publiquem!

Siga-nos no Twitter para ficar sintonizado!

Ilustração por Victoria Roussel

Deixe uma resposta

O seu endereço de email não será publicado.