[Fast.Ai] FaceBook Fast.Ai Kr Study #1

2020. 8. 30. 20:19AI/DL

개념설명 & 과제를 진행할 같아요. 그리고 실전으로 가벼운 코딩 문제 여러 개 풀기?

 

[교재]

 

fastai/fastbook

Draft of the fastai book. Contribute to fastai/fastbook development by creating an account on GitHub.

github.com

 

Chapter 1. Intro 페이지
1. Deep Learning Is for Everyone 3
2. How to Learn Deep Learning 12
3. The Software: PyTorch, fastai, and Jupyter (And Why It Doesn’t Matter) 12
4. Running Your First Notebook 20
5. What Is Machine Learning? 20
6. Limitations Inherent to ML 26
7. How Our Image Recognizer Works 26
8. What Our Image Recognizer Learned 36
9. Image Recognizers Can Tackle Non-Image Tasks 36
10. Deep Learning Is Not Just for Image Classification 48
11. Validation Sets and Test Sets 48
12. A Choose Your Own Adventure Moment 54

0. Your Deep Learning Journey

  • 딥러닝 이면의 핵심 개념을 소개한다.
  • 기술적 배경이나 수학적 배경에서 오지 않아도 괜찮다.

1. Deep Learning Is for Everyone

[딥러닝에 대한 잘못된 이야기와 진실]

  • 수학이 많이 필요하다 >> 고등학교 수학만으로 충분합니다
  • 많은 데이터 >> 50개 미만에서도 유의미한 결과를 보았습니다.
  • 비싼 컴퓨터 >> 무료로 충분히 얻을 수 있습니다.

 

 

[딥러닝]

  • 신경망을 이용하여, 데이터를 추출하고 변환하는 컴퓨터 기법
  • Layer는 오류를 최소화하고 정확성을 향상시키도록 훈련 됨

 

 

[딥러닝을 사용하는 분야]

  • 자연어 처리(NLP): 질문 답변, 음성 인식, 문서 요약, 문서 분류, 문서 이름 찾기, 날짜 찾기, 개념 언급 기사 검색
  • 컴퓨터 비전: 위성 및 드론 이미지 해석(예: 재해 복구용), 얼굴 인식, 이미지 캡션, 교통 표지판 읽기, 자동 차량 내 보행자 및 차량 위치 확인
  • 약학: CT, MRI, X선 영상을 포함한 방사선 영상에서 이상 징후 발견, 병리학 슬라이드의 특징 개수, 초음파 측정 기능, 당뇨병성 망막병증 진단
  • 생물학: 접이식 단백질, 단백질 분류, 종양-정상 염기서열 분석 및 임상적으로 실행 가능한 유전자 돌연변이 분류, 세포 분류, 단백질/단백질 상호작용 분석 등 많은 유전체학 과제
  • 이미지 생성: 이미지 색조화, 이미지 해상도 향상, 이미지 노이즈 제거, 유명 아티스트 스타일로 이미지 변환
  • 추천 시스템: 웹 검색, 제품 권장 사항, 홈 페이지 레이아웃
  • 게임: 체스, 바둑, 대부분의 아타리 비디오 게임, 그리고 많은 실시간 전략 게임
  • 로보틱스: 찾기가 어렵거나(예: 투명, 광택, 텍스처 부족) 픽업하기 어려운 객체 취급
  • 기타 응용 프로그램: 재무 및 물류 예측, 텍스트 음성 변환 등...

 

 

주목할 것은, 적용분야는 달라도 딥러닝은 신경망에 기초하고 있다.

이에 대한 시야가 넓어지기 위해서는 역사에서 출발하는 것이 좋다.

 

 

Neural Networks: A Brief History

1943년 신경생리학자 Warren McCulloch와 논리학자  Walter Pitts가 팀을 이뤄 인공 뉴런의 수학적 모델을 개발했다.

그들은 paper "A Logical Calculus of the Ideas Immanent in Nervous Activity"에서 다음과 같이 선언했다.

