Q-Learning

컴퓨터공부/인공지능 2018.08.19 09:50 Posted by 아는 개발자 아는 개발자

강화학습은 주변의 상태를 지속적으로 탐사해가며 미래에 주어지는 '보상' 값을 활용해 최적의 알고리즘을 찾는 학습법이다. 초기 학습데이터가 필요한 딥러닝과는 달리 초기의 학습데이터가 필요 없으며(물론 학습 데이터를 활용해서 성능을 높이기도 한다) 대신 어떤 조건에서 보상을 줄 것인지에 대한 정책과 탐사할 환경이 필요한 알고리즘이다. 국내에선 이세돌과 커제를 무참히 무찌른 알파고의 학습 알고리즘으로 알려져있다.


Q-Learning은 대표적인 강화 학습 알고리즘으로 '특정 상태에서 어떤 결정을 내리는 것이 미래 보상을 가장 높여줄 것'인지에 대한 정책 데이터를 지속적으로 업데이트 하는 알고리즘이다. 강화학습을 배울 때 가장 먼저 접하는 알고리즘이며 수학 수식들이 난무해 이해하고 싶지 않고 할 수도 없을 것 같은 위키피디아 페이지와 달리 예상외로 쉽고 차근차근 학습해나가면 누구나 배울 수 있는 알고리즘이다. 유튜브에 쉽게 풀어 쓴 강의도 많으니 심도 있게 공부하고 싶은 분들은 여기서 공부하면 좋을 것 같다.


이번 포스트에서는 Q-Learning을 아주 쉽게 풀어 쓰지는 않고 대략적인 동작 방법과 의사 코드를 정리해 수강한 강의 내용들을 정리하는데 초점을 맞추고자 한다.


그림 1.


Q-Learning의 현재 상태를 표현하면 위의 그림 처럼 테이블의 형태로 표현 할 수 있다. 현재 에이전트(학습하는 주체를 에이전트라고 부른다)가 있는 곳은 S로 표시된 곳이고 가야할 곳은 D이며 이곳에 도달 했을 때 보상을 받게 된다. H는 진입하면 죽는 곳이다.


그림 2.


처음 환경에 진입했을 때는 아무런 정보가 없기 때문에 이곳 저곳 다 다녀본다. 에이전트가 선택할 수 있는 방향은 동서남북중 하나인데 어떠한 정보가 없기 때문에 에이전트는 어느 곳을 선택해도 돌아오는 보상 값은 동일하다고 보고 랜덤하게 선택한 방향으로 이동하게 된다. 이렇게 다니면서 다니면서 홀에도 빠져 보고 이전에 지나친 경로들을 다시 다녀보기도 한다. 한마디로 삽질의 연속이다.


그림 3.


이렇게 우왕좌왕하면서 우연히 D 값에 도달 하기도 하는데 이때 에이전트는 처음으로 보상(reward)값을 받는다. 그리고 앞으로 움직이는 행동들은 앞서 초기화한 보상값을 활용해서 업데이트가 이뤄진다. 즉 이 상태에서는 특정 방향이 목적지에 도달할 확률이 높다고 가중치를 주는 작업이다. 지금까지를 의사코드로 정리하면 다음과 같다.

1. 모든 환경 데이터 값, Q(s, a)을 초기화 한다.

2. 현재 상태를 확인한다.

3. 그리고 다음의 작업을 반복한다.

- 동작을 선택하고 실행한다.

- 행동에 따른 보상 값을 받는다. reward

