* 이 포스팅은 아래 원문을 번역한 포스팅입니다. 포스팅의 게시 시점과 번역 시점이 일치하지 않음을 사전에 밝힙니다. 원문: 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개의 포스팅으로 구성되어 있습니다.

히든 레이어에 대해 깊게 알아보기

히든 레이어의 요점은 무엇일까요? 바로 각 계층을 개별 머신러닝 알고리즘으로 볼 수 있다는 것입니다. 업스트림 레이어의 출력은 입력으로 사용되며 출력은 다음 레이어로 전달되어 그 다음 레이어로 입력됩니다. 이 동작은 레이어를 쌓고 심층 신경망을 만들 때 다운 스트림 레이어의 성능을 향상시키는 데 도움이되는 중간 데이터를 학습한다는 것을 의미합니다. 가장 유사한 예는 인간 두뇌의 시각 시스템입니다. 첫 번째 레이어 (당신의 각막 바로 다음에 있는 것들)는 얼굴, 자동차 및 고양이를 인식하지 않지만 선, 원, 직사각형 및 점과 같은 모양을 인식합니다. 더 깊이 들어가면 레이어가 인식 할 수있는 것보다 많은 이미지를 볼 수 있습니다. 결론적으로 딥 피드 포워드 (deep-feed-forward) 신경망은 수학적 함수(충분한 데이터가 주어지고 그것을 훈련시키는 컴퓨팅 파워가 있다면)를 배울 수 있습니다.

시계열 데이터에는 long-short term 메모리 네트워크가 필요합니다.

바라건대 우리가 함께 검토한 내용들로 인해 당신은 신경망이 매우 강력하다고 확신하고 있을 것입니다. 그러나 불행히도 시계열 데이터 (IoT 데이터는 주로 시계열 데이터임)에 있어서는 피드 포워드 네트워크를 사용하기 어렵습니다. 이러한 네트워크는 메모리를 보유하지 않기 때문에 시퀀스를 인식하는 데 좋지 않기 때문입니다. 이 문제의 한 가지 해결책은 피드백 루프를 추가하는 것입니다.

 
그림 7. 피드백 루프
 이러한 피드백 루프는 이제 네트워크에 메모리 유닛을 사용하기 때문에 피드 포워트 네트워크 상에서 레이어가 깊어질 수록 기억하지 못하는 문제를 다소 수정합니다. 피드백 루프는 시간적으로 가까운 네트워크에는 잘 작동하지만 더 먼 시간적 사건을 기억하기는 어렵습니다. 때문에 그림 8과 같이 LSTM (long-term term memory) 네트워크를 얻기 위해 메모리 셀을 뉴런에 추가해야합니다.
  
그림 8. Long-short term 메모리 네트워크

모델 트레이닝에는 컴퓨팅 파워가 필요합니다.

LSTM 네트워크의 단점은 무엇일까요? 신경망을 사용할 때 좋은 성능을 얻으려면 많은 양의 데이터와 많은 컴퓨팅 성능이 필요합니다. 좋은 소식은 현재 그래픽 카드(GPU)가 2009 년에 있었던 16,000 코어의 클러스터와 동일한 컴퓨팅 성능을 가지고 있다는 것입니다. IBM은 현재 neuromorphic 칩을 IBM Watson Group에 제공할 목적으로 릴리즈 작업중입니다. neuromorphic 칩은 동일한 컴퓨팅 파워를 가지지만 전력은 단 3 와트만 소비합니다. 이는 향후 성능 향상 및 에너지 절감의 여지가 있습니다.

LSTM 네트워크는 어떤 알고리즘이라도 배울 수 있습니다.

왜 저는 코그너티브 IoT 솔루션에 대해 말하면서 이 모든 것들을 말하고 있을까요? LSTM 네트워크는 튜링(Turing)머신 입니다. 이것은 LSTM 네트워크가 컴퓨터가 수행할 수있는 알고리즘을 학습할 수 있음을 의미합니다. 최신의 알고리즘과 대조적으로 LSTM 네트워크는 시계열 예측 및 코그너티브 IoT에 관한 모든 분야의 예외 탐지에 사용됩니다. 코그너티브 IoT 응용 프로그램에서 당신은 사전에 조치를 취할 시스템의 상태를 예측하거나 무언가가 고장 났을 때 통보 받기를 원할 수 있습니다. 그럼 이 때 규칙 기반의(rule-based) 최신 알고리즘의 문제점은 무엇일까요? 아무 문제도 없습니다. 다만, 저는 LSTM이 대개 최신 알고리즘보다 뛰어나다고 말하고 있습니다.(특히 시스템을 학습시킬 충분한 데이터가 있는 경우) 때때로 크게, 때로는 조금 뛰어나고, 드물게는 성능이 안좋을 수도 있습니다. 이는 각각의 사례별 정확도 증가에 따른 추가 컴퓨팅 비용을 정당화할 수 있는지 여부에 따라 다릅니다.

