인공지능 일기

AIFFEL 과정 8주차 정리

JadenM 2021. 2. 19. 15:37

연휴에 며칠을 쉬면 이번 주는 활기차게 보낼 수 있을 거라 생각했건만

 

해커톤의 여파가 채 가시지도 않은채 명절을 맞이하게 되면서

 

오히려 마음이 더 붕 뜬 채로 이번 한 주를 보내게 된 것 같다.

 

집중이 잘 되지도 않고 몸이 막 간질거리는 느낌이다.

 

 

그런 와중에도 이번 주 학습을 진행했으니

 

그에 대한 정리를 아래에 해볼까 한다.

 

 


2월 15일
월요일
[Fundamental]
웹에서 데이터 가져오기
웹과 통신에 관한 노드였다.
노드에서는 웹의 구조와 통신에 대한 기초 지식을 배우고 이를 바탕으로 파이썬 프로그래밍을 이용해서 웹 데이터에 접근하여 그 데이터를 가져오는 방법에 대해 알아보았다.
이 노드를 통해 웹에 관한 개념들을 많이 접하게 되었는데 뭔가 친숙한 듯 하면서도 어려운 느낌이었다. 그 개념들을 정리하자면,

-Communication(통신): 데이터를 보내고 싶은 곳에 원격으로 전송하고 다시 데이터를 수신받는다.

-HTTP(HyperText Transfer Protocol): 하이퍼텍스트 전송 프로토콜

-Protocol(프로토콜): 통신 규약

HyperText: 독자가 즉시 액세스 할 수 있는 다른 텍스트에 대한 참조(하이퍼 링크) 가 있는 기계(컴퓨터, 등)에 표시되는 텍스트

이번 노드를 통해 웹에 대한 새로운 내용을 알게 되었다. 웹이란 인터넷 서비스 중의 하나이며, Web 브라우저를 통해 인터넷상에 있는 정보들을 쉽게 얻고 보낼 수 있다는 것이었다. 웹과 인터넷은 같은 개념인 줄로만 알았는데 그런 편견의 틀을 깰 수 있는 계기가 되었다. 그리고 웹의 내용을 긁어오는 크롤러를 이용해서 웹에 있는 날씨정보, 환율정보 등의 데이터를 불러와 파이썬을 이용해 데이터를 분석해 보는 것도 신기하고 재밌었다. 앞으로 웹을 통한 데이터 분석을 많이 하게 될 수도 있으니 이번 노드를 복습하면서 그 개념들을 잘 익히도록 해야겠다.

[Flipped School-deepML]
CS231 8강
CNN Architectures
이번 주에 진행한 cs231 강의는 제 8강으로, CNN Architecture에 관한 내용을 담고 있었다. 지난 7강 때에 미리 CNN의 구조에 대해 살펴 보았기 때문인지, 내용이 생소하게 느껴지지도 않았던 것 같다. 강의에서는 2012년 이후부터 Imagenet Classification Challenge 에서 우수한 성적을 거둔 CNN 모델들에 관한 소개 및 설명을 해주었다.

2012년에 나온 AlexNet은 이전의 모델보다 무려 8~9%나 높은 정확도인 16.4%의 오차율을 출력함으로써 세간의 관심을 받게 되었다고 한다. 지금까지 AlexNet이 46,510번 세계 각각에서 인용되었다고 한다. 이를 1859년에 발표된 다윈의 '종의 기원' 이 50,007번 인용된 것과 비교해 봤을 때 엄청난 수치가 아닐 수가 없다. 아직 발표된 지 10년도 채 되지 않았으니 말이다.

AlexNet이 출범함에 따라 이를 개선한 모델들이 매년 줄을 이어 등장하게 되었는데, ZFNet(2013), VGG(2014), GoogLeNet(2014) 그리고 ResNet(2015)이다.  이 모델들은 매년  Imagenet Classification Challenge에서 높은 정확도를 출력해 우수한 성적을 거두었고 2015년에 발표된 ResNet의 경우, 오차율을 무려 3.6%까지 줄이며 세상을 놀래켰다. 이 수치는 사람이 직접 이미지를 분류하는 것보다 높은 수치라고 한다.

요즘은 ResNet이 가장 많이 쓰이고 있긴 하지만 모델의 호율성에 따라 다른 모델들이 사용되기도 한다고 한다. 강의를 보면서 불과 몇년 만에 이 정도의 발전이 가능했다는 것에 놀랐고 앞으로의 발전이 어느 정도 까지 이어지게 될 지도 참으로 궁금하다.
2월 16일 
화요일
[Exploration]
뉴스 요약봇 만들기

 CNN에 이어, 이번엔 RNN이다!
