* 이 포스팅은 아래 원문을 번역한 포스팅입니다. 포스팅의 게시 시점과 번역 시점이 일치하지 않음을 사전에 밝힙니다.
원문: 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. 머신러닝 모델
어떻게 인공신경망이 동작하는지
만일 메시지 브로커에 연결된 IoT 센서가(MQTT 기반 IBM Watson IoT Platform과 같이) 솔루션의 중추 신경계라면, 딥러닝은 두뇌입니다. 또한 딥러닝을 이해하기 위해서는 회귀분석(regression), 퍼셉트론(perceptrons), 생물학적 신경망과 인공신경망(biological and artificial neural networks) 그리고 히든 레이어(hidden layers)에 대한 기본적인 이해가 필요합니다.선형과 로지스틱 회귀분석으로 시작하기
회귀 분석에 관한 수많은 과학 문헌이 있으므로 개발자에게 맞는 짧은 설명을 드리겠습니다. 표 2를 참고하세요. 결과를 이진 표현으로 바꾼 곳을 제외하고는 표 1과 동일합니다.표 2. 인공신경망 데이터
1
2
3
4
5
|
def predict (datapoint):
if datapoint.MaxVibration1 > 100 :
return 0
else :
return 1
|
cs |
1
2
|
def predict (dp) :
return a + b * dp.MaxTemp1 + c * dp.MinTemp1 + d * dp.MaxVibration1
|
cs |
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 |
그림 1. 시그모이드 함수 맵 범위
가장 단순한 신경망 : 퍼셉트론(perceptron)
이제 가장 단순한 신경 네트워크인 퍼셉트론을 마스터했습니다. 그것은 로지스틱 회귀 모델과 비슷하지만 약간의 차이는 있습니다. 그러나 "신경 네트워크"라는 용어는 훨씬 멋지게 들리나요? 그림 2의 퍼셉트론을 보십시오.그림 2. 퍼셉트론
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 |
생물학적 신경망에서 인공 신경망에 이르기까지
그림 3의 생물학적 뉴런을 살펴보십시오. 수학적 용어로, 수상 돌기는 업스트림 데이터가 입력되는 "입력"입니다. 세포체 (및 시냅스)는 입력들의 합계와 "활성화 함수"를 계산합니다. "결과"는 축색 돌기를 거쳐 후속 하부 뉴런으로 보내집니다.그림 3. 생물학적 뉴런
그림 4. 생물학적 시냅스
그림 5. 인공신경망
차이점은 히든 레이어에 있습니다
이 인공망과 퍼셉트론의 가장 큰 차이점은 히든 레이어입니다. 이게 뭘까요? 유용할까요? 아마도. 적어도 인간의 뇌에서는 히든 레이어가 유용할 것 같습니다. 왜냐하면 우리가 수백 개의 히든 레이어를 두뇌에 가지고 있기 때문입니다. 그림 6의 피드 포워드(Feed Forward) 신경망 예제에서 모델이 스택되어 있음을 알 수 있습니다.그림 6. 이미지 인식을 위한 신경망 레이어 스택
1
2
|
w_1*x_1+w_2*x_2+…+w_n*x_n
|
cs |
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 |
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 |
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 |
'IBM Data & AI' 카테고리의 다른 글
IBM Q Experience로 시작하는 양자컴퓨터 프로그래밍 실습 (1) | 2018.02.12 |
---|---|
IBM Docker Container 세션 (1) | 2018.02.11 |
딥러닝과 LSTM 네트워크 소개 (2) (0) | 2018.02.10 |
IBM Cloud 환경에서 DSX Spark를 사용한 데이터 분석 시작하기 (1) | 2018.02.01 |