아키텍쳐 패턴이란?

위키피디아에 따르면,

아키텍쳐 패턴이란 주어진 상황에서의 소프트웨어 아키텍쳐에서 일반적으로 발생하는 문제점들에 대한 일반화되고 재사용 가능한 솔루션이다. 아키텍쳐 패턴은 소프트웨어 디자인 패턴과 유사하지만 더 큰 범주에 속한다.

이 글에서는, 다음의 10가지 일반적인 소프트웨어 아키텍쳐 패턴들의 활용 사례와 장단점들을 간단하게 설명할 것이다.

  1. 계층화 패턴 (Layered pattern)
  2. 클라이언트-서버 패턴 (Client-server pattern)
  3. 마스터-슬레이브 패턴 (Master-slave pattern)
  4. 파이프-필터 패턴 (Pipe-filter pattern)
  5. 브로커 패턴 (Broker pattern)
  6. 피어 투 피어 패턴 (Peer-to-peer pattern)
  7. 이벤트-버스 패턴 (Event-bus pattern)
  8. MVC 패턴 (Model-view-controller pattern)
  9. 블랙보드 패턴 (Blackboard- pattern)
  10. 인터프리터 패턴 (Interpreter pattern)

 

1. 계층화 패턴 (Layered pattern)

이 패턴은 n-티어 아키텍쳐 패턴이라고도 불린다. 이는 하위 모듈들의 그룹으로 나눌 수 있는 구조화된 프로그램에서 사용할 수 있다. 각 하위 모듈들은 특정한 수준의 추상화를 제공한다. 각 계층은 다음 상위 계층에 서비스를 제공한다.

일반적인 정보 시스템에서 공통적으로 볼 수 있는 계층 4가지는 다음과 같다.

  • 프레젠테이션 계층 (Presentation layer) - UI 계층 (UI layer) 이라고도 함
  • 애플리케이션 계층 (Application layer) - 서비스 계층 (Service layer) 이라고도 함
  • 비즈니스 논리 계층 (Business logic layer) - 도메인 계층 (Domain layer) 이라고도 함
  • 데이터 접근 계층 (Data access layer) - 영속 계층 (Persistence layer) 이라고도 함

활용

  • 일반적인 데스크톱 애플리케이션
  • E-commerce 웹 애플리케이션



2. 클라이언트-서버 패턴 (Client-server pattern)

이 패턴은 하나의 서버와 다수의 클라이언트, 두 부분으로 구성된다. 서버 컴포넌트는 다수의 클라이언트 컴포넌트로 서비스를 제공한다. 클라이언트가 서버에 서비스를 요청하면 서버는 클라이언트에게 적절한 서비스를 제공한다. 또한 서버는 계속 클라이언트로부터의 요청을 대기한다.

활용

  • 이메일, 문서 공유 및 은행 등의 온라인 애플리케이션



3. 마스터-슬레이브 패턴 (Master-slave pattern)

이 패턴은 마스터 슬레이브, 두 부분으로 구성된다. 마스터 컴포넌트는 동등한 구조를 지닌 슬레이브 컴포넌트들로 작업을 분산하고, 슬레이브가 반환한 결과값으로부터 최종 결과값을 계산한다.

활용

  • 데이터베이스 복제에서, 마스터 데이터베이스는 신뢰할 수 있는 데이터 소스로 간주되며 슬레이브 데이터베이스는 마스터 데이터베이스와 동기화된다.
  • 컴퓨터 시스템에서 버스와 연결된 주변장치 (마스터 드라이버와 슬레이브 드라이버)



4. 파이프-필터 패턴 (Pipe-filter pattern)

이 패턴은 데이터 스트림을 생성하고 처리하는 시스템에서 사용할 수 있다. 각 처리 과정은 필터 (filter) 컴포넌트에서 이루어지며, 처리되는 데이터는 파이프 (pipes)를 통해 흐른다. 이 파이프는 버퍼링 또는 동기화 목적으로 사용될 수 있다.

활용

  • 컴파일러. 연속한 필터들은 어휘 분석, 파싱, 의미 분석 그리고 코드 생성을 수행한다.
  • 생물정보학에서의 워크플로우



