* 이 포스팅은 아래 원문을 번역한 포스팅입니다. 포스팅의 게시 시점과 번역 시점이 일치하지 않음을 사전에 밝힙니다. 

 

원문: Introducing deep learning and long-short term memory networks https://www.ibm.com/developerworks/analytics/library/iot-deep-learning-anomaly-detection-1/index.html 

 

* 본 포스팅은 딥러닝의 특수성에 기인하여 기술 용어에 한해서 영문표기를 그대로 따랐습니다. 예를 들어 'long-short term memory networks'를 '장기-단기 메모리 네트워크'로 표기하지 않았습니다.

Content series: '딥러닝과 LSTM 네트워크 소개'는 '딥러닝을 사용한 IoT 시계열 데이터의 이상 검출'의 연재 포스팅 중 첫번째 포스팅입니다. 본 연재 포스팅은 총 5개의 포스팅으로 구성되어 있습니다.
 

 예측에는 항상 논란의 여지가 있지만 가트너는 2017년에 스마트 폰을 제외한 84억개의 연결된 IoT 장치가 있다고 말했습니다. 이에, 일부 분석가들은 2020년까지 그 숫자가 500억개가 될 것이라고도 말합니다. 비록 그 숫자가 과대 평가 되었다 하더라도 조만간 IoT 기기의 수는 지구상에있는 사람의 수를 초과 할 것입니다. 그리고 이 모든 IoT 기기들이 지속적으로 데이터를 생성하고 있습니다; 비록 많은 데이터가 생성되었으나 만일 분석할 수 없다면 쓸모없을 것입니다. 코그너티브 시스템은 인공 지능(AI), 자연어 처리, 머신러닝 및 고급 머신러닝 기법과 같은 일련의 기능을 제공하여 모든 데이터를 분석하는데 도움을 줍니다. 또한 코그너티브 시스템은 인간과 자연스럽게 배우고 상호 작용하여 데이터로부터 통찰력을 수집하고 더 나은 결정을 내리는 데 도움을 줄 수 있습니다.

지난 기사에서 저는 인지 컴퓨팅이 단순한 인간-컴퓨터 상호 작용 (HCI)이 아니라 강력한 알고리즘(모델)과 거의 무제한의 데이터 처리 능력에 기반한 고급 기계 학습이라는 것을 언급했습니다. IoT 센서와 딥러닝 분석을 사용하는 코그너티브 시스템을 이해하려면 먼저 고급 머신러닝에서 신경망 분석으로의 기술적 도약을 이해해야 합니다. 본 포스팅에서 필자는 기술적 도약을 잘 이해하도록 도울 것입니다. 다가오는 몇 주 동안, Deeplearning4j, ApacheSystemML 및 TensorFlow (TensorSpark)의 딥러닝 프레임 워크를 사용할 것입니다. 그리고 Apache Spark의 시계열 데이터에 대한 비정상 탐지에 대한 세 가지 튜토리얼을 제공하여 비정상 탐지를 위한 코그너티브 IoT 솔루션을 딥러닝을 사용하여 개발하는 방법을 완전히 이해할 수 있도록 할 것입니다.

머신러닝에서 신경망 및 딥러닝에 이르기까지

만일 코그너티브 시스템이 모델을 기반으로한다면, 먼저 머신러닝 모델이 무엇인지 알아야 합니다. 그것은 물리적 모델(White box)과 달리 데이터로 부터 숨겨진 패턴을 배우기 위해 훈련된 통계 모델 (black box)입니다. 표 1을 보세요. 여기에는 여러 매개 변수를 포함하는 과거 데이터, 제조 파이프 라인에 대한 측정된 관측 값 및 이진 결과값이 포함되어 있습니다.

