[PS] 그로들 자소서 개정 - 지원동기 및 소개

한화계열 스타트업, 그로들에 제출하기 위한 자소서를 작성 중이다. 이커머스 시장에서 생산성을 높일 수 있는 AI 솔루션을 개발하는 기업이다.

그로들의 요구사항을 정리하면 다음과 같다. “경제/산업 뉴스를 크롤링하여 요약할 수 있는 자연어처리/멀티모달 딥러닝 모델 개발” 만약 정규직으로 전환된다면, LLM과 Vision 쪽의 업무가 배정될 것이다. LLM은 summary, translation, document intelligence 등, vision은 문자인식, 객체인식, text/image-to-video 등이겠지. 모델 최적화나 분산학습 경험과 fine-tuning 경험자, 모델 개선 경험자도 찾고 있다. NLP에 필요한 데이터 수집 및 모델링도 경험한다면 우대사항이다. 상용 AI API와 tensorflow/pytorch와 같은 프레임워크에 대한 경험이 있다면 좋겠지. 또한, Linux/Unix와 Docker 환경을 주로 사용할 것이고, 협업(git, 코드리뷰)을 중요시하는 것으로 보인다.

자, 위의 내용 중 초안에 들어가지 않은 것은? 1) fine-tuning 경험 2) 분산학습 경험 3) tensorflow/pytorch 자세히 쓸 것 4) 모델 개선 과정에서 겪은 어려움을 쓸 것 5) AI API 쓰면서 어려움은 없었나? 6) linux 서버에서 내가 무슨 일을 했지? 7) git 쓰면서 무얼 배웠지?

또한, 뭐가 부족하지? 8) 전반적으로 사실의 나열이지, 어떻게 왜 했는지 내용이 비어있다. 9) 동기가 부족하다 10) 입사 후 계획이 곧 떠날 사람처럼 느껴진다. 11) 경제학 입문 - 문장이 그냥 맘에 안든다. 필히 고칠 것.

이제, 1차 개정 시작!

먼저, 지원동기 및 자기소개부터 건드려보겠다. 자기 소개가 부실하다. 뒤의 모든 내용이 이 두 문단안에 담겨야한다. 동시에 가독성을 챙기고, 호기심을 일으키도록 하자.

  1. 지원동기 및 소개 정보가 흘러 넘치는 현대 사회에서 의사결정을 위해 AI를 사용하는 것은 더 이상 먼 미래의 일이 아닙니다. 저는 뉴스를 포함한 정보들을 유용하게 소비하기 위해서는 딥러닝 기술이 필수적이 될 것이라고 생각합니다. 기존의 단순한 뉴스 크롤링 기술을 넘어, 텍스트뿐만 아니라 이미지나 비디오 같은 다양한 데이터 소스를 활용하여 맥락을 이해하고 요약한다면 비즈니스 솔루션을 선도할 수 있을 것 같습니다. AI를 활용한 이미지 번역, 자동 영상 제작, 자동 회의록 작성, 추천시스템 등 다양한 서비스를 개발한 선배 전문가들과 소통하며, 크롤링한 뉴스를 요약하는 멀티모달 분석 기반 딥러닝 모델 개발에 기여하겠습니다. 지원하는 직무인 멀티모달 분석 기반 딥러닝 모델 개발을 위해 다음의 역량을 키웠습니다. 첫째, 프로그래밍 언어와 AI에 대해 자기주도적인 학습을 진행했습니다. Python, Java의 다양한 이슈에 대처해보고자 자발적으로 TA(Teaching Assistant) 활동을 했습니다. 학생들의 코드를 리뷰하며 다양한 에러들이 발생하는 원인과 해결책을 파악할 수 있었고, 인터페이스와 예외처리 클래스와 같은 객체지향 개념을 설명하면서 강의를 수강할 때보다도 프로젝트 설계에 대한 이해를 높일 수 있었습니다. 또한, AI와 관련된 모든 학부 강의를 수강하며 YOLO를 활용한 실시간 수화 통역 서버스, LSTM을 활용한 주식예측도구, 협업 필터링을 활용한 옷 추천 서비스 등을 구현해보았습니다. 추가적으로 대학원 강의를 찾아가 TensorFlow, PyTorch를 활용하여 머신러닝 알고리즘과 딥러닝 모델들을 직접 구현해보았고, 모델들을 수학적으로 이해하는 연습을 할 수 있었습니다. 둘째, 대규모 언어모델인 BERT를 자바 바이트코드에서 보안 취약점을 발견할 수 있도록 개선하고, pre-training을 수행했습니다. 이를 위해 웹 크롤링을 통해 취약한 프로젝트를 라벨링 한 자바 바이트코드 데이터셋을 생성하였습니다. 부족한 GPU 자원으로 인해 pre-training 과정에 어려움이 있었지만, 최적화 알고리즘을 바꾸고 4개의 GPU를 모두 사용하도록 DDP(Distributed Data Parallel)를 적용하여 해결할 수 있었습니다.

