본문 바로가기

전체 글

(18)
기울기 앞 절의 편미분 에서는 x0 와 x1의 편미분을 따로따로 계산했다. 그럼 x0와 x1의 편미분을 동시에 계산하려면 어떻게 해야할까? ​ 가령 x0 = 3 , x1 = 4 일 때 (x0, x1) 양쪽의 편미분을 묶어서 계산한다고 생각해보자. 이때 $\left(\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial x_1}\right)$(∂f∂x0​​,∂f∂x1​​)​ 처럼모든 변수의 편미분을 벡터로 정리한 것을 기울기(gradient) 라고 한다. ​ 기울기는 예를 들어 다음과 같이 구현할 수 있다. ​ import numpy as np import matplotlib.pylab as plt from mpl_toolkits.mplot3d import Axe..
편미분 아래의 식을 한번 살펴보자. 우리가 평상시 보던 함수와는 무언가 구조가 다르다. 앞의 예와는 달리 변수가 2개라는 점이 다르다. ​ 이 식은 파이썬으로 다음과 같이 구현 할 수 있다. ​ def function(x): return x[0]**2 + x[1]**2 # 인수 x는 numpy배열이라고 가정. ​ 인수 x는 넘파이배열이라고 가정한다. 이 코드는 넘파이 배열의 각 원소를 제곱하고 그 합을 구할 뿐인 간단한 구현이다. ( np.sum(x**2) ) 로 구현 가능. ​ 이 함수를 그래프로 그려보면 다음과 같다. ​ ​ ​ 위의 식을 미분해보자. 여기서 우리가 배워왔던 미분과는 다른 점이 있다면, 변수가 2개라는 것이다. 그래서 “ 어느 변수에 대한 미분이냐 “, 즉 x0 와 x1중에 어느 변수에 대한..
수치 미분 ( numerical differentiation ) 우리가 마라톤 선수라고 가정하고, 10분에 2km씩 뛰었다고 가정해보자. 이때의 속도는 간단히 거리 = 속력 * 시간 이므로, ​ 2 / 10 = 0.2[km/분]이라고 계산 한다. 즉 1분에 0.2km만큼의 속도 (변화)로 뛰었다고 해석한다. ​ 이 마라톤 에서는 ‘달린 거리’가 ‘시간’에 대해서 얼마나 변화했는가를 계산 했다. ​ 다만 여기에서 10분에 2km를 뛰었다는 것은, 정확하게 10분 동안의 ‘평균 속도’를 계산한 것이다. ​ 미분은 “ 특정 순간의 변화량 “ 을 의미한다. 그래서 10분이라는 시간을 가능한 한 줄여 ( 직전 1분에 달린 거리, 직전 1초에 달린 거리, 직전 0.1초에 달린 거리, …. lim를 생각해보자.) ​ 한 순간의 변화량 ( 어느 순간의 속도 ) 를 얻는 것이다. ​..
왜 손실함수를 사용하는가? 그런데 왜 굳이 손실 함수를 사용해야 하는 걸까? ​ 예컨대 숫자 인식의 경우도 우리의 궁극적인 목표는 높은 “ 정확도 “ 를 끌어내는 매개변수 값을 찾는 것이다. ​ 그렇다면 “ 정확도 “ 라는 지표를 놔두고 “ 손실 함수의 값 “ 이라는 우회적인 방법을 택하는 이유는 뭘까? ​ 이 의문은 신경망 학습에서의 “ 미분 “ 의 역할에 주목한다면 해결 된다. ​ 신경망 학습에서는 최적의 매개변수 ( 가중치와 편향 ) 를 탐색할 때 손실 함수의 값을 가능한 한 작게 하는 매개변수 값을 찾게 된다. ​ 이때 매개변수의 미분 ( 기울기 ) 를 계산하고, 그 미분 값을 단서로 매개변수의 값을 서서히 갱신하는 과정을 반복한다. ​ 가령 가상의 신경망이 있다고 가정하고, 그 신경망의 어느 한 가중치 매개변수에 주목한다..
미니 배치 학습 기계학습 문제는 훈련 데이터를 사용해 학습한다. 더 구체적으로 말하면 훈련 데이터에 대한 손실 함수의 값을 구하고, 그 값을 최대한 줄여주는 매개변수를 찾아낸다. ​ 이렇게 하려면 모든 훈련 데이터에 대한 손실 함수를 구해야 한다. 극단적으로 훈련 데이터가 1억개라면, 손실함수의 연산을 1억번 해야한다는 것이다. ​ 지금까지는 데이터 하나에 대한 손실 함수만 생각해봤으니, 이제 훈련 데이터 모두에 대한 손실 함수의 합을 구하는 방법을 생각해보자. ​ 예를 들어 교차 엔트로피 오차는 아래의 식처럼 된다. ​ 이 때 데이터가 N개라면, t_nk 는 n 번째 데이터의 k번째 값을 의미한다. ( y_nk는 신경망의 출력, t_nk는 정답 레이블 이다). ​ 수식이 좀 복잡해 보이지만, 데이터 하나에 대한 손실 ..
교차 엔트로피 오차 ( Cross Entropy Error, CEE ) 손실 함수로서, 교차 엔트로피 오차 ( Cross Entropy Error , CEE ) 도 자주 이용한다. ​ cee의 식 Y는 신경망의 출력, T는 정답 레이블이다. ​ 또 T는 정답에 해당하는 인덱스의 원소만 1이고 나머지는 0이다( ONE-HOT ENCODING ) ​ 그래서 위의 식은 실질적으로 정답일 때의 추정(T가 1일 때의 Y)의 자연로그를 계산하는 식이 된다. ( 정답이 아닌 나머지 모두는 T가 0이므로, log와 연산이 되어도 결과에 영향을 주지 않는다.) ​ 즉, 교차 엔트로피 오차는 정답일 때의 출력이 전체 값을 정하게 된다. ​ 자연로그 y= logx 의 그래프 이 그림에서 보듯이 x가 1일때는 y는 0이 되고, x가 0에 가까워질수록 y의 값은 점점 작아진다. 위의 식도 마찬가지..
tensorflow CNN (합성곱) 에서의 conv2d tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME') 합성곱 연산은, 이름 그대로 합성곱 신경망에서 계층이 연결되는 가장 기본적인 방법이다. 텐서플로에서 기본 제공되는 conv2d()함수를 사용한다. 여기의 x는 입력 이미지 또는 네트워크를 따라 이전 합성곱 계층들에서 얻어진 아래층의 특징 맵 데이터이다. 이전에 설명한 것처럼 일반적인 CNN 모델에서는 합성곱 계층을 층층이 쌓아 올리는데 Feature map은 일반적으로 이들 각 계층의 출력을 칭하는 말이다. 각 계층의 출력을 필터와 몇몇 연산을 적용한 결과인 "처리된 이미지"로 생각하는 것도 한 방법이다. 여기서 필터는 합성곱 필터를 나타내는 네트워크의 학습된 가중치인 W로 매개변수화된다. conv2d의 매개..
손실 함수와 평균 제곱 오차 ( MSE ) 신경망 학습에서는 현재의 상태를 “ 하나의 지표 “로 표현한다. 그리고 그 지표를 가장 좋게 만들어주는 가중치 매개변수의 값을 탐색하는 것이다. ​ 신경망 학습에서 사용하는 지표는 “ 손실 함수 ( Loss function ) “ 라고 한다. 이 손실 함수는 임의의 함수를 사용할 수도 있지만, 일반적으로는 ​ 평균 제곱 오차와 교차 엔트로피 오차를 사용한다. ​ NOTE_ ​ 손실 함수는 신경망 성능의 ‘나쁨’을 나타내는 지표로, 현재의 신경망이 훈련 데이터를 얼마나 잘 처리하지 ‘못’히는를 나타낸다. ‘성능 나쁨’을 지표로 한다니 무언각 부자연스럽지만, 손실 함수에 마이너스만 곱하면 ‘얼마나 나쁘지 않나?‘, 즉 ‘ 얼마나 좋으냐’라는 지표로 바뀌게 된다. 성능의 ‘나쁨’과 성능의 ‘좋음’ 중 어느 쪽..