표 1. 머신러닝 모델
이 인공적인 예시에서 데이터는 그 자체로 이야기를 하고 있습니다. 당신이 추측하듯이, 고온과 잦은 진동이 기계의 결함을 초래했을 것입니다. 이런 상황의 근본 원인은 아마도 기계에서 베어링이 파손된 결과일 것 입니다. 이번 예시에서, (Supervised) 머신러닝 알고리즘은 이 모든 데이터 (및 훨씬 더)를 고려하여 결함을 학습하고 예측할 수 있습니다. 이러한 알고리즘이 생성하는 구성 요소를 머신러닝 모델이라고합니다. 머신러닝 알고리즘의 특별한 타입중 하나는 신경망(neural network) 입니다. 이는 데이터에 매우 잘 적응할 수 있으며, 데이터와 결과 사이의 숨겨진 수학적 함수를 배울 수 있습니다. 신경망을 구축하는 유일한 방법은, 해당 연산을 수행할 수 있는 엄청난 양의 컴퓨팅 자원과 데이터를 확보하는 것입니다. 그렇다면 왜 저는 신경망에 대해 이야기하고 있을까요? 우리는 엄청난 양의 데이터를 수집할 수 있는 IoT 세계에 살고 있으며, 클라우드를 사용하여 (거의) 무한한 계산 능력을 이용할 수 있습니다. 이러한 상황이 특히 IoT 데이터 처리에 있어 신경망을 활용하는 것의 흥미로운 점입니다. 신경망은 인간의 두뇌에서 영감을 얻었으며 딥러닝 네트워크(Deep Learning Network)도 마찬가지입니다. 신경망과 딥러닝 네크워크 간의 주된 차이는 다중 신경 망(multiple neural layers)의 추가입니다. 딥러닝이 전통적인 기계 학습을 능가하여 얼마나 잘 적용되는지에 대한 예는 이미지 인식입니다. 모든 최신 시스템은 특별한 유형의 딥러닝 신경망(컨볼루션 신경망이라고도 함)을 사용하여 작업을 수행합니다. 예를 들어, 딥러닝 기반의 이미지 인식 알고리즘은 제조 파이프 라인에서 결함이있는 부품과 좋은 부품을 구별 할 수 있습니다. 저는 이것을 기계 지능(machine intelligence)이라 부르며 IBM Watson Visual Recognition Service에서와 같이 사용할 수 있습니다. 예를 들어, 기계는 인간과 동일한 정확도로 동일한 작업을 수행 할 수 있습니다. 기계의 고유한 이점은 결코 자지 않으며, 아프지 않으며 결코 상처 입지 않는다는 것입니다. 또한 처리량을 두 배로 늘려야하는 경우 하드웨어 또는 클라우드 리소스의 양을 언제든지 두 배로 늘릴 수 있습니다. 그러나 부품이 때때로 결함이 있는 근본 원인 분석(RCA)을 적용하는 것은 여전히 전문가의 영역입니다. 그러나 이 시나리오는 딥러닝을 적용하는 코드너티브 솔루션을 사용하는 예시입니다. 실제로 이미지 인식 서비스는 "좋음" 또는 "결함"이라는 이진 결과보다 훨씬 많은 정보를 반환합니다. 사람과 마찬가지로 이 서비스는 이미지에서 표준에서 벗어나는 구조와 영역을 감지합니다. 만일 당신이 모든 소리 데이터와 진동 데이터 그리고 모든 시각 데이터를 연관시켜 분석에 활용한다면, 저는 이러한 시스템이 인간만큼 뿐만 아니라 심지어 인간보다 더 결함의 근본 원인을 잘 감지할 수 있을 것이라고 확신합니다.

어떻게 인공신경망이 동작하는지

만일 메시지 브로커에 연결된 IoT 센서가(MQTT 기반 IBM Watson IoT Platform과 같이) 솔루션의 중추 신경계라면, 딥러닝은 두뇌입니다. 또한 딥러닝을 이해하기 위해서는 회귀분석(regression), 퍼셉트론(perceptrons), 생물학적 신경망과 인공신경망(biological and artificial neural networks) 그리고 히든 레이어(hidden layers)에 대한 기본적인 이해가 필요합니다.

선형과 로지스틱 회귀분석으로 시작하기

회귀 분석에 관한 수많은 과학 문헌이 있으므로 개발자에게 맞는 짧은 설명을 드리겠습니다. 표 2를 참고하세요. 결과를 이진 표현으로 바꾼 곳을 제외하고는 표 1과 동일합니다.
표 2. 인공신경망 데이터
분류(classification) 작업을 하기 위해 소프트웨어를 작성하는 것은 꽤 쉽습니다.

1
2
3
4
5
def  predict  (datapoint):  
     if  datapoint.MaxVibration1 > 100 : 
         return 0 
     else : 
         return 1
