나는 이전에 한 인공지능 교육 과정을 이미 수강한 바가 있다. 무슨 교육 과정인지 밝힐 수는 없지만 거기에서 얻은 게 너무 없고, 굉장히 실망스러워서 이 인공지능이란 길이 정녕 내 길이 맞는가에 대한 의구심과 시간을 날린 것에 대한 회의감을 갖고 있었고, 이 길을 아예 포기할까 하는 생각까지 갖고 있었다. 그래도 어디든 취직은 해야 하니까, 코딩하는 길로 취직을 하려면 코딩 테스트 준비는 필수적이었기에 프로그래머스 사이트에 들어갔다. 그러던 중 한 배너가 내 눈에 띄게 되었다. 

 

https://programmers.co.kr/learn/courses/11612

 

K-Digital Training 프로그래머스 인공 지능 데브코스 

 

평소에도 깔끔한 UI와 퀄리티 좋은 문제들, 강의를 제공해왔던 프로그래머스 사이트에서 인공지능 가르쳐준다고 하니 왠지 구미가 당겼다. 마침 나는 휴학 중이면서 졸업 예정자이기도 했기 때문에 신청 자격에 딱 걸쳐서 가능했었다. 문득 이전에 실패했던 경험이 있어서 두렵기도 했지만, 그 실패를 발판삼아 똑같은 실패를 반복하지 않으면 성공적으로 교육하고, 성장할 수 있지 않을까 하는 생각이 들게 되었고, 만약 이번에도 실패한다면 그때는 정말 이 길이 내 길이 아님을 깔끔하게 인정하고 미련 없이 다른 진로를 선택할 수 있을 것 같다는 확신이 들게 되어 정말 마지막이라 생각하고 도전을 하게 되었다.

 그렇게 걱정 반, 기대 반으로 수업을 듣게 되었다. 그러나 걱정을 했던 것이 무색할 만큼 강의의 퀄리티가 상당히 높았고, 정말 웬만한 전공 강의가 부럽지 않을 정도로 전문적인 강의들이 학생들에게 제공이 되었다. 그 과정에서 내가 부족한 부분이 어떠한 부분인지도 파악할 수 있게 되어 좀 더 탄탄한 기반을 쌓는 데 큰 도움이 되었다고 생각한다. 그리고 어려운 부분에 대해선 slack 메신저를 이용하여 강사님께 바로 여쭤볼 수 있는 수도 있었기 때문에 모르는 것을 담아두고 끙끙 앓고 있는 것이 아니라 바로 해소할 수 있었다.

 매주 목요일에는 zoom을 통한 특강이 열려 강의에 대한 추가적인 부분에 대해 듣기도 하고, 진로 고민에 대해 여러 조언을 들을 수 있는 시간도 가질 수 있었다. 특히 진로 특강은 너무나도 만족스러웠다. 실제로 현업에서 종사하는 분이었기 때문에 취직하면서 어떤 것을 준비해야 할지, 어느 부분이 중요한지에 대해서 깨닫고 더 체계적으로 취직을 대비할 수 있게 되었다.

 팀 프로젝트는 아직 진행하고 있으나 운 좋게도 친절하고, 열정 넘치는 팀원분들을 만나 원만하고 즐겁게 진행할 수 있을 것이라는 기대를 품고 있다. 그 모습은 매달있는 먼슬리 프로젝트를 통해 확인할 수 있었다. 먼슬리 프로젝트도 해당하는 달에 핵심적으로 공부했던 부분을 이용한 프로젝트가 주로 진행이 돼서 그달에 공부한 내용을 전반적으로 회고하는 시간을 가질 수 있다. 이 프로젝트 자체도 굉장히 흥미롭고 재밌게 구성이 되어 7시간이라는 짧지 않은 시간 동안 진행되는 프로젝트임에도 불구하고 지루한 줄 모르고 임할 수 있던 것 같다. 그래서 자처해서 시간을 오버해서 프로젝트를 더 진행하기도 했다. (이는 팀원들의 열정도 있었기에 가능한 일이기도 했다!)

 마지막으로 이 글을 읽고 데브코스에 지원할지 말지 고민하는 분들께 이렇게 말씀을 드리고 싶다. 꼭 한 번 도전해 보아라! 분명히 후회 없는 5개월이 될 수 있을 것이라 장담한다. 이렇게 질 좋은 전문성 있는 강의를, 학생의 고민을 자기 일인 것처럼 진심으로 걱정해주시고 챙겨주시며 코스가 원활히 진행되도록 늘 노력하시는 상냥한 매니저님, 프로젝트에 든든한 지원군이 되어주시는 멘토님, 모든 일에 열정적이고, 배울 점이 많은 팀원을 만날 수 있는 코스가 절대 흔치 않을 것이다. 게다가 국비 지원으로 무료이기까지 하니, 더더욱 망설일 필요가 없지 않을까? 어느 부분에서든 분명 배울 부분이 있을 코스이니 망설이지 말고 지원해 보시길 권해드리는 바이다.