뒷심이 부족하고, 여전히 동기가 애매하긴 한데.. 1차 개정은 일단 여기까지!

[PS] 첫 자소서(Personal Statement) 작성

한화계열 스타트업, 그로들에 제출하기 위한 자소서를 작성 중이다. 이커머스 시장에서 생산성을 높일 수 있는 AI 솔루션을 개발하는 기업이다.

인턴쉽 채용공고는 다음과 같다. 채용공고

그로들 회사 홈페이지는 다음과 같다. 스타트업이라서 그런지 아직은 간단한 구성이다. 홈페이지

회사 홈페이지에서 찾은 채용공고 목록이다. 그로들이 어떤 프로젝트를 하고 있는지 감을 잡을 수 있었다. 채용공고목록

그로들의 요구사항을 정리하면 다음과 같다. “경제/산업 뉴스를 크롤링하여 요약할 수 있는 자연어처리/멀티모달 딥러닝 모델 개발” 만약 정규직으로 전환된다면, LLM과 Vision 쪽의 업무가 배정될 것이다. LLM은 summary, translation, document intelligence 등, vision은 문자인식, 객체인식, text/image-to-video 등이겠지. 모델 최적화나 분산학습 경험과 fine-tuning 경험자, 모델 개선 경험자도 찾고 있다. NLP에 필요한 데이터 수집 및 모델링도 경험한다면 우대사항이다. 상용 AI API와 tensorflow/pytorch와 같은 프레임워크에 대한 경험이 있다면 좋겠지. 또한, Linux/Unix와 Docker 환경을 주로 사용할 것이고, 협업(git, 코드리뷰)을 중요시하는 것으로 보인다.

와우! 내가 잘 풀어 쓸 수만 있다면, 난 준비된 인재일 것이다. 학부에서 들을 수 있는 모든 ai과목을 들었고, ta를 해봤으며, tensor와 pytorch 모두 써봤고, LLM의 데이터셋을 생성해봤으며, fine-tuning 경험도 있다. DDP(분산학습)도 깔짝여보긴 했고.. 서버에서 Linux로 온갖 일을 해봤지. git도 학부수준에서 나보다 많이 만진 사람이.. 많긴 하겠다. 자신은 있다 그래도. 잘 써보자.

우선 초안!

