728x90

 

 여기서 재미있는 점은 순환 신경망 언어 모델을 학습시키는데 사용한 데이터에 따라서 사용한 데이터의 특성을 갖는 텍스트가 생성된다는 점이다. 예를 들어서 셰익스피어 전체 작품을 텍스트 파일로 다운 받으면 아주 긴 문자 시퀀스가 될건데, 셰익스피어 전체 작품으로 순환 신경망을 학습할수 있고, 그러면 어떤 문자들이 주어질때 다음에 올 단어가 어떤게 올지 예측하도록 시도해볼수 있겠다.

 

 순환 신경망을 학습 시키킴으로서 목표는 세익 스피어의 전체 작품을 참고해서 다음에 올 단어가 어떤것인지 예측하기 위한것이다보니, 

 

 이 데이터를 학습시키고나면 훈련된 모델로부터 예측한 단어를 얻을 수가 있으나 첫 몇 반복만으로는 잘 동작하다고 보기 어려운 결과가 나온다. 여기서 동작하는 과정은 신경망으로 다음에 올 단어를 구하고, 이 단어를 다음의 입력으로 사용하고, 이 과정을 반복하여 위의 새로운 데이터를 생성시켰다.

 

 하지만 첫 번째로 생성한 것은 학습이 충분히 길게 수행되지 않아서 텍스트의 구조를 파악하기전이다보니 가중치가 보다 고르게 되있지 않아 쓰래기 값들이 만들어 졌다. 

 

 이걸 조금 더 길게 학습을 시키면 텍스트 구조를 인지하기 시작하여, 단어 같은 것들이 만들어지고, 이 단어들 사이에 스페이스도 들어가고, 어떤 경우에는 따옴표가 들어가도록 생성하게 되었다.하지만 여전히 쓰래기값이 존재하는게 보인다.

 

 여기서 더 학습을 시키면, 이제 문장이라고 볼수 있는 것들이 만들어지는데 aftair fall, unsuch 같이 스펠링 오류들이 존재 한다. 이게 뭔가를 설명하는것 같긴하지만 여기서 더 길게 학습시킨다면 더 좋고, 현실적인 텍스트가 만들어 진다.

 

 

 "why do what that day," replied natasha and wishing  to himself the fact the princess mary was eaiser ... 라는 텍스트가 생성되었는데, 문법은 완벽하지는 않지만 실제 영어 문장 처럼 만들어 졌다. 

 

 그리고 여기서 아주 오래, 더 긴 시퀀스로 학습을 시키면 훨씬 셰익스피어가 쓴것 같은 텍스트를 만들수가 있다. 위 슬라이드와 같이 대본이 만들어진것을 볼수 있는데, 

"pandarus : alas, i think he shall be come approached in the day with little strain would be attain'd into being never fed' and who is but a chan and subjects of his death, i should not sleep "

 훨씬 극적이고, 셰익스피어가 쓴것 처럼 만들어 졌다. 하지만 여전히 횡설수설하고 있다. 여기서 더나아가서 다른 타입의 데이터로 학습을 해나갈수도 있겠고, 이건 셰익스피어의 작품 전체만 사용한게 되겠다.

 

 몇년 전에 이와 비슷한 일을 했었는데, 추상 대수 abstract algebra 과정이나 대수 기하학 algebraic geometry과정을 수강한 사람이라면 그 과목들이 수학의 추상화 부분을 다루는 것으로 알고 있을텐데 이 대수 기하학에 대한 오픈 소스 책이 만들어졌으며 이 책은 수천 페이지의 저차 기술들이 정리되어 있다.

 

 (교수님이) 여기서 한 작업은 수천 페이지 짜리의 대수 기하학 책의 소스 코드를 다운받아서, 순환 신경망에다가 이책 소스코드 수백개 문자를 입력으로 주어 다음 라텍스 소스코드의 문자를 생성하도록 신경망을 학습시켰다. 그러면 학습된 순환 신경망으로 가짜 수학공식을 만들수 있었으나 불행히도 컴파일 할수는 없었다.

 

 그래서 문법을 정확히 따르는 저 수준 소스 코드를 생성하기 어렵더라도 발생되는 컴파일 에러는 수동으로 고쳐질수 있고, 컴파일을 시켜볼수 있겠다.

 위 슬라이드는 순환 신경망으로 대수 기하학 교제를 학습해서 생성한 텍스트의 예시를 보여주고 있다. 이 내용들은 추상 수학같은 것으로 보조 정의 lemma들이 있고, 증명 proof들이 있으며, 증명 끝에 소괄호로 증명을 마무리하려고 하는데, 이걸로는 증명이 된건지 안된건지도 모르겠고, 실제 수학 교재라고 하기에는 잘못된점이 많겠다. 이 증명들을 정리하고, 이해하려면 참고 서적들을 살펴봐야 되겠다.

  대수 기하학에 대해서 조금 더 살펴보면 여기에 가환 다이어그램 commutative diagram을 볼수가 있는데, 이 그림은 수학적 공간 사이에서의 관계를 보여주고 있으며 저레벨 소스코드로 생성되었다. 그래서 이건 순환 신경망이 증명을 설명하기 위해서 가환 그림을 생성시킨것이라고 할 수 있겠다. 이 페이지에서 다루고 싶은 부분 중 하나는 보통 수학 책에서 자주 보는 증명이 생략되었다.

 

 

 

 정리하면 이런 문자 수준의 순환 신경망 언어 모델은 우리가 사용하고자 생각하는 어떤 종류의 데이터로도 학습할수 있으며, 리눅스 커널 전체 소스 코드를 다운받아서 순환 신경망 언어 모델을 학습시켜서, 리눅스 커널의 C 소스코드를 만들어 낼수가 잇다.

 

 이게 생성시킨 C 소스코드의 예시인데, 제대로 보지 않으면 꽤 실제 커널 C 소스코드처럼 보인다. 내용을 보면 괄호도 있고, static, void, 포인터, 왼쪽 시프트 등 같은것들있고, 주석을 보면 Free our user pages pointer to place camera if all dash라고 말이 안되지는 않지만 주석이 추가되긴 한걸 볼수 있겠다.

 

 

 이번 예시에서는 C 파일의 맨 위에 카피라이트가 작성되어있는데, 이는 C 소스코드 파일의 구조를 알고 있다고 볼수 있겠다. 카피 라이트 내용 이후에는 include 들이 있고,

 

 매크로도 정의되고, 상수도 정의되고 그 이후에 함수가 정의되고 있다.

 

 

 다음에 올 문자를 예측하는건 꽤 간단한 작업이기는 하지만 순환 신경망이 복잡한 리눅스 커널 C 소스 코드로부터 많은 구조들을 캡처했다고 할수 있겠다. 이 과정이 어떻게 이뤄지는지 궁금할수 있겠는데,

 이게 데이터를 학습하는 중간에 순환 신경망을 표현한것으로, carpathia johson과 feifei가 몇년전에 투고한 논문의 것인데 순환 신경망을 다른 타입의 시퀀스 데이터로 학습시킬때, 순환 신경망 언어 모델이 무엇을 학습중인지 이해를 하려고 했었다.

 

 여기서 사용하는 방법론은 순환신경망을 가지고와서 시간 스탭에 따라 풀어나가고, 다음에 올 문자를 예측시킨다. 다음 단어 예측 처리 과정에서 순환 신경망은 은닉 상태 시퀀스가 생성이되는데, 입력의 문자 하나당 하나의 은닉 상태이며, 이 은닉 상태들/시퀀스로 출력/문자를 만든다.

 

 여러 차원의 은닉 상태를 캡처해서 뭘 할수 있을까? 예를 들어 은닉 상태가 56 차원이라 하고 tanh 함수의 출력을 사용한다면, 은닉 상태 벡터의 각 원소는 -1 ~ 1사이의 값이 되겠다. 56개의 원소를 가진다는 이점을 가지고, 은닉 상태의 값 0 ~ 1에 따라서 색상을주면, 신경망의 처리과정에서 

 

 

300x250
728x90

 최근 딥러닝 공부를 하면서 합성곱 신경망에 대한 전반적인 이론들을 살펴보았고, 최근 자연어 처리를 위한 순환 신경망에 대해서 정리해보고 있다. 하지만 합성곱 신경망의 경우에는 예전부터 조금씩 본적이 있었지만, 순환 신경망의 경우 합성곱 신경망 만큼 친숙한 개념이 아니어선지 생각보다 진도 나가기가 너무 힘들더라.

 

 분명 지지난주 신경망 학습 방법들에 대해서 정리할때 까지만 해도 지금 보다는 의역이 잘 되는 편이었는데, 여기서 설명하는 로직이 잘 이해가 되지 않아서인가 의역이 제대로 되지도 않고 진행 속도가 크게 느려졌다. 그나마 다행인 점은 그동안 너무 하기 싫고 힘들었던 순환 신경망이 많이 늦어지기는 했지만 조금씩 조금씩 본 덕에 조금은 이해는 됬고, 정리하는 속도도 아주 약간은 빨라진것 같다.

 

 하지만 이 부분에서 전에 진행하던 속도보나 너무 늦춰지다보니 시간을 너무 많이 지체해버리긴 했다. 다른 공부도 같이 병행을 하기는 해야하지만. 지금 딥러닝 이론에 나오는 내용들이 다양한 논문들에 나온 방법들을 정리한 것이기도 하고, 그렇다고 딥러닝 실습을 하자니 이런 내용을 이해하지 않고서는 왜 딥러닝 프레임워크로 신경망 모델링을 그런식으로 하는지 알수가 없으니 이 부분은 짚고 넘어갈수 밖에 없다고 생각한다.

 

 한 강의만 가지고 몇일, 한두주씩 시간을 낭비해버리고 있으면서 차라리 다른 사람이 정리한걸 참고하면 되지 않나 생각도 들기는 하지만 괜한 고집 때문인지, 혼자서 이걸 해내고 싶어선지 남의 것을 보고 넘어가고 싶지는 않다. 분명 내것 보다 훨씬 정리 잘한 사람도 많기는 하지만, 내가 억지로 붙들고 이해하려고해서 살펴본것과 남이 이쁘게 정리한걸 보는것과 공부하는데서 느낌도 다르고..

 

 과하게 시간을 낭비하는것 같긴한데, 아닐수도 있고 마음 먹기 나름인 문제이긴 하지만 너무 편한 환경에 놓은게 가장 큰 것 같다.

 

 

300x250
728x90

 

지금까지 시퀀스 투 시퀀스 모델에 대해서 살펴보았고, 이번에 어떻게 동작하는지 구체적인 예시로 언어 모델 language model에 대해서 살펴보자. 기본적으로 무한한 입력 데이터 스트림, 그러니까 데이터 길이 제한없이 입력을 받아서, 매 시점마다 다음에 올 문자를 예측하는 순환 신경망 모델을 만든다고 할때 이 모델을 언어 모델이라고 부른다.

 

 언어 모델을 다룰때는 기본적으로 고정 크기의 단어 집합을 가지고 있으며, 지금 우리가 다루는 경우에 단어 사전은 h, e, l, o로 이루어져 있으며 훈련 과정에서 사용하여야 한다. 오른쪽 그림을 보면 훈련 시퀀스로 "hello"라는 말을 처리하고자 하는경우인데, 이 입력 시퀀스의 각 문자들을 단어 사전 만큼의 길이를 가지는 원핫 인코딩 벡터로 변환시켜서 사용할 수 있다.

 

 단어 사전 h, e, l, o와 사전의 길이를 알고 있고, 문자 h를 벡터로 바꾸고자 하는 경우 [1 0 0 0]이 되며, 이는 단어 사전의 첫번째 원소가 h를 나타내기 때문이다. 이 입력 시퀀스/원핫 인코딩 벡터를 순환 신경망에 입력으로 넣을수가 있겠다.

 

 그래서 입력 벡터들의 시퀀스를 순환 신경망에 넣어서 은닉 상태들의 시퀀스를 구할수 있고, 

-> 원 핫 인코딩 벡터로 해당 타임 스탭의 은닉 상태를 구한다.

 그리고 이 순환 신경망이 다음 시퀀스 원소로 뭐가 올지 예측하는 작업을 하기 때문에, 매 타임 스탭마다 얻는 출력 행렬들로 단어 사전에 존재하는 각 원소들에 대한 분포를 예측하므로 그러니까 어떤 단어일 확률이 가장 높은지 찾아내는데 사용할수 있겠다. 

-> 매 타임 스탭마다 다음에 올 단어가 뭔지 예측한다.

 

 입력으로 시퀀스 첫번째 요소인 "h"를 받았을때, 다음에 올 원소/단어가 e여야 하는데 교차 엔트로피 비용을 사용한다.

 다음으로 "he"를 입력으로 받은경우, 다음 단어가 세번째 단어로 "l"이 와야 하는것으로 예측해야 되겠다.

 

 

네번째 단어도 그렇게 진행해서

 전체 타겟 출력들 "ello"을 보면 타겟 입력 "hell"에서 한칸 이동한것과 동일한게 되겠다. 훈련된 언어 모델을 얻으면, 언어 모델은 학습하는 과정에서 입력 시퀀스를 주고, 출력은 입력 시퀀스를 시프트 시킨것과 같은 형태가 된다.

* 입력 : hell -> 출력 : ello

  그렇게 해서 매 타임스탭마다 다음 단어가 무엇이 올지 예측하도록 학습하게 된다. 일단 언어 모델을 학습해서 구하면, 꽤 다양한 일들을 할수 있겠는데, 학습 시킨 언어 모델로 새로운 텍스트를 만들어 낼수가 있다. 

 

 

 예를 들면 초기화 시드 토큰으로 문자 "h"를 주면, 순환 신경망이 주어진 초기화 시드 토큰에 따라 문자를 생성해내도록 한다고 할때 이게 처리 되는 과정은 일단 입력 토큰으로 "h"를 주자. 그러면 "h"에 대한 원 핫 인코딩이 한 층을 지나가면서 처리될것이고, 이 타임 스탭에서 다음 문자가 어떤게 올지 예측 확률 분포(softmax)를 얻을것이다. 

 

  이 모델은 다음 타임 스탭에 와야하는 단어에 대한 예측 분포를 가지므로, 이 분포로부터 다음 타임 스탭에 이 모델이 오는게 적합하다고 판단하는 단어를 구할수가 있겠다.

-> 출력 층에서 교차 엔트로피 비용이 나오고, 이 비용에 소프트 맥스를 취하여 예측 확률 분포를 구한다. 이 예측 확률 분포가 다음 타임 스탭에서 올 가능성이 높은 단어를 고를수가 있겠다.

* 다음 단어가 잘 오도록 학습 되야겠다.

 

 