처음엔 노드를 통해 진행하는 Exploration 프로젝트들이 CS231강의와 무관하다는 느낌을 계속 받았는데, 과정을 계속 진행하게 되면서 개념들이 점점 하나로 모이는 느낌이 들어서 신기하다.

아무튼 이번 프로젝트의 목표는 뉴스 데이터(말뭉치 데이터)를 불러와서 이를 학습시켜서
뉴스의 내용이 요약된 헤드라인을 뽑는 것이었다. 이러한 과정을 텍스트 요약(Text Summarization)이라 하는데 긴 길이의 문서(Document) 원문을 핵심 주제만으로 구성된 짧은 요약(Summary) 문장들로 변환하는 것을 말한다. 텍스트를 요약하는 방식에는 2가지가 있는데 아래와 같다.

-추출적 요약 : 단어 그대로 원문에서 문장들을 추출해서 요약하는 방식.
-추상적 요약: 원문으로부터 내용이 요약된 새로운 문장을 생성해내는 방식.

이번 프로젝트는 추상적 요약을 통해, 뉴스 데이터를 요약해 새로운 문장으로써의 헤드라인을 만드는 것이었다. 기존의 데이터를 전처리해서 불필요한 부분은 제거해주고, 또 필요한 부분은 채워서 학습을 진행시켰다. 아직 프로젝트를 완료하지 못해서 전체적인 흐름에 대해서는 파악하지 못했지만, 추상적 요약이란 것 자체가 기존 말뭉치에는 없던 단어을 새로이 창조해 내는 방식이기 때문에 다양한 분야에서 많이 활용될 수 있을 것 같다.

2월 17일 
수요일
[Fundamental]
시계열 데이터 다뤄보기
해당 노드는 시계열 데이터를 다뤄보면서 데이터 내부에 분포된 이상치들을 찾아내는 방법들에 대해 소개하였다.

이상치를 다른 데이터와 함께 학습 시켜 버리면 모델이 오염될 수도 있기 때문에 이를 솎아내 처리하는 이상치 탐색(Anomaly Detection)은 모델 학습뿐만이 아니라 인공지능을 기반으로 하는 산업 현장에 있어서도 아주 중요한 과제라고 할 수 있겠다.

노드에서는 주식데이터를 활용해 데이터 내의 이상치를 찾아보고 제거하는 방법에 대해 소개하였다. 이상치는 크게 두 종류로 나눌 수가 있는데, 통계적 자료 분석의 결과를 왜곡시키거나, 자료 분석의 적절성을 위협하는 변숫값 또는 사례인 '극단치(Outlier)'와 이전까지는 보지 못한 패턴이나 데이터인 '특이치(Novelties)'가 바로 그것이다. 노드에 따르면 특이치는 남겨둬야 모형에 좋고, 극단치는 제거해야 모형에 좋다고 한다.

이상치를 처리하는 방법으로는 전통적인 방법과 클러스터링(K-means, DBSCAN), Auto-Encoder를 제시하였다. 데이터의 성질에 따라 어떤 방식을 통해 이상치를 처리할 지에 대한 고민도 필요한 것 같다.
[Flipped School-Coding Master]
Class
무려 2주 만에 돌아온 코마 풀잎스쿨! AIFFEL과정 중 유일하게 강의 형식으로 진행되기 때문에 가장 집중도가 높은 시간이 아닐까 생각한다. 

2주 사이에 해커톤과 설날이 있었기 때문인지 나눌 이야기가 굉장히 많았던 것 같다. 그래서 그런지 꽤 유쾌하게 학습을 진행할 수 있었던 것 같다.
이번 시간에도 마찬가지로 파이썬300제를 풀면서 가졌던 질문들을 해결하는 시간을 가진 다음 Class에 대해서 배우게 되었다. 몇 주째 Class에 대해 배우고 있지만 Class를 구성함에 따라 만들 수 있는 것이 많다는 것을 느끼며 Class를 구성하는 연습이 중요하다는 것을 새삼 깨닫게 되었다. 

