머신러닝 & 딥러닝 용어 정리

|

인공지능, 머신러닝, 딥러닝

Image

위 그림처럼 딥러닝은 머신러닝의 한 종류이며, 머신러닝은 인공지능의 한 종류입니다.


모델

머신러닝은 간단히 ‘데이터를 이용한 모델링 기법’이라고 표현할 수 있습니다. 다시 말하면, 데이터들 중에서 ‘모델’을 뽑아내는 기법입니다. 모델은 머신러닝을 통해 얻을 수 있는 최종 결과물을 의미합니다. 예를 들어, 스팸을 분리해내는 시스템을 만들었다면 해당 시스템이 ‘모델’에 해당합니다.

모델은 ‘가설(Hypothesis)’이라고도 부릅니다.


과적합(Overfitting)

Overfitting은 머신러닝에 자주 등장하는 용어입니다. 학습 데이터에 너무 최적화를 하다보니, 실제 데이터와 차이가 많이 발생하는 모델을 만들게 되는 현상을 의미합니다. 학습 데이터에도 Noise 등이 섞인 데이터들이 섞여 있을 수 있기 때문에 Overfitting을 방지하는 기법들을 적용해야 더 좋은 결과물이 나올 수 있습니다.

반대되는 경우로 Underfitting이 있습니다.

Image

위 그림과 같이 Underfitting이 되면 너무 느슨한 모델이 만들어지게 되고, Overfitting이 발생하면 너무 과한 모델이 만들어지게 됩니다.


Regularization, Validation

머신러닝은 학습 데이터가 많을수록 더 정교한 모델을 만들어낼 수 있습니다. 하지만 Noise와 같이 일반적이지 않은 학습 데이터가 많이 섞여 있을 경우 Overfitting이 발생할 수 있습니다.

Regularization은 학습 데이터를 조금 희생하더라도 모델을 최대한 간단하게 만들어서 Overfitting을 방지하는 기법입니다.

하지만 Regularization은 눈으로 보고 쉽게 확인할 수 있지 않기 때문에 학습 과정에서의 Overfitting 여부를 판단하기가 쉽지 않습니다. 그래서 Overfitting 여부를 손쉽게 판단하기 위해서 ‘검증(Validation)’ 기법을 적용합니다.

검증용 데이터는 학습용 데이터에는 포함시키지 않고, 모델의 성능 검증에만 사용합니다.

Image

위 그림과 같이 학습 데이터의 일부(보통 80%는 학습용, 20%는 검증용)를 떼어내서 검증용으로 사용합니다.

그리고 아래 이미지와 같이 검증용 데이터를 고정하지 않고 무작위로 바꿔가면서 사용하는 ‘교차검증(Cross Validation)’ 기법도 있습니다.

Image


분류(Classification), 회귀(Regression)

분류와 회귀는 비슷하면서도 약간의 차이가 있는 용어입니다. 둘다 입력데이터로 {입력, 정답}의 형태를 가집니다. 하지만 분류의 경우 정답은 ‘범주’의 형태가 되고, 회귀의 경우 정답은 ‘값’의 형태가 된다는 차이가 있습니다.

분류와 회귀 둘 다 지도 학습(Supervised Learning)에 해당하며, 비지도 학습(Unsupervised Learning)의 ‘군집화(Clustering)’과 헷갈리는 경우가 있는데 서로 차이가 있기 때문에 구분을 해야 합니다. 참고로, 군집화는 비슷한 데이터들끼리 묶어주는 기능입니다.

Image


신경망

신경망(Neural Network)는 사람의 두뇌 모양을 흉내내서 만든 모델로 수많은 노드들과 각 노드들간의 가중치로 이루어져 있습니다.

Image

학습 데이터를 이용해서 학습을 하면서 그 결과값에 따라 각 노드들간의 가중치를 조금씩 바꿔가는 학습 방법입니다.


델타 규칙

델타 규칙은 Adaline, Widrow-Hoff 규칙이라고도 하며, 주어진 정보에 따라 단층 신경망의 가중치를 체계적으로 바꾸어주는 규칙입니다.