cs
이 화이트 박스 모델의 예는 기본적인 물리적 시스템에 대한 지식을 활용하여 몇 가지 규칙을 만드는 데 도움이되었습니다(또는 해당 분야 전문가가 데이터를 보는데에). 기계 학습의 개념은 기계가 데이터로부터 이러한 규칙을 학습하도록하는 것입니다. 그리고 이 학습이 이루어지는 방식은 주된 분석법(skeleton)의 선택과 최적화 알고리즘을 사용하는 것입니다. 나는 다음의 주된 분석법(선형 회귀)을 사용할 것입니다.

1
2
def  predict (dp) : 
     return  a + b * dp.MaxTemp1 + c * dp.MinTemp1 + d * dp.MaxVibration1
cs
 
보시다시피, 매개 변수 b 및 c를 0, a를 1, d를 -0.0002930832 (-1/3412)로 선택하면 필요한 결과에 가깝게 끝납니다. 그리고 좋은 소식은 알고리즘에서 매개 변수 a, b, c 및 d를 배울 수 있다는 것입니다. 그 결과가 바로 머신러닝입니다! 선형 회귀가 연속 모델이므로 (float 유형의 값을 예측하려고 시도했기 때문에) 결과가 정확히 1 또는 0이 아님을 알 수 있습니다. 하지만 우리가 원하는 것은 바이너리 분류이죠. 여기에 시그모이드(sigmoid)라는 헬퍼 함수를 추가하기만 하면 이 알고리즘을 로지스틱 회귀 모델로 만들 수 있습니다.

1
2
3
4
5
6
7
8
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)
 
cs
 
시그모이드 함수는 마이너스 무한대에서 플러스 무한대까지 범위를 0-1로 변환하는 것을 제외하고는 아무것도하지 않습니다. 내가 할 필요가 있는 유일한 것은 임계값을 정의하는 것입니다 (예 : 전환 값의 범위를 0.5에서 0보다 작고 0.5에서 1보다 큰 경우로 정의할 수 있겠죠.)
그림 1. 시그모이드 함수 맵 범위

가장 단순한 신경망 : 퍼셉트론(perceptron)

이제 가장 단순한 신경 네트워크인 퍼셉트론을 마스터했습니다. 그것은 로지스틱 회귀 모델과 비슷하지만 약간의 차이는 있습니다. 그러나 "신경 네트워크"라는 용어는 훨씬 멋지게 들리나요? 그림 2의 퍼셉트론을 보십시오.
그림 2. 퍼셉트론
 
모델 x_1에서 x_n으로, 모델 매개 변수 w_1에서 w_n으로 입력을 했습니다. 그런 다음 이를 합산하여 정리하고 활성함수 (activation_function, 예 : 시그모이드)로 넘겨줍니다. 이 모델을 조금 다르게 작성하면 다음과 같이 보입니다.
1
2
out(x_1,x_2,…,x_n) = activation_function(w_0+w_1*x_1+w_2*x_2++w_n*x_n)
 
cs
 
그리고 활성함수(activation_function)를 sigmoid로 바꾸면 로지스틱 회귀로 돌아갑니다. 유일한 것은... 이제는 뇌의 구조와 조금 더 비슷해 보인 다는 것입니다. 그나저나 인간의 두뇌는 어떻게 생겼을까요?

생물학적 신경망에서 인공 신경망에 이르기까지

그림 3의 생물학적 뉴런을 살펴보십시오. 수학적 용어로, 수상 돌기는 업스트림 데이터가 입력되는 "입력"입니다. 세포체 (및 시냅스)는 입력들의 합계와 "활성화 함수"를 계산합니다. "결과"는 축색 돌기를 거쳐 후속 하부 뉴런으로 보내집니다.
그림 3. 생물학적 뉴런
그리고 재미 있기 때문에(최소한 제겐), 그림 4에서 뉴런(생화학적)을 연결하는 생물학적 시냅스에 대해 살펴보십시오. 이 그림은 퍼셉트론에서 w_n 값의 집합을 나타냅니다.
그림 4. 생물학적 시냅스

 
여러 개의 뉴런을 함께 연결하면 그림 5와 같이 두뇌 또는 인공 신경망을 갖게됩니다.
그림 5. 인공신경망

