Back-End

7 ago, 2017

Desenvolvimento de soluções cognitivas IoT para detecção de anomalias através de deep learning

Publicidade

Introduzindo redes de memória de curto e longo prazo e de deep learning – Detectando anomalias nos dados da série temporal IoT usando deep learning

Série de conteúdo:

Este conteúdo é parte 1 de 5 na série: Desenvolvimento de soluções cognitivas IoT para detecção de anomalia usando deep learning

Embora as previsões sejam sempre controversas, o Gartner diz que há 8,4 bilhões de dispositivos IoT conectados em 2017 (sem contar smartphones) e alguns analistas dizem que até 2020 haverá 50 bilhões. Mesmo que seja superestimado, em breve o número de dispositivos IoT excederá o número de seres humanos no planeta. E adivinhe, todos esses dispositivos estão gerando dados continuamente; dados que são inúteis, a menos que você possa analisá-los.

Um sistema cognitivo fornece um conjunto de capacidades tecnológicas, como inteligência artificial (AI), processamento de linguagem natural, aprendizado de máquina e aprendizado de máquina avançado para ajudar a analisar todos esses dados. Os sistemas cognitivos podem aprender e interagir naturalmente com humanos para obter informações sobre os dados e ajudá-lo a tomar melhores decisões. No meu último artigo, afirmei que a computação cognitiva não é apenas uma interação homem-computador (IHC), é uma aprendizagem de máquina avançada conduzida por algoritmos poderosos (modelos) e capacidades de processamento de dados quase ilimitadas.

Para entender um sistema cognitivo que usa sensores IoT e análise de deep learning, primeiro você precisa entender o salto da aprendizagem de máquina avançada para as redes neurais. Neste artigo, tento ajudá-lo a dar esse salto. Nas próximas semanas, apresentarei três tutoriais diferentes sobre a detecção de anomalias em dados de séries temporais no Apache Spark usando os frameworks de aprendizagem profunda Deeplearning4j, ApacheSystemML e TensorFlow (TensorSpark) para ajudá-lo a entender completamente como desenvolver soluções cognitivas IoT para detecção de anomalias usando a aprendizagem profunda.

 

Da aprendizagem de máquinas para redes neurais e aprendizagem profunda

Se um sistema cognitivo é baseado em modelos, você precisa olhar primeiro para o que é um modelo de aprendizagem de máquina. É um modelo estatístico (caixa preta) que em contraste a um modelo físico (caixa branca) foi treinado com dados para aprender um padrão oculto.

Veja a Tabela 1. Ela contém dados históricos sobre diferentes parâmetros, observações mensuradas  em um pipeline de fabricação e um resultado binário.

Tabela 1. Modelo de aprendizagem em máquina

Part No. Max Temp. 1 Min Temp. 1 Max Vibration 1 Outcome
100 35 35 12 Healthy
101 36 35 21 Healthy
130 56 46 3412 Faulty

 

Neste exemplo altamente artificial, os números falam por si mesmos. Como você pode imaginar, uma alta temperatura e alta vibração levaram a uma parte defeituosa. A causa raiz dessa situação deve ser o resultado de um rolamento quebrado em uma máquina.

Neste exemplo, um algoritmo de aprendizagem de máquina (supervisionado) é capaz de considerar todos esses dados (e muito mais) para aprender e prever falhas a partir de dados puros. O componente que esse algoritmo produz é chamado de modelo de aprendizagem de máquina.

Um tipo especial de algoritmo de aprendizagem de máquina é uma rede neural. Ela é altamente adaptável aos dados e é capaz de aprender qualquer função matemática oculta entre os dados e o resultado. O único senão com redes neurais é a enorme quantidade de recursos computacionais e dados que elas precisam para executar bem. Então, por que estou falando sobre redes neurais artificiais? Nós vivemos em um mundo IoT com enormes quantidades de dados disponíveis e também (quase) energia computacional ilimitada disponível usando a nuvem. Esta situação torna as redes neurais especialmente interessantes para o processamento de dados IoT.