5. 브로커 패턴 (Broker pattern)

이 패턴은 분리된 컴포넌트들로 이루어진 분산 시스템에서 사용된다. 이 컴포넌트들은 원격 서비스 실행을 통해 서로 상호 작용을 할 수 있다. 브로커 (broker) 컴포넌트는 컴포넌트 (components) 간의 통신을 조정하는 역할을 한다.

서버는 자신의 기능들(서비스 및 특성)을 브로커에 넘겨주며(publish), 클라이언트가 브로커에 서비스를 요청하면 브로커는 클라이언트를 자신의 레지스트리에 있는 적합한 서비스로 리디렉션한다.

활용



6. 피어 투 피어 패턴 (Peer-to-peer pattern)

이 패턴에서는, 각 컴포넌트를 피어 (peers)라고 부른다. 피어는 클라이언트로서 피어에게 서비스를 요청할 수도 있고, 서버로서 각 피어에게 서비스를 제공할 수도 있다. 피어는 클라이언트 또는 서버 혹은 둘 모두로서 동작할 수 있으며, 시간이 지남에 따라 역할이 유동적으로 바뀔 수 있다.

활용

  • Gnutella G2와 같은 파일 공유 네트워크
  • P2PTV PDTP와 같은 멀티미디어 프로토콜
  • Spotify와 같은 독점적 멀티미디어 애플리케이션



7. 이벤트-버스 패턴 (Event-bus pattern)

이 패턴은 주로 이벤트를 처리하며 이벤트 소스 (event source), 이벤트 리스너 (event listener), 채널 (channel) 그리고 이벤트 버스 (event bus)의 4가지 주요 컴포넌트들을 갖는다. 소스는 이벤트 버스를 통해 특정 채널로 메시지를 발행하며 (publish), 리스너는 특정 채널에서 메시지를 구독한다 (subscribe). 리스너는 이전에 구독한 채널에 발행된 메시지에 대해 알림을 받는다.

활용

  • 안드로이드 개발
  • 알림 서비스



8. 모델-뷰-컨트롤러 패턴 (Model-view-controller pattern)

MVC 패턴이라고도 하는 이 패턴은 대화형 애플리케이션 (interactive application)을 다음의 3 부분으로 나눈다.

  1. 모델 (model) — 핵심 기능과 데이터를 포함한다
  2. 뷰 (view) — 사용자에게 정보를 표시한다 (하나 이상의 뷰가 정의될 수 있음)
  3. 컨트롤러 (controller) — 사용자로부터의 입력을 처리한다

이는 정보가 사용자에게 제공되는 방식과 사용자로부터 받아 들여지는 방식에서 정보의 내부적인 표현을 분리하기 위해 나뉘어진다. 이는 컴포넌트를 분리하며 코드의 효율적인 재사용을 가능케한다.

활용

  • 일반적인 웹 애플리케이션 설계 아키텍쳐
  • Django Rails와 같은 웹 프레임워크



9. 블랙보드 패턴 (Blackboard pattern)

이 패턴은 결정 가능한 해결 전략이 알려지지 않은 문제에 유용하다. 이 패턴은 3가지 주요 컴포넌트로 구성된다.

  • 블랙보드 (blackboard) — 솔루션의 객체를 포함하는 구조화된 전역 메모리
  • 지식 소스 (knowledge source) — 자체 표현을 가진 특수 모듈
  • 제어 컴포넌트 (control component) — 모듈 선택, 설정 및 실행을 담당한다

모든 컴포넌트는 블랙보드에 접근한다. 컴포넌트는 블랙보드에 추가되는 새로운 데이터 객체를 생성할 수 있다. 컴포넌트는 블랙보드에서 특정 종류의 데이터를 찾으며, 기존의 지식 소스와의 패턴 매칭으로 데이터를 찾는다.

활용

  • 음성 인식
  • 차량 식별 및 추적
  • 단백질 구조 식별
  • 수중 음파 탐지기 신호 해석



10. 인터프리터 패턴 (Interpreter pattern)

