## Neural Network Overview (C1W3L01)

superscript [i]는 몇번째 layer인지를 말한다. superscript (i) 는 몇번째 데이터표본인지 말한다.

## Neural Network Representations (C1W3L02)

a 0 layer는 input layer이며 이는 총 layer 갯수를 말할때 포함시키지 않는다.

a 는 실제로 logistic regression연산( features 와 weight간의 product연산과 sigmoid나 tanh, ReLU 연산 )을 마친 계산 결과 값이다. superscript 숫자는 layer숫자를 나타낸다. 각 layer에 있는 w matrix를 보면 행갯수는 그 layer에서의 unit갯수이며 열갯수는 앞 단계 layer의 features갯수임에 유의한다.

## Computing Neural Network Output (C1W3L03)

위 그림에서 transpose 는 row vector를 column vector로 만들어 주기 위해 사용되었다.

## Vectorizing Across Multiple Examples (C1W3L04)

vectorization을 사용하기 전의 모습이다.

matrix로 만들어 정리할때 좌우로는 각각의 데이터표본에 대한 값을 가지게 하고 상하로는 node(unit)에 대한 값을 가지게 한다. 일정하게 규칙을 유지하는 것에 유의한다.

## Explanation For Vectorized Implementation (C1W3L05)

우선강의의 편의를 위해서 b가 없는 상태에서 개념을 확대해 나가는 방향으로 설명했다. b는 추가로 마지막에 더해주기만 하기 때문이다. 각각의 칼럼이 하나의 데이터표본에 대한 데이터이며 이것이 계속 유지되가는 점에 유의한다.

## Activation Functions (C1W3L06)

activation function으로 sigmoid 대신 다른 함수를 대부분이용한다. sigmoid는 마지막 outlayer에서만 쓰거나 binary classification을 해야하는 경우만 사용한다. 대부분 tanh나 ReLU를 사용한다. 가끔 leaky relu를 사용하기도 한다. relu, leaky relu가 sigmoid보다 learning 속도가 빠르다.

## Why Non-linear Activation Functions (C1W3L07)

nn에서 activation func 없다면 우측 하단처럼 linear 결과가 나온다. 여러번 layer를 거치더라도 linear 결과가 나오게 되는데 그렇다면 여러겹의 layer를 만드는 이유가 없어지게 된다.

## Derivatives Of Activation Functions (C1W3L08)

relu, leaky relu에서 z 값 0 은 0.00000 … 1 처럼 아주 작은 숫자로 생각하므로 그 점에서의 도함수 값은 1로 본다.

## Gradient Descent For Neural Networks (C1W3L09)

numpy.sum 에서 사용된 keepdims 옵션값을 true로 하면 명확한 사이즈의 matrix가 된다. 두번째 옵션은 axis이다.

## Backpropagation Intuition (C1W3L10)

derivative 참고자료 )

## Backpropagation Intuition (C1W3L10)

하단부분에 elementwise product임에 유의한다.

## Random Initialization (C1W3L11)

weight 값을을 다 0으로 하는 경우 계산이 진행되어도 계속 같은 값들을 가지게 된다. 그러므로 초기에 랜덤으로 작은 수의 초기값을 정해 주어야 한다. 초기값이 크면 아래그림에서 처럼 z값이 커지게 되고 그렇게 되면 sigmoid의 경우 기울기가 평평한 지점에서 값을 형성하게 된다. 그렇게 되면 z값이 크게 변경이 되더라도 sigmoid계산 값은 변화가 없으므로 최적값을 구하는 과정이 길어지게 된다. 아래 그림과 같이 0.01을 추천하고 있다.

64 * 64 크기의 이미지를 data로 하는 경우 data를 vector로 바꾸는 예시를 보여주고 있다. red 값들에 이어서 green 값들을 이어서 넣어주고 blue값들도 연결해서 하나의 긴 vector를 만들었다.

이강의는 각각의 고양이 사진들을 가지고 고양이가 있는 사진을 찾는 알고리즘을 만드는 것이 목적이다. 각각의 고양이 사진은 x vector가 되며 이들의 rgb data가 vector에 들어가게 된다. x.shape = (nx, m) 은 python에서 vector를 만드는 것을 보여준것이다.

n 은 features의 총갯수 (여기서는 rgb 값 총갯수)