데모사례 : IoT 시계열 데이터의 이상 탐지

이 데모 사례에 대해 생각해보세요. 이 사례는 후속 튜토리얼의 기초가 될 것입니다. 베어링을 측정하는 진동(가속도계) 센서 데이터의 이상을 감지하는 작업을 생각해보세요. 그림 9와 같이 베어링에 센서를 부착합니다.
그림 9. 베어링에 부착한 가속센서
 가속도계 센서는 3개의 x, y, z 축 각각에 진동을 기록합니다. 회전 운동 패턴을 고려한 보다 정교한 센서가 있지만 모든 스마트 폰에서 볼 수있는 것처럼이 간단한 센서로도 문제가 없습니다. (스마트 폰의 가속도계에 액세스하고 분석하는 방법을 배우려면 다음의 튜토리얼을 따르십시오.) 이와 같은 시스템을 데모에서는 사용하기가 어렵기 때문에 Node-RED에 시뮬레이터를 구현하여 데이터를 생성해야합니다. 여기에서는 Lorenz attractor 물리 모델을 사용합니다. 튜토리얼에서 생성된이 데이터를 사용하여 이상 징후를 감지하고 기본적으로 베어링이 파손될 시기를 예측합니다. 이 테스트 데이터 시뮬레이터를 어떻게 생성했는지 보려면 이 시리즈의 다음 튜토리얼인 이상 탐지를 위한 데이터 생성을 읽으십시오. 테스트 데이터 생성기를 정상 상태와 오류 상태의 두 가지 상태로 전환 할 수 있습니다. 그림 10은 부품의 정상인 상태의 시계열상의 세 가지 진동 크기를 보여주는 위상 도표입니다.
그림 10. 정상 상태의 위상 도표
그림 10에서와 같은 위상 도표를 사용하여 실제 모델의 매개 변수를 약간 변경한 오류 상태를 확인할 수 있습니다.
그림 11. 결함 상태의 위상 도표
위상 도표에 익숙하지 않은 경우 그림 12 및 그림 13의 실행 차트에서 세 축 값을 볼 수 있습니다. (다시 정상과 결함 상태의 실행 차트 입니다.)
그림 12. 정상 상태의 실행 차트

그림 13. 결함 상태의 실행 차트
 일반적인 기술 중 하나는 DFT(이산 푸리에 변환) 또는 웨이블릿을 사용하여이 데이터를 시간에서 주파수 도메인으로 변환하는 것입니다. 다시, 그림 14와 그림 15에서 정상 상태와 결함 상태에 대한 DFT를 보여줍니다.
그림 14. 정상 상태의 이산 푸리에 변환

그림 15. 비정상 상태의 이산 푸리에 변환

결함 상태에는 더 많은 에너지와 추가 주파수가 있음을 명확하게 볼 수 있습니다. 이 데이터는 이전에 배웠던 분류 기준을 학습하는 데 충분합니다. 그러나 우리는 더 잘할 수 있습니다. 우리는 데이터로부터 정상적인 행동을 학습할 수있는 시스템을 만들고 새로운(보이지 않는) 데이터 (또는 순차적 패턴)를 본 후 경고를 알림을 보낼 수 있습니다. 이러한 시스템은 그림 16과 같이 LSTM 기반 자동 인코더(auto-encoder)입니다.
그림 16. LSTM 오토 인코더 모델
이 시스템은 신경망의 병목 현상을 통해 막대한 양의 데이터를 압축하여 관측된 것과 동일한 데이터를 재구성하려고합니다. (물론 병목 현상을 사용하여 방대한 양의 관련없는 데이터가 손실됩니다.) 이러한 신경망은 시스템이 정상적으로 작동하는 방식을 학습하고 새로운 패턴이 나타나는 즉시 데이터를 재구성하는데 어려움을 감지하고 경보를 발생시키게 됩니다.

결론

본 포스팅을 통해 여러분은 신경망에 대한 충분한 이해와 함께 코그너티브 IoT 시스템에서 어디에 딥러닝이 적용될지에 대해 파악하셨을 겁니다. 다음 튜토리얼에서는 아파치 스파크 (Apache Spark)에 대한 다양한 기술을 사용하여 딥러닝 시스템을 구현하고, 시스템에서 이러한 기술의 영향력에 대한 이해도를 높이도록 하겠습니다. 또한 Deeplearning4j, Apache SystemML 및 TensorFlow (TensorSpark)와 같은 IBM Cloud에서 실행되는 공개 표준 및 오픈 소스 솔루션에 대해서도 말씀 드리겠습니다. 
 
 * 본 포스팅은 딥러닝과 LSTM 네트워크 소개 (1)편에서 이어지는 글입니다. hhttp://maengdev.tistory.com/2 작성자: 맹윤호

 

 

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

 