- 새로운 상태 값(s')을 확인한다.

- 아래의 수식으로 환경 데이터 값을 업데이트 한다

  Q(s, a) = reward + Max Q(s', a')


Q(s, a)의 의미는 상태 현재 상태가 's'이고 'a' 행동을 취했을 때 얻게 될 보상 값이다. 위 그림에서는 총 25개의 상태가 있고 각 상태별로 가능한 행동이 4개가 있으니 총 100개의 환경 데이터 값이 필요하다.


그림 4. 


위의 알고리즘은 최적의 값은 찾기는 하지만 보상값을 업데이트한 이후에는 똑같은 경로로 이동하게 되는 단점있다. 현재 상태의 보상 값을 바로 다음 상태의 보상 값으로 입력시키기 때문에 파란선으로 지나온 상태에서 최적의 보상을 주는 값이 이미 정해져 버리고 또 각 상태별 행동은 가장 높은 보상 값을 주는 것으로 선택하기 때문에 매번 동일한 경로로 이동하게 된다. 그래서 그림 4의 빨간선을 이용하면 더 빠르게 갈 수 있지만 이 경로는 보지 못하고 이전에 학습한 경로대로만 다니게 되는 단점이 있다.


이런 오류를 막기위해서 알고리즘에 두가지 노이즈를 추가한다. 미래의 보상은 시간이 지날 수록 낮춰지는 것과 행동을 선택할 때 보상값과 랜덤값을 더하는 방식이다. 두 방법 모두 에이전트에게 돌출 행동을 유도하는 일종의 트릭이다.


1. 모든 환경 데이터 값, Q(s, a)을 초기화 한다.

2. 현재 상태를 확인한다.

3. 그리고 다음의 작업을 반복한다.

- 동작을 선택할 때 랜덤 값을 포함한다.

a= argmax(Q(s, a) + ramdom_value)

- 보상 값을 받는다.

- 새로운 상태 값(s')을 확인한다.

- 환경 데이터 값을 업데이트 한다

  Q(s, a) = gamma * reward + Max Q(s', a'), # 0 < gamma < 1


노이즈를 준 부분을 굵은 글씨로 표시해뒀다. 행동을 선택 할 때 최적의 보상값 + random 값으로 선택하도록 했는데 이는 동서남북을 선택 할 때 각각의 보상값과 ramdom값을 더한 값중에서 가장 높은 값을 선택하도록 하는 것이다. 초기 알고리즘은 그림 4에서 빨간선과 파란선이 갈라지는 지점(2행 3열)에서 가장 높은 보상값을 주는 파란선을 무조건 선택하게 되는데 수정한 알고리즘은 빨간선을 선택 했을 때의 랜덤값이 더 높으면 빨간선을 선택하게 된다.


그리고 미래에 주어지는 보상은 지속적으로 감소하게 만들었다. 처음으로 받게되는 보상은 D에 도달하는 지점이었으니 빨간선과 파란선이 갈라지는 지점에서는 보상값이 꽤 많이 감가상각돼 빨간선을 택하는 것과 파란색을 택할 때의 보상값 차이가 얼마 나지 않을 것이다. 이 두가지 방법으로 에이전트는 기존 학습 데이터 값을 크게 벗어나지 않는 선에서 돌출된 행동을 유도 할 수 있다.


참고문헌


- 홍콩과기대 교수님 유튜브 강의: https://www.youtube.com/channel/UCML9R2ol-l0Ab9OXoNnr7Lw

'컴퓨터공부 > 인공지능' 카테고리의 다른 글

Q-Network  (0) 2018.09.12
Q-Learning in Non-Deterministic World  (0) 2018.08.19
Q-Learning  (0) 2018.08.19
파이썬으로 AI 개발할 때 유용한 패키지 모음  (0) 2018.08.07
뉴럴네트워크(Neural Network)  (0) 2017.08.18
오버피팅(Overfitting)  (0) 2017.08.10

conda tensorflow 설치 및 jupyter notebook 연결

삽질 기록 2018.08.03 23:20 Posted by 아는 개발자 아는 개발자

Conda 환경에서 tensorflow를 설치하는 방법


0. Prerequsite


- Anaconda를 설치한다.

- GPU를 사용할 경우 tensorflow를 사용할 수 있도록 CUDA, cuDNN 라이브러리를 설치한다.


1. tensorflow 가상 환경 생성


tensorflow를 사용하는 가상 환경을 하나 생성한다. 별도로 설정하고 싶은 환경이 있으면 생략하고 아니면 만들자.

kwony@kwony:~$ conda create -n tensorflow pip \ 
python={ python 버전 입력 ex) 2.7, 3.4

2. 가상환경 활성화


1에서 만들어둔 가상 환경을 활성화한다. activate 명령어가 안먹히는 경우는 anaconda의 바이너리가 export가 제대로 안된것이니 확인해보도록 하자.

kwony@kwony:~$ conda activate tensorflow
(tensorflow)$  # tensorflow로 명령어 프롬프트가 변형된다

3. tensorflow 설치


활성화된 명령어 프롬프트에서 tensorflow를 설치한다. tensorflow 공식 홈페이지에서 설치하려는 tensorflow의 종류와 파이선 버전에 해당하는 저장소를 입력하도록 하자.

(tensorflow) kwony@kwony:~$ pip install --ignore-installed \
 --upgrade { URL }

4. jupyter 설치


원래 아나콘다를 설치할 때 기본으로 포함된 jupyter-notebook에서 tensorflow를 쓰려고 하면 없는 모듈이라고 나온다. 방금전에 설치한 tensorflow는 현재 사용중인 가상 환경에만 적용되기 때문이다. 현재 가상 환경에서 사용하는 jupyter notebook을 설치하면 방금 전에 설치한 tensorflow를 사용 할 수 있다.

(tensorflow) kwony@kwony:~$ pip install jupyter

5. jupyter notebook 실행 후 테스트


jupyter 노트북으로 tensorflow 모듈을 사용해보면 문제없이 동작하는 것을 확인 할 수 있다.

(tensorflow) kwony@kwony:~$ jupyter-notebook 



뉴럴네트워크(Neural Network)

컴퓨터공부/인공지능 2017.08.18 20:45 Posted by 아는 개발자 아는 개발자

숫자 인식 코드를 분석 할 때 이미지 사이즈의 크기는 28x28이라서 총 784개의 feature를 두어서 구할 수 있었습니다. 그런데 실제로 사용하는 이미지는 이것보다 훨씬 크기가 큽니다. 바탕화면 해상도는 1920x1020이고 여기에 색깔을 넣기 위해 3차원까지 넣어서 총 요소(Element)들의 개수는 5,875,200(1920*1020*3)개가 됩니다. 요소들의 개수만큼 feature로 놓고 학습을 시킨다면 매우 시간이 오래 걸리겠죠?


그래서 인공지능 과학자들은 다른 방법을 고안했습니다. 과학자들은 연구에서 어려움이 있을 때마다 주로 자연에서 해답을 얻곤 하는데요 인공지능 뇌과학자들은 인간의 뇌의 뉴런구조를 본따서 이 문제를 해결하기로 했습니다. 인간의 뇌가 생각하는 방식을 컴퓨터에 이식 할 수 있다면 이 문제도 쉽게 해결 할 수 있다고 본겁니다. 완전히 발상을 전환했지요?



아마 고등학교때 생물 수업을 들어보신 분은 뉴런 구조에 대해서 간단히 알고 계실 겁니다. 왼쪽 줄기로 된 부분들에서 외부의 전기 자극을 받고 이것의 종합 값이 새로운 전기 자극을 발생시킬 정도가 되는지 확인해서 자극을 전달하는 방식입니다. 이것을 좀더 수학적으로 표현하면 아래와 같습니다.




x1, x2, x3는 외부에서 온 자극의 세기를 말합니다. 그리고 g(x1, x2, x3)는 이 자극들을 어떠한 수식에 의해서 변환된 총합을 의미합니다. 최종적으로 H(x) 함수를 통해 외부의 세기로 전달할 자극의 세기를 결정합니다. 이것으로 어떤 세기로 전달할지가 결정 되는 것이지요. 여기서 g(x1, x2, x3) 이 식은 주로 직선 개별에 가중치 값을 둬서 w1*x1 + w2*x2 + w3*x3로 표현하곤 하는데요 반복적인 학습 작업을 통해서 적절한 w1, w2, w3의 값을 구하게 됩니다.


뉴런 하나 가지고 학습하고 미래를 예측하기엔 턱없이 부족합니다. 하지만 뉴런의 개수가 많다면 더 효율적으로 예측 할 수 있습니다. 실제로 뉴럴네트워크에서는 아래의 그림처럼 여러 개의 뉴런층을 나눠서 학습시킵니다.


neural network에 대한 이미지 검색결과


많은 양의 데이터와 뉴럴네트워크를 사용한 학습모델은 생각보다 '아주 잘' 작동합니다. Feature 개수가 늘어나서 도저히 학습시키기 어려워 보였던 것들도 뉴럴 네트워크를 이용해 금방 해결 할 수 있고 예측도 '생각보다 잘' 합니다. 정말 인간의 뇌를 복사한 것 같기도 합니다. 뉴럴네트워크 덕분에 이미지/음성 인식처럼 불가능해보였던 영역이 많이 발전했습니다. 특히 이미지인식은 알래스카 맬러뮤트랑 시베리언 허스키를 구분 할 수 있는 수준까지 왔다고 하네요

'컴퓨터공부 > 인공지능' 카테고리의 다른 글

Q-Learning  (0) 2018.08.19
파이썬으로 AI 개발할 때 유용한 패키지 모음  (0) 2018.08.07
뉴럴네트워크(Neural Network)  (0) 2017.08.18
오버피팅(Overfitting)  (0) 2017.08.10
숫자인식 코드 분석해보기  (2) 2017.08.03
Softmax와 Cross entropy  (0) 2017.08.03

오버피팅(Overfitting)

컴퓨터공부/인공지능 2017.08.10 21:18 Posted by 아는 개발자 아는 개발자

학습 능률을 높인다는 것은 비용함수(Cost function)의 값을 줄이는 것입니다. 하지만 학습에 사용하는 Feature(쎄타라고 생각하시면 됩니다)의 개수가 일정하면 Gradient Decent와 같은 최적화 작업을 통해 통해 최적의 해에 도달 했다고 해도 절대적인 비용은 어쩔 수가 없습니다.


최대한 학습 데이터를 따르는 직선을 만들었지만 그래도 비용은 어쩔수가 없네요.


그런데 우리가 직선이 아니라 볼록한 함수를 이용해서 학습한다면 어떨까요? 쎄타2를 추가하고 이때의 x는 제곱으로 본다고 합시다. 여러차례 최적화 작업을 거치면서 아래로 볼록한 함수가 나온다면 데이터의 흐름을 잘 따를 수 있을 것 같습니다. 실제로 그림으로 그려보봐도 그렇네요.


데이터 흐름을 더 잘 따라가는 것 같습니다.


실제로 계산해보면 비용함수의 값도 감소합니다. 이로써 Feature의 개수를 늘리면 학습효과가 더 증가 한다는 것을 알 수 있겠네요. 내친김에 극솟값 x축에 있는 학습 데이터도 캐치 할 수 있도록 차원을 더 올려봅시다. 이번엔 아예 다섯제곱까지 늘려보자구요.


이제는 학습에 사용된 모든 데이터들을 캐치 할 수 있게 됐습니다. 아마 비용함수의 값은 0이 나올것 같네요. 학습 성능은 가장 좋은 것으로 판단해도 될 것 같습니다만 X축에서 오른쪽으로 갈수록 값이 곤두박질 치고 있다는게 맘이 걸리긴 합니다.


만약 위 데이터의 원래 흐름이 아래로 블록한 그래프였다면 어땠을가요? 실제로 아래 그림의 노란색 데이터들이 들어온겁니다. 이런 경우 학습을 잘했다고 보기 어렵습니다. 차라리 2차원 블록한 그래프가 비용함수 값은 좀 있더라도 노란색 데이터가 들어 올 것이라고는 더 잘 예측 했을 것 같네요.


이처럼 비용함수의 값을 낮추기 위해 여러개의 Feature를 과하게 넣다보면 오히려 실제 데이터와 괴리되는 현상이 생깁니다. 분명 학습 데이터는 잘 맞추는데 실제로 보면 예측은 전혀 못하고 있는 것이지요. 이런 경우를 오버피팅(Overfitting)이라고 합니다. 학습 모델을 만들 때 위와 같은 경우를 방지하기 위해 비용함수의 수식에 Feature의 크기에 따른 변화값을 두기도 한답니다. 선형회귀에선 수식으로는 이렇게 표현해요!


파란색 원으로 그려둔 부분이 Overfitting을 방지하기 위한 값입니다. 일반적으로 쎄타의 값이 커질수록 Overfitting 발생 정도가 증가합니다. 그래서 이 값의 제곱 값을 더하면 전체 비용함수가 늘어나는 것으로 보고 학습 효과를 떨어뜨리게 되는 것이죠.


람다 값은 이때의 상수입니다. 오버핏 방지 연산에 얼만큼 비중을 둘 것인지를 결정합니다. 이 값이 커질수록 오버피팅이 하지 않게 되겠지만 낮아진다면 학습 데이터도 잘 맞추지 못하게 됩니다. 이 값이 적당할 때 가장 그럴듯한 예측을 하는 학습 모델을 만들 수 있게 됩니다.

Logistic Regression (로지스틱 회귀)

컴퓨터공부/인공지능 2017.07.31 21:49 Posted by 아는 개발자 아는 개발자

앞선 포스팅에서 나이에 따른 연봉 변화로 선형 회귀를 설명했었습니다. 이번에는 예시를 조금 변형해서 연봉이 5000만원이 넘는지 안넘는지를 결정하는 함수를 생각해봅시다. 먼저 연봉이 5000만원을 넘지 않는 경우를 0, 넘는 경우를 1로 생각하고 그래프를 그려볼까요?



y축의 값이 0과 1밖에 없으니 그래프가 상당히 단조로워졌네요. 아마 30-32 사이에서 연봉이 5000만원으로 변화하는 지점이 있는 것 같습니다. 이 정보를 토대로 선형회귀를 해보면 아래 그림처럼 추세선을 만들어 줄 수 있을 것 같습니다.



대략 추세선의 값이 0.5 정도가 넘으면 연봉이 5000만원이 넘는다고 짐작 할 수 있겠네요. 이렇게 하면 뭐 더이상 손댈 것도 없을것 같습니다. 그런데 새로운 학습 데이터가 추가됐다고 해봅시다. 요렇게요.



55세 57세 데이터가 들어오면서 기울기가 낮아져버렸습니다. 아까처럼 y축 값이 0.5 가 넘을때 연봉이 5000만원이 넘을 것이라고 단언하면 30-32세 사이의 데이터를 커버 할 수 없게 됩니다. 골치아프네요. 그렇다고 기준 값을 0.4로 내리자니 다른 데이터로 학습 한 후에는 또 달라질 것이고 머리가 아픕니다. 모든 경우를 커버 해줄수가 없죠.


이런 분류(Classification)의 문제는 선형 회귀로 해결 할 수 없습니다. 차라리 특정 지점을 지나면 분류 되는 것으로 정하면 편할 것 같네요. 인공지능에서도 이렇게 두 가지 경우를 분류합니다. 이때 사용하는 회귀 방법이 Logistic Regression 입니다. 여기서 특정 임계치를 지날 때의 값을 표현하는 함수가 여러가지 있는데요 가장 대표적인 Sigmoid 함수에 대해서 알아봅시다.



그래프를 보니 x축이 증가하는 방향은 1로 수렴하고 감소하는 방향은 0으로 수렴하네요. 쉽게 x>0 인 구간은 1이고 x<0인 구간은 0으로 정의 할 수 있을것 같습니다. 우리는 식을 살짝 변형시켜서 특정 입력값이 0 보다 큰 경우에는 분류가 참인 경우로, 그렇지 않은 경우에는 거짓인 경우로 나눠볼 수 있습니다.



처음보는 수식이 나왔죠? 쎄타 위에 T자가 붙어있습니다. 이건 행렬에서 transpose라는 개념입니다만 지금 설명하면 길어지니 바로 오른쪽 그림처럼 이것이 지난 포스팅에서 배운 선형 방정식과 동일하다는 것만 확인하죠. 이렇게 식을 만들면 결국 z 값에 따라서 분류 기준이 결정되고 z는 곧 우리가 세운 선형 방정식이 됩니다. 우리는 다시 가장 그럴듯한 쎄타 값만 찾아주면 되겠네요.


선형회귀에서 쎄타 값을 찾기 위해 어떻게 했는지 기억 나시나요? 네 맞습니다. 비용 함수를 만들어 내고 여기에 Gradient Descent라는 기법을 적용해 여러번 반복해 가장 우수한 쎄타 값을 찾아 낼 수 있었습니다. 여기도 방식은 똑같습니다. Logistic 회귀에 해당하는 비용 함수를 만들고 이 함수에 Gradient Descent를 여러번 반복해 쎄타값을 찾아낼 수 있습니다. Logistic 회귀의 비용함수는 다음과 같아요



수학자들이 이렇게 하면 가장 좋다는 것을 이미 밝혀 냈으니! 증명하는 것은 생략합시다. 위 수식으로 우리가 설정한 쎄타값이 얼마나 학습 값을 잘 맞추고 있는지 확인 해 볼 수 있어요. 그리고 위 수식에 Gradient Descent를 적용해서 가장 우수한 쎄타값을 구해 낼 수 있답니다. 이것도 증명은 생략하고 수식만 보고 갈까요? 



선형회귀에서 했던 것처럼 Logistic 회귀에서도 위의 수식을 반복 적용해서 훌륭한 쎄타 값을 구해 줄 수 있습니다. 너무 위 식에 신경쓸 필요 없습니다. 어차피 Tensorflow가 모두 계산해 줄 거니까요 하하하. 그냥 느낌만 가져갑시다!


그런데 여기서 의문이 하나 생기네요. 지금껏 우리는 두가지 경우로 분류하는 것만 생각했습니다. 하지만 실제로는 아래 그림처럼 여러가지 경우로 분류하게 되는 경우가 생깁니다. 이런 경우는 어떻게 해야할까요?



방법은 생각보다 간단합니다. 분류 작업을 각각의 군집 마다 세번 실행하면 됩니다. '이것 아니면 나머지는 다 무효로 처리해!' 방법을 쓰는거지요. 아마 그림을 보시면 바로 감이 올겁니다.



첫번째 그림에서 파란색 군집과 나머지를 모두 검은색으로 생각했습니다. 그러면 파란색에 대해서는 확실히 구해 줄 수 있겠지요? 시계방향으로 이어지는 노란색과 초록색도 각각의 색깔에 대해서 만큼은 분류를 확실히 해줄 수 있었습니다. 각각의 분류 기준을 모두 합하니 각 기준에 대해서 분류를 해줄 수 있게 되었네요.


결국 여러 경우에 대해서 분류를 하는 것은 한 군집 집단에 대해서만 Logistic 회귀를 해주면 되는 것으로 귀결됩니다. 정말 유용한 함수죠? 다음 포스팅에선 지금까지 배운 것들을 이용해 손글씨를 판별하는 Tensorflow Tutorial 코드분석을 해보도록 하겠습니다!


* 참고한 자료


Coursera Machine Learning Andrew Ng 강의자료 - https://www.coursera.org/learn/machine-learning/

'컴퓨터공부 > 인공지능' 카테고리의 다른 글

뉴럴네트워크(Neural Network)  (0) 2017.08.18
오버피팅(Overfitting)  (0) 2017.08.10
숫자인식 코드 분석해보기  (2) 2017.08.03
Softmax와 Cross entropy  (0) 2017.08.03
Logistic Regression (로지스틱 회귀)  (0) 2017.07.31
Linear Regression (선형회귀)  (0) 2017.07.28

Linear Regression (선형회귀)

컴퓨터공부/인공지능 2017.07.28 20:50 Posted by 아는 개발자 아는 개발자

앞선 포스팅에서 우리는 인공지능이란 '대량의 데이터를 학습해 가장 그럴듯한 미래를 예측한다'고 정의했습니다. 그리고 여기서 우리 개발자가 할 일은 대량의 데이터를 훌륭하게 학습시키는 알고리즘을 만드는 일이라고 말씀드렸습니다. 이제 학습 알고리즘에 대해서 공부해봐야겠죠? 마음은 벌써 알파고에 쓰인 딥러닝을 짜보고 싶지만, 지금 당장은 해볼 순 없으니 가장 기초적인 학습법인 선형회귀(Linear Regression)부터 천천히 공부해봅시다.


우리에게 아래 표처럼 나이에 따른 연봉 데이터가 있다고 가정해봅시다


실제데이터는 아닙니다. 제가 가공한거에요 헤헤


언듯 데이터를 분석해보니 나이가 많을수록 연봉을 더 많이 받는것 같습니다. 한번 차트로 볼까요?


그래프 상으로 표현해보니 실제로도 그러하네요. 위 자료를 통해 나이에 따라서 연봉을 대강 추측 해볼 수 있을 것 같습니다. 나이가 32살이라면 대강 4천 3백만원에서 5천만원 사이인 4천 6백만원 정도 받을거라고 생각 해볼 수 있겠네요. 하지만 이런 식으로 하면 좀 야매인 느낌이죠? 위 데이터를 간단히 선형 방정식으로 표현한다면 좀더 일관성 있고 훌륭하게 예측 할 수 있을 것 같네요.


엑셀에 있는 추세선 기능을 활용해 선형 방정식을 추가해봤습니다. 나이 값에 따라 연봉을 추출 할 수 있으니 더 신뢰성이 가는 데이터입니다. 좀더 전문적인 느낌이죠? 정말 별거 아닌것 같지만 이것은 인공지능의 가장 기본적인 연산작업입니다. 이렇게 짜잘한 일련의 작업들이 쌓여서 더 복합한 것들을 예측하는 작업이지요.


자 그러면 이제 가장 그럴듯한 일차 방정식을 구해봅시다. 아마 위에서 우리는 차트로 그려보고 대강 짐작했을 뿐이지 실제로는 어떻게 구해야 할지 감이 안올겁니다. 따로 이걸 구할 수 있는 방정식이 있는 것도 아니구요. 그래도 괜찮습니다. 좀 번거롭지만 그래도 컴퓨터를 이용하면 훌륭하게 구할 수 있습니다.


기본적인 선형 방정식의 수식은 이렇습니다.



여기서 두 θ(쎄타라고 부르겠습니다) 값이 어떻냐에 따라서 그래프의 모형이 결정됩니다. 우리는 학습 데이터에 가장 근접한 두 쎄타 값을 구하는것이 목표입니다. 가장 손쉽게 해볼 수 있는 방법은 랜덤 값을 막 넣어보고 가장 그럴듯한 모형을 찾는 겁니다만 이렇게 한다면 시간이 엄청 오래 걸리겠지요? 컴퓨터도 이정도 연산을 커버할 만큼 빠르지 못합니다.


마구잡이로 대입해가며 선형 방정식을 만들기 전에 한 번 생각해봅시다 우리가 구한 선형 방정식이 학습 데이터와 얼마나 근접한지를 식으로 어떻게 표현 할 수 있을까요? 가장 간단한 방법은 우리가 만든 선형 방정식이 추출한 값과 실제 데이터 값의 차이를 확인해보는 방법일 겁니다. 여기서 값의 차이의 제곱의 합을 식으로 표현해봅시다.


m: 데이터의 개수, x: 나이값, y: 연봉, h: 선형방정식 입니다


대충 이렇게 만들면 우리가 만든 선형 방정식의 효율을 측정 해 볼 수 있을것 같습니다. 위의 식은 인공지능에 비용함수(cost function)이라 부릅니다. 아마 가장 좋은 선형방정식은 비용함수의 값이 가장 낮은 방정식일 겁니다. 


위의 그래프는 쎄타 값의 변화에 대한 비용함수 그래프입니다. 볼록볼록한 산능선 같은것이 둘쭉날쭉합니다. 지도상의 십자가 포인터는 현재 우리가 있는 지점이고 우리가 가야할 지점, 비용 함수가 가장 낮은 지점은 z 값이 가장 낮은 지점 즉 별표로 표시된 부분입니다. 이때의 쎄타값들을 구해 줄 수 있다면 가장 훌륭한 선형 방정식을 만들어 낼 수 있을것 같습니다.


이건 'Gradient Descent'라는 방법을 이용해서 가능합니다. 먼저 수식을 보여드릴게요!


여기서 α는 Learning Rate라고 합니다


위의 수식은 두개의 쎄타 값이 수렴 할 때 까지 반복하라고 되어 있습니다. 반복하는 작업은 비용함수의 편미분값 곱하기 알파 값을 기존 쎄타 값에서 빼주는 것을 계속 반복하는 방식입니다. 이렇게만 설명하면 감이 잘 오지 않죠? 다시 그래프로 돌아가봅시다


비용함수에서 쎄타0 값을 일반 상수로 놓고 Θ과 비용에 대한 그래프를 그려봅시다. 그러면 아래와 같이 볼록한 이차원 그래프가 만들어질겁니다(위 비용함수 그래프에서 특정 쎄타0를 축으로 자른다고 생각해보세요!)


여기서 노란 십자가는 현재 저희가 있는 지점입니다. 빨간 십자가 지점에 가까워 질수록 비용 값은 작아지겠죠? Gradient Descent 방법은 한번에 최적의 지점에 도달하진 못하지만 반복작업을 통해 최적의 지점에 도달 할 수 있게 해줍니다. 위의 수식을 1회 적용한 그래프는 아래와 같습니다.



비용함수를 쎄타에 대해서 미분한 값은 그 지점의 접선 기울기와 같습니다(고등학교때 다 배웠습니다) Gradient Descent 방법대로 기울기에 α값을 곱한 값을 기존 쎄타값에 빼주면 그래프는 최적점과 조금 더 가까워지게 됩니다. 이 방법을 여러번 반복하면 점점더 그래프가 최적점에 가까워지겠죠?


       


쎄타 0와 쎄타 1 각각에 대해서 위 작업을 반복하면 최적의 선형 방정식을 구해 낼 수 있게됩니다. 단 여기서 주의해야 할 점이 있습니다. Learning Rate라 말씀드린 α값을 어떻게 정하느냐에 따라서 학습 속도 및 성공의 유무가 결정됩니다. 만약 이 값이 너무 크거나 혹은 너무 작으면 어떻게 될까요?



왼쪽 그림은 α값이 너무 큰 경우에 해당합니다. 이때는 기존 쎄타 값이 너무 급격하게 변해 오히려 비용함수의 값이 더 증가하는 방향으로 움직이고 있네요. 이런 경우는 차라리 안하느니만 못합니다.


오른쪽그림은 α값이 너무 작은 경우입니다. 이때는 비용함수의 값이 감소하는 방향으로 이동하는데 이동하는 크기가 너무 느립니다. 한 두번이면 되는 학습 횟수를 몇배 더 해야하니 학습에 소요되는 시간이 오래 걸리게 됩니다. 그래도 비용함수가 증가하는 방향은 아니니 시간이 많다면 충분히 최적점에 도달 할 수 있겠네요


적당한 Learning Rate 값을 세팅하고 두 쎄타값을 구해내는 과정이 Linear Regression입니다. 생각보다 복잡한 수학 지식이 적용되진 않았지요? 고등학교 수학 + 편미분 만 알고 있으면 충분히 따라 갈 수 있을 정도입니다. 앞으로 배울 Logistic Regression도 이와 큰 차이는 없습니다! 다음 포스팅에선 이거랑 비슷한 Logistic Regression에 대해서 배워보도록 합시다

'컴퓨터공부 > 인공지능' 카테고리의 다른 글

뉴럴네트워크(Neural Network)  (0) 2017.08.18
오버피팅(Overfitting)  (0) 2017.08.10
숫자인식 코드 분석해보기  (2) 2017.08.03
Softmax와 Cross entropy  (0) 2017.08.03
Logistic Regression (로지스틱 회귀)  (0) 2017.07.31
Linear Regression (선형회귀)  (0) 2017.07.28

tensorflow 설치하면서 인공지능을 정의해보자

2017.07.20 21:55 Posted by 아는 개발자 아는 개발자

인공지능이 정확히 무엇인지 생각해보기에 앞서서 Ubuntu 터미널에 tensorflow 설치 명령어 하나만 실행해둡시다.

(혹시 GPU를 사용하는 버전으로 설치하고 싶으신 분은 tensorflow 사이트에서 확인해보시고 설치하셔야 합니다!)


sudo pip install --upgrade tensorflow


인터넷 사양에 따라서 20-30분 정도 걸립니다. 딱 인공지능에 대해서 정의 해보기 좋은 시간이네요. 그럼 시작해볼까요?


지금 우리에게 가장 익숙한 인공지능은 알파고입니다. 알파고는 엄청난 양의 기보를 학습한 후에 어떤 위치에 수를 놓으면 유리한지를 알게 됐습니다. 자 그렇다면 인공지능은 결국 대량의 데이터를 학습한 결과물 이라고 손쉽게 정의해볼 수 있을 것 같습니다.


그런데 대량의 데이터라면 어떤 단어가 떠오르지 않으세요? 2-3년전만해도 이 단어가 뉴스를 휩쓸고 다녔습니다. 바로 "빅데이터"입니다. 대량의 데이터를 축적한 기업 또는 연구소가 이 데이터를 분석해 사용자에게 유용한 정보를 제공하기 위해 여러가지 연구를 진행하곤 했었죠. 이런 데이터 분석 덕분에 쇼핑몰에서는 특정 나이대의 소비자들이 어떤 상품을 선호하는지, 정부 연구소에서는 사회 취약층의 소득 구조를 좀더 잘 파악하게 됐습니다. 이것 역시 대량의 데이터 덕분입니다.


인공지능은 대량의 데이터를 학습했고 빅데이터는 분석했습니다. 학습과 분석. 사실 이렇게 개념으로 표현해서 달라 보이는 것이지 데이터를 이용했다는 사실 만큼은 둘다 동일합니다. 데이터를 사용한 사실 하나만 놓고 보면 둘 간의 경계가 매우 모호한것 같습니다.


 

(인공지능과 빅데이터 모두 대량의 데이터를 사용한다는 점은 다를 것이 없어 보입니다)


하지만 둘 사이에 예측이란 단어를 놓으면 차이는 확연히 구분됩니다. 빅 데이터는 (물론 분야마다 다르긴 합니다만)예측을 하지 않습니다. 빅데이터는 어질러진(unstructured) 데이터들을 분석하기 좋게 정리정돈을 잘 한 후 여기서 유용한 정보(useful information)를 추출하는 것이 목표입니다. 이와 달리 인공지능은 잘 정돈된 데이터(structured)를 여러 알고리즘을 통해 학습 한 후 가장 그럴듯한 미래를 예측합니다. 알파고로 예를 들면 기보는 학습에 사용된 잘 정돈된 데이터 였고 알파고가 이세돌을 상대로 놓았던 수들은 승리하기 가장 유리한 예측 들이었습니다. 


자 그러면 이제 인공지능을 정의 해볼 수 있겠습니다. 인공지능은 '대량의 데이터를 학습해 가장 그럴듯한 미래를 예측한다'. 엄청 거창한 것이 나올 줄 알았는데 의외로 간단하지요? 정의를 아래의 그림처럼 표현해 볼 수 있습니다


(잘 정돈된 데이터를 학습한 모델은 미래를 예측 할 수 있습니다)


여기서 모델은 잘 정돈된 데이터를 학습한 결과물입니다. Test Data를 모델에 입력하면 가장 그럴 듯한 예측을 하는 것을 말하지요. 머신러닝의 성능은 얼마나 예측을 잘하는 모델을 잘 만드느냐에 달렸고 이 모델은 얼마나 풍부한 데이터를 갖고 있느냐 그리고 얼마나 우수한 학습 알고리즘을 사용하고 있느냐에 달려있습니다. 많은 인공지능 연구자들이 좋은 학습 알고리즘을 만드는데 시간을 많이 투자했고 가장 간단한 선형 회귀(Linear Regression) 부터 알파고에 적용된 딥러닝(Deep Learning)까지 만들어진 상태입니다.


이제 우리가 공부할 부분도 명확해졌습니다. 우리는 인공지능에서 학습 알고리즘을 공부해볼 것입니다. 가장 기초적인 선형회귀에서부터 뉴럴네트워크까지 차근차근 밟아볼까요?

개발자는 이제 인공지능을 공부해야 합니다.

2017.07.17 23:13 Posted by 아는 개발자 아는 개발자

2016년 3월 이세돌과 알파고의 대결이 시작되기 전까지만해도 알파고의 승리를 점치는 사람은 거의 없었습니다. 경우의 수가 제한된 장기나 체스에 비해 바둑은 수가 거의 무한에 가까워 현재 컴퓨팅 능력으로는 기계가 이 모든 경우의 수를 계산하기는 무리라는 것이 대부분 바둑계 전문가들의 생각이었지요. 하지만 모두의 예상을 뒤엎고 알파고는 10년간 세계를 평정했던 이세돌을 4:1로 제압합니다. 그리고 올해 한층 더 진화된 알파고는 현 인간계 바둑랭킹 1위 커제를 상대로 단 한판도 내주지 않고 우승합니다. 알파고의 기세를 보니 당분간(어쩌면 평생) 이 기계를 이길 수 있는 인간은 나오지 않을 것 같습니다.



(알파고를 상대로 거둔 이세돌의 1승은 인류의 마지막 승리가 될 것이라고 합니다)


바둑 경기가 시작되기 전만 해도 우리는 인공지능이 아주 먼 미래라 생각했었습니다. 사실 컴퓨터 전공생들이라면 배우는 컴퓨터 역사에서도 인공지능 기술은 잠깐 번쩍하고 말던 기술이었습니다. 매번 역사속에 등장 할 때마다 이론은 출중하나 하드웨어 성능 문제로 빛을 보지 못했었죠. 그런데 이번에 다시 등장한 인공지능의 기세는 심상치 않습니다. 초기엔 단순한 노무작업 정도만 할 것이라 예상했는데 요즘의 인공지능은 간단한 스포츠 기사도 쓰고 스스로 광고도 만들기 시작했습니다. 그뿐만이 아닙니다. 창의성의 영역이라 여겨지는 예술에도 침투하기 시작했습니다. 다량의 예술 작품을 학습한 인공지능은 직접 그림을 그리기도 하고 단편 소설을 쓰기도 합니다. 인공지능이 만든 작품 중 몇몇은 저같은 일반인들은 전혀 구분 하지 못할 정도로 고퀄로 보이는 작품들도 있습니다.


(유명 예술가의 화풍을 학습한 인공지능의 작품입니다. 놀랍지 않나요?)


일반인들도 놀라우시겠지만 저처럼 인공지능 관련 일에 종사하고 있지 않는 개발자들은 더더욱 놀랍습니다. 중앙처리장치와 메모리의 성능이 좋아지면서 컴퓨터 산업 전반의 발전이 있을 것이라고 예상은 했습니다만 이정도일 줄은 몰랐습니다. 그리고 놀람과 동시에 두려움도 엄습합니다. 인공지능 시장이 확장하면 할 수록 들러리였던 영역은 더더욱 들러리가 될 확률이 매우 높아졌습니다. 대학시절 저를 감동시켰던 운영체제는 역사가 오래된 만큼 관련 연구도 완료된 상태이고 관련 문제들의 솔루션도 모두 만들어 졌습니다. 앞으로는 더 좋은 페이지 할당 알고리즘이나 더 훌륭한 스케줄링을 만든다고 해도 좋은 논문거리는 되지 못할 것입니다. 이 영역 종사자들이 아마 앞으로 해야할 일은 아마 과거에 이뤄왔던 연구들을 잘 조합하는 것에 불과 할지도 모릅니다. 원가 절감이라는 획기적인 아이디어를 들고 나온 가상화 기술도 Docker가 등장하면서 클라우드 컴퓨팅에서 한물 간 기술이 되버렸습니다. 더이상 발전할 요소가 없다, 한물 간 기술이 되었다는 말은 곧 그 기술을 파고 들었던 개발자의 밥줄이 끊긴다는 말과 같습니다.


(운영체제는 연구가 오래 됐고 Docker가 등장하며 가상화 기술은 한물간 기술이 됐습니다)


우리 모두 역사의 흐름을 무시한 나머지 굶주림을 면치 못했던 조선 후기 양반들과 같은 실수를 하고 싶어하진 않을 것입니다. 남들이 알아주지 않는 분야를 파고든 예술가는 역사책에 이름을 남기지만 남들이 알아주지 않는 기술을 파고든 개발자는 이름 남길 곳이 깃로그 밖에 없습니다. 한물간 기술을 부여잡고 수요가 생기길 기다리는 것은 본인 뿐만 아니라 가족까지 굶이기 딱 좋은 행동입니다. 그렇게 되지 않으려면 개발자들은 시대의 기술 트렌드를 읽고 팔로우 해야합니다. 거의 3-4년을 주기로 트렌드 기술이 있었고 이번에는 인공지능 기술이 트렌드가 됐지요. 그런데 지금까지 나왔던 기술들과 다르게 인공지능의 진입장벽이 높아보입니다. 수식이 난무한 이론도 따라기 벅찰 것 같은데 저걸 다 일일히 코딩하자니 언제쯤 구현을 해볼 수 있을지 가늠이 되지 않습니다.


(분명 공학수학을 수료한 것 같은데 뭔소린지 통 모르겠네요, 하하하)


이런 고민을 하는 개발자를 위해 구글은 올해 4월에 인공지능용 라이브러리 tensorflow 를 공개했습니다. 이건 python으로 짠 인공지능 개발 툴입니다. 학습에 쓸 데이터와 기본적인 인공지능 이론을 갖춘 개발자는 tensorflow에서 제공하는 함수를 이용해 (손쉽게)AI를 만들수 있게 됐습니다. 휴 한시름 덜었습니다. 저런걸 일일히 다 코딩하자니 앞이 깜깜했는데 이미 툴은 다 마련되어 있었다니 천만 다행입니다.





그래도 여전히 첩첩 산중인것 같습니다. 결론적으로는 tensorflow가 있어도 이론을 공부해야하고 위의 수식도 언젠간 배워야 한다는 말이지 않습니까? 얼른 알파고 같은걸 만들어내야 할 것 같은데 마음만 초조하고 뭐부터 시작해야 할지는 모르겠습니다. 대학시절에 인공지능 강의를 하나도 수강하지 않았던 것이 후회되기 시작합니다. 야간대학 속성 강좌라도 등록해야 할 것 같기도 합니다. 하지만 굳이 대학까지 갈 필요는 없습니다. 이미 코세라에 인공지능 개발시 필요한 기초적인 머신러닝 강의가 마련되어 있고 tensorflow 튜토리얼에서도 논문까지 첨부해주면서 설명해줍니다. 다행히 공부할 자료는 인터넷에 널려 있습니다. 우린 이걸 잘 활용해야 합니다.


물론 강의 내용이 쉽지 않고 논문이 술술 읽히지는 않습니다. 하지만 현재 무모하게 트랙을 밟아보고 있는 사람으로서 해볼만 하다고는 생각합니다. 100%까진 아니어도 '이것을 어떻게 쓰면 좋겠다'고 감 정도는 잡아본것 같습니다. 앞으로 저의 매거진에선 인공지능 지식이 전무한 개발자가 코세라 강의와 tensorflow로 공부한 내용을 공유해보려고 합니다. 영어와 수식이 난무한 인공지능에서 엑기스만 뽑아내 저와 같은 개발자들이 쉽게 인공지능을 접할 수 있는 글을 쓰도록 하겠습니다.