As redes neurais são inspiradas pelo cérebro humano, assim como as redes de deep learning. A principal diferença entre uma rede neural e uma rede deep learning é a adição de múltiplas camadas neurais. O exemplo mais óbvio de como a aprendizagem profunda está superando o aprendizado de máquina tradicional é o reconhecimento da imagem. Todo sistema de última geração usa um tipo especial de rede neural de deep learning (chamada rede neural de convolução) para executar suas tarefas.

Por exemplo, os algoritmos de reconhecimento de imagem baseados em aprendizagem profunda são capazes de distinguir partes saudáveis de partes defeituosas em uma pipeline de fabricação. Eu chamaria isso de inteligência da máquina e está disponível como no IBM Watson Visual Recognition Service. Para este exemplo particular, a máquina pode realizar a mesma tarefa com a mesma precisão que um ser humano. A única vantagem da máquina é que ela nunca dorme, nunca está doente e nunca se machuca. E, se você precisa dobrar a produtividade, basta duplicar a quantidade de recursos de hardware ou de nuvem. Mas a aplicação de uma análise de causa de raiz sobre o porquê das partes às vezes serem defeituosas continua sendo o domínio de especialistas humanos. No entanto, esse cenário é onde as soluções cognitivas aplicam aprendizagem profunda.

De fato, um serviço de reconhecimento visual retorna muito mais informações do que apenas um resultado binário de “saudável” ou “defeituoso”. Assim como um humano, o serviço detecta estruturas e regiões nas imagens que se desviam da norma. Agora, se você estivesse correlacionando todos os dados de sensores de som e vibração com todos os dados de reconhecimento visual, tenho certeza de que um sistema desse tipo poderia detectar a causas raiz das falhas tão bem quanto ou até mesmo melhor do que os humanos.

 

Como as redes neurais artificiais funcionam

Se os sensores IoT conectados a um corretor de mensagens (como a Plataforma IBM Watson IoT baseada em MQTT) são o sistema nervoso central das soluções cognitivas, então o deep learning é o cérebro. E, para entender o deep learning, você precisa de uma compreensão básica de regressão, perceptrons, redes neurais biológicas e artificiais e camadas ocultas.

 

Comece com regressão linear e logística

Existe uma tonelada de literatura científica sobre a regressão, então vou tentar dar uma explicação do caminho curto adaptada para desenvolvedores. Considere a Tabela 2. É o mesmo que a Tabela 1, exceto que aqui eu tornei o resultado uma representação binária.

Tabela 2. Dados da rede neural artificial

Part No. Max Temp. 1 Min Temp. 1 Max Vibration 1 Outcome
100 35 35 12 1
101 46 35 21 1
130 56 46 3412 0

 

É muito fácil escrever um pedaço de software para fazer a classificação.

def  predict  (datapoint):  
     if  datapoint.MaxVibration1 > 100 : 
         return 0 
     else : 
         return 1

Este exemplo de um modelo de caixa branca é onde seu conhecimento do sistema físico subjacente (ou um especialista em domínio que examina os dados) ajudou a criar algumas regras. A ideia de aprendizagem de máquina é fazer com que as máquinas aprendam essas regras a partir de dados. E a forma como este aprendizado é realizado é usando um esqueleto e um algoritmo de otimização para preencher as partes faltantes do esqueleto. Eu usarei esse esqueleto (regressão linear):

def  predict (dp) : 
     return  a + b * dp.MaxTemp1 + c * dp.MinTemp1 + d * dp.MaxVibration1

Como você pode ver, se eu escolher os parâmetros b e c para ser 0, a para ser 1 e d para ser -0,0002930832 (que é -1/3412), acabo bastante próximo do resultado necessário. E a boa notícia é que os parâmetros a, b, c e d podem ser aprendidos a partir de um algoritmo. O resultado: aprendizado de máquina!

Você pode notar que os resultados não são exatamente 1 ou 0 porque a regressão linear é um modelo contínuo (tentando prever os valores do tipo flutuador). Mas o que eu quero é um classificador binário. Deixe-me transformar este algoritmo em um modelo de regressão logística apenas adicionando uma função auxiliar chamada sigmoid.

import  math 
 