자 기 소 개 서 한동대학교 AI.컴퓨터공학 전공 4학년(졸업 예정) 배재호

  1. 지원동기 및 소개 저는 인공지능과 소프트웨어 공학 분야에 관심을 가지고 있으며, 그로들에서의 인턴십을 통해 웹 크롤링과 자연어 처리 모델 개발에 기여하고자 합니다. 그로들이 인공지능을 활용하여 생산성을 높이는 솔루션을 개발하는 과정에 동참하고 싶습니다. 특히, 인턴십 업무인 크롤링한 뉴스를 요약하는 멀티모달 분석 기반 딥러닝 모델 개발은 저에게 굉장히 흥미롭게 다가옵니다.
  2. 인턴 직무 관련 경험 사항
    • 학부생 연구원 저는 한동대학교의 Intelligent Software Engineering Lab(ISEL)에서 18개월 동안 학부생 연구원으로 활동하며, 사전 훈련된 언어모델이 실제 프로젝트 상의 보안 취약점을 탐지할 수 있는지를 연구했습니다. 자바 소스코드에 보안 취약점이 있는지 ChatGPT API에 질의하는 VIChecker, 자바 바이트코드를 오픈소스 라이브러리에서 수집해 데이터셋을 생성하는 mvnCrawler, 생성된 바이트코드 데이터셋을 학습시켜 보안 취약점을 예측하는 ByCoBERT의 세 가지 프로젝트를 주도적으로 구현하였습니다. 특히 바이트코드를 보안 취약점 검출에 활용하는 연구가 드물었기에, 선행 연구들에 대한 동향 조사를 정리한 ‘바이트코드 분석을 통한 보안 취약점 검출 기술 동향’ 논문으로 2023년 한국 소프트웨어공학 학술대회에서 학부생 부문 우수논문상을 받는 성과가 있었습니다. VIChecker에서 저의 역할은 당시 출시되었던 ChatGPT-3.5 API를 사용해 자바 소스코드와 취약점을 내포하고 있는지를 프롬프트로 질의 후, 응답을 기록하는 것이었습니다. 생성형 언어모델이 코드상의 보안 취약점을 검출할 수 있는지 가능성을 검토하기 위해 수행되었습니다. 가장 많이 사용되는 6개 자바 오픈소스 라이브러리에서 GPT가 학습하지 않은 커밋 히스토리를 수집하고, 그중 유의미한 수정이 이뤄진 2만여 개의 자바 파일을 추출하여 데이터셋을 생성하였습니다. 동일한 프롬프트로 GPT API에 질의하고, 그 응답을 체계적으로 정리하였습니다. 본 프로젝트는 ‘GPT 모델을 활용한 보안 취약점 탐색’ 논문으로 정리되어 정보과학회 컴퓨팅의 실제 논문지(KTCP)에 제출하였고, 심사를 기다리고 있습니다. mvnCrawler는 바이트코드 기반 대규모 언어모델(LLM)을 학습시키기 위해 보안 취약점 여부를 라벨링 한 자바 바이트코드 파일을 수집하는 동적 웹 크롤러입니다. 바이트코드를 활용하여 보안 취약점을 찾는 선행연구가 없었기 때문에 독자적인 데이터셋을 생성할 필요가 있었습니다. 자바 오픈소스 라이브러리가 담긴 maven 저장소에서 임의 개수의 프로젝트를 보안 취약점 정보와 함께 자바 바이트코드 파일을 크롤링합니다. Maven 저장소 특성상, selenium을 활용해 동적으로 웹 크롤링하도록 구현했으며, 프로젝트의 maven URL, CVE(Common Vulnerability Enumerations), 바이트코드 파일의 로컬 경로를 묶어 테이블에 기록하도록 하였습니다. 본 프로젝트 경험을 바탕으로, 인턴쉽에서 웹 크롤러 제작에 기여할 수 있을 것이라 생각합니다. ByCoBERT는 mvnCrawler로 생성한 바이트코드 데이터셋을 사전 학습시킨 언어처리 모델입니다. TensorFlow와 torch, scikit-learn을 사용하여 구현된 BERT 모델을, 바이트코드를 읽도록 일부 코드를 수정하였습니다. 이는 바이트코드가 소스코드를 넘어 자연어만큼이나 유의미한 naturalness가 존재함이 밝혀진 것을 근거로 합니다. 실제로 ByCoBERT는 사전훈련 단계에서 뛰어난 Masked Language Modeling(MLM)과 Next Sentence Prediction(NSP) 성능을 보였습니다. 프로젝트 단위 보안 취약점 예측에서도 상용모델인 spotbug보다 우수한 f1-score 성능을 보여 정보과학회논문지에 ‘ByCoBERT: Bytecode pre-trained 모델 기반 보안 취약점 예측 기법’을 제출하고 1차 심사를 기다리고 있습니다. 자연어처리 모델인 BERT를 목적에 맞게 직접 수정한 경험은 그로들의 인턴십에서 유용하게 쓰일 것입니다.
    • 소통 훈련 학부생 연구원을 통해 얻은 가장 큰 경험은 소통 훈련이라고 생각합니다. 분명 ISEL 연구실에 들어가기 전에도 여러 팀 프로젝트와 동아리 활동에서 협업할 기회는 많았습니다. 그러나 단순한 역할 분담을 넘어, 서로가 어떤 작업을 하고 있고, 왜 해야 하며, 어떻게 통합할 것인지 이해하는 경험을 지도교수님과 팀원들 간의 코드 리뷰를 통해 얻을 수 있었습니다. 또한, 연구실 인턴과 병행했던 Java 과목의 TA(Teaching Assistant)에서도 동일한 요구사항에 대해 서로 다른 이해와 구현 방식이 도출되는 경험을 하며 반복적인 확인과 소통이 필수임을 되새겼습니다. 이로 인한 변화는 저 혼자만의 느낌으로 끝나지 않고, 기본 프로그래밍 언어에 대한 멘토링을 제공하는 코딩 아워에서 당년도 우수 TA로 선정되며 성장을 확신할 수 있었습니다.
  3. 직무 관련 이수한 교육과정
    • Python, Java 관련 파이썬 기본적인 문법과 자료구조, 파일 처리, 객체지향 설계 등 파이썬이 다른 언어와 어떤 부분에서 차이가 있는지 배웠습니다. 파이썬 과목을 들으며 공식 문서를 자주 읽을 수 있었고, 이 경험은 ISEL 연구실에서 수행하던 프로젝트들에 큰 도움이 되었습니다. 프로그래밍 능력과 다양한 프로젝트 수행 경험을 인정받아, 기본 프로그래밍 언어(C/C++, Java, Python)를 멘토링 하는 코딩 아워 TA(Teaching Assistant)로 2023년 3월부터 2024년 6월까지 근무하고 있습니다. 자바 프로그래밍 언어 객체지향적으로 프로젝트를 설계하는 방법과 다양한 라이브러리를 사용하는 법, gradle과 같은 빌드 도구를 사용하는 방법을 배울 수 있었습니다. 이후, 모든 프로젝트에서 객체지향적으로 설계하려고 노력하고 있습니다. 우수한 이해를 인정받아 2023년 3월부터 12월까지 자바 과목의 TA를 맡았습니다. 다양한 실습 환경에서 발생하는 이슈들을 해결하고, 자바에 대한 학생들의 이해를 돕는 역할입니다.
    • 머신러닝, 딥러닝 관련 머신러닝 회귀, 분류, 밀도 추정, PCA 등의 머신러닝 개념을 수학적으로 이해하고, scikit-learn을 사용해 직접 구현하였습니다. 특히, 라이브러리를 사용하지 않고 구현한 코드와, 라이브러리를 사용하여 구현된 코드를 모두 만들어 보면서 머신러닝 알고리즘 구현에 대한 이해를 높일 수 있었습니다. 딥러닝 개론 CNN과 RNN을 수학적으로 이해하고, 실무에서 사용되기 위해 어떤 정규화 전략들이 존재하는지 학습하였습니다. 나아가 Attention, BERT, Explainable AI, Auto-Encoding 등의 주요 논문들에 대한 세미나를 진행했습니다. 주도적으로 선행 논문들을 조사하고, 정리하여 발표하는 경험을 쌓았습니다.
    • AI 개발 도구 사용 경험 관련 AI 프로젝트 입문 AI와 머신러닝의 기본 개념을 학습하고 PyTorch와 TensorFlow로 직접 regression과 CNN, RNN, AE 등을 구현해 보는 경험을 가졌습니다. 3인 팀으로 AI를 활용한 서비스를 개발하도록 과제를 부여받았습니다. 저희는 협업 필터링을 사용해 옷 추천 서비스를 제작하였습니다. 다만 사용할 수 있던 데이터가 팀원 3인뿐이었기에 큰 효과를 보진 못했습니다. 그러나 유사도 측정 알고리즘이 잘 동작한다는 점, 크롤링을 통해 옷의 가격 비교를 할 수 있다는 점 등에서 높은 점수를 받았습니다. 이를 바탕으로 24년 3월부터 6월까지 AI 입문 과목의 TA를 맡아 학생들의 실습을 돕고 있습니다. 컴퓨터 비전 opencv 라이브러리를 사용해 이미지 처리와 분석 기술의 개념을 학습하고 실습하였습니다. 특히 CNN을 활용한 분류 작업과 나아가 객체 인식 기법에 흥미를 느꼈습니다. 마음이 맞는 팀원들과 함께 YOLO를 사용해 수화를 학습시켜 실시간 수화 통역 서비스를 구현하였습니다. 가장 큰 어려움은 GPU를 사용하기 위한 CUDA 환경 설정 문제였습니다. NVIDIA와 TensorFlow의 공식 문서를 여러 번 교차 확인하며 올바른 버전과 경로를 찾을 수 있었습니다. 캡스톤 프로젝트에서 수행한 세 프로젝트(VIChecker, mvnCrawler, ByCoBERT)는 Python과 Shell로 구현되었고, 이 과정에서 AI 모델을 활용한 문제 해결에 대한 이해를 쌓을 수 있었습니다. 잘 구현된 mvnCrawler와 ByCoBERT 모델, 그리고 이를 문서화한 보고서를 졸업과제로 제출하여 2023년도 캡스톤2 부문 우수상을 받았습니다.
    • 경제/산업 관련 경제학 입문 AI의 발전으로 컴퓨터공학 전공자들은 본인이 복무하는 도메인에 대해서도 전문가와 소통할 수 있을 만큼 이해할 필요가 있다고 생각합니다. 저는 다른 분야의 기초전공과목들도 들으며 사회에 대한 상식을 쌓고자 했습니다. 그중 경제학 입문 과목을 통해 수요와 공급, 시장 균형, 소비자 이론 등 경제학의 핵심 개념과 용어들에 익숙해졌습니다. 이를 바탕으로 경제 뉴스의 맥락을 더 잘 이해하고, 모델에 반영할 수 있을 것이라 기대합니다.
  4. 입사 후 계획 그로들에서의 인턴십을 통해 AI 엔지니어로서 실무 경험을 쌓고, 최신 AI 기술을 배우고자 합니다. 이후, 그로들의 혁신적인 프로젝트들에 참여하며 제가 만든 서비스가 사회에 편리함을 가져다주는 경험을 하고 싶습니다. AI를 활용한 이미지 번역, 자동영상제작, 자동회의록작성, 추천시스템 등 다양한 서비스를 개발한 선배 전문가들과 소통할 기회라는 점이 매력적으로 다가왔습니다. 장기적으로는 AI를 위한 소프트웨어 공학, SE를 위한 인공지능을 실무에서 정립하는 엔지니어가 되어 개발자들의 생산성을 높이는데 기여하고 싶습니다.

