본문 바로가기
딥러닝 머신러닝 데이터 분석/BoostCampAITech

[ Boost Camp ] Day-2 학습로그( 신경망 학습 )

by SteadyForDeep 2021. 8. 6.
반응형

본 문서는 강의의 내용을 토대로 다른 자료들을 공부하고 취합하여 재 해석한 내용으로 강의 내용과 많이 다를 수 있음.

이하 모든 출처가 생략된 자료는 모두 Boost Camp AI Tech의 자료에서 발췌한 것임을 밝힘.

 

// 신경망의 학습

 

앞서 우리는 선형회귀모델을 이용해서 데이터의 경향을 가장 잘 나타내는 직선의 방정식을 찾아내는 과정을 보았다.

 

그리고 미니배치를 통한 더욱 효과적인 경사하강법도 보았다.

 

그렇다면 데이터가 두개 이상의 카테고리를 가지고

 

각 카테고리 별로 대표되는 직선의 방정식이 다르다면 어떻게 각 카테고리마다 경향성을 찾을 수 있을까

 

 

그것은 \beta를 여러개로 묶은 하나의 행렬을 이용함으로 해결할 수 있다.

 

이번에는 열벡터들이 원소로 주어지는 행벡터를 W 라고 했다.

 

이렇게 하면 W의 각 열에 해당하는 하나의 선형회귀모델이 생기게 되고

 

이런 회귀모델을 각각 학습시켜줌으로 특정한 데이터의 카테고리를 대표하게 만들 수 있다.

 

이걸 그림으로 나타내면

 

 

우리가 잘 아는 신경망의 구조가 나온다.

 

화살표가 W의 한 원소 역할을 하게 되고 데이터와 O는 이 W로 연결되어 있다.

 

B는 생략되어있다.

 

이제 여기서 선형회귀와 다른 점을 추가하게 되는데 확률을 계산하는 부분이 추가된다.

 

우리가 선형회귀모델 여러개를 동시에 훈련하고자 했던 이유는

 

데이터의 카테고리가 여러개라는 부분에서 접근한 것이었는데

 

선형회귀모델을 여러대 놓는 것은 사실 문제가 좀 있는 접근이다.

 

선형회귀 모델은 데이터의 경향성을 나타내주는 것으로 관측되지 않은 X를 넣어주면

 

가장 기대할만한 Y를 반환하는 모델이라고 할 수 있다.

 

그러면 위의 식을 선형회귀모델 여러개로 학습하게 되면 각각의 모델이 대표하는 y값을 반환할 것이고

 

그러면 실질적으로 어떤 직선을 선택하는 것이 타당한가를 알 수 없게 된다.

 

그래서 우리는 이것을 선형회귀적인 관점보다는 저차원으로 맵핑하여

 

어떤 카테고리에 속할 확률이 가장 높은 것인지 구하는 연산자로써 W를 다뤄볼 수 있다.

 

softmax 연산은 언뜻 보기엔 상당히 복잡해 보이지만

 

그냥 자기자신을 총합으로 나누었다는 것에서 그냥 확률이라고 볼 수 있다.

 

exp 연산은 단조증가 함수로 큰 수일 수록 더 큰 수로 만들어주는 변환으로

 

데이터간의 갭을 더 크게 벌려주는 연산이라고 생각하면 쉽다.

 

반대로 log 함수는 데이터간의 갭을 줄여주는 변환이다.

 

즉 소프트맥스는 확률을 구하는데 더욱 극명하게 확률을 표시하는 작업이라고 보면 되겠다.

 

이를 통해서 우리는 특정 카테고리에 속하는 레이블을 0과 1로 주어주게 되어

 

확률근사를 할 수 있게 된다.

 

강의에서는 훈련할때만 softmax를 사용하고 inference 때는 사용하지 않는 다고 말하는데

 

이게 softmax의 의미를 이해하면 간단하게 이해되는 부분이다.

 

 

신경망은 우리가 알듯이 이렇게 여러 층을 쌓아서 만들어 낼 수 있다.

 

이것은 Day-3에서 알 수있는 내용으로 미리 말을 하자면

 

확률을 얻어내는 모델은 그 자체로 어떤 확률분포를 근사한다고 볼 수 있는데

 

이때 비 모수적인 방법론을 사용하는 모델의 경우

 

데이터에 따라 모수의 개수가 변하거나 매우 많은 양의 모수를 추정해야한다.

 

인공신경망을 통해 추론하는 경우가 이에 해당하는데

 

나는 여기서 활성함수를 사용하는 이유가 바로 이 모수의 개수가 변화하는 것을 반영하기 위한 것이라고 본다.

 

물론 취지는 뉴런의 활성 문턱값을 모사하기 위한 것이었지만

 

수학적으로 볼때 그러한 근거도 마련되어 있는 것이다.

 

자세한 이야기는 Day-3 에서 확인할 수 있다. (한 주 치 몰아서 쓰고 있다는 이야기다.)

 

 

이렇게 수 많은 파라미터를 업데이트하는 방법은 역전파Backpropagation으로 잘 알려진 방법을 쓴다.

 

이 이론은 delta-rule 로 잘 알려져 있는데

 

설명이 자세한 링크를 후첨하도록 하겠다.

 

중요한 점은 데이터가 통과하는 각각의 함수를 아주 국소적인 시점으로 나누어서 도함수를 알고 있다면

 

모든 역전파를 다 구할 수 있다는 이야기가 되는데

 

이걸 OOP로 짜면 굉장히 쉽게 Auto-gradient를 설계할 수 있다.

 

https://github.com/hyun06000/DeepLearningFromScratchWithNumpy

 

GitHub - hyun06000/DeepLearningFromScratchWithNumpy: Basic Lines with Numpy to Builed a Neural Network Model

Basic Lines with Numpy to Builed a Neural Network Model - GitHub - hyun06000/DeepLearningFromScratchWithNumpy: Basic Lines with Numpy to Builed a Neural Network Model

github.com

 

넘파이로 구현한 내 코드를 첨부한다.

 

반응형

댓글