Boostcamper's TIL (5)

최현진·2021년 8월 9일
0

boostcamp

목록 보기
5/20

2021/08/09

학습한 내용

DL Basic

좋은 Deep Learner는 무엇일까?

  • 구현기술
  • 수학 (선형대수, 확률)
  • 최신기술

특히 수학적 지식이 가장 중요한 것 같다.

Deep Learning 주요 요소

  • Data
  • Model
  • Loss
  • Algorithm

어떤 데이터를 사용하는지, 어떤 모델을 사용했는지, 모델의 성능, loss를 최소화 할 수 있는 알고리즘 등이 Deep Learning의 주요 요소라고 볼 수 있다.

최근 동향

2012~2020 각 년도를 대표하는 기술들을 소개해 주셨다.

  • 2012 AlexNet - 이미지 분류 대회에서 획기적인 발전을 이끔
  • 2013 DQN - 구글 딥마인드가 개발한 알고리즘으로서, 강화 학습 가능한 심층 신경망을 이용하여 초창기 아타리 2600 게임들을 인간 수준으로 플레이할 수 있는 인공지능이다.
  • 2014 Encoder/Decoder
  • 2014 Adam Optimizer - 어떤 함수를 사용해도 최적화를 위한 하강이 가능하다.
  • 2015 GAN - 비지도 학습에 사용되는 인공지능 알고리즘으로, 서로 경쟁하는 두 개의 신경 네트워크 시스템에 의해 구현된다
  • 2015 ResNet - ResNet 이전에는 레이어가 깊은 것이 무조건 좋지 않다는 생각이 지배적이었다. 하지만 ResNet 등장 이후 레이어를 어느정도 깊게 쌓을 수 있는 진정한 딥러닝이 될 수 있었다.
  • 2017 - Transformer - 주의 메커니즘을 채택하여 입력 데이터의 각 부분의 중요성을 차별적으로 평가하는 딥러닝 모델 ("Attention All You Need")
  • 2018 - BERT - 구글에서 개발한 자연어 처리 사전 학습을위한 Transformer 기반 학습 기술
  • 2019 - BIG Language Models(GPT-3)
  • 2020 - Self Supervised Learning

MLP(Multi-Layer Perceptron)

선형 회귀에서는 Loss function에 대해 구하고자 하는 변수 (Weight, bias)를 미분하여 기울기 값으로 최적의 해를 찾는 것이었다. 데이터 X가 스칼라가 아닌 벡터라면 이는 행렬연산으로 바뀌게 된다.

model : y^\widehat{y} = wx + b
loss : 1nΣ(yy^)2\frac{1}{n} \Sigma(y-\widehat{y})^{2}

lossw\frac{\partial \operatorname{loss}}{\partial w} = w1Ni=1N(yiy^i)2\frac{\partial}{\partial w} \frac{1}{N} \sum_{i=1}^{N}\left(y_{i}-\hat{y}_{i}\right)^{2}

행렬 연산에서 n차원의 데이터 X는 행렬곱을 하여 다른 m차원으로 표현될 수 있으며 이 연산이 1번이상 반복되면 MLP라고 한다.

MLP 실습

MLP 구조로 28 * 28 크기의 이미지 데이터셋 MNIST를 분류할 수 있는 간단한 모델을 생성할 수 있다.

  • 모델 생성에 필요한 라이브러리 import
  • 데이터 로드
  • 모델 구조 생성
  • 모델 학습
  • 결과 확인

라이브러리 import

import numpy as np
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import transforms, datasets

numpy, pyplot - 데이터 시각화를 위한 python 라이브러리이다.
torch - 딥러닝 프레임워크이다.
torch.nn - 모델을 설계할 때 필요한 함수를 모아 놓은 모듈이다.
torch.nn.functional - 특시 자주 사용되는 함수.
torchvision - 컴퓨터 비전 분야를 대표하는 데이터셋을 다운받을 수 있고 전처리를 제공한다.

MLP로 이미지 분류 아이디어
MNIST 이미지 데이터 1개는 1x28x28 (channel, width, height) WxH 모양의 행렬 데이터이다. 이 데이터를 행벡터 모양으로 펼치면 (1, 784) 모양이 되는데, (Flatten) pythorch에서 제공하는 Linear layer를 사용해서 input이 784인 레이어를 가장 앞에 쌓는다. 이 레이어의 출력을 256으로 한다면 결국 1 x 784 모양의 행렬을 1x 256 행렬로 바꿔 주는 연산이 되는것 이다. 그 다음 레이어의 input을 256으로 하고 출력을 10으로 한다면 2개의 layer가 쌓이게 된 모양이고 MLP라고 한다.

