Keyword

  1. 인공 뉴런(퍼셉트론) : 입력값, 가중치, 편향을 이용해 출력값을 내는 수학적 모델
  2. 단층 인공 신경망 : 퍼셉트론을 하나만 사용하는 인공 신경망
  3. 다층 인공 신경망 : 퍼셉트론을 여러 개 사용하는 인공 신경망
  4. Layer : 입력값을 표현하는 입력층, 신경망의 출력을 계산하는 출력층, 입력층 이후부터 출력층 전까지는 은닉층 (hidden layer)
  5. 가중치는 입력의 중요도. 편향은 활성화의 경계가 원점으로부터 얼마나 이동할지를 결정
  6. 활성화 함수 : 해당 뉴런의 출력을 다음 뉴런으로 넘길지를 결정. 시그모이드 함수는 뉴런의 출력값을 0과 1사이로 고정함.
  7. 손실 함수 (Loss function) : 정답과 신경망의 예측의 차이를 나타내는 함수
  8. 경사 하강법 : 손실을 가중치에 대해 미분한 다음, 기울기의 반대 방향으로 학습률만큼 이동시키는 알고리즘
  9. 오차 역전파 : 올바른 가중치를 찾기 위해 오차를 출력층으로부터 입력층까지 전파하는 방식
  10. 오버피팅 (과적합) : 학습에 사용한 데이터에 최적화되게 학습되어 다른 데이터에 대한 예측 성능이 떨어지는 경우
  11. 기울기 소실 : 출력층으로부터 멀어질수록 역전파되는 오차가 0에 가까워지는 현상

2.1 퍼셉트론

ANN(Artificial Neural Network)는 사람의 신경망을 본떠 만든 알고리즘을 말한다. Perceptron은 인공 뉴런을 뜻하며, 사람의 뇌세포(뉴런)를 수학적으로 표현한 것이다. ANN은 perceptron의 집합체로 하나의 뉴런이 존재하면 단층 신경망, 여럿을 조합하면 다층 신경망이라고 부른다.

퍼셉트론은 입력층, 노드(인공 뉴런), 출력층으로 구성된다. 뇌세포는 다른 뇌세포로부터 임곗값 이상의 자극을 받지 않으면 다음 뇌세포로 정보를 전달하지 않는다. 이와 비슷하게 ANN 또한 입력값에 가중치를 곱해 더해준 다음, 활성화 함수를 이용해 다음 노드에 정보를 전달할지 말지를 결정한다.

활성화 함수로는 시그모이드 함수를 이용한다. 시그모이드 함수는 실수 전체의 모든 입력에 대해 출력이 0과 1 사이의 실수만을 갖게 된다. 시그모이드 함수를 사용하는 이유는 인공 신경망의 출력을 확률로써 다루기 위해서이다.

 

 

2.2 단층 신경망 vs 다층 신경망

단층 신경망은 하나의 직선을 이용해 데이터를 분류하는 반면, 다층 신경망은 선을 여러 번 그어서 데이터를 분류한다.

직선 하나로 구분이 불가능한 데이터 분포도 직선을 여러 개 이용하면 구분할 수 있다. 직선 하나를 사용하면 단층 퍼셉트론, 여러 층에 걸쳐 퍼셉트론이 분포되어 있으면 다층 퍼셉트론 (MLP)라고 부른다. 비슷하게 하나의 층이 존재하는 신경망을 단층 신경망, 여러 층이 존재하는 신경망을 다층 신경망이라고 한다. (신경망 > 퍼셉트론)

다층 신경망 구조

다층 신경망은 그림과 같이 입력층, 은닉층, 출력층으로 구성된다. 신경망의 하나의 층에서 노드의 수를 '층의 너비', 층의 개수를 '층의 깊이'라고 한다.

 

2.3 손실 함수

오차를 구하는 함수를 오차 함수 혹은 손실 함수라고 하며, 손실 함수의 값이 결정 경계의 성능을 간접적으로 나타낸다. (인공지능의 성능을 증명하는 가장 중요한 지표 중 하나)