이렇게 구한 문자를 가지고와서, 첫번째 타임 스탭의 출력이었던거를 다음 타임 스탭의 입력으로 사용하면 되겠다. 그래서 문자 e를 가지고 와서 다음 타임 스탭에 입력으로 넣고

 

 이 순환 신경망의 다른 계층을 통과하여 새로운 은닉 상태를 계산하고, 출력에 대한 예측 분포를 계산하여 다음 단어가 무엇이 오는지 예측 할 수  있겠다.

 

 이런 과정을 반복하게 되겠다. 학습된 언어 모델을 가지고 있으면 초기 토큰/단어을 가지고 그 다음으로 나올 가능성이 가장 큰 새 토큰/단어를 생성시킨다고 볼수 있다. 

 

 

 

 여기서 제대로 다루지 못한 부분이 있는데, 입력 시퀀스의 인코딩을 원 핫 벡터들의 집합이라고만 했다. 순환 신경망의 첫번째 계층에서 어떤 일들이 일어나는지 한번 살펴보자.

 

 바닐라 순환 신경망을 다시 떠올려보면, 입력 벡터가 주어지고 가중치 행렬을 곱한다고 했었다. 

 

 그런데 입력 벡터가 원 핫 인코딩이라면 한 슬롯만 1이고, 나머지 슬롯들은 전체가 0이 되버린다. 그러면 가중치 행렬과의 곱은 너무 단순해지는데, 원 핫 벡터와 가중치 행렬을 곱한 결과 벡터의 한 컬럼(w_11, w_21, w_31)만 추출해버리게 된다.

 

 

 이런 식으로 곱셈 연산을 구현하기 보다는 가중치 행렬의 행들을 더 효율적으로 추출할수 있도록 구현할수가 있는데, 가장 쉽게 사용하는 방법은 입력과 순환 신경망 사이에 임베딩 계층이라고 부르는 계층을 추가하는 방법이다.

 

 여기 보면 임베딩 계층이 추가되어 있는데, 입력 시퀀스는 원핫 벡터의 집합으로 인코딩 되고, 임베딩 계층은 원핫 벡터와 희소 행렬을 묵시적으로 곱연산을 수행한다. 그렇게 해서 임베딩 계층은 주어진 임베딩 행렬의 각 열들을 따로 따로 학습하게 된다. (처음엔 w11, w21, w31, 다음엔 w12, w22, w32, 다음엔 ... 이런 식으로 각 열들을 따로 학습)

* 단어 -> 임베딩 벡터(원핫 인코딩) -> 임베딩 벡터(원핫 인코딩)으로 임베딩 행렬(을 열로 분리해서) 학습.

 

 이게 순환 신경망에서 흔히 나타는 구조이며, 분리된 임베딩 계층을 가지고 이 분리된 임베딩 계층(열)은 은닉 상태를 계산하기 전과 원핫 벡터 사이에 위치한다. 

 

 

 

 그래서 지금까지 본 것들을 학습시키기 위해서, 순환 신경망 계산 그래프 예시를 살펴보았다. 순환 신경망을 학습하기 위해서 우선 본 건, 시간에 따라 펼쳐지는 계산 그래프가 필요하였으며, 매 타임 스탭/시점 마다 비용을 계산 후 전체 시퀀스 길이만큼 진행해서 하나의 비용으로 합해야 한다. 

 

 이 과정을 시간 흐름에 따른 역전파 backpropagation through time이라고 부르는데, 순전파를 하는 동안 시간도 흘러가고, 역전파를 하는 과정에서도 순전파에서 진행한대로 역으로 흘러가기 때문이다.

 

 

 이 시간 흐름에 따른 역전파에서의 문제는 아주 긴 시퀀스를 다뤄야 하는 경우로 학습 시켜야할 시퀀스가 몇백만개의 단어라면 계산 그래프로 수백만 타임 스탭에 풀어나가려면 아주 많은 메모리 공간이 필요할것이고 우리가 가진 GPU로는 학습하기 어려울 것이다.

 

 

 이런 이유로 순환 신경망을 학습하는 경우, 특히 아주아주 긴 시퀀스를 처리하는 순환 신경망 언어 모델을 학습하는경우 절단 시간 역전파 truncated back propagation through time이라고 하는 근사 알고리즘을 대안으로 사용한다.

 

 위 슬라이드에 이 방법에 대한 아이디어를 볼수 있는데, 무한개의 시퀀스를 다루는 신경망을 학습하고자하는 경우로 시퀀스의 일부를 첫 토큰으로 수샙가내 수백개를 가지고와서 그 시퀀스 일부만큼 신경망을 풀어나가겠다. 그리고 시퀀스의 첫 덩어리의 비용만 계산하고, 시퀀스 초기 덩어리 진행한 만큼 역전파를 하여 가중치를 갱신하며 초기 시퀀스 덩어리 맨 끝에서부터 은닉 층 값을 고쳐나가겠다.

 

 그 다음으로 시퀀스의 두번째 덩어리를 받아서 은닉 가중치들을 지나가는데, 이 가중치들은 첫번째 덩어리를 처리하고나서 수백개의 문자로 된 두번째된 시퀀스 덩어리를 풀어나가며 구한다.

 

 그리고 이렇게 다음으로 들어온 수백개의 문자 시퀀스를 풀어나가면서 두번째 덩어리에 대한 비용을 계산하고, 전체 시퀀스가 아니라 두 번째 시퀀스 덩어리만큼 역전파를 진행하겠다. 그리고 이 비용으로 각 가중치 행렬들의 그라디언트를 계산하여 가중치 행렬을 갱신시키고 다음 시퀀스 덩어리로 넘어간다.

 

 다음으로 진행을 하는데, 두번째 덩어리가 지나가면서 얻은 은닉상태로 순방향으로 세번째 시퀀스 덩어리를 풀어나가는데 사용하고, 시간 변화에 따른 절단 역전파를 해서 가중치는 갱신 되겠다.

 

 이 시간 변화에 따른 역전파 알고리즘이 하는 일은 기본적으로 은닉 정보를 계속 순방향으로 이동 시키면서 무한개의 시퀀스를 처리할수가 있으나, 시퀀스의 일부 덩어리만 가지고 역전파를하면서 GPU 메모리 공간 사용량을 크게 줄임으로서, 이 절삭 역전파 알고리즘 truncated back propagation으로 유한한 메모리 공간을 가지고 있더라도 무한개의 시퀀스를 순환 신경망에 학습 시키는게 가능하도록 만들었다.

 

 

(질문 1) 시간 변화에 따른 절삭 역전파 방법을 사용할때 어떻게 두번째 덩어리의 h0를 설정할까요.

 

 가지고 있는 최종 은닉 상태를 사용하겠다. 일단 첫번째 작업을 마치고 나서 첫번째 덩어리에 대한 최종 은닉 상태를 가지게 되는데, 이 은닉 상태가 두번째 덩어리에서 사용항 초기 은닉 상태가 되겠다. 은닉 상태를 통해서 정보를 시간에 따라 순방향으로 계속 전달하다보니 잠재적으로는 무한하게 처리할수 있겠다. 하지만 역전파는 시퀀스의 일부 덩어리만 가지고 한다.

 

 

(질문 2) 절삭 역전파 알고리즘 수행하는 동안 가중치 갱신이 어떻게 되는가?

 

 한 덩어리 만큼 순전파를 하고, 그 덩어리만큼 역전파도 하고, 가중치 행렬을 갱신한 다음에 은닉 상태를 순방향으로 복사시키고 역방향을 갱신시키기도 한다. 다시말하면 순방향으로는 복사시키고 역방향으로는 가중치 행렬 갱신에 사용된다. 시퀀스 일부 덩어리를 역전파를 할때마다 그 덩어리 비용의 가중치 행렬에 대해서 미분치를 구하고, 이 그라디언트를 신경망 가중치 갱신에 사용하겠다.

 

 

 시간 변화에 따른 절삭된 역전파 알고리즘을 정리하자면, 데이터들을 한 덩어리씩 처리함으로서 메모리 부족 문제를 해결하였다. 나머지 학습하는데 필요한 시퀀스의 모든 정보들을 그 순환 신경망의 최종 은닉 상태에 저장이 시킨 덕분이다.

 

gist.github.com/karpathy/d4dee566867f8291f086

 

 

 이 전체 과정이 복잡해 보이기는 하지만, 112줄의 파이썬 코드만으로도 절삭 역전파 알고리즘 처리과정과 언어 모델 그리고 새로운 텍스트를 생성하기까지의 전체 처리과정을 구현할수가 있다. 여기서는 파이토치나 그라디언트를 계산하기 위해서 오토 그래프 같은 방법들이 사용하지도 않았지만, 파이토치를 사용한다면 4~50라인으로 만들수가 있겠다.

300x250
728x90

 

 

 

 그래서 순환 신경망 recurrent neural network란 무엇이고, 어떻게 해야 그게 잘 동작할까. 기본적으로 순환 신경망은 순차적으로 처리한다고 말했었는데, 매 타임 스탭마다 순환 신경망은 위의 빨간색 상자 x와 같이 어떤 입력을 받고 파란색 상자에 나와있는 출력 y를 내보낸다.

 

 거기다가 순현 신경망은 내부 은닉 상태 internal hidden state라고 하는 벡터를 가지고 있는데, 매 타임스텝마다 순환 신경망은 현재 타임 스탭의 입력을 어떤 공식에 따라 은닉 상태를 갱신시키는데 사용한다. 그러면 갱신된 은닉 상태는 현재 타임 스탭에대한 출력으로 내보내진다.

 

 

이게 어떻게 되는지 구체적으로 보자면, 순환 신경망 아키텍처를 정의하기 위해서 우선 순환에 대한 함수 $f_w$를 정의하여야 한다. 위 그림을 보면 $h_t$가 있고, 이 신경망은 은닉 상태에 대한 시퀀스를 처리하는걸 알수 있는데 여기서 $h_t$는 현재 타임스탭에서의 은닉 상태로 벡터 형태로 되어있으며 우리가 그동안 봐왔던 완전 연결 신경망의 은닉 층 활성 벡터 같은것이라고 보면 되겠다.

 

 이제 순환 관계에 대한 함수 f를 정리하자면 f는 학습 파라미터 w의 영향을 받는 함수로 입력으로 이전 타임 스탭 $h_{t-1}$과 현재 타임 스탭에서의 입력 $x_{t}$를 입력으로 받아서 계산된 은닉 상태 $h_t$를 출력하게 된다.

 

  $f_{W}$는 입력 벡터와 은닉 상대의 관계에 따라 대수적 방정식을 정의해서 사용하면 되겠다. 

 

 여기서 중요한건 매시간 스탭마다 시퀀스에대해서 동일한 가중치 W와 동일한 함수 $f_{W}$를 사용하는 것이며, 이렇게 함으로서 가중치를 공유하고 모든 각 시간에서 같은 가중치 행렬을 사용해서 처리할수 있겠다. 그래서 이 함수는 모두 같은 가중치 행렬로 매 시간마다 시퀀스를 처리하다보니 임의 길이의 시퀀스를 처리할수 있는 하나의 가중치 행렬을 가진다고 할수 있다. 

 

 이제 순환 신경망에 대한 일반적인 정의 형태를 가지고 첫번째로 구체적인 예시를 구현하여보자. 위 그림은 가장 간단한 순환신경망 버전으로 바닐라 순환 신경망 혹은 그냥 순환 신경망, 연구자의 이름을 따 Elman RNN이라고도 부른다. 

 

 여기서 은닉 상태는 하나의 벡터 $h_{t}$이며, 가중치 행렬들을 이용하여 학습하는데 가중치 행렬 중 하나인 $W_{hh}$는 이전 타임스탭의 은닉층과 곱하고, 다른 하나인 $W_{xh}$는 현재 타임 스탭의 입력과 곱한다. 여기서 현재 입력 $x_{t}$와 가중치 행렬 $W_{xh}$를 곱한 것과 $h_{t-1}$과 $W_{hh}$을 더하면 되는데 여기에 편의를 위해서 생략했지만 편향항 혹은 정규 편향항을 명확하게 정리한다면 추가할수 있겠다.

 

 그리고 비선형성을 사용하기 위해서 계산 결과를 tanh 함수의 입력으로 사용하면 새로운 (현재 타임 스탭의) 은닉 상태 $h_t$를 얻을수가 있고, 출력 $y_t$는 현재 상태 $h_{t}$를 다른 가중치 행렬 $W_{ht}$와 곱함으로서 선형 변환하여 나오게 된다

 

 지금까지 Elman RNN에 대한 정의를 보면서 어떻게 동작하는건지 이해할수 있겠다.

 

 

 

 

 순환 신경망이 어떻게 동작하는지 보는 다른 좋은 방법으로 계산그래프를 이용해서 알아보면 좋겠다. 순환 신경망을 시간 변화에 따라서 쭉 풀어보면, 시퀀스 맨 처음에는 시쿼스 첫번째 원소인 $x_{1}$이 초기 입력으로 들어온다. 여기에 초기 은닉 상태 $h_{0}$가 필요한데 일반적으로 초기 은닉 상태는 0으로 설정하고, 어떤 경우에는 이것도 학습 가능한 파라미터로 놓고 학습해 나가기도 한다.

 

 하지만 초기 은닉 상태 값을 모두 0으로 설정해도 잘 동작한다. 이렇게 초기 은닉 상태와 시퀀스의 첫번째 원소가 주어질때

 

 

  이 초기 은닉 상태 $h_{0}$와 입력 $x_{1}$를 순환 관계 함수 $f_{w}$에 넣어서 첫번쨰 은닉상태인 $h_{1}$을 구할수가 있고,

 이렇게 구한 첫번쨰 은닉 상태 $h_{1}$과 시퀀스의 다음 요소인 $x_{2}$를 동일한 함수 $f_{w}$에 넣어 다음 은닉 상태를 만들 수가 있겠다.

 그리고 이런 식으로 계속 진행 되겠다.

 

 

 여기서 중요한 건은 모든 타임 스탭, 시퀀스들은 동일한 가중치 행렬을 사용한다는 점이다. 위 그림의 계산그래프를 보면 확실하게 볼수 있는데 가중치 행렬 W 노드 하나가 모든 타임 스탭에서 사용되고 있다. 

 

 이번에는 역전파 과정에서 어떻게 되는지 생각해볼건데, 카피 노드의 경우 순전파 때는 한 노드를 여러개로 복사하는 역할을 했었고, 역전파때는 업스트림 그라디언트들을 합하여 다운스트림 그라디언트로 보내주는 역활을 하는데, 이 점이 이게 과제 4번 순환 신경망 구현에서 중요하다.

 

  그리고 모든 타임 스탭에서 같은 가중치 행렬을 사용하다보니 어떤 길이의 시퀀스이던 간에 순환 신경망으로 처리할수가 있으며, 시퀀스 요소가 2개인 경우가 들어와도 이 그래프는 두번의 타임 스탭만 진행하면 되고, 시퀀스의 길이가 100이라면 이 그때는 100번 타임 스탭만큼 그래프가 진행되면 되겠다.

 

 그래서 입력으로 받는 시퀀스의 길이가 중요하지 않으며 같은 순환 신경망, 특정 길이의 시퀀스 처리에 같은 가중치 행렬을 사용해서 처리할수 있겠다.

 

 지금까지 본 내용들이 순환 신경망의 기본적인 연산 과정으로 아까 1 대 다, 다 대 다 같은 여러가지 종류의 시퀀스 문제들을 봤다시피 이제는 어떻게 다양한 시퀀스 문제들을 처리할수 있는 순환 신경망을 구현해서 사용하는지를 살펴보자.

 

 

 이번 슬라이드는 입력 시퀀스를 받아서 각 시점에서 출력을 내보내는 다대다 문제로 예를 들어 비디오 문제가 있는데, 비디오의 모든 프레임을 분류하는 경우라고 할수 있겠다. 여기서도 가중치 행렬 W가 주어지고 이 가중치 행렬을 모든 타임 스탭에서 출력 y를 계산하는데 사용된다. 

  그리고 라벨을 가지고 있는 경우에 라벨을 가지고 학습시키기 위해서 시퀀스의 매 타임 스탭마다 비용 함수를 사용할 것이고, 비디오 분류같은 문제라면 시퀀스의 모든 시점에서 분류 결정을 하게 될건데, 교차 엔트로피 함수로 실제 라벨 ground truth와 예측 결과에 대한 비용을 계산하여 학습 시킬수가 있겠다.

 최종 비용을 구하기 위해서 모든 시간 때의 비용들을 합하여 구할수가 있겠고 이 최종 비용을 역전파 하는데 쓸수 있겠다. 이 예시는 하나의 타임 스탭 때 하나의 출력을 내보내는 다 대 다 순환 신경망의 완전 계산그래프이다.

 

 

  이번에는 다 대 일 상황을 다뤄본다고 하면 예를 들어 비디오 시퀀스를 입력받아 하나의 라벨로 분류하는 비디오 문제라는 경우를 다룬다고하자. 이 경우에는 시퀀스의 맨 끝에서 순환 신경망의 최종 은닉 상태를 가지고 연산해서 하나의 예측 값을 구하면 된다. 

 

 그리고 이 순환 신경망의 최종 은닉 상태는 전체 입력 시퀀스에 영향을 받으며, 우리가 구한 최종 은닉 상태는 신경망이 전체 시퀀스를 가지고 분류 결정을 하기위해서 알아야하는 모든 정보들을 정리 한 것이라고 보면 된다. 

 

 다른 경우로 이미지 캡셔닝 같이 하나의 이미지를 입력으로 받아 단어들의 시퀀스를 출력하는 일 대 다 문제가 있으며 순환 신경망을 이용해서 처리할수가 있다.  이 경우 단일 입력 x는 맨 앞에서만 들어가고, 순환 (관계) 함수를 사용해서 전체 출력 시퀀스를 만들어 낸다.

 

 

 

 또 다른 순환 신경망을 이용한 예시로는 sequence to seqeuence seq2seq가 있는데, 입력 시퀀스를 처리해서 길이가 다른 입력 시퀀스를 만들어내는 것같은 기계 번역같은 경우가 있다. 여기서 입력으로 영어 단어 시퀀스가 들어오고 출력으로는 프랑스 단어 시퀀스가 내보내는 그러니까 문장 번역을 수행하도록 시킬수가 있다.

 

 프랑스 말이랑 영어 말이나 항상 같은 길이의 문장으로 동일한 의미를 표현하도록 번역을 할수 없다보니, 입력 시퀀스를 처리해서 다른 길이의 출력 시퀀스를 만들어내는 순환 신경망을 만들어야 한다. 

 

 이런 서로 다른 길이의 입력, 출력 시퀀스를 내보내는 순환 신경망을보고 seq2seq rnn 아키텍처라고 부른다. 이 아키텍처는 기본적으로 다 대 일 순환 신경망 구조를 사용하여 구한 결과를 다른 일 대 다 순환 신경망에 전파함으로서 동작시킨다.

 

 지금 보고있는 게 인코더라고 부르는 순환 신경망으로 시퀀스를 입력받아서 이 경우에는 영어 문장을 입력으로 받아서 매 시간마다 단어 하나 하나씩을 처리할것이고, 시퀀스 전체 내용을 처리한 후에 내용들은 맨 끝에 있는 은닉 벡터로 요약/정리가 된다.

 

 이렇게 인코더의 맨 끝에서 구한 은닉 벡터는 디코더라고 부르는 두번째 순환 신경망의 단일 입력으로 사용되며, 이 디코더 신경망은 첫번째 인코더 신경망으로부터 단일 벡터를 입력받아 출력으로 여러 단어들, 시퀀스를 출력하다보니 일 대 다 신경망이 되겠다.

 

 이 그림이 디코더에 대한 계산그래프로 인코더와 디코더는 서로 다른 가중치 행렬을 사용하며, 이런 형태가 대표적인 시퀀스 투 시퀀스 모델 형태라고 할수 있겠다.

 

 

 

