일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 관심사분리
- deeplearning
- 백준 1339 자바
- 논문리뷰
- 디미터법칙
- GPT
- Java
- 1916
- 다익스트라
- 백준9095
- 백준 1916 자바
- cs231n
- 알고리즘
- Alexnet
- 백준 1339
- 논문
- MachineLearning
- 백준
- 알렉스넷
- 딥러닝
- 1107번
- dijkstra
- 3745
- 논문구현
- NLP
- 1261
- 짝지어제거하기
- 자바
- 머신러닝
- 클린코드
- Today
- Total
산 넘어 산 개발일지
2021.06 ~ 2021.11 학부연구생 후기 본문
이제서야 후기를 쓰게 되었지만, 딥러닝 분야에서 연구를 시작한 첫 터전이기도 했고
이 때의 경험을 조금이나마 기록해두면 좋지 않을까 싶어서 기록을 남긴다.
AI 보안
운좋게 AI보안 연구실에 들어갈 기회가 생겨서 들어가게 되었다. 사실 AI 보안이라고 해도 AI 개발과 크게 다르지 않을 것이라 생각했다. 조금 더 구체화해본다면, 인공지능을 활용해 해커의 침입을 감지하거나 정보 유출을 막는 그런 기능들을 상상했었다. 그러나 AI 보안은 그것과는 많이 달랐다. 가장 기억에 남는 것에는 백도어 어택이 있다. 이미지의 한 쪽 구석에 임의의 패턴을 넣어서 모델이 오답 클래스로 분류하도록 유도하는 것이다.
이 사진은 비디오의 프레임마다 한쪽 구성에 임의의 패턴을 입력한 것이다. 이런 방식으로 진행하여 오분류를 유도하는 방식이다. 이를 통해서 즉각적으로 알 수 있었던 사실은, 사람이 사물을 인식하는 방법과 컴퓨터가 사물을 인식하는 방법은 아직 많이 다르다는 것이다. 우리는 뚜렷하게 사물을 배경이나 다른 사물과 분리하여 인식할 수도 있고, 사물 그 자체를 인식할 때도 사물의 고유한 색이나 특성을 생각하며 인식한다. 그러나 컴퓨터는 사물을 인식할 때 여러 특성을 고려하지 않고 오로지 그 사물을 이루는 픽셀값을 통해서 인식한다. 그렇기 때문에 사람이 보기에 강아지로 보이지 않는 그림이라도 컴퓨터가 보기에는 강아지를 이루는 픽셀의 조합과 유사하다는 이유로 해당 사물을 강아지로 인식할 수 있는 것이다. 컴퓨터와 사람의 인식 방식에서 생기는 이러한 괴리감 때문에 백도어 어택과 같은 방식이 가능한 것이라고 생각한다.
내가 있었던 AI 보안 연구실은 이런 것과 비슷한 연구들이 진행되는 곳이였다. Train 과정, 혹은 실제 사용하는 과정에서 어떻게 하면 모델의 오작동을 유도할 수 있을지를 주로 연구하는 느낌이였다. 단순히 보면 해커들에게 도움이 되는 연구만 하는 거라고 볼 수도 있겠지만, 이런 연구가 선행이 되어야 이에 대한 대비가 가능하기 때문에 꼭 필요한 연구라고 생각한다.
그러나 내가 원하던 연구 분야와는 살짝 본질적으로 달랐다. 나는 모델 자체의 성능에 조금 더 관심이 있다. 그래서 모델의 정확도를 높일 수 있게끔 구조를 다르게 연구해본다던가, 혹은 이전에는 없었던 새로운 방식으로 AI 모델이 이미지든 텍스트든 사용자가 원하는 방향으로 새롭게 생성할 수 있는 모델을 만들고 싶었다. 이런 점에서 AI 보안 연구실과는 방향이 다르다고 생각해서 기존 계약 기간이였던 11월까지 활동을 하고 연장하지 않았다. 나도 아쉬웠고 연구실 사람들도 아쉬워했지만, 분야가 다르다는 것은 어쩔 수 없는 이유라고 생각한다. 사실 내가 들어오기 전에 먼저 AI 보안에 대해서 조금 더 알아보고 들어왔어야 했다. 그런 점에서는 연구실 사람들에게 많이 죄송하다.
연구
연구는 모바일 기기에서 이루어지는 사용자 인증, 스푸핑 탐지, 그리고 표정 인식에 대해서 진행되었다. 어떻게 구현했는지를 이런 공개적인 블로그에 써도 되는지에 대해서 잘 모르기 때문에 자세히 언급하지는 않겠다. 연구 환경은 리눅스가 설치되어 있는 서버 컴퓨터에 저사양 노트북으로 원격으로 조종하는 방식이였다. 그래픽 카드는 좋은 편이였고, 나는 2개를 사용하던 박사과정 형의 그래픽 카드 하나를 할당받아서 사용했다. 어차피 훈련이나 코딩은 서버 컴퓨터에서 이루어지기 때문에 고사양 노트북이 필요하지 않았다.
연구는 MobileNet V2를 기반으로 한 전이학습을 주로 사용했다. 방대한 크기의 이미지 데이터들을 사용했고, 이정도 규모의 훈련은 처음이여서 많이 헤맸던 것으로 기억한다. 연구 과정에서 기억할 만한 것드을 몇 가지 적어본다면 다음과 같다.
1. 작은 데이터셋 -> 큰 데이터셋
우선 처음부터 모든 데이터셋을 사용하지 않았다. 소규모의 데이터셋을 먼저 사용해서 모델이 잘 작동하는지를 확인하고 이후 점차 모든 데이터셋을 사용하게끔 넓혀갔다. 만약 처음부터 모든 데이터셋을 사용했다면, 훈련하는데 시간이 너무 오래 걸리기 때문에 여러 가지 다양한 시도를 해보지 못했을 것이다. 작은 데이터셋에서 사용한 덕분에 다양한 파라미터를 사용해볼 수 있었다.
2. FRR, FAR, EER
이 세가지는 정확성을 측정하는 기준이며, 각각 FRR(False Reject Rate), FAR(False Acceptance Rate), EER(Equal Error Rate)를 지칭한다. FRR은 시스템에 등록된 사용자가 인증이 거부되는 비율이고, FAR은 시스템에 미등록된 사용자가 인증이 허가되는 비율이며, 마지막 EER은 FRR과 FAR이 겹쳐지는 시점의 오류율이다.
사용자 인증의 정확도 측정을 위해서 이 세가지가 대표적으로 사용되는 것 같다. 이를 가지고 연구가 성공적이였는지, 개선이 필요한지를 측정하며 진행했다.
3. 유사도
사용자 인증을 위해 사용자의 얼굴을 시스템에 등록한다고 했을 때, 등록할 때마다 새로운 모델을 훈련시키는 것은 불가능하다. 따라서 이미 훈련된 모델을 사용하여 사용자의 얼굴을 추론시키고, 이 때 추출되는 마지막 Vector를 시스템에 저장한다. 이후 사용자 인증 요청이 들어올 때, 현재 카메라에 잡히는 사람의 얼굴에서 추출된 Vector와 시스템에 등록된 사용자의 Vector를 비교하여 이미 등록된 사용자인지 아닌지를 유추할 수 있어야 한다. 이 때 사용되는 것이 Vector간의 유사도이다. 유사도에는 다양한 종류가 있지만, 그 중 MSE와 코사인 유사도를 간단하게 소개만 하겠다.
MSE 유사도는 벡터의 원소별로 차이를 구하고 이를 제곱한 뒤 이들의 평균을 구하는 것이다. 식은 다음과 같다.
코사인 유사도는 두 벡터간의 코사인 각도를 이용하여 유사도를 구하는 것이다. 즉 두 벡터의 방향이 동일하면 1, 직각이면 0, 반대면 -1을 나타낸다. 식은 다음과 같다.
4. JPG vs PNG
사소한 이슈같으면서도 근본적인 이슈였다. 전처리 과정에서 numpy와 텐서프로를 통해 이미지의 픽셀값들을 조정한 다음 새롭게 이미지를 생성하는 과정이 있었다. 이 때 나는 아무런 의심 없이 JPG 파일로 변환했다. 그러나 내가 수정하고 추가한 픽셀 값들은 그대로 저장이 되지 않고, 약간씩 변형되어 저장이 되는 기이한 현상이 발생했다. 불행히도, 나는 당시에 발견하지 못하고 연구가 막바지에 다다를 당시에 이를 발견했다. 새롭게 생성된 이미지를 조금 더 세세하게 관찰하였으면, 그래서 픽셀 값 자체를 대조해가며 꼼꼼하게 체크를 했으면 이 같은 상황을 방지할 수 있었을 텐데. 가장 아쉬운 부분 중 하나였다.
우선 JPG는 의외로 오래된 파일 포맷 중 하나이다. JPEG라고도 불리는데, 원래 이름이 JPEG이나 옛날 컴퓨터 파일의 포맷 이름이 3개의 문자로만 제한되는 시절에 이를 줄여서 JPG라고 지칭했다고 기억한다. JPEG는 일반적으로 다른 이미지 파일들보다 크기가 적은데, 이는 JPEG가 손실압축 방식이기 때문이다. JPEG 알고리즘에는 DCT(Discrete Cosine Transform)이라는 이산 코사인 변환을 적용한 뒤에 데이터를 줄이기 위해 양자화 과정을 거치는데, 양자화 과정에서 자연스러운 색상을 단순화시킨다고 한다. 이 때문에 데이터 손실이 발생하는 것이다.
반면 PNG는 크기가 크지만 비손실압축 방식이다. 따라서 원본 자체가 훼손되는 일이 없다. 즉 앞으로 임의로 이미지를 저장할 일이 있다면 최대한 PNG로 저장하는 습관을 들여야 할 것 같다.
5. 데이터셋
데이터셋은 다음과 같은 데이터셋들을 사용했다.
한국인 안면 이미지
한국인 감정인식을 위한 복합 영상
https://aihub.or.kr/aidata/27716
CelebA
https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
CelebA_Spoof
https://github.com/Davidzhangyuanhan/CelebA-Spoof
10K US Adult Face Database
https://www.wilmabainbridge.com/facememorability2.html
아쉬웠던 점
1. 표정 인식
표정 인식을 위해 얼굴의 Keypoint를 추출하여 사용하였는데, 이 keypoint들을 조금 더 제대로 활용할 수 있지 않았을까 하는 아쉬움이 남는다. keypoint들을 단순히 CNN을 사용하지 않고, Keypoint들만을 위한 별도의 모델을 만들어서 궁극적으로 멀티모달 형태의 모델을 만들 수 있었으면 조금 더 좋은 결과가 나올 수 있지 않았을까? 물론 결과가 좋았을 것이라는 장담은 없다. 그러나 한 번쯤 해볼만한 시도였다고 생각한다. 예를 들어 Keypoint들을 시계열 데이터로 보고 RNN을 적용해본다던가 Transformer를 적용해 볼 수도 있지 않았을까 싶다. 다만, 당시에는 이에 대한 지식이 너무 적었고, 새로운 시도를 해 볼만한 시간적 여유가 없었다(과제 마감일). 그래도 역시 가장 큰 이유는 내가 준비가 덜 된 상태였다는 것이다. NLP 쪽에 대한 지식이 조금만 있었더라도 시도해봤을 법한데, 이에 대한 아쉬움이 가장 크게 남는다.
2. 모델 크기
정확히는 모델의 파라미터 수이다. 기존 MobilenetV2는 모델에 들어가는 파라미터의 수가 3,000,000개이다. VGG16의 파라미터 수가 약 27,000,000임을 감안하면, 굉장히 적은 파라미터 개수라고 말할 수 있다. 이 때문에 이름도 Mobilenet이라고 붙인 것 같고, 그만큼 모바일 기기에서 모델을 사용한 추론이 수월하다는 뜻일 것이다. 우리가 만들어낸 모델은 30,000,000개가 넘는 파라미터가 사용되었다. 그렇기 때문에 모바일 환경에서 기대했던 것만큼 원활하게 돌아가지 않았다. 물론 Tensorflow lite로 변환하는 과정에서 이 파라미터 수는 현저히 낮아졌을 것이다. 그러나 만약 tflite로 변환하기 전에도 파라미터의 수를 줄일 수 있었다면 결과는 더 좋지 않았을까. 그러나 모델의 크기를 줄이는 가지치키나 양자화에 대한 개념이 전무했던 나로서는 불가능한 작업이였다. 시간 관계상 이에 대한 공부를 진행하기도 힘들었다.
후기
이 외에도 여러가지 사건사고가 있었지만(사고라기보다는, 연구 과정에서의 Issue...) 크게 중요한 부분은 대체로 적은 것 같다. 가끔 들어와서 그 당시 내가 어떤걸 잘 못했었고, 어떻게 해결했었고, 무엇을 배웠었는지를 되짚어본다면 좋은 공부가 되지 않을까 싶어서 포스팅을 한다.
연구실에서의 경험은 정말 인생에 남을 만큼 좋은 경험들로만 가득 차있다. 딥러닝에 대해서 다시 한번 자세히 공부할 수 있는 기회도 있었고, 연구 과정에서 겪은 여러 Issue들과 이를 통해 기대한 것보다 더 큰 성장을 이룰 수 있었던 것 같다. 무엇보다 너무나도 친절하고 재밌었던, 그리고 많은 도움을 준 연구실 사람들에게 감사한다. 학부연구생 기회를 주신 교수님께도 아마 평생을 감사하지 않을까 싶다.