"All-or-none" 특성 때문에, 명제논리로 처리할 수 있다.

뉴런의 수학적 모델은, add와 threshold를 사용하여 간단하게 modeling 할 수 있다.

그러나 다들 알다시피 XOR 같은 중요 수학 함수를 배울 수 없음이 보여짐으로써, 향후 20년동안 학계는 신경망을 포기했었다.

 

지난 50년간 Neural Network 에서 중요한 작업은 1986년 MIT Press에서 발표한 다량 병렬 분산 처리(Parallel Distribution Processing, PDP) 이다. (현대 인공신경망과 유사)

 

80-90년대 신경망 모델들은 이론적으로, 뉴런의 한 층만 더하면 어떤 수학적인 기능도 이러한 신경망과 근사하게 추정할 수 있을 만큼 충분했지만, 실제로 그러한 네트워크는 종종 너무 크고 너무 느려서 유용하지 못했다.


연구자들은 30년 전에 실용적으로 좋은 성능을 얻기 위해서는 훨씬 더 많은 뉴런 층을 사용해야 한다는 것을 보여주었지만, 이 원리가 더 널리 인정받고 적용되어 온 것은 지난 10년 동안이다.

 

신경 네트워크는 컴퓨터 하드웨어의 개선, 데이터 가용성 증가, 신경 네트워크를 더 빠르고 쉽게 훈련시킬 수 있는 알고리즘 트윗으로 인해 더 많은 계층의 사용과 결합한 덕분에 마침내 그들의 잠재력에 부응하고 있다. 

 


2. How to Learn Deep Learning

  • 야구를 가르치려면, 먼저 야구 경기에 데려가거나 야구를 플레이하게 하세요!
  • 음악을 가르친다면, 먼저 음악을 듣거나 연주하도록 하세요!
  • 딥러닝을 가르친다면, 먼저 모델을 만들고 더 나은 모델을 만들고자하는 동기를 갖게 하세요!
  • 불행히도, 여기서 딥러닝에 관한 많은 교육 자원이 시작된다.
  • 학습자들은 실제 작동 코드의 예를 전혀 제시하지 않고 헤시안 및 테일러의 손실 기능의 근사치 정의와 함께 따라야 한다
  • 당신은 실제 경험을 통해서만 더 나아질 수 있다.
  • 그 이론에 너무 많은 시간을 투자하려고 하는 것은 역효과를 만들 수 있다. 

 

기억하라, 딥러닝에서 성공하기 위해 특별한 학력이 필요하지 않다.

지난 10년간 가장 영향력 있는 논문 중 하나인  "Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks" 같은 박사학위가 없는 사람들에 의한 연구와 산업에서 많은 중요한 발전이 이루어졌다.

 

"박사 학위는 꼭 필요하지 않습니다.
중요한 것은 AI에 대한 깊은 이해와 실제로 유용한 방식으로 NN을 구현하는 능력입니다.
고등학교를 졸업해도 상관 없습니다."
- Elon Musk

 


3. The Software: PyTorch, fastai, and Jupyter (And Why It Doesn’t Matter)

우리는 파이토치가 딥러닝을 위한 가장 유연하고 표현력이 풍부한 library라는 것을 발견했다.

PyTorch는 단순함과 속도, 두 가지를 모두 제공한다.

 

  • fast.aiPyTorch 기반 higher-leverl functionality를 제공(이 책은 fastai v2 사용)
  • 어떤 라이브러리를 사용하는가 자체는 크게 중요하지 않음
  • 고수준 개념 설명에는 fastai, 저수준 개념 설명에는 pytorch나 순수 python 사용 예정
  • 어차피 몇년 있으면 또 새로운 게 나올 것
  • 새로운 것들이 너무 빠르게 등장하고 있는 상황에서 정말 중요한 포인트는
    밑바탕에
    있는 테크닉과 어떻게 그것들을 실전에 적용하며,
    새로운 툴과 테크닉들이 발표될 때,
    얼마나 빠르게 전문성을 키울 수 있는가에 초점을 맞추는 것
  • fastai의 사용법과 내부 구현까지를 모두 이해하는 것이 목표  