(질문) 인코더와 디코더로 나눠서 처리하는 이유는 무엇인가?

 

 여기서 문제는 출력 토큰의 개수가 입력 토큰의 개수와 얼마나 달라야하는지 모른다는 점인데 우선 영어 문장을 처리해서 프랑스 문장으로 만든다고 하자. 하지만 출력시킬 단어 갯수를 입력의 단어 개수와 얼마나 다르게/차이나게 할지 알 수 없으므로 나눠서 다루는게 중요하다.

 

 한번 인코더와 디코더 둘다 동일한 가중치 행렬을 사용한다고 생각해보자. 전체 입력 시퀀스가 주어지고 k번 타음 스탭만큼 진행하고나서, 나머지 k번 타임 스탭에서는 별도의 입력 없이 진행되서 출력을 얻을수가 있겠다. 아까 질문은 디코더에서 얼마나 많은 토큰들이 필요하느냐인데, 이후에 나올 슬라이드를 보면서 자세히 다뤄보겠다.

300x250
728x90

 그동안 이미지 분류가 무엇인지, 선형 분류기, 최적화 방법, 신경망 구성 요소과 신경망 학습 등 전반적으로 살펴보았고, 이제 순환 신경망에 대해서 살펴보고자 한다.

 

 12번째 강의에서는 순환 신경망 recurrent neural network라고 부르는 신경망에 대해서 살펴볼건데, 그 전에 몇 강 전에 배웠던 내용들을 복습해 보자.

 

 (보지 않고 넘어갔지만) 딥러닝 하드웨어와 소프트웨어에 관한 강의에서 다루었던 파이토치와 텐서플로에 대해서 정리한 내용인데, 그 강의에서 다뤘던 파이토치의 가장 큰 문제점은 TPU(구글에서 만든 전문 탠서 처리 유닛 Tensor Processing Unit)를 사용할수 없는 점과 모바일 장치에서 학습한 모델 사용을 지원하지 않는다는 점이었다.

 

 

 파이토치는 (2019년 당시 기준) 현재 1.3버전이 배포되어있으며, 파이토치 새 버전의 주요 특징이라고 한다면 이 두 문제를 처리해서 모바일 장치에서 사용할수 있도록 모바일 API를 제공하고 있으며, TPU에서도 파이 토치 코드를 동작 시킬수 있도록 개선되었다.

 

 아무튼 이런 이유로 딥러닝 분야에서 어떤 변화들이 일어나는지 꾸준이 주의하면서 보는게 좋겠다.

 

 

 

 이제 이전 강의에서 본 내용들로 되돌아와서, 지난 두 강의에서는 어떻게 신경망을 학습할지에 대한 다양한 방법들에 대해서 살펴보았다. 신경망을 잘 학습하기위해서 필요한 활성화 함수와 데이터 전처리, 가중치 초기화와 다른 많은 방법들에 대해서 자세히 알아보았는데, 이들을 잘 이해하고 있으면 어떤 종류의 이미지 분류 문제들을 다루던간에 심층 합성곱 신경망을 학습시키는데 있어서 전문가가 되었다고 할수 있겠다.

 

 이제는 심층 신경망을 가지고 다른 문제들도 풀어볼건데 오늘 다루고자하는 주제는 순환 신경망 recurrent neural networks이다.

 

 

 일단 우리가 지금까지 심층 신경망을 가지고 다뤄왔던 모든 문제들, 모든 활용 예시들은 순방향 신경망 feed forward network라고 부르는 것인데, 이 순방향 신경망은 신경망의 바닥에서 어떤 단일 입력(이미지)을 받고, 하나나 여러 은닉층(합성곱이나 배치 정규화 계층 등)들을 지나가는데, 각 계층들은 입력을 처리하여 다음층으로 전달하여 신경망의 맨 끝에는 단일 출력을 하게 된다.

 

 이런 순전파 신경망의 고전적인 예시로 이미지 하나를 입력받아 그 이미지가 무엇을 나타내는지 분류하여 카테고리 라벨을 출력하는 이미지 분류 신경망이 있겠다.

 

 우리가 지금까지 이미지 분류 문제를 자세하게 다룬 이유는 이미지 분류가 딥러닝에 대한 수많은 중요한 특징들을 정리해서 다룰수 있었기 때문이다.

 

 

 하지만 이미지 분류 이외에도 심층 신경망으로 풀고자 하는 수 많은 문제들이 있는데, 이미지 분류 때 처럼 1:1이 아닌 1:다 문제 그러니까 이미지를 입력받아서 하나의 라벨이 아닌 시퀀스를 출력하는 경우도 있다.

 

 이러한 문제의 예시로 이미지 캡셔닝이 있는데, 이 문제에서는 인공 신경망에다가 이미지 한장을 주고 이 이미지에 대한 내용을 설명하는 단어 시퀀스를 출력하며 이것은 지금까지 다뤄왔던 단일 이미지에 단일 이미지 라벨을 출력하는것보다 일반화 시킨 경우로 볼수 있겠다.

 

 다른 활용 예시로는 다 대 1, many : 1 문제로 단일 이미지 같은 단일 입력이 아니라 비디오 프레임 시퀀스 같이 여러개의 데이터 시퀀스를 입력받아 라벨을 할당하는, 분류하는 문제가 되겠다. 여기서 비디오 시퀀스를 입력으로 받아서 어떤 상황인지 판단하는 비디오 분류 문제를 다 대 일 문제라고 볼수 있다.

 

 다 대 다, many : many 문제로 시퀀스를 입력받아 시퀀스를 출력하는 대표적인 문제 예시로 기계 번역이 있는데, 영어 문장 그러니까 영어 단어 시퀀스를 입력받아 프랑스 문장, 프랑스 단어 시퀀스를 출력하는 경우가 있겠다. 이때 입력 시퀀스의 길이도 다양하고, 출력 시퀀스의 길이도 다양할수 있다보니 이 문제를 다 대 다, many to many 문제라고 부른다.

 

 

 또 다른 타입의 시퀀스 투 시퀀스 문제로 입력 시퀀스를 처리해서 시퀀스의 한 원소 마다 출력하고자 하는 경우도 있는데, 이러한 다 대 다 분류 문제의 예시로 비디오 프레임들을 입력받아 비디오 전체를 보고 하나로 분류하는게 아니라 비디오 프레임마다 각자 분류하는 경우가 있겠다.

 

 자세히 예를 들면 처음 세 프레임에서는 어떤 사람이 농구공을 드리블링 한다고 판단하고, 다음 10 프레임동안은 농구공을 던지는 것으로, 다음 프레임은 공을 던졌으나 실패하는 상황을, 나머지 프레임에서 다른 팀원들에게 야유를 받는 상황으로 이와 같이 여러 이미지 시퀀스를 받아 각 시퀀스마다의 경우를 분류하고자 할수도 있다. 

 

 이런 시퀀스를 처리하는 신경망을 만들기 위해선 단일 입력을 받아 단일 출력을 하는 능력을 가질 뿐 만이아니라 입력 시퀀스를 처리해서 출력 시퀀스를 만들어내도록 해야한다.

 

 

 

 딥러닝에서 입력과 출력이 시퀀스인 경우 처리하도록 사용할수 있는 일반적인 방법, 도구가 순환 신경망 recurrent neural network이며, 앞으로 다양한 순환 신경망을 가지고 입력/출력 시퀀스를 처리하는 문제들을 어떻게 풀어내는지 알아보자.

 

 여기서 알아야할 중요한 점은 우리가 어떤 문제를 다루던간에 시퀀스의 길이를 모르더라도 임의의 길이(예를 들어 짧은 비디오 프레임이나 아주 긴 비디오 시퀀스)를 처리할수 있는 신경망을 만든다고 할때  순환 신경망이 매우 유용한 방법이며, 심층 신경망 문제에서 다양한 시퀀스를 처리할수 있겠습니다.

 

 

 

 하지만 순환 신경망은 비 시퀀스 데이터 처리에도 효과적으로 사용할수가 있습니다. 어떤 연구원들은 순환 신경망을 비 시퀀스 데이터의 시퀀스 처리를 하는데 사용해보았는데, 다음 연구는 몇년 전에 진행된걸로 이미지 분류를 하고 있습니다. 지금까지 배운 내용을 생각해보면 이미지 분류에서는 시퀀스가 존재하지않고 단일 이미지를 입력으로, 단일 카테고리 라벨이 출력으로 되었었습니다.

 

 하지만 이들은 단일 순전파 신경망으로 이미지 분류를 하지않고, 한 이미지가 주어질때 그 이미지를  응시glimpse한 여러개의 경우를 가지고, 한번은 이미지의 한 부분을 보고, 다른 응시때는 그 이미지의 다른 부분을 보고, 시간 변화에 따라 다른 지점을 본 응시들을 사용한 신경망을 만들었습니다. 

 

 이 신경망이 이미지에서 어느 부분을 볼지는 이전 타임 스탭으로부터 얻은 정보를 기반하여 판단하며, 아주 많은 부분들을 응시한후에 최종적으로 이 이미지의 물체가 무엇인지 판단을 하게 됩니다.

 

 

 그래서 이 그림이 신경망 안에서 비 시퀀스 데이터를 가지고 시퀀스 처리를 사용한 예시로 숫자 분류하는 걸 보여주고 있는데, 작은 녹색 사각형들이 신경망이 이미지의 어디를 볼지 선정한 응시 영역이며, 이 응시한 것들을 모아 최종 결정을 하게 됩니다.

 

 

 

 

  비시퀀스 데이터를가지고 시퀀스 처리하는 다른 예시로는 역변환 중 하나인 이미지 생성을 살펴봅시다. 이전 슬라이드에서는 이미지 하나를 입력으로 가지고 와서 여러 응시 결과들을 모아 분류를 했었는데, 이번에는 그와 달리 숫자 이미지를 생성하는 신경망을 만들고자 하며 매 타임 스탭마다 출력 시퀀스로 숫자 이미지를 그려봅시다.

 

 이 신경망에서는 매 시간 마다 어디 다가 그릴것인지, 무엇을 그릴것인지, 어떻게 그릴것인지를 선택해야하며 이러한 비 순차적인 하부 작업들을 한번에 순차적으로 처리하여 숫자 이미지를 출력하도록 신경망을 설계하면 되겠습니다.

 

 

 

 이 연구 내용은 (교수님이 강의하기) 2주전에 트위터에서 찾은 건데, 비순차 작업인 이미지 생성을하는 신경망을 만든것으로 오일 페인팅 시뮬레이터와 신경망을 합쳐 순차처리를 하는것을 보여주고 있습니다. 

 

 이 연구에서는 사용할 붓을 고르고, 매 시간마다 이전 타임 스탭에서 본것에 따라 어디다가 붓으로 그릴지를 판단하며, 시간이 지남에 따라 이런식으로 예술가가 그린듯한 얼굴 그림이 만들어지게 됩니다. 

 

 이런 것들이 순환 신경망을 사용한 예시들로 지금까지 순환 신경망을 통해서 순차적인 데이터를 처리할수도 있고, 기존에 비 순차적으로 처리되던 옛날 문제들을 순차 처리를 통해서 풀수도 있는것을 보았습니다. 그래서 이것들을 보면서 왜 우리가 순환 신경망을 배워야하는지를 충분히 동기 부여가 되었으면 좋겠습니다.