이 패턴은 특정 언어로 작성된 프로그램을 해석하는 컴포넌트를 설계할 때 사용된다. 이는 주로 특정 언어로 작성된 문장 혹은 표현식이라고 하는 프로그램의 각 라인을 수행하는 방법을 지정한다. 기본 아이디어는 언어의 각 기호에 대해 클래스를 만드는 것이다.

활용

  • SQL과 같은 데이터베이스 쿼리 언어
  • 통신 프로토콜을 정의하기 위한 언어



아키텍쳐 패턴 비교

다음은 각 아키텍쳐 패턴의 장단점을 요약한 테이블이다.

아키텍쳐장점단점

  아키텍쳐 장점 단점
1 계층식 (Layered) 하위 레이어는 다른 상위 레이어에 의해 사용된다. 레이어 표준화가 쉬우며 레이어 수준을 정의하기가 수월하다. 레이어를 변경해도 다른 레이어에는 영향을 끼치지 않는다. 광범위한 적용이 어렵다. 특정 상황에서는 특정 레이어가 불필요할 수도 있다.
2 클라이언트-서버 (Client-server) 클라이언트가 요청할 수 있는 일련의 서비스를 모델링 할 수 있다 요청은 일반적으로 서버에서 별도의 스레드로 처리된다. 프로세스간 통신은 서로 다른 클라이언트가 서로 다르게 표현되므로 오버헤드가 발생한다.
3 마스터-슬레이브 (Master-slave) 정확성 - 서비스의 실행은 각기 다른 구현체를 가진 슬레이브들에게 전파된다. 슬레이브가 독립적이므로 공유되는 상태가 없다. 실시간 시스템에서는 마스터-슬레이브간 레이턴시 문제가 발생할 수 있다. 이 패턴은 분리 가능한 문제에만 적용할 수 있다.
4 파이프-필터 (Pipe-filter) 동시성 처리를 나타낸다. 입출력이 스트림으로 구성되고 필터가 데이터를 수신하면 연산을 수행하기 시작한다. 필터 추가가 쉽다. 시스템 확장성이 좋다. 필터는 재사용 가능하다. 주어진 필터들을 재구성하여 또 다른 파이프라인을 구축할 수 있다. 가장 느린 필터 연산에 의해 효율성이 제한될 수 있다. 필터간 데이터 이동에서 데이터 변환 오버헤드가 발생한다.
5 브로커 (Broker) 객체의 동적인 변경, 추가, 삭제 및 재할당이 가능하며 개발자에게 배포를 투명하게 만든다. 서비스 표현에 대한 표준화가 필요하다
6 피어 투 피어 (Peer to peer) 탈중앙화된 컴퓨팅을 지원한다. 특정 노드 장애에 매우 강하다. 리소스 및 컴퓨팅 성능면에서 확장성이 뛰어나다. 노드들이 자발적으로 참여하기 때문에 서비스 품질에 대한 보장이 어렵다. 보안에 대한 보장이 어렵다. 노드의 갯수에 따라 성능이 좌우된다.
7 이벤트-버스 (Event-bus) 새로운 발행자 (publishers)와 구독자 (subscribers) 및 연결의 추가가 수월하다. 고도로 분산화된 애플리케이션에 효과적이다. 모든 메시지가 동일한 이벤트 버스를 통해 전달되기 때문에 확장성 문제가 발생할 수 있다.
8 모델-뷰-컨트롤러 (MVC) 동일한 모델에 대해 여러개의 뷰를 만들 수 있으며, 런타임에 동적으로 연결 및 해제를 할 수 있다. 복잡성을 증가시키며, 사용자의 행동에 대한 불필요한 업데이트가 많이 발생할 수 있다.
9 블랙보드 (Blackboard) 새로운 애플리케이션을 쉽게 추가할 수 있다. 데이터 공간의 구조를 쉽게 확장할 수 있다. 모든 애플리케이션이 영향을 받기 때문에 데이터 공간의 구조를 변경하기가 어렵다. 동기화 및 접근 제어가 필요할 수 있다.
10 인터프리터 (Interpreter) 매우 동적인 설계가 가능하다. 최종 사용자가 프로그래밍하기 좋다. 인터프리터 프로그램을 쉽게 교체할 수 있기 때문에 유연성이 향상된다. 인터프리터 언어는 일반적으로 컴파일 언어보다 느리기 때문에 성능 문제가 발생할 수 있다.

 

 