def __init__(self):
  self.fc1 = nn.Linear(1*28*28, 256) #input, output
  self.fc2 = nn.Linear(256, 10)

그러면 28x28 MNIST 데이터를 넣으면 (1, 10) 출력물을 얻을 수 있는데 여기서 의미하는 10은 분류하고자 하는 class의 범주가 된다. 즉 이 모델은 이미지를 input으로 하여 학습하고 10개의 clas s 중 하나로 분류하는 모델이 된다.
하나의 layer를 통과하면서 얻은 output에 activation 함수를 적용한다.

def forward(self, x):
    x = self.fc1(x)
    x = F.relu(x)
    x = self.fc2(x)
    x = F.softmax(x)

DL Viz

데이터 시각화는 데이터를 그래픽 요소(점, 선, 면,...)로 매핑하여 시각적으로 표현하는 것이다.
시각화는 목적, 독자, 데이터, 스토리, 방법, 디자인에 따라 다양한 Task가 존재한다. 대표적인 시각화 라이브러리는 numpy, matplotlib, seaborn,... 등이 있다.

데이터 이해하기

데이터셋의 종류는 다음과 같이 분류할 수 있다.

  • 정형데이터 (일반적인 scv 파일, 테이블 형태)
  • 시계열데이터 (시간 흐름에 따른 trend, cycle ex: 음성, 비디오, 주가데이터)
  • 지리 데이터
  • 관계형 데이터 (객체 간의 관계를 시각 ex: 그래프)
  • 계층적 데이터 (포함관계가 분명한 데이터 ex: Tree)
  • 비정형 데이터

데이터의 종류는 수치형범주형으로 분류할 수 있다.

시각화 이해하기

점, 선, 면으로 이루어진 요소들을 마크라고 한다. 이 마크의 색상, 모양 등을 변경할 수 있는 요소를 채널이라고 한다.

Matplotlib

Matplotlib은 python에서 사용할 수 있는 시각화 라이브러리이다. numpy, scipy를 베이스로 하여 다양한 딥러닝 프레임 워크와 Pandas와의 호환성이 좋다.

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

가장 기본은 Figure와 Axes이다. figure라는 가장 큰 틀안에서 ax라는 서브 플롯을 추가해 그래프를 그린다.

fig = plt.figure()
ax = fig.add_subplot()
plt.show()

절차 지향적으로 코드가 실행 되는데 객체지향 API를 사용하여 그래프에서 각 객체를 생성하고 직접 수정하는 방법이 있다.

fig = plt.figure()
x1 = [1, 2, 3]
ax = flg.add_subplot(111)
ax.plot(x1, color='r') # 데이터, 표시 색상
ax.set_title("plot") # 제목
ax.lenged() # 범례
plt.show()

subplot에 대해 색상, 범례, 제목 이외 x, y축 범위, 라벨 등 다양한 그래프 요소를 변경할 수 있다.


질의응답

Weight, bias를 초기화 (initialization)을 하면 왜 성능이 좋아질까? (He Initialization, Xavier, LeCun)

먼저 모든 가중치를 0으로 초기화 하면 모든 뉴런이 같은일을 하게 된다. 그렇다면 여러개의 노드를 생성(네트워크) 하는 의미가 사라지게 된다. 역전파 단계에서 가중치를 업데이트 할 때 모두 동일하게 발생한다.

가중치 초기화 값이 너무 작을경우 입력값은 점점 0에 수렴하게 된다. 이렇게 되면 역전파 과정에서 gradient를 곱해주어도 값이 작을 것이고 업데이트가 잘 일어나지 않을 것이다.

가중치가 클경우 출력에 activation 함수를 적용시킨다면 tanh의 경우 출력이 항상 1 or -1에 가까워진다. 그렇게 되면 gradient는 0이 될 것이고 가중치 업데이트가 일어나지 않을 것이다.


Reference

https://namu.wiki/w/DQN (DQN)
https://ko.wikipedia.org/wiki/%EC%83%9D%EC%84%B1%EC%A0%81_%EC%A0%81%EB%8C%80_%EC%8B%A0%EA%B2%BD%EB%A7%9D (GAN)
https://deepinsight.tistory.com/114 (weight initialization)


profile
Boostcamper!

0개의 댓글