300x250
728x90

지난번에 전이 학습에 관한 내용들을 마무리 하고싶었는데 생각보다 내용들이 많아 마무리하지는 못했다. 

 

이번에 전이학습 내용을 마무리해보자

 

 

 

 그래서 이전까지 본 내용들이 선학습된 신경망을 이용한 가장 간단한 경우들로서, 특징 벡터들을 추출해서 이 벡터를 다른 알고리즘에 적용을 시켜보았다.

 

 하지만 우리가 사용하고자하는 데이터셋이 더 크다면 미세 조정 fine tuning이란 과정을 통해서 더 나은 성능을 얻을수가 있는데, 일단 이미지넷 데이터셋으로 이미 학습된 모델을 가지고오고 맨 마지막 계층을 버린다음, 남은 마지막 계층을 새로운 데이터셋 데이터들의 카테고리를 분류할 수 있도록 재초기화를 시키자.

 

 새 분류 데이터셋을 가지고 학습과정을 진행하면, 특징 추출기로 사용되던 모델이 역전파를 통해서 가중치가 갱신되고 분류작업을 더 잘할수 있도록 성능이 개선된다. 

 

사용할 데이터셋이 선 학습 모델의 데이터셋보다 더 큰 경우 정리

- 기존의 전이 학습 : 이미지넷을 선학습한 알렉스넷 모델의 마지막 계층을 제거하여 특징 추출기로 사용하였다.

- 남은 마지막 계층을 새 데이터셋의 분류 카테고리를 다룰수있도록 다시 초기화하고, 새 데이터셋으로 학습 진행한다.

- 기존의 선학습 모델이 새 데이터셋에 맞게 갱신되어, 성능이 향상된다.

 

 위 예시는 미세 조정을할때 가끔식 필요할수도 있는 방법들의 예시인데, 어떤 경우에는 학습률을 줄여야 할수도 있을거고, 다른 경우는 특징 추출한 이후 선형 모델을 학습시키고나서 전체 모델을 미세 조정 하는 경우도 있겠다.

 

 

 이런 미세 조정에서 추가적으로 사용하는 방법들은 실제로도 사용되고 있으며, 다양한 작업 성능을 크게 올려주었다. 위 그림은 물체 인식의 인데, 앞으로 몇 강 안에 이에 대해서 자세하게 다룰 예정이다보니 이게 어떻게 동작하는지나 수직 축의 숫자가 뭘 의미하는지 자세히 알 필요는 없다.

 

 아무튼 여기서 파란색 막대는 서로 다른 두 데이터셋으로 물체 인식을한 전이 학습의 예시인데, 이미 학습을 마친/고정된 특징 추출기(모델)를 가지고 얻은 결과를 보여준다. 주황색 막대의 경우 새로운 데이터셋으로 전체 신경망을 학습시킨 경우로 미세 조정을 함으로서, 신경망이 특징 추출기로 사용된 전자의 경우보다 훨씬 성능이 개선되는걸 볼수 있다.

 

 

  다른 관점으로 전이학습을 보자면, 이미지넷 데이터셋으로 한 모델을 학습시켜서 사용했는데, 어떤 모델을 학습시키느냐도 중요한 문제라고 할수 있겠다. 이미지넷셋에서 일반화 성능이 좋은 모델일수록 다양한 컴퓨터 비전 문제들을 더 좋은 성능으로 해결할수가 있다.

 

 여기서 컴퓨터 비전 분야를 연구하는 사람들이 이미지넷에 대한 모델들을 다루고자하는 이유는 이미지넷을 좋아해서가 아니라, 수년간 이미지넷 셋으로 좋은 성능을 보인 모델들이 보통 다른 모든 문제들에서도 잘 동작했기 때문이다. 그래서 이미지넷을 다루는 가장 최신, 좋은 성능을 보이는 최적의 모델을 사용해서 우리가 다루고자 하는 문제에서 사용할때 더 좋은 성능을 얻을수가 있겠다.

 

 

 이번 예시로 다시 객체 인식 문제로 돌아와서 보면, 이미지넷 데이터셋을 학습한 다양한 모델들을 비교한 논문을 찾기 어려워서 틀릴수도 있긴한데 물체 인식 성능 비교한 그림을 보여주고 있다. y축은 물치 인식 성능으로 0인 경우 나쁘고, 100에 가까울 수록 좋은 성능이라고 할수 있다.

 

 2011년부터 시작하여 딥러닝 이전의 방법 Pre DL을 사용한 경우 5 정도를 얻었고, 알렉스넷을 학습후 같은 객체 인식 방법을 사용한 경우 15를 얻었으며, 알렉스넷보다 더 큰 신경망인 VGG-16으로 바꾸었을때 19로 증가하였다.  Faster R-CNN이라고 부르는 새로운 방법을 사용한 경우에는 29로 증가하였고, ResNet-50을 사용시 36으로 증가하였다. 

 

 이런 추세가 계속 진행되서 이미지넷에서 더 나은 성능을 보이는 모델을 사용할수록 적은 노력을 들이고도 수많은 컴퓨터 비전 문제를 풀수가 있겠다.

 

 

 어떻게 CNN에서 전이학습을 다룰지를 한번 살펴본다고하면, 우리가 풀고자하는 문제를 사용하고자 하는 데이터셋이 이미지넷과 비슷하냐 아니냐와 새로운데이터셋이 큰지 작은지에 따라 다음의 2 x 2 행렬로 분류하여 다뤄보자.

 

 

 

 우리가 사용하는 데이터셋이 이미지넷과 비슷한경우, 그러니까 이미지넷과 비슷한 물체들을 포함한 셋인경우이나, 한 카테고리당 수십 ~ 수백개로 데이터가 적은 경우라고해보자. 그러면 선 학습된 특징 추출기 맨 위에다가 선형 학습기 같은것을 적용시키면 잘 동작하게 되겠다.

 

 이번에는 한 카테고리당 수백 ~ 수천개의 샘플로 꽤 큰 데이터셋을 가진경우, 이미지넷으로 학습한 모델을 새 데이터셋으로 미세조정을 시킬것이고 더 잘 동작하게 된다.

 

 

 

 

 

 하지만 이번에는 사용하려는 데이터셋이 이미지넷과 다른 경우를 보면, 데이터셋이 다르지만 많이 가지고 있는 경우에는 어떻게 해야할지 명확하게 구분되어있지는 않지만 이미지넷 모델을 초기화해서 미세조정을 하면 되겠다.

 

 

 다음으로는 이미지가 다른 타입이고, 데이터셋이 작은 경우가 문제가 될수 있는데, 선학습된 모델로부터 얻은 특징으로 선형 분류기를 사용하거나 미세 조정하는 방법들은 꽤 괜찬게 동작하기는 하지만 잘못될수 있으니 주의하여야 한다.

 

 

 이런 전이학습이란 방법은 컴퓨터 비전 분야에서 수 많은 문제들을 풀기위해서 수년간 사용되면서 특별한 경우에만 사용한는게 아니라 일반적이며, 주류가 되었다. 

 

 

 오늘날 수 많은 컴퓨터 비전 논문에서 전이 학습을 사용하고 있으며, 이미 객체 인식 문제에서 이미지넷을 선학습한 모델을 사용한 경우를 보았다. 이미지 캡셔닝이라는 분야에서도 이미지넷을 선학습한 모델 일부를 사용하고 있으며,

 

 

 연구자들이 과감하게 다른 데이터셋으로 선학습된 모델들을 사용해서 다양한 경우의 이미지 캡셔닝 모델을 만들수가 있었는데, 이러한 일부 모델이 이미지넷을 선학습 되고, 다른 일부가 다른 데이터셋으로 선학습시켜 같이 사용해서 학습하고 작업을 수행하는 경우에 대해서 자세히 다루어보자. 

 

 최근 몇년간 컴퓨터 비전 분야에서 있었던 중요한 변화 중 하나는 문제를 해결할수 있는 모델을 만들수 있도록 여러번 반복해서 선학습 모델과 미세 조정 과정에 대한 파이프 라인을 찾는 것이 되었다.

 

 

  컴퓨터 비전 분야에 있었던 이런 변화를 보여주는 좋은 예시로 최근 투고된 논문인데,

첫번째 단계에서 CNN을 이미지넷으로 학습시킨다.

두 번째 단계는 Visual Genome이라고 부르는 데이터셋으로 객체 인식을 하도록 CNN을 미세 조정 시킨다.

세번째 단계에서는 BERT라고 부르는 언어 모델을 학습시키는데 여기에 대한 자세한 설명은 중요치 않으니 넘어가자.

넷째 단계에서는 2, 3번째 단계의 결과를 합치고 결합된 이미지/언어 모델을 미세조정을 시키자. 

다섯째 단계에서는 이미지 캡셔닝 혹은 시각 질의응답 혹은 다른 다운스트림 작업에 대해서 미세조정을 시키자.

 

 이 모델에서 전체 과정이 어떻게 돌아가는지는 이해할 필요는 없고 이런 식으로 미세 조정과 선학습 모델들이 사용되고 있으며, 이런 식으로 전이 학습이 컴퓨터 비전 연구에서 주류가 되었고 할수 있겠다.

 

 

300x250
728x90

 

 

 

 

 이전에 본 7개의 단계를 통해서 GPU 자원이 많지 않더라도 좋은 모델을 학습시킬수가 있겠다. 이후에 더 다뤄볼 내용으로 모델을 학습한 이후에 어떤 일들을 할수 있느냐인데,

 

 최종 테스트셋 성능을 약간이라도 좋게 할수 있는 방법들 중 하나로 모델 앙상블이 있는데, 어떤 문제를 다루던지 간에 상관없이 성능을 개선 시킬수가 있다. 이 방법은 독립적으로 여러개의 모델을 여유 되는 만큼 학습시키고, 그들 중 가장 테스트 성능이 좋으걸 사용하는게 아니라 각 모델들의 예측 결과를 모아서 평균을 사용한다.

 

 이미지 분류 같은 문제의 경우에는 각 모델이 출력한 각 카테고리별 예측 확률을 평균을 구해서 사용하면 되겠다. 이런 식으로 여러개의 서로 다른 모델들의 조합, 앙상블을 사용해서 기존의 최종 테스트 성능에서 1 ~ 2 % 성능 개선을 할수 있다.

 

 그래서 이 방법은 꽤 일반적으로 사용할수 있어, 어떤 모델 아키텍처인지, 모델이 얼마나 많은지, 어떤 문제를 풀고자하는지 상관없이 더 좋은 성능을 얻을수가 있어서 사람들이 자주 사용하는 방법이겠다.

 

정리

여러 모델을 이용한 모델 앙상블 기법

1. 여러 모델들을 학습 후 예측 결과의 평균을 최종 예측 값으로 사용한다.

2. 어떤 문제이던 간에, 어떤 모델이던 간에 상관없이 유용하게 사용할 수 있다.

 

 

 독립적인 여러 모델들을 학습시키는것 대신 사용할수 있는 다른 방법으로는 한 모델을 학습하는 동안 여러 체크 포인트를 저장하고, 해당 체크포인트 당시 모델의 결과들을 평균을 구해서 성능을 개선시킬수가 있다.

 

 이 방법의 트릭은 주기를 보이는 효과적인 학습률 스케줄링 방법이라고 할수 있는데, 학습률 스케줄링이 주기적으로 동작하다보니 처음에는 높게 시작하다가 떨어지고, 다시 높게 시작하다가 떨어지고, 이 과정을 여러 차례 반복한다. 그렇게 하면 각 체크포인트들에서 모델의 가중치 값들은 학습률 스케줄링에서 해당 지점이 가장 낮을때의 것을 사용하는게 되겠다.

 

정리

한 모델 여러 스냅샷을 이용한 모델 앙상블 기법

1. 주기를 보이는 학습률 스케줄링 방법을 사용한다.

2. (해당 주기에서) 훈련 비용이 최저가 되는 = 학습률이 최저가 되는 시점의/체크 포인트 모델을 저장한다.

3. 각 체크 포인트 모델로 예측한 결과의 평균치를 저장한다.

 

 

 

 

 

 다른 방법으로는 학습 하는 동안의 모델 가중치들의 이동 평균을 구하여 사용하는 것으로 이걸 폴리야크 평균 Polyak이라고 부른다. 이 방법은 배치 정규화 같은 큰 생성 모델들에서 흔하게 사용되어왔는데, 가지고 있는 데이터들의 평균과 분산의 평균들을 지속적으로 계속 구하고, 테스트 때 (배치 정규화 때 처럼) 이렇게 구한 평균과 표준 편차를 사용하는 방법이다.

 

 모델 가중치를 갱신할때 한 에폭에서 경사 하강법으로 구한 가중치 갱신치를 사용하는게 아니라 그동한 지속적으로 구한 모델의 가중치 평균을 사용한다고 할수 있겠다.

 

 이 방법을 통해서 훈련 과정에서 매 반복때마다 발생하는 변동을 스무딩시킬수가 있겠다. 지금까지 모델을 학습시키는 동안 매 반복때마다 비용의 변동이 크게 나오지만, 매 반복 마다 발생하는 노이즈를 평균을 통해서 줄일수가 있었다.

 

정리

가중치 이동 평균 사용하기

1. 폴리 야크 평균 : 훈련 과정에서 이동 평균을 계속 계산하고, 테스트 과정에서 사용.