그리고 특히 이번 시간에는 지난 월요일에 진행했던 CNN Architecture에 관한 Class를 만들어 보았는데, 그 복잡해 보이던 내용이 노트북 셀 한칸에 모두 정리되는 것 같은 느낌이 들었다. 그런 것을 보면서 알고리즘에 대한 지식을 얻고 그 것을 이해하는 것도 중요하지만 그 개념들이 실제적인 모델에 사용될 수 있도록 코딩을 하는 것도 아주 중요하다고 생각했다. 어찌됐든 모델을 가동시키는 것은 결국 코드들이기 때문이다. 파이썬을 완벽히 익히는데 짧은 시간이 필요하다는 생각은 하지 않지만, 하루라도 빨리 파이썬을 통해 나만의 무엇인가를 만들고 싶다는 생각도 든다. AIFFEL 과정 중이야 LMS에 있는 코드들을 활용해서 많은 것들을 시도해 볼 수 있지만, 공의 상태에선 내 머릿 속에 있는 지식들만을 활용해야 하기 때문에 코딩 연습도 게을리 하면 안될 것 같다.
2월 18일 
목요일
[Exploration]
새로운 패션 만들기

이번 프로젝트는 말로만 듣던 GAN을 활용해서 진행하게 되었다.
GAN은 생성 모델 중 하나로써, 생성 모델링없던 데이터를 생성해내는 것을 목표로 한다.  즉, 생성 모델은 학습한 데이터셋과 비슷하면서도 기존에는 없던 새로운 데이터셋을 생성하는 모델이라고 할 수있겠다.

GAN에는 두 가지의 네트워크가 있는데, 아래와 같다.

-생성자(Generator): 아무 의미 없는 랜덤 노이즈로부터 신경망에서의 연산을 통해 이미지 형상의 벡터를 생성한다. 즉, 무에서 유를 창조하는 것과 같은 역할.

-판별자(Discriminator): 기존에 있던 진짜 이미지와 생성자가 만들어낸 이미지를 입력받아 각 이미지가 Real인지, Fake인지에 대한 판단 정도를 실숫값으로 출력.

재밌게도 GAN을 발표했던 논문에서는 생성자는 위조지폐를 만드는 위조지폐범들이며, 판별자는 위조지폐를 진짜 지폐와 따로 구분하는 경찰이라고 표현한다. 이런 비유를 통해 GAN에 존재하는 네트워크들의 역할을 확실히 이해할 수 있게 되었다.
즉, 생성자는 위조지폐를 진짜 지폐와 구분할 수 없을 때까지 모델을 학습하고 반대로 판별자는 모델 학습을 진행하면서 끊임없이 지폐들을 구분한다.

내가 느끼기에는 훌륭한 생성자 모델을 만드는 것도 중요하지만 모델의 신뢰성이나 성능을 높이기 위해서는 판별자 모델을 훌륭하게 모델링하는 것이 중요한 것 같다.

프로젝트에서는 옷 이미지가 아니라, CIFAR-10 데이터를 불러와 GAN모델을 구축하고 새로운 이미지를 생성해내는 것을 목표로 한다. 이번 프로젝트 역시 아직 끝마치지 못했기 때문에 더욱 자세한 사항은 다음 기회에......

2월 19일 
금요일
[Fundamental]
딥러닝 들여다 보기

오늘 노드는 딥러닝 모델을 구성하는 여러 가지 개념들에 대해 복습하는 시간을 가졌다. 그리고 특이하게도 오로지 넘파이(Numpy) 모듈만을 가지고 딥러닝 모델을 구현하는 방법에 대해서도 살펴보았다.

그런데 그동안 CS231 강의, 지시딥(밑바닥에서 부터 시작하는 딥러닝 스터디), LMS 노드들을 통해서 딥러닝의 구조에 대해서 몇 번이나 살펴보았는데도 불구하고, 이걸 직접 코드로 구현한 것을 보니 이해하기가 쉽지 않았다.

활성화 함수, 손실 함수, 기울기, 역전파 등 익숙해진 개념이라 생각했는데 오늘 다시 그 개념들을 정리한 글을 보니, 아직 부족한 것이 많다고 생각했다. 다시금 복습의 중요성을 느꼈다. 그래도 이번 노드는 딥러닝 모델을 관통하는 필요 개념들을 한 묶음으로 묶어놨기 때문에 지속적으로 복습하면서 개념에 익숙해지도록 노력해야겠다.

 

 


[회고]

해커톤을 진행하면서 내 실력의 부족함을 느꼈고,

연휴를 보내면서 시간은 현재에만 머무는 것이 아님을 느꼈다.

아직 4개월이 넘는 AIFFEL 과정이 남아 있지만,

결코 방심해선 안된다고 수없이 다짐한다.

과정이 끝나는 날은 기필코 올 것이고

그 날, 과정을 진행하던 날들을 돌이켜 보며 아쉬움 보단 행복한 기분이 들 수 있도록

끊임없이 정진해야 할 것 같다.