Transfer-based attack

 

  • Adversarial example은 모델 사이 전송 가능한(transferable) 특징이 있다.
  • 이러한 transferability를 이용한 공격 방법은 다음과 같다.
    1. 공격자가 개인적으로 대체 모델(substitute model)을 학습한다.
    2. 자신의 대체 모델에 대해 white-box 공격을 수행해 adversarial example을 생성한다.
    3. 해당 adversarial example을 공격 대상인 black-box에 넣어 최종적으로 공격을 수행한다.
  • Transfer-based attack이 가능한 이유
    • 유사 학습 데이터 세트로 학습한 모델은 유사한 decision boundary를 가지기 때문에
  • 현실적 공격 기법 (ASIA CCS 2017)
    • 추가적 쿼리를 날려 black-box 모델과 더욱 유사한 surrogate 모델을 만들어 공격
  • 다른 관점에서의 분석 (NIPS 2019)
    • Adversarial perturbation을 non-robust feature로 이해할 수 있다.
    • 모델들이 유사한 generalized non-robust feature를 학습하므로 transferability가 존재
  • 대표적 방어 기법 (ICLR 2018)
    • Ensemble adversarial training은 transfer-based attack에 대해 높은 방어율을 보임

Momentum Iterative Fast Gradient Sign Method (MI-FGSM)

 

  • Non-targeted 공격을 위한 목적 함수
    • https://arxiv.org/pdf/1710.06081.pdf
      각 픽셀에 대해 epsilon만큼만 바뀔 수 있도록 하되, loss function값을 최대로 만들 수 있도록 하는 것. 
    • g_t는 처음부터 t개의 기울기(gradient) 정보를 갖고 있다. (Momentum)
      • 이전까지 기울기 정보를 활용해 poor local maxima에 빠지지 않도록 하고, 더 우수한 perturbation을 만들 수 있도록 한다.
    • 만약 μ 값이 0이라면 일반 I-FGSM과 같다.
    • 공격이 수행되는 과정에서 기울기 벡터 크기는 다양하게 존재할 수 있으므로 L_1거리로 정규화한다.
    • 전체 알고리즘
      • https://arxiv.org/pdf/1710.06081.pdf
  • MI-FGSM for Ensemble of Models
    • Ensemble in logits 메서드를 제안한다.
      1. Logits값 가중치 합을 계산한다.
      2. 이후 softmax cross-entropy loss를 이용해 전체 loss value를 계산한다.
    • Non-targeted 공격을 위한 목적 함수
      • https://arxiv.org/pdf/1710.06081.pdf
    • 전체 알고리즘
      • https://arxiv.org/pdf/1710.06081.pdf
  • MI-FGSM 장점
    • FSGM은 공격 대상 모델에 대해 under-fitting되는 특징이 있다.
      I-FSGM은 과하게 over-fitting되며 poor local miaxima에 빠질 수 있다.
      MI-FSGM은 withe-box 공격과 black-box 공격에서 모두 우수한 성능을 보인다.
    • MI-FSGM을 이용할 때 만들어지는 pertubation들의 코사인 유사도가 높다. 여러 번 attack을 시행하더라도 그 때 만들어지는 pertubation들이 유사한 특성을 가진다는 것이다. 즉, 특정한 local minima에 각각 개별적으로 빠지는 것이 아닌 상대적으로 더 global한 maxima를 찾을 수 있다는 것이다.
      • 안정적인 업데이트를 보인다. 쉽게 exceiptional decision region에 빠지지 않는다.
      • 결과적으로 높은 transferability를 보인다.

 

 

  • 들어가기 앞서
    • 자신감을 바탕으로 실패를 두려워하지 말자
      • 사람마다 해주는 조언이 다를 수 있다. 모두 자신 경험 기반이기 때문에
    • 하지만 공통되는 부분들이 있을텐데 그런 부분을 잘 찾아보자.
    • 내가 정말 원하는 것이 뭔지 잘 생각해보자.
    • 어떤 회사를 갈까?
      • 좋은 사람들이 있는 곳을 찾자.
      • 많이 시도해보자.
  • 데이터 관련 직군들
    • Data Scientist vs ML Engineer -> 크게 다르다고 보이진 않음. 
      • Feature Engineering
      • Recommendation
      • Search
      • Operation
    • Data Analyst
      • Marketing Anaylst
      • Product Analyst
      • A/B Test Analysis
    • Data Engineer
      • Data Warehouse & ETL
      • Feature computation & Data Scientist Support
    • MLOps
      • All about 'Continuous' ML model development and deployment
      • 자동화. 모델이 알아서 새로운 데이터 수집해 알아서 학습, 어느 정도 성능 나오면 자동으로 deploy
      • MLOps란?
        • DevOps가 하는 일
          • 개발자가 만든 코드 시스템에 반영하는 프로세스 (CI/CD, deployment)
          • 시스템이 제대로 동작하는지 모니터링 그리고 이슈 감지시 escalation 프로세스
            • On-call 프로세스
        • MLOps가 하는 일
          • DevOps가 하는 일 동일. 차이는 개발자 코드가 아닌 ML 모델이 대상이 된다는 점
          • 어떻게 ML 모델 개발을 더 쉽게하고 자동화해 자주 모델 빌딩을 하고 이를 프로덕션으로 런치할 수 있는가?
          • 모델 서빙 환경에 문제가 생기거나 모델 성능이 떨어질 경우 이를 어떻게 감지하고 조치를 취할 수 있나?
    • [요약] JD보고 포기하지 말라, 
    • 채용공고 예시 : https://team.daangn.com/jobs/%EA%B0%9C%EB%B0%9C-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/
  • 인터뷰 프로세스
    • 데이터 분석가로 시작해서 내부에서 데이터 과학자로 직무 전환하는 것도 좋은 전략
    • 채용 과정에서 과제를 줄 수 있다. 그 때 코드 리뷰가 있는데 이 피드백을 받아들이는 태도에 대해서도 뽑을지 안 뽑을지가 결정됨. 이후 수습기간으로 3개월~4개월 정도가 주어지는데 그 이후에 얼마나 발전했는가를 본다. 성장을 얼마나 하는 사람이 중요한 것이지, 얼마나 아는 사람이 중요한 것이 아니다.
    • 일반적 프로세스
      • JD 먼저 작성 후 잡 공고를 올림
      • 이력서 스크린
        • 커버 레터가 필요한가? - 별로 도움된다는 사람 없었다.. 오히려 거추장스러움
        • 데이터 일과 관련없는 과거 경력도 넣을까? - 꼭 넣어라! 더 나를 잘 이해할 수 있고, 데이터 과학은 여러 분야가 접목됐을 때 힘을 내는 분야이기도 해서 꼭 넣는게 좋다.
      • 전화 인터뷰
      • 온사이트 인터뷰
      • 레퍼런스 체크(백그라운드 체크)
      • 오퍼 후 네고 시작
      • 모든 면접관에게 잘하자
      • 질문 정리하고 복기하자.
      • Sometimes you win, Sometimes you learn. 인터뷰를 계속해서 어떻게 인터뷰하는게 좋을지 배우자. 연습을 계속하자.
  • 행동양식 질문들
    • Collaboration
      • 다른 팀에 속한 다수 사람들과 했던 프로젝트에 대해 얘기하기
      • 지금까지 가장 일하기 힘들었던 사람들은 누구이고 왜 힘들었는가?
    • Ownership
      • 프로젝트 중 문제가 생겼는데 그걸 주도적으로 해결한 경우가 있으면 설명해주세요
      • 프로젝트를 처음부터 끝까지 진행한 경우가 있다면 이에 대해 설명해주세요
    • Impact
      • 지금까지 한 프로젝트 중 가장 임팩트가 컸던 프로젝트에 대해 설명해주세요
    • Craftsmanship
      • 본인의 책임이 아니었음에도 불구하고 어떤 무제를 직접 해결하려고 했었던 적이 있다면 설명해주세요.
    • 굳이 지어내지 말고 없으면 없다고 하자. 
    • 대답을 얼마나 조리있게 하는가
      • 상황 / 업무 / 액션 / 결과 이 4개의 시나리오에 맞춰 대답하자.
  • 기술 질문들
    • 이력서에 써 있는 프로젝트를 보고 꼬리에 꼬리를 물고 질문
      • 어떻게 프로젝트가 디자인됐고, 어떤 결정들을 내렸으며 지금 다시 한다면 어떻게 바꿀 것인가?
    • 이력서에 작성한 프로젝트에 대해서는 세세하게 이해하고 있을 수 있도록 해야 한다.
    • 질문의 정확한 의도가 이해가 안 되면 정확히 짚고 다시 설명을 요청드린 후 답드리는 것도 중요하다.
  • 어떤 질문들을 해야할까?
    • 미리 회사를 검색해서 무엇을 하는 곳인지 찾아보기
    • 면접관이 자기 소개할 때 잘 듣고 그에 대해 짧게 질문해보는 것도 좋다.
    • 조인하게 되면 처음 무슨 일을 하는가? (hiring manager에게)
    • 지금 진행 중인 중요 프로젝트는 무엇인가?
    • 이 회사에 일을 잘하는 사람들은 어떤 특징을 갖고 있는가?
    • 지금 회사에서 제일 좋았던 점 그리고 안 좋았던 점 하나를 설명해줄 수 있는가?
    • 어떻게 돈을 버는가?
    • 지금 사용 중인 데이터 관련 기술 스택에 대해 설명이 가능한가?
    • 가장 좋은건 대화 흐름 속 본인이 정말 궁금한 걸 질문한 것. 그니까 면접관의 말을 경청하는 것이 중요하다. 좀 더 친밀하게 하려면 면접관이 무슨 질문을 했을 때 면접관이 한 질문을 다시 말을 하며 시작하는 것도 좋다.
  • 면접 전략
    • 취직 준비 방법
      • 닥치내대로 이력서 내고 닥치는대로 인터뷰하기
        • 정말 가고 싶은 곳은 나중에 인터뷰
        • Job Description 보고 나느 부족한 것이 많네 하고 쫄지 않기! - 자기 검열 금지!
      • 99번 실패해도 하나만 잡으면 된다는 패기
        • 실패에 상처받지 말자
      • 어디건 시작해서 발전해 나가면 된다. 빨리 시작하는 것이 더 중요하다!
        • 남들과 비교도 금지!
        • 시작은 미약하나 끝은 창대하리라. 시작하는 곳이 종착역은 아니다. 인생은 길다!
        • 회사 이름보다 같이 일하는 사람들이 더 중요하다!
          • 그 사람들이 발전을 해나가며 다른 길로 갈 것이다. 그러한 잘 닦인 길을 따라 가면 좋다!
        • 빨리 시작하고 거기서 필요한 것을 배우자. 공부를 위한 공부를 하지 말자. 이력서 혹은 포폴을 채우기 위한 공부도 하지 말자. 
        • 공부엔 끝이 없다. 현재 알고 있는 지식과 현업에서 원하는 지식과 갭을 빨리 찾고, 그걸 점점 줄여나가는 것이 취직을 하기 위한 지름길이 될 것이다.
    • 직장 선택 기준
      • 성장성
        • 회사가 성장하고 있는가? 회사 크기는 중요 X 이미 외부에서 어느 정도 검증 가능
        • Growing pain vs just pain
      • 사람 / 문화
        • 회사 내 inner circle이 존재하는가?
          • 존재하면 내가 들어가서 일을 잘해도 그 안에 끼지 않는 한 인정받기 쉽지 않다.
        • Inner circle 존재 여부는 안에 들어가서 일해보거나 잘 아는 지인이 회사에 있지 않은한 알기 힘ㄷ르다.
          • 존재하면 이 회사는 더 큰 성장을 이루는 것이 쉽지 않을 가능성이 높다.
      • 내 매니저
        • 내 매니저는 보고 배울 점이 많은 사람인가? 윤리적이고 공정한 사람이며 명확한 결정을 내리고 피드백을 잘 주는가? 회사 내에서 힘이 있는가?
        • 좋은 매니저랑 일을 하면 큰 도움이 된다.
          • 매니저가는 회사 따라가기
          • 이 사람이라면 어떻게 했을지.
      • 참고 : https://boards.greenhouse.io/daangn
  • 어떻게 잘 시작할 것인가?
    • The First 90 days(책)
      • 자기 검열하지 말고 매니저 스타일 팡가하고 피드백 요청
      • 과거 상처를 갖고 시작하지 않기
        • 이직할 때 왜 이직하려 하는가에 대해 얘기하게 될 때 전 직장 욕(과거 상처)하지 않기. 대신에 전 직장에 더 배울 게 없는 경우 이직을 하고, 이에 대해 얘기하는 것이 좋을 것이다.
      • 열심히 일하되 서두르지 않기
      • 남과 비교 않기
      • 작게라도 하나의 성공 이끌어내기
      • 필요할 때는 매니저님께 도움받는 것도 중요하다.
    • 새로운 기술 습득이 아닌 결과를 내는 데 초점 맞추기
      • 자신이 맡은 일을 잘 하기 위해 필요한 기술 습득
        • ex) 자동화하기 or 실행시간 단축
      • 자신이 맡은 일 성공/실패를 어떻게 결정하는지 생각
        • 매니저와 소통 중요
        • 성공/실패 지표에 대해 생각
      • 일을 그냥 하지 말고 항상 '왜' 이 일이 필요하고 큰 그림 생각
        • 질문하기
    • 피드백의 중요성
      • 스킬셋 관련 피드백
        • ex) 코드 리뷰
        • 유닛 테스트 작성하기
      • 행동 양식 피드백
        • Comfort zone과 연결되면 어려워짐
        • 레벨이 올라갈수록 중요해진다.
        • 편한 것만 하려고 하지 말고, 어려운 것에도 부딪히고 도전해보자
  • 취준 성공기 엿보기

  • 실무 필요 역량
    • 논문 구현 기술
      • Documentation 참고하기
      • 구글 검색하는 건 당연한 일이다! 
      • Baseline되는 모델 찾기 (안정적 코드 선택)
      • 왜 그래야 하는가? -> 대부분의 코드는 라이센스 문제가 있다. 기업은 이 라이센스 문제에 예민할 수 밖에 없기 때문에 직접 구현할 수 있는 기술을 가진 사람을 원한다
      • 구현해보고 정답과 비교하기
        • 처음 논문을 구현하면, 구현된 코드가 잇는 것을 시도하라
          • 첫 번째 : 학습 결과 비교
          • 두 번째 : 구현 스킬 비교
        • 논문 실험 결과와 비교하라
      • 구현을 정말 못하겠으면 구현된 코드를 내 스타일 코드로 변경하라
    • pytorch <-> tensorflow
      • pytorch로 되어있는걸 tf로 tf로 구현되어있는걸 torch로 바꿔보기
      • 왜 필요할까?
        • 연구자들은 torch를 선호한다
        • TPU로 학습해야 하는 경우 tensorflow만 가능
        • Python은 서버로 큰 오버헤드가 될 수 있다.
      • 일단 둘 중 하나 마스터하기
      • https://github.com/tango4j/tensorflow-vs-pytorch
    • 최신 기술 빠른 조사 및 적용
      • Papers with code
      • 블로그나 유튜브로 논문 리뷰해놓은 곳 보고 면접 때 활용하기..ㅎ
      • 캐글 적극적으로 활용하기
        • 데이터셋도 다 주고 TPU 환경까지 지원한다!
        • EDA code > Train code > Inference Code
      • 논문도 좋은 논문 읽기
        • conference 논문 매우 짧은 주기
        • journal 논문 검토하는 데 굉장히 많은 시간을 들인다. 
        • 대부분의 가치로는 저널 > 학회 그러나 컴퓨터는 학회에서의 가치가 굉장히 높다. 빠른 변화때문에!
      • 학회 : CVPR(Top Tier), ICCV/ECCV, SIGGRAPH, NIPS, ICML, AAAI, ACL, EMNLP, ... -> 믿을만하다!
        • Arxiv는 학회 저널은 아니고 논문을 자유롭게 올릴 수 있는 블로그같은 곳이다.. 검토가 덜 됐는데 다른 사람한테 검토를 받고 싶을 때 올리는게 아카이브.
      • 행사 : 네이버 데뷰, if kakao, NVIDIA GTC, ...
      • 커뮤니티 - Facebook tensorflow korea 등
  • 포장은 나쁜 것이 아니다
    • 거짓말을 많이 하라는 것은 아니다!
    • 들어 가기 전엔 나의 경험, 나의 방법을 잘 포장, 들어가면 회사 실적, 회사 방법을 잘 포장해야 한다.
    • 가고 싶은 기업에 대해 좋은 것만 보고 회사의 가치를 높여주어야 한다. 회사가 추구하는 가치를 직원이 잘 이해하고 있음을 표현하면 회사의 방향과 align되는 것이니 아주 유리하게 작용할 것.
    • 포폴에 쓴 것이 정말 내 것이 맞는 지 검증하고자 면접을 하는데 이 때 스토리텔링을 통해 가치를 심자. 시작부터 차근차근 설명해나가는 스토리를 적어나가자. 그 가운데 만난 역경을 이겨낸 경험, 실패한 경험들을 흥미롭게 느낀다.
    • 그렇다고 하지 않은 것을, 할 수 없는 것을 했다고 말하지는 말자... 거짓말은 최악인듯 들키면 완전 망...ㅎ
    • 면접관이 더 효율적이나 어려운 방법을 제안했을 때 아 그거 해보려고 했는데 잘 안 됐어요.. 이러면 탈락. 왜냐면 면접관이 해보고 더 좋은 결과를 이미 냈었던 것이기 때문에. 그 사람이 한 것을 무시하고, 틀렸다고 하는 것이 될 수 있다. 더 좋은 아이디어 주셔서 감사합니다.. 하고 실제로 집 가서 해보기! 실제로 여러 회사에 비슷한 직군으로 면접을 다니게 될텐데 다들 비슷한 기술에 대해서 관심이 있을 것이기 때문에.
      • 직접 실험해보고 실제 좋은 성과를 낸 경우가 있었다면 당연히 이를 적극적으로 어필해야 한다. 그러나 이는 도박..
    • 상대가 문제내기 전에 자신이 먼저 문제를 내고 해결해 나가라!
  • 들어가기 전 : 나의 경험, 나의 방법
    • 예제 코드로 다른 데이터에 적용해보자!
      • 자신이 직접 데이터를 모으고, 전처리하는 과정을 경험한 것을 선호한다. 이 과정에서 문제를 설정하게 되기도 한다.
      • 구현하기 쉬운거 찾아(loss function이 쉽다) 내 코드에 적용시켜 성능이 향상했다는 스토리텔링 굿
      • 뭘 바꿔야할지 모르겠으면 일단 다 추가하자! 그러다 하나씩 빼면서 테스팅하자. 그러다 갑자기 성능이 갑자기 확 나빠지면 그 직전에 뺀 것이 성능을 크게 늘리는데 기여를 한 것이다.
    • 지원하고자 하는 곳과 유사 컨셉으로 수정
    • 무난한 성공보단 역경있는 실패
    • 포폴에 쓴 기술은 아무리 이해못해도 사전적으로라도 꼭 외워두고 가야한다.
  • 들어가면서 : 회사 실적, 회사 방법
    • 회사에서 어떤 일을 하고 싶은가?
    • 회사에서 어떻게 일을 할 것인가?
  • 관련 기업과 세부직군
    • 머신러닝 기업 
      • UPSTAGE
      • MINDs Lab
      • oddconcepts
      • Lunit
      • SCATTER LAB
      • VUNO
      • JLK INSPECTION
      • sendbird
      • Riiid
      • bepro
      • 인공지능만 다루기 때문에 길게 오래 한 프로젝트를 갖고 간다.
    • 기업에서 머신러닝
      • 삼성전자, 종기원, 리서치 등
      • LG 전자, CNS, CTO 등
      • 네이버, 클로바, 랩스, 라인 등
      • 카카오, AI, 뱅크, 엔터프라이즈, 엔터테인먼트 등
      • 조직 변화가 굉장히 빠르다. 하다가 잘 안되면 금방 뒤집어 엎음
    • b2b와 b2c 차이, 최고는 연구조직(상품 팔 필요가 없으니 연구만 하면 됨)
    • 상상도 못한 정체인 기업들
      • 이마트 24 - data scientist
      • LG 화학 - 인공지능, 빅데이터
      • 아모레퍼시픽 - 머신러닝 엔지니어
      • 외주 주고 검수하는 정도가 될 수 있음. 규모가 굉장히 작아서...
    • 직무를 보고 직업을 고르는게 맞다. 개인적으로 생각하는게 다 다르기 때문에
    • 유사직군
      • 프로덕트 분석가
      • 비즈니스 분석가
      • 퍼포먼스 마케터
      • CRM 마케터
      • 그로스 해커
  • 좋은 회사 고르는 법
    • 회사 정보 보는 법(직무, 구성원, 복지 등)
      • 직무가 자세하면.. 좋다 이는 개인 취향으로 보고 끌리면 지원하는게 좋지 않을까?! 
      • 회사 구성원 보기. 능력있는 사람이 있는가?
      • 복지 좋은 회사! 연차 자율성, 출퇴근 제도
    • 잡플래닛, 블라인드 살펴보기
      • 리뷰들 믿을 만하다..
    • 선발대(선배, 친구, 동료)의 후기, 하지만 결국 팀바팀, 사바사
  • 들려주고 싶은 이야기
    • 초봉의 중요성
      • 개발자와 데이터사이언티스트/머신러닝/인공지능 구분
        • 당신 직무가 구분이 없을 수 있다. 그러면 당신은 일반 개발자의 업무 비중이 더 높을 수 있고, 나중에 포트폴리오도 원하는 방향으로 쌓이지 않아 이직이 어려워진다.
        • 일반 개발자가 3800, 머신러닝 개발자도 3800.. 이러면 가면 안 된다. 일에 구분을 두지 않게 될 수 있다.
      • 사람을 얼마나 중요하게 생각하는지에 대한 증거
        • 직원을 중요히 생각하지 않으며 사소한 일부터 큰 일까지 다양한 문제들 발생
      • 연봉 인상은 %로 이뤄진다.
      • 이직할 때 직전 직장 연봉 기준으로 % 인상
      • 좋은 회사 오래 다니는 것보다 이직하면서 연봉을 높여가는게 더 좋다
    • 커뮤니티 활동
      • 많은 회사와 팀들 직무에 대한 정보를 얻을 기회
      • 추천 입사 중요성
      • 입사만 생각할게 아닌 이직도 생각하기
      • 지속적 배움의 기회
      • 새로운 분야에 대한 접근 기회
    • 공모전과 경진대회
      • 요즘 유행하는 것
      • 하지만 아직 인식에서는 실무보단 쉬운 것
        • 실무랑 크게 다르지 않단 것을 (면접관이 하고 있는 일 수준을 낮추는 방법은 절대 안 됨!) 문제 난이도가 높다는 것을 잘 설명
    • 불합격의 의미
      • 서류
        • 실패해도 서류는 포장 꼭 잘하기!!
      • 코딩 테스트
        • 이직 시에도 본다. 계속 공부해야 한다... 코딩은 무조건 공부해야 한다.ㅜㅜ 구글은 디자인패턴도 가고 더 복잡해진다.
      • 기술 면접
        • 내 프로젝트에 대한 기술적 지식이 부족했는지 이해하고 보완해야 한다.
      • 임원 면접
        • 태도 문제. 회사가 원하는 인재상에 맞추지 못했다는 것. 솔직하게 말했는데 맞지 않으면 그래서 불합격하게 된다면 회사 자체가 나한테 맞지 않은 회사인 것이니.. 오히려 좋아
        • 회사를 떠날지에 대한 질문을 할 때가 있다. 대학원 갈 생각있냐? 스타트업할 생각있냐? 이런건 함정 질문. 무조건 아니라고 하기! 맞아도 아니다!

  • 클라우드 활용하는게 이점이 되는 회사가 있고, 아닌 회사가 있다.
    • 욕심이 있는 회사는 자사가 클라우드를 운영함
    • 클라우드 다루는 회사는 한정되어 있다
  • 쿠다 GPU 연산 프로그래밍이 따로 있다. 임베디드 시스템에 많이 쓰임. 자동차에 많이 쓰이는 시스템. 그런 회사 아니면... 쓸모 없음
  • Flask는 소규모 서버 (micro 단위) Django 모듈 이식할 때. 학습한 모델 서빙은 Flask가 어울린다. 그걸 이용해 웹서비스까지 만들면 Django. 근데 대부분 Django는 안 쓰기 때문에.. Flask 연동하는 정도만 해도 괜찮음. 기업 규모가 작으면 Django를 쓰지만...
  • 도커는 구분 없이 다 다룰줄 알아야 한다
  • 쿠버네티스는 배포할 줄 아는 사람이 필요. MLOps 필요. 그러나 나머진 크게 필요하진... 그런데 MLOps가 없는 회사도 많기 때문에 이런 회사는 ML 엔지니어가 이런 부분도 다룸
  • cs 지식 면접볼 때만 필요. 백엔드는 100%해야함 머신러닝 리서처는 안 해도 되는 추세. 페이징같은 것. 세그먼트 가상 메모리 이정도만 물어봄. 이직할 땐 안 물어봄
  • 코딩 테스트를 우선 많이 공부해야 한다.
  • 고프 디자인 패턴 책 읽어서 객체 지향형 프로그래밍 공부
  • google.qwiklabs.com 강의가 있다. 클라우드 관련 빅데이터 관련 강좌를 들으면 실습 클라우드 서비스를 다 제공해준다. 이를 활용하면 대용량 데이터 처리를 하는 데 감을 얻을 수 있을 것
  • 선형대수 공부하자. 딥러닝 행렬 연산에 대해서 이해할 수 있어야 하니까...
    • 인과관계와 상관관계의 차이점이 무엇인가?
    • A/B 테스트란?
  • 계산을 해보자. AI를 안 할 것이라면 새로운 것을 할 것이다. 그러면 새로운 것에 대한 공부를 해서 취업을 하는.. 여기에서의 시간과 AI로 일단 취업하고 거기서 직무를 바꾸는 것에 걸리는 시간.... 공부하면서 느끼는 흥미와 일하면서 느끼는 흥미는 다르기 때문에 일단 취업해서 일해보는 것을 추천
  • 아무것도 안 한 것같은 날들도 분명히 되돌이켜보면 해놓은 것이 있을 것이다. 이것을 잘 포장하면 1년동안 한 일이 의미있는 일로 탈바꿈할 수 있을 것이다!
  • 모델 가속화 - 모델 가지치기(Pruning)
  • Ops는 개발자와 운영진을 연결해주는 역할