2. 폴리 야크 평균으로 학습 과정에 발생하는 노이즈를 제거할수가 있다.

 

 

 지금까지 모델 앙상블에 대한 다양한 방법들을 살펴봤는데, 이 방법을 기존에 사용하려고 했던 작업에서 더 나아가서 학습 시킨 모델가지고 다른 작업을 해야할 경우도 있는데, 이런 방법들이 최근 몇년간 컴퓨터 비전 분야에서 메인스트림이 된 효괴적인 방법들로 전이 학습 transfer learning의 기반이 되었다.

 

 

 

 전이 학습에 대해서 시작하기 위해서 우선 CNN에 대한 미신으로 사람들이 모델을 학습시켜서 잘 쓰려면 아주 큰 훈련셋이 필요하다고 말하곤한다.

 

 하지만 이 생각은 잘못된 것인데, 이 잘못된 생각을 깨야 하며 전이 학습을 통해서 수 많은 문제들을 딥러닝으로 풀수 있다. 아주 큰 훈련셋을 사용할수 없는 경우가 많이 있으며, 이런 이유로 전이 학습이 컴퓨터 비전 분야에서 메인 스트림이 되었다.

 

 기본 개념은 위 그림과 같은데, 우선 첫 번째 단계에서는 이미지넷 이나 다른 큰 이미지 분류 데이터 셋으로 합성곱 신경망 모델을 학습 시키자. 이 과정에서 우리가 지금까지 봐왔던 다양한 기법들을 활용해도 좋다.  두 번째 단계에서는 이미지넷 데이터셋의 분류 성능 보다는 더 작은 데이터셋을 이용한 분류 문제나 아예 다른 문제를 다루고자 할 수도 있겠다.

 

 이 그림을 보면 이미지넷 데이터로 학습 시킨 모델을 가지고 와서 마지막 완전 연결 계층을 제거하였는데, 이 계층은 알렉스 넷이라고 한다면 4096 차원 특징들을 받아 1000 차원의 클래스 스코어에 대한 벡터를 출력하는 계층으로 어느 카테고리에 속하는지를 판별하는데 사용되었었다.

 

 하지만 이 마지막 계층을 신경망에서 제거 하고 나면 뒤에서 두 번째 계층의 출력인 4096 차원의 벡터를 입력된 이미지들의 특징 표현같은걸로 사용할 수 있다. 다시 말하면 이 학습된 모델을 통해서 이미지에 대한 특징 벡터를 추출할수가 있다.

 

 2013 ~ 2014년 당시 사람들은 이런 간단한 방법을 통해서 아주 많은 컴퓨터 비전 문제들을 더 좋은 성능으로 풀수 있게 되었다. 예를 들자면 칼텍 101이라고 부르는 데이터셋을 사용한 경우인데 이 데이터셋은 101 카테고리 뿐이며, 이미지넷보다 훨신 작은 크기로 이루어져 있다.

 

 우측 그림에서 x축은 하나의 카테고리를 학습하는데 사용한 데이터 개수, y축은 칼텍 101 데이터셋에서 분류 성능을 보여주고 있다. 여기서 빨간색 커브는 딥러닝 방법 이전에 사용되던 특징 추출 파이프 라인을 통한 방법을 이용한 결과이다.

 

 파란색과 녹색 커브는 이미지넷을 학습한 알렉스넷을 가지고 와서 알렉스넷 마지막 두번째 계층으로 구한 특징 벡터로 로지스틱 회귀와 SVM으로 학습 시킨 결과를 보여주고 있다. 선학습된 모델로부터 얻은 4096 차원 특징 벡터로 로지스틱 회귀와 서포트 벡터 머신 같은 단순 선형 모델을 학습 시켰다고 할수 있겠다.

 

 미리 학습 시킨 모델로 추출한 특징 벡터로 선형 모델을 학습 시킨 덕분에, 성능을 크게 향상 시킬수 있었으며 각 클래스당 데이터가 5 ~ 10개 뿐인 경우에도 꽤 높은 성능을 얻을수가 있었다.

 

  그래서 이 방법이 흔하게 사용되고 있고, 이미지넷 선 학습된 모델을 특징 추출기로 사용한다면, 훈련 데이터가 많지 않은 경우라 해도 다양한 문제들을 좋은 성능으로 풀수 있다.

 

 이런 결과가 나오는건 칼텍 101 뿐만 그런게 아니며,  새 분류 데이터 셋을 사용한 경우에도 그런데 우측 그림에세 DPD와 POOF라는 새 종류를 잘 인식할 수 있도록 튜닝한 모델과, 알렉스넷으로 얻은 특징으로 간단하게 로지스틱 회귀로 학습한 경우를 보여주고 있다. 

 

 비교한 결과 알렉스넷 특징 + 로지스틱 회귀이 이전에 새를 잘 분류할수 있도록 튜닝된 방법들보다 더 좋은 성능을 보이고 있고, 

 알렉스넷 특징과 이전의 방법을 같이 사용 한 경우 훨씬 뛰어난 성능을 얻을 수가 있었다. 전이 학습은 칼텍 101 이미지 나 새 데이터 뿐만 아니라

 

 

  수 많은 이미지 분류 문제에 관한 데이터셋에도 사용할수가 있다. 이 그림에 이미지넷 추출 특징을 다양한 선형 모델들로 학습한 벤치마크, 성능 평가치들이 있는데, 객체, 장면, 새, 꽃, 사람 특징, 물체 특징에 관한 모든 데이터셋에서 이전 방법들보다 더 좋은 성능을 보이고 있다.

 

 여기서 놀라운 건 파란색 막대, 각 데이터셋의 이전에 사용되던 방법들이 독립적으로 특정 데이터 셋에 맞게 튜닝되었지만, 간단하게 선학습 모델로부터 얻은 특징들을 사용하여 단순 선형 회귀 모델로 학습시키기만 해도 알아서 미세 조정 되고 이전의 다른 방법들 보다 더 좋은 결과를 얻을수 있다는 점이다.

 

 

 

 선학습모델으로 특징을 추출해 사용하는건 이미지 분류 뿐만이 아니라 컴퓨터 비전 관련 수많은 분야에서 사용할수가 있는데, 동일 논문에서 이미지 검색 작업을 위한 데이터셋에 대해서도 성능 평가를 했었다. 이 방법들이 어떻게 동작하는지는 중요하지 않지만, 예를 들어 옥스포드에 있는 한 건물 이미지가 주어지면 데이터셋에서 시간이나 촬영 각도가 다르더라도 같은 건물의 이미지를 찾는 문제이다.

 

 이런 이미지 탐색은 구글에 이미지 업로드 해서 비슷한 이미지를 탐색하는것과 비슷한것이기도한데, 여기에도 선학습모델로 특징을 추출해서 간단하게 최근접 이웃 같은 방법을 이용해서 이미지 검색 문제를 수행할수가 있다.  특징 추출 층 위에다가 단순 최근접 이웃을 사용함으로서 이전의 방법들보다 훨씬 개선된 성능을 얻을수가 있었다.

 

 간단하게 특징 벡터를 추출해서 사용하는 이런 방법들이 전이 학습의 간단한 예시들이고, 선형 모델이나 다른 탐색 베이스라인들을 사용할수도 있다.

 

 

중간 질문

 이 논문에서는 원본 이미지를 데이터 증강을 사용해서 특징 벡터를 추출을 하였는데, 이 파이프라인에서 상당히 중요하다는걸 알아냈다. 데이터 증강 방법으로 랜덤 스케일로 자르거나 뒤집거나 하는건 이전 장에서 이야기 했으니 넘어가자.

 

 

 

 지금까지 선학습된 신경망을 사용하는 간단한 방법들을 보았고, 특징 벡터를 추출해서 다른 알고리즘에 입력시켜 사용했다. 하지만 우리가 가진 데이터셋이 약간 더 크지만, 더 나은 성능을 얻고자 한다면 미세 조정 fine tuning을 해야 한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

 

 그 다음으로 우리가 자세히 다뤄야할 주제로 신경망에서 사용할 하이퍼 파라미터를 어떻게 선정할까인데 

 

흔히 볼수있는 대표적인 방법으로 그리드 탐색 grid search가 있겠다. 여기서는 하이퍼 파라미터의 집합이 있는데 각각의 하이퍼파라미터들을 사용하면서 선택한 하이퍼파라미터를 사용한 결과들을 평가하는 방식이다.

 

 어쩔때는 선형 공간, 그러니까 하이퍼파라미터가 선형적으로 증가하는 경우보다 로그 선형 공간을 탐색해야하는 경우도 있다. 예를 들자면 위와 같이 4개의 로그 선형 공간상에서의 학습률과 4개의 로그 선형 공간 상에 있는 규제 강도, 가중치 감쇄치가 로그 선형 공간에서 탐색해야하는 하이퍼 파라미터인데, 이 4개의 학습률과 4개의 가중치 감쇄값으로 총 16가지 경우의 조합을 만들수가 있게 되겠다.

 

 만약 충분한 GPU 자원이 있다면 모든 경우들을 다 돌려보고 가장 좋은 성능을 보이는 하이퍼 파라미터를 찾으면 되겠지만, 하이퍼 파라미터의 개수가 많은 경우 GPU또한 많이 필요하고 하이퍼 파라미터를 튜닝하기가 어려워 질것입니다.

 

 

 그래서 그리드 탐색 대신 사람들이 사용하는 방법으로 랜덤 탐색 random search가 이용합니다. 이 방법의 경우 여러개의 하이퍼 파라미터들을 놓고 선택해서 평가하는 그리드 탐색과는 달리 하이퍼 파라미터 값의 범위를 지정해 놓고, 매 훈련 때 마다 그 범위에 속하는 랜덤한 값을 골라 하이퍼 파라미터로 사용하는 방법이다.

 

 학습률과 가중치 감쇄 같은 하이퍼 파라미터들은 로그 선형 공간에서 탐색을 해야되겠지만 모델 사이즈나 드롭 아웃 같은 확률의 경우 로그 선형 공간 보다는 선형 공간 상에서 탐색을 해야 하는데, 이와 같이 선형 공간에서 탐색해야하는 것인지 로그 선형 공간에서 탐색해야하는지는 어떤 하이퍼 파라미터이냐에 따라 달렸다고 볼수 있겠다.

 

 아무튼 이 랜덤 탐색 방법을 사용하는 경우 각 하이퍼 파라미터마다 각자 범위를 지정하고, 학습할때마다 구한 랜덤 값을 하이퍼 파라미터로 사용하는데, 여기서 시행 착오/학습을 반복할 횟수는 만든 신경망 모델로 여유있게 훈련 시킬수 있는 만큼 해주면 되겠다. 그렇게 학습이 끝날때까지 최고의 성능이 나온 하이퍼 파라미터로 시용하면 된다.

 

 2010년 초반에 나온 논문에 따르면 랜덤 탐색과 그리드 탐색을 비교할때 비슷하게 동작하기는 하지만 랜덤 서치를 사용할때 더 좋은 하이퍼 파라미터를 찾을수가 있다고 한다. 

-> 한 논문에 따르면 랜덤 탐색이 그리드 탐색보다 하이퍼 파라미터 탐색에 좋다.

 

 탐색하고자 하는 하이퍼 파라미터가 많다고 할때, 어떤 하이퍼파라미터들은 모델 성능에 있어서 중요한 것들이 있을수도 있고, 그렇치 않은 값들도 있있겠다. 하지만 학습하기 전까지 어떤게 중요한 하이퍼파라미터이고, 중요하지 않은 하이퍼파라미터인지 알수는 없다. 

-> 다양한 하이퍼 파라미터가 있겠지만 어떤게 중요하고, 안 중요한지 알 수 없다.

 

 그래서 그리드 탐색을 사용한다면 위에서 왼쪽 그림에 나오는 그리드 파라미터를 직접 평가해볼수가 있겠다. 위 왼쪽 그림의 수평 축은 신경망 성능 최적화에 중요한 파라미터를 보여주는데, 이 분포는 다양한 하이퍼 파라미터가 주어질때 성능에 대한 주변 확률 분포를 의미하고 있다.

-> 중요한 하이퍼 파라미터와 중요하지 않은 하이퍼 파라미터가 두 타입이 있는 경우 주변 분포

 

 한번 간단한 예시를 들자면 이 수평 축에서 왼쪽으로 갈수록 낮은 성능을 보이고, 중앙에서는 높은 성능을 보이다보니 이 수평 방향의 하이퍼 파라미터가 성능 향상에 중요한 하이퍼파라미터임을 알수가 있겠다.

-> 중요 파라미터의 주변 분포에 따르면 어떤 경우 성능 향상에 기여하지 않지만 어떤 경우 크게 성능이 향상.

 

 이와 반대로 수직방향 하이퍼 파라미터는 모델 성능 개선에 크게 중요하지 않는데, 그림의 왼편에 노란색의 주변 확률 분표를 보면 이 수직 하이퍼 파라미터 값이 어떻든간에 성능에 큰 영향을 주지않는다고 볼수 있겠다.

-> 중요하지 않은 하이퍼파라미터는 어떤 값이 오든 성능 향상에 큰 변화를 주지 않음.

 

 여기서 문제점은 그리드 탐색을 할때 매 반복때마다 중요한 타입의 파라미터를 고정 시켜 놓고, 중요하지 않은 타입의 하이퍼파라미터 값을 여러 경우로 반복하다보니 그렇게 많은 정보를 얻을수가 없으며, 이 그림의 예시의 경우 중요한 하이퍼 파라미터의 값이 3가지 인 경우에 대한 경우 밖에 볼수 없게 된다. 그렇다 보니 어떻게 튜닝하는게 좋은지 충분한 정보를 얻을수가 없다.

-> 그리드 탐색은 한 타입의 하이퍼 파라미터 값을 고정시키고 다른 타입의 값을 변화시킴. 위 예시의 경우 중요 파라미터 값이 3가지인 경우 밖에 볼수가 없다.

 

 

 하지만 랜덤 탐색의 경우 매 학습/시도 때마다 수직 방향/중요하지 않은 타입값, 수평 방향/중요한 하이퍼파라미터 값을 랜덤하게 구하여 시도하므로, 하이퍼 파라미터 값의 변화에 따른 모델 성능을 주변 분포로 그린 결과(수평 방향 분포)를 같이 보면 그리드 탐색에서는 수직, 수평방향으로 정렬되어 있었다보니 정확하게 일치하지 않은 랜덤 탐색으로 보다 더 다양한 경우 결과를 얻고, 더 효과적으로 중요한 하이퍼 파라미터 값/샘플이 무엇인지 찾을수가 있겠다.

-> 그리드 탐색에서 값들이 수평, 수직방향으로 일치하다보니 중요한 하이퍼 파라미터의 값이 3가지인 경우만 볼수 있었지만 랜덤 탐색은 범위 안의 무작위 값을 사용하다보니 더 다양한 경우의 하이퍼 파라미터들을 사용할 수 있고, 더 좋은 성능을 보이는 하이퍼파라미터를 찾기 좋다.

 

 이 슬라이드를 통해서 랜덤 탐색을 하는 예시를 살펴보았고,

 

 

 

 이 예시는 3가지 모델을 가지고 학습률과 규제 강도를 평가한 예시인데, 순전파 모델과 잔차 모델, 그리고 DART라고 부르는 신경망 아키텍처로 dart에 대해서는 중요하지 않으니 넘어가자. 이 세 플롯과 한 점의 색상은 각 모델들을 학습한 뒤 나온 성능을 나타낸다. 

 

 이 그림에서 x축이 학습률이고 y축은 규제 강도로 로그 단위를 따르고 있다. 이 걸로 알수 있는 점은 두 하이퍼 파라미터 사이의 상호 관계가 단순하지 않다는걸 알수 있다. 이 그림을 잘보면 강처럼 생긴 것의 중간에 보면 가장 좋은 학습률과 규제 강도를 찾을 수가 있겠다.

 

 

