본문 바로가기

2019년 혁신성장 청년인재 집중양성(빅데이터)/[COURSERA] Machine Learning Stanford Uni

[week5] Neural Networks : Learning, Cost Function and Backpropagation

1.

 

1. 먼저 살펴볼 예로는 이진 분류다. 어떤 대상이 맞거나 아니거나 하는 분류로 모든 분류의 기본이 된다. 그렇기 때문에 아웃풋 레이어에서 단 하나의 유닛만을 가지며, 실제로 그 유닛이 참일 확률을 보여준다.

 

2. 멀티클래스 분류의 경우는 k개의 클래스(답)을 가지며, K개의 아웃풋을 가지게 된다. 즉 K개 차원의 벡터를 가지게 되며, 최대 우도법에 의해서 가장 큰 값을 가지는 위치의 값이 답이 된다.

 

 

 

1. 위의 식은 로지스틱 회귀를 통한 분류의 비용함수의 정규화 버전으로, 세타0에 대해서는 패널티(정규화)가 이루어지지 않기 때문에 1부터 끝가지 세타의 제곱값이 더해진다.

 

2. 신경망의 비용함수가 복잡해 보일 수 있다. 하지만 겁먹지마라, 딱 연산의 구조가 증가한 만큼 신경망의 비용함수도 그 구조가 변형되었을 뿐이다.  

 

3. L은 레이어의 수, Sl 레이어의 유닛 수이며, K는 아웃풋 레이어의 유닛/클래스의 수를 나타낸다.

 

4. 신경망의 결과물을 생각해 보면, 그 숫자가 많았다. 가설 H로부터의 결과는 K개의 차원을 가진 벡터가 되며, 각 벡터의 원소는 데이터 X가, 가설 H에 의해서 분류되는 값의 확률이었다. 

 

5. 신경망의 비용함수는 로지스틱 회귀에서 사용되었던 비용함수의 정규화와 비슷하다. 다만 아주 약간 복잡할 뿐이다.

 

6. 비용함수 앞 부분에서 sum이 두개로 늘었다는 것 볼 수 있다. 생각해보면 당연하다. 비용함수는 가설과 실제의 차이값을 모두 더해서 얼마나 빗나갔는지 보는 것이다. 신경망의 경우 각 클래스에 대해, 그 클래스와 맞을 확률을 보여주기 때문에,  하나의 관측치에 대해, 각 클래스에 대한 모든 오차를 더해야 하는 것이다.

 

7. 그러면 로지스틱 리그레션의 멀티클래스 분류의 비용함수와 신경망의 비용함수는 똑같다고 볼 수 있지 않나? 그런 것 같다.

 

8. 정규화 부분에서도 모든 세타의 제곱을 곱하기 위해서 모든 레이어의 세타의 각 원소에 제곱을 씌어 주기 위해서 3개의 sum이 필요하게 된다. 왜냐하면, 세타는 2차원의 행렬이고, 거기에 레이어에 따라 각각의 세타가 있기 때문이다. 하지만 비용함수의 경우에는 마지막 아웃풋에서의 결과만을 고려하고, K개의 클래스만을 고려하기 떄문에 2개의sum으로 충분한 것이다.

 

 

B. Backpropagation Algorithm

 

1. 비용함수를 왜 알아야 되냐? 비용함수가 최저인 곳이 우리가 찾는 가설이 있는 곳이기 때문이다. 그럼 그 최소값을 어떻게 찾냐? 경사하강법을 이용한다. 그럼 그 경사하강법을 어떻게 하냐? 비용함수를 편미분하여 알아낸다. 비용함수와, 비용함수의 편미분을 알고 있으면 세타의 갱신을 통해 가장 정확한 가설 h를 찾을 수 있다.

 

 

 

 

1. 백프로파게이션은 경사하강법을 하기위한 grad 공식을 찾기 위해 필요한 방법론이다. 

 

2. 경사하강을 하기 위해서는 비용함수에 대해 알고, 비용함수를 편미분 해줘야 하는데. 어떻게 편미분을 해줘야 할까?

그 방법이 백프로파게이션이다.

 

