반응형

캐글의 딥러닝 튜토리얼을 바탕으로 정리한 문서입니다.  개인적으로 추가한 내용이 있어서 원문 내용과 차이가 있습니다.

 

Intro to Deep Learning

https://www.kaggle.com/learn/intro-to-deep-learning 



2022. 2. 27  최초작성



뉴런(neuron)

 

인공 뉴런 또는 뉴런은 신경망(neural network)의 기본 구성 요소입니다.  생물학적 뉴런에서 영감을 받아 만들어졌기 때문에 생물학적 뉴런과 구조상 유사점이 있습니다. 

 

다음 그림은 하나의 뉴런입니다. 

 

 

뉴런에 하나의 값 x가 입력되고 하나의 값 y가 출력되고 있습니다. 

 

입력의 값이 뉴런으로 전달될때, 입력과 뉴런 사이에 연결된 에지에 있는 가중치가 곱해집니다. 

입력 x는 가중치 w가 곱해져 뉴런에 전달되며 입력 1은 편향 b를 뉴런에 전달하기 위해 사용됩니다. 입력 1에  b를 곱하면 b가 되기 때문에 편향만 뉴런에 전달할 수 있습니다. 편향은 입력과 상관없는 값이기 때문에  뉴런이 입력과 독립적으로 출력을 수정할 수 있도록 해줍니다. 



뉴런은 다음처럼 전달받은 두 값을 더하여 출력 y를 내놓습니다. 

 

y = w * x + 1 * b     (1)



식 (1)은  y = wx + b 로 다시 적을 수 있으며 기울기가 w이고 y절편이 b인 직선의 방정식입니다. 



뉴런은 입력 x가 주어질 때 예상하는 출력 y가 나오도록 하려면 적절한 가중치 w와 편향 b를 가지고 있습니다. 적절한 가중치와 편향을 얻기 위해 train 데이터세트를 사용하여 학습을 진행합니다. 학습을 시작하기전 뉴런은 무작위의 가중치와 편향을 가지고 있지만 학습을 진행함에 따라 적절한 가중치와 편향을 가지게 됩니다.   