중간 질문) 하이퍼 파라미터를 찾는데 경사 하강법을 사용할 수 있을까?

 

 하이퍼 파라미터를 찾는 건 아주 중요한 연구 분야 중 하나인데 이 강의의 범위를 넘어가지만 다양한 방법들이 있다. 예시를 들자면 파이토치로 파이썬 코드로 역전파를 간단하게 구현할수 있었듯이 최적화 방법를 사용하기 위해서 이너 루프와 아우터 루프를 구현하면 되는데,

 

 여기서 이너 루프는 기존 모델의 학습 파라미터를 최적화 하는데 사용하여 그라디언트를 계산하고 초기 하이퍼 파라미터값에 따른 모델 성능을 구하고. 아우터 루프는 하이퍼 파라미터의 그라디언트를 학습하는데 사용하면 된다. 이런 방식으로 하이퍼파라미터를 탐색하는 다양한 논문들이 있기는 한데 (생략)

 

 

 

 아무튼 페이스북이나 구글 등 수 많은 GPU 자원을 사용할수 있는 곳에서 일한다면 이런 하이퍼 파라미터 탐색 방법을 쓸수 있겠지만 그렇지 않은 경우 효율적인 하이퍼 파라미터 탐색 방법을 사용하여야 한다. 수 많은 하이퍼 파라미터를 탐색할 필요 없이 좋은 하이퍼 파라미터를 찾는게 가능하니 너무 걱정할 필요는 없다.

 

1. 초기 비용 확인하기

 아무튼 사용 가능한 GPU 자원이 많지 않을때 우리가 할수 있는 방법으로 첫번째 단계는 우선 신경망 모델을 구현하고 초기 비용을 확인해보자. 비용 함수에 대해서 여러가지를 이미 살펴보았고, 교차 엔트로피 같은걸 사용한다고 하면 - log(클래스 개수)로 나타낼수가 있겠다.

 

 모델을 구현한 뒤에는 가중치 감쇄를 사용하지 않고, 한번만 학습하여 초기 비용을 확인해보자. 한번만 학습 하다보니 계산량도 크지 않고 빠르게 구할수 있을건데, 비용이 잘못되어 있다면 버그가 있다고 볼수 있고 이 버그를 해결하면 되겠다.

 

 

 

2. 다양한 설정과 일부 데이터만 가지고 학습되는지 확인하기

 다음 단계로 할 일은 훈련 데이터셋의 아주 작은 샘플을 가지고 오버피팅을 시켜보는것인데, 5 ~ 10개의 미니배치를 사용하면 된다. 이 소수의 데이터를 가지고, 규제를 하지 않은 채 100% 정확도를 얻을만큼 오버피팅을 시키면 되겠다.

 

 이렇게 하면서 계층 수를 늘린다거나 학습률을 조정한다거나, 가중치 초기화 방법들을 조정해나가면서, 훈련 데이터가 적은 만큼 학습 시간도 작다보니 100 정확도에 도달하는 하이퍼 파라미터를 빠르게 찾을수가 있겠다. 만약 10개 정도의 배치 가지고 학습할수 없으면, 전체 데이터를 가지도 학습할수 없을거고 그렇지 않다면 문제가 없다고 볼수 있겠다.

 

 아무튼 이 방법으로 다양한 경우들을 여러번 반복할 수 있을 것이고 모델 아키텍처에 알맞은 최적화 설정, 하이퍼 파라미터 설정에서 버그가 되는 것들을 잡아낼수 있다. 다만 이 단계에서는 최적화 과정을 아주 작은 훈련셋 가지고 디버그 하기 위함이지 규제나 검증셋으로 일반화를 하기위한게 아니니 이런것들을 고민할 필요는 없다.

 

 

3. 적절한 학습률 찾기

 이번에는 이전 단계에서 구한 신경망 아키텍처와 훈련 데이터 전체를 사용해서 학습률을 찾아 보고 전체 학습 셋에서 비용을 빠르게 줄일수 있도록 해보겠다. 이전 단계를 통해서 우리가 구한 신경망 모델이 데이터를 잘 학습할수 있도록 설계되었는지 확인했다면, 이번 단계에서는 이전 단계에서 구한 하이퍼 파라미터를 그대로 가지고 오고, 학습률만 바꿔나가면되겠다.

 

 여기서 목표는 100번 정도 훈련 셋으로 학습해 나가면서 비용을 크게 감소시키는 것인데, 적절하게 값들이 설정되었다면 초기 비용은 매우 크겠지만 백에서 수천회 학습하는 과정에서 지수적으로 비용이 감소하게 되며, 신경망 아키텍처를 다루는 문제에서 공통적으로 이런 경향을 보인다.

 

 이 단계에서는 적절한 학습률을 찾기 위한 것이다 보니 한번 학습할때마다 수백에서 수천번 반복해도 되고, 여러 가지 경우를 반복하면서 첫 100회 반복때 가장 잘 수렴하는 학습률 값을 사용하면 된다.

 

 

4. 작은 간격으로 하이퍼 파라미터 탐색하기

 다음으로 4번째 단계에서는 일정한 아주 작은 간격의 하이퍼 파라미터를 사용하여 학습률과 감쇄률/규제강도를 탐색하는 것으로 이전 3번째 찾은 값을 중심으로 보면 되겠다. 이전 단계에서 대략적인 하이퍼 파라미터를 잘 찾은 다음 이번에는 아주 작은 구간 간격으로 적합한 값을 찾다 보니 어떤 값을 사용하던 간에 크게 나쁜 모델이 만들어지지는 않는다.

 

 전체 훈련 셋을 5~ 10 에폭 정도 학습 한 뒤에, 검증 셋으로 이 모델의 일반화 성능이 얼마나 좋은지 확인해보면 되겠다. 얼마나 작은 간격으로 하이퍼 파라미터들의 경우들을 다룰지는 여유가 되는데로 하고 결과가 어떤게 좋은지 비교해나가면 되겠다.

 

5. 하이퍼 파라미터 세부 조정, 더 길게 학습하기

 4번째 단계 다음으로는, 이전 단계에서 구한 하이퍼 파라미터 값을 더 작은 간격, 세부적으로 조정하고, 더 길게 학습해보면 된다. 이 과정에서 한 에폭마다 몇 시간에서 몇일이 걸릴지는 학습할 모델이 얼마나 크냐에 따라 달린 문제가 되겠다.

6. 학습 커브 보기

 다음으로는 학습 커브를 보고 하이퍼 파라미터를 어떻게 조정해 나갈지를 판단하면 된다.

 이 학습 커브를 보면 좌측에 있는게 학습률 비용이고, 우측 그래프가 정확도를 나타내는데, 여기 나오는 훈련, 검증 정확도를 보고 모델이 올바르게 학습되는지 나쁘게 학습되는지 판단할수 있다.

 

 이 그림은 다른 종류의 학습 커브인데, 앞에서는 평평하게 가다가 어느 시점에서 떨어지기 시작하는 형태인데, 이 경우 초기화를 잘못 시켰다고 볼 수 있다. 왜냐면 훈련 시작 당시에 제대로 학습되지 않기 때문인데, 어떻게 초기화를 시킬지 조정해서 다시 시도해보면 되겠다.

 

 

 다른 문제 상황 예시로는 비용이 처음에는 잘 줄어들었다가 어느순간부터 평탄해지는 경우인데, 이 경우 학습률 감쇄를사용해야 한다. 이 경우는 학습률이 너무 높아서 시간이 지남에 따라 제대로 수렴하지 못해 평탄해지기 때문이며, 학습률 감쇄로 학습률을 낮추면 되겠다.

이번 경우는 반대로 학습률 감쇄를 너무 빨리 사용한 경우인데, 학습률 커브가 잘 내려가다가 감쇄하는 지점이후로 완전히 평평해져버린다. 이렇게 학습률 감쇄를 너무 빨리 한 경우에는 초기 학습률로 계속 진행하고 나서 감쇄해야 되겠다. 지금까지 본 내용들은 학습률 감쇄를 했을때 훈련 비용의 이동 평균이 어떻게 되는지를 보았고,

 

 

 

  훈련, 검증에 대한 정확도 그래프로 곡선 형태에 따라 특성을 알수가 있다. 이 예시에는 시작 당시에는 지수적으로 증가하고 이후에는 천천히 선형적으로 증가하고 있는데 훈련과 검증 정확도 사이 어느정도 갭을 두고 계속 진행하는 경우에는 학습을 더 오래 해서 더 좋은 성능의 모델을 얻을수가 있다.

 

이번 예시는 오버피팅 특성을 보이는 그래프의 정확도를 보여주고 있는데, 훈련셋의 정확도는 시간이 갈수록 계속 증가하지만 검증셋의 성능은 고지점에 도달하고 나서 계속 감소하고 있으며, 훈련과 검증 정확도 사이 일정한 간격이 유지되지를 않는다. 이렇게 학습과 검증 정확도사이 간격이 증가하는 것은 오버피팅이 되고 있을을 나타내는 것이며, 이를 개선하기 위해서는 규제 강도를 높인다거나, 훈련 셋을 늘린다거나, 드문 방법으로 모델의 크기를 축소 시키는게 필요하다.

 

 이번 그래프는 훈련과 검증 성능이 거의 동일하게 좋게 나오는 경우인데, 오버피팅이 존재하지 않으므로 좋다고 볼수는 있지만 훈련 셋과 검증셋의 성능이 같다는건 데이터를 과소 적합을 한다는 의미로, 좋지 않은 신호로 볼 수 있다. 이 경우 모델 크기를 늘리거나, 규제 강도를 낮춤으로서 성능을 더 개선할수가 있겠다.

 

(질의응답 생략)

 

 이제 하이퍼 파라미터 탐색의 마지막 단계는 이런 비용 함수에 대한 곡선을 보고 어떻게 하이퍼 파라미터 구간을 설정해서 조정해나갈지를 판단해서 5번째 단계로 돌아가서 시간 여유가 있는 만큼 반복하면 되겠다.

 

300x250
728x90

작년에 정보 처리 기사 공부하면서 네트워크 분야를 억지로 대충 외운 이후에

 

다시 볼일이 없으니 네트워크에 대한 용어 개념들을 다 까먹어 버리고 말았다.

 

IP 조차 뭐였는지 가물가물해서 이에 대한 개념들을 한번 다시 복습하고자 한다.

 

 

 

IP Address가 뭐더라

 IP라는 용어를 계속 보기는 했는데, 단순히 컴퓨터의 주소 아니면 OSI 7계층 모델 네트워크 계층의 프로토콜 중 하나,  TCP/IP 4계층 모델의 인터넷 계층에 속하는 프로토콜로 이해하고 있었는데, 나오는 용어들이 계속 햇갈리더라

 

 

일단 프로토콜이 무엇인지 생각하면

 

 

프로토콜 Protocol

 프로토콜은 통신에 필요한 절차, 규약을 의미한다. 통신 과정에서 메시지를 어떻게 전달할것인지, 데이터를 어떻게 표현할것인지, 어떤 순서대로 보낼것인지 등 서로 다른 시스템끼리 커뮤니케이션, 소통을 하기 위해서 공통으로 만든 규칙같은걸 프로토콜로 이해하고 있다.

 

 

 

대략적인 개념은 맞긴 하나 위키 내용으로 관련된 개념들을 정리해 나가자

 

 

 

1. IP 주소 Internet Protocol Address

 컴퓨터 네트워크에서 서로 인식하고, 통신하기 위한 번호. 네트워크에 연결된 모든 장치는 이 번호를 가지며, 이 번호로 메시지를 전송하고, 목적지로 전달된다.

* 주의 사항 : IP 라는 단어 자체는 인터넷 프로토콜이라는 규약을 말하므로 IP와 IP address를 구분해서 보아야 한다.

 

2. IPv4, IPv6

 IPv4는 일반적으로 사용하는 아이피주소로 주소의 범위는 32비트로 0 ~ 255사이의 십진수 네개로 표현하며 사이에 '.'으로 구분한다. 그래서  0.0.0.0 ~ 255.255.255.255까지의 범위를 가지며 이론적으로 42억9496만개 정도가 있는데, 이 중에서 일부 번호, 주소는 특별한 용도로 예약되어 있으며 대표저거으로 127.0.0.1은 로컬 호스트로 자기 자신을 가리킨다.

 

 IPv6는 모든 장치에 32비트 주소를 부여하기에는 부족하여 나온 아이피 주소로 128bit로 크기가 늘었으며, 일반적으로 두 자리 16진수를 :구분자로 8개를 쓴다.

ref : 

 

 

2. DNS Domain Name Servise

 아이피 주소는 통신하기 위한 번호이지만 사람들이 기억하고 외우기는 어려운 단점이 있다. 이런 숫자로 식별된 주소와 사람이 인식하기 쉬운 주소인 도메인 주소를 변환해주도록 하는 서비스를 말한다. 

* 알파넷 시절 네트워크에 연결된 모든 컴퓨터들의 숫자 주소와 호스트 이름들을 HOSTS.txt라는 텍스트 파일에 저장하여 관리했었다고 한다.

ref : ko.wikipedia.org/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8_%EB%84%A4%EC%9E%84_%EC%8B%9C%EC%8A%A4%ED%85%9C

 

 

3. 인터넷 프로토콜 IP : Internet Protocol

 송신 장치/호스트와 수신 장치/호스트가 서로 패킷 교환 네트워크에서 정보를 주고받는데 사용되는 규약으로 OSI 7계층에서 호스트 주소 지정과 패킷 분할, 조립을 담당. IP 정보는 패킷 혹은 데이터 그램이라고 하는 덩어리로 나누어져 전송되며. 제대로 전송되었는지 신뢰할수 없는 비신뢰성을 가진다.

ref : ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

 

4. 패킷 교환 Packit switching

 컴퓨터 네트워크 상에서 통신 방식 중 하나로 가장 널리 사용되는 통신 방법. 데이터를 여러개의 작은 블록인 패킷으로 나누어서 다른 경로들로 경로 제어가 되는 방식. 자원을 패킷 단위로 분할하여 사용해서 효율적임.

ko.wikipedia.org/wiki/%ED%8C%A8%ED%82%B7_%EA%B5%90%ED%99%98

 

5. 패킷과 교환 방법

 하나의 파일은 패킷 교환망에서 전송되기 위해서 작은 크기의 데이터들로 나누어지고, 각 개별 데이터는 발신 주소와 목적 주소가 추가되어 하나의 패킷이 됨. 이러한 패킷들이 목적지로 경로 제어(라우팅)을 통해 보내지고, 목적지에 도착후 패키지들을 원래의 파일로 복원시키는 작업을 한다.

 

6. 가상 회선 방식 Virtual Circuit

 관련된 패킷들을 서로 다른 경로가 아닌 모두 같은 경로를 통해 전송하는 방법

 

7. 패킷의 구성

 패킷의 구성 요소로 1) 전송하고자 하는 데이터 블록/일부분인 페이로드 payload와 2)주소지 정보(발신지, 목적지 주소), 관리 정보(헤더, 망이 패킷을 목적지까지 보내는데 필요한 내용)을 가지고 있다. 

 

8. 회선 교환망 circuit switched network

 독립된 장치들의 1:1 연결을 회선circuit/채널 channel이라고 부르는데, 발신자와 수신자가 통신을 하기 이전에 미리 전용 연결/회선을 준비/설정하여야 하는 네트워크를 회선 교환망이라고 부른다. 

 

 

 

 

 

 

 

9. 회선 교환과 패킷 교환의 차이