4. Running Your First Model

  • 말했던 것처럼, 어떻게 작동하는지 설명하기 전에 동작하는 것을 보여줄 것이다.
  • Top-down 방식으로 진행

Colab을 사용하자

 

Google Colaboratory

 

colab.research.google.com

#id first_training
#caption Results from the first training
# CLICK ME
from fastai.vision.all import *
path = untar_data(URLs.PETS)/'images'

def is_cat(x): return x[0].isupper()
dls = ImageDataLoaders.from_name_func(
    path, get_image_files(path), valid_pct=0.2, seed=42,
    label_func=is_cat, item_tfms=Resize(224))

learn = cnn_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(1)

위 코드는 다음 동작을 수행한다.
1. Oxford-IIIT Pet Dataset
에서 7,349장의 고양이/강아지 사진 데이터를 다운로드 후 압축해제
2. pretrained model을 다운로드( resnet34 )
3. 2.
에서 받은 pretrained model에 대해 fine tuning 진행

이 모델이 괜찮은지 어떻게 알 수 있을까?

표의 마지막 열에서 잘못 식별된 영상의 비율인 오류율을 볼 수 있다.

 

마지막으로 이 모델이 실제로 작동하는지 확인해 봅시다. 가서 개나 고양이의 사진을 가져와

#hide_output
uploader = widgets.FileUpload()
uploader

 

#hide
# For the book, we can't actually click an upload button, so we fake it
uploader = SimpleNamespace(data = ['images/chapter1_cat_example.jpg'])


img = PILImage.create(uploader.data[0])
is_cat,_,probs = learn.predict(img)
print(f"Is this a cat?: {is_cat}.")
print(f"Probability it's a cat: {probs[1].item():.6f}")


Is this a cat?: True.
Probability it's a cat: 0.999986

 

Congratulations on your first classifier!

 


5. What Is Machine Learning?

  • 딥러닝 모델은 신경망을 사용한다.
  • 신경망은 1950년대부터 시작되었다.
  • 딥러닝은 ML의 현대적인 영역이다.

 

  • 이 Section은 ML이 무엇인지 설명한다.
  • 주요 개념들을 살펴본다.

 

  • ML은 그냥 프로그래밍처럼, 컴퓨터가 작업을 완료하게 만드는 방법이다.
  • Programming을 할 때, 우리는 Program을 작성한다.

 

#hide_input
#caption A traditional program
#id basic_program
#alt Pipeline inputs, program, results
gv('''program[shape=box3d width=1 height=0.7]
inputs->program->results''')

[이런 모양으로]

 

  • 그런데, Program을 작성하는 방법은, Object를 Detection하는데는 적합하지 않다.
  • Recognition 하는 과정은 우리가 의식하지 않는 순간에 뇌에서 일어나기 때문에,
    이를 매순간의 flow로 Program을 작성하는 것은 쉽지 않다.

 

  • 그래서 방법을 바꿨다.
  • 1962년, IBM의 Arthur Samuel, "Artificial Intelligence : A Frontier of Automation"
  • 해결에 필요한 단계를 작성하기 보다는
  • 풀어야 할 문제의 예를 보여주고, 해결 방법을 컴퓨터가 작성하도록 바꿧다.
  • 4가지 중요개념

 

Weight Assignment Actual Performance Automatic Means Mechanism
: 단순한 변수 : 가중치를 준 결과 : 결과를 자동으로 시험하는 수단 : 가중치를 수정해서 결과를 개선하는 방법

 

4가지 중요개념을 하나씩 알아본다

 

Weight : 변수에 불과하다.

#hide_input
#caption A program using weight assignment
#id weight_assignment
gv('''model[shape=box3d width=1 height=0.7]
inputs->model->results; weights->model''')

[Before ~ After]