def  sigmoid (x): 
    return  1 / (1  +  math.exp( - x)) 
 
def  predict (dp): 
    return  sigmoid(a + b * dp.MaxTemp1 + c * dp.MinTemp1 + d * dp.MaxVibration1)

A função sigmoide não faz outra coisa além de comprimir um intervalo de infinito negativo para infinito positivo para um intervalo de 0 – 1. A única coisa que preciso fazer é definir um limite, por exemplo, transformando valores <0,5 para 0 e> 0,5 para 1 .

Figura 1. O intervalo do mapa de função sigmóide

 

A rede neural mais simples: perceptron

Você já dominou a rede neural mais simples: um perceptron. É semelhante a um modelo de regressão logística – com algumas diferenças insignificantes. Mas o termo “redes neurais” soa muito mais frio, não é? Olhe para o perceptron na Figura 2.

Figura 2. Um perceptron

 

Eu tenho nossa entrada para o modelo x_1 para x_n, e os parâmetros do modelo w_1 para w_n. E, então, eu somo tudo e comprimo com uma função de ativação (por exemplo, sigmoid). Se eu escrever este modelo um pouco diferente, ele parece isso:

out(x_1,x_2,…,x_n) = activation_function(w_0+w_1*x_1+w_2*x_2+…+w_n*x_n)

E se eu substituir activation_function com sigmoid, volto à regressão logística. A única coisa é que agora parece um pouco mais a estrutura de um cérebro. Mas como é o cérebro humano?

 

Das redes neurais biológicas às redes neurais artificiais

Olhe para o neurônio biológico na Figura 3. Em termos matemáticos, os dendritos são as “entradas” onde os dados a ascendentes são alimentados, o corpo da célula (e as sinapses) calculam a soma e a “função de ativação”, e o “resultado” é enviado para a jusante sobre o axônio para subsequentes neurônios a jusante.

Figura 3. Neurônio biológico

 

E porque é divertido (pelo menos é para mim), olhe a Figura 4 sobre uma sinapse biológica conectando neurônios (bioquimicamente) juntos. Esta figura representa o conjunto de valores w_n no perceptron.

Figura 4. Sinapse biológica

Se você prender vários neurônios juntos, você terá um cérebro ou uma rede neural artificial como mostrado na Figura 5.

Figura 5. Rede neural artificial

 

A diferença está na camada oculta

A maior diferença entre essa rede artificial e o perceptron é a camada oculta. Sobre o que é tudo isso? É útil? Talvez. Pelo menos no cérebro humano, as camadas ocultas parecem ser úteis porque temos centenas de camadas escondidas empilhadas em nosso cérebro. Neste exemplo de rede neural feed-forward na Figura 6, você pode ver que os modelos estão empilhados.

Figura 6. Empilhamento de camadas de rede neural para reconhecimento de imagem

 

Não pode vê-lo? Veja como este modelo seria exibido em uma linguagem de programação. Mas antes de fazer isso, deixe-me dizer-lhe um segredo. Um segredo que os matemáticos usam para assustar a todos. Mas é totalmente simples. Estou falando sobre a multiplicação de vetores. Então, o que é um vetor? Apenas uma lista de números, nada mais. Os programadores podem chamá-lo de uma matriz. E a multiplicação em vetores é definida de maneira ligeiramente diferente. Diz que se você tem um vetor x = (x_1, x_2, …, x_n) e outro vetor w = (w_1, w_2, …, w_n) e se você multiplicar x*w o resultado é um valor único: w_1*x_1+w_2*x_2+…+w_n*x_n

Este modelo parece familiar para você? Caso não seja, veja novamente a regressão linear. Eu posso computar um único neurônio calculando sigmoid (x*w). E porque o Python não suporta a multiplicação de vetores por padrão, eu posso usar uma biblioteca chamada numpy para fazer isso. Vou começar a computar um único neurônio:

import numpy as np 
 
datapoint = {" MaxTemp1 ": 35 , " MinTemp1 ": 35 , " MaxVibration1 ": 12 } 
 
#randomly initialize weights
w_layer1 = np.random.rand(4)
 