어떤 output 노드에서 오차가 발생했다면, output 노드와 input 노드간 연결 가중치는 input 노드의 출력과 output 노드의 오차에 비례해서 조절한다.

델타 규칙을 수식으로 표현하면 다음과 같습니다.

[w_ij ← w_ij + α e_i x_j
\Delta w_ij = α e_i x_j]

단순히 생각하면 오차가 크면 가중치를 많이 조절하고, 오차가 작으면 가중치를 적게 조절하는거라고 생각하면 됩니다.

여기서 α는 학습률을 의미하며 0보다 크고 1보다 작거나 같은 값을 가집니다. 학습률이 너무 높으면 정답 근처에서 수렴을 못하는 경우가 발생할 수 있고, 너무 낮으면 학습 속도가 아주 느릴 수 있습니다.


재학습 및 epoch

한 번 학습한 데이터라고 하더라도 전체 학습 데이터를 반복해서 학습하기도 합니다. 델타 규칙은 정답을 한 번에 바로 찾는게 아니라 반복적인 학습 과정을 통해 정답을 찾아가는 방식이기 때문입니다.

epoch는 학습 데이터를 한번씩 모두 학습시킨 횟수를 말합니다. ‘epoch = 10’이라면 학습 데이터를 총 10번씩 학습 시킨 것을 의미합니다.


오차 역전파(Backpropagation)

델타 학습법만으로는 신경망의 모든 노드들을 학습시킬 수 없습니다. 특히 은닉(Hidden) 계층은 오차의 정의조차 되어 있지 않고, 정답 또한 정해져 있어서 학습이 불가능합니다.

1986년 오차 역전파 알고리즘이 개발되면서 학습 문제가 해결이 되었습니다. 출력층에서부터 시작해 거꾸로 추적해가며 오차에 따라 가중치를 조절하는 방법입니다.

Image


One-Hot-Encoding(1-of-N Encoding)

결과가 0과 1이 아닌, 3가지 이상의 범주를 가질 때 출력 노드를 범주 개수만큼, 그리고 각 자릿수마다 범주를 나타내도록 0과 1로 표현하는 방식을 ‘One-Hot-Encoding’이라고 합니다.

Image

Image


경사각 소실(Vanishing Gradient)

신경망의 계층을 깊게 할수록 성능이 더 떨어지는 원인으로 다음과 같은 이유를 들 수 있습니다.

  • 경사각 소실(Vanishing Gradient)
  • 과적합(Overfitting)
  • 많은 계산량

활성화 함수(Activation Function)으로 많이 사용하는 시그모이드(Sigmoid) 함수는 최대 기울기가 0.3을 넘지 않습니다. 즉, 곱하면 곱할수록 0에 가까워지고 결국 0이 되는 현상이 발생해서 기울기가 사라집니다.

대안으로 시그모이드 함수대신 ReLU 함수를 사용해서 해결할 수 있습니다.

Deep Learning 프레임워크별 특징 및 장단점

|

Deep Learning Framework

딥러닝(Deep Learning)이 화두가 되다보니 수 많은 프레임워크(Framework)들이 생겨나거나 재조명받기 시작했습니다. 그리고 각 프레임워크의 선호도들도 트렌드에 따라 계속 바뀌고 있습니다.

Image

위 도표는 구글에서 조사한 딥러닝 프레임워크 관심도 순위입니다.


Theano

Theano는 다차원 배열을 쉽게 다룰 수 있는 라이브러리입니다. 데이터 탐색에 적합해서 다른 라이브러리들과 연동하여 연구용으로 많이 사용되었습니다.

Keras를 비롯한 많은 딥러닝 라이브러리가 Theano를 기반으로 만들어졌습니다.

Theano는 CNN과 노이즈 제거 알고리즘인 Auto-Encoder, 심층 신경망에 최적화된 프레임워크입니다. 2008년 첫 버전이 공개되고 나서 한동안 가장 인기있는 프레임워크로 알려져왔었습니다.