[주요 변경점]

  • Box 이름 : Program → Model :: 모델은 프로그램의 특별한 한 형태임을 반영
    - weight는 요새 parameter라고도 불린다.
    - 용어는 시대에 따라 다르게 불리기도 함.
    - 중요한 것은 개념은 변하지 않는다는 것

 

Automatic Means :

- 두 model이 대결하도록 설정하고, 이기는 모델을 보면 성능을 자동으로 테스트 할 수 있다.

 

Mechanism :

- 이긴 모델과 진 모델의 weight를 열어보고, 이긴 모델의 weight 쪽으로 weight를 변경한다.

#hide_input
#caption Training a machine learning model
#id training_loop
#alt The basic training loop
gv('''ordering=in
model[shape=box3d width=1 height=0.7]
inputs->model->results; weights->model; results->performance
performance->weights[constraint=false label=update]''')

[모델이 진화하고 있어요]

 

모델이 훈련되어서 최종으로 도달하면, 더 이상 weight가 변화하지 않을 거에요.

그러면 우리가 처음 생각했던 프로그램과 같은 형태로 나올 거에요

[회귀해버렸다]

 

What Is a Neural Network

  • 전략을 선택 하는 체커 프로그램과 같은 곳에서 가중치가 어떻게 선택 될지 상상하는 것은 어렵지 않다.
  • 그러나 Recognition과 같이 의식하기 전에 일어나는, 이미지 인식/텍스트 이해 같은 곳에서 어떻게 모델이 보일지는 분명하지 않다.
  • 하지만, Weight를 변화시킴으로써 Recognition과 같은 문제를 풀 수 있는 것이 가능하다.
  • 그만큼 신경망이 유연하고, 또 한편으로는 그러한 문제를 해결하기에 신경망이 적절하다는 것을 의미한다.
  • 신경망은 강력하다.
  • 혹시 "메커니즘"이 완전히 새롭지는 않을까? 그런 일반적인 방법도 존재한다.
  • 이것을 SGD 라고 부른다.
  • SGD가 어떻게 작용하는지 알아본다.

 

A Bit of Deep Learning Jargon

  • Architecture :  model의 기능적 형태 
  • Weight == Parameter
  • Predictions : 독립변수의 결과
  • results == predictions
  • measure of performance == loss
  • loss는 예측값과 참값 둘다에 영향을 받는다.
#hide_input
#caption Detailed training loop
#id detailed_loop
gv('''ordering=in
model[shape=box3d width=1 height=0.7 label=architecture]
inputs->model->predictions; parameters->model; labels->loss; predictions->loss
loss->parameters[constraint=false label=update]''')

[label이 추가됐쥬]

 


6. Limitations Inherent to ML

이 그림에서 딥러닝 모델 훈련의 기본적인 것들을 볼 수 있다.

  • input data가 없으면 만들어 질 수 없다.
  • 모델에서 나오는 것은 오직 Prediction이다. action이 아니다.
  • input data만 가지고 만들어지지는 않는다. label도 필요하다

 

일반적으로 조직에서 Data가 충분하지 않다는 것은, Label이 붙여진 Data가 충분하지 않다는 것을 의미한다.

이 책에서는 Labeling 접근법에 대해서 많이 논의 할 것이다. 그것은 중요한 사안이기 때문이다.

 

이런 류의 Model은 Prediction만 할 수 있기 때문에, 조직 목표와 차이가 많이 날 수 있다.

예를 들어, 이번에 들어 본적 없는 제품에 대해서는 예측을 못할 수 있다.

 

모델이 환경과 상호작용(피드백) 하는 방법을 고려하면 통찰력을 얻을 수 있다.

  • Env를 기반으로 Predictive policing model을 생성한다.
  • Env가 변화하면 이를 model에 반영한다.

 

이것을 Positive Feedback loop라고 하며, input이 Biasing 될 수 록  Output도 더 Biasing 된다.

극단적인 예로, 추천시스템에서  특정콘텐츠에 편중되어 추천될 수 있다.

 


7. How Our Image Recognizer Works

 

1. library를 가져온다

from fastai.vision.all import *

 

