본문 바로가기

AI/머신러닝(코세라)

[ML] #6 신경망(Neural Networks)

본 글은 학교 '머신러닝' 수업을 들으며 공부한 내용을, 저의 말로 바꿔서 남에게 설명해주듯이 쓰는 글입니다.
다시 한번 복습하는 과정에서 Coursera Andrew Ng 교수님의 강의를 일부 수강하였고, 인터넷 검색 등을 통해 내용을 보충하였습니다.
너무 쉬운 개념들은 따로 정리하지 않았습니다. 따라서 해당 글에는 적히지 않은 개념들이 일부 있을 수 있습니다.


본 글은 Andrew Ng 교수님의 'machine learning' 수업 강의 노트를 일부 사용하였습니다.
본 글에 사용된 강의노트 사진들 대부분의 저작권은 'DeepLearning.AI'에 귀속되어 있음을 밝히며,
본 글은 'DeepLearning.AI'의 'Copyright rights'에 따라 수익 창출을 하지 않고,
또한 해당 정책에 따라 '개인 공부 및 정보 전달'이라는 교육적 목적으로 글을 작성함을 밝힙니다.


 

Non-linear hypotheses

왼쪽과 같은 training set을 classify 하려면 non-linear boundary가 필요하고, 식은 우측과 같이 고차 다항식이 되어야 한다.

만약, 100개의 피쳐에 대해, 피쳐를 2개씩 묶으면 100C2 = 5000개의 새로운 피쳐가, 3개씩은 100C3 = 170000의 새로운 피쳐가 생긴다.

 

이건 좋지가 않다. 즉, 피쳐의 개수가 적으면 분류에 비선형 가설을 써도 될지 모르지만,

피쳐의 개수가 많아지면, 분류에 비선형 가설을 쓰는 건 효율이 좋지 않다.

 


 

Model representation 1

기본적으로, 뉴럴 넷은 저 구조를 쓴다. 

일단, 위 단어 정리를 잘 기억하자.

각 node들에 대해, x는 input이고 그 다음 layer로 output이 나간다.

최종 node의 output은 시그노이드 함수를 적용한 g(z) = h가 된다.

그리고, layer을 하나 늘리면 위와 같은 구조로 표현할 수 있겠다.

여기서 가운데에 껴있는 layer은 hidden layer(은닉층) 이라고 한다.

우리의 training set에는 포함되지 않는 녀석들이다.

이제, 이 구조를 식으로 나타내면 위와 같은데, 각 기호들의 의미는 맨 위를 참고하자.

저기서 왼쪽 위에 x0 node랑 a0 node가 추가되어야 함을 알고 있자.

 

(어떻게 보면 알고리즘에서 배운 devide and conquer 같기도)

 

각 기호의 의미를 기억하며 하나씩 따라가보면 이해가 잘 된다.

그리고, 다음 layer의 input이 되는 넘을 z로 치환하면, 오른쪽과 같이 z 행렬이 나온다.

 

 

이런 여러 layer의 구조를 쓰면, layer 2 ->3 으로 가는 input 계산에는 layer 1의 정보가 필요가 없어진다.

 

 

 

일반적으론 이렇게 여러 layer을 이룬다.

또한, 일반적으로는 input layer의 node 수부터 output layer의 node 수까지 갈수록 줄어드는, 좁아지는 구조가 된다.

위의 예시는 binary classification 이지만, multicalss classification 예시의 경우는 output layer의 노드 수가 그만큼 여러 개가 될 것이다.

 

이렇게 신경망에서 input layer -> output layer 까지 순서대로 이동하며 파라미터(가중치)를 곱해 계산하는 것을 forward propagation(순전파) 라 한다.

 


 

Examples and intuitions 1

신경망을 사용해 non-linear classification 을 계산하는 예시를 살펴보자.

 

AND 연산자의 경우, 가중치를 위와 같이 주면 되겠다.

 

그리고, OR 연산자는 위와 같다.

 

여기서 주목할 점은, 각 가중치는 냅두고 bias term만 -30 에서 -10 으로 추가했더니 AND 연산자가 OR 연산자가 됐다!!

bias term의 필요성은 저런 것이다.

 


 

Examples and intuitions 2

 

 

NOT 연산자는 위와 같이 구현된다.

위와 같은 복잡한 연산자는 위와 같이 구현된다.

 

그럼 이제, XNOR을 구현해볼까??

XNOR은 좀 복잡한 연산자다. NOR을 반대로 돌린 것. 

이는 아래와 같은 2개의 layer 구조로 구현된다.

기존에 만든 3개의 연산자를 연결해 XNOR을 구현했다.

결론은, 깊이가 더 깊어질 수록 복잡한 함수를 구현할 수 있다는 것.

 


 

Multi-class classification

 

위와 같이 output layer 개수를 늘리면 multiclass classification도 신경망으로 해결 가능하다.

 

첫 번째 output node는 h가 1 0 0 0으로, 보행자인지 아닌지 판별하는 넘이다.

 

여기서는 위와 같이 output node에 대해 1 or 0으로 구현됐지만, 

실제로는 98% 1% 0.5% 0.5% 이런 확률로 output이 나올 것이지만, 일단은 넘어가.