초안 작성 완료. 이제 형식을 갖췄으니, 실제로 내용을 채워보자.

[DL] Understanding deep learning requires rethinking generalization

논문

Background

우리는 모델이 좋은 Representation을 학습하는 것이 중요하다는 것을 배웠습니다. 잘 학습된 모델은 처음 접하는 표현도 새로운 카테고리로 잘 인지(구분)한다는 것은 중요한 지점입니다. 동시에, DL이 noise에 취약하다는 사실도 배웠습니다. 아주 작은 noise만 더해도 완벽하게 오분류한다는 사실이 Adversarial 논문에서 잘 드러납니다. 따라서, 지나치게 잘 학습된 모델이 실용화되기 위해서는 overfitting을 막아주는 기법들이 필요합니다. 즉, Generalization Error을 줄여주는 기법들이 발전해온 것입니다. 조금만 더 자세히 이야기해보면 Explicit Regularization에는 weight decay, dropout, data augmentation 등이 있고, Implicit Regularization에는 early stopping, batch normalization, sgd 등이 있습니다.

  • Weight Decay(L2 Norm) : 모든 가중치에 대해 손실의 도함수를 취하고, 학습율에 따라 업데이트하는 것이 기본이지만, 각 개별 가중치가 강해질 경우 추가적인 punishment를 통해 자제시키는 기법
  • Dropout : 계층의 임의의 뉴런들을 mask하여 특정 노드들의 영향이 강해지는 것을 방해하는 기법
  • Data Augmentation : 입력 데이터를 도메인에 맞게 변화시키는 기법이다. (Domain specific transformations of the input data)