- 회선 교환의 경우 출발지 부터 목적지까지 실제 물리적 회선이 연결되지만, 패킷 교환 방식에선 물리적인 회선이 존재하지않는다.

- 회선 교환 방식은 모든 패킷이 동일한 경로를 따라가나, 패킷 교환 방식에선 각 패킷들이 서로다른 경로로 목적지에 간다.

- 패킷 교환 방식은 보내야 할것들이 적은 경우 모든 대역폭을 사용하지 않아 대역복 낭비를 하지않아 효율적이다.

 

 

 

 

apposite-tech.com/blog/packet-switching-vs-circuit-switching/

 

 

 

10. 넷 마스크 Netmask

 IPv4 아이피 주소에서 네트워크 주소와 호스트 주소를 구분하는 32비트로된 마스크. 예시로 11111111 11111111 11111111 00000000의 경우 8비트 4개로 이루어진 마스크로 10진법 표기시 255.255.255.0으로 클래스 C의 호스트 주소만 부분망/서브넷으로 분리하여 선택하는 부분망 마스크/서브넷마스크임.

terms.naver.com/entry.nhn?docId=864414&cid=42346&categoryId=42346

 

11. 부분망/서브넷 Subnet

 아이피주소를 네트워크 부분과 호스트 부분으로 구분하기 위해 사용하는 마스크. 아이피 주소와 서브넷 마스크를 and 연산을 한 결과가 네트워크 부분이 되며, 나머지 부분은 호스트 부분이 된다.

ko.wikipedia.org/wiki/%EB%B6%80%EB%B6%84%EB%A7%9D

 

 

 

12. 게이트웨어 Gateway

 일반적으로 다른 네트워크, 통신망과 연결할수 있는 통로/출입구를 게이트웨이라고 말하며, 네트워크 내 통신을 제어하는 컴퓨터와 ISP 게이트웨이 노드가 있다. 그리고 게이트웨이 노드는 프록시 서버나 방화벽 서버로도 동작한다.

 

 라우터와 동일한 개념으로 볼수 있는데, 라우터도 다른 네트워크를 연결한다는 점에 게이트웨이라고 볼 수 있다. 가장 흔하게 볼 수 있는 게이트에이로 인터넷 공유기가 있는데, 로컬 네트워크 통신과 외부 인터넷에서의 통신 프로토콜이 다르기 때문이며 게이트 웨이/라우터/방화벽 모든 역활을 동시에 하는 장치라고 볼 수 있겠다.

terms.naver.com/entry.nhn?docId=3572665&cid=59088&categoryId=59096

 

 

13. 라우터, 라우팅

 네트워크 전송 최소 단위인 패킷을 목적지에 보내기위해 최적의 경로를 찾아주느 기기, 최적의 경로를 찾아내는 과정으로 가장 짧은 시간에 전송할수 있는 경로를 말함. 

 

 

 

14. OSI 모형

 국제 표준화 기구 ISO에서 개발한 네트워크 프로토콜을 다양한 계층으로 나누어 설명하는것으로 OSI  7계층이라고 부른다. 이 모델을 프로토콜을 기능별로 나누었다.

제 1 계층  물리 계층 : 은 네트워크 하드웨어 전송 기술로. 어떤 기술로 물리적으로 연결시킬지 다룸.

     ex ) RS-232, V.35, ISDN

제 2 계층 데이터 링크 계층 : 네트워크에 존재하는 장치간에 논리적인 연결을 보장하기 위한 오류 제어와 흐름제어를 담당하는 계층.

     ex ) ethernet

제 3 계층 네트워크 계층 : 출발지에서 목적지까지 경로를 찾아주기 위한 계층으로 라우딩, 흐름 제어, 세그멘테이션, 오류 제어 등을 수행함.

     ex ) 라우터, 스위치, IP, ICMP

제 4 계층 전송 계층 : 엔드투 엔드 장치간 신뢰성 있는 데이터를 주고 받을수 있도록 하기 위한 계층으로 오류 검출, 흐름제어, 중복 검사 등       ex ) TCP, UDP

제 5 계층 세션 계층 : 엔드 투 엔드 장치간 연결이 성립이 되었을때 통신 연결 상황인 세션을 관리하기 위한 계층으로 동시 송수신,

                            반이중 방식, 전이중 방식이나 유휴, 종료, 다시시작 등 수행

제 6 계층 표현 계층 : 코드 간의 번역을 담당하며 시스템 간에 서로 다른 표현을 사용하면서 생기는 차이들을 처리해주는 계층으로. 간단한  

                            예시로 EBCDIC로 인코딩 된 문서 파일을 아스키로 인코딩된 파일로 바꿔주는일도 표현 계층의 일임.

제 7 계층 응용 계층 : 응용 프로세스와 같이 활용하여 서비스를 수행하는 계층. 대표적인 응용서비스로 텔넬, 메일 등

      ex ) HTTP, SMTP, FTP, SNMP, TELNET

 

ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95

 

 

 

 

15. RS-232

 1960년에 재정된 PC와 모뎀 등 다양한 장치들을 연결하기 위한 직렬 방식의 인터페이스. 인터페이스를 포트라고도 부르며 일반적으로 직렬 포트라고 부른다. 원래 터미널 단말기와 모뎀 접속용으로 사용된 것을 텔레타이프라이터와 PC같은 데이터 단말 장치 DTE와 모뎀 같은 데이터 회선 종단 장치 DCE를 접속시켜 데잍전송할 수 있도록 전기, 기계적 특성을 정의한 것.

RS-232 25핀 커낵터(DB25)

 25핀 단자 규격은 단말장치가 아니라 모뎀쪽 연결기 규격으로 정해져있어 모뎀에 붙어있는 경우가 많다. 가장 널리 이용되는 규격으로는 IBM사가 만든 9핀 단자/직렬 포트가 있겠다.

 

 하지만 이 규격은 오래된 인터페이스이며, 최근에는 USB나 이더넷이 역활을 대체하고 있다. 하지만 노이즈에 큰 영향을 받지 않고 멀리 신호를 전달하며, 단순하기때문에 아직까지도 유용하게 사용된다.

ko.wikipedia.org/wiki/RS-232

 

 

 

16. 직렬포트 Serial Port

 컴퓨터 환경에서 말하는 직렬 포트란 한번에 하나의 비트 단위로 정보를 주고 받을수 있는 직렬 통신을 위한 물리적인 인터페이스를 말한다. 이더넷, USB와 같은 인터페이스 방식들도 직렬스트림으로 데이터를 전달하지만. 직렬 포트라는 이름은 일반적으로 RS-232표준을 따르는 하드웨어를 가르킨다. 원래 주변 장치와 연결할 목적으로 개발되었으나 USB가 등장해서 사용되지 않고, 네트워크에서는 이더넷이 사용되고 있다. 

직렬 포트에 쓰이는 DE-9 수 단자

ko.wikipedia.org/wiki/%EC%A7%81%EB%A0%AC_%ED%8F%AC%ED%8A%B8

 

 

m.blog.naver.com/hatesunny/220790654612

17. 이더넷 Ethernet

 네트워크 기술 중 하나로 많이 사용되는 규격으로 OSI 모델 물리 계층에서 신호와 배선, 데이터 링크 계층에서는 MAC 패킷과 프로토콜 형식 정의. 이전의 토큰 링이나 FDDI 등을 대체하여 사용되고 있다.

 

 이더넷은 네트워크에 연결된 각 기기들이 48비트 길이의 고유의 맥 주소를 가지고 있고, 이 주소로 서로 데이터 주고받을수 있도록 만들어 졌다. 전송 매체로 UTP, STP 케이블을 사용하며 각 장치를 연결시키는데 허브, 스위치, 리피터 등이 사용된다.

 

 이더넷은 주로 CSMA/CD 반송파 감지 다중 접속 및 충돌 탐지 기술을 사용하여 여러 컴퓨터들이 하나의 전송 매체를 공유할수 있게 되었다.

 

 

 

18. IP 주소 클래스

 IP 주소는 0.0.0.0 ~ 255.255.255.255까지 있지만 5개의 클래스로 정의하여 효율적인 관리가 가능하다.

A Class : 맨 앞이 0인 경우 0.0.0.0 ~ 127.255.255.255, 기본 서브넷 마스크가 255.0.0.0인 클래스. 호스트 아이디는 2의 24제곱

B Class : 맨 앞이 10인 경우. 128.0.0.0 ~ 191.255.255.255 . 기본 서브넷 마스크가 255.255.0.0인 클래스. 호스트 아이디는 2의 16제곱

C class : 맨앞이 110인경우. 192.0.0.0 ~ 223.255.255.255. 기본 서브넷 마스크가 255.255.255.0인 클래스. 호스트 아이디는 2의 8제곱

D Class : 맨앞이 1110인경우 224.0.0.0 ~ 255.255.255.255. D 클래스는 멀티캐스트 주소로 예약되어있어 서브넷 마스크를 사용안함.

E Class : 맨앞이 1111인 경우 240.0.0.0 ~ 255.255.255.255. 브로드캐스트 주소로 예약됨.

 

 

19. 맥 주소 Mac address

 각 네트워크 장치가 가지고 있는 고유의 물리적인 주소로 12자리 숫자로 구성. 앞의 6자리(24비트)는 벤더(제조사), 뒤의 6자리(@5비트)는 각 벤터 제품 번호. 컴퓨터 네트워크 장치들을 구분하기 위한 식별 번호로 논리적인 주소인 아이피 주소를 할당 받기 위해서는 맥 주소가 필요하다.

 

20. 유니캐스트, 브로드캐스트, 멀티캐스트, 애니캐스트

유니캐스트 : 출발지와 목적지가 1:1 대응인 일대일통신

브로드캐스트 : 같은 네트워크에 있는 모든 장치들에게 보내는 통신

멀티 캐스트 : 여러 명에게 보내는 일대다 통신

애니캐스트 : 가장 가까이 위치한 장치, 노드와 통신하는 방식

 

19. 네트워크 아이디, 호스트 아이디

 네트워크 아이디란 아이피 주소의 호스트 부분이 모두 0인 아이디 . 이 네트워크를 나타내거나 라우팅 경로로 사용하기 위한 예약된 값이라 설정이 불가. 192.168.1.1/24라는 주소가 있을 때, 192.168.1.0(24비트, 네트워크 아이디), 1(8비트, 호스트 아이디).

 

20. 서브넷 브로드캐스트 주소

 네트워크 아이디 호스트 부분의 값이 (모두 이진수에서 1인) 255인 주소를 말한다. 아이피 주소가 192.168.1.1/24인 경우 네트워크 아이디가 192.168.1.0이며, 서브넷 브로드캐스트 주소는 192.168.1.255가 된다. 이 네트워크 아이디와 서브넷 브로드캐스트 주소 2개를 뺀 나머지  IP주소가 실제 사용가능하다.

 

21. 가구 주문으로 보는 네트워크 아이디와 호스트아이디 그리고 서브네팅

 홍대리라고 하는 사람이 장롱이 필요해 가구를 주문했는데, 배달원이 주소를 보고 "부산 광역시 해운대구 우동 792번지"인걸 확인하고 가구를 가져왔다. 하지만 어디에 두어야 될지를 몰라 홍대리에게 물어보았고, 홍 대리는 방 한쪽 구석을 가리키며 정확한 위치를 알려주었다. 홍대리 집까지 오기위한 주소를 네트워크 아이디, 방 한쪽 구석이라는 정확한 위치를 안내하는데 사용되는게 호스트 아이디의 역활이 된다.

 

 하나의 아이피 주소는 네트워크 아이디 + 호스트 아이디로 구성된다. 서브넷 마스크로 네트워크 아이디를 높이거나, 호스트 아이디를 줄임으로서 네트워크아이디와 호스트아이디를 보고 목적지가 어느 네트워크에 속하는지를 알 수 있다.

korean-daeddo.blogspot.com/2015/12/ip.html

 

 

22. 공인아이피와 사설 아이피

공인아이피 Public IP Address : 인터넷 서비스 제공자로부터 임대받아 사용할수 있는 주소

사설 아이피 Private IP Address : 공적 환경이 아닌 사설/내부 환경에서 사용하는 주소로 인터넷 서비스제공자로부터 임대받지 않아도 사용할 수 있다.

A Classs : 10.0.0.0 ~ 10.255.255.255

B Class : 172.16.0.0 ~ 172.31.255.255

C Class : 192.168.0.0 ~ 192.168.255.255

 

 

23. DHCP Dynamic Host Configuration Protocol 동적 호스트 구성 프로토콜

 호스트 아이피 구성 관리를 단순화 하기 위한 아이피 표준안으로 DHCP서버가 아이피 주소와 기타 환경 정보들을 클라이언트들에게 동적으로 할당하는 방법이 정의되었다. 

 

 역사로 1984년 옛날 장치들이 적절한 아이피 주소를 받을수 있도록 역순 주소 결정 프로토콜 RARP가 도입되었으나 데이터링크 계층에서 수행되다보니 다양한 서버 플랫폼에서 구현하기 힘들었으며 개별 네트워크 링크에서만 존재했었다. 하지만 1985년 BOOTP가 이를 대신하는데, 릴레이 에이전트 개념이 되어 BOOTP  패킷 포워드를 허용하여 중앙 BOOTP 서버가 수많은 서브넷 호스트들을 서비스하는게 가능해졌다. 이후 1993년 BOOTP를 기반으로한 DHCP가 나왔는데, 커넥션 풀로 아이피 주소들을 동적으로 할당하고 사용하지 않는 경우 회수하거나 다양한 추가적인 설정들을 클라이언트에게 전달하는데 사용할수 있게 되었다.

 

 다시 정리하자면 DHCP는 동적 호스트 구성 프로토콜로서 클라이언트/사용자에게 네트워크에 접속할 수 있도록 정해진 규칙으로 DHCP 서버는 클라이언트에게 IP 주소와 필요한 설정 정보들을 자동적으로 할당하는 역활을 수행한다. 

ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

 

300x250

'컴퓨터과학 > 통신, 보안' 카테고리의 다른 글

해킹 - 7. 이미지 해킹  (0) 2020.07.30
해킹 - 6. 키보드 후킹  (0) 2020.07.29
해킹 - 5. 후킹  (0) 2020.07.29
해킹 - 4. 윈도우 어플 해킹 개요  (0) 2020.07.29
해킹 - 3. 관련 용어  (0) 2020.07.28
728x90

5.1.4 K 폴드 교차검증의 편향-분산 트레이드 오프

 

 5.1.3에서 언급하다시피 k < n인 k-폴드 교차검증은 LOOCV보다 계산에 있어서 이점을 가지고 있는데, 계산 이점 이외에도 LOOCV보다 테스트 에러를 더 정확하게 구할수 있다는 장점이 있습니다. 이 이유는 편향 분산 트레이드 오프와 관련이 있다.

 

 5.1.1에서 검증셋 방법의 경우 전체 데이터셋의 절반을 훈련 셋으로 사용하고 나머지 절반을 검증 셋으로 사용하다보니 실제 테스트 에러율을 과대추정 한다고 했었다. LOOCV는 n - 1개의 데이터를 훈련셋으로 사용하다보니 테스트 에러율의 불편향적인 추정량 unbiased estimates of the test error을 구한다고 볼수 있겠다

 

 k = 5/10인 경우의 k-폴드 교차검증을 하는 경우에는 훈련셋은 (k - 1)n/k 개로 LOOCV보다는 적지만, 검증 셋 방법에서 전체의 절반을 훈련셋으로 사용한것보다는 많다. 그러므로 편향 축소의 관점에서 본다면 LOOCV는 k-fold 교차 검증보다는 더 낫다고 볼수 있겠다.

