활성화 함수(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배로 늘려주면 됩니다.

신경망(Neural Network)

|

Neural Network

퍼셉트론을 이용하면 복잡하고 어려운 함수도 표현이 가능합니다. 하지만, 가중치를 설정하는 작업을 사람이 수동으로 해줘야하는 불편함이 여전히 존재합니다.

신경망(Neural Network)은 이러한 문제점을 해결해줍니다. 가중치를 학습을 통해서 자동으로 획득하고 수정할 수 있습니다.


Simple Neural Network

신경망을 간단하게 그림으로 표현하면 다음과 같습니다.

Image

데이터가 입력되는 쪽을 Input, 결과값이 출력되는 쪽을 Output, 그리고 그 사이를 Hidden이라고 합니다. 층이 많아지면 아래의 그림과 같은 모습이 됩니다.

Image


퍼셉트론과 신경망

신경망은 퍼셉트론과 크게 다르지 않습니다. 퍼셉트론은 다음과 같은 함수로 이루어져 있습니다.

[output = \begin{cases} 0 ( w_1 x_1 + w2 x_2 + … + w_i x_i \le 0 )
1 ( w_1 x_1 + w2 x_2 + … + w_i x_i > 0 ) \end{cases}]

이걸 좀 더 간결하게 표현하면 다음과 같이 표현할 수 있습니다.

[y = h(b + w_1 x_1 + w_2 + x_2 + … w_i x_i)
h(x) = \begin{cases} 0 ( x \le 0 )
1 ( x > 0 ) \end{cases}]

입력 신호의 총합이 h(x)라는 함수를 거쳐서 변환이 되며, 그 변환된 값이 y 출력값이 됩니다.


Activation Function

위에서 나온 h(x) 함수는 활성화 함수(Activation Function)라고 합니다. 입력 신호의 총합을 출력 신호로 변환해주는 함수입니다.

위의 수식에서 $ b + w_1 x_1 + w_2 + x_2 + … w_i x_i $ 부분을 a라는 변수로 치환하면 다음과 같은 식으로 표현이 됩니다.

[a = b + w_1 x_1 + w_2 + x_2 + … w_i x_i
y = h(a)]

그림으로 표현하면 아래와 같은 그림이 되고,

Image

조금 더 간결하게 표현하면 다음과 같이 표현됩니다.

Image

컨테이너 실행 명령어

|

Docker Container

Docker 컨테이너는 Docker 이미지로부터 생성할 수 있습니다. 이미지 하나로부터 동일한 컨테이너를 여러개 생성할 수 있으며, 각 컨테이너는 샌드박스(Sandbox) 형태로 되어 있어 각 컨테이너간 간섭이 없습니다.


컨테이너 생성

docker run <image name> 명령어를 이용해서 컨테이너를 생성할 수 있습니다. run 명령어로 실행한 컨테이너는 주어진 명령이 끝나거나 사용자 명령에 따라 종료됩니다.

예를 들어 다음과 같이 명령을 내리면

$ docker run ubuntu echo "hello"

hello

화면에 ‘hello’라는 메시지만 출력하고 해당 컨테이너는 종료됩니다. 해당 컨테이너의 상태 여부는 docker ps -a 명령어를 이용해서 조회 가능합니다.

docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                     PORTS               NAMES
303c05fe9c03        ubuntu                  "echo hello"             4 seconds ago       Exited (0) 3 seconds ago                       dreamy_goldstine

STATUSExited 상태인 걸 확인할 수 있습니다.


컨테이너 목록 조회

컨테이너 목록은 docker ps 명령어를 이용해서 조회할 수 있습니다. 여기에 -a 옵션을 붙이면 종료된 컨테이너 정보까지 조회됩니다.

$ docker ps -a


컨테이너 시작/재시작/정지

다음 명령어로 컨테이너를 시작하거나 재시작, 정지할 수 있습니다.

$ docker start <container name>

$ docker restart <container name>

$ docker stop <container name>


현재 실행중인 컨테이너에 접속하기

docker attach 명령어로 현재 실행중인 컨테이너에 접속할 수 있습니다.

$ docker attach <container name>


외부에서 컨테이너 안의 명령 실행하기

docker exec 명령어로 컨테이너 밖에서 컨테이너 안의 명령을 실행할 수 있습니다.

$ docker exec <container name> <command>

ex) docker exec snowdeer_docker echo "Hello, SnowDeer"

exec 명령어는 현재 실행 중인 컨테이너에만 사용할 수 있으며, 중지 상태의 컨테이너에는 사용할 수 없습니다.


컨테이너 삭제

docker rm 명령어로 컨테이너 삭제를 할 수 있습니다. 컨테이너 삭제는 rm 명령어이며, 이미지 삭제는 rmi 입니다.

$ docker rm snowdeer_docker

docker run 명령을 이용해서 컨테이너를 실행할 때 --rm 옵션을 붙이면 컨테이너 종료시 해당 컨테이너가 자동으로 삭제되기 때문에 편리하게 연습용으로 편리하게 사용할 수 있습니다.