원문: 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

 

1. 도입(Introduction)

대용량 데이터를 분석하기 위해 각자 로컬환경에 하둡(Hadoop) 클러스터를 구성하고 여기에 스파크(Spark)를 활용하여 대용량 로그 데이터 등을 분석하는데 활용하기도 하였습니다. 때로는 실제 분석에 걸리는 시간보다 하둡 환경을 구축하는데 걸리는 시간과 스파크 분석 환경을 마련하는 데에 시간을 더 많이 걸리기도 하였죠. 하지만, 지금은 IBM Cloud 환경에서 손쉽게 분석 환경을 구축할 수 있고, 구축된 분석 환경과 스크립트는 원하는 시간 동안 원하는 만큼 실행되게 할 수 있으며, 무엇보다도 본인의 노트북이나 컴퓨터를 켜둘 필요없이 사용이 가능한 장점이 있습니다. 다만, 클라우드 환경에서의 데이터 분석시 '파일'을 다루는 방법이 기존의 사용자 PC에서와 조금 다르므로 이 부분을 중심으로 설명하도록 하겠습니다.

2. Notebook 실습환경 만들기

Python은 스크립트 언어로서 코드를 작성하는 데 들이는 시간이 다른 언어에 비해 상대적으로 적다는 측면에서 R과 더불어 많이 사용되고 있습니다. 본 포스팅에서는 IBM Cloud 환경에서 DSX Spark를 사용하기 위해 Jupyter Notebook에서 분석을 진행하고자 합니다. (1)

IBM 데이터 사이언스(DSX)

에 접속해 로그인을 합니다.

 
(2) [Get start] - [New Project] - [Add to Project] - [Notebook]을 차례로 선택합니다. 아래의 화면에서 자신이 원하는 개발 환경을 선택합니다. 
  
(3) 익숙한 Notebook 인터페이스를 볼 수 있습니다.
 
 
이 곳에 파이썬 코드를 작성하면 기존의 Jupyter Notebook에서 사용하던 대로 사용할 수 있어 편합니다. 
또한 Jupyter Notebook에서 썼던 대부분의 단축키도 사용할 수 있습니다.
 
[그림 1] IBM DSX Spark 아키텍처 
 지금까지의 과정을 거쳐 만들어진 Notebook의 IBM DSX Spark 아키텍처는 [그림 1]과 같습니다[1]. [그림 1] 처럼 추후에 자연어처리가 필요하다면 Watson API를 활용해서 NLU 등을 호출하는 것도 가능합니다. 파일을 IBM Cloud 환경에 업로드 하고 업로드한 파일을 Jupyter Notebook에서 불러오고 이 과정에서 Pandas나 Spark Session 등으로 불러올 수 있습니다.

3. 파일 업로드/다운로드

(1) 파일 업로드 기존 Jupyter Notebook의 경우 파일을 처리하기 위해 일반적으로 파일 경로를 직접 지정하는 경우가 대부분이었습니다. 하지만, DSX 상에서 파일을 다루려면 IBM Cloud에 파일을 업로드 해야 합니다. 아래의 스크린 샷에 나타난 [Data] 아이콘을 클릭합니다. 
 
해당 위치에 파일을 직접 마우스로 올리거나 [browse] 버튼을 클릭합니다. 파일이 올라간 것이 확인되면 다음 단계로 이동합니다. (2) 업로드한 파일을 Notebook에서 불러오기 업로드한 파일에 [Insert to code] 버튼을 누르면 csv파일인 경우 아래와 같은 메뉴가 나옵니다. 여기에서 [SparkSession Dataframe]을 선택합니다.
 아래와 같은 코드가 삽입됩니다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import ibmos2spark
 
# @hidden_cell
credentials = {
    'auth_url''https://identity.open.softlayer.com',
    'project_id''********************************',
    'region''dallas',
    'user_id''***************************',
    'username''member_****************************************',
    'password''**********'
}
 
configuration_name = 'os_********************_configs'
bmos = ibmos2spark.bluemix(sc, credentials, configuration_name)
 
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df_data_1 = spark.read\
  .format('org.apache.spark.sql.execution.datasources.csv.CSVFileFormat')\
  .option('header''true')\
  .load(bmos.url('DefaultProjectyunhomaengkribmcom''testdata_devloperworks.csv'))
df_data_1.take(5)
cs

[Pandas Dataframe]도 마찬가지 입니다.
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
from io import StringIO
import requests
import json
import pandas as pd
 
