박해선님의 혼자 공부하는 머신러닝+딥러닝 책과 유튜브 영상을 참고하여 공부하며 정리하였습니다. 

 


01. 나의 첫 머신러닝

 

01-1 인공지능과 머신러닝, 딥러닝

  • 시작하기 전에

책의 그림을 통해 인공지능의 역사를 볼 수 있다.

 

<인공지능이란>

참고사이트 : http://scimonitors.com/aiai기획②-인공지능-발달과정-튜링부터-구글-알파고-ibm/

 

Science Monitor

AI, Quantum Computing Science & Technology Magazine

scimonitors.com

1) 인공지능 태동기(1943-1956) : 인공지능에 대한 꿈이 부풀어오르던 초기시기, 튜링 테스트의 등장.

2) 인공지능 황금기(1956-1974) : 다트먼스 AI 컨퍼런스에서 인공지능에 대한 장밋빛 전망 발표, 퍼셉트론의 등장

  • 퍼셉트론 : 인공신경망의 기본이 되는 알고리즘으로 1957년에 발표된 개념.
  • 1959년 고양이 뇌에 전기자극을 준 후 눈에 어떤 자극이 발생하는지 슬라이드를 통해 시각 피질연구. 이를 통해 인간의 뇌에도 시각세포가 반응을 해서 단계적으로 복잡한 사물을 인식한다는 것이 확인되었다. CNN의 시초가 된 연구로 알고 있다. 

3) 1차 AI 겨울(1974-1980) : 주 원인은 컴퓨터 성능의 한계. 문제를 풀 수 없기 때문에 인기가 사라짐.

4) AI붐(1980-1987) : 전문가 시스템 발견

5) 2차 AI 겨울(1987-1993) : 전문가 시스템 실패

6) 1998년 LeNet-5의 발견이후로 인공지능 분야가 흥행하였다. 합성곱 신경망을 사용하여 최초로 숫자를 인식하는 모델을 만들었다. 2012년 ImageNet 데이터를 사용하는 경진대회에서 AlexNet이라는 합성곱 신경망을 통해 괄목한 성장을 보여주었다. AlexNet이후로 나온 대부분의 알고리즘은 이미지 관련 작업에서는 합성곱 신경망을 사용하고 있다.

2015년 구글에서 TensorFlow라는 라이브러리를 발표하였고, 이후 대중적으로 많은 개발자들이 DL/ML분야를 연구하게 되었고, 2016년 구글에서 알파고를 발표하며 이세돌과의 바둑 대국이 있었다. 이후, 전세계적으로 인공지능 분야에 큰 붐이 일어났다. 그 이후에도 많은 알고리즘과 사건이 있고 최근 많은 성장을 하였다.

 

 

인공지능을 한마디로 표현한다면 사람처럼 학습, 생각, 추론할 수 있는 컴퓨터 시스템/알고리즘이다.

마치 영화 <her>의 사만다처럼 지능을 가진 시스템. 마치 사람과도 같아서 <터미네이터>의 스카이넷처럼 사람과 구분하기 어려운 수준인데, 이를 강한 인공지능(Strong AI)라고 부른다. 아직은 영화지만, 현실에서 불가능하다고만은 말할 수 없는 일이다.

 

지금의 인공지능은 사람의 일을 도와주고 반복할 수 있는 작업을 행하는 등, 편리한 생활을 누릴 수 있도록 보조적인 역할을 한다.

현재 주위에서 볼 수 있는 자율주행자동차 테슬라, 아이폰의 Siri(음성비서), 음악추천, 기계번역 등은 약한 인공지능(Week AI)라고 말할 수 있다. 아직은 인공 일반지능에 언제 도달할 지 그 시기를 알 수 없지만, 그 가능성에 대해서는 대체적으로 긍정적이다.

 

<머신러닝이란>

머신러닝은 인공지능의 하위 분야이다. 여러 하위 분야 중에서도 소프트웨어를 담당하는 핵심 분야이다. 규칙을 프로그래밍하지 않아도 자동적으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야이다.

대표적인 머신러닝 라이브러리는 사이킷런(scikit-learn)이다. 사이트에 접속하여 라이브러리에 대한 정보를 얻을 수 있다.

https://scikit-learn.org/stable/

 

scikit-learn: machine learning in Python — scikit-learn 1.0.2 documentation

Model selection Comparing, validating and choosing parameters and models. Applications: Improved accuracy via parameter tuning Algorithms: grid search, cross validation, metrics, and more...

scikit-learn.org

사이킷런은 파이썬 API를 사용하고 있다. 많은 알고리즘이 들어있으며, 그 중에서도 자주 사용되는 알고리즘을 알아두면 모델을 짤 때 유용하다. 사이킷런은 오픈서스 라이브러리이기 때문에, 파이썬 코드를 다룰 수 있다면 누구나 쉽게 머신러닝 알고리즘을 제품에 활용할 수 있다. 

사이킷런의 공개 이후로 많은 개발자가 머신러닝 알고리즘에 접근할 수 있게 되었으며, 이를 통해 프로그래머가 직접 알고리즘을 구현할 필요가 없게 되었다.

 

 

<딥러닝이란>

 

딥러닝은 인공신경망의 다른 이름으로, 머신러닝의 하위 분야이다. 머신러닝의 다양한 알고리즘 중 한 부류를 딥러닝, 혹은 인공신경망이라고 부를 수 있다. 종종 사람들은 둘을 크게 구분하지 않고 사용한다.

딥러닝은 알파고를 통해 유명해졌고, 딥러닝에도 머신러닝의 사이킷런처럼 라이브러리가 있다.