def  neuron1 (dp): 
    x = np.array([ 1 ,dp[" MaxTemp1 "],dp[" MinTemp1 "],dp[" MaxVibration1 "]]) 
    return  sigmoid(x.dot(w_layer1)) 
 
print (neuron1 ( datapoint ) )

Se eu quiser computar vários neurônios ao mesmo tempo (por exemplo, todos os neurônios de uma camada), então eu posso usar esta função várias vezes. Mas os matemáticos inventaram mais uma coisa para confundir você (no caso de você ter sobrevivido à multiplicação de vetores): multiplicação da matriz. Nas redes neurais, você pode aplicar cálculos como em regressão linear várias vezes em paralelo, e você pode escrever isso como uma multiplicação de matriz nesta forma.

Mais uma vez, eu suponho que nossa entrada está no vetor x = (x_1, x_2, …, x_n). Mas agora eu quero calcular todos os neurônios na camada oculta ao mesmo tempo. Em vez de multiplicar x por um vetor de peso w para calcular um único neurônio, multiplico x com uma matriz de peso w =

w_1_1,  w_1_2,.., w_1_m

w_2_1,  w_2_2,.., w_2_m

w_n_1,  w_n_2,.., w_n_m

 

A multiplicação da matriz define w*x =

(w_1_1*x_1,  w_1_2*x_2,.., w_1_m*x_n,

w_2_1*x_1,  w_2_2*x_2,.., w_2_m*x_n,

w_n_1*x_1,  w_n_2*x_2,.., w_n_m*x_n)

 

Meu resultado é um vetor de valores flutuadores que eu, então, posso alimentar na próxima camada. Aqui o mesmo código no Python:

import numpy as np 
 
#make sigmoid function applicable to vectors instead of scalars only
def  sigmoid (z): 
    s =  1.0  / ( 1.0  + np.exp(- 1.0  * z)) 
      return  s 
 
datapoint = {" MaxTemp1 ": 35 , " MinTemp1 ": 35 , " MaxVibration1 ": 12 } 
 
#randomly initialize weights, now as a matrix for the four hidden layer neurons
w_layer1 = np.random.rand(4,4)
 
def  layer 1 (dp): 
    x = np.array([ 1 ,dp[" MaxTemp1 "],dp[" MinTemp1 "],dp[" MaxVibration1 "]]) 
      return  sigmoid(x.dot(w_layer1)) 
 
print ( layer 1 ( datapoint ) )

Como você pode ver, o fragmento de código x.dot (w_layer1) não muda nada. Mas, internamente, uma multiplicação de matriz é aplicada em vez de uma multiplicação vetorial porque w_layer1 é agora uma matriz em vez de um vetor. Finalmente, preciso adicionar a camada de saída e, então, acabei:

w_layer2 = np.random.rand( 5 , 2 ) 
 
def  layer2 (x): 
    x = np.concatenate(([ 1 ],x)) 
      return  sigmoid(x.dot(w_layer2)) 
 
print (layer2(layer1(datapoint)))

Claro, a matriz de peso w não está treinada, mas apenas inicializada aleatoriamente. O treinamento de uma rede neural está além do escopo deste artigo.

Nota: Esta rede neural aleatória emite dois números de flutuação. Esses números são as probabilidades de um item pertencente a uma classe ou a outra. Novamente, porque a rede neural não está treinada, esses números não fazem sentido por enquanto.

[ 0.97435552   0.89144977]

 

Aprofundando na camada oculta

Qual é o propósito da camada oculta? Cada camada pode ser vista como um algoritmo de aprendizagem de máquina individual por si própria. A saída de uma camada a montante é usada como entrada e sua saída é passada para a próxima camada, que então a leva como entrada para a próxima camada, e assim por diante. Esse comportamento significa que, ao empilhar camadas e criar uma rede neural profunda, o sistema está aprendendo representações intermédias de dados para ajudar uma camada a jusante a apresentar melhor desempenho. O exemplo mais inspirador é o sistema de visão do cérebro humano. As primeiras camadas (as que estão logo após seus fotorreceptores) não reconhecem rostos, carros e gatos, mas reconhecem formas como linhas, círculos, retângulos e pontos. Quanto mais profundo você vai, mais coisas uma camada pode reconhecer… até que você eventualmente reconheça toda a imagem.