m은 데이터 표본 갯수 (여기서는 고양이 사진 총갯수)

우상단의 알고리즘은 b를 x0로 생각한 경우이다. 결과적으로 좌측과 같은 내용이다. 다만 이 강의에서는 좌측 알고리즘을 이용한다.

## Logistic Regression Cost Function

loss function은 데이터 표본 하나에 대한 loss를 구한다.

cost function은 데이터 표본들 전체에 대한 총 loss를 구한다.

위그림에서 -log y hat , -log(1-y hat) 과 y 값을 비교하는데 y hat이라는데 주의한다. x가 아니고 y이다. 일반 log 함수 그래프가 아닌 log 함수를 y=x축에 대칭한 그래프라는 것에 유의한다.

위그림에서 하단의 알고리즘은 b를 x0가 아닌 따로 때어내서 생각하는 경우를 보여주고 있다.

## Derivatives With Computation Graphs

각각의 값들이 cost 함수에 최종적으로 어느 정도로 영향을 미치는지 계산하는 과정을 보여주고 있다.

dj/dv를 구하기 위해서는 v를 일단 0.001증가 했을때 최종적으로 J가 얼만큼 변화하는지 확인한다. 위의경우에 0.003만큼 증가했다. 즉 dj/dv는 3이 된다. 또 dj/da를 구하기 위해서는 우선 a가 0.001변화하는 동아 dv가 얼만큼 변화하는 지를 본다. 위의경우 0.001변화했다. 즉 dv/da는 1일된다. 그리고 chain rule 을 이용 dj/dv 와 dv/da의 곱을 통해서 dj/da를 구한다. 위의경우 3 * 1이 된다.

코딩할때의 팁으로 dj/da의 값을 저장하는 변수의 이름을 간단하게 da로 한다. 모든 경우 dj를 공통으로 들어가므로 생략하기로 한다.

적당한 w1, w2, b를 구함으로써 최종적으로 L 함수값을 최대한 낮추는 것이 개발자의 최종 목적이다. 그렇게 하기 위한 과정을 순서대로 아래에 보여준다.

우선 L함수에 대해 da를 구한다. a 값이 L에 미치는 정도를 구한다.

dJ/dz 를 구한다.

이번엔 dJ/dw1, dJ/dw2 등등을 구하고 이를 gradient descent에 이용한다.

## Vectorization

vector 연산을 이용한 방법 – 오른쪽

일반 for loop을 이용한 방법 – 왼쪽

vector를 이용한 방법이 훨씬 빠르다.

python을 이용한 두 가지 연산의 속도 비교

vector를 이용한 연산은 SIMD single instruction multiple data를 이용하기 때문에 속도가 빠르다.

또 vector는 병렬 처리가 가능하기 때문 빠르다.

## More Vectorization Examples

항상 vector연산으로 표현가능하다면 vector 연산을 최대한 사용해서 for loop 이용을 줄인다.

좌측과 우측의 내용은 같다. 우측은 다만 vector로 표현된것이다.

좌측과 우측 상단은 같은 내용이다. 우측 하단은 numpy에서 제공하는 유용한 method의 예시를 보여준것이다. 우선 라이브러리에서 유용하게 사용할 수 있는 vector 연산 method가 있는지 확인해 보는 것이 팁이다.

for loop으로 표현된 코드이다.

vector를 이용 하나의 for loop 를 없애는 과정이다.

## Vectorizing Logistic Regression (C1W2L13)

x superscript는 하나 하나의 데이터표본 이다. 이들을 X matrix로 만든다. w는 weight들을 모아논 vector이다. 이를 transpose해서 row vector로 만든다. 이들를 numpy의 dot 연산 한다. 그리고 b는 모든 elements에 더해지는 biased constant 이다. 이를 꼭 vector의 상태로 만들지 않고 그냥 더하기만 해도 numpy가 알아서 vector로 교환해서 각각의 elements에 더해준다.z 는 결과 vector이고 이를 sigmod 함수처리하면 결과는 a 로 이루어진 vector가 나오게 된다.

## Vectorizing Logistic Regression’s Gradient Computation (C1W2L14)

위 그림에서 a는 y hat 즉 계산된 예상 y값이다.

python에서 기본적으로 matrix, vector연산할때 행,렬의 갯수가 안 맞는 경우 스스로 크기를 맞추어서 연산 가능하게 해주는 기능을 broadcastin이라고 한다.