주로 널리 사용되는 라이브러리는 구글의 텐서플로우(TensorFlow)이다. 또 Facebook(meta)에서 출시한 파이토치(PyTorch)도 요새 많은 인기를 얻고 있다. 이 둘도 오픈소스이기 때문에 누구나 쉽게 사용할 수 있으며, 인공 신경망 알고리즘을 전문적으로 다루며 파이썬 API를 사용한다.

 

 


 

01-2 코랩과 주피터 노트북

  • 시작하기 전에
    머신러닝을 학습하기 위한 환경은 두 가지로 나눠볼 수 있다.
    1) 로컬컴퓨터 : 파이썬, 사이킷런, 텐서플로 등을 설치해야하며 이를 설치하기 위해서는 아나콘다, 도커 등의 가상환경이 필요하다. 아나콘다를 설치하면 대부분의 라이브러리들이 자동으로 설치되기 때문에 파이썬, 사이킷런 등을 설치할 필요가 없다. 또한 GPU가 필요한 경우가 있기 때문에 로컬에서 고성능의 컴퓨터를 이용하기에는 부담되는 경우가 많다.

    2) 코랩 : 구글에서 제공하는 주피터노트북 개발환경으로, 구글 계정만 있으면 누구나 쉽게 사용이 가능하다.

<구글 코랩>

머신 러닝은 컴퓨터 사양이 중요한데, 코랩을 사용하면 컴퓨터 성능과 별개로 프로그램을 이용할 수 있다는 장점이 있다. 구글 계정이 있다면 코랩(Colab)에 접속하여 사용이 가능하다. 

코랩 웹사이트에 접속하면 위와같은 화면이 뜨는데, 내가 작업하던 파일을 불러와서 다시 하거나, 드라이브나 깃허브의 파일, 혹은 업로드를 하여 작업을 진행할 수 있다.

 

<텍스트 셀>

텍스트 셀은 텍스트를 입력할 수 있는  창이고, HTML과 마크다운을 혼용해서 사용할 수 있다. 

코랩에 접속했을 때 뜨는 기본 소개 문구에서 위의 셀을 더블클릭하면 더욱 자세하게 볼 수 있다.

왼쪽의 창에서 텍스트를 수정하면 우측 미리보기 창에서 수정된 결과를 바로 확인할 수 있다.

 

<코드 셀>

이처럼 세번째에 위치한 셀이 코드셀이다. 결과는 코드가 끝난 다음 셀에 표시된다.

 

<노트북>

코랩은 구글이 주피터를 커스터마이징한 것으로, 구글 클라우드의 가상 서버를 사용한다. 우측 상단의 RAM과 디스크가 나와있는 부분에 마우스를 가져다대면 런타임 정보를 알려준다.

그림 우측의 화살표를 누르고 리소스보기를 누르면 리소스와 RAM 의 연결사태를 확인할 수 있다. 만약 연결이 끊겼다면 [연결] 버튼을 통해 연결할 수 있다. 

코랩 서버의 메모리는 약 12기가, 디스크 공간은 100기가로 구글 계정만 있다면 무료로 가상서버를 활용할 수 있다는 장점이 있다. 하지만 무료 서비스이기 때문에, 무한정으로 사용할 수 있지는 않고 하나의 노트북을 12시간 이상 실행할 수 없다. 만약 그 이상의 시간동안 사용하고 싶다고 하면 월 1만원 가량의 구독료로 코랩프로(Colab Pro)를 구독하면 된다.

 

 

* 새 노트북 만들기

 

[파일] -[새 노트]를 클릭하여 새로운 노트북을 만들 수 있다.

기본 이름은 Untitled숫자.ipynb 형태이고, 클릭하여 본인이 원하는 이름으로 바꿀 수 있다.

 

코드 셀에 코드를 입력한 후 실행할 수 있다. 코드셀 좌측의 플레이 아이콘을 클릭하거나 Ctrl+Enter키를 통해 실행할 수 있다. (macOS는 cmd+Enter)

 

 

 

노트북은 자동으로 구글 드라이브의 [Colab Notebooks] 폴더에 저장이 된다. 드라이브에서 바로 코랩으로 연결할 수도 있고, 드라이브 내에서 파일명을 변경하는 것 또한 가능하다.

 

 


 

01-3 마켓과 머신러닝

  • 시작하기 전에


    생선을 판매하는 한빛 마켓의 물류 센터에서, 생선을 자동으로 분류해주는 머신러닝 프로그램을 만들기로 한다.

 

 

<생선 분류 문제>

생선의 크기가 30-40cm라면 '도미'라고 알려주는 그런 프로그램을 만들어 보도록 한다.

 

전통적인 프로그램은 가이드와 규칙을 정해두고 프로그램을 만든다. 하지만 만약 생선이 30cm 이상이라고 무조건 도미라고 말할 수 있을까? 고래처럼 원래 몸집이 큰 경우에는 다른 기준을 적용해야 한다. 이처럼 절대 변하지 않는 기준을 정하기 어렵거나, 가이드나 규칙을 정하기 어려운 경우에는 머신러닝 프로그램을 통해 적용할 수 있다. 

프로그램을 만들기에 앞서, 도미와 빙어를 분류하는 프로그램을 만들기로 한다.

 

  •  도미 데이터 준비하기


코랩에서 [BreamAndSmelt] 노트를 만든다. 박해선님의 깃허브에서 도미 데이터를 복사할 수 있다. 해당 데이터는 캐글에 공개된 데이터셋이라고 한다.

 

bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]​



