7. Convolutional Neural Networks
7.1. From Fully Connected Layers to Convolutions
1.
합성곱의 핵심은 입력의 특정 부분(패치)에 필터를 적용하는 것이다. 커널의 크기가 Δ = 0이라는 것은, 커널이 단일 픽셀에만 적용된다는 의미이다. 즉, 각 입력 위치에서 다중 뉴런(채널별로 다르게)을 적용해 출력을 계산하는데, 이 과정이 MLP의 원리와 동일하다. 이를 수식으로 설명하면: 𝑦 𝑖 = 𝑊 𝑖 𝑥 𝑖 + 𝑏 𝑖
각 𝑖 에 대해 독립적으로 연산이 이루어지므로, 이것은 MLP가 각각의 입력 채널에 대해 독립적으로 적용되는 경우와 같다.
이 방식은 Network in Network (NiN) 구조와 연결된다. NiN은 1x1 합성곱을 통해 각 위치에 대해 독립적으로 MLP를 적용하여 채널별로 정보를 학습한다.
2.
1) Audio 에서 Locality를 적용하는 이유는 짧은 시간 동안의 패텅을 포착하기 위해서이다. Translation invariance 는 음성의 위치가 바뀌어도 같은 패턴을 인식할 수 있게 한다. 예를 들어, 동일한 음이 오디오 시퀀스의 어느 위치에 있든 감지할 수 있도록 한다.
2) Audio data는 시간에 따른 진폭 또는 주파수 변화를 기록한 1차원 시퀀스이다. 따라서 1D 합성곱을 사용하여 패턴을 학습할 수 있다.
3) Spectrogram은 Audio 신호의 시간-주파수 표현으로, 시각적으로 분석할 수 있는 2차원 이미지와 같다. CNN을 사용하여 이 2D 데이터를 분석하는 방식으로 오디오 패턴을 감지할 수 있다.
3.
Translation invariance는 패턴의 위치와 관계없이 동일한 패턴으로 인식한다는 것을 의미한다. 하지만 어떤 경우에는 패턴의 위치가 중요할 수 있다. 예를 들어 이미지에서 객체가 특정 위치에 있어야만 유효한 경우나 자연어 처리에서 단어 순서가 중요한 경우에는 이동 불변성이 적합하지 않다. 또한 얼굴인식에서도 눈, 코, 입의 상대적인 위치가 중요하다. 위치 정보가 손실되면 잘못된 인식이 발생할 수 있다.
4.
텍스트데이터에서 CNN을 사용하는 것은 가능하다. 특히 단어의 지역적인 관계를 포착하는 데 유리하다. CNN은 1D 합성곱을 통해 텍스트 내에서 특정 패턴을 학습할 수 있다. 하지만 텍스트는 순차적인 특성이 강하기 때문에 문맥을 포착하는 데 어려움이 있을 수 있다. 이 문제를 해결하기 위해서는 RNN이나 Transformer 같은 모델이 더 적합할 수 있다.
5.
이미지의 경계에 객체가 있을 때, 필터의 일부는 이미지 외부를 참조하려 할 수 있다. 이 문제를 해결하기 위해 Padding 이 사용된다. 패딩이 없을 경우, 경계에 있는 정보는 손실되거나 부분적인 정보만 필터에 의해 학습될 수 있다
6.
합성곱의 대칭성. 합성곱의 정의에 따라 변수를 바꾸면 두 식이 동일하므로 합성곱은 대칭적이다.
7.2. Convolutions for Images
!pip install d2l
import torch
from torch import nn
from d2l import torch as d2l
def corr2d(X, K):
"""Compute 2D cross-correLation."""
h, w = K.shape
Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i:i + h, j:j + w]*K).sum()
return Y
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
corr2d(X, K)
class Conv2D(nn.Module):
def __init__(self, kernel_size):
super().__init__()
self.weight = nn.Parameter(torch.rand(kernel_size))
self.bias = nn.Parameter(torch.zeros(1))
def forward(self, x):
return corr2d(x, self.weight) + self.bias
X = torch.ones((6, 8))
X[:, 2:6] = 0
X
K = torch.tensor([[1.0, -1.0]])
Y = corr2d(X, K)
Y
corr2d(X.t(), K)
conv2d = nn.LazyConv2d(1, kernel_size=(1, 2), bias=False)
X = X.reshape((1, 1, 6, 8))
Y = Y.reshape((1, 1, 6, 7))
lr = 3e-2 # Learning rate
for i in range(10):
Y_hat = conv2d(X)
l = (Y_hat - Y) ** 2
conv2d.zero_grad()
l.sum().backward()
# Update the kernel
conv2d.weight.data[:] -= lr * conv2d.weight.grad
if (i+1) % 2 ==0:
print(f'epoch {i+1}, loss {l.sum():.3f}')
conv2d.weight.data.reshape((1, 2))
1.
X: Diagonal edges를 가진 이미지
1) K=[1.0,−1.0] 적용 => 각 인접한 두 픽셀 간의 차이
대각선 방향의 엣지를 감지할 것이고, 각 행의 인접한 픽셀들 간의 차이를 계산하여 엣지의 위치를 탐지할 것이다.
2) X를 전치했을 때도 X와 같은 모습일 것이기 때문에 동일한 결과를 얻을 수 있다.
3) K는 1차원 이므로 전치가 적용되지 않는다.
2.
1) 엣지 검출 커널. V = (v1, v2)와 직교하는 방향으로 엣지를 검출하기 위한 커널은
K = [[v1, v2], [-v1, -v2]] 이다
2) Second derivative을 위한 finite difference operator 유도. Finite difference operator는 이미지에서 곡률을 감지한다. 라플라시안(Laplacian) 필터는 2차 미준 연산자를 구현한 커널로, 가장 많이 사용되는 예시이다.
라플라시안 커널의 예시: K = [[0, 1, 0], [1, -4, 1], [0, 1, 0]]
이 커널은 이미지의 곡선이나 모서리 구조에서 가장 강하게 반응하며, 특히 곡률이 높은 영역에서 값이 크게 변한다. 최소 크기는 3*3으로 설정할 수 있다.
3) Blur Kernel 은 이미지의 세부 정보를 제거하거나 부드럽게 만들기 위해 사용된다. Gaussian Blur Kernel 이 가장 널리 사용되는 예이다. 가우시안 커널은 픽셀 값들이 주변 값들로 평균화되는 방식으로 이미지를 부드럽게 만든다.
예시: K = [[1, 2, 1], [2, 4, 2], [1, 2, 1]]
이 커널을 사용하면 픽셀 값들이 주변 값들과 혼합되어 이미지의 노이즈를 줄일 수 있다. 블러 커널은 이미지를 부드럽게 만들어 중요한 정보가 더 잘 보이도록 하거나, 이미지 전처리 과정에서 사용된다.
4) 도함수의 차수 d에 따라 필요한 커널의 크기가 결정된다. 일반적으로 d차 도함수를 계산하기 위해서는 최소 (d+1)^2 크기의 커널이 필요하다.
3.
그래디언트를 계산할 때 발생하는 문제는 역전파 중 입력 크기 불일치, Conv2D 클래스 내에서 파라미터에 대한 잘못된 정의로 인해 발생할 수 있다.
Dimension mismatch error: 입력 데이터의 차원과 커널의 차원이 맞지 않으면 그래디언트를 계산할 수 없다.
Non-differentiable operation: 특정 연산이 미분 불가능한 경우, 그라디언트를 계산할 수 없다는 메세지가 출력될 수 있다.
4.
Cross-Correlation 연산은 Convolution 과 매우 유사하지만, 커널을 뒤집지 않는다는 점에서 차이가 있다. Cross-correlation을 행렬 곱셈으로 변환하려면, 입력 이미지를 행렬로 patch하고, 커널도 행렬로 변환한 후 두 행렬을 곱하는 방식으로 계산할 수 있다.
++++ 개념 정리
1. Convolution (합성곱)
두 개의 함수(혹은 데이터)를 결합하여 새로운 출력을 만드는 수학적 연산.
딥러닝 특히 합성곱 신경망(CNN)에서 이미지나 데이터를 처리할 때 사용.
커널(Kernel)이라는 작은 필터를 사용하여 이미지의 특정 패턴을 추출
2. Kernel (커널)
합성곱에서 Filter(필터) 라고도 불리며, 이미지나 데이터의 특정 부분을 탐색하는 작은 행렬. (ex. 3 x 3, 5 x 5)
CNN에서 커널은 주어진 입력 데이터에서 의미있는 패턴을 인식하고 추출하는 역할
커널은 국소적인 패턴을 포착하는 데 매우 유용. 필터가 이미지의 각 위치에 적용되어 픽셀들 간의 상관관계를 학습하고, 그 결과로 패턴이나 특징을 감지할 수 있다.
3. Translation invariance
4. Edge detection Kernel 엣지 검출 커널
엣지 검출 커널은 이미지에서 급격한 명암 변화가 있는 부분, 즉 엣지(경계)를 감지하는 필터이다. 주로 수직, 수평, 대각선 방향의 경계를 찾는 데 사용된다. 대표적인 엣지 검출 커널에는 Sobel과 Prewitt 커널이 있다.
5. Laplacian Kernel
라플라시안 커널은 이미지에서 2차 미분을 사용하여 엣지나 곡선을 감지하는 필터이다. 이는 픽셀 값의 변화율을 계산하여 더 미세한 엣지를 검출할 수 있다.
6. Blur Kernel
블러 커널은 이미지의 세부 정보를 부드럽게 만들고, 노이즈를 줄이는 데 사용된다. 주로 가우시안 블러 커널이 널리 사용되며, 이미지에서 픽셀 값들을 주변 값과 평균화하여 부드러운 효과를 만든다.
7. Conv2D
이미지와 같은 2차원 데이터에 대해 합성곱 연산을 수행하는 레이어이다. 합성곱 연산은 입력 데이터와 커널을 슬라이딩 하면서 해당 영역의 값들을 곱하고 합산하는 과정이다. Conv2d 레이어는 주로 이미지에서 특징을 추출하고, 이를 학습하는 데 사용된다.
8. Cross-Correlation
크로스 코릴레이션은 합성곱과 유사한 연산이지만, 커널을 뒤집지 않고 입력 데이터와 커널의 값을 곱하고 합산하는 과정입니다. 주로 신호처리나 이미지 처리에서 사용되며, 합성곱 연산과 혼용되는 경우가 많다.
9. Patch
패치는 이미지나 데이터의 일부 영역을 잘라내어 사용하는 작은 블록이다. 일반적으로 Conv2D 연산에서 이미지를 패치 단위로 나누어 필터링 작업을 수행한다.