Isso me leva à conclusão desta seção: Uma rede neural de feed-forward profunda pode aprender qualquer função matemática (contanto que sejam fornecidos dados suficientes e poder de computação para treiná-la).

 

Os dados da série temporal precisam de redes de memória de curto e longo prazo

Espero que esteja convencido de que as redes neurais são bastante poderosas. Mas, infelizmente, quando se trata de dados da séries temporais (e os dados IoT são principalmente dados de séries temporais), as redes de feed-forward têm um senão. Essas redes são ruins ao reconhecer as sequências porque elas não possuem memória. Uma solução para este problema é a adição de ciclos de feedback.

Figura 7. Ciclos de Feedback

 

Esses ciclos de feedback de alguma maneira consertam o problema porque agora a rede pode se lembrar. Mas funciona apenas em eventos temporariamente fechados. Se a rede deve lembrar de eventos temporais mais distantes, as células de memória devem ser adicionadas aos neurônios para obter uma rede de memória de curto e longo prazo (LSTM) como mostrado na Figura 8.

Figura 8. Redes de memória de curto e longo prazo

 

O treinamento precisa de poder de computação

Qual a desvantagem de uma rede LSTM? Ela precisa de muitos dados e muito poder de computação para alcançar um bom desempenho ao usar redes neurais. A boa notícia é que os cartões atuais da unidade de processamento gráfico (GPU) têm o mesmo poder de computação que um cluster de núcleo de 16.000 em 2009. E a IBM está no processo de liberar um chip neuromórfico como uma oferta do IBM Watson Group com o mesmo poder de computação, mas consumindo apenas 3 watts. Portanto, há esperança para futuras melhorias no desempenho e economia de energia.

As redes LSTM estão superando os algoritmos de última geração na previsão de séries temporais e detecção de anomalia, conforme descoberto nas seguintes publicações:

  • Redes de Memória de Curto e Longo Prazo para Detecção de Anomalia em Séries Temporais;
  • Aprendizagem profunda para Modelagem de Séries Temporais CS 229 Relatório Final do Projeto;
  • Detecção de anomalia baseada em Autoencoder Variacional usando Probabilidade de Reconstrução.

 

As redes LSTM podem aprender qualquer algoritmo

Por que estou falando tudo isso para um cenário cognitivo IoT? Uma vez que uma rede LSTM é Turing completa. Isso significa que uma rede LSTM pode aprender qualquer algoritmo que um computador possa executar. Ponto final.

E isso contrasta com muitos dos algoritmos de aprendizado de máquinas de última geração que são usados para previsões de séries temporais e detecções de anomalia, que são as disciplinas sobre as quais o IoT cognitivo trata. Em aplicações cognitivas IoT, você precisa prever o Estado futuro do sistema para tomar medidas regulatórias antecipadamente, ou você quer ser notificado se algo estiver fora de ordem.

Então, qual é o problema com os algoritmos de última geração? Nenhum. Estou dizendo que as LSTM geralmente funcionam melhor do que a última geração; às vezes significativamente, às vezes um pouco, e raramente pior (especialmente se você tiver dados suficientes para treinar o sistema). Depende do seu caso de uso, se o ganho em precisão justificar os custos computacionais adicionais.

 

Caso de uso de demonstração: Detecção de anomalias para dados de séries temporais IoT

Eu quero que você comece a pensar neste caso de uso de demonstração. Este caso de uso será a base para os tutoriais de acompanhamento. Considere a tarefa de detectar anomalias em dados de sensores de vibração (acelerômetro) que medem um rolamento. Você deve anexar um sensor ao rolamento, como mostrado na Figura 9.

Figura 9. Sensor do acelerômetro em um rolamento