Theano는 초창기 프레임워크다보니 많은 부분에서 단점이 존재합니다. 사용하기 복잡하며, 단일 GPU를 지원합니다. 또한 에러 메시지가 코드의 잘못된 부분 수정에 크게 도움을 주지 못하는 점과 대형 모델에 대해서는 컴파일 시간도 오래 걸린다는 단점이 있습니다.


Torch7

TorchLua 언어 기반의 API를 제공하는 머신러닝 프레임워크입니다. 1990년대 초에 개발된 오래된 프레임워크 중 하나입니다.

작고 다양한 많은 모듈 조각으로 이루어져 있어 결합해서 자신만의 레이어를 만들고 GPU에서 실행하기 쉬운 장점이 있습니다. Lua 언어의 사용은 장단점을 모두 갖고 있는데, 자바 스크립트(Java Script)와 사용법이 비슷하여 직관적이며 배우기 쉽고, 타인의 코드 이해를 쉽게 할 수 있는 장점이 있지만, Lua 언어 자체가 Java/Python보다 폐쇄적이고 사용자 그룹이 활성화되어 있지 않아 생태계 조성에 불리한 점이 있습니다.

2017년 1월에 Facebook에서 Python API 형태의 [Pytorch(https://github.com/pytorch/pytorch)]를 오픈 소스로 공개했습니다.

Pytorch는 가변 길이 입력과 출력을 처리할 수 있는 Dynamic Computation Graph를 지원합니다.


Tensorflow

현재 가장 많은 개발자들이 선호하는 프레임워크 중 하나로 Google에서 만든 딥러닝용 프레임워크입니다. Theano를 대체하고자 만들었으며, Tensorflow 개발진에 Theano 개발자들도 일부 포함되어 있었습니다.

Tensorflow는 기본적으로 C++과 Python을 지원하고 있으며, 내부적으로는 전부 C/C++ 엔진으로 되어 있어 Python으로 개발하더라도 속도에 큰 차이가 없습니다. 다만 Java나 Scala 언어 등은 지원하고 있지 않습니다.

Tensorflow는 딥러닝 외에도 강화학습(Reinforcement Learning) 등을 위한 알고리즘도 제공하고 있습니다.

Theno보다 컴파일 속도가 빠르며, TensorBoard라는 시각화 툴을 제공하고 있습니다. CPU나 GPU를 활용한 계산이 수월하며 데이터나 모델들의 병렬 처리에 적합합니다. 또한 GPU에 최적화가 되어 있고, 분산 병렬 컴퓨팅 환경을 지원한다는 점도 다른 프레임워크보다 우수한 점입니다.

Tensorflow는 구글에서 상업적 지원은 하지 않고 있으며, 앞으로도 계획은 없다고 합니다. 그리고 사전 학습 모델이 많지 않다는 단점이 있으며, 다른 딥러닝 프레임워크보다 늦게 개발되었기 때문에 아직 다양한 플랫폼에서의 최적화가 부족한 경우가 있습니다.


Caffe

Caffe는 비전(Vision)과 머신러닝을 위한 라이브러리로 Matlab에서 C/C++ 기반으로 고속 CNN(Convolution Neural Network)을 구현해놓은 것입니다. 문자나 음성 등 범용적인 딥러닝을 위한 라이브러리는 아닙니다. C++과 Python을 모두 지원합니다.

범용성이 없다보니 확장성이 떨어지고 상업적 지원은 별도로 없습니다. 또한 회귀망에 적합하지 않고 대규모 네트워크에도 적합하지 않습니다. 대학교에서 순수 연구 목적으로 개발된 프레임워크이다보니 업데이트나 발전이 느려서 최신 GPU와의 호환성 검증이나 최적화 지원이 신속하지 못하며, 확장형 분산 컴퓨팅 API 지원이 부족한 점이 단점입니다.


Keras

Keras는 내부적으로 Theano와 Tensorflow를 바탕으로 하고 있으며 직관적이며 Python API 형태에 가장 가까운 인터페이스를 제공하고 있습니다.

Google 개발자에 의해 만들어졌으며, 가장 빠르게 발전하고 있는 프레임워크 중 하나라고 볼 수 있습니다.

직관성이 떨어지고 진입 장벽이 높은 Tensorflow와는 달리 일반 Python API 형태로 제공하다보니 사용하기가 훨씬 쉽고 사용자 친화적인 환경을 제공하고 있습니다. 향후 Python 표준 딥러닝 API 형태로 자리 잡을 가능성이 있습니다.


CNTK

CNTK는 Microsoft의 딥러닝 오픈 소스 프레임워크입니다. DNN, CNN, 회귀 등의 알고리즘이 포함되어 있으며 C++ 기반에 Python API를 제공하고 있습니다.

활성화 함수(Activation Function)

|

Activation Function

활성화 함수(Activation Function)는 신경망(Neural Network)에서 임계값(Threshold)을 이용해서 0 또는 1의 값을 출력하는 용도로 사용됩니다.

활성화 함수는 계단형 함수, 시그모이드(Sigmoid) 함수, ReLU 함수 등 다양한 함수가 사용되고 있습니다.


계단 함수

계단 함수는 다음과 같은 모습의 그래프로 표현됩니다.

Image

입력값이 특정 값 이상이면 1, 그렇지 않으면 0을 출력하는 평범한 함수입니다.


Sigmoid Function

시그모이드 함수는 다음과 같은 수식으로 되어 있습니다.

[h(x) = \frac{1}{1 + exp(-x)}]

그래프로 표현하면 다음과 같습니다.

Image

Python 코드로 표현하면 다음과 같이 작성할 수 있습니다.

def sigmoid(x):
    return 1 / (1 + np.exp(-x))


계단 함수 vs 시그모이드 함수

계단 함수와 시그모이드 함수의 차이는 연속성에 있습니다. 계단 함수는 0과 1의 값이 특정한 값을 기준으로 갑자기 변합니다. 그 반면에 시그모이드 함수는 값이 연속적으로 매끈하게 이어집니다.

즉, 시그모이드 함수는 출력값이 0 또는 1의 값 뿐만 아니라 0.5, 0.7, 0.888 등의 실수값도 출력합니다.

계단 함수와 시그모이드 함수는 비슷한 점도 있습니다. 전체적인 모양으로 보면 둘은 비슷한 모양을 하고 있습니다. 입력값이 커질 수록 출력값은 1에 가까워지고, 반대의 경우는 0에 가까워집니다. 출력값이 0과 1 사이의 값이라는 것도 공통점입니다.

또한 두 함수는 ‘비선형 함수’라는 점도 동일합니다.

신경망에서는 활성화 함수로 비선형 함수만을 이용해야 합니다. 선형 함수는 신경망에서 계층을 깊게 하는 의미가 없어지기 때문입니다.


ReLU 함수

기존에는 활성화 함수로 계단 함수와 시그모이드 함수를 많이 사용했었습니다. 하지만 최근에는 ‘임계 논리 함수(ReLU, Rectified Linear Unit)’를 더 많이 사용하는 경향이 있습니다.

ReLU 함수는 입력이 0 이상이면 그 입력값을 그대로 출력하고, 그 이하에서는 0을 출력하는 함수입니다.

[h(x) = \begin{cases} x ( x > 0 )
0 ( x \le 0 ) \end{cases}]

그래프로 표현하면 다음과 같습니다.

Image


각 함수들의 그래프

Image

Wordpress 이미지와 MySQL 이미지 연결(Link) 예제

|

Docker 컨테이너간 연결

Docker로 이미지를 생성할 때, 하나의 이미지에 웹 서버, 데이터베이스 등 필요한 프로그램을 모두 설치하는 것도 가능하지만, 보통은 프로그램별로 이미지를 따로 생성하는 경우가 많습니다. 이렇게 이미지를 따로 생성하면 나중에 웹 서버를 교체하거나 데이터베이스를 교체하는 일이 있을 때 각 서버간 충격을 완화시키고 훨씬 더 유연하게 대처할 수 있기 때문입니다.

Docker 컨테이너끼리 연결할 때는 docker run 명령어에 --link 옵션을 사용합니다.


Wordpress 및 MySQL

Docker Hub에는 Wordpress 이미지가 이미 존재합니다. 따라서 해당 이미지를 내려받아서 설치하면 간단하게 Docker 기반 Wordpress 컨테이너를 생성할 수 있습니다. 하지만 Wordpress는 MySQL 데이터베이스를 필요로 합니다. 따라서 MySQL 이미지도 내려받아야 하며, 두 이미지로 생성한 컨테이너간 링크(Link) 설정을 해주어야 합니다.

컨테이너간 링크는 ‘Wordpress’ 컨테이너에서 ‘MySQL’ 컨테이너로 연결을 해줘야 하기 때문에, 여기서는 편의상 MySQL 컨테이너를 먼저 실행하고 그 이후 Wordpress 컨테이너를 실행하도록 하겠습니다.


MySQL 이미지 다운로드 및 컨테이너 실행

$ docker run --name snow-mysql -e MYSQL_ROOT_PASSWORD=snowdeer -d mysql 

MySQL 이미지는 몇 가지 파라메터(특히 ROOT 패스워드)를 설정해줘야 정상적으로 동작합니다. -e 옵션을 이용해서 필수 변수의 값을 세팅해줬습니다. 해당 옵션은 Docker HUB 사이트의 [MySQL 이미지 페이지]((https://hub.docker.com/_/mysql/)에서 확인할 수 있습니다. 만약 파라메터없이 run 명령어로 수행했을 때도, docker logs <container name> 명령어를 통해서 해당 컨테이너가 정상적으로 돌고 있는지, 또는 오류가 발생했는지 확인할 수 있습니다.

-d 옵션은 ‘detach’라는 의미로 백그라운드에서 컨테이너가 돌 수 있도록하는 옵션입니다.


Wordpress 컨테이너 실행 및 링크 설정

$ docker run --name snow-wp --link snow-mysql:mysql -p 80 -d wordpress

위 명령어는 snow-wp라는 이름의 컨테이너를 생성하며, mysql 이미지로 생성된 snow-mysql이라는 이름의 컨테이너에 링크(link) 설정을 합니다. 이 때 링크되는 포트는 80번 포트가 되며 -d 옵션을 통해 백그라운드로 수행됩니다. 마지막의 wordpresssnow-wp 컨테이너를 생성할 이미지 이름입니다.


컨테이너 상태 조회

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
4c74627deef3        wordpress           "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       0.0.0.0:32768->80/tcp   snow-wp
ef5202166d02        mysql               "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       3306/tcp                snow-mysql

위와 같이 컨테이너 2개가 동작하고 있는 것을 확인할 수 있으며, snow-wp 컨테이너의 포트 정보를 보면 0.0.0.0:32768가 80번 포트로 연결되었음을 확인할 수 있습니다.


웹브라우저에서 Wordpress 확인

위에서 확인한 0.0.0.0:32768 정보로 웹 브라우저에서 접속하면 다음과 같이 Wordpress 설정 화면을 볼 수 있습니다.

Image

ROS 2.0 소스로 설치할 때 중간에 Timeout 오류나는 경우 해결법

|

Timeout 오류 문제 해결법

ROS 2.0 설치를 소스로 다운받아서 빌드하는 경우, 중간에 소스를 다운받다가 Timeout이 나는 경우가 종종 있습니다.

예를 들면, rviz_ogre_vendor라는 패키지를 600초 안에 다운 받아야 하는데, 만약 다운 속도가 느려서 600초가 넘어가면 다운로드 실패가 되며 다시 처음부터 다운받아야하는 불상사가 생기는 경우가 있습니다. 응답 없음에 대한 Timeout이 아니라, 전체 다운로드하는데 걸리는 시간이 600초 이하라야 하더군요.

해결법은 다음과 같습니다.

/ros2_ws/src/ros2/rviz/rviz_ogre_vendor 폴더를 찾아갑니다. rviz_ogre_vendor 패키지가 아닌 다른 패키지에서 문제가 발생하면 해당 패키지 폴더를 찾아가면 됩니다. 해당 폴더에서 CMakeList.txt 파일을 열면 그 안에 다운로드 경로와 Timeout 설정값이 있습니다. Timeout 값을 20~30배로 늘려주면 됩니다.