원문 : https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013

 

10 Common Software Architectural Patterns in a nutshell

Ever wondered how large enterprise scale systems are designed? Before major software development starts, we have to choose a suitable…

towardsdatascience.com

 

'IT-기타(미분류)' 카테고리의 다른 글

Lucene(루씬)/Solr(솔라)/Nutch(넛츠)  (0) 2018.10.30
딥러닝, 머신러닝의 차이점?  (0) 2018.10.30
Solr vs ElasticSearch 비교  (0) 2018.10.30

Lucene(루씬)

검색 엔진의 가장 중요한 부분을 담당하는 "색인" 과 "검색" 을 위한 자바로 개발된 라이브러리 이다.

아파치 재단에서 만들어진 프로젝트 이고, 다양한 플랫폼을 지원한다.



Solr(솔라)

솔라는 파일을 인덱스하는 검색엔진으로 XML 요청을 HTTP를 통해 보내는 웹 서비스 API가 있는 검색 서버이다. 

그러므로 솔라 검색서버 URL을 사용하여 인터넷을 통해 (HTTP) 파일을 질의하여 인덱스하는 어느 곳에서나 접근할 수 있다. 

또한 다른 솔라 검색 서버로 캐싱과 복사가 가능한 최적화된 검색 서버다.



Nutch(넛츠)

오픈소스 웹 검색 소프트웨어로 웹 크롤러의 기능을 제공하고, 수집된 정보들은 루씬을 통하여 검색이 이루어 진다.



정리하자면 

루씬은 검색을 위한 API,

솔라는 검색서버,

넛츠는 자료/정보를 수집하는 크롤러  

인 셈이다.

개요

머신러닝(Machine learning)과 딥러닝(Deep learning)은 화두다! 언제부터인지 주위에 이 단어들을 쓰는 사람들을 굉장히 많이 보았을 것이고 들어봤을 것입니다. (그들의 차이점을 알건 모르건을 떠나서 말이죠!) 얼마나 많은 사람들이 관심을 가지고 있는지 알기 위해서, 키워드로 검색한 구글 트렌드 결과입니다.


만약 머신러닝과 딥러닝의 차이점이 궁금하다면, 비전문가의 말로 풀어쓴 이 글이 도움이 될 것입니다. 전문 용어들을 설명하였고, 두 가지의 차이점과 어떻게 활용할 수 있을지 설명하였습니다. 

"머신러닝(Machine Learning)과 딥러닝(Deep Learning)이 무엇일까요?" 

"머신러닝(Machine Learning)이 무엇일까요?"

"딥러닝(Deep Learning)이 무엇일까요?"

     

1. 머신러닝(Machine Learning)과 딥러닝(DeepLearning)이 무엇일까요?

기초부터 시작해보겠습니다. 만일 머신러닝과 딥러닝의 차이점을 이미 알고계신다면 

section 2로 넘어가시면 됩니다. 


1.1 머신러닝(Machine Learning)이 무엇일까요?

Tom Mitchell의 정의가 가장 많이 인용되고 있는데 저 또한 동의합니다. 

A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P if its performance at tasks in T, as measured by P, improves with experience E.

이해가 잘 안되시나요? 더 간단한 예제로 가보겠습니다.


예제 1 - Machine Learning - 키(height)를 기반으로 몸무게(weight) 예측하기

예를 들어서 당신이 어떤 사람의 키를 기반으로 몸무게를 예측하는 시스템을 만든다고 해봅시다. 가장 첫번째로 당신이 해야할 일은 데이터를 수집(collect)하는 것입니다. 데이터가 이런 형태를 보인다고 가정해봅시다.  


그래프의 각 점은 하나의 데이터(record)를 뜻합니다. 시작하기에 앞써 우리는 키를 기반으로 하여 몸무게를 예측하기 위해 선 하나를 그어볼 수 있겠습니다. 선은 이런 수식으로 표현될 수 있을 것입니다. 