대표적인 손실 함수로는 평균 제곱 오차, 크로스 엔트로피 오차 등이 존재한다.

  • MSE(Mean Squared Error, 평균 제곱 오차) : 모델이 예측한 값과 실제 값의 차이의 제곱의 평균값. 오차가 두드러지는 부분을 잡아내기 쉽다. 회귀 분석에 주로 사용.

 

  • CE(Cross Entropy, 크로스 엔트로피 오차) : 두 확률 분포의 차이를 구하는 함수. 분류 문제에서는 ANN의 출력이 확률 분포이므로 확률 분포의 차를 구하는 함수가 필요하다. 크로스 엔트로피는 정답값의 확률과 모델이 예측한 확률에 로그를 취한 값을 곱해서 구한다.
  • MAE(Mean Average Error, 평균 절대 오차) : 정답과 예측값 차이의 절댓값의 평균값.
  • RMSE(Root Mean Squared Error, 평균 제곱근 오차) : MSE의 제곱근. 값의 왜곡을 줄임.

 

2.4 경사 하강법, 오차 역전파

데이터 분포가 복잡해질수록 은닉층의 깊이를 늘리거나, 은닉층의 뉴런 개수를 늘리게 된다. 그러면 은닉층마다 데이터를 구분하는데 사용할 가중치를 구하기 어려어진다. 손실함수의 최적값을 찾기 위해서는 최적화된 weight와 bias를 찾아야한다. 이는 즉, 방정식을 푼다는 의미이고, 가중치와 편향이 늘어날수록 방정식의 복잡도 또한 증가하기 때문에 찾기 어려워진다. 이를 해결하기 위해 사용하는 것이 경사 하강법과 오차 역전파이다.

 

2.4.1 경사 하강법 (gradient descent)

함수의 기울기(경사)를 구하고 경사의 반대 방향으로 계속 이동시켜 최솟값에 이를 때까지 반복시키는 학습 방법을 경사 하강법이라고 한다.

경사 하강법에서는 시작점으로부터 어느 정도 이동할지를 손실 함수의 기울기와 학습률(learning rate)로 결정한다.

대표사진 삭제

사진 설명을 입력하세요.

이때 가중치는 시작점으로부터 기울기 크기만큼 이동하게 되는데, 학습률을 이용해 더 많이 이동하거나 더 적게 이동할 수 있다. 이것을 수식으로 나타내면 다음과 같다.

$w'\ =\ w-\alpha \frac{dL\left(y,y\right)}{dw}$w′ = w−αdL(y,y)dw​​

여기서 알파가 학습률, w'이 가중치의 새로운 값을 의미한다. 학습률이 너무 크면 최솟값을 지나쳐버릴 수 있고, 너무 작게 설정하면 최솟값에 도달하기까지 지나치게 많은 반복을 할 수 있다. 따라서 적절한 학습률을 설정해주어야한다.

 

2.4.2 오차 역전파 (Back propagation)

Chain rule을 이용해 output에서 가까운 순서대로 거꾸로 출력된 가중치들을 갖고 그 가중치들을 update하는 과정을 말한다. 즉, 출력층부터 역순으로 gradient를 전달하여 전체 layer의 가중치를 update하는 방식이다.

 

2.5 활성화 함수 (Activation Function)

오차가 역전파될 때 층을 한 번 거칠 때마다 시그모이드의 도함수가 곱해진다. 하지만 시그모이드의 도함수는 최댓값이 0.25이기 때문에 곱해질 때마다 오차가 점점 줄어들게 된다. 즉, 층이 너무 깊어지면 출력층에 가까운 은닉층들은 제대로 학습되지만, 입력층에 가까운 은닉층들은 제대로 학습되지 않는다.

Sigmoid Function

또한, 시그모이드 함수는 실수 전체를 0과 1 사이의 값으로 압축한다. 따라서 값이 커질수록 기울기 크기가 0에 가까워지게 된다. 이를 기울기 소실 문제(Vanishing Gradient)라 한다. 이를 해결하기 위해서는 미분해도 값이 줄어들지 않는 활성화 함수가 필요하다.

ReLU

위는 ReLU 함수의 그래프이다. ReLU함수를 미분하면 0보다 큰 범위에서 기울기 1을 갖기 때문에 기울기 소실 문제가 발생하지 않는다. 하지만 0보다 작은 범위에서는 0을 반환하기 때문에 그 뉴런과 연결되어 있는 다음 층의 뉴런은 입력의 일부가 0이 된다. (정보 소실) 따라서 모델을 만들 때는 은닉층의 깊이, 활성화 함수, 손실 함수 등을 복합적으로 고려해야 한다.

 