# @hidden_cell
# This function accesses a file in your Object Storage. The definition contains your credentials.
# You might want to remove those credentials before you share your notebook.
def get_object_storage_file_with_credentials_****************************************(container, filename):
    """This functions returns a StringIO object containing
    the file content from Bluemix Object Storage."""
 
    url1 = ''.join(['https://identity.open.softlayer.com''/v3/auth/tokens'])
    data = {'auth': {'identity': {'methods': ['password'],
            'password': {'user': {'name''member_****************************************','domain': {'id''****************************************'},
            'password''***************'}}}}}
    headers1 = {'Content-Type''application/json'}
    resp1 = requests.post(url=url1, data=json.dumps(data), headers=headers1)
    resp1_body = resp1.json()
    for e1 in resp1_body['token']['catalog']:
        if(e1['type']=='object-store'):
            for e2 in e1['endpoints']:
                        if(e2['interface']=='public'and e2['region']=='dallas'):
                            url2 = ''.join([e2['url'],'/', container, '/', filename])
    s_subject_token = resp1.headers['x-subject-token']
    headers2 = {'X-Auth-Token': s_subject_token, 'accept''application/json'}
    resp2 = requests.get(url=url2, headers=headers2)
    return StringIO(resp2.text)
 
df_data_2 = pd.read_csv(get_object_storage_file_with_credentials_****************************************('DefaultProject***************''testdata_devloperworks.csv'))
df_data_2.head()
cs
 
(3) 파일 읽기 [SparkSession Dataframe]의 경우 위의 코드가 제대로 실행되면 아래와 같은 화면이 출력됩니다.

[Pandas Dataframe]의 경우 위의 코드가 제대로 실행되면 아래와 같은 화면이 출력됩니다.

(4) 파일 다운로드 하기 IBM DSX를 활용하면서 가장 어려움을 겪는 부분이 분석을 끝낸 파일을 다운 받는 부분입니다. Notebook에 외부 스크립트를 호출해서 다운로드 버튼을 만들어보기도 하고, Pixiedust로 그래프를 그리고 Export 기능을 활용을 해보기도 하지만, csv파일 용량이 커지거나 한글이 들어가면 제대로 다운되지 않습니다.

1
2
from pixiedust.display import *
display(dataframe.to_string())
cs
 
때문에 CURL command를 사용해야 합니다. CURL command를 사용하기 위해서는 두 가지 정보가 필요합니다. 첫 번째로는 Credential 정보 두 번째로는 파일이 저장된 경로. 이를 알아내기 위해 아래와 같이 코드를 실행합니다.

1
2
3
4
5
6
7
8
9
# Check the file path
path = ! pwd
print (path[0])
path2 = path[0].replace("notebook/work""")
print (path2) 
full_path1 = path2 + "data/"+ filename1
 
# save dataframe on ibm cloud
dataframe.to_csv(full_path1, encoding='utf-8')
cs
 
위의 코드는 현재 IBM Cloud상의 파일 경로를 확인하고, 외부 다운로드가 가능한 경로로 csv파일을 저장하고 있습니다.

1
2
!ls -l /gpfs/fs01/user/s63b-*************-*************/data
 
cs
 
이전 단계에서 저장한 파일들이 제대로 위치하고 있는지 조회합니다. Credential 정보를 불러오기 위해 IBM Cloud 사이트로 이동합니다. 
사이트에서 DSX가 사용하고 있는 spark의 credential 정보를 확인합니다. 확인한 Credential 정보에서 tenant_id, tenant_secret, instance_id를 확인하고 아래의 curl command를 작성합니다.

1
curl -O -X GET -u ****-tenant_id-**********: tenant_secret-****-****-****-*********** -H 'X-Spark-service-instance-id: instance_id-****-****-****-**********' https://spark.bluemix.net/tenant/data/dataframe.csv
cs
 
이제 사용자 PC에서 CURL 커맨드를 실행합니다. 아래와 같이 분석한 결과물을 사용자 PC로 다운로드 받을 수 있습니다. 
 
(5) Object Storage만 사용한 경우 Object Storage만 사용하는 경우, 아래와 같이 IBM Cloud Console에서 간편하게 [Select Action] - [File Download]로 원하는 파일을 사용자 PC로 다운로드 할 수 있습니다.

4. 맺음말

대용량 데이터를 다루거나, 주기적으로 실행되어야 하는 크롤링 스크립트 등 IBM Cloud의 DSX를 활용하면 보다 쉽게 분석을 할 수 있습니다. 때로는 더 많은 컴퓨팅 파워와 스토리지를 필요할 수도 있죠. 이러한 상황에서 IBM Cloud는 상위 티어의 컴퓨팅파워와 스토리지 선택을 할 수 있어 한 번의 코딩으로 확장 가능한 분석 환경을 구성할 수 있습니다.

Reference

[1] Watson 텍스트 분류 확장하기, https://developer.ibm.com/kr/journey/extend-watson-text-classification/작성자: 맹윤호

 

+ Recent posts