일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- rnn
- AI
- 큐
- 삽입정렬
- 재귀함수
- pytorch
- 최단 경로
- 딥러닝
- 이진 탐색
- 퀵정렬
- 캐치카페신촌점 #캐치카페 #카페대관 #대학생 #진학사 #취준생
- Machine Learning
- 선택정렬
- 그리디
- 알고리즘
- 정렬
- 인공지능
- 선형대수
- LSTM
- GRU
- BFS
- DFS
- 스택
- 계수정렬
- 다이나믹 프로그래밍
- RESNET
- 머신러닝
- Today
- Total
hyeonzzz's Tech Blog
[Andrew Ng] 딥러닝 1단계 : 5. 심층 신경망 네트워크 본문
1. 더 많은 층의 심층 신경망
심층 신경망이란 무엇일까?
우리는 로지스틱 회귀를 매우 얕은 모델이라고 한다. 로지스틱 회귀는 한층의 신경망이다. 반면에 오른쪽 아래 모델은 더 깊은 모델이다. 은닉층의 개수는 또 다른 하이퍼파라미터가 된다. 다양한 값을 시도하고 검증 데이터에서 평가해야 한다.
심층 신경망 표기법
그림은 4개 층의 신경망이다. 각각의 은닉층의 유닛 개수는 5, 5, 3이고 한 개의 출력 유닛이 있다.
- L : 네트워크 층 수 (4)
- n^[l] : l층에 있는 유닛 개수 (n^[1] = 5)
- a^[l] : l층에서의 활성값 (정방향 전파에서 a^[l] = g^[l](z^[l]))
- w^[l] : 가중치
- a^[0] = X : 입력 특징
- a^[L] = ŷ ŷ : 예측된 출력
2. 심층 신경망에서의 정방향전파
단일 학습 데이터 x에 대한 정방향 전파
첫번째 층에 대한 활성화를 계산하는 방법은 z^[1] = W^[1]x + b^[1]이다. W^[1]과 b^[1]은 층 1에서 활성화에 영향을 주는 파라미터들이다. 해당 층에 대한 활성화를 계산하면 a^[1] = g^[1](z^[1])이다. 활성화 함수 g는 층마다 다르다.
두번째 층에 대한 활성화를 계산하는 방법은 z^[2] = W^[2]a^[1] + b^[2]이다. 따라서 층2의 활성화는 가중치 행렬에 층1의 출력을 곱한 것에 층2의 편향 벡터를 더한 값이다. a^[2] = g^[2](z^[2])이다.
이런 식으로 출력층인 층4에 이를 때까지 계속한다. z^[4] = W^[4]a^[3] + b^[4]이고 a^[4] = g^[4](z^[4])이다. 이것이 추정된 y의 예측값을 계산하는 방법이다.
x = a^[0]이다. 따라서 일반적인 규칙은 다음과 같다.
z^[l] = W^[l]a^[l-1] + b^[l]
a^[l] = g^[l](z^[l])
전체 학습 세트에 대한 벡터화된 전방향 전파
첫번째 층에 대한 활성화를 계산하는 방법은 Z^[1] = W^[1]X + b^[1]이다. A^[1] = g^[1](Z^[1])이다. X = A^[0]
두번째 층에 대한 활성화를 계산하는 방법은 Z^[2] = W^[2] A^[1] + b^[2]이다. A^[2] = g^[2](Z^[2])이다.
z^[2](1) → 첫번째 학습 데이터에 대한 z벡터
z^[2](2) → 두번째 학습 데이터에 대한 z벡터
...
m번째 학습 데이터까지 하고 이것들을 열에 저장해서 Z라고 부른다. A도 비슷한 방식이다.X처럼 모든 학습 데이터는 왼쪽에서 오른쪽으로 저장된 열 벡터의 형태이다. 그리고 이 과정은 Y의 예측값인 g(Z^[4]), 즉 A^[4]로 끝난다. 이것은 수평으로 저장된 모든 학습 데이터에 대한 예측값이다.
층 1,2,3,4 각각에 대한 활성화를 계산하는 반복문을 사용하는 것은 괜찮다.
3. 행렬의 차원을 알맞게 만들기
교수님이 코드의 정확성을 확인하기 위해 자주 사용하는 디버깅 툴은 행렬의 차원을 확인하는 것이다.
그림에서 L = 5이다. 입력층은 제외하고 5개의 층이 있다.
정방향 전파를 구현하는 첫번째 단계는 z^[1] = W^[1]x + b^[1]이다. b^[1]은 무시하고 매개변수 W에 집중하자. 첫번째 은닉층은 3개의 히든 유닛이 있다. n^[1] = 3, n^[2] = 5이다. 마지막 입력층에 대해서 n^[0] = 2이다.
z, W, x의 차원을 생각해보자.
z는 첫번째 은닉층에 대한 활성화 벡터이다. 따라서 (3,1)행렬이고 3차원 벡터이다. 즉 (n^[1],1) 차원 벡터이다. 입력 특성 x는 두 가지 입력 특성이 있어서 이 경우에는 (2,1)행렬이다. 즉 (n^[0],1) 이다. 행렬 W^[1]은 (n^[0],1) 벡터를 곱했을 때 (n^[1],1) 벡터가 나오도록 하는 값이어야 한다. 이 경우에는 (3,2)행렬이다. 즉 (n^[1], n^[0]) 차원의 행렬이다.
- W^[l] : (n^[l], n^[l-1])
- b^[l] : (n^[l],1)
이 수식을 이용해 W와 b벡터가 올바른 차원을 가지는지 이중으로 확인해보자.
- dW^[l] : (n^[l], n^[l-1])
- db^[l] : (n^[l],1)
역전파를 구하는 경우에는 dW와 db의 차원을 확인해보자.
차원 확인이 필요한 또 다른 중요한 값들은 z. x, 그리고 a^[l]이다. z^[l] = g^[l](a^[l])이기 때문에 이런 종류의 네트워크에서 z와 a의 차원은 같아야 한다.
벡터화된 구현을 살펴보자.
벡터화된 구현에서도 W, b, dW, db의 차원은 같다. 그러나 z, a, x의 차원은 조금 달라진다.
z^[1] = W^[1]x + b^[1] 의 차원은 다음과 같다.
z^[1] | W^[1] | x | b^[1] |
(n^[1],1) | (n^[1],n^[0]) | (n^[0],1) | (n^[1],1) |
벡터화된 구현에서는 Z^[1] = W^[1]X + b^[1] 이다.
Z^[1]은 z^[1](1) z^[1](2) ... z^[1](m)을 합친 값이다. 따라서 (n^[1],m) 차원이다.
W^[1]의 차원은 (n^[1],n^[0])로 그대로이다.
X는 모든 학습 데이터가 수평으로 저장되어 (n^[0],m) 차원이다.
b^[1]의 차원은 파이썬 브로드캐스팅을 통해 (n^[1],m)이다.
Z^[1] | W^[1] | X | b^[1] |
(n^[1],m) | (n^[1],n^[0]) | (n^[0],m) | (n^[1],m) |
- z^[l], a^[l] : (n^[l],1)
- Z^[l], A^[l] : (n^[l],m)
- A^[0] = X : (n^[0],m)
- dZ^[l], dA^[l] : (n^[l],m)
4. 왜 심층 신경망이 더 많은 특징을 잡아 낼수 있을까요?
깊은 신경망이 잘 작동하는 이유
직관 1: 네트워크가 더 깊어 질 수록, 더 많은 특징을 잡아낼 수가 있다. 낮은 층에서는 간단한 특징을 찾아내고, 깊은 층에서는 탐지된 간단한 것들을 함께 모아 복잡한 특징을 찾아낼 수 있다.
심층망 계산이란 무엇일까? 얼굴 인식이나 감지같은 시스템을 구축할 때 심층 신경망을 다음과 같은 일을 한다.
예시 1) 얼굴 인식
얼굴 사진을 입력값으로 넣으면 신경망의 첫번째 층은 특성 탐지기나 모서리 탐지기가 될 수 있다. 이 예시에서 약 20개의 은닉층이 이미지를 어떻게 계산하는지 살펴보자. 20개의 은닉층은 이 작은 네모 상자로 시각화되었다. 각 칸은 특정 방향에서의 모서리를 알아내는 은닉 유닛을 나타낸다. 시각화 과정은 나중에 합성곱 신경망에서 더 자세히 다루겠다. 간단히 말하면 신경망의 첫번째 층에서 하는 것은 사진을 보고 모서리가 어디에 있는지 파악하는 것이다.
이제 모서리를 형성하기 위해 픽셀을 그룹화함으로써 사진에서 모서리가 어디에 있는지 알아보자. 그럼 감지된 모서리와 그룹화된 모서리를 받아서 얼굴의 일부를 형성할 수 있다. 예를 들어 어떤 뉴런에서는 눈을 찾을 수 있고 다른 뉴런에서는 코의 일부를 찾을 수 있다. 따라서 많은 모서리를 한데 모아서 얼굴의 일부를 감지할 수 있다. 그리고 서로 다른 얼굴의 일부를 최종적으로 모아서 서로 다른 종류의 얼굴을 감지할 수 있게 된다.
직관적으로 생각하면 신경망의 초기 층에서는 모서리와 같은 간단한 함수를 감지하고 그 이후의 신경망의 층에서 더 복잡한 함수를 학습할 수 있도록 한다. 이 시각화는 합성곱 신경망을 배울 때 더 이해가 될 것이다. 시각화의 기술적인 세부 사항을 하나 말하면 모서리 탐지기는 이미지에서 상대적으로 작은 영역을 본다. 얼굴 탐지기는 이미지의 더 넓은 영역을 볼 수 있게 된다.
예시 2) 음성 인식 시스템
음성 인식 시스템을 구축하는 것은 음성을 어떻게 시각화할 것인가에 관한 것이다. 음성을 입력으로 줄 때 신경망의 첫번째 층은 낮은 단계의 음성 파형 특징을 탐지한다. 낮은 단계의 파형을 구성하는 것은 소리의 기본 단위 탐지를 학습하는 과정이라고 할 수 있다. 언어학적으로는 음소라고 부른다. 예를 들어 cat같은 경우에 c, a, t 가 각각의 음소가 된다. 여러 개의 은닉층을 갖는 심층 신경망은 간단한 것들을 함께 모아 단어, 구, 문장 같은 더 복잡한 것들을 탐지하게 된다.
간단한 것부터 감지하고 복잡한 물체를 인식하는 과정은 사람의 뇌와 매우 비슷하다.
직관 2: 순환 이론에 따르면, 얕은 네트워크보다 깊은 네트워크에서 더 계산하기 쉬운 수학적인 함수가 있다.
순환 이론: 로직 게이트의 서로 다른 게이트에서 어떤 종류의 함수를 계산할 수 있을지에 관한 것
은닉층의 개수가 작지만 깊은 심층 신경망에서 계산할 수 있는 함수가 있다. 모든 입력 특성에 대한 배타적 논리합을 계산한다고 해보자. x1에서 xn까지이다. 네트워크의 깊이를 계산하면 O(logn)이 된다. 노드의 개수는 네트워크의 게이트 수와 같다.
하지만 오른쪽과같이 하나의 은닉층으로 함수를 계산하도록 한다면 은닉층은 기하급수적으로 커져야 한다. 왜냐하면 2^n의 가능한 구성을 모두 열거할 필요가 있기 때문이다. 1 또는 0으로 배타적 논리합이 나오는 입력 비트의 가능한 조합이다. 따라서 O(2^n)이다.
얕은 네트워크보다 깊은 네트워크에서 더 계산하기 쉬운 수학적인 함수가 있다.
5. 심층 신경망 네트워크 구성하기
적은 수의 층을 가진 네트워크가 있다. 하나의 층을 골라서 그 층에 집중해 계산해보자.
<정방향 전파> a^[l-1] → a^[l], W^[l]과 b^[l] 출력
층 L에 대해서 매개변수 W^[l]과 b^[l]이 있다. 정방향 전파에 대해서는 입력으로 이전 층의 활성값인 a^[l-1]을 주게 된다. 그럼 출력은 a^[l]이 된다. z^[l]은 W^[l]×a^[l-1]+b^[l]과 같다. a^[l] = g^[l](z^[l])이다. 역방향 전파를 위해 z^[l] 의 값을 저장하는 것이 유용하다.
<역방향 전파> da^[l] → da^[l-1], dW^[l]과 db^[l] 출력
입력으로 da^[l]을 받고 출력으로 da^[l-1]이 나온다. da^[l-1]과 경사 하강법 학습을 위한 그래디언트를 출력한다. 도함수 da^[l]을 주면 이전 층의 활성에 대한 도함수를 계산한다.
<신경망의 기본 계산>
입력 특성 a^[0]를 가져와서 집어넣는다. 이것이 첫번째 층의 활성 a^[1]을 계산한다. 이것을 위해 W^[1]과 b^[1]이 필요하다. 그리고 z^[1]을 캐시에 저장한다. 이 과정이 완료되면 이 값을 두번째 층에 집어넣고 W^[2]과 b^[2]를 사용해서 다음 층의 활성인 a^[2]을 계산한다. 이런 식으로 계속하고 최종적으로 a^[l] = ŷ 을 출력하게 된다. 이 과정에서 모든 층의 z값을 캐시에 저장한다. 역방향 단계에서는 이 반복을 역순으로 한다.
da^[l]을 집어넣고 da^[l-1]을 출력한다. 이런식으로 da^[2], da^[1], da^[0]을 계산한다.
그러나 이것은 입력 특성에 대응하는 도함수이고 지도 신경망의 가중치를 학습하는 것에는 유용하지 않다. 따라서 이 지점에서 멈춘다. 역전파과정의 첫번째 박스(맨 오른쪽 박스)에서 dW^[l]과 db^[l]을 출력한다. 이런식으로 계속 dW^[3], db^[3]를 출력, dW^[2], db^[2], dW^[1], db^[1]를 출력한다. 따라서 필요한 도함수는 모두 계산하게 된다. 나중에 살펴볼 dz^[l]도 박스 안에서 계산한다.
따라서 신경망의 하나의 학습 반복은 x값인 a^[0]으로 시작해서 정방향 전파를 따라서 y의 예측값을 계산하고 이 값으로 da^[l]을 계산하고 역전파를 거쳐 모든 도함수를 얻게 된다. 따라서 W^[l] = W^[l] - αW^[l] 로 업데이트 된다. b에 대해서도 마찬가지로 역전파를 계산해 모든 도함수 값을 알 수 있다.
캐시는 역방향 함수에 대한 z값을 저장하는 곳이라고 생각하는 것이 유용하다. 실제로 프로그래밍에서는 W^[1]과 b^[1]도 캐시에 저장한다. 따라서 매개변수의 값을 저장하고 나중에 있을 역전파 계산에서 필요한 곳에 복사해 사용하는 것이 유용하다.
6. 정방향전파와 역방향전파
<정방향 전파 구현하기>
입력 a^[l-1]과 출력 a^[l], 캐시된 z^[l]이 무엇을 하는지 기억해보자. 구현의 관점에서 보면 W^[l]과 b^[l]을 캐시하는 것이다.
네 번째 함수를 구현하는 방법은 z^[l] = W^[l]×a^[l-1]+b^[l] 이다. 그리고 a^[l]은 z^[l]에 활성화 함수를 적용시킨 것과 같다. 만약 벡터화 구현을 원한다면 W^[l]×A^[l-1]+b^[l]이고 A^[l]은 z^[l]에 적용된 g^[l] 이다.
정방향 박스의 체인에서 A^[0] = X를 넣어서 초기화시켰다. a^[0]는 한 번에 하나씩 할 경우의 학습 데이터에 대한 입력 특성이고 A^[0]는 전체 학습 세트를 진행할 때의 입력 특성이다. 따라서 체인에서 첫 번째 정방향 함수에 대한 입력값이다. 그리고 이 과정을 반복하는 것은 왼쪽에서 오른쪽으로 가는 정방향 전파를 계산할 수 있게 한다.
<역방향 전파 구현하기>
입력 da^[l]과 출력 da^[l-1], dW[l], db[l]이 있다. dz^[l]은 da^[l]에 g^[l]`을 z^[l]에 적용시킨 것에 요소별 곱셈을 한 값과 같다. 그리고 도함수 dW^[l]은 dz^[l]×a^[l-1]과 같다. 명시적으로 캐시에 저장하지 않았지만 이것 또한 해줘야 한다. 그럼 db^[l]은 dz^[l]과 같다. 마지막으로 da^[l-1]은 W^[l]의 전치에 dz^[l]을 곱한 것과 같다. da의 정의를 적용시키면 dz^[l] = W^[l+1]T * dz^[l+1] * g^[l]`(z^[l])과 같다. 따라서 역함수를 구현하는데 필요한 것은 이 네 가지 식이다. 오른쪽은 벡터화된 계산이다.
따라서 정리하자면 입력 X를 받고 ReLU를 활성화 함수로 갖는 첫 번째 층이 있고 두 번째 층에는 또 다른 ReLU 활성화 함수가 있다. 세 번째 층에는 시그모이드 활성화 함수를 사용할 수도 있다. 바이너리 분류를 하는 경우에 말이다. 이 출력은 y의 예측값이 되고 이를 통해 손실을 계산할 수 있다. 그럼 역으로 반복하는 과정을 시작할 수 있다.
도함수를 계산하는 역전파가 있다. dW^[3], db^[3]을 계산하고 dW^[2], db^[2]를 계산하고 dW^[1], db^[1]을 계산한다. 그리고 이것을 계산하는 과정에서 캐시에서 z^[1], z^[2], z^[3]를 옮긴다. 그리고 오른쪽 박스에서 뒤로 da^[2]를 전달하고 da^[1]을 전달한다. da^[0]를 계산할 수도 있지만 우리는 사용하지 않겠다.
<세부 사항>
정방향 반복은 입력 데이터 X로 초기화하고 역방향 반복은 da^[l]로 초기화한다. 로지스틱 회귀에서 바이너리 분류를 할 때 이 값은 -y/a+(1-y)/(1-a)와 같다. 따라서 출력, 즉 y의 예측값에 대응되는 손실 함수의 도함수는 이 값과 같다고 할 수 있다. 따라서 최종 층인 L에 대한 da를 사용해야 하는 식이다. 그리고 벡터화된 구현을 한다면 역방향 반복에 대한 초기화는 이것이 아닌 층 L에 대한 dA로 해야 한다. 첫 번째 학습 데이터에 관한 식으로 진행해서 m 번째 학습 데이터까지 반복하는게 벡터화된 버전을 구현하는 방법이다.
학습 알고리즘이 잘 작동함은 데이터에서 오기 때문에 몇 줄의 코드를 잘 알아두도록 하자!
7. 변수 vs 하이퍼파라미터
하이퍼파라미터
: 학습 알고리즘에 알려줘야 하는 것들. 궁극적으로 매개변수 W와 b를 통제하는 것들.
학습률, 반복의 횟수, 은닉층의 수, 은닉 유닛의 개수, 활성화 함수,...
어떤 값의 학습률을 사용해야 할지 확실하지 않다면 학습률 α에 하나의 값을 넣어 보고 비용함수 J가 이렇게 내려가는 것을 확인한다. 학습률 α에 더 큰 값을 시도해 보고 비용 함수가 올라가서 발산되는 것을 확인한다. α 값이 학습을 꽤 빠르게 하고 더 낮은 비용 함수 J로 수렴한다면 그 값을 사용한다.
새로운 애플리케이션을 시작할 때 하이퍼파라미터의 가장 적합한 값을 아는 것은 매우 어렵다. 따라서 다양한 값을 시도한다. 딥러닝을 적용하는 것은 매우 경험적인 과정이다.
8. 인간의 뇌와 어떤 연관이 있을까요?
시그모이드 활성화 함수를 가지는 로지스틱 회귀 유닛이 있다고 해보자. 오른쪽에 뇌에 있는 하나의 뉴런 그림이 있다. 뇌의 신경 세포인 이 뉴런은 다른 뉴런으로부터 전기적 신호를 받는다. 그리고 간단한 패치가 있는 계산을 하고 축색돌기를 통해서 다른 뉴런으로 전기 신호를 보낸다. 따라서 하나의 뉴런과 단일 로지스틱 유닛 사이에 아주 간단한 비유를 들 수 있다. 그러나 오늘날 신경 과학자들조차도 하나의 뉴런이 무엇을 하는지 거의 모른다. 인간의 뇌와 딥러닝의 학습 원리는 근본적으로 다를 수 있기 때문에 딥러닝 분야와 뇌의 비유는 점점 무너져가고 있다.
'Deep Learning > Basics' 카테고리의 다른 글
[Andrew Ng] 딥러닝 2단계 : 3. 최적화 문제 설정 (1) | 2024.01.25 |
---|---|
[Andrew Ng] 딥러닝 2단계 : 2. 신경망 네트워크의 정규화 (2) | 2024.01.25 |
[Andrew Ng] 딥러닝 1단계 : 4. 얕은 신경망 네트워크 -(2) (0) | 2024.01.20 |
[Andrew Ng] 딥러닝 1단계 : 4. 얕은 신경망 네트워크 -(1) (0) | 2024.01.17 |
[Andrew Ng] 딥러닝 2단계 : 1. 머신러닝 어플리케이션 설정하기 (0) | 2023.10.10 |