2. Dataset을 가져오고, 가져온 경로를 반환한다.

path = untar_data(URLs.PETS)/'images'

 

3. Data 작성자가 제공한 파일이름 규칙에 따라 label을 지정한다

def is_cat(x): return x[0].isupper()

 

4. ImageDataLoaders.from_name_func () 함수

각 매개변수에 대해 설명합니다.

dls = ImageDataLoaders.from_name_func(path, get_image_files(path), valid_pct=0.2, seed=42, label_func=is_cat, item_tfms=Resize(224))
  • ImageDataLoaders : 이미지 데이터를 불러오겠다는 클래스
  • label_func : 데이터 집합의 라벨이 지정된 곳
  • Transform :
    - item_tfms : 개별 item에 대하여 transform. 위 경우는 224-px로 resize
    - batch_tfms : GPU를 사용하여 한번에 일괄적으로 적용 (속도가 빠름)

 

왜 224 Pixel 인가요?

예전에 pretrained 된 model 들은 무조건 이 크기였다 (-_-) ... 
그래서 옛날 모델에 태울 때는 이 사이즈를 맞춰야한다.

 

  • 분류(Classification) :  범주형 자료에 대하여 Prediction
  • 회귀(Regression) : 이산형 자료에 대하여 Prediction

 

[label_func]

펫 데이터셋에는 37종의 개/고양이의 사진이 7,390점이 담겨있다.

def is_cat(x): return x[0].isupper()

is_cat() 함수에 의해, 이미지의 파일이름이  UpperCase인지 LowerCase인지로 고양이/개 를 분류한다.

 

[valid_pct=0.2]

이를 통해 fastai는 모델 훈련에 사용되지 않도록 데이터의 20%를 유지합니다.

이 데이터를 검증집합 이라고 하며, 나머지 80%를 교육 집합이라고 합니다.

기본적으로 20%는 무작위로 선정되며, 매개변수 seed 값을 통해 반복적 구현시 동일한 유효성 검사 셋을 얻도록 할 수 있습니다.

  • 검증집합이 바뀐다고 모델이 바뀌지 않습니다 (맞나?)
  • 모델 훈련시, 특정 데이터가 암기 되었을 수도 있습니다. 
    훈련을 오래 할 수록 정확도는 좋아지겠지만, 암기를 하기 시작하면서
    변화에 유연하게 대처하지 못합니다. 이를 과적합이라고 합니다.

 

과적합(오버피팅)

  • Training시 정확도를 높이는 것은 쉽지만, Prediction을 잘하는 모델은 어렵습니다.
  • 여러분은 이 책에서 오버피팅 하지 않는 방법을 배울 것 입니다.
  • 그렇게 할 필요가 없음에도 적합한 회피 기법을 사용하기도 하는데, 이는 본래보다 덜 정확할 수 있는 모델로 귀결 됩니다.

 

정확도

  • 정확도는 Valid data set에서만 측정해야 합니다.
  • train은 시간이 지날수록 정확도가 올라가기 때문입니다.

 

5. CNN을 만들고, metric을 명시합니다.

learn = cnn_learner(dls, resnet34, metrics=error_rate)
  • 왜 CNN 인가요? 비전 모델을 만들 때는 CNN이 최첨단 접근 법입니다.
  • 이 구조는 인간의 시각 시스템의 영감을 받아 작동합니다.

 

  • 여기서는 ResNet 34를 씁니다. Layer가 깊으면 오버피팅 하기 쉽니다.
    (Valid의 정확성이 떨어지기 때문)

 

[metric]

  • Valid set을 이용하여, Prediction의 품질을 측정
  • 매 epoch 마다 출력된다.
  • 여기서는 error_rate (1-accuracy) 를 지표로 삼았다.

 

 

 


8. What Our Image Recognizer Learned


9. Image Recognizers Can Tackle Non-Image Tasks


10. Deep Learning Is Not Just for Image Classification


11. Validation Sets and Test Sets


12. A Choose Your Own Adventure Moment

1 2 3 4 5 6 7 ··· 62