무효 클릭 IP 추적 중...
머신러닝,딥러닝/딥러닝

[딥러닝 기초] Dense layer

꼬예 2022. 4. 20.

 

이전 글에서는 하나의 뉴런에 input의 데이터 차원이 변경됨(스칼라,벡터,행렬)에 따라
어떻게 연산이 되는지 알아보았다면,

이번 글에서는 뉴런이 vector 형태일때, 즉 뉴런이 여러개일때 연산이 어떻게 되는지 알아 보도록 하겠습니다.

(참고로 뉴런이 vector 형태로 모여있는 형태를 layer라 부르고 layer는 뉴런이라는 함수가 여러 개있는 형태이기 때문에 vector function이라 불릴 수 있습니다.)

 

 

Notation 정리

 

입력 데이터 1개일 경우 

첫번째 input 데이터가 1번째 뉴런(첫번째 레이어에 속하는)에 들어가면 아래와 같은 연산 결과가 나옵니다.

다른 예로 아래와 같은 상황이라면,

이런식으로 각각의 뉴런마다 벡터연산을 모두 진행하는건 상당히 비효율적입니다. 

이보다 각각의 벡터 연산을 한번에 묶어 행렬로 계산한다면, 더욱 빠른 연산이 가능하죠.

 

행렬로 변환된 형태로 연산을 하면 아래와 같은 형태로 수식이 만들어집니다.

 

이를 풀어 affine 연산을 하고, 나온값을 activation 연산하면 아래와 같이 최종적으로 $\mathbb{R}^{1\times l_1}$크기의 벡터를 결괏값으로 얻게 됩니다.

 

( 1, $l_1$) → 1은 input 데이터가 몇개 들어왔는지를 의미합니다. 여기선 1개의 데이터 벡터가 들어왔기때문에 1이고, $l_1$은 첫번째 레이어의 뉴런 갯수를 의미합니다.

 

입력이 여러개가 들어올경우

이번에는 입력이 N개의 데이터가 들어왔을 경우입니다. 

이를 이해하기 위해선 행렬 연산의 특징을 이해할 필요가 있습니다.

1. A*B 에서 A위치에 속한 X데이터는 결과값에 각 row 방향으로 영향을 끼칩니다.

실제로 연산 결과를 보면 각각의 x백터는 최종 결과값의 같은 위치에 영향을 끼친걸 알 수 있습니다.

2. A*B 에서 B위치에 속한 Weight는 결과값에 각 column 방향으로 영향을 끼칩니다.

연산 결과를 보면 각 weight 밑첨자에 해당하는 column별로 같은 값이 있는 걸 알수 있고, 이를 통해 각 column에 영향을 미친다는 걸 알 수 있습니다.

더 나아가서 각 뉴런에 affine 연산을 하는 함수를 $f$라고 할때 아래와 같은 표현과 해석이 가능합니다.

즉 일반화하면 연산된 결과값의 (i,j)위치에 해당하는 값은 i번째 데이터가 j번째 뉴런에 들어간 연산된 값이라고 볼 수 있겠죠.

 

이러한 특징에따라 affine연산된 결과값을 z라고 할때, 아래와 같은 notation으로 쓸 수 있는데요.

왜냐하면 affine연산을 하고 난 값(z)은 다시 두번째 layer의 input값으로 사용될 예정이기 때문에 기존 input data였던 x데이터와의 notation을 맞춰줘야 합니다.

input값이란 이유만으로 x데이터와의 notation을 맞추는게 왜 가능할까요?

기존 input 데이터가 row별로 같은 데이터이면서 여러개의 feature를 가진다는 특징을 가지고 있었는데,

앞서 행렬 연산 특징에서 봤듯이 z데이터(엄밀히 말하면 $\vec{z}^T$)도 각 row방향으로 같은 x데이터가 들어가 있고 단지 거기에 다른 weight, bias가 연산된 것이기 때문입니다.  

 z값을 벡터 형태로 바꾸면 아래와 같이 적어줄 수 있습니다.

기존에 x데이터가 affine연산을 위해 Transpose를 했었는데요. 연산 z값의 형태를 봤을때 이미 Transpose된 형태임으로 아래와 같이 Transpose 한 형태로 notation을 적어줄 수 있습니다.

(최초 input 데이터가 Transpose를 시켜야 나올수있는 형태를 z값은 연산 후에 바로 그 형태가 나왔지만 
다음 layer의 input data이기 때문에 통일성을 위해 Transpose notation을 붙혀줍니다.)

activation 연산에서도 같은 원리라 적용되고, Transpose notation을 붙혀 줍니다.

 

2번째 layer에서 연산

지금까지는 최초 input data인 $X^T$가 뉴런을 통과하는 연산이었다면 이번에는 첫번째 layer를 통과한 $(A^{[1]})^T$가 input으로 사용되어  2번째 layer을 통과할때의 모습을 확인해보도록 하겠습니다. 

 

1) affine 연산

기존 연산과 똑같기 때문에 자세한 설명은 생략하고, 바뀐 notation과 shape에대해서만 언급하도록 하겠습니다.

보시다시피 1번째 layer에서 건너온 a는 [1]로 적어주고 반면 2번째 layer에서 새롭게 생긴 weight, bias는 [2]라고 표기해줍니다. 또한 이에 따라 뉴런의 갯수는 $l_2$라고 새롭게 표현해 주겠습니다.

shape의 경우 첫번째 layer에서 $l_1$개의 뉴런을 통과한 a데이터의 shape은 (n,$l_1$)이고, 두번째 layer의 $W^T$는 ($l_1,l_2$)입니다. 

왜냐하면 affine 연산을 위해선 첫번째 데이터의 feature 갯수 만큼의 weight를 가지고 있어야 하기 때문입니다. bias는 새로 생긴 두번째 layer에서의 뉴런 갯수 만큼을 가지고 있는 형태인 (1,$l_2$)입니다.

연산은 아래와 같은 수식으로 작성이 가능합니다.

2) activation 연산

I번째 layer에서 연산(일반화)

앞에서 배웠던것 들을 기준으로 각 수식을 일반화 해보겠습니다. 

I번째 layer을 통과할것이기 때문에 input 데이터로 들어오는 값은 $(A^{[i-1]})^T$ 로 적어줄 수 있습니다.

 

1) affine 연산

2) activation 연산

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글