본 논문은 이러한 Generalization 기법이 정말로 가치가 있는지 확인합니다.

Method

데이터셋을 일부로 왜곡(noise)시켜 학습시켜보았습니다. 라벨을 부분적으로 왜곡하기도 하고, 랜덤으로 매기기도 했습니다. 또한 pixel들을 섞거나 임의의 픽셀을 집어 넣기도 했습니다. 정규화를 포함하거나 포함하지 않고 동일한 모델과 데이터셋을 학습시켜보기도 했습니다. 사용된 정규화 기법에는 Data augmentation, weight decay, drop-out이 있었습니다.

Result

어떤 방식을 취해도 학습시간에 차이가 있을 뿐, train error는 0으로 수렴합니다. 이는 모델이 ‘learning’이 아니라 ‘memorizing’ 한다는 것을 뜻합니다.

Finding

정규화는 분명 accuracy 그래프에서 noise를 줄여 smoothing한 양상을 보입니다. 또한 weight decay나 dropout보다 data augmentation이 유용하며, early stopping과 batch normalization이 generalization에 약간 도움을 주는 것은 맞습니다. 그러나 정규화가 적용되지 않았을 때도, 비슷한 성능을 유지합니다. 오히려 어떤 정규화를 사용하느냐보다, 어떤 모델을 사용하느냐가 훨씬 중요해보입니다.