3. 포워드 프로파게이션을 수행한 후, 마지막 레이어의 유닛 값에서 실제 결과 값을 뺀 에러 값을 계산할 수 있다. 이때 마지막 레이어는 아웃풋 레이어 이며, 에러율은 딱 그 차이 만큼이 된다. 여기까지 참 쉽죠?

 

4. 그리고 여기서 부터 출발하여, 가중치를 다시 곱해주고, 활성함수를 미분하여 다시 곱해주면(?) 그 레이어의 에러율을 구할 수 있게 된다. 그냥 지금은 에러율을 인풋으로 해줬던 것을 거꾸로 돌아가면서 에러율을 산정한다고 생각하자. 이이상은 모르겠다.

 

5. 이때, 활성함수를 미분한 값은 element wise하게 곱해진다. .. 모르겟다 ㅋㅋㅋ

 

0. 비용함수를 최대한 간단히 해서, 2개의 입력값과, 정규화도 이루어지지 않았다고 생각해보자.

 

1. 우리가 이용했던 비용함수의 개념적인 측면에서 보자면, 레이어 하나가 넘어 갈 때의 에러율은 "변화율"이라 부를 수 있다. 

 

2. 그래서 끝에서 생성된 에러량을 에러율로 볼 수 있다. 이때, 비용함수 a, z에 의해 표현되고, 각 단계에서의 경사하강 확인하기 위해서 비용함수를 z로 미분하면, 각 z에서 얼마나 빠르게 에러율이 변하는 지를 알 수 있다(?)(이건 완전 내 생각)

 

3.결과적으로 보자. 마지막에 얻은 에러율은, 하나의 입력 값으로써, 이 입력값에 이 입력 값을 유발한 가중치들을 반대로 곱해 줌으로써, 각 단계의 에러율을 알아갈 수 있게 된다. 그 에러율을 바탕으로 각단계의 세타 값을 조정하면 우리는 조정된 새로운 에러율을 얻을 수 있게 된다. 

 

3. 포워드 프로파게이션의 반대나 다름 없다. 각각의 레이어의 에러값이 입력값이 되는 것일 뿐이다. a2가 a1에 세타값을 곱하고 시그모이드 값을 취했듯이, 에러 값에 곱했던 세타값을 다시 곱하고, 취했던 시그모이드를 미분하여 다시 곱함으로써, 값을 거슬로 올라갈 수 있게 된다.

 

4. 하 슈바 뭔가 이해가 갈듯 말듯 하다. 하나의 a값이 만들어 지기 위해서는 그 전단계의 모든 a 값과 세타 값이 필요하고, 그 단계의 에러율을 구하기 위해서는 ..

 

5. 기존의 선형회귀나 로지스틱 회귀의 비용함수의 경우는 바로 계산이 가능했다. 왜냐하면 단층레이어였기 때문에, 세타, 즉 가중치가 하나였기 때문에 normal equation으로도 가능했지만, 신경망에서는 그게 불가능하다. 왜냐하면 레알 진짜 연산할 것이 너무 많거든,그래서 여기서도 피쳐수가 많아지면 경사하강법을 쓴 것이었고..

 

애초에 피쳐수가 많기 때문에 사용하는 신경망에서는 논의 될 수 있는 것이 경사하강법밖에는 없다고 보는 것이 맞지...

그래서 경사하강법을 쓸려고 하니까, 여기에는 가중치가 2번 3번 적용되네? 그 전에는 비용함수를 미분하여 최솟값을 찾아갔던 것과 똑같다.

 

크게 보지말고, 딱 선형회귀에서 만큼만 생각하자, 결과와의 차이값을 아니까, 그 차이값이라는 비용함수를 미분하면 그 레이어에서의 기울기를 알 수 있는 것이지. 그래서 우리가 알고 있는 이 에러율 공식은 각 레이어의 노드와 세타값으로 이루어진 것이고, 그래서 반대로 이 에러값을 입력값으로 각단계에서의 에러값을 추산해 나갈 수 있게 된다.  마지막에 어긋난 값을 기준으로, 각 단계에서 얼마나 어긋나 있었는지에 대해서 알아갈 수 있는 마법의 공식...