리스트에서 첫번째 도미의 길이는 25.4cm, 무게는 242.0g인 것을 알 수 있다. 이러한 특징들을 특성(Feature)이라 부를 수 있다. 이 데이터를 통해 길이를 x축, 무게를 y축으로 하는 그래프를 그려 각 도미들을 점으로 표시할 수 있다.

파이썬에서 자주 사용되는 패키지는 맷플롯립(matplotlib)이다.

import matplotlib.pyplot as plt # matplotlib의 pyplot 함수를 plt로 줄여서 사용

plt.scatter(bream_length, bream_weight)
plt.xlabel('length')  # x축은 길이
plt.ylabel('weight')  # y축은 무게
plt.show()​

 

코랩의 코드셀에 위의 코드를 입력하면 산점도를 확인할 수 있다.


산점도를 통해 유추할 수 있는 사실은 생선의 길이가 길수록 무게가 많이 나간다는 것이다. 이처럼 일직선에 가까운 형태로 나타나는 모습을 선형적(linear)이라고 말한다.

  • 빙어 데이터 준비하기

마찬가지로 박해선님의 깃허브에서 빙어 데이터를 복사해서 사용할 수 있다.

smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

해당 데이터를 사용해 도미데이터와 비교를 할 수 있다.

plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

 

주황색이 빙어, 파란색이 도미임을 알 수 있다. 또 도미는 무게와 길이에 선형적인 관계가 있는 반면, 빙어는 길이가 늘어나도 무게가 크게 증가하지 않는 것을 확인할 수 있다.

 

 

<첫 번째 머신러닝 프로그램>

여기서는 k-최근접 이웃(k-Nearest Neighbors) 알고리즘을 사용하기 위해 두 생선의 무게와 길이 데이터를 합친다.

length = bream_length + smelt_length
weight = bream_weight + smelt_weight

 

사이킷런 패키지를 사용하기 위해 2차원 리스트를 만들려면 zip() 함수를 사용하면 된다.

fish_data = [[l, w] for l, w in zip(length, weight)]

 

만든 2차원 리스트를 출력한다.

print(fish_data)

 

해당 2차원 리스트가 완성된 후, 준비할 데이터는 정답 데이터이다. 즉, 데이터만으로 어떤 것이 도미이고, 빙어인지 정답을 알려주는 것이다.

fish_target = [1] * 35 + [0] * 14
print(fish_target)

 

결과값은 아래와 같다.

 

이제 k-최근접 이웃 알고리즘 클래스를 넣어둔 패키지를 import한다.

from sklearn.neighbors import KNeighborsClassifier

 

클래스의 객체를 만든다.

kn = KNeighborsClassifier()

 

파이썬의 fit() 메서드를 통해 도미를 찾기 위한 기준을 훈련(학습)시킨다.

kn.fit(fish_data, fish_target)

 

이제 객체kn이 얼마나 잘 훈련되었는지 평가할 수 있다. score() 메서드를 통해 정답률을 알 수 있다. 0~1의 값으로만 결과값이 반환된다. 0.5면 50%를 맞춘 것이고 1이면 100%를 맞힌 것이다. 이를 정확도라고 부른다.

kn.score(fish_data, fish_target)

 

결과물이 1.0으로 나온것으로 보아 100% 학습에 성공했음을 알 수 있다.

 

<k-최근접 이웃 알고리즘>

k-최근접 이웃 알고리즘이란 어떤 데이터에 대해 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용하는 것이다. 주위의 데이터로 현재 데이터를 판단하는 것이다.

예를 들어 길이가 30cm, 무게가 600g인 삼각형을 보면 근처에 도미가 있기 때문에, 도미인 것으로 추론할 수 있다. predict() 메서드를 통해 모델을 훈련, 예측할 수 있다. fit() 메서드는 두 매개변수로 훈련에 사용하라 특성과 정답 데이터를 전달한다.

kn.predict([[30, 600]])
print(kn._fit_X)

 

해당 데이터를 기존 만들어둔 49개의 데이터를 활용하여 적용한다면, 49개의 데이터 중 도미가 35개 이므로 결과값은 무조건 도미라고 나올 것이다.

kn49 = KNeighborsClassifier(n_neighbors=49)
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
print(35/49)

둘의 결과값이 동일한 것으로 미루어 보아 같은 매개변수를 49가 아닌 기본값으로 설정하는 것이 좋다는 것을 알 수 있다.

 


<마무리>

첫 머신러닝 프로그램을 통해 사이킷런의 메서드를 사용하고, k-최근접 이웃 알고리즘의 특징을 알아보았다.

코랩에서 실행한 파일을 공유드리니, 필요하신 분은 다운받아 사용하시면 됩니다.

Chapter01-BreamAndSmelt.ipynb
0.04MB

한빛미디어에서 주최하는 혼공학습단에 지원하였고, 혼공학습단 7기에 선정되었다.

도서 별 커리큘럼이 있고, 혼공 시리즈 도서 중 하나를 선택하여 미션을 성공하면 되는 간단한 활동이다.

 

 

미션을 완수하면 마일리지 2만원과 더불어 우수 학습자에게는 백화점 상품권까지 증정한다고 한다.

내가 선택한 책은 박해선님의 혼자 공부하는 머신러닝+딥러닝이다.

이미 봤던 책이지만 리마인드 겸 블로그에 정리를 하려던 찰나에,

좋은 컨텐츠를 제공해주신 한빛미디어에게 감사하다.

 

커리큘럼은 위와 같다.

설 연휴 주를 제외한 6주간의 활동(1/10~2/27) 동안 진행이 되기 때문에, 

혹시나 신청을 못했더라도 같은 진도로 진행하면 좋을 듯 하다.

 

 

