[CS230] C1M3 Neural Networks and Deep Learning
[ Shallow Neural Network ]
- 신경망의 은닉층을 설정하는 법
- 변수 초기화
- 정방향으로 예측값 계산.
- 역전파에서 사용하는 경사 하강법에서 도함수를 계산하는 것
Neural Networks Overview
(지난시간:로지스틱 회귀)
- 특성 x와 변수 w와 b를 입력하여 z 를 계산
- z는 a라고도 불렀던 y hat을 계산하는데 쓰임. 마지막으로 손실함수 L을 계산
(신경망)
신경망은 여러개의 시그모이드 유닛을 쌓아서 만든다.
표기법: [1] vs X^(i)
[1]: 신경망의 layer
X^(i) : i번째 훈련 샘플
<차이점>
로지스틱 : Z계산 > a계산 > L계산 (z와a를 한번 계산)
신경망: Z계산 > a계산 > .....(Z계산 > a계산 반복).....> L계산 (z와a를 여러번 계산)
로지스틱 회귀에서는 도함수를 구하기 위해 역방향 계산 da dz를 계산
신경망에서도 da dz를 계산하고 그 값을 이용하여 dw^[2] db^[2]를 게산
Neural Network Representation
- 은닉층이 하나인 신경망(2층 신경망)
- 신경망 층을 셀 때 입력층은 세지 않음 . 입력층 은닉층 출력층(예측값인 y hat의 계산을 책임짐)을 2층 신경망이라 부름
- 입력층 은닉층 출력층
훈련세트는 입력층X와 출력층Y로 구성. 은닉층은 훈련 세트에서 보이지 않음
(전에는 입력 특성을 나태내기 위해 벡터X를 썼었다. 입력값의 다른 표기법은 a^[0]. a는 활성값을 의미하고 신경망의 층들이 다음 층으로 전달해주는 값을 의미. 입력층은 X(=a^[0])를 은닉층으로 전달해줌. a^[0]는 입력층의 활성값)
그 다음 층인 은닉층은 활성값 a^[1]을 만듦. a^[1]은 4차원 벡터. 출력층은 실수값 a^[2]를 만듦. y hat = a^[2] (로지스틱에서는 y=a로 표기했었다. 신경망에서는 어떤 층에서 만들어진 건지 알려주는 차원에서 y hat = a^[N]로 씀)
w[1] = (4,3) (은닉노드의 수가 4개, 입력 특성이 3개)
b[1] = (4,1)
w[2] = (1,4) (은닉노드의 수가 1개, 입력 특성이 4개)
b[2] = (1,1)
- 은닉 노드의 갯수 = 차원의 갯수
Computing a Neural Network's Output(훈련 샘플 하나일 때 신경망에서 예측값 계산)
각각의 원 안에서 위의 두 단계를 거침
신경망의 출력값을 계산하는데 아래 네 줄로 완성 가능.
- 한 입력 특성 벡터가 주어졌을 때 코드4줄로 신경망의 출력값 계산. 로지스틱 회귀에서처럼 여기서도 여러개의 출력값에 대한 벡터화 하려면 훈련 샘플을 행렬의 열로 쌓아 변형하면 로지스틱 처럼 한번에 한 샘플이 아닌 모든 훈련 세트에 대해 출력값 계산 가능.
Vectorizing across multiple examples(다수의 훈련샘플 벡터화하기)
- 훈련샘플을 행렬의 열로 쌓아서 이전 강의 4가지 공식을 조금만 바꾸기
X: 훈련샘플을 열로 쌓은 행렬
x>X, z>Z, a>A 대문자로 바뀜
행렬 Z와 A에서 - 가로: 샘플, 세로: 유닛
첫번째 샘플 첫번째 유닛, 두번째 샘플 첫번째 유닛 ...
첫번째 샘플 두번째 유닛, 두번째 샘플 두번째 유닛...
첫번째 샘플 세번째 유닛, ...
행렬 X에서 - 가로: 샘플, 세로: 입력층 노드
Explanation for Vectorized Implementation
입력값을 열로 쌓으면 결과도 열로 쌓은 값이 나온다.
Z^[1] A^[1] Z^[2] A^[2] : 신경망의 두 층은 같은 것을 계산하고 있다. 더 깊은 신경망을 봐도 이 두 단계를 반복할 뿐.
Activation functions(지금까지 시그모이드 함수 썼는데 다른 거 써보겠다)
신경망 만들 때 은닉층과 출력층에서 어떤 활성화 함수 쓸지 결정해야 한다
은닉층에서는 시그모이드 보다 tanh(z)함수가 대부분 결과가 좋음. 교수님은 시그모이드 안씀 (tanh는 값이 -1과 1 사이이기에 평균값이 0에 더 가까움. 학습 알고리즘을 훈련할 때 평균값의 중심을 0으로 할 때가 있음)
출력층에서 시그모이드 쓰는 한가지 예외 - 이진분류. y가 0이나 1이라면 -1과 1 보다 0과 1이 사이로 출력하는 것이 더 좋음
시그모이드, tanh의 단점: z가 크거나 작으면 함수의 기울기가 0에 가까워져(=함수의 도함수가 작아진다) 경사하강법이 느려질 수 있다.
머신러닝에서 인기있는 함수는 ReLU. z가 양수일 때 도함수는 1, z가 음수일 때 도함수는 0.(엄밀하게 말하면 z가 0일 때 도함수는 정의되지 않겠지만 컴퓨터에서 구현하면 z가 정확히 0이 될 확률은 적어서 걱정하지 않아도 됨. z가 0일 때 도함수는 1이나 0이라고 해도 잘 동작. 미분 불가능해도 괜찮다)
이진분류의 출력층에서는 시그모이드.
다른 경우는 ReLU가 활성화 함수의 기본값으로 많이 사용됨
ReLU의 단점: z가 음수일 때 도함수가 0. 그래서 leacky ReLU라는 게 있는데 z가 음수일 때 도함수 0 대신 약간의 기울기가 있음.(실제로는 많이 쓰이지 않지만 ReLU보다 좋은 결과 냄)
ReLU, leacky ReLU 의 장점: 대부분의 z에 대해 기울기가 0과 매우 다르다. 시그모이드나 tahn보다 ReLU쓰면 신경망 더 빠르게 학습 가능. 학습을 느리게 하는 원인인 기울기가 0에 가까워 지는 것을 막아주기 때문. (음수일 때 ReLU의 기울기가 0이지만 실제로는 0보다 커서 잘 동작함)
- 내가 바꿀 수 있는 것: 은닉층의 수, 활성화 함수, 가중치의 초기화
- 어떤 활성화 함수가 좋을지 모르겠다면 모두 시도해본 뒤 검증 개발 세트에 시도해보고 결과를 살펴보기
Why do you need non-linear activation functions?(왜 신경망이 비선형 활성화 함수를 필요로 할까)
은닉층에서는 선형 함수를 거의 쓰지 않는다. 선형 함수를 쓰면 신경망이 입력의 선형식만 출력하게 됨. 후에 심층 신경망 다룰 때 층이 많더라도 은닉층을 계산할 수 없음.
선형함수는 유일하게 회귀문제에서만 쓰임. (집값 예측과 같은 y가 실수일 때. 0과 1이 아닌 그 이상의 값일 때)
선형 활성화 함수를 쓸 수 있는 곳은 출력층.
Derivatives of activation functions
경사하강법을 다루기 위해, 신경망의 역방향 전파를 구현하려면 각 활성화 함수의 도함수(기울기)를 구해야 한다.
공식:
- 시그모이드
- g(z)=1+e−z1
- g′(z)=dzdg(z)=g(z)(1−g(z))
- Tanh
- g(z)=ez+e−zez−e−z
- g′(z)=1−(g(z))^2
- ReLU
- g(z)=max(0,z)
- g′(z)=0 (z < 0인 경우)
- g′(z)=1 (z >= 0인 경우)
- Leaky ReLU
- g(z)=max(0.01z,z)
- g′(z)=0.01 (z < 0인 경우)
- g′(z)=1 (z >= 0인 경우)
Gradient descent for Neural Networks 경사하강법 구현법
(여기 동영상 더 보기~~~)- 경사하강법 정방향 4개의 식
- 경사하강법 역방향 6개의 식
Backpropagation intuition (optional)
역전파 계산 유도
Random Initialization신경망의 가중치 초기화
로지스틱 회귀의 경우 모두 0으로 초기화해도 괜찮다. 신경망에서 모두 0으로 초기화하고 경사하강법 사용할 경우 올바르게 작동하지 않음.
w값을 0으로 초기화할 경우 은닉이 모두 같은 함수를 계산하는 것이 됨. 그리고 역전파에서도 dz1 과 dz2가 같은 결과를 가지게 됨. 두 은닉 유닛이 같은 값으로 초기화 되기에 가중치의 결과값이 항상 같다. 유닛이 같게 되는 것을 '완전 대칭'이라고 한다. 완전히 같은 함수를 계산한 다는 것. 출력에 같은 영향 주므로 첫번째 반복 이후 계속 같게 반복됨. 이 경우 같은 값을 계산하므로 은닉 유닛이 1개라고도 할 수 있음.
- 가중치의 초기값을 매우 작은 수로 정하기
초기값이 매우 크다면 z값이 커져 시그모이드/tahn 활성함수가 매우 큰 값을 갖게 되므로 학습의 속도가 느려진다.