ML study

[네이버AI class] 3주차 (4) 딥러닝 학습 원리

mlslly 2024. 5. 20. 17:28

앞선 (3)에서는 데이터를 선형 모델로 해석하고, 경사하강법으로 학습하는 방법을 확인 했다. 

선형 회귀가 아닌 더 복잡한 예측을 위해서는 선형모델만으로는 부족, 비선형 모델이 필요한데, 이제부터는 비선형 모델인 신경망에 대해 알아보도록 한다.

선형 모델 경사하강법 강의는 아래 참고 https://ysryuu.tistory.com/64

 

[네이버AI class] 3주차 (3) - 경사하강법

미분 (differentiation)미분이란 '한 점에서의 기울기' 이다.이는 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로, 최적화에서 많이 사용하는 기법이다.미분은 변화율의 극한으로 정의

ysryuu.tistory.com

신경망

비선형 모델

 

비선형 모델은 입력과 출력간의 관계가 선형적이지 않은 모델이다. 즉 변수 x, 가중치(w), 편향(b)의 관계만으로 설명되지 않는 모델이다.

비선형 모델은 다항 회귀, 지수함수, 시그모이드 함수 등의 비선형 함수를 포함하는 모델이다. 

 

A. 선형모델을 수식으로 표현하기 

 

선형 모델에서는 X행렬을 W를 통해서 다른 차원의 공간 O로 보내주는 개념이었다.

오른쪽 그림에서 각 행벡터 Oi는 데이터 xi와 가중치 행렬 W사이의 행렬곱 + 절편 벡터 b의 합으로 표현된다. 

 

X의 출력 벡터 차원은 d였지만, W와 곱해지면서 O의 최종 출력 벡터 차원은 p로 바뀌게 된다.

아래 그림에서처럼, d개의 x 변수로 p개의 선형모델을 만들어서, p개의 잠재변수 o를 설명하는 모델을 상상할 수 있다.

==x변수들을 o개의 선형 모델로, p개 만들기. 이때 화살표의 개수는 p*d (W가중치 행렬의 원소의 개수)와 같다.

 

 

B. 신경망 (비선형모델) 을 수식으로 표현하기

 

신경망이란 다층 퍼셉트론 (MLP)와 같은 구조를 가진 머신러닝 모델로,

각 뉴런이 인풋을 받아 가중치를 곱한 후에, 비선형 활성화 함수를 통해서 출력을 생성한다. 활성화 함수로 시그모이드, ReLU등의 함수가 사용된다. 

다층 구조를 가지며 각 층의 뉴런들이 비선형 활성화 함수를 통해 연결되어 있으므로 비선형 모델이다. 

 

신경망은 선형모델과 활성함수를 합성한 함수이다

앞선 A. 선형 모델 수식화 그림에서 달라지는 것은, 활성 함수가(ex. 소프트맥스 함수) 잠재벡터의 각 노드에 개별적으로 반영되어 최종적으로 새로운 잠재벡터를 만든다는 점이다.

아래 수식에서 소프트맥스 함수는 비선형 함수로 잠재벡터 z (z1,...,zq) 의 각 노드에 개별적으로 작용, 새로운 잠재 벡터 H를 만든다.

$$ H = (\sigma (z_{1}), ......, \sigma (z_{n})) $$

아래와

$$ \sigma (z) = \sigma (Wx + b) $$

 

아래는 잠재 벡터 H를 다시 출력으로 연결시키는 2층(2 layer) 신경망이다. 

이처럼 선형모델과 활성함수가 반복적으로 활용되는 것이 딥러닝의 구조라고 볼 수 있다.

활성함수는 각 벡터에 개별적으로 적용된다는 점을 주의할 것.

 

 

다층 신경망 (Multi Layer Perceptron)

 

이렇게 2개 이상 여러개의 층이 연결된 신경망을 다층(multi-layer) 퍼셉트론(MLP)이라고 하며,

선형모델과 활성함수의 결합인 신경망이 여러층 합성된 함수이다. 

아래는 l개의 순차적인 신경망을 계산하며, Forward propagation 순전파 를 나타낸다.

 

 

층을 여러개 쌓는 이유는,

층이 깊으면 깊을 수록, 목적함수를 근사하는데 필요한 뉴런 수가 훨씬 빠르게 줄어들어 더 효율적인 학습이 가능하기 때문이다.