https://youtu.be/J6wehCO_c58

 

박해선님의 유튜브 강의를 통해 도움을 받는다면,

혼공머신 책과 함께 혼자 공부할 수 있다.

 

내일부터 시작되는 혼공학습단 7기 화이팅!

 

 

 

 

[업데이트 : 2022-01-09]

논문 : Recent Advances in Convolutional Neural Networks

 

 

2015년에 발표된

Recent Advances in Convolutional Neural networks

논문의 Summary 겸 리뷰를 적어보려고 합니다.

글을 쓰기에 앞서, 공부를 위해 논문을 보며 요약, 작성한 내용이라 간혹 오역이나 잘못된 내용이 있을 수 있습니다.

핵심 키워드는 highlight를 해두었습니다. 틀린 부분은 댓글로 알려주시면 감사하겠습니다^^ 

편의상 경어체를 빼고 작성하겠습니다.


 

 

Abstract

 

그동안 nlp, vision 분야에서 딥러닝의 지속적인 발전이 있었고, 이는 컴퓨터 그래픽 프로세서의 발전뿐만 아니라 합성곱신경망의 발전 덕분이기도 하다. 이 논문에서는 CNN의 다양한 양상과 주요 요소들을 살펴보려고 한다. 

 

Introduction

CNN은 시각피질세포가 빛을 감지하는 것에서 영감을 받아 개발한 인공신경망이다. CNN의 프레임워크를 기조로 손으로 쓴 문자(imagenet)를 분류할 수 있는 신경망을 개발했는데, 그것이 LeNet-5이다.

하지만, 그 당시에는 대규모 훈련데이터나 컴퓨팅 성능에 대한 부분이 부족했기 때문에, 대규모 이미지나 이미지 분류와 같은 복잡한 문제에서는 네트워크가 제대로 작동하지 않았다.  이러한 문제를 해결하기 위해 2006년 이후 많은 방법들이 개발되었고, deepCNN에서는 고전적인 CNN 아키텍처를 제안했다.

AlexNet은 LeNet-5와 비슷한 구조를 가졌지만 더 깊다. AlexNet이후 제안된 아키텍처들(ZFNet, VGGNet, GoogleNet, ResNet)을 살피면 네트워크가 더 깊어지는 추세이다. ResNet은 AlexNet보다 20배, VGGNet보다 8배 깊은데, 깊이를 증가시키면 더 나은 피처를 얻을 수 있다.

 

이 논문에서 다룰 구조들이다.

Section 2. CNN의 기본 구성요소 개요

Section 3. Convolutional Layer, Pooling Layer, Activation Function, Loss Function(손실함수), Regularization, Optimization

Section 4. 컴퓨팅기술

Section 5. Applications

 

Section 2. Basic CNN Components

CNN은 다양한 형태의 아키텍처가 있지만, 기본 구성 요소들은 거의 유사하다.

(LeNet-5를 예시를 들어서 설명하겠다.) Convolutional Layer, Pooling Layer, Full-Connected Layer 의 세가지 유형의 계층으로 구성된다.

Convolutional Layer는 Input의 feature를 학습하는 것을 목표로 한다. 그림 2(a)에서 볼 수 있듯이 컨볼루션 레이어는 여러 가지 feature map을 계산하는 데 사용되는 여러 컨볼루션 커널로 구성된다. 이 feature map의 뉴런은 이전 layer의 뉴런 영역과 연결된다. 먼저 학습된 input을 Convolution한 후, 결과값을 Activation Function을 통해 Feature Map을 얻을 수 있다.

Activation Function(활성화함수)은 CNN에 비선형성을 도입하여, 다층 네트워크가 비선형 특징을 감지하는 데 적합하다. 일반적인 활성화함수는 sigmoid, tanh, ReLU등이 있다.

Pooling Layer는  Feature Map의 resolution을 줄여 shift-invariance를 달성하는 것을 목표로 하며, 일반적으로 두개의 Convolutional Layer 사이에 배치된다. 일반적인 Pooling Layer는 Average Pooling과 Max Pooling이 있다.

CNN의 마지막 레이어는 출력 레이어이다. 분류(classficiation) 작업의 경우, 일반적으로 softmax 연산자가 사용된다. θ는 CNN의 모든 매개변수를 나타낸다. 최적의 매개변수는 Loss Function(손실함수)를 최소화하여 얻을 수 있다. CNN 학습은 Optimization(최적화)의 문제이다. loss function를 최소화함으로써 최적의 매개변수 집합을 찾을 수 있다. SGD(경사하강법)은 CNN 네트워크 최적화를 위한 일반적인 솔루션이다.

 

Section 3. Improvements on CNNs

2012년 AlexNet의 성공 이후 많은 발전이 있었다. 그 개선점들을 여섯가지 측면에서 설명할 예정이다.

3.1. Convolutional Layer 

컨볼루션 필터는 일반화 선형 모델이다. instance가 선형으로 분리할 수 있는 경우 추상화에 적합하다.

3.1.1. Tiled Convolution

Weight를 공유함으로써 매개변수의 수를 크게 줄일 수 있다. 이를 통해 동일한 레이어에서 별도의 커널을 학습하고, 인접 유닛에 대한 풀링을 통해 복잡한 불변성을 학습할 수 있다.

3.1.2 Transposed Convolution 

Transposed Convolution은 전통적인 Convolutional Network의 역방향으로서 deconvolution이라는 용어를 사용하기도 한다. 그림3(d)에서 처럼 스트라이드와 패딩을 사용하여 4x4 입력에 대한 3x3 커널의 deconvolutional 연산을 볼 수 있다. 최근 visualization, 혹은 super-resolution, recognition, segmentaion 등의 분야에서 널리 사용되고 있다.

