논문명: Network In Network 논문저자: Min Lin 외 2명 개요 본 논문의 전체적인 내용은 CNN(합성곱 신경망)의 단점과 그것의 보완점을 제시한다. 1. 논문에서 제시된 기존 CNN 구조의 문제점 본 논문에서 제시된 기존 CNN 구조의 문제점은 크게 2가지이다. 첫째 컨볼루션(convolution) 레이어에서는 기존의 입력값을 특징 맵으로 변환하는 과정을 거친다. ㄷ이때 기존의 CNN구조에서는 선형적으로 변환을 진행한다. 선형적으로만 변환을 진행하면 당연히 비선형적 연산에 비해 정확도가 떨어 질 수 밖에 없다. 따라서 본 논문에서는 이를 보완하기 위한 방법으로 다증퍼셉트론(MLP)를 도입했다. 구조는 다음과 같다. 위와 같은 구조를 통해 기존의 선형 연산이였던 것을 비선형 연산을 통해 정확도를 높인것을 본 논문에서는 MLPconvolutional Layer 라고 칭하며 이 Layer들이 쌓여있는 것이 NIN(Network in Network)구조이다. 둘째 마지막 출력 부분(또는 레이어)에서 완전연결 계층의 문제점이다. 가장 큰 문제는 CNN자체가 입체적인 데이터를 다루는데 이런식으로 연결되면 입체적인 INPUT과 거리감이 생긴다는 것이고 다음으로는 완전연결 계층 그 자체의 문제인 Overfitting 문제가 있다. 따라서 본 논문에서는 Global Average Pooling 이라는 레이어를 사용했다. 간략히 설명하면 마지막 출력부분에서 완전연결 계층을 대신해 각각의 Classification에 사용될 category를 특성맵으로 만들고 전부 평균을 내어 softmax함수에 집어 넣어 출력하는 방식으로 진행했다. 구조를 보면 다음과 같다. 위에 보다 싶이 완전연결계층이 아닌 각각의 특성 맵을 만들어 이를 softmax함수에 넣는 것을 볼 수 있다. 이를 통해 좀 더 입력값에 건장해지고 더해서 오버피팅을 방지할수 있다는 장점이 있다. 총 구조 총 구조는 다음...
1. 선형성을 띄지 않는 함수가 없는 다중층 레이어 신경망은 선형적으로 표현 가능하다는 것을 증명하시오. HINT: n개의 레이어의 경우를 두고 생각, f(x) = ax+b의 형태로 두고 생각 (개인 풀이) 1. f(x) = ax + b이다. 이때 n=2 즉 2개의 층으로 이루워졌다고 생각하면 f(f(x)) = a(ax+b)+b = a^2x+ab+b = a'x + b' (a'=a^2, b'= ab + b) 즉 값이 동일하지는 않지만 사실상 선형성을 띄는 식으로 표현이 가능하다. 이제 n일때의 경우를 보면 fn(x) = a*fn-1(x)+b가 된다. 즉 사실상 형태가 반복되는 동일한 상황이므로 증명된다. 2. 시그모이드함수를 미분하시오. HINT: sigmod = 1/(1+e^-x) (개인풀이) 2. 0*(1+e^-x) - 1*(-e^x) / (1+e^-x)^2 = e^x / (1+e^-x)^2 3. 많은 층을 사용할 경우 시그모이드함수에서 기울기 소실이 일어나는 이유는? (개인풀이) 3. 기울기 소실의 경우 시그모이드 함수의 특징 중 하나이다. 시그모이드 함수의 경우 일반적인 시그모이드 함수 시그모이드 함수의 미분 형태 위에 그래프에서 보이듯이 시그모이드 함수는 수렴한다. 값이 극단적으로 커져감에 따라 수렴하는데 가중치를 변경하는 방법에서 가중치를 미분한 값을 곱하는 형식에서 미분한 값이 점점 작아질 수 밖에 없다는 단점을 가지고 이것이 바로 기울기 소실이다. 3.2 하이퍼볼라탄젠트함수와 시그모이드 함수의 관계가 scaled,shifted 형태이고 위의 기울기 소실에서 하이퍼볼라탄젠트 함수가 더 유리한 이유를 설명하시오 (개인풀이) 3.2 기본적인 하이퍼볼라 탄젠트 함수 미분형태의 하이퍼볼라 탄젠트 함수 위에 보다싶이 하이퍼볼라 탄젠트 함수는 수렴하지 않으므로 기울기 소실이 덜하다 하지만 극단적인 값으로 가면 0으로 수렴하기 때문에 기울기 소실에서 자유로울 수는 없다...
손실함수는 쉽게 말해 판단지표이다. 신경망의 학습에는 목표가 있어야 하는데 이는 손실함수를 줄이는 방향으로 진행된다. 손실 함수는 따로 정해진 함수는 없지만 보통은 오차제곱합과 교차엔트로피 오차로 이뤄져 있다. 1. 오차제곱합 오차제곱합의 수식은 다음과 같다. Yt는 출력값 Tk는 정답값 k는 데이터 차원의 수이다. 즉 실제 값에서 정답을 빼고 제곱해 합하는 단순한 산수이다. 그럼 파이썬으로는 다음과 같이 구현된다. import numpy as np def sum_sq (dap , gap): return 0.5 *np.sum((gap-dap)** 2 ) t = [ 0 , 0 , 1 , 0 ] k1 = [ 0.2 , 0.1 , 0.6 , 0.1 ] k2 = [ 0.4 , 0.4 , 0.1 , 0.1 ] print (sum_sq(np.array(t) , np.array(k1))) print (sum_sq(np.array(t) , np.array(k2))) 수식에 대한 설명은 생략한다, 다만 sum_sq 함수에 입력시 np.array형태로 변환 후 대입하지 않으면 일반적인 lsit 형태로 인식되어 오류가 나니 주의해야 한다. 위의 코드에서 t는 원하는 답 즉 [2]위치에 있는 것을 답으로 원한다. k1, k2는 출력값의 예시이다. k1은 [2]를 0.6으로 가장 높게 출력했고 k2는 [0]과[1]을 가장 높게 출력했다. 그리고 이를 대입해 실행시키면 k1의 경우 Loss가 약 0.11 k2의 경우 0.57로 이를 통해 k1이 더욱 정확하다는 것이 판단 가능하다. 2. 교차 엔트로피 오차 다른 손실함수로는 교차엔트로피 오차가 있다. 수식은 다음과 같다. 이때 Tk는 one-hot인코딩이며 정답에 해당된다. 즉 이 수식을 해석하면 정답에 해당되는 출력만을 이용해 판단한다는 뜻이다. 파이썬 함수로 구현하면 다음과 같다. import numpy as np def sum_sq (dap , ga...
댓글
댓글 쓰기