-> LOOCV는 대부분의 학습 셋가지고 추정을 하다보니 

(k - 1) n / k개를 가지고 학습하는 k-fold보다 더 정확, 더 적은 편향, 불편향 추정량을 구한다.

-> k-fold 한 모델은 LOOCV보다 적은 데이터를 가지고 학습하므로 편향적인 추정량을 구한다.

 

 하지만 추정 과정에서는 편향 말고도 분산/변동이 얼마나 큰지도 고려하여야 한다. LOOCV는 k-폴드 교차검증보다 변동이 더 크다고 할수 있는데, 왜 그럴까? 한번 LOOCV를 수행하면 n개의 훈련된 모델들의 결과를 평균으로 구하였었는데 이 n개의 모델들은 n - 1개의 데이터로 학습하다보니 실제와 거의 동일한 데이터셋으로 훈련되었었다. 그래서 이 모델의 결과들은 매우 상관관계를 가지며/서로서로 비슷할수 밖에 없다.

 

 하지만 k-폴드 교차검증의 경우 각 모델의 훈련셋의 겹치는 부분이 LOOCV보다는 적다보니, 각 모델들끼리 상관관계를 덜 가지는 모델들의 출력을 평균으로 구한다. 상관관계가 큰 값들로 평균을 구한 경우 덜한 경우로 평균을 구한것 보다 변동/분산이 더크다보니, LOOCV가 k-폴드 교차검증으로 테스트 에러 추정량을 구한것보다 더 큰 변동/분산을 가지게 된다.

-> LOOCV의 학습에 사용하는 데이터셋은 전체 데이터셋에 가깝다보니 변동에 잘 대처를 하지못함 -> 더 큰 분산

-> K-폴드 CV는 각 모델들의 훈련셋이 겹치는 부분이 LOOCV보다 훨씬 적음 -> 다양한 모델들 -> 더작은 분산

 

 정리하자면 편향-분산 트레이드오프는 k-폴드 교차검증에서 k를 무엇으로 지정하느냐에 따라 달린 문제인데, 이런 것들을 고려해서 k = 5 혹은 k = 10을 지정한경우 테스트 에러율은 아주 큰 편향이나 아주 큰 분산/변동의 영향을 덜 받게 된다.

 

 

 

 

5.1.5 분류 문제에서의 교차 검증 Cross-Validation on Classification Problems

 

 이번 장에서는 회귀 문제에서 출력 Y가 양적 변수인 경우의 교차 검증을 사용하였고, 테스터 에러의 척도로 MSE를 사용하였다. 하지만 교차 검증은 Y가 질적 변수인 분류 문제에서도 유용하게 사용할 수 있는데, 테스트 에러율을 구하는데 MSE 대신 오분류 횟수를 사용하여 측정할 수가 있겠다. 예를 들어 분류 문제에서 LOOCV 에러율은 아래와 같이 구할 수 있다.

 여기서 $Err_{i}$ = I($y_{i}$ $noteq$ $\widehat{y}_{i}$) 이다. k-폴드 교차 검증의 에러율, 검증셋 에러율도 이걸 조금 고쳐서 정의할수가 있겠다.

 

그림 5.7 그림 2.13에서 본 이차원 분류 데이터를 로지스틱 회귀 모델로 학습한 결과. 보라색 점선이 베이즈 결정경계, 검은 선은 선형, 이차, 삼차, 사차로 추정한 로지스틱 회귀 결정 경계. 네 로지스틱 회귀 모델의 테스트 에러율은 각각 0.201, 0.197, 0.160, 0.162, 그리고 베이즈 에러율은 0.133 

 예를 들어 그림 2.13에서 봤던 2차원 분류 데이터를 학습하는 로지스틱회귀 모델을 사용한다고 하자. 그림 5.7의 왼쪽 위 판낼에서 검은색 선은 이 데이터를 로지스틱 회귀 모델로 학습시켜 구한 결정경계이다. 이 데이터는 시뮬레이션된 데이터이다보니 실제 테스트 에러율을 계산할수 있고, 구한 결과가 0.201인데, 베이즈 에러율인 0.133보다 크다.

 

 기본적인 로지스틱 회귀 모델은 베이즈 결정 경계만큼 유연성을 가지지 못해 비선형 결정 경계를 가질 수 있도록 입력 변수들의 다항식에 대한 함수로 확장을 해서 회귀를 하였는데, 3.3.2장에서 이전에 했었었다. 여기서 이차 로지스틱 회귀 모델을 만든다고 하면 아래와 같이 구할수가 있다.

 그림 5.7 오른쪾 위 판낼에서는 곡선의 결정 경계가 나오고 있는데 이전보다 테스트 에러율이 0.197로 약간만 증가하였다. 그림 5.7 아래 왼쪽 판낼을 보면 입력 변수에 대한 삼차적 곡선으로 로지스틱 회귀 모델을 학습하다보니 결과가 더 개선되었고, 테스트 에러율이 0.160으로 더 줄어들었다. 하지만 오른쪽 아래의 4차 다항식으로 확장시킨 경우 테스트 에러율이 약간 증가하고 말았다.

 

 현실에서는 실제가지고 있는 데이터로는 베이즈 결정 경계와 실제 테스트 에러율을 알 수가 없다. 그러면 그림 5.7에서 본 4가지 로지스틱 회귀 모델들 중에서 어떤걸 골라야 할까? 여기서 교차 검증을 사용하면 된다.

 

 

그림 5.8 그림 5.7에서 본 2차원 분류 데이터의 테스트 에러(갈색), 훈련 에러(파랑), 10-폴드 교차검증 에러(검정). 왼쪽 : 입력 변수의 차수에 대한 함수를 사용한 로지스틱 회귀. 다항 차수는 x축에 표기됨. 우측 : 여러 K값을 사용한 KNN분류기.

 

 그림 5.8의 왼쪽 판낼을 보면 검은색은 10-폴드 교차검증 에러율이고, 실제 테스트 에러율은 갈색, 훈련 에러율은 파란색이다. 이전에 봤다 시피 훈련 에러율은 유연성이 증가할수록 감소하는 경향을 보인다.(그림에서 볼수있다시피 테스트 에러율은 단조롭게 쭉 감소하지는 않지만 전체적으로 모델 복잡도가 증가할수록 감소하는 경향이 있다.)

 

 이와 반대로 테스트 에러율은 U자 형태를 보이는데, 10-폴드 교차검증 에러율은 실제 테스트 에러율을 잘 근사하고 있는것을 볼 수 있다. 테스트 에러율을 약간 과소추정을 하고 있지만, 실제 테스트 에러의 경우 4차 다항식일때 최소가 되고, 교차 검증으로 구한 결과 3차 다항식을 사용한 경우 최소가 되며 실제 테스트 커브의 최소 지점과 상당히 가까운걸 알수 있겠다.

 

 그림 5.8의 오른쪽 판낼에는 KNN 분류기를 사용한 경우의 3가지 커브를 보여주고 있다. 여기서 x축은 K를 사용했는데 CV 폴드 갯수 대신 최근접 이웃의 개수가 되겠다. 훈련 에러율은 복잡도/유연성이 증가할수록 감소하고 있으며, 훈련 에러율을 가지고 최적의 K를 찾는데 도움이 안된다고 볼수 있겠따. 교차 검증 에러 곡선의 경우 실제 테스트 에러를 과소 추정을 하고 있지만, 실제 최적의 K에 매우 가까운것을 알 수 있다.

 

 

 

 

5.2 부트스트랩 Bootstrap

 

 부트스트랩 Boostrap은 널리 사용되며 아주 효과적인 통계적 방법으로 사용하려는 통계적 학습 기법의 추정량이 얼마나 불확실한지 uncertainty를 측정하는데 사용할 수 있다. 간단한 예를 들자면 부트스트랩은 선형 회귀 모델의 계수 표준 오차를 추정하는데 사용할 수 있는데,  R 같은 통계 소프트웨어로 표준 오차같은 것들은 자동적으로 계산해주다보니 선형 회귀 모델에 대해서 이렇게는 잘 사용하지는 않지만, 부트스트랩의 강점은 통계 소프트웨어로 자동으로 계산할수 있는 출력이 아니거나 변동성을 구하기 힘든 경우를 포함하여 다양한 통계적 학습 기법에서 널리 쉽게 사용할수 있다는 점이다.

 

 이번 장에서는 간단한 모델로 어떻게 최적의 투자를 할지 결정하는 간단한 예시에서 부트스트랩을 사용하여 보자. 5.3장에서는 선형 회귀 모델의 회귀 계수들의 변동성을 평가하기 위해 부트스트랩을 사용하겠다.

 

 일단 고정된 소지금을 수익을 내는 두 금융 자산 X, Y에 투자한다고 하자. 여기서 X, Y은 양적 변수이다. 그리고 총 금액에 X에 투자한 비율을 $\alpha$, Y에 투자한 비율을 1 - $\alpha$라고 한다. 두 자산의 수익 사이에는 변동성이 존재하므로 투자에 전체 리스크, 분산을 최소화 하는 $\alpha$를 구하고자 한다.

 

 다시 말하면 Var($\alpha$ X + (1 - $\alpha$) Y)를 최소화 하고자 하는것이며, 이 리스크를 최소화 하는 $\alpha$를 아래와 같이 정의할수 있다. $\sigma^{2}_{X}$ = Var(X), $\sigma^{2}_{Y}$ = Var(Y),  $\sigma_{XY}$ = Cov(X, Y).

 

 실제 $\sigma^{2}_{X}$, $\sigma^{2}_{Y}$, $\sigma_{YX}$에 대한 값은 알 수 없으므로, 이 세 값에 대한 추정치인 $\widehat{\sigma}^{2}_{X}$, $\widehat{\sigma}^{2}_{Y}$, $\widehat{\sigma}_{XY}$를 이전의 X, Y에 대한 데이터들로 계산 하여야 한다. 그러면 아래의 식으로 투자 변동성을 최소화 시키는 $\alpha$ 추정량을 아래와 같이 구할수 있겠다.

 

 

그림 5.9 각 판낼들은 X, Y 투자에 대한 100개 수익 데이터들을 보여줌. 왼쪽 위 부터 오른쪾 아래까지 알파값 추정량은 0.576, 0.532, 0.657, 0.651

 그림 5.9은 시뮬레이션 데이터로 $\alpha$를 추정하는 과정을 보여주는데, 각 판낼에는 X, Y에 투자시 수익에 대한 100개의 데이터로 $\sigma^{2}_{X}$, $\sigma^{2}_{Y}$,  $\sigma_{XY}$에 대한 추정량을 식 (5.7)에 대입하여 $\alpha$의 추정치를 구하였다. 각 시뮬레이션된 데이터셋으로 추정한 $\widehat^{\alpha}$는 0.532 ~ 0.657가 되겠다.

 

 그러면 여기서 $\alpha\ 추정량이 얼마나 정확한지 측정하고 싶을텐데, $\widehat{\alpha}$의 표준 편차를 추정하기 위해서는 X, Y 쌍 100개 가지고 $\alpha$의 추정량을 계산하는 과정을 1000번 반복하면 된다. 그렇게 $\alpha$ 추정량 1000개 $\widehat{\alpha}_{1}$, . . . , $\widehat{\alpha}_{1000}$을 구하면 된다.

 

왼쪽 : 모 집단 true population으로부터 생성시킨 1000개의 시뮬레이션 데이터셋으로 추정한 알파값들의 히스토그램, 중앙 : 하나의 데이터셋으로부터 1000개의 부트스트랩 샘플들을 구하여 추정한 알파값들의 히스토그램, 우측 : 왼쪽과 중앙의 알파값 추정량에 대한 박스 플롯. 각 판낼에서 분홍색인 실제 알파값을 나타내고 있다.

 그림 5.10의 왼쪽 판낼은 각 추정치의 히스토그램을 보여주고 있다. 여기서 사용한 시뮬레이션의 파라미터들은$\sigma^{2}_{X}$ = 1, $\sigma^{2}_{Y}$ = 1.25,  $\sigma_{XY}$ = 0.5로 설정되어 있고, 실제 $\alpha$값은 0.6이다. 이 실제 알파값은 히스토그램에서 수직선으로 표시해 두었다. $\alpha$ 추정량 1000개의 평균을 구한 결과는 아래와 같으며 실제 $\alpha$ = 0.6에 가까운 결과를 얻을수가 있다.

 그리고, 이 추정량의 표준편차는 아래와 같으며 $\widehat{\alpha}$ : SE($\widehat{\alpha}$) $\approx$ 0.083으로 꽤 정확한 결과를 얻었다고 볼수 있겠다.

  

 정리하자면 모 집단으로 구한 샘플들로 추정한 결과 $\widehat{\alpha}$와 $\alpha$의 차이가 평균적으로 0.08정도 밖에 되지않는다고 볼수있다.

 

 하지만 현실에서는 모집단으로부터 새 샘플들 그러니까 실제 데이터를 구할수 없다보니 위 SE($widehat{\alpha}$)를 추정하는 과정을 사용할 수 없다. 하지만 부트스트랩 방법을 이용해서 새로운 샘플 셋을 얻는 과정을 모방해서 계산할수가 있고, 별도로 샘플들을 생성하는 과정 없이 $\widehat{\alpha}$의 변동을 추정할수가 있다.

 

정리

-> 위 내용은 추정량의 불확실한 정도를 표준 편차로 계산하는 과정을 정리함

-> 모집단, 파라미터를 알고 있어 데이터를 생성하여 표준 편차, 불확실성을 계산할 수 있었슴.

-> 하지만 현실에서는 모집단을 모르는 경우가 많으며, 표준편차, 불확실성을 계산할수가 없음

=> 부트스트랩으로 여러 셋을 생성하고, 각 셋들의 추정량들의 평균으로 표준편차, 불확실성을 계산한다.

 

 

부트스트랩이란

 부트스트랩은 모집단으로부터 독립적인 데이터셋을 여러번 구하는게 아니라 원본 데이터셋에서 여러번 데이터를 샘플링을 해서 서로 다른 데이터셋들을 얻는 방법이다.

 

그림 5.11 데이터 3개뿐인 데이터셋가지고 부트스트랩 방법을 사용하는 예시. 각 부트스트랩 데이터셋은 데이터가 3개이며, 원본 데이터셋으로부터 샘플을 뽑아 만들었다. 각 부트스트랩 데이터셋은 알파 추정값을 구하는데 사용된다.

 

 이후에도 추가적인 내용이 있으나 부트스트랩에 대해서는 여기까지 

 

300x250

+ Recent posts