**그외

  • Hyperbolic Tangent : Sigmoid와 동일하게 입력값이 커질수록 Vanishing Gradient 문제 발생. 하지만 평균은 0이 됨.
  • Softmax : multi classification에 사용됨. 벡터 함수. k개의 숫자를 입력받아 k개의 요소를 갖는 확률 분포로 변환하는 함수.

 

 

 

 

++ 6개월 전에 분명 다 배웠던 건데, 제대로 안하니까 몇 번을 다시 보는지 ㅎ.. 처음 배울 때 확실히 개념을 정리하자..

 

* Must Have 텐초의 파이토치 딥러닝 특강을 베이스로 너무 기초적인 지식은 배제하고, 다시 알아두면 좋을 정보만 정리하였음.

 

Keyword

  1. 머신러닝 : 입력 데이터를 이용해 알지 못하는 변수를 반복적으로 학습해나가면서 예측하는 알고리즘
  2. 딥러닝 : 인공 신경망을 사용한 머신러닝 알고리즘 ( 머신러닝 안에 딥러닝 포함 관계)
  3. 지도 학습 : 데이터에 정답 데이터 (ground-truth)를 제공하는 학습 방법
  4. 비지도 학습 : 데이터에 정답 데이터를 제공하지 않는 학습 방법
  5. 강화 학습 : 데이터를 사용하지 않고, 인공지능이 스스로 시행착오를 겪으며 성장하는 학습 방법
  6. 딥러닝 문제 해결 프로세스
    1. 문제 정의
    2. 데이터 수집
    3. 데이터 가공
    4. 딥러닝 모델 설계
    5. 딥러닝 모델 학습
    6. 성능 평가

1.1 머신러닝과 딥러닝

기계에게 시행착오 개념을 알려주고, 문제를 간단하게 만들어 제공함으로써 계산량을 줄이고 성장할 수 있도록 만든 기술을 머신러닝 (기계학습) 이라고 부른다. 머신러닝은 인간처럼 생각하는 인공지능은 아니지만, 주어진 문제를 해결하는 능력을 갖춘 인공지능이라고 볼 수 있다. 대표적인 문제로는 값을 예측하는 회귀 문제, 범주를 나누는 분류 문제가 있다. 이러한 머신러닝 중에서도 인공 신경망을 이용한 머신러닝 알고리즘을 딥러닝이라고 부른다. (인공지능>머신러닝>딥러닝)

 

 

1.2 지도 학습, 비지도 학습, 강화 학습

머신러닝의 학습 방법은 세 가지로 분류할 수 있다. 첫 번째로 데이터에 정답이 있는 지도 학습, 두 번째는 데이터에 정답이 없는 비지도 학습 (주어진 정보를 이용해 상관관계를 찾아내는 것), 마지막으로는 인공지능이 직접 체험하며 학습하는 강화 학습 (input 없음.)이 있다.

 

 

1.3 왜 파이토치인가?

딥러닝 모델을 만들고 학습하는 데 필요한 도구를 모아놓은 프레임워크는 여러 가지가 있다. 대표적인 프레임워크로는 TensorFlow, Keras, PyTorch가 있다.

 

paperswithcode.com (+ task별 SOTA 논문을 한 눈에 볼 수 있고, 논문과 코드를 한 번에 볼 수 있어 공부하는 데 도움 됨!) 에 따르면 2022년 3월 현재 파이토치 논문에서 가장 많이 사용하는 딥러닝 프레임워크이다.

 

파이토치는 대형 회사부터 대학 연구실까지 많은 사람이 이용한다. 파이토치 코드는 파이썬 본래의 코드와 유사해 직관적이라는 장점이 있다. (실제로 우리 연구실도 파이토치를 주로 쓴다. vision 관련 dataset이나 tool이 이미 많아서 사용하기에 좋다.) 텐서플로는 구글에서 공개한 프레임워크로 다양한 플랫폼에서 이용하기 좋다는 장점이 있다. (백엔드, 프론트엔드를 같이 올리기 편하다는 장점)

 