“Um atractor de Lorenz é um modelo físico teórico de equações diferenciais comuns proposto em 1963 por Edward Lorenz, um dos pioneiros na teoria do caos. (Você pode ler mais sobre os sistemas Lorenz neste artigo da Wikipedia). No modelo, x, y e z compõem o estado do sistema. No nosso caso, as intensidades de vibração atuais do rolamento a serem simuladas, onde t é tempo e σ (sigma), ρ (rho), β (beta) são os parâmetros do sistema. Para mudar este modelo de estado saudável para estado defeituoso, estou apenas alterando ligeiramente os parâmetros σ (sigma), ρ (rho), β (beta), o que resulta em uma trajetória completamente diferente do estado do sistema x, y e z em relação a tempo.”

 

Um sensor de acelerômetro registra vibrações em cada um dos três eixos geométricos x, y e z. Existem sensores mais sofisticados que também levam em consideração os padrões de movimento rotativo, mas estamos bem com esse simples, pois pode ser encontrado em todo smartphone. (Se quiser aprender como acessar e analisar o acelerômetro em seu smartphone, você pode seguir este tutorial.) Como é difícil levar esse sistema com você, preciso implementar um simulador no Node-RED para gerar dados usando um modelo físico de atração Lorenz. Eu usarei esses dados gerados nos tutoriais para detectar anomalias, basicamente prevendo quando um rolamento está prestes a quebrar.

Posso mudar o gerador de dados de teste entre dois estados: saudável e defeituoso. A Figura 10 é um gráfico de fase que mostra as três dimensões de vibração em uma série temporal em um estado saudável.

Figura 10. Gráfico de fase de um estado saudável

Com o mesmo gráfico de fase da Figura 10, você pode observar quando alterar os parâmetros do modelo físico levemente para obter um estado defeituoso.

Figura 11. Gráfico de fase em um estado defeituoso

Se você não está familiarizado com os gráficos de fase, aqui está um gráfico de execução na Figura 12 e Figura 13 para os valores de três eixos (novamente em estado saudável e defeituoso).

Figura 12. Gráfico de execução em um estado saudável

Figura 13. Gráfico de execução em um estado defeituoso

Uma técnica comum é transformar esses dados do tempo para o domínio da frequência usando DFT (transformação discreta de Fourier) ou wavelets. Novamente, estou mostrando na Figura 14 e na Figura 15 o DFT para estados saudáveis e defeituosos.

Figura 14. Transformação de Fourier discreta de estado saudável

Figura 14. Transformação de Fourier discreta de estado defeituoso

Você pode ver claramente que o estado defeituoso tem mais energia e frequências adicionais presentes. Estes dados seriam suficientes para treinar um classificador como você aprendeu antes. Mas nós podemos fazer melhor. Construiremos um sistema capaz de aprender um comportamento normal a partir de dados, e depois de ver novos dados (não vistos) (ou padrões sequenciais) ele emitirá um alerta.

Esse sistema é um auto-encoder baseado em LSTM como mostrado na Figura 16.

Figura 16. Modelo do auto-encoder LSTM

 

Este sistema comprime a grande quantidade de dados através de um gargalo neural para tentar reconstruir os mesmos dados que viu, mas, obviamente, usando um gargalo, perde grandes quantidades de dados irrelevantes. Essa rede neural aprende como um sistema normalmente se comporta e, assim que novos padrões são vistos, tem dificuldade para reconstruir os dados e eleva um alerta.

 

Conclusão

Neste ponto, você deve ter uma compreensão suficiente das redes neurais e sobre o que a aplicação de conceitos de deep learning aos seus dados pode fazer pelos seus dados IoT em seu sistema cognitivo.

No próximo conjunto de tutoriais, vou focar no uso de diferentes tecnologias no Apache Spark para implementar um sistema de deep learning e no consolidar ainda mais sua compreensão sobre o impacto que tal tecnologia pode ter em seus sistemas. Vou falar sobre soluções de código aberto e abertas por padrão em execução no IBM Cloud, como Deeplearning4j, Apache SystemML e TensorFlow (TensorSpark).

Recursos para download

PDF deste conteúdo

 

***

 

Romeo Kienzler faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://www.ibm.com/developerworks/analytics/library/iot-deep-learning-anomaly-detection-1/index.html