3.1.3 Dilated Convolution

이는 Convolution layer에 hyper-parameter를 추가한 것이다. 필터 요소 사이에 0을 삽임함으로써 receptive field의 크기를 늘리고 네트워크가 더 관련성 높은 정보를 다루도록 할 수 있다. 이는 예측할 때 큰 receptive field가 필요한 작업에 유용할 수 있다. 보통 기계번역, 음성합성/인식 분야에서 널리 사용된다.

3.1.4 Network In Network

Network In Network(NIN)은 선형 필터를 다층 퍼센트론 컨볼루션 레이어와 같은 네트워크로 대체하여, 보다 추상화에 용이하도록 한다. 최종 레이어의 feature map을 평균화하는 global average pooling을 적용하여 출력한 vector를 softmax레이어에 직접 공급한다. Fully-connected Layer와 비교했을 때, Global average Pooling은 매개변수가 훨씬 적기 때문에 과적합이나 계산 부하 부분에서 훨씬 자유롭다.

3.1.5 Inception Module

 

3.2 P

3.2.1 Lp Pooling

3.2.2 Mixed Pooling

3.2.3 Stochastic Pooling

3.2.4 Spectral Pooling

3.2.5 Spatial Pyramid Pooling

3.2.6 Multi-scale Orderless Pooling

 

3.3 A

3.3.1 ReLU

3.3.2 Leaky ReLU

3.3.3 Parametric ReLU

3.3.4 Randomized ReLU

3.3.5 ELU

3.3.6 Maxout

3.3.7 Probout

 

3.4 Loss

3.4.1 Hinge Loss

3.4.2 Softmax Loss

3.4.3 Contrastive Loss

3.4.4 Triplet Loss

3.4.5 Kullback-Leibler Divergence

 

3.5 Regularization

3.5.1 lp-norm Regularization

3.5.2 Dropout

3.5.3 DropConnect

 

3.6 Op

3.6.1 Data Augmentation

3.6.2 Weight Initialization

3.6.3 Stochastic Gradient Descent

3.6.4 Batch Normalization

3.6.5 Shortcut Connections

 

4. Fast Processing of CNN

4.1 FFT

4.2 Structured Transforms

4.3 Low Precision

4.4 Weight Compression

4.5 Sparse Convolution

 

 

 

 

5. Applications of CNNs

5.1 Image Classfication

5.2 Object Detection

5.3 Object Tracking

5.4 Pose Estimation

5.5 Text Detection and Recognition

5.5.1 Text Detection

5.5.2 Text Recognition

5.5.3 End-to-end Test Spotting

5.6 Visual Saliency Detection

5.7 Action Recognition

 

6. Conclusions and Outlook

CNN은 이미지, 비디오, 음성, 텍스트 등 다양한 형태의 데이터를 다루는 것에 있어서 중요한 역할을 했고, 그러한 작업들을 함에 있어 layer, activation function, loss function, optimization 등 중요한 개념들을 더 자세하게 다뤄야 한다는 점을 깨달았다.

하지만 여전히 해결해야 하는 문제들이 남아있다. 학습을 위해서는 대규모 데이터 셋과 뛰어난 컴퓨터 성능이 필요하다. 라벨링된 데이터를 수집하려면 많은 인력이 필요하기 때문에, CNN의 비지도 학습을 따르는 것이 바람직하다. 또한 SGD 알고리즘이 이미 합리적일지라도, 더 나은 계산 속도와 메모리를 위해 지속적으로 개발해야 한다.

학습률, 커널 크기, 레이어 수 같은 하이퍼파라미터를 적절하게 선택하는 것은 많은 기술과 경험이 필요할뿐더러 튜닝 비용이 많이 든다. 따라서, 학습을 위한 최적화 기술도 더욱 발전해야 할 것이다.

 

 

[업데이트 : 2022-01-02]

논문 : Bag of Tricks for Image Classification with Convolutional Neural Networks

 

 

2019년에 발표된

Bag of Tricks for Image Classification with Convolutional Neural Networks

논문의 Summary 겸 리뷰를 적어보려고 합니다.

글을 쓰기에 앞서, 공부를 위해 논문을 보며 요약, 작성한 내용이라 간혹 오역이나 잘못된 내용이 있을 수 있습니다.

핵심 키워드는 highlight를 해두었습니다. 틀린 부분은 댓글로 알려주시면 감사하겠습니다^^ 

편의상 경어체를 빼고 작성하겠습니다.

 


 

Abstract

이미지 분류에서 최근 이뤄진 data augmentation이나 최적화같은 연구는 훈련 절차를 개선했다. 그러나 대부분 간단하게 언급되거나 소스코드에서만 볼 수 있다. 우리는 이 논문에서 해당 부분을 조사하고 깊게 연구하여 그들이 모델 정확도에 최종적으로 미치는 영향을 평가하려고 한다.

이러한 개선사항들을 결합하여 CNN 모델들을 개선할 수 있다. 예를 들어 ResNet50의 경우 75.3%의 정확도에서 79.29%로 개선되었으며, 이는 객체감지나 같은 작업 도메인에서는 더 나은 성능을 보여주기도 한다.

 

 

1. Introduction

2012년 AlexNet의 발견 이후 컨볼루션 신경망을 활용한 접근 방식이 지배적이었으며, VGG를 포함한 NiN, Inception, ResNet, DenseNet, NASNet등의 새로운 아키텍쳐들이 제안되었다.