이미지에는 픽셀의 가로 세로 위치와 RGB 값이 존재하는데, 파이토치는 RGB 값을 가장 먼저 고려한다. 딥러닝은 계산이 복잡하기 때문에 계산 그래프를 만들어 계산한다. 파이토치는 동적 계산 그래프를 활용한다. 즉, 코드를 읽어오면서 그래프를 만들어 사용한다. (텐서플로의 경우 정적 그래프 사용) 동적 계산 그래프는 중간에 변수 값을 바꿀 수 있다. 반면, 정적 그래프는 값을 바꿀 수 없지만, 미리 정의한 순서대로 계산하므로 속도가 빠르다.

 

 

1.4 파이토치 권고 코딩 스타일

파이토치는 클래스 사용을 권장한다. 파이토치는 모듈 클래스를 이용해 신경망을 만들고, 데이터셋 클래스를 이용해 데이터를 불러와 학습한다.

( 몇 가지 모델 코드를 뜯어본 결과, 데이터를 분류하는 건 알아보기 쉽지만, attention 방식이나 사용하는 activation 함수 등의 종류, 또는 모델을 개선하는 데 사용되는 것은 모듈 클래스이기 때문에 이 부분을 이해하는 게 중요할 것 같다. )

 

class Net(nn.Module):

def __init__(self):

# 신경망 구성요소 정의

 

def forward(self, input):

# 신경망의 동작 정의

return output

 

파이토치는 학습에 사용할 입력 데이터와 정답을 불러오는 data loader를 제공한다. 데이터 로더는 데이터셋 클래스를 입력으로 받아 학습에 필요한 양 만큼의 데이터를 불러오는 역할을 수행한다. 이 데이터로더로부터 데이터와 정답을 불러와 신경망의 예측값을 계산한다. (신경망 = 파이토치 모듈)

예측값 계산 - 손실 함수를 이용해 신경망의 오차 계산 (Loss는 기본적인 값으로 사용하기도 하지만 대체로 논문에서 정의한 식 사용) - 파이토치의 backward() 메서드를 이용해 오차를 역전파 - step() 메서드를 이용해 신경망의 가중치를 수정

 

 

1.5 딥러닝 문제 해결 체크리스트

  1. 데이터 파악
    1. 입력 자료형과 정답 확인
    2. 클래스 간의 불균형 확인
    3. 누락된 데이터 혹은 자료형에 맞지 않는 데이터가 포함되어 있는지 확인하기
  2. 데이터 전처리
    1. 학습에 필요한 데이터가 부족하다면 데이터 증강하기 (data augmentation 등을 이용하기도 하고, 다른 데이터셋을 붙여 사용하기도 함)
    2. 데이터를 정규화해서 값의 범위 맞추기
  3. 신경망 설계
    1. 데이터의 공간 정보가 중요하다면 합성곱 적용
    2. 데이터의 순서 정보가 중요하다면 RNN 적용 (NLP 같은 경우 RNN을 사용하고, vision의 경우 CNN을 사용함. But, 지금은 경계가 희미하긴함.)
  4. 신경망 학습
    1. 적합한 손실 함수 찾기
    2. 가중치 수정을 위한 최적화 정하기
    3. 신경망의 성능을 평가하기 위한 평가 지표 정하기
  5. 손실이 무한대로 발산한다면
    1. 손실 함수 변경
    2. 데이터 확인
    3. 학습률 줄이기 (learning rate)
  6. 손실이 0으로 수렴
    1. 데이터 부족 체크 (과적합 여부)
    2. 신경망 크기 줄여보기

 

 

1.6 직관적 분석에 유용한 시각화

시각화는 딥러닝 모델의 동작을 눈으로 직접 확인하는 방법이다. 이 책에서는 파이썬의 시각화 라이브러리인 matplotlib을 사용한다.

첫 번째로 이미지를 한 눈에 볼 수 있도록 하는 subplot을 사용한다. 서브플롯은 여러 그래프를 비교하거나 두 이미지의 차이를 비교하는 등 한 번에 여러 그래프를 그릴 때 사용한다. 딥러닝 모델의 예측과 실제 정답을 비교할 때 주료 사용했다.

두 번째로 꺾은 선 그래프를 그리는 plot이다. 시간의 흐름에 따른 데이터의 변화를 한 눈에 알아볼 수 있기 때문에 순서가 있는 데이터를 다룰 때 사용한다.

( vision task의 경우, 특히 image classification이나 object detection 같은 경우에는 subpot만 사용한다. regression같은 머신 러닝 문제에는 plot을 사용하는 듯하다 )

 

 

 

+ Recent posts