티스토리 뷰

이번에는 신경망 구현에 대해 배우겠다.

 

신경망 네트워크 개요

우리는 이전에 로지스틱 회귀 모델이 아래 계산 그래프와 일치한다는 것도 봤었다.

 

특성 \(x\) 와 변수\(w\), \(b\)를 입력하면 \(z\) 를 계산하는 거다.

\(z\)는 \( \hat{y}\)라고도 쓰는 \(a\)를 계산하는데 쓴다.

마지막으로 손실함수인 \(L\)을 계산한다.

 

 

신경망시그모이드 유닛을 쌓아서 아래와 같이 만들 수 있다.

 

특성인 \(x\)와 변수 \(W\)와 \(b\)를 입력하면, \(z^{[1]}\)을 계산한다.

\(z^{[1]}\)을 계산한 뒤, \(a^{[1]}\)을 계산한다. 

그 후에 다른 선형 식을 사용하여 \(z^{[2]}\)를 계산한다.

다음엔 \( \hat{y}\)라고도 쓸 수 있는 신경망의 최종 출력값인 \(a^{[2]}\)를 계산한다.

 

 

여기서, 배워야할 직관은 로지스틱 회귀에선 \(z\)와 \(a\)를 계산했지만, 

신경망에서는 \(z\)와 \(a\)를 여러 번 계산해준다. 

그리고 마지막으로 손실을 계산한다.

 

로지스틱 회귀에서는 도함수 계산을 위해 역방향 계산을 했었다.  \(da\)와 \(dz\)를 계산했다.

 

 

마찬가지로, 신경망에서도 역방향 계산을 한다.

 

 


신경망 네트워크의 구성 알아보기

 

신경망 그림들이 무엇을 뜻하는 지, 무엇을 묘사하는 지에 대해서 알아보자. 

먼저, 은닉층(hidden layer)이 하나인 신경망에 집중하겠다.

 

아래는 신경망의 그림이다.

 

 

  • 입력 특성들의 층을 입력층이라하며 \(a^{​[0]}\)으로 표기한다. 
  • 은닉층이랑 입력층과 출력층 사이에 있는 모든 층을 의미한다. \(l\)번째 은닉층의 \(n\)번째 유닛은 \(a^{​[l]}_{n}\)으로 표기한다.
    • 예를 들어 첫 번째 은닉층은 \(a^{​[1]}\) 표현하며,  첫 번째 은닉층에 있는 첫 번째 유닛은 \(a^{​[1]}_{1}\), 첫 번째 은닉층에 있는 두 번째 유닛은 \(a^{​[2]}_{2}\)로 표현할 수 있다.
  • 출력 특성들의 층을 출력층이라 한다.
  • 신경망 층의 개수를 셀 때는 입력 층은 제외한다
    • 예를 들어, 위의 그림은 은닉층 1개, 출력층 1개 이기에 2층 신경망이라 한다.

여기서, \(a\)는 활성값을 의미하고, 신경망의 층들이 다음 층으로 전달해주는 값을 의미한다.


신경망 네트워크 출력의 계산

로지스틱 회귀를 나타내는 아래의 원은 두 단계의 계산을 나타낸다.

먼저, z를 계산하고, 활성화 a를 \(omega(z)\)로 계산한다.

 

신경망에서는 이걸 많이 반복한다.

 

4개의 노드에 대한 등식은 다음과 같다.

 

예상했겠지만 신경망을 for문을 써서 구현하면 굉장히 비효율적이다.

그래서 이 4개의 등식을 벡터화하겠다.

 

먼저, \(z\)를 벡터로 계산하는 법을 보겠다.

 

그 다음에 \(a\)를 계산하는 방법이다. (빨간색 부분)

 


많은 샘플에 대한 벡터화

신경망은 벡터화를 통해 모든 샘플에 대한 출력값을 거의 동시에 계산할 수 있다.

 

한 훈련 샘플에 대해  \(\hat{y}\)인 \(a^[2]\)를 계산한다.

만약 훈련 샘플이 m개 있다면, 표기법은 다음과 같다.

  •  a[i][j] 
  • i : 몇 번째 층인지 의미합니다.
  • j : 몇 번째 훈련 샘플인지 의미합니다.

 

 

모든 훈련 샘플의 예측값을 벡터화되지 않은 방법으로 계산한다면,

i가 1부터 m까지 이 공식을 구현하면 된다.

 

우리는 for문을 없애기 위해 이 계산을 벡터화할 것이다.

 

행렬 Z와 A에 가로는 훈련 샘플의 번호가 된다. 각각 다른 훈련 샘플에 대응된다.

그리고 세로는 신경망의 노드들이 된다.

예를들면, 행렬 왼쪽 위에 있는 값은 첫 은닉 유닛의 첫 훈련 샘플의 활성값이 된다.

바로 아래값은 두번째 은닉 유닛의 활성값이 되겠다.

이제 이 공식으로 여러 샘플에 대해 신경망을 벡터화할 수 있다. (빨간색 네모)


벡터화 구현에 대한 설명

 

 

한번에 하나의 훈련 샘플에 대해 정방향 전파를 한다면,

i가 1부터 m까지 for문을 이용하여 아래의 코드를 실행해야한다. 

 

훈련 샘플을 이처럼 열로 쌓아서, 여기 있는 값들을 모두 열을 쌓는 거다.

그럼, 모든 m 훈련 샘플에 대해 벡터화하게 해준다.

 

 

 

 

 

 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함