이들은 성능 향상을 가져왔으며 이는 단순히 개선된 아키텍처로 인한 결과물이라기보다는 다양한 요소들도 함께 개선되었기 때문에 얻은 결과이다. (Loss Functions, Data Processing, Optimization Methods). 하지만 이들은 큰 주목을 받지 못해왔고 대부분은 아주 작은 수정이나 변경과 같은 '트릭'으로 보인다. 여러 네트워크를 사용하여 그들을 평가할 것이다.

 

Paper Outline

Section 2. 기본 훈련학습 절차

Section 3. 유용한 몇가지 트릭들

Section 4. 3가지 모델 아키텍처 조정 요소들

Section 5. 4가지 추가 절차 개선사항들

Section 6. 모델 전이학습

이 구현 모델과 스크립트들은 GluonCV 1에 공개되어있기 때문에 사용이 가능하다.

https://github.com/dmlc/gluon-cv

 

GitHub - dmlc/gluon-cv: Gluon CV Toolkit

Gluon CV Toolkit. Contribute to dmlc/gluon-cv development by creating an account on GitHub.

github.com

 

2. Traning Procedures

미니배치 경사하강법을 사용하여 훈련하는 템플릿이다. 각 iteration(반복) 에서 무작위로 b 이미지를 샘플링하여 기울기를 계산한다음 매개변수를 업데이트한다. K가 데이터셋을 통과한 후 중지된다.

 

 

2.1.  Baseline Training Procedure

ResNet의 기본 파이프라인을 따른다.

 

2.2.  Experiment Results

ResNet-50, InceptionV3, MobileNet의 세 가지 CNN을 평가할 것이며, 이미지는 299x299의 사이즈를 사용할 것이다. ISLVRC2012의 데이터셋을 사용하였다.

ResNet-50이 아주 근소한 차이로 가장 나은 결과를 보여줬으며 InceptionV3와 MobileNet은 다른 훈련절차로 인해 정확도가 약간 낮았다.

 

3.  Efficient Training

하드웨어, 특히 GPU는 빠르게 발전하고 있으며 결과적으로 최근 몇 년동안 성능 관련 trade-off가 변경되었다. 예를 들어, 더 낮은 수치 정밀도와 더 큰 사이즈의 배치사이즈를 사용하는 것이 훈련에 더 효율적이다. 

이번 섹션에서는 정확도를 낮추지 않으면서 대규모 배치 훈련을 가능하게 하는 기술들에 대해 검토한다.

 

3.1.  Large-batch Training

미니배치 경사하강법은 병렬 처리의 성능을 높이고 커뮤니케이션에 따른 비용을 줄이기 위해 병렬 그룹화 한다. 하지만 사이즈가 큰 배치를 사용하면 속도가 느려질 수 있다.

볼록(convex)문제의 경우, 배치 크기가 증가함에 따라 수렴비율이 감소한다. 즉, 큰 배치로 훈련하는 모델은 작은 배치로 훈련한 모델보다 동일한 수의 epoch동안 정확도가 저하된다. 이를 해결하기 위해 휴리스틱을 제안한다. 총 4가지의 휴리스틱 방법을 제시할 것이다.

 

  • Linear scaling learning rate

미니배치 경사하강법은 무작위 프로세스를 진행하고 있고, 배치 사이즈의 증가는 기울기의 기대치를 변경하지 않으면서 분산을 줄일 수 있다. 즉, 큰 배치는 기울기의 노이즈를 줄여주므로 학습률/학습속도(learning late)가 개선될 수 있다.

  • Learning rate warmup

훈련 초기에는 매개변수들이 임의의 값이기 때문에 최종 솔루션에서 멀리 떨어져있다. 너무 빠른 학습률은 불안정성을 초래할 수 있다. 워밍업 단계에서는 처음에는 작은 학습률을 사용하고 훈련 단계에서는 다시 처음의 안정적인 학습률을 사용한다. 즉, 점진적으로 워밍업을 하며 학습률을 0에서 초기까지 증가시키는 선형 학습률을 사용한다.

  • Zero γ

ResNet 여러 가지 잔여(residual) 블록으로 구성되어 있고, 각 블록은 여러개의 Convolutional Layer로 구성된다. 입력 x 가 주어질 때 출력값이 block(x)라고 가정하면, 마지막 레이어에서 잔여블록은 x+block(x)를 출력한다. 이 마지막 레이어는 배치 정규화 레이어(Batch Normalization Layer)가 된다. 각 요소들이 초기화되는 매개변수들이다.

따라서 모든 잔여 블록들은 인풋을 반환하고, 계층수가 적고 더 쉬운 네트워크가 초기 단계 훈련에서 훨씬 쉽다는 것을 확인할 수 있다.

  • No bias decay

weight를 감소시키는 것은 모든 학습 가능한 가중치(weight)와 편향(bias)를 포함하는 매개변수에 적용된다. 모든 매개변수에 L2 정규화를 적용하여 값을 0으로 만드는 것과 같다. 하지만 과적합을 피하기 위해 가중치에만 정규화를 적용하는 것이 좋다.

 

3.2.  Low-precision Training

신경망은 주로 32비트에서 훈련이 된다. FP32는 FP16 로 바꿨을 때 2-3배 정도 더 빨라진다(?). 기울기 범위를 FP16에  맞추는 것도 실용적이다.

 

3.3.  Experiment Results

 

신경망

 

 

 

작성중(---ing )

 

7.  Conclusion