층이 얇은 경우 필요한 뉴런의 숫자가 기하급수적으로 늘어나 넓은 (wide) 신경망이 되어야 한다.

이게 특히 복잡한 패턴의 함수에서 깊은 층을 쌓는 것이 효율적인 이유.

단 층이 깊다고만 해서 최적화가 잘 되는 것은 아니고, 오히려 복잡할때 층이 깊으면 학습이 어려울 수 있다.(residual block)

 

활성함수 (Activation Function) 

 

활성함수란 R위에 정의된 '비선형 함수(non linear function)'로서 딥러닝에서 매우 중요한 개념이다.

활성함수를 쓰지 않으면 딥러닝은 선형 모형과 차이가 없다.

전통적으로 시그모이드 함수나 탄젠트 함수가 많이 쓰였지만 딥러닝에서는 ReLU함수를 일반적으로 많이 쓰고있다.

 

비선형모델 ex : 소프트맥스 연산 

 

예를들어, 비선형 모델인 softmax 함수가 합성된 함수를 확률 벡터를 생각해보자.

소프트맥스 softmax 함수는, 모델의 출력을 확률로 해석할 수 있게 변환해주는 연산이다.

이 경우 이 확률 벡터가 '특정 클래스인 k에 속한 확률' 로 해석될 수 있어 분류 문제를 해결할 수 있다. 

분류 문제를 풀 때, 선형 모델과 소프트맥스 함수를 결합하여 예측한다.

 

$$ softmax(o) = softmax(Wx + b) $$

https://jkcb.tistory.com/121

 

 

소프트맥스 함수를 통해 벡터를 변환하는 코드는 아래와 같다.

변환 후 벡터는 모든 출력을 확률로 바꾼 것을 확인할 수 있다.

그러나 '추론'을 할 시에는, 일반적으로 원핫 벡터로, 최대값을 가진 값만 1로 출력하는 연산을 사용하기에 softmax를 활용하지는 않는다.

# 소프트맥스 함수
def softmax(vec):
    denumerator = np.exp(vec - np.max(vec, axis=-1, keepdims=True))
    numerator = np.sum(denumerator, axis=-1, keepdims = True)
    return denumerator / numerator
    
# 벡터 
vec = np.random.randn(3,4)

array([[ 0.0131629 ,  0.24201744,  1.41031593,  0.47281825],
       [ 0.69583427, -0.92415228,  0.20202069,  1.76105202],
       [-2.46899353, -2.00669755,  0.62886815, -1.44575666]])

# 소프트맥스 함수로 벡터 변환
softmax(vec) 

array([[0.1268334 , 0.15944977, 0.51287258, 0.20084425],  # 각 행의 원소들이 확률로 변환됨, 총합 1
       [0.21232925, 0.04202025, 0.12958339, 0.61606711],
       [0.03633663, 0.05769222, 0.80487588, 0.10109526]])

 

 

딥러닝의 학습 원리  : 역전파 알고리즘 (Backward Propagation) 

 

MLP에서, 입력데이터를 신경망에 통과시키며 순서대로 출력을 계산하는 과정이 순전파 (Forward Propagation), 

라면, 그 반대 개념이 역전파 (Backward Propagation) 이다.

 

순전파 과정에서 각 층의 뉴런은 이전 층의 출력을 받아, 가중치w와 편향b를 통해 변환한 값을 다음 층에 전달해서, 최종적으로 출력층에서 신경망의 예측값을 생성한다.

반면 역전파 과정은, 순전파를 통해 얻은 예측값과 실제값 사이의 오차를 기반으로, 신경망의 가중치w와 편향b을 조정하고 업데이트하는 과정이다.

 

1) 오차 계산 : 손실 함수를 사용해서 순전파를 통해 얻은 '예측값'과, '실제값' 사이의 오차를 계산한다.

2) 오차의 미분(기울기) 계산 : 계산된 오차를 신경망의 각 가중치에 대한 미분 (기울기)으로 변환한다. 그리고 오차가 각 가중치에 미치는 영향을 계산한다.

3) 가중치 업데이트 : 기울기를 사용해서 가중치를 업데이트 한다. 일반적으로 경사하강법을 사용해서 가중치를 업데이트 한다.

https://anatomiesofintelligence.github.io/posts/2018-10-16-forward-back-propogation