본문 바로가기

머신러닝, 딥러닝

(14)
3차원의 합성곱 연산 지금까지 2차원 형상을 다루는 합성곱 연산을 살펴봤다. 그러나 이미지만 해도 세로 * 가로 에 더해서 채널까지 고려한 3차원 데이터이다. ​ 이번 내용은 조금 전과 같은 순서로, 채널까지 고려한 3차원 데이터를 다루는 합성곱 연산에 대해 알아보자. ​ 위의 그림은 3차원 데이터의 합성곱 연산의 예이다. 2차원일 때와 비교하자면, 길이 방향 ( 채널 방향 ) 으로 특징 맵이 늘어났다. 채널쪽으로 특징 맵이 여러개 있다면, 입력 데이터와 필터의 합성곱 연산을 채널마다 수행하고, 그 결과를 더해서 하나의 출력을 얻는다. ​ 아래의 그림은 계산 순서이다. ​ ​ 3차원의 합성곱 연산에서 주의할 점은 입력 데이터의 채널 수와 필터의 채널 수가 같아야 한다는 것이다. 이 예에서는 모두 3개로 일치한다. 한편, 필터..
스트라이드, Stride 필터를 적용하는 위치의 간격을 “ 스트라이드 , stride “ 라고 한다. 우리말로는 보폭이라는 뜻이다. 지금까지 본 예는 모두 스트라이드가 1이었지만, 예를 들어 스트라이드를 2로 하면 필터를 적용하는 윈도우가 모두 두 칸씩 이동한다. ​ 크기가 ( 7 , 7 ) 인 입력데이터에 스트라이드를 2로 설정한 필터를 적용한다. 이처럼 스트라이드는 필터를 적용하는 간격을 지정한다. ​ 하지만, 스트라이드를 2로 하니 출력 데이터가 ( 4 , 4 ) 에서 ( 3 , 3 ) 으로 줄었다. ​ 이처럼 스트라이드를 키우면 출력 크기는 작아진다. 한편, 패딩을 크게 하면 출력 크기는 커진다. 이러한 관계는 수식으로 나타 낼 수 있다. ​ 입력 크기를 ( H, W ) , 필터 크기를 ( FH, FW ) , 출력 크기를..
패딩, Padding 합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값 ( 예컨대 0 ) 으로 채우기도 한다. 이를 “ 패딩 , Padding “ 이라고도 한다. ​ 합성곱 연산에서 자주 이용하는 기법이다. 예를 들어 아래의 그림과 같이 ( 4 , 4 ) 크기의 입력 데이터에 “ 폭이 1인 패딩 “ 을 적용한 모습이다. ​ ​ 폭 1짜리 패딩이라 하면 입력 데이터 사방 1픽셀을 특정값으로 채우는 것이다. ​ 패딩은 점선으로 표시되었고, 그 안의 값 ‘ 0 ‘ 은 생략되었다. ( 4 , 4 ) 인 입력 데이터가 패딩이 추가가 되어 ( 6 , 6 ) 이 되었다. ​ NOTE_ ​ 패딩은 주로 출력 크기를 조정할 목적으로 사용한다. 예를 들어 ( 4 , 4 ) 입력 데이터에 ( 3 , 3 ) 필터를 적용하면 출력은 ( 2 ..
합성곱 연산 합성곱 계층에서의 합성곱 연산을 처리한다. 합성곱 연산은 이미지 처리에서 말하는 필터 연산에 해당된다. 아래 예를 살펴보자. ​ 위의 그림과 같이 합성곱 연산은 입력 데이터에 필터를 적용한다. 이 예에서 입력 데이터는 세로 * 가로 방향의 형상을 가졌고, 필터 역시 세로 * 가로 방향의 차원을 가진다. ​ 데이터와 필터의 형상을 ( “높이, height “ , “ 너비 , width “ )로 표기하며 구한다. ( 이 계산을 단일 곱셈-누산, fused multiply-add, FMA 이라고 한다. ) 그리고 그 결과를 출력의 해당 장소에 저장한다. ​ 이 과정을 모든 장소에서 수행하면 합성곱 연산의 출력이 완성된다. ​ 맨 위의 그림이라면, 왼쪽 위 원소부터 오른쪽으로 스캔해가며, ​ 1*2 + 2*0 ..
기울기 앞 절의 편미분 에서는 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를 생각해보자.) ​ 한 순간의 변화량 ( 어느 순간의 속도 ) 를 얻는 것이다. ​..
왜 손실함수를 사용하는가? 그런데 왜 굳이 손실 함수를 사용해야 하는 걸까? ​ 예컨대 숫자 인식의 경우도 우리의 궁극적인 목표는 높은 “ 정확도 “ 를 끌어내는 매개변수 값을 찾는 것이다. ​ 그렇다면 “ 정확도 “ 라는 지표를 놔두고 “ 손실 함수의 값 “ 이라는 우회적인 방법을 택하는 이유는 뭘까? ​ 이 의문은 신경망 학습에서의 “ 미분 “ 의 역할에 주목한다면 해결 된다. ​ 신경망 학습에서는 최적의 매개변수 ( 가중치와 편향 ) 를 탐색할 때 손실 함수의 값을 가능한 한 작게 하는 매개변수 값을 찾게 된다. ​ 이때 매개변수의 미분 ( 기울기 ) 를 계산하고, 그 미분 값을 단서로 매개변수의 값을 서서히 갱신하는 과정을 반복한다. ​ 가령 가상의 신경망이 있다고 가정하고, 그 신경망의 어느 한 가중치 매개변수에 주목한다..