cs230_lec3_C1W3
Updated:
(From : deeplearningai https://www.youtube.com/watch?time_continue=386&v=AwQHqWyHRpU)
Neural Network(신경망)
- Notaiton $X_1^[1]$
- Superscript : (1) 번째 데이터를 의미, [1] 번째 층을 의미
- Subscript : 같은 층의 1번째 node를 의미
- node들이 여러개 쌓여 있는 것
- 순방향으로 진행하여 Cost function을 구하게 되고 역방향으로 경사값을 구하면서 가충치를 수정하게 된다.
- 구조
- Input layer : Input data가 들어가는 부분
- Hidden Layer : 내부 입력, 출력이 관찰이 안되는 부분, w b 파라미터들과 관련있음
- Output layer : Output이 나오는 node
-
각 node의 연산 구조
ex) 2 layer 구조에서
Vectorization
ex) 2 layer 구조에서 각 데이터에 대해서 앞에서 배운 과정을 해 주어야 함
For i to m 정리하자면 가로로(Horizontally하게)는 데이터 개수, 세로로(Vertically하게)는 데이터의 차원을 넣는다.
- 가로축으로는 연산이 병렬적으로 진행되기 때문(다른 가로축이랑 합쳐지지 않음)
Activation Function (활성화 함수)
- sigmoid 말고 딴것도 쓸수 있음
- $a=tanh(z)$ : Sigmoid
- 범위가 0,1 사이라 출력층으로 많이 쓰임
- z 값이 너무 작거나 너무 크면 함수의 기울기가 0에 가까워져서 경사하강법이 너무 느리게 작동할 수 있다.
- $a=tanh(z)$ : Hyperbolic Tangent
- 거의 항상 sigmoid보다 좋음
- 범위가 -1, 1 사이에 있어서 평균값이 0에 더 가까워서 데이터의 중심을 0으로 맞춰주는 효과가 있음
- z 값이 너무 작거나 너무 크면 함수의 기울기가 0에 가까워져서 경사하강법이 너무 느리게 작동할 수 있다.
- $a=max(0,z)$ Relu
- 양수일때는 도함수가 1 음수일때는 0이라 경사하강법 계산이 빠름
- z=0일때 연속이 아니지만 딱 0이 나올 일은 거의 없기 때문에 문제가 발생하지 않음
- 활성화 함수의 기본값으로 많이 쓰임
- 단점은 z가 음수일 때 기울기가 0이라는 것
- 충분한 은닉 유닛의 z은 0보다 크기 때문에 잘 작동함
- 이를 보완하는 leaky relu 가 있다.
- $a=max(0.01z,z)$ Leaky Relu
- Relu의 단점을 보완한 활성화 함수
- Relu와 큰 차이를 보이진 않지만 성능이 좋다.
- $a=tanh(z)$ : Sigmoid
- 비선형 함수가 들어가는 이유는 선형 함수를 아무리 결합 해도 선형함수이기 때문이다(node가 하나인 Standard linear regression과 같음)
- 선형 activation 함수는 regression의 output으로만 보통 이용한다.
Gradient descent (경사하강법)
- Forward propagation(정방향 전파)
- $z^{[1]}=W^{[1]}x+b^{[1]}$
- $a^{[1]}=g(z^{[1]})$
- $z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}$
- $a^{[2]}=g(z^{[2]})$
- Back propagaton (역전파)
- $dz^{[2]}=A^{[2]}-Y$ (Sigmoid 함수일때)
- $dw^{[2]}=\frac{1}{m}dz^{[2]}A^{[1]T}$
- $db^{[2]}=\frac{1}{m}np.sum(dz^{[2]},axis=1,keepdims=True)$
- axis=1은 가로로 더하라는 말
- keepdims 는 (n,)행렬을 (n,1) 행렬로 출력시키는 명령어
- $dz^{[1]}=w^{[2]T}dz^{[2]}*g’^{[1]}(z^[1]) \quad by \quad (n^{[1]},m)$
- *은 성분곱(elementwise product)를 의미
- $dw^{[1]}=\frac{1}{m}dz^{[1]}X^{T}$
- $db^{[1]}=\frac{1}{m}np.sum(dz^{[1]},axis=1,keepdims=True)$
- Vectorization 다음과 같이 실시
- m으로 나누어주는 이유는 그림과 같이 손실함수를 $\frac{1}{m}$배 하기 때문
Random Initialization (변수 초기화)
- 변수를 모두 0으로 초기화 하면 경사하강법이 작동 x
- 그러면 모든 node가 대칭이기 때문, 같은 열마다 같은 값으로 나옴.
- ex)
- $W^{[1]}=np.random.randn((2,2))*0.01$
- Q : 0.01과 같이 작은 값을 곱해주는 이유?
- A : 가중치가 너무 크면 sigmoid, tanh를 할 때 경사하강법이 너무 느리게 작용하게 되기 때문
- Deep 한 neural network에는 0.01말고 다른 값들도 적용 가능. 다음 시간(C1W4)에서 배울 것!
- $b^{[1]}=np.zero((2,1))$
- 얘는 대칭성 문제가 없어서 0으로 초기화 해줘도 된다.
- $W^{[1]}=np.random.randn((2,2))*0.01$
Leave a comment