문제는 CNN 모델이 학습을 넘어서 암기(memorize)하기 충분한 capacity를 가진 것으로 보인다는 점입니다. 본 연구는 정규화가 일반화에 필수적이지 않다는 사실을 밝혔습니다.

이곳은 즉독정리용 공간이기 때문에, 정확한 정보는 Slides로 가야한다.

Standard Template Library(STL)

Iterators

structure에 관계 없이 동일한 동작의 코드를 구현할 수 있도록 돕는다.

구현하려는 알고리즘에 따라서 iterator에 요구하는 연산자가 다른다. 예를 들어 find의 경우, 읽을 수만 있으면 되기에 ++ 연산자로 충분하다. sort의 경우에는 임의의 위치로 읽고 쓸 수 있어야하기에 + 연산자가 필요하다.

[DL] EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES

논문

Abstract

심층학습망은 일반적인 적대적 예제에도 취약하다. 적대적 예제란, 입력 데이터에 작은 노이즈를 추가하는 것이다. 이는 모델의 오분류를 유도하여 모델을 취약화시킨다. 이전에는 비선형성과 과적합에 의해 발생하는 현상인줄 알았으나, 오히려 선형성에 의한 것으로 보인다. 이는 몇몇 사례에서만 나타나는 예외가 아닌, 동일한 데이터셋에 대해 여러 모델들이 일관적으로 오류를 나타내기 때문이다. 따라서 드롭아웃, 사전훈련, 평탄화와 같은 일반적인 정규화 전략으로는 적대적 예제에 대처하기 어렵다. 적대적 예제의 예시와 원리를 파악하여 데이터셋의 취약성을 낮추는 것을 목표로 한다.

적대적 변형에 저항하기 위해서는 오히려 비선형적으로(어렵게) 훈련되는 모델을 설계해야 한다는 어려운 균형상태에 놓인다. LSTM, maxout network, softmax 등 선형성에 기반해 쉽게 최적화되는 접근들에서 취약성이 드러났다. 합성곱 신경망에서도 데이터셋에 대한 작은 회전만으로도 적대적 예제가 생성된다.

물론, 얕은 계층의 근사치라면 모를까 심층 신경망에서도 적대적 예제에 취약하다는 것이 의문스러울 수 있다. 충분히 많은 특징을 잡을 경우 적대적 자극에 저항할 수 있으리라 생각되기 때문이다. 그러나 지금까지 설계된 지도학습 전략들은 적대적 사례를 전혀 고려하지 않았다는 점을 알아야 한다. 가능한 대처방법으로 모델이 특정 정밀도 이하의 특징 변화에 둔감하도록 정규화하는 것은 어떨까? 임의의 노이즈를 추가하거나 샘플링 지점을 늘리는 것이 그 예이다. 그러나 이러한 방식은 썩 유용하지 않았다.

한편, 적대적 예제가 서로 다른 훈련세트나 모델에서 사용되었을 때도, 매우 정확한 위치에서 발생한다는 것에 착안한 방법이 존재한다. 선형적 관점에서 보았을 때, 적대적 예제는 넓은 저차원 공간에서 연속적으로 발생해야한다. 이는 선형분류기가 일반화시키는 문제와 해결방법이 유사하다. 이 가설을 증명하기 위하여 MP-DBM 모델이 설계되었다. 그러나 해당 모델 역시 여전히 적대적 예제에 취약하였다.

결론적으로, 모델이 너무 선형적이기에 오류가 포함된 데이터셋에 취약한 것이 적대적 예제 현상이다. 이를 해결하기 위해 고안된 적대적 훈련은 dropout보다 더 나은 정규화 효과를 보였다. 최적화가 어려운, 근사은닉층으로 이루어진 심층 신경망이 적대적 예제에 대한 저항력이 있는 것으로 보인다. RBF 네트워크가 그 예이다.

[DL] A Neural Algorithm of Artistic Style

논문

Abstract