몸무게 (kg) = 키 (cm) - 100

이 공식은 우리의 예측에 도움을 줄 것입니다. 지금 이 공식만으로도 만족스럽긴 하지만 우리는 '성능'을 이해하고 향상하기 위해 노력해야 할 것입니다. 이 경우, 우리는 성능 향상을 위해 실제값(y)과 예측값(y-hat)의 차이를 줄여야 할 것입니다. 이것이 성능을 측정하는 방법입니다. 

더 나아가, 데이터가 많을수록(즉, 경험이 많을수록), 더 나은 성능의 모형이 만들어질 것입니다. 또한 추가 변수(variables)를 넣어보면서(ex. 성별 등) 선의 위치도 조금씩 변화시켜 볼 수 있을 것입니다. 


예제 2 - 폭풍 예측 시스템(Storm prediction System)

조금 복잡한 예제를 보겠습니다. 당신이 폭풍 예측 시스템을 만들고 싶다고 가정해봅시다. 당신은 과거에 있었던 storm에 관한 정보들과 이와 더불어 그 storm이 발생하기 3개월전 날씨 상태를 데이터로 보유하고 있습니다. 

만일 손과 눈으로만 이 폭풍 예측 시스템을 만들려고 한다면 우리는 어떻게 해야할까요?


가장 첫번째로 해야 할 일은 모든 데이터를 샅샅이 뒤져 패턴을 찾는 것입니다. 목표는 어떤 조건이 폭풍을 일으키냐 겠지요? 

그 결과 조건은 이러할 수 있습니다. '기온이 40도 이상으로 올라갈 때, 습도는 80~100사이를 유지함'

그리고 이 조건을 그대로 우리 시스템에 적용할 것입니다. 

또 다른 경우는 폭풍이 발생할지 안할지에 대해서 과거 데이터를 모두 훑어보고 폭풍이 일어날 가능성이 가장 높은 사유들을 꼽아볼 것입니다. 이렇게 시스템이 셋팅이 된다면 우리의 사유가 얼마나 잘 예측했는지 폭풍 발생 여부에 따라 확인할 것입니다. 그리고 이 작업을 반복적으로 진행하여, 더 나은 예측 성능을 위해 수정할 부분은 수정할 것입니다. 


다시 우리가 이해하였던 1.1에서의 머신러닝 정의를 빗대어 생각해봅시다. 

우리의 목표 'T'는 어떤 환경적 조건이 폭풍을 일으키는지 찾는 것이었고, 성능 'P'는 그러한 조건 속에서 폭풍 발생 여부에 대한 예측을 몇 번이나 맞추었는지에 대한 결과입니다. 그리고 경험 'E'는 그 시스템을 몇 번 반복을 하냐 입니다. 


1.2 딥러닝(Deep Learning)이 무엇일까요?

딥러닝의 개념은 아주 새로운 것은 아닙니다. 2년전부터 이 이야기가 돌긴 하였지만 요새의 트렌드때문에 딥러닝은 더욱 뜨거운 관심을 받고 있습니다. 1.1에서 머신러닝의 정의를 살펴본 것처럼 딥러닝의 formal definition부터 알아보고 예제를 보여드리겠습니다. 

Deep learning is a particular kind of machine learning that achieves great power and flexibility by learning to represent the world as nested hierarchy of concepts, with each concept defined in relation to simpler concepts, and more abstract representations computed in terms of less abstract ones.


헷갈리실 것이에요. 간단한 예제를 살펴보겠습니다. 


예제 1 - 도형 구분

개념적으로 어떻게 진행되는지 간단한 예를 살펴보겠습니다. 어떻게 인간이 정사각형과 다른 도형을 인지하는지 알아봅시다. 


가장 먼저 우리의 눈은 도형에 4개의 선들이 있는지 없는지를 확인합니다. (이 단계가 simple concept입니다.) 우리가 4개의 선을 찾는다면, 그 다음 스텝으로는 이 선들이 연결되어있는지,닫혀있는지(closed), 직각인지, 선의 길이가 동일한지 찾아볼 것입니다. (이 단계가 nested hierarchy of concepts입니다.)