논문에서는 모델의 정확도를 개선하기 위한 다양한 트릭들을 조사했다. 약간의 수정을 통해 ResNet-50, InceptionV3, MobileNet의 정확도가 개선됨을 확인하였다. 이 모든것을 함께 쌓으면 정확도가 훨씬 높아진다. 이번 연구를 통해 이를 통해 더 넓은 영역으로 확장될 수 있다고 믿으며 객체 탐지(Object detection) 분야나 분류(Segmentation) 분야에서는 큰 이점을 얻을 수 있을 것이다.

 

[업데이트 : 2021-12-08]

논문 : Gradient-Based Learning Applied to Document Recognition

 

1998년에 발표된 Gradient-Based Learning Applied to Document Recognition 논문의 Summary 겸 리뷰를 적어보려고 한다. 글을 쓰기에 앞서, 공부를 위해 논문을 보며 요약, 작성한 내용이라 간혹 오역이나 잘못된 내용이 있을 수 있다. 핵심 키워드는 highlight를 해두었다. 틀린 부분은 댓글로 알려주시면 감사하겠습니다^^ 

CNN 의 아키텍쳐가 시작된 논문이다. 이 논문에서 구현한 모델은 LeNet으로, 이 모델을 기조로 향후의 CNN모델이 발달했다고 할 수 있다.

 

 

0. 들어가기 전에 핵심 키워드 살펴보기

 

1. Abstract

 

역전파 알고리즘으로 훈련된 다층 신경망이 Gradient-Based 학습 기술의 성공적인 사례임을 알리고 있다. Gradient-Based Learning 알고리즘은 최소한의 전처리로도 손글씨같은 복잡한 고차원의 패턴을 잘 분류한다고 한다. Convolutional Neural Network(CNN)은 특히 2D형태의 데이터를 다루는 데 용이하다.

 

2. Introduction

 

---ing 

[업데이트 : 2021-12-06]

논문 : Network In Network

 

2014년에 발표된 Network In Network 논문의 Summary 겸 리뷰를 적어보려고 한다.

글을 쓰기에 앞서, 공부를 위해 논문을 보며 요약, 작성한 내용이라 간혹 오역이나 잘못된 내용이 있을 수 있다.

핵심 키워드는 highlight를 해두었다. 틀린 부분은 댓글로 알려주시면 감사하겠습니다^^ 

 

 

 

 

Abstract

저자는 수용 영역 내에서 모델의 판별 가능성을 향상시키기 위해 Network In Network 라는 새로운 심층 네트워크 구조를 제시한다. (이하 NIN)

기존의 Covolutional 모델은 비선형 활성화 함수와 함께 선형 필터를 사용한다.

반면, NIN은 기존의 Covolutional 모델보다 수용 영역내에서 데이터를 더 복잡하게 추상화할 수 있는 micro neural network를 사용한다. 다층 퍼셉트론을 사용하였으며, feature map도 기존 모델과 유사한 방식으로 추출한다.

앞서 사용한 micro neural network를 통해 향상된 모델을 통해 global average pooling을 활용한다. global average pooling을 통한 이점은 해석이 쉽다는 점과 전통적인 fully connected layer에 비해 과적합(overfitting)이 될 가능성이 적다는 점이다.

CIFAR-10, CIFAR-100의 데이터를 사용하여 classification 하였고 SVHN과 MNIST 데이터셋을 활용하였다.

 

 

Introduction

기존 CNN모델에 대해 설명하고 있다. CNN모델은 Convolution layer와 pooling layer로 구성되어 있다. 앞서 말했듯, 비선형 활성화 함수와 선형 필터를 사용하여 나온 결과를 feature map이라고 한다.

CNN의 convolution filter는 데이터 패치에 대한 일반화된 선형 모델(GLM : Generated Linear Model)이다. 저자는 GLM에서 추상화 수준이 낮다고 주장한다. 이 GLM을 더 강력한 비선형 함수 approximator로 대체한다면 훨씬 성능을 향상시킬 수 있다고 주장한다.

GLM은 숨겨져있는 샘플들이 선형화되었을 때 잘 추상화된 GLM에 의해 

 

Convolutional Neural Networks

---ing

<OpenCV란?>

Open Source Computer Vision Library의 약자로, 실시간 컴퓨터 비전을 목적으로 한 오픈소스 컴퓨터 비전 및 머신러닝 라이브러리이다.

C#, C/C++/, Python, Java, Ruby 등 다양한 언어를 지원하고 있다. Windows,iOS, Android, Linux 등 다양한 OS플랫폼을 지원한다.

보통 OpenCV를 구동하는 IDLE은 개인의 편의에 따라 다르지만, 대부분 스크립트 언어인 파이썬을 많이 활용하고 있다. 파이썬으로 OpenCV를 사용하는 법은 다양한데, 바로 결과를 확인할 수 있는 jupyter notebook을 많이 사용하는 편이다.

 

OpenCV 메뉴얼이다. 

https://docs.opencv.org/4.5.2/d9/df8/tutorial_root.html

 

OpenCV: OpenCV Tutorials

OpenCV  4.5.2 Open Source Computer Vision

docs.opencv.org

 

 

윈도우에서 cmd실행 창이나 파이참에서 사용을 한다면 해당 문구를 통해 opencv-python을 설치한 후 사용할 수 있다.

pip install opencv-python

 

 

<사용법>

jupyter notebook이나 파이참, 파이썬IDLE를 통해 OpenCV를 실행하고자 한다면, 간단히 라이브러리를 import해서 사용할 수 있다.

 

import cv2
import sys
import random
import numpy as np
import matplotlib as plot

 

내가 자주 사용하는 import 라이브러리 목록인데, numpy 뒤에 as np를 붙인건 해당 라이브러리를 쓸 때마다 단어를 쓰기엔 너무 길기 때문에 내가 이해할 수 있을 짧은 이름인 np로 지정해서 부르겠다는 뜻이다. 

 