## A Note on Python/Numpy Vectors (C1W2L16)

python의 broadcasting 기능으로 때때로 bug발견하기 힘들때가 있다. 원래 사이즈가 달라서 연산이 불가능하면 에러가 나야 하지만 스스로 사이즈를 변경하므로 에러가 발생하기 않고 계속 진행된다. 이런경우 버그를 찾기 힘들다. 그래서 이런 문제를 줄이기 위한 팁을 알려준다.

(5, ) 와 같은 rank 1 array 를 사용하지 않는다. 명확하게 (5, 1) 형태이든 (1, 5) 이런 형태이든 벡터라도 명확하게 표기되게 사용한다. 중간 중간에 assert를 이용 사이즈를 확인한다. 진행중에 rank 1 array가 만들어 진다면 그림 하단 처럼 reshape를 이용 명확하게 바꾸어 준다.

## Explanation of Logistic Regression’s Cost Function (C1W2L18)

deep learning 전체 courses는 총 5개로 이루어져 있다.

ReLU 는 특정 부분에서는 0의 값을 가지고 나머지 부분은 시그모이드와 비슷한 부분을 가진다. 우측 하단의 그림은 하나의 뉴런 ( perceptron )을 보여준다.

여러개의 뉴런을 구성하는 모습을 보여주고 있다.

흔히 생각하기에 size, bedroom의 결과를 family size activation 으로 묶을 것으로 생각하지만 activiation에서는 전단계의 모든 뉴런으로 부터 데이터를 받는다.

위 그림은 각각의 neural network의 종류별 사용예시이다.

위그림은 왜 최근 deep learning이 비약적으로 발전할수 있었는지에 대한 설명이다.

데이터의 양과 발전관계를 보여주고 있다.

deep learning의 비약적 발전의 이유로 알고리즘의 개선, 데이터의 양, 하드웨어의 성능 개선을 들고 있다. ( 알고리즘 개선의 예로 sigmoid 대신에 ReNU를 사용하는 것을 들고 있다. )

위 그림은 course 1에 대한 개요이다.

Understanding LSTM Networks — colah’s blog

위 그림에서 말하는 polynomial linear regression은 실제 x의 2차 n차이므로 엄밀히 말하면 linear 가 아니지만 coefficient의 형태를 중점으로 보면 linear combination과 흡사하므로 그냥 polynomial linear regression이라고 부른다.

## Preprocessing

이 강의 예시에서는 하나의 x feature칼럼만 필요하고 하나의 실제값만 존재한다. 그리고 첫번째 칼럼은 의미가 없는 칼럼이므로 X matrix를 만들때 인덱스1을 사용했다. 다만 이때 칼럼 갯수가 하나이므로 결과가 벡터로 나오는 문제가 생겼다. 하단 그림 (10, ) 가 벡터라는 것을 보여준다.  모든 features는 matrix형태로 관리하는 것이 좋다. 그래서 약간의 수정 작업을 아래와 같이 한다.

이 강의에서는 linear regression과 polynomial linear regression과 비교하기 위해 두가 지 regression을 구현한다. preprocessing의 PolynomialFeatures class를 이용해 polynomial features를 추가로 만들어주낟. degree는 차수를 나타낸다. 그 결과 matrix를 poly_reg matrix에 저장한다. 이를 확인하면 1로 채워져 있는 첫번째 칼럼을 볼수 있는데 이는 constant이며 이는 feature가 하나인 simple linear regression과 달리 multiple regression에서는 필요하며 라이브러리 사용시에 요구된다.

하단의 코드는 각각 두개의 그래프를 그린다. 최하단은 polynomial regression을 보여준다. plt.plot() 안에 들어가는 X 와 수식을 주의한다.

정확히 이해하지 못했으므로 나중에 다시 확인 요망

PolynomialFeatures 의 degree를 4 로 증가하는 경우. 기존의 코드에서 단지 이부분만 수정한다. 차수를 4차까지 올려 조정하는 경우이다. 좀더 세밀한 알고리즘이 된다.

위의 그래프를 보면 선으로 딱딱하다. 그 이유는 그래프의 스텝이 x feature step 과 같은 1이기 때문이다. 좀더 부드러운 그래프를 얻기 위해 스텝을 0.1로 조정할수 있다.그 과정은 아래와 같다.