다시 정리해보면, 우리는 복잡한 task(즉 정사각형을 구분하는 일)를 좀 덜 추상적인 task로 구분하였습니다. 딥러닝이 바로 이러한 개념으로 실행된다고 보면 됩니다. 


예제 2 – Cat vs. Dog

사진을 보고 개인지 고양이인지 구분하는 것을 예로 들어봅시다. 


만일 이 문제를 머신러닝으로 풀으려 한다면, 우리는 변수들(features)를 이렇게 정의할 것입니다.

*참고. 머신러닝, 딥러닝에서는 input 변수를 feature라고 부릅니다. 저는 variable이라는 표현이 더 익숙했었던건지 새롭게 와닿았습니다. 양쪽다 맞는 표현이지만 feature라는 표현이 좀 더 머신러닝/딥러닝의 개념과 유사하게 느껴집니다. 


동물이 수염이 있는지 없는지,귀가 있는지 없는지, 만일 있다면 솟아있는지 등을 확인할 것입니다. 정리하자면 우리는 시스템으로 feature 중 무엇이 특정 동물(이번 예제의 경우 개인지 고양이인지)을 더 잘 묘사하는지를 구분할 것입니다.
딥러닝에서는 여기서 한 스텝 더 나아갑니다. 딥러닝은 분류에 있어 중요한 feature를 자동적으로 골라냅니다. 머신러닝은 수동적으로 중요한 feature를 제공하는 반면에요.
딥러닝은 이렇게 움직이는 것입니다. – 어떤 정보(edge)가 개와 고양이를 가장 잘 구분할지를 찾는 것입니다.


2. 머신러닝과 딥러닝의 비교

1장에서는 머신러닝과 딥러닝의 대략적인 개요를 살펴보았습니다. 이제 우리는 특히나 중요한 몇 가지 포인트들과 두 방법론의 테크닉 차이를 비교해보겠습니다. 


2.1 데이터 의존도(Data dependencies)

딥러닝과 전통적이 머신러닝에 있어 가장 큰 차이점은 데이터 양에 따른 성능입니다. 데이터 양이 작다면 딥러닝 알고리즘의 성능은 잘 나오지 않습니다. 왜냐하면 딥러닝 알고리즘은 어떤 과제를 이해하기 위해서 매우 큰 데이터가 필요하기 때문입니다. 그와 반면에, 똑같은 시나리오에서는 수작업이 들어간 전통적인 머신러닝 알고리즘이 더 우세합니다.



2.2 하드웨어 의존도(Hardware dependencies)

딥러닝 알고리즘은 고사양 machine이 많은 부분을 좌지우지합니다. 그와 반대로 머신러닝은 저사양 machine에서도 실행이 가능합니다. 이 이유는 무엇일까요? 딥러닝 알고리즘의 요구사항(requirements)는 GPU가 포함되기 때문입니다. GPU는 작업에서 숫자 계산을 담당합니다. 딥러닝 알고리즘은 본질적으로 많은 양의 행렬 곱셈(matrix multiplication)을 수행합니다. 이 작업은 GPU의 구축 목적과 같기 때문에, GPU를 사용하면 보다 효율적으로 최적화 할 수 있습니다.


2.3 Feature engineering

Feature engineering은 데이터 복잡성을 줄이고 학습 알고리즘에서 패턴을 보다 잘 보이게 하는 과정입니다. 이 과정은 시간과 전문가가 필요하다는 관점에서 어렵고 비쌉니다. 머신러닝의 경우, 대부분의 적용된 변수(feature)는 전문가가 식별한 다음 정보 영역 및 데이터 유형별로 손으로 코딩해야 합니다.

*참고. 쉽게 설명드리자면, A은행에서 신용등급을 평가하는 모형을 만든다고 가정해봅시다. A은행에서 가지고 있는 데이터를 활용해 머신러닝 알고리즘에 대입해 보았더니 대략 50개 정도의 변수가 유의미하다고 내뱉어졌습니다. 하지만 우리는 50개 변수 모두 활용할 수 없습니다. 비즈니스적 요건이나 금융당국의 규제에 따라 제거되어야 하는 변수들이 있을 수 있겠지요. 예를 들자면, 학력 정보(중졸/고졸/대졸 등)나 성별 정보입니다. 이런 경우가 전문가가 직접 확인하고 걸러내는 작업입니다. 