OpenCV 모듈을 불러오기 위해서 cv2 를 import 해야 한다.

import cv2

 

<이미지 읽기>

파일(이미지파일) 을 읽기 위해선 imread 함수를 사용해야 한다.

img = cv2.imread('img/flower.jpg', cv2.IMREAD_COLOR)

imread 함수는 말그대로 image를 가져와서 read 한 뒤 객체를 리턴하는 함수이다. 첫번째 인자로는 불러오고 싶은 파일의 로컬을, 두번째 인자로는 파일을 읽어 오는 방식을 입력하면 된다. 이 방식을 보통 flag라고 많이 부른다.

 

이미지 파일을 읽어오는 방식은 여러가지가 있다.

cv2.IMREAD_COLOR	: 디폴트 플래그. 컬러 이미지로 로드한다. 투명한 부분은 무시된다. 정수값 -1로 대체 사용이 가능하다.
cv2.IMREAD_GRAYSCALE	: 흑백 이미지로 로드한다. 실제 이미지 처리 시 중간단계로 사용된다. 정수값 0로 대체 사용이 가능하다.
cv2.IMREAD_UNCHANGED 	: 원본을 사용하여 이미지 그대로 로드한다. 정수값 1로 대체 사용이 가능하다.
cv2.IMREAD_ANYCOLOR 	: 색상 이미지로 로드한다.
cv2.IMREAD_ANYDEPTH 	: 정밀도를 변경하여 로드한다.
cv2.IMREAD_REDUCED_GRAYSCALE_4 : 크기를 1/4로 축소하고, 그레이스케일(흑백)을 적용하여 로드한다.
cv2.IMREAD_REDUCED_COLOR_8 : 크기를 1/8로 축소하고, 칼라스케일(칼라)을 적용하여 로드한다.

 

 

읽은 이미지를 보고 싶다면 imshow 함수를 사용해야 한다.

cv2.imshow('apple',img)

imshow 함수는 image를 가져와서 read 한 뒤 객체를 리턴하는 함수이다. 첫번째 인자로는 이미지가 표시될 창의 타이틀 이름을, 두번째 인자로는 읽어올 이미지의 객체명을 입력하면 된다. 

 

보통 이미지를 읽을 때는 waitKey 함수와 destroyAllWindows 함수도 함께 사용되는 편이다.

cv2.waitKey()

waitKey() 함수는 화면에 이미지를 표시한 후 사용자의 키보드 입력을 기다리는 함수이다. waitKey()안의 인자로 키보드입력을 특정 대기시간을 입력할 수 있고 단위는 1/1000초(ms)이다. cv2.waitKey(10)은 10ms초 동안 대기하라는 의미이고, cv2.waitKey(0) 은 키보드 입력이 있을 때까지 무한대기 상태이다.

만약 waitKey() 함수를 사용하지 않는다면, 윈도우 창은 유지되지 않고 프로그램이 종료된다.

 

윈도우를 종료하는 함수는 destoryAllWindows 함수이다.

cv2.destoryAllWindows()

destoryAllWindows() 함수는 화면에 나타난 모든 윈도우 창을 제거하는 함수이다. waitKey 함수와 같이 사용한다면, 사용자의 입력을 대기하다가 키를 입력받은 뒤 바로 윈도우 창이 사라지는 것을 확인할 수 있다.

 

 

++ 추가적으로 이미지를 쓰는 함수는 imwrite 함수이다.

cv2.imwrite('flower1.jpg', img)

image를 쓰는(write) 함수이다. 첫 번째 인자로는 저장할 파일명, 두 번째 인자로는 이미지 객체를 입력하면 된다.

 

 

 

 

<실행>

import cv2

img = cv2.imread('img/flo.jpg', cv2.IMREAD_COLOR)
cv2.imshow('Flowers', img)

cv2.waitKey(0)
cv2.destoryAllWindows()

위와 같이 img 디렉토리에 있는 flo라는 파일을 칼라로 읽어서 로드한 다음 출력하였다.

 

 

 

 

 

 

 

 

넘파이 : 행렬(배열)을 표현할 때 많이 사용한다.

 

판다스 : 시리즈, 데이터프레임이 가장 많이 사용됨

공공데이터 활용에 더 많이 능하다. 표를 표현하는 것.

넘파이의 경우 배열 안의 요소는 모두 타입이 같아야하지만 판다스는 복합적으로 다양한 타입을 할 수 있다.

그렇게 복합적으로 사용할 경우에는 타입이 object로 잡힌다.

 

딕셔너리로 시리즈 생성시 키가 인덱스로 사용된다.

 

# case문 : 비교할 조건이 여러개일때 사용

case exp

when 값1 then 실행문

case exp
	when 값1 then 실행문
	when 값2 then 실행문
    when 값3 then 실행문
    else 실행문
end as '컬럼별칭'

join : 2개 이상의 테이블을 연결해서 검색

natural join : 조인할 테이블의 동일한 이름 컬럼을 기준으로 값이 같은 줄들을 연결

select 이름, 부서이름

from 사원테이블 natural join 부서테이블

 

natural join 은 자동으로 이름이 같은컬럼으로 조인되지만 일반 조인은 using뒤에 조인할 컬럼명을 직접 지정해줘야한다.

select 이름, 부서이름

from 사원테이블 join 부서테이블

using(부서번호)

 

select 이름, 부서이름

from 사원테이블 e join 부서테이블 d

on e.부서번호 = d.부서번호

where 부서번호 = 10

+ Recent posts