*강의 다 볼 때 까지 지속갱신 문서
한동안 휴가를 잘 즐기고서, 다시금 개념어나 동향에 대한 공부를 하고 싶어졌다.
그렇게 Youtube에서 찾은 강의가 SKtechx Tacademy의 "딥러닝을 활용한 자연어 처리 기술 실습".
(사족이지만, 예전에 T academy 신청했을 때 거절 당해서 볼 때마다 마음이 씁슬... ㅜㅜ)
강사이신 정상근 박사님은 이전에 다른 딥러닝 오프라인 강좌에서도 뵌 적이 있다. 무척 설명을 깔끔하고 알아듣기 편하게 하시는 분.
초반에는 이해도 못하면서 억지로 많이 들어서 익숙한 내용들이었는데, 잘 정리된 설명으로 들으니 중간중간 빠진게 채워졌다.
[모두를 위한 인공지능 블로그]
아래링크인 강사 분의 "모두를 위한 인공지능"이란 블로그에 해당 강의 자료들이 올라와있다.
http://hugman.re.kr/
[1강]
https://www.youtube.com/watch?v=F8b0jGyZ_W8
Summaray
1. Classification Problem Settings
2. Learning Problem
- Reference Representation [One-Hot Representation]
- Scoring Normalization [Softmax]
- Cost Function Design [Cross-Entropy]
- Parameter update [ Back-propagation]
3. Linear & Non-Linear
- Activation Functions
Neural Network 계산식은 Weighted Sum.
모델을 학습한다 = weight값을 찾아냄
Score의 의미는?
- 상대적인 우월 정도만 보여주는 relative score
- 모르는 것에 대해 모른다고 이야기 할 수 없는 구조: 즉, 어떻게든 설정한 4가지 class 안에 규정하는 것
정답 데이터 표현 방법 (http://hugman.re.kr/blog/ref_design/)
- One-Hot Representation: 표현하고자하는 class만 1.0이고, 나머지는 모두 0.0으로 표현하는 방법.
ex.
- 긍정(Positive) = [1,0,0,0]
- 부정(Negative) = [0,1,0,0]
- 중립(Neutral) = [0,0,1,0]
- 객관(Objective)=[0,0,0,1]
- 각기 다른 스코어(무한대)의 score를 비교하기 위해서는 맞춰야함.
- Softmax function은 0.0~1.0의 값으로 score를 맞춰주기 위한 함수.
- 예측과 정답을 비교하는 measure가 필요함. 비교하면 얼마나 classifier가 틀렸는지 알 수 있음.
- 손실값 계산 즉 cost function을 만들어도 됨.
- 이처럼 확률분포 2개가 있을 때, 확률분포 간에 다름을 측정하는 여러 방법 중 cross entropy 방식이 깔끔함.
-여기서 미분을 취해서, 미분이 작아지는 방향으로 학습하겠다 -> Gradient Descent
global minimum, 혹은 local minimum.
(Gradient Descent의 문제점: 운이 좋으면 global이겠지만, 잘못된 위치에서 시작하면 local에서 맴돌 가능성을 배제할 수 없음.)
2차원으로 따지자면 선을 다시 한번 새로 긋는 것.
다차원으로 가도 parameter w를 정하는 것.
모든 점을 설명하는 직선 하나를 정할 때, 몇개의 점을 보고서 정할 것인지를 batch size라고 함.
(ex. batch size=3, 3개의 점을 보고 직선을 정한다.)
전문가들은 50~128 사이에서 많이 쓰지만, 정답은 없음. 경험에 맞춰서, 데이터수, 클래스에 따라서 size를 정함.
이 사진은 항상 자주 나오던 문제라 ㅋㅋㅋㅋ 스킵.
선형으로만 이루어진 layer는 1개의 선일 뿐.
deep neural network layer를 쌓기 위해서는 Non-linear combination으로 해야함.
이와같은 Non-linear, 즉 Activation Function은 여러개가 있음.
대표적인 함수는 Sigmoid, tanh, ReLU. 공통점은 미분이 된다는 것. (미분이 안될 경우, back propagation을 못함)
[2강]
https://www.youtube.com/watch?v=MNq9_XBQqms
Sequence To Sequence Learning
*정의: 일련의 데이터가 순서를 가지고 들어옴. 그것과 대응하는 혹은 관련을 가지는 또다른 차원의 데이터가 순서를 가지고 들어옴.
그랬을 때 두 데이터의 사이의 연관성 혹은 관계를 알아서 학습할 수 있는 방법론이 있다면, 이를 Sequence to sequence라고 부르자는 것.
Sequence 데이터가 들어왔을때 (즉 Sequence가 feeding 되었을 때),
Sequence를 Generation하는 문제로 풀 수 있음
아래의 Sequence를 N, 위를 M이라 했을 때, 그 수는 같을 수도(대응 N=M) 다를 수도(비대응 N≠M) 있다.
이와 같은 문제의 예는 수도 없이 많음.
대표적인 자연어처리 문제인 형태소 분석기도 Sequence to sequence 문제.
수학문제, Machine Translation 등등
S2S Deep Learning Approach
1) 여러번(독립적으로) Prediction
과거의 방식은 단순히 N번(여러번) 진행함.
2) 여러번(독립적으로) Prediction+Convolution Idea
더 나아가, 주변 값을 참고하며 진행하도록 함.
3) Sequence Modeling
기억: 과거의 어떤 것(ex. 행위)이 현재에 영향을 미치는 것
그림의 빨간선 = 기억
(내가 어떤 결정을 내릴 때, 결정을 내린 이유는 과거에 어떤 이유가 있기 때문.
그 이유에 의해서 행위를 하게 되고, 자연스럽게 내가 내린 행위가 다음번 행위에 영향을 미친다.)
결과물이 다음번의 입력으로 다시 들어오기에 recurrent neural network라고 부름
Recurrent Neural Network의 메모리 능력 때문에 많은 application을 풀 수 있음.
그러나 한계점이 존재.
1) x1에서 온 정보 - 즉 숫자가 x4까지 곱하기 등의 연산으로 이어려면 멀기 때문에 x1의 데이터가 제대로 전달이 안될 수 있음.
2) x1에서 좋은 정보가 전달 되다가, x3에서 (너무 크던지 너무 작던지) 이상한 값이 들어오게 될 경우, 값이 극심하게 손상 될 수 있음.
basic RNN은 학습이 잘 안된다는 한계에 부딛힘. 이를 극복한 아이디어가 1980년대에 이미 나왔음.
그 중 하나인 LSTM은 전체적인 RNN의 구조를 가지나, Memory Cell에 3가지 gate(정보를 한번 더 가공 - 기억할 건지 버릴건지 등)를 설정함.
cell마다 데이터를 통해 gate를 학습하기 때문에, 학습 시 시간이 오래걸린다는 단점이 존재함.
GRU(Gated Recurrent Unit)은 LSTM에서 계산 수식을 하나 줄임으로 조금 더 가볍다는 특징을 가짐.
대표적인 N to N 문제
인공지능 혹은 머신러닝이라는 이름으로 우리가 하는 행위들을 큰 틀에서 살펴보면 결국 "주어진 상황에 맞는 적절한 대답"을 구하는 것입니다.
예를 들어, 얼굴인식같은 인공지능 문제라면 주어진 상황은 '이미지' 일 것이고, 적절한 대답은 얼굴인식 후보중 하나가 되겠지요
자연어 처리도 마찬가지입니다. 번역같은 복잡한 문제도, 결국 '주어진 문장'을 적절히 가공해서 '번역된 문장'으로 바꾸는 일일 뿐입니다.
다시 말해 우리가 하는 일은 가장 높은 수준으로 추상화해보면 "데이터의 변형" 이라고 할 수 있습니다. 제가 바라보는 인공지능 또는 머신러닝은 "Data Transformation" 입니다. 이를 잘 할 수 있고, 풀고자 하는 문제에 적합한 도구를 찾는 것이 중요한 문제입니다.
그리고 현재 시점에서는 Deep Neural Network 이 가장 직관적이면서도 범용적인 도구입니다.
직관적이라는 것은 데이터의 변형과정이 모델의 설계 과정과 거의 동일하게 설계될 수 있습니다. 아래 그림으로 예를 들어보겠습니다.
위 그림 처럼 이미지 인식 문제는
- 입력 : 100 x 100 pixel data
- 출력 : 100 image class
의 데이터 변형을 다루는 문제입니다. DNN 에서는 이를 아주 직관적으로 다룹니다. 입력에서의 pixel 하나 하나를 실수값 하나로 모델링 합니다. 즉 입력의 차원수 혹은 데이터 사이즈가 10000개가 되게 됩니다. 출력은 100개가 되게되죠. 이것을 다루는 네트웍을 추상화하면 아래 그림처럼됩니다.
정말 직관적이죠? 앞으로 다루게 될 DNN 의 주요 network 들(RNN, CNN, Attention, ....)도 먼가 대단하거나 엄청난 것들이 아니라, 데이터 변형을 하는데 있어서 자주 사용되거나 효과적인 변형 Pattern을 naming 한 것들입니다.
범용적이라는 것은 DNN 의 방법론이 결국 Tensor (숫자의 나열) 에 기반하기 때문에, 어떤 영역의 문제든지 '숫자'로만 바뀌어서 입력/출력이 모델링되게 되면, 그 풀이방법은 동일하다는 것입니다. 즉 이미지든, 자연어든, 음성문제든, 혹은 공장데이터 처리 문제든, 바둑문제든 어떤 문제에도 사용할 수 있는 범용성을 DNN 이 가지고 있다는 것입니다.
앞으로 제가 올릴 글들은 데이터변형으로서의 인공지능을 어떻게 풀어나갈 것인가의 관점에서 다루겠습니다.
다시한번 강조하자면, 딥러닝은 결국 아래의 2가지를 하는 것입니다.
- 표현학습
- 데이터 변형
결국 Data transform 관점에서 몇단계를 더 거치냐의 차이일 뿐, 둘 다 같음
Sequence Encoding
RNN도 다양한 변형이 가능하다.
*RNN의 input/output
1) input 데이터에 대응하는 output 데이터를 만들어 낼 수 있음
2) input 데이터를 temporal한 정보를 반영하여 요약할 수 있음
[3강]
https://www.youtube.com/watch?v=I7JpGYK3Y-Y
플레이스홀더에 대해서 알아보면, 플레이스 홀더의 위의 그래프에서 x 즉 입력값을 저장하는 일종의 통(버킷)이다.
tf.placeholder(dtype,shape,name)
으로 정의된다.
플레이스 홀더 정의에 사용되는 변수들을 보면
dtype : 플레이스홀더에 저장되는 데이타형이다. tf.float32와 같이 실수,정수등의 데이타 타입을 정의한다.
shape : 행렬의 차원을 정의한다. shapre=[3,3]으로 정의해주면, 이 플레이스홀더는 3x3 행렬을 저장하게 된다.
name : name은 이 플레이스 홀더의 이름을 정의한다. name에 대해서는 나중에 좀 더 자세하게 설명하도록 하겠다.)
[4강]
https://www.youtube.com/watch?v=2QzwIThP8pw
'Dev > Etc' 카테고리의 다른 글
어떻게든 Django 시작하기 (찾은 자료 순서대로) (0) | 2018.05.04 |
---|---|
[코딩하는 기계] Django 튜토리얼 (0) | 2018.05.03 |
Django 개발을 위한 IntelliJ 환경설치 (0) | 2018.05.02 |
모두를 위한 딥러닝 강좌 시즌 1 (0) | 2018.04.23 |
[Python 설치 - pip, numpy] (0) | 2016.03.30 |