80  Cereals 데이터 세트(https://www.kaggle.com/crawford/80-cereals)을 가지고 예를 들어봅니다. 

데이터 세트는 16개의 컬럼으로 구성되어 있습니다. 여기에서는 이 중 설탕(sugars) 함유량이 주어질 때 칼로리(calories)량을 예측하도록 학습된 하나의 뉴런이 어떻게 작동하는지 살펴봅니다.

                                                        [80  Cereals 데이터셋]



80 Cereals 데이터셋을 대상으로 뉴런을 학습시켜서 편향 b는 90, 가중치 w는 2.5를 구했다고 가정합니다.  

 



이제 학습된 모델을 사용하여 5g의 설탕이 함유된 시리얼의 칼로리를 다음처럼 추정할 수 있습니다.

 

                        

뉴런은 설탕 5g이 함유된 시리얼의 칼로리가 102.5라는 것을 예측합니다. 

 

이 뉴런의 출력은 다음처럼 식으로 나타낼 수 있습니다.  

2.5 × 5 + 90 = 102.5



80 Cereals 데이터셋에는 설탕 외에도 많은 특징이 있습니다.  여기서 설탕, 섬유질, 단백질 함유량을 3개의 입력 x0, x1, x2으로 추가할 수 있습니다. 이젠 입력이 3개 가 되었으니 뉴런과의 입력 사이에 각각 가중치 w0, w1, w2가 부여되며 앞에서처럼  편향 b는 하나가 추가됩니다. 

 

 

이 뉴런의 출력은 다음처럼 나타낼 수 있습니다. 

 

y = w0x0 + w1x1 + w2x2 + b



Keras를 사용하여 모델을 생성하는 방법 중 하나가 Sequential 모델을 사용하는 것입니다. Sequential 모델은 리스트에 쌓을 레이어를 추가하여 신경망을 생성합니다. 앞에서 봤던 신경망 모델을 덴스(dense) 레이어를 사용하여 만들 수 있습니다.



다음 코드는 keras를 사용하여  세 가지 입력 특징(설탕, 섬유, 단백질)을 입력으로 받아 하나의 출력(칼로리)을 생성하는 선형 모델을 정의합니다. 

 

 

Sequential  모델은 하나의 뉴런이 포함된 덴스 레이어를 리스트에 추가하여 구성하고 있습니다. 레이어는 공통 입력을 가지는 뉴런을 묶어놓은 것으로 이 레이어들을 결합하여 신경망을 만들게 됩니다. 여기에선 뉴런 1개를 포함하고 있는 덴스 레이어 1개가 신경망을 구성하고 있는 것으로 볼 수 있습니다.  

 

덴스 레이어의 첫 번째 아규먼트인 units을 사용하여 레이어에 포함된 뉴런 개수를 정의합니다. units=1의 의미는 현재 1개의 뉴런이 포함되어 있다는 의미입니다. 각 뉴런에서 출력이 한개씩 나오기 때문에 이 레이어의 출력은 1입니다. 

 

두 번째 아규먼트인 input_shape를 사용하여 레이어에 포함된 뉴런에서 입력으로 받는 특징(feature) 개수를 정의합니다.  input_shape=[3]을 설정하면 레이어에 포함된 뉴런이 세 가지 특징(설탕, 섬유, 단백질)을 입력으로 받아들인다는 의미입니다. 




깊은 신경망( DNN : Deep Neural Networks )

 

공통 입력을 가지는 뉴런들을 묶어서 레이어를 만들고, 이렇게 만들어진 다수의 레이어들을 서로 연결하여 신경망을 만듭니다. 

 

레이어(Layers)

 

공통 입력을 가진  뉴런을 묶어서 덴스(Dense) 레이어를 구성합니다. 아래 그림은 2개의 입력과 1개의 편향을 입력으로 하여 출력을 하나 내놓는 2개의 뉴런으로 구성된 덴스 레이어입니다. 각각의 뉴런이 하나의 출력을 내놓고 있습니다.  이것은  덴스 레이어인 경우 대한 설명입니다. 사용하는 레이어에 따라 동작이 다를 수 있습니다.



여러 개의 레이어를 연결하여 신경망을 구성합니다. 

 

레이어의 종류는 컨볼루션, 순환, 덴스 등  다양하며  각 레이어별로 연결하는 패턴이 달라지여 여러 종류의 레이어를 결합하여 신경망을 구성하기도 합니다.  



활성화 함수(Activation Function)

 

덴스 레이어 두 개를 연결해도 하나의 덴스 레이어보다 나은게 없습니다. 

 

예를 들어 하나의 선형 레이어를 위한 함수가 h(x) = cx라고 하면 3개의 레이어가 연결된 경우에는 함수가 y(x) = h(h(h(x)))가 되므로 c3x가 됩니다.  c3는 상수이므로 선형 레이어 하나를 위한 함수 h(x)= cx와 차이가 없습니다.  

( 출처 -  https://syj9700.tistory.com/37)



그래서 2개 이상의 레이어를 연결하려면 비선형적인 활성화 함수(Activation Function)를 사용해야 합니다. 활성화 함수는 레이어의 출력에 적용되는 함수로 레이어에 속한 뉴런의 출력을 조절하는 역할을 합니다.  

활성화 함수가 없으면 신경망은 선형 관계만 학습할 수 있습니다.  곡선을 학습하려면 활성화 함수를 사용해야 합니다.

 

많이 사용되는 활성함수 중 하나가  ReLu로 아래 그래프로 표현할 수 있습니다. 

ReLu는 는 음수이면  0으로 변환하고 양수이면 원래 값을 그대로 출력합니다. 

 



Relu를 활성화함수로 사용하면 출력은 max(0, w * x + b)가 되며 다음과 같은 다이어그램으로 그릴 수 있습니다.

 



이제 비선형성 활성화 함수를 레이어에 추가했으므로 레이어를 쌓는 것이 의미가 있어집니다.

아래 그림처럼 덴스 레이어를 쌓아서 완전 연결 신경망( fully-connected neural network)을 만들 수 있습니다.

 



입력(Inputs) 레이어와 출력(Ouput) 레이어 사이의 레이어는 출력을 직접 볼 수 없기 때문에 히든(hidden) 레이어라고 부릅니다.

 

Output 레이어에서 사용되는  활성화 함수는 해결하려는 문제에 따라 달라집니다. 예를 들어 회귀(regression)라면 Linear Activation을 사용하여 분류(classification)라면 상황에 따라 sigmoid 또는 softmax를 사용합니다. 



Sequential 모델을 사용하면 리스트에 추가한 순서대로 레이어가 연결됩니다.  첫 번째 레이어는 모델의 입력을 받고 마지막 레이어는 모델의 출력을 내놓습니다. 

 

여기에선 입력 레이어가 따로 없고 첫번째 Dense 레이에서 input_shape를 사용하여 입력의 형태를 지정해주고 있습니다. 

 

activation 아규먼트를 사용하여 레이어의 활성화 함수를 지정할 수 있습니다. 코드에서는 첫번째, 두번째 레이어에서 활성화 함수로 relu를 지정하고 있으며 해결하려는 문제가 회귀이기때문에 마지막 Dense 레이어의 활성화 함수는 지정하지 않고 LInear 함수를 사용하도록 합니다  

 

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([

    # the hidden ReLU layers
    layers.Dense(units=4, activation='relu', input_shape=[2]),
    layers.Dense(units=3, activation='relu'),

    # the linear output layer
    layers.Dense(units=1),
])




캐글 딥러닝 강좌 정리 1 - 뉴런(Neuron)과 깊은 신경망(DNN)

https://webnautes.tistory.com/2184



캐글 딥러닝 강좌 정리 2 - 확률적 경사 하강법(Stochastic Gradient Descent), 손실함수, 옵티마이저

https://webnautes.tistory.com/2185



캐글 딥러닝 강좌 정리 3 - 과적합(Overfitting)과 해결 방법(dropout, batch normalization)

https://webnautes.tistory.com/2186






반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts