etc/구글 머신러닝 부트캠프

[DSL] Neural Networks and Deep Learning Week 4 : Deep Neural Network

uyt8989 2022. 6. 30. 13:56

미션 1의 마지막 주차. 정말 새로운 내용은 없었고 지금까지 한 내용의 확장 + 정리하는 느낌이었다. 아직 코딩이랑 퀴즈는 안 해서 걔네는 잘 모르겠다.

 

우선은 notation부터 정리하자. 이전이랑 거의 똑같기 때문에 이제는 좀 익숙해진 것 같다. 이전과 다른 점이라면 Layer가 깊어지면서 L이라는 변수가 생겼고, Activation Function을 g로 표현했다 정도? 

앞으로 벡터가 막 여러 개 나오면 각 벡터마다 차원이 헷갈린다. 그래서 우선 각 변수들의 shape을 확실히 하고 가는 게 좋을 것 같다. Train Set의 크기를 m이라고 생각하자. 그리고 gradient로 만들어도 shape은 변하지 않는다.  b는 열 벡터이지만 계산 시에 브로드 캐스팅된다.

이쯤에서 왜 굳이 레이어를 깊게 쌓아야 하나 싶은 의문이 들었다. 레이어를 깊게 쌓아서 가중치를 여러 개 만드는 것이 목표라면 그냥 단순히 레이어 하나를 크게 만들어도 될 것 같았기 때문이다. 이에 대한 이유가 바로 다음 강의에 등장했다. 단순히 레이어 하나만 했을 경우엔 레이어가 너무 커지기 때문이라고 설명됐다. 그래도 뭔가 시원하지 않아서 구글링을 했다. stackexchange 글을 읽고 깊이와 넓이는 뉘앙스가 조금 다르다고 이해했다. 한 번에 여러 속성을 처리해야 하면 레이어가 넓어지는 거지만, 강의에서 예시로 드는 얼굴 인식 알고리즘처럼 조금씩 쌓아 올려나가는 문제 해결 방법엔 깊이가 중요하다고 느꼈다. 그리고 이걸 결정하는 것에는 정답이 없는 것 같았다. 잠깐만 생각해봐도 어떤 문제에 딥러닝을 적용하느냐에 따라 천차만별로 달라질 텐데 어떻게 공식을 세우나 싶더라.

 

How to choose the number of hidden layers and nodes in a feedforward neural network?

Is there a standard and accepted method for selecting the number of layers, and the number of nodes in each layer, in a feed-forward neural network? I'm interested in automated ways of building neu...

stats.stackexchange.com

 

그리고 이전에 했던 Forward propagation이랑 Back propagation 과정을 여러 레이어로 확장했다. 이 과정에서 Week 3에서 의문으로 남기고 넘겼던 dZ 부분을 해결할 수 있었다. 우선, 각 propagation을 그림으로 그리면 다음과 같다. 여기서는 그냥 단순히 흐름을 파악하는 게 목적이라서 Train Set은 1개라고 보면 될 것 같다. 입력이 들어가면 Forward propagtion을 통해 y를 추정하고 Cost Function을 계산한다. 그리고 Back propagtion으로 각 레이어의 가중치를 갱신한다. Forward propagtion 과정 안에서 효율성을 위해 캐싱도 한다.

학습이 어떻게 이뤄지는지 대략 파악했으니 이제 각 변수들을 계산해야 한다. 우선은 Forward progation부터. 지금까지 해왔던 방법이랑 똑같이 하면된다. 대신 이제 Activation function이 g라는 점. ReLU일 수도 있고, Leaky ReLU일 수도 있고, 심지어는 Sigmoid일 수도 있다. 그리고 b는 브로드 캐스팅된다는 것을 기억하자.

다음은 Back propagation. Week 3 포스팅에서는 dZ가 이해가 안된다고 적어뒀었다. 강의를 들으면서 내가 이해가 안 됐던 건 dZ가 아니라 dA 부분이라는 것을 깨달았다. 저놈의 dA가 왜 저렇게 도출되는지 영문을 몰랐다. 

 

추가)

가중치를 모두 0으로 초기화하는 경우에 어떤 문제가 발생하는지 조금 더 구체적으로 이해할 수 있었다. 우선, 어떤 데이터가 들어와도 결과값이 0이다. 그럼 Back propagation 과정에서 모든 gradient도 0이 된다. 따라서 아무리 학습을 진행시켜도 모든 매개 변수들이 초기값에서 변하지 않는

그래도 이제는 추가 읽기 자료를 읽고 이해했다. 까먹으면 다시 읽기 자료를 읽자. 설명이 미친 듯이 잘 되어있다. 아무튼 이 방법을 통해서 가중치를 갱신한다. 한번 학습할 때 레이어를 앞뒤로 이동하는 건 어쩔 수 없이 for문을 사용해야 한다.

마지막으로 하이퍼 파라미터에 대해 배웠다. 여러가지 Learning rate, Number of Hidden Layers, Number of Nodes in Hidden Layer 등의 여러 하이퍼 파라미터가 있고 이 하이퍼 파라미터들이 W, b 등의 파라미터를 결정한다. 그리고 하이퍼 파라미터는 보통 해보면서 찾는다고 한다. 언젠가 하이퍼 파라미터 튜닝하는 방법이 증명될지는 모르겠지만, 만약 그런 방법이 생긴다면 그 사람은 진짜 유명해질 것 같다.

 

추가)

이제 퀴즈랑 과제도 마쳐서 첫번째 강의는 끝났다. 이름이 Neural Networks and Deep Learning인 강의답게 Neural Network가 어떻게 작동하고, Deep Learning이 뭔지에 대해 배울 수 있었다. 한 4~5일 만에 Forward propagtion, Back propagation 등의 머신 러닝 개념을 뼛속까지 새겨서 마스터한다는 것은 불가능이라고 생각한다.  하지만 그래도 이게 뭔지에 대해 감이라도 잡을 수 있는 시간이었다. 비록 코딩 과제가 거의 스크래치에 가깝긴지만, 코딩 과제를 하면서 실제로 모델을 구현한다는 것이 어떤 건지 알게 됐다. 예전에 C++로 짠 FFM 코드를 본 적 있는데, 그때는 진짜 뭔지 하나도 몰랐었다. 그래도 이젠 뭐가 뭔지는 알 수 있을 듯?

 

확실히 유명하신 분이라 머신 러닝 무식자도 강의를 이해하는 게 어렵지 않았다. 아쉬운 점이라면 수학 부분을 깊게 다루지 않고 그냥 슥슥 넘어간다는 점이다. 언젠가 부족한 설명이 옵션으로 제공되거나 이후에 설명을 해주시긴 하지만, 중간중간 그냥 찝찝하게 넘어가야 했다. 실제로도 수학 부분이 중요하지 않아서 그런 건지, 아니면 그냥 설명하기에는 너무 양이 방대해서 그런 건지는 모르겠다. 그래서 머신 러닝 수학 부분은 따로 보충해놓을 필요를 느껴서 스터디도 참여하기로 했다. 방학이 알차긴 하겠네.

 

* Courera의 Deep Learning Sepcialization 강의를 수강하는데 도움이 되고자 작성한 요약문입니다. 틀린 내용 있다면 정정해주시면 감사하겠습니다.