예를 들어, 변수가 픽셀값, 모양, 텍스쳐, 위치, 방향이라고 가정해봅시다. 대부분의 머신러닝 알고리즘 성능은 변수가 어느 정도로 정확히 식별되고 추출되는가에 달려 있습니다.
딥러닝 알고리즘은 high-level features를 학습합니다. (고차원적인 변수로 이해하시면 될 것 같습니다.) 이 부분이 딥러닝이 머신러닝보다 좀 더 앞서 있다라는 특징입니다. 따라서 딥러닝은 모든 과제에서 새로운 변수 추출이라는 작업을 줄여줍니다. Convolutional Neural Network의 경우,  초기 layer에서는 이미지의 edge나 line같은 low-level features를 학습하고 그 다음 이미지의 high-level 표현을 학습합니다. (그림과 함께 보시면 이해에 도움이 되실 것입니다.)


2.4 문제 해결 접근법(Problem Solving approach)

전통적인 머신러닝 알고리즘으로 문제를 해결할 때에는 주로 문제를 여러 개의 파트로 쪼갠 후, 각각에 대한 답을 구하고 그 결과를 합치는 방법을 추천합니다. 딥러닝은 그와 대비되게 end-to-end방식으로 문제를 해결합니다. (end-to-end가 명확하지 않으니 다음 예제를 참고하십시오.)
예제를 들어보겠습니다.
만약 당신이 사물 인지 작업을 진행해야 한다고 가정해봅시다. 그리고 사물이 무엇인지 그리고 사진 어디에 해당 사물이 위치하고 있는지를 구별해내는 것이 과제입니다.


대게의 머신러닝 접근 방법은 문제를 1.사물 탐지/2.사물 인지 두 개의 step으로 나눌 것입니다. 먼저, ‘grabcut’과 같은 경계 탐지 알고리즘(bound box detection algorithm)을 사용하여 이미지를 훑어보고 가능한 모든 객체를 찾습니다. 그리고 발견된 모든 개체들 중에서 HOG가있는 SVM(Support Vector Machine)과 같은 객체 인식 알고리즘을 사용하여 관련 객체를 인식합니다.
반면, 딥러닝 접근방법은 end-to-end입니다. 예를들어 YOLO net(딥러닝 알고리즘 중 하나)에서 이미지를 전달하면 객체의 이름과 함께 위치가 표시됩니다.


2.5 실행 시간(Execution time)

딥러닝 알고리즘은 훈련(train) 시간이 굉장히 오래 걸립니다. 딥러닝 알고리즘에서는 다른 알고리즘 대비 변수가 너무 많기 때문입니다. 최신 딥러닝 알고리즘인 ResNet의경우 training이 약 2주 정도 걸립니다. 하지만 머신러닝은 수 초에서 수 시간으로 비교적 적은 시간이 걸립니다.
test에서의 시간은 반대로 딥러닝 알고리즘에서 훨씬 적은 시간이 소요됩니다.
반면, k-nearest neighbors (머신러닝 알고리즘의 일종)의 경우 데이터 크기가 커질수록 테스트 시간이 길어집니다. 이것은 일부 머신러닝 알고리즘은 너무 작은 테스트 시간을 갖고 있기 때문에 모든 머신러닝 알고리즘이 그렇다고 볼 수 는 없습니다.

* 모델링에는 train set과 test set이 존재합니다. 단어에서 얼추 유추하셨을 수 있겠지만, 우리가 일반적으로 실제값에 가까운 모델을 만들기 위해 활용되는 데이터셋은 train set이고, 이 train set으로부터 적합된 결과가 타당하지 검사할 때 쓰는 데이터가 test set입니다. 정리하자면, linear model(y = ax +b)에서 train set으로 input 변수 x에 해당하는 적절한  a,b 값을 찾았다면, test set의 input 변수 x값으로 최종 성능이 train set의 성능과 유사하게 산출되는지 검증한다고 보시면 됩니다. 