차이점은 히든 레이어에 있습니다

이 인공망과 퍼셉트론의 가장 큰 차이점은 히든 레이어입니다. 이게 뭘까요? 유용할까요? 아마도. 적어도 인간의 뇌에서는 히든 레이어가 유용할 것 같습니다. 왜냐하면 우리가 수백 개의 히든 레이어를 두뇌에 가지고 있기 때문입니다. 그림 6의 피드 포워드(Feed Forward) 신경망 예제에서 모델이 스택되어 있음을 알 수 있습니다.
그림 6. 이미지 인식을 위한 신경망 레이어 스택
이 모델이 프로그래밍 언어로 어떻게 보이는지 한 번 보세요. 그 전에 비밀을 말해드릴게요. 수학자들이 모두를 놀라게하는 데 사용하는 비밀. 하지만 완전히 간단한 그 비밀. 저는 지금 벡터 곱셈에 대해서 말하고자 합니다. 그렇다면 벡터는 무엇일까요? 숫자 목록 일뿐입니다. 프로그래머는 그것을 배열이라고 부를 것입니다. 벡터에 대한 곱셈은 약간 다르게 정의됩니다. 벡터 x = (x_1, x_2, ..., x_n)와 다른 벡터 w = (w_1, w_2, ..., w_n)가 있고 x * w를 곱하면 결과는 단일 값입니다.

1
2
w_1*x_1+w_2*x_2++w_n*x_n
 
cs
이 모델이 당신에게 익숙한 모양인가요? 그렇지 않다면 선형 회귀를 다시보십시오. 시그모이드 (x * w)를 계산하여 단일 뉴런을 계산할 수 있습니다. 그리고 파이썬은 상자 밖으로 벡터 곱셈을 지원하지 않기 때문에 numpy라고하는 라이브러리를 사용할 수 있습니다. 하나의 뉴런을 계산하기 시작합니다.

1
2
3
4
5
6
7
8
9
10
11
12
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 ) )
cs
 
동시에 여러 개의 뉴런 (예 : 모든 뉴런의 레이어)을 계산하려면 이 함수를 여러 번 사용할 수 있습니다. 그러나 수학자들은 당신을 혼란스럽게하는 또 다른 것을 만들었습니다. (벡터 곱셈에서 살아남은 경우를 대비하여) 행렬 곱셈. 신경망에서는 선형 회귀와 같은 계산을 여러번 병렬로 적용 할 수 있습니다. 이 형식으로 행렬 곱셈을 작성할 수 있습니다. 다시 말하지만, 우리의 입력은 벡터 x = (x_1, x_2, ..., x_n)에 있다고 가정합니다. 하지만 지금은 동시에 숨겨진 레이어의 모든 뉴런을 계산하고 싶습니다. 단일 뉴런을 계산하기 위해 x에 가중치 벡터 w를 곱하는 대신 x를 가중치 행렬 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 
행렬 곱셈은 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) 
결과는 float 값의 벡터이며 다음 레이어로 float 값을 넘겨줄 수 있습니다. 이를 파이썬으로 표현하면 다음과 같습니다 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 ) )
 
cs
 
보시다시피 코드 부분 중 x.dot (w_layer1)은 전혀 변경되지 않습니다. 그러나 내부적으로 w_layer1은 벡터가 아닌 행렬이므로 벡터 곱셈 대신에 행렬 곱셈이 적용됩니다. 마지막으로, 출력 레이어를 추가하고 완료합니다.

1
2
3
4
5
6
7
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)))
cs
 
물론, 가중치 행렬 w는 훈련되지 않고 무작위 적으로 초기화됩니다. (신경망 트레이닝은 이 포스팅의 범위를 벗어납니다.) 참고 : 이 랜덤 신경망은 두 개의 부동 소수점 숫자를 출력합니다. 이 숫자는 한 클래스 또는 다른 클래스에 속하는 항목의 확률입니다. 다시 말하지만, 신경 네트워크가 훈련되지 않았기 때문에이 숫자는 당장 적합하지 않을 수 있습니다. [0.97435552 0.89144977] 
 
* 본 포스팅은 '딥러닝과 LSTM 네트워크 소개 (2)'로 이어집니다. http://maengdev.tistory.com/3

 

+ Recent posts