Generative Model

 

  • Probability Density Function
    • PDF : Probability Density Function (확률 밀도 함수)
      수식 기호 : p_z
    • Sample drawn from the PDF
      수식 기호 : z ~ p_z
    • 영상을 만들어내는 PDF를 알고 있으면 영상을 생성할 수 있다.(p_data) PDF값이 큰 sample을 생성하면 됨.
      • 그러나, PDF를 구하는 것이 불가능. 그래서 나온 것이 GAN
  • GAN(Generative Adversarial Network)
    • Generator : 가짜 돈(데이터)을 만들어 속이는 역할
    • Discriminator : 가짜 돈인지 실제 돈인지 가리는 것
      • Generator가 생성한 가짜 돈을 Discriminator가 구분해내지 못했을 때 모델이 다 학습을 마쳤다고 볼 수 있다.
    • 구조
      • 노이즈 -> Generator -> 가짜 -> Discriminator -> 가짜 or 진짜
                           ↑            진짜↗          |
                            |__________________________|
                                        피드백
      • 노이즈 : Input data. 가우시안 노이즈. 이 노이즈에 따라 다른 결과값을 도출하게 된다. z_1, z_2, ..., z_n
      • Generator : 매핑 함수의 역할을 할 수 있는 Generator 생성 G(z_1), G(z_2), ..., G(z_n)
        이 Generator도 Convolution Network였다. 이 때 Fractionally-strided convolution 연산을 시행하였다.
      • 가짜 데이터 : G(z) ~ p_data
      • Discriminator : 진짜 데이터가 들어오면 높은 값, 가짜 데이터가 들어오면 낮은 값을 반환시키는 것. D(x)
        예전의 D는 그저 Convolution Network였다. 
      • Cost Function
        하나의 영상에 대한 GAN Cost function
        여러 개의 영상에 대한 GAN Cost function(2)
        여러 개의 영상에 대한 GAN Cost function에서 기댓값은 실제로 구할 순 없는 개념 상의 수식이다. 이를 사용하기 위한 방법으로는 많은 데이터를 쓰는 것이 가장 쉬운 방법이다.

        아래는 Cost function을 최적화시킨 것이다.
        바로 위에 식에서 D와 관련있는 부분은 뒷 부분 (E_z~p_z(z)[log(1-D(G(z)))]이다. 우리는 D(*)에 G(z)가 들어갔을 때 높은 값을 내길 원하기 때문에(=Generator가 만든 가짜 데이터를 진짜라고 인식하는 비율이 크길 원하기 때문에) 결국, 1-D(G(z))는 낮은 값이길 원하니 이 전체의 값을 최소화하는 G를 구하고 싶은 것이다. 
        D에서는 Grandient Descent가 아닌 Ascent. 값이 증가하는 방향으로 Gradient를 Update시켜야 한다.
        G에서는 Gradient Descent로 Gradient Update.
    • Walking in the latent(=z, G(z)에 쓰이는 z) space
      • z 자체는 노이즈일 뿐인데, 이를 의미있는 데이터로 만들어주는 매핑 함수 G( * )가 잘 만들어졌는가를 살펴보기 위해 만들어진 개념이다. z space에서 이동을 할 때 급작스러운 변화를 보이는 것이 아닌 걷는 것처럼 점진적인 변화를 보여줘야(부드러운 변화를 보여줘야) G( * )가 잘 학습됐다고 얘기할 수 있다는 것이다.
        (참고 : http://jaejunyoo.blogspot.com/2017/02/deep-convolutional-gan-dcgan-2.html)

Universal Loss로서의 GAN

 

Pix2Pix

 

  • Loss
    • Fixed Loss의 단점
      • 수많은 영상의 결과에서 얻은 Loss에 대한 평균값에 대해 학습시키는 것이기 때문에 좋지 않은 결과를 도출해내곤 했다. 
        Image colorization에선 정확하지 않은 색을, Super resolution에선 선명하지 않은 영상을 반환했다.
    • Universal Loss
      • 위의 Fixed Loss의 단점을 보완하기 위해서 사용한 것이 Universal Loss이고 실제로 성능이 굉장히 좋아진 것을 확인할 수 있다고 한다. 이 때에도 GAN이 사용이 된다.
      • L2대신 Discriminator를 사용한다. 이 Discriminator 자체를 Loss로 둔다. 이것과 위에서 살펴본 GAN과의 차이는 Input에 있다. 아까는 임의의 노이즈를 준 반면, 이 때의 Input으로는 하나의 영상을 주게 된다. 그 외 나머지는 다 같다. 이 때의 GAN을 Pix2Pix라고 한다.
  • PatchGAN : Patch 단위로 Discrminate한다. 한 Patch가 어느 정도 영역을 보고 있는지에 대해 나타나있는 것이 Receptive Field
  • Pix2Pix Loss 함수
    • 뒤에 부분인 λL_(L1)(G)는 Fixed Loss이다. 수많은 영상에 대해서 만족스러운(평균을 낸) Loss값을 도출해내야 하므로 뒤에 수식만 사용하여 Loss를 구하면 아까 단점으로 언급했던 바와 같이 fade된(뿌얘진/노이즈가 낀) 영상이 반환된다.
      그럼 앞에 부분 수식만 쓰면 되는 것 아닌가? 이 또한 아니다. 가령, 흑백 영상을 컬러 영상으로 변환한다고 하자. 이 때 앞에 수식은 Input으로 주어진 흑백 영상을 고려하지 않고 그저 컬러인 영상만을 만족하는 영상을 반환하게 된다. 즉, Input과 완전히 다른 그저 색깔만 입혀진 영상을 내는 것이다. 그래서 뒤의 L1 Loss를 주어 원래의 Input과 유사한 형태의 결과를 반환할 수 있도록 하는 것이다. 이처럼 두 수식이 서로 보완을 해주며 작동을 해야 더 좋은 성능을 나타나게 된다.
      L_c에서 c는 conditional이다.
      아까 본 GAN에서 D( * ) 함수와 G( * ) 함수에 들어가는 파라미터가 달라졌다.
  • Pix2Pix Structure
    • 가짜 데이터를 학습시킬 땐, 원영상 x와 변환하고자 하는 목표 영상 y 쌍 {x, y}가 필요하다. 이런 데이터를 많이 준비해 학습시키면 된다.

 

Conditional GAN

 

  • 앞서 살펴본 Pix2Pix도 Conditional GAN에 포함된다. Conditional GAN은 그 말마따나 GAN에 추가적인 조건(condition)을 더한 것이다.
  • Conditional + Stack GAN
    • Text를 임베딩하여 하나의 벡터로 만들어 활용하는 것이 Stack GAN으로, 이 때 나온 vector를 condition으로써 적용시킬 수 있다.
      StackGAN
      Conditional+Stack GAN

Progressive GAN

 

  • 4x4로 downsampling한 영상만 보여주며 이와 구분이 안 되는 4x4 가짜 영상을 만들게끔 한다. 이를 하나의 입력으로 넣어 이 때의 8x8 영상을 만들도록 한다. 이 과정을 반복하여 나중에 고해상도의 1024x1024 영상까지 만들어내도록 한다. 굉장히 좋은 퀄리티의 영상을 얻어낼 수 있다.
    Progressive GAN

 

CycleGAN

 

  • Pix2Pix같은 경우 쌍으로 존재할 때 학습이 가능했다. 그러나 우리는 Unpaired된 쌍도 유사한 feature가 되도록 변화하는 작업을 하고 싶은 경우가 생길 수 있다.(가령, 말을 얼룩말로 변환한다거나...) 이를 위해 만들어진 것이 CycleGAN
  • Figures from the tutorial of Alexei Efros, UC Berkeley at ICCV 2017 Tutorial on GANs
    여기선 G와 F라는 두 개의 함수를 학습시킨다. min(||F(G(x)0 - x||)값을 구하게 된다.
    x와 F(G(x))와 비슷하도록 하는 제약조건을 주면 G(x)도 비슷할 것이라는 개념을 활용하는 것이다. 당연히 G(x)로 변환한 F(G(x))가 원래의 원본과 완전히 다르면 제대로 학습이 안 됐다고 볼 수 있을 것 이다.
  • CyCADA
    • CycleGAN에 Semantically Consistent만 붙인 것이다.
      the tutorial of Judy Hoffman at ICCV 2019
      위에서 Domain Adversarial이 Discriminator다.

Domain Adaptation 

 

이해를 아직 못해서 제대로 정리 못했습니다 이 부분은 넘어가주셨으면 합니다.

 

  • GAN에서 쓰이는 adversarial loss가 Domain Adaptation에 중요한 요소 기술이 되고 있다.
  • 모아놓은 데이터에 Bias가 있을 수 있다. 이러면 Low resulution, Motion Blur, Pose Variety와 같은 문제가 생기면 제대로 인식이 되지 않을 수 있다. 그러면 그러한 케이스를 다 가진 데이터를 모으면 되지 않은가, 그것은 비용이 너무 비싼 것이 문제이다. 그래서 나온 것이 Domain Adaptation이다. 깨끗한 영상에 대해 학습을 했지만, 비교적 저품질의 input이 들어와도 제대로 인식할 수 있게끔 해준다.

Deep Domain Adaptation

the tutorial of Judy Hoffman at ICCV 2019

각 feature vector의 분포(직접 만들 순 없고 개념적인 것)에 차이가 있을 것이라고 본다. 이 분포 간 차이를 측정하기 위한 도구로 Max Mean Discrepancy가 있다.(KL divergency라는 것도 있다고 한다..!) 이 차이를 줄여야 한다.

Classification 학습
Maximize the confusion of domain classifier


Style Transfer (스타일 전이)

 

  • content 영상에 style 영상의 style을 전이하는 것이 목표이다.
  • Style 정의
    • Slide Credit : Andrew Ng
      스타일은 채널 간 activation 사이의 상관관계라고 정의한다.

 

+ Recent posts