인간은 이미지의 내용과 형식을 보고 시각적 경험을 생성할 수 있다. 아직도 이러한 원리는 명확히 규명되지 않았고, 비슷한 능력을 인공적으로 구현할 수도 없다. 그러나 최근 딥러닝으로 객체 또는 얼굴 인지 기법이 인간과 유사할 정도로 발전하였다. 이러한 발전에 힘입어, 이미지의 내용과 형식을 분리하고 재결합하기 위해 representation을 사용한 이미지 생성 기술을 제안한다.

CNN 훈련과정에서 이미지는 표현으로 사상된다. 각 계층에서 입력이미지의 정보를 얼마나 가지고 있는지 시각화할 수 있다. 어떤 특징 공간의 정보를 시각화하냐에 따라 독립적인 표현들을 합성할 수 있다. 그러나 다른 두 이미지에서 각각 내용과 스타일을 산출하고, 합성하는 것에는 제약이있다. 이때의 손실함수를 어떻게 결정하냐에 따라 외관에 좀 더 집중할지, 내용에 좀 더 집중할지 정해진다.

이제, VGG-Network를 기반으로 콘텐츠와 스타일을 서로 다른 입력에서 도출하는 모델이 설계되었다. VGG-Network는 객체 인식에 유용한 보다 깊고 강력한 합성곱 신경망이다. 이 방법을 통해 콘텐츠와 스타일을 완전히 분리하여 독립적으로 조작할 수 있었다.

Runtime Type Identification(RTTI)

구 컴파일러에서는 지원하지 않을 수 있다.

dynamic_cast Operator

아래 코드는 아무런 compile error도 발생시키지 않는다. 과연 안전한 코드일까?

// Suppose a class hierarchy
class Base { ... };
class Derived1 : public Base { ... };
class Derived11 : public Derived1 { ... };
// Suppose the following pointers
Base* pb = new Base;
Base* pd1 = new Derived1;
Base* pd11 = new Derived11;
// Consider the following type casts
Derived11* p1 = (Derived11*)pd11;   // 11->11
Derived11* p2 = (Derived11*)pb;     // base->11
Derived1* p3 = (Derived1*)pd11;     // 11->1

절대 아니다. 첫번째는 동일한 type이므로 안전하다. 세번째는 base class pointer로 derived class를 가리킬 수 있으니 괜찮다. 그러나 두번째는 runtime에서 오류가 발생하게 된다.

이러한 상황을 막기 위해 dynamic_cast 연산자를 사용한다. Typecast가 가능하다면 그대로 바꿔주고, 그렇지 않다면 0(null-pointer)를 반환한다.

Derived derived_obj;
Base base_obj;

Base *base_ptr_do = &derived_obj;
Base *base_ptr_bo = &base_obj;

Derived* dp_bp_do = dynamic_cast<Derived*>(base_ptr_do); // allowed
Derived* dp_bp_bo = dynamic_cast<Derived*>(base_ptr_bo); // return nullptr

dynamic_cast는 reference에도 사용할 수 있다. 다만 null-pointer에 해당하는 type이 reference value로 없기 때문에 0 대신 bad_cast를 반환한다.

#include <typeinfo> // for bad_cast
try {
    Derived1& rs = dynamic_cast<Derived1&>(rb);
    // ...
}
catch(bad_cast&) {
    // ...
}

static_cast

C type cast와 유사하다.

기존의 표현이 가능한 type들 간에 변환만이 가능하다. 예를 들어, integer-enumeration, double-int, float-long 등 implicit type cast가 가능한 모든 경우가 이에 해당한다.

Base base;
Derived derived;
Base *pb = static_cast<Base*>(&derived);    // valid upcast
Derived *pd = static_cast<Derived*>(&base); // valid downcast

const_cast

상수값(const)를 변수로 변환한다.

SomeClass obj;
const SomeClass *ptr = &obj;
SOmeClass *pb = const_cast<SomeClass*>(ptr);
// equivalent as
SomeClass *pb = (SomeClass*)(ptr);
// but it does not allow
AnotherClass *pb = (AnotherClass*)(ptr);

위와 같은 사례를 허용하지 않기 때문에 보다 안전하게 사용할 수 있다.

typeid operator

type_info structure

Questions?

Q1.
A1.

Q2.
A2.

[error-abort.cpp]: [error-return.cpp]: [error-try-catch]: [error-throw-object]: [bad-alloc.cpp]:

Pagination