일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그리디
- RESNET
- 선형대수
- 알고리즘
- rnn
- LSTM
- 계수정렬
- 퀵정렬
- 재귀함수
- DFS
- 정렬
- 최단 경로
- AI
- 선택정렬
- BFS
- 인공지능
- 다이나믹 프로그래밍
- 스택
- 이진 탐색
- 캐치카페신촌점 #캐치카페 #카페대관 #대학생 #진학사 #취준생
- 딥러닝
- GRU
- Machine Learning
- 삽입정렬
- 머신러닝
- 큐
- pytorch
- Today
- Total
hyeonzzz's Tech Blog
[Andrew Ng] 딥러닝 1단계 : 4. 얕은 신경망 네트워크 -(1) 본문
1. 신경망 네트워크 개요
신경망을 어떻게 구현하는지에 대한 개요
지난시간에는 로지스틱 회귀를 다뤘다. 왼쪽 위 모델은 오른쪽 위 계산 그래프와 일치한다. 특성 x와 변수 w, b를 입력하면 z를 계산한다. z는 ŷ = a를 계산하는데 쓰이고 마지막으로 손실 함수인 L을 계산할 수 있다.
신경망은 sigmoid 유닛을 쌓아서 만들 수 있고 오른쪽 아래처럼 생겼다. 왼쪽 위 모델에서 노드는 z를 계산하고 a를 계산하는 두 단계로 이루어져 있다. 왼쪽 아래 신경망에서 첫번째 노드들은 z와 a를 계산하고, 두번째 노드들은 또 다른 z와 a를 계산한다. 앞으로 사용할 표기법은 다음과 같다. 첫번째 노드에서 특성 x와 변수 W와 b를 입력하면 z^[1]을 계산한다. ( x^[i]는 i번째 레이어를 뜻하고 x^(i)는 i번째 훈련 샘플을 뜻한다. ) 로지스틱 회귀와 비슷하게 z^[1]을 계산한 뒤 a^[1] = σ(z^[1])을 계산한다. 그 후에 다른 선형 식을 사용하여 z^[2]를 계산하고 신경망의 최종 출력값인 a^[2] = ŷ을 계산한다.
로지스틱 회귀에선 z와 a를 계산했지만, 신경망에선 z와 a를 여러 번 계산한다. 그리고 마지막으로 손실을 계산한다. 로지스틱 회귀에서는 도함수 계산을 위해 역방향 계산을 했었다. da와 dz를 계산했다. 신경망에서도 마찬가지로 역방향 계산을 한다. da^[2]와 dz^[2]를 계산하고 그 값을 가지고 dW^[2]와 db^[2]를 계산한다. 그러면 빨간 화살표로 표시되는 역방향 계산이 된다. 신경망은 로지스틱 회귀를 두 번 반복해주는 것 뿐이다.
2. 신경망 네트워크의 구성 알아보기
신경망 그림들이 무엇을 의미하는지 설명해보겠다. 위 그림은 은닉층이 하나인 신경망이다.
입력 특성 x_1, x_2, x_3가 세로로 쌓여있는 건 신경망의 입력 층이라고 부른다. 가운데는 은닉층이라고 부르고 마지막 층은 출력층이라고 부른다. 출력층은 예측 값인 ŷ을 계산한다. 지도 학습으로 훈련시키는 신경망에선 훈련 세트가 입력값 X와 출력값 Y로 이루어져 있다. 은닉층의 실제 값은 훈련 세트에 기록되어 있지 않다. 입력값과 출력값은 알 수 있지만 은닉층의 값들은 알 수 없다.
입력값은 a^[0] = X로 표기할 수 있다. a는 활성값을 의미하고 신경망의 층들이 다음 층으로 전달해주는 값을 의미한다. 입력층은 X를 은닉층으로 전달해주고 a^[0]은 입력층의 활성값이라고 부른다.
은닉층은 활성값 a^[1]을 만든다. 은닉층의 첫번째 노드는 a_1^[1]을 만들고 두번째 노드는 a_2^[1]을 만든다. 따라서 a^[1]는 4차원 벡터가 된다. 파이썬에서는 (1,4)행렬 혹은 열 벡터라고 할 수 있다. 4차원인 이유는 은닉층에 은닉 노드가 4개 있기 때문이다.
출력층은 실숫값 ŷ = a^[2]를 만든다. 로지스틱 회귀에서 ŷ = a를 가지는 것과 비슷하다. 로지스틱 회귀에선 출력층 하나만 있어서 대괄호 위첨자를 쓰지 않았지만 신경망에서는 위첨자를 사용해 어떤 층에서 만들어진건지 표기해준다.
신경망의 층을 셀 때 입력층은 세지 않기 때문에 위 신경망은 2층 신경망이다. 따라서 은닉층이 첫번째 층이고 출력층이 두번째 층이다. 표기할때는 입력층은 0번째 층이라고 한다. 은닉층과 출력층은 연관된 매개변수가 있는데 은닉층은 매개변수 w^[1]과 b^[1]에 관련되어있고 w는 (4,3)행렬, b는 (4,1)벡터가 된다. 4는 이 층에 은닉 노드가 4개 있기 때문이고 3은 입력 특성이 3개이기 때문이다. 출력층도 w^[2]와 b^[2]에 관련되어 있고 차원은 (1,4)와 (1,1)이 된다. (1,4)는 은닉층에 은닉 노드가 4개 있고 출력층에 노드가 1개 있기 때문이다.
3. 신경망 네트워크 출력의 계산
신경망이 정확히 어떻게 출력값을 계산하는지 알아보자. 로지스틱 회귀와 비슷하지만 여러 번 반복된다.
왼쪽 큰 원은 로지스틱 회귀를 나타내고 두 단계의 계산을 한다.
1. z = w^Tx + b
2. a = σ(z)
신경망에서는 이걸 여러번 반복한다.
은닉층의 노드 하나를 집중해서 보면 로지스틱 회귀와 비슷하게 이 노드는 두 단계의 계산을 한다. a_i^[l]에서 대괄호안의 l은 층 번호이고 i는 층 안의 노드 번호이다. 따라서 표시된 노드는 1번 층의 1번 노드이므로 i와 l모두 1이 된다. 신경망의 노드인 원은 두 계산을 의미한다. 은닉층의 두번째 노드를 보면 1번 층의 2번 노드이므로 i는 2, l은 1이 된다.
T는 전치를 의미한다. 신경망을 for문을 써서 구현하면 굉장히 비효율적이므로 네 등식을 벡터화한다. 벡터 w 4개를 쌓으면 (4,3) 행렬을 얻는다. 이 행렬을 입력 특성 x_1, x_2, x_3과 곱하면 오른쪽 파란식을 얻게 된다. 여기에 b_1, b_2, b_3, b_4로 이루어진 b를 더하면 오른쪽 벡터와 같다. 벡터의 각 행은 위에서 계산한 네 값과 정확히 일치한다. 따라서 이 값은 z_1^[1], z_2^[1], z_3^[1], z_4^[1]와 같다. z를 열 벡터로 쌓은 이 벡터를 z^[1]이라고 부른다. 한 층에 노드가 여러 개이면 세로로 쌓는다는 것이다. w를 쌓아 만든 (4,3)행렬은 W^[1]이라고 부른다. (4,1) 벡터는 b^[1]이라고 부른다.
마지막으로 해야 할 일은 a를 계산하는 것이다. a_1^[1]부터 a_4^[1]까지 쌓은 벡터를 a^[1]로 정의하겠다. 이 값은 σ(z^[1])이 된다. 이 sigmoid 함수는 z^[1]의 각 원소들의 sigmoid 값을 계산하는 함수이다. z^[1]은 W^[1]에 x를 곱하고 b^[1]을 더해준 것이고 a^[1]은 σ(z^[1])이 된다.
신경망의 첫 층에서는 x가 주어졌을 때 z^[1]은 W^[1]x + b^[1]이고 a^[1]은 σ(z^[1])이 된다. z의 차원은 (4,3) 행렬과 (3,1) 벡터를 곱하고 (4,1)벡터를 더해 (4,1)이고 a는 z와 같은 (4,1) 벡터이다. x는 a^[0]이고 ŷ은 a^[2]라는 걸 기억하자! 따라서 x를 a^[0]으로 바꿀 수 있다.
다음 층에 대한 표현도 비슷하다. 출력층에서는 매개변수 w^[2]와 b^[2]가 있고 각각 (1,4)행렬, (1,1)행렬이다. 따라서 z^[2]는 (1,1)행렬 즉 실수가 된다. (1,4)행렬과 (4,1)행렬을 곱한 뒤 (1,1)행렬을 더해줬다. 결과는 실수가 된다.
마지막으로 출력 유닛을 로지스틱 회귀와 비슷하게 생각하면 w는 W^[2]T와 비슷하고 b는 b^[2]와 비슷하다. 왼쪽 부분을 가리고 무시한다면 마지막 출력 유닛은 로지스틱 회귀와 굉장히 흡사하다. w와 b 대신 (1,4)차원 W^[2]와 (1,1)차원 b^[2]를 쓰는 것만 빼면...
로지스틱 회귀를 복습해보면 예측값 즉 출력을 계산하려면
1. z = w^T + b
2. ŷ = a = σ(z)
를 계산했다. 은닉층이 하나인 신경망에서는 출력값을 계산하기 위해 오른쪽 네 등식을 구현하면 된다. 출력값을 계산하는 벡터화된 구현이라고 생각할 수 있다. 위의 2개 등식에서 은닉층의 네 로지스틱 회귀 유닛의 출력값 계산을 하고 아래 2개 등식에서 출력층의 로지스틱 회귀를 한다.
따라서 이 신경망의 출력값을 계산하는 데엔 오른쪽 코드 4줄만 필요하다.
4. 많은 샘플에 대한 벡터화
다수의 훈련 샘플에 대해 벡터화하는 법을 알아보겠다
훈련 샘플을 행렬의 열로 쌓아서 지난 영상의 등식을 조금 바꾸면 신경망의 모든 샘플에 대한 출력값을 거의 동시에 계산할 수 있다.
오른쪽 위 4개 등식은 입력 특성 벡터인 x가 주어졌을 때 한 훈련 샘플에 대해 ŷ= a^[2]를 계산해준다. 훈련 샘플이 m개 있다면 첫 훈련 샘플인 x^(1)에 적용하여 예측값 ŷ^(1) = a^[2](1)을 계산하고 x^(m)까지 적용해서 ŷ^(m) = a^[2](m)까지 계산한다. a^[2](i)에서 i는 i번째 훈련 샘플을 의미하고 2는 두번째 층을 의미한다. 벡터화를 이용하지 않는다면 for문으로 공식을 구현해준다. 훈련 샘플과 관련있는 모든 등식에 (i)를 붙여주면 된다.
벡터화를 이용하여 for문을 대체할 수 있다.
X는 훈련 샘플을 열로 쌓은 행렬이라는 것을 기억하자! 훈련 샘플을 열로 쌓으면 n_x * m 행렬이 된다. for 문을 벡터화하려면 오른쪽 빨간색 박스를 계산하면 된다. 비교해본다면 벡터였던 소문자 x를 열로 쌓아 행렬인 대문자 X를 얻었다. z에도 같은 작업을 한다면 열 벡터인 z^[1](1), z^[1](2)부터 z^[1](m)까지 m개를 열로 쌓는다면 행렬 Z^[1]이 된다. a도 같은 작업을 하면 행렬 A^[1]이 된다. 같은 작업으로 Z^[2]와 A^[2]도 얻을 수 있다. 행렬의 가로는 훈련 샘플(훈련 샘플의 번호)에 대응된다. 세로는 신경망의 노드들(은닉 유닛의 번호)이 된다.
가로 - 다른 훈련 샘플
세로 - 다른 은닉 유닛
5. 벡터화 구현에 대한 설명
우리가 썼던 등식이 왜 여러 훈련 샘플에 대한 정확한 벡터화인지 이유를 알아보자
정방향 전파 계산을 살펴보자. 첫 훈련 샘플에 대해 Z^[1](1) = W^[1]x^(1) + b^[1]을 계산하고 두번째 세번째 훈련샘플도 Z를 각각 계산한다. b는 무시한다. W^[1]행렬에 x^(1)을 곱하면 열 벡터가 된다. x^(2), x^(3)과의 곱도 마찬가지로 열 벡터...
훈련 샘플을 모두 쌓아 만든 훈련 세트인 X를 살펴보면 X는 x^(1), x^(2), x^(3)을 모두 가로로 쌓아 만든 것이다. 행렬 X와 W를 곱하면 첫 열은 보라색 열과, 두번째 열은 초록색 열과, 세번째 열은 노랑색 열과 같다. 이 값은 z^[1](1), z^[1](2), z^[1](3)이 열 벡터로 표기된 것과 같고 행렬 Z^[1]이 된다. 훈련 샘플이 더 많다면 열이 더 많아진다. 파이썬 브로드캐스팅을 통해 b를 더하면 값은 여전히 정확하다.
이 슬라이드에서는 Z^[1] = W^[1]X + b^[1]이 전 슬라이드의 4단계중 첫 단계에 맞는 식이라는 걸 보여줬다. 비슷한 논리를 통해 다른 식도 구할 수 있다.
한 번에 하나의 훈련 샘플에 대해 정방향 전파를 한다면 i가 1부터 m까지 for문을 실행해야 한다. 훈련 샘플을 열로 쌓아서 오른쪽 아래의 코드는 모든 m 훈련 샘플에 대해 벡터화하게 해준다. X는 A^[0]과 같다. 따라서 첫번째 식은 W^[1]A^[0] + b^[1]이라고 쓸 수 있고 위 두개 식은 아래 두개 식과 매우 비슷하다. 이것은 신경망의 두 층은 대략 같은 것을 계산하고 있다는 것을 보여준다. 더 깊은 신경망은 이 두 단계를 더 많이 반복하는 것 뿐이다.
6. 활성화 함수
은닉층과 출력층에서 어떤 활성화 함수를 쓸지 골라야 한다.
지금까지는 시그모이드 함수를 썼다.
활성화 함수
: 신경망에 비선형성을 도입하여 복잡한 패턴과 데이터 구조를 학습할 수 있게 함
역할
1. 비선형성 도입
:활성화 함수는 신경망에 비선형성을 추가합니다. 이는 복잡한 문제를 해결하는 데 필수적입니다. 선형 함수만 사용하면 신경망이 선형 변환만 할 수 있어, 선형 회귀와 같은 단순한 모델이 됩니다. 비선형 활성화 함수를 사용함으로써 신경망은 다양한 패턴과 복잡한 데이터 구조를 학습할 수 있습니다.
2. 출력값 조정
:활성화 함수는 뉴런의 출력을 특정 범위로 조정합니다. 예를 들어, 시그모이드 함수는 출력을 0과 1 사이로 제한하고, 하이퍼볼릭 탄젠트 함수는 출력을 -1과 1 사이로 제한합니다. 이는 출력값을 해석하기 쉽게 만들어 주며, 특히 이진 분류와 같은 문제에서 유용합니다.
3. 기울기 소멸 문제 방지
:일부 활성화 함수는 기울기 소멸 문제를 완화하는 데 도움을 줍니다. 예를 들어, ReLU(Rectified Linear Unit) 함수는 음수 값을 0으로, 양수 값을 그대로 두어 기울기 소멸 문제를 줄여줍니다. 이는 심층 신경망의 학습을 촉진합니다.
- sigmoid
ŷ은 0 ~ 1사이로 출력하는게 좋기 때문에 출력층에서 주로 쓴다
이진 분류를 할때 주로 쓰인다.
- tanh
거의 항상 sigmoid보다 성능이 좋다.
값이 +1 ~ -1이기 때문에 평균값이 0에 더 가깝기 때문이다. sigmoid대신 tanh를 쓴다면 데이터의 중심을 0.5에서 0으로 만드는 효과가 있다. 따라서 다음 층의 학습을 더 쉽게 해준다
위의 예에서 보듯이 은닉층에선 tanh 활성화 함수를 쓰고 출력층에선 sigmid 함수를 쓴다. 다른 층엔 다른 활성화 함수가 쓰일 수 있다. 여기서 g^[1]와 g^[2]는 다르다.
- sigmoid와 tanh의 단점
z가 굉장히 크거나 작으면 함수의 도함수가 굉장히 작아진다는 것이다. 경사하강법이 느려질 수 있다
- ReLU
z가 0일때의 도함수는 정의되지 않았지만 z가 정확히 0이 될 확률은 굉장히 낮기 때문에 걱정하지 않아도 된다. 따라서 z가 0일때 도함수가 1이나 0이라고 가정해도 잘 작동한다.
단점은 z가 음수일 때 도함수가 0이라는 것이다.
- 활성화 함수 선택 팁
이진 분류의 출력층 - sigmoid 함수
다른경우 - 주로 ReLU 함수
은닉층에 어떤 함수를 써야 할지 모르겠다면 그냥 ReLU 쓰는게 좋다! 가끔 tanh도 쓰인다
- leaky ReLU
z가 음수일 때 도함수가 0인 대신 약간의 기울기를 준다
실제로는 많이 쓰이지 않지만 ReLU보다 좋은 결과를 보여준다
- ReLU와 leaky ReLU의 장점
대부분의 z에 대해 기울기가 0과 매우 다르다. 따라서 다른 활성화 함수보다 훨씬 더 빠르게 학습할 수 있다.(학습을 느리게 하는 원인인 기울기가 0에 가까워지는 걸 막아주기 때문)
<정리>
sigmoid | 이진 분류의 출력층에서만 쓰기 |
tanh | sigmoid보다 대부분 성능이 좋다 |
ReLU | 가장 많이 쓰이는 활성화 함수 |
leaky ReLU | 0.01말고 계수 바꿀 수 있다 |
'Deep Learning > Basics' 카테고리의 다른 글
[Andrew Ng] 딥러닝 1단계 : 5. 심층 신경망 네트워크 (1) | 2024.01.24 |
---|---|
[Andrew Ng] 딥러닝 1단계 : 4. 얕은 신경망 네트워크 -(2) (0) | 2024.01.20 |
[Andrew Ng] 딥러닝 2단계 : 1. 머신러닝 어플리케이션 설정하기 (0) | 2023.10.10 |
[Andrew Ng] 딥러닝 1단계 : 3. 파이썬과 벡터화 (0) | 2023.09.19 |
[Andrew Ng] 딥러닝 1단계 : 2. 신경망과 로지스틱회귀 (2) (0) | 2023.09.12 |