2.6 해석력(Interpretability)

마지막으로 머신러닝과 딥러닝을 비교할 수 있는 또 다른 요인으로는 ‘해석력’을 들 수 있습니다. 이 요인이 딥러닝이 실제 실무에 쓰려 마음 먹으면 그 전에 10번 정도는 고민하는 이유입니다.

예제를 들어볼게요. 에세이의 점수를 자동으로 매기기 위해 딥러닝 알고리즘을 활용했다고 해봅시다. 성능은 거의 사람이 한 것과 유사할 정도로 뛰어납니다. 하지만, 아주 치명적인 문제가 있긴 합니다. 왜 이 점수가 부여됐는지는 알 수 없기 때문입니다. 사실 수학적으로 딥러닝의 어느 노드가 활성화되었는지를 알 수 있긴 하지만, 우리는 거기에 어떤 뉴런이 만들어 졌는지, 그리고 이들 뉴런 레이어가 전제적으로는 무엇을 하고 있는지 알지 못합니다. 그래서 우리는 결과를 해석하지 못합니다.
하지만, 의사결정나무(decesion tree)와 같은 머신러닝 알고리즘은 왜 선택됐는지 명확한 rule이 제공되기 때문에 해석하기가 특히 쉽습니다. 따라서 ‘해석’이 필요한 산업에서는 의사결정나무나 선형회귀모형, 로지스틱회귀모형이 활용됩니다. 
반면에 의사 결정 트리와 같은 기계 학습 알고리즘은 왜 선택한 알고리즘을 선택했는지에 대한 명확한 규칙을 제공하므로 배후의 추론을 해석하기가 특히 쉽습니다. 따라서 결정 트리 및 선형 / 로지스틱 회귀와 같은 알고리즘은 주로 업계에서 해석 가능성을 위해 사용됩니다.


3. 머신러닝과 딥러닝은 현재 어디서 쓰이고 있나?

컴퓨터 비전: 자동차 번호판 인식, 안면인식 등



출처 : https://brunch.co.kr/@itschloe1/8

Solr

사이즈가 큰 데이터 검색에 용이에 문서 검색에 적합하나 색인주기가 느림 (주로 문서검색용)

ElasticSearch

사이즈가 작은 데이터에 대한 속성검색/연관검색/실시간 검색에 용이함 (주요 커머스검색용)




Solr search ( 쏠라 ) Elasticsearch ( 엘라스틱 )
개발사 Apache Software Foundation Elasticsearch
노드 1)  컨트롤 주체 Apache ZooKeeper (별도 프로그램) -> 구동 시 리소스 부하  운영 중 스키마 변경 불가 자체 Node (마스터노드) -> 구동 시 부하 적음  운영 중 스키마 변경 가능
샤드 2)  변경 방식 별도의 노드 분할 처리 필요(서버 재구동 필요) 자동 노드 분할(서버 구동 불필요)
색인업데이트 방식 전체 데이터를 캐시로 추가 저장 변경 데이터만 캐시로 추가 저장
개발언어 JSON (limited), XML (limited),URL parameters JSON
연동가능 분석모듈 (ECOsystem) 주로 Banana, Zeppelin with Community JSon 지원 모듈이면 OK(ex. Kibana, Grafana 등)
주요 활용영역 문서  원문 검색 상품검색  이상징후 감지 & 모니터링
속도 검색 느림 빠름
색인 수 십분 초 단위
분석 준실시간 실시간
장점 •안정화 단계의 검색•사이즈가 큰 장문 데이터 검색에 용이 •실시간 색인 가능•계층 구조의 다양한 속성 검색/연관검색 가능
단점 •색인 주기 느림•계층 구조의 속성 검색 힘듦 •사이즈가 큰 장문 데이터 검색 시 속도 저하


주1) 노드(Node) : 분산처리 구조 상 서버와 유사한 개념의 구분 단위

주2) 샤드(Shard) : 분산구조 상 인덱스 단위로서 단일 노드엔 여러 개의 샤드가 존재

+ Recent posts