본문 바로가기

implement_ml_models

implement_multiLayerPerceptron

다층 퍼셉트론은 퍼셉트론의 층이 여러 개인 것, 함수 형태로 표현하면,

위와 같은 체인 구조가 많이 쓰인다.

오차 역전파

다층 퍼셉트론에서 최적값을 찾아가는 과정은 오차 역전파 방법을 사용

input = np.array([[1,2,3]])

target = np.array([[0.5,0.1]])

(1) 가중치 초기화

임의의 가중치 지정 ( 이러한 초기 가중치를 설정하는 방법도 존재 )

w1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])

w2 = np.array([[0.7,0.9],[0.8,0.1]])

b1 = np.array([[0.5],[0.5]])

b2 = np.array([[0.3],[0.3]])

wl는 각 층 l 에 대한 가중치고 w의 각 행 값은 다음 노드의 입력에 대한 가중치,

여기에 각 층 l 에 대한 편향 bl이 추가된다.

(2) 순전파 계산 수행

입력에 가중치 연산을 수행, 이는 각 은닉층 노드의 입력이 된다. 은닉층 노드 개수 n 개의 결과 생성

g1 = w1.dot(input.T)+b1 
g1
>>>
array([[2.7],
       [3.3]])

 

각 은닉층 노드의 입력에 활성화 함수 연산, 이 경우 시그모이드 함수를 사용한다. (함수로 사용할 수 있을 것)

h1 = 1/(1+np.exp(-g1))
h1
>>>
array([[0.93702664],
       [0.96442881]])

출력층 노드의 입력의 연산

z1 = w2.dot(h1)+b2
z1
>>>
array([[1.82390458],
       [1.1460642 ]])

각 출력층 노드의 입력에 대한 시그모이드 함수 연산

y1 = 1/(1+np.exp(-z1))
y1
>>>
array([[0.86103399],
       [0.75879129]])

이를 통해 최종 출력층 결과를 구할 수 있다.

(3) 비용 함수 정의 및 1차 미분식 구하기

동일한 방법으로 활성화 함수의 미분값을 구한다.

 

미분값은 오차 역전파법을 적용하기 위함

(4) 역전파를 통한 1차 미분값 계산

출력층에서 은닉층으로 거꾸로 올라가는 과정, 수식의 표현

 

가중치나 편향이 변했을 때 출력값의 변화를 구하기 위해 미분, 

위 식을 바탕으로 은닉층에서 출력층까지 연결되는 가중치의 변화에 따른 비용 함수의 변화량을 계산

 

 
c = y1*(1-y1)*((y1.T-target).T).dot(h1.T)
c
>>>
array([[0.04047892, 0.04166268],
       [0.11298352, 0.11628758]])

나오는 결과는 위와 같은 형태
편향에 대한 비용 함수의 변화량도 계산
c_b = (y1*(1-y1)).T.dot((y1.T-target).T)
c_b
>>>
array([[0.16377596]])

위 계산 과정을 통해 각 가중치 값의 변화에 따른 비용 함수 C 의 변화량을 구할 수 있었다.

은닉층에서 입력층으로의 계산

 

 
 
 
먼저 h 에 대한 연산 수행
c_y = y1-target.T
c_y
>>>
array([[0.36103399],
       [0.65879129]])
       
y_z = (y1*(1-y1))
y_z
>>>
array([[0.11965446],
       [0.18302707]])
       
c_h = c_y.T*y_z.T@w2
c_h
>>>
array([[0.12670084, 0.05093706]])

각 은닉층 노드에 대한 변화량을 얻을 수 있다.

이 후 이를 이용해 입력층의 가중치들의 변화에 따른 비용 함수의 변화량을 계산할 수 있다.

입력층의 가중치에 대한 비용 함수의 변화를 계산하기 위해, 은닉층까지의 변화율과 해당 은닉층의 활성화 함수에 대한 변화율, 은닉층의 입력과 가중치에 대한 변화율을 이용해 계산한다.

h_g = h1*(1-h1)
h_g
>>>
array([[0.05900771],
       [0.03430588]])
       
c_w1 = (c_h*(h_g.T)).T*input
c_w1
>>>
array([[0.00747633, 0.01495265, 0.02242898],
       [0.00174744, 0.00349488, 0.00524232]])

나온 결과는

위 형태를 띈다.

마지막으로 편향에 대한 변화율을 계산, 

c_h 은닉층의 입력까지의 연산은 가중치와 동일, 여기에 각 편향에 대한 변화율의 연산을 수행한다(1의 값)

c_b1 = c_h.dot(h_g)
c_b1
>>>
array([[0.00922377]])

이렇게 얻은 모든 가중치들에 대한 오차 함수의 변화량을 통해 파라미터 업데이트를 진행한다.

'implement_ml_models' 카테고리의 다른 글

implement_cnn  (0) 2022.11.22
implement_activation  (0) 2022.11.21
implement_perceptron  (0) 2022.11.21
implement_nadam  (0) 2022.11.20
implement_adaMax  (0) 2022.11.20