|
|
11장 정리문제
1) 머신러닝에서 모델의 의미를 설명하라.
예를 들어 머신러닝 모델, 신경망 모델, 인공지능 모델 등에서 모델의 의미를 설명하라.
모델은 입력 데이터를 받아 출력을 만들어내는 수학적 구조체로, 데이터가 모델 안으로 흘러가며 내부의 가중치에 의해 변환되어
출력값이 결정된다. 학습 전과 후의 모델은 구조는 동일하지만 가중치 값이 다르며, 모델을 학습한다는 것은 결국 이 가중치를 데이터에 맞게 최적화하는 과정이다.
머신러닝 모델: 데이터로부터 학습된 패턴을 담은 함수
신경망 모델: 뉴런들이 층으로 연결된 구조로, 가중치가 핵심 파라미터
인공지능 모델: 지능적 판단을 수행하는 모든 수학적 구조를 포괄하는 개념
2) 손실함수의 의미를 설명하고 왜 필요한지 설명하라.
손실함수는 모델의 출력과 정답 사이의 오차를 스칼라 값 하나로 나타내는 함수이다.
가중치 w를 변수로 받아 손실값을 출력하며, 학습의 목표는 이 함수를 최소화하는 w를 찾는 것이다.
손실함수가 없으면 모델이 얼마나 틀렸는지 수치로 계산할 수 없어 가중치 업데이트 자체가 불가능하다.
3) 경사하강법을 설명하라.
경사하강법은 Loss(w) 그래프에서 현재 위치의 기울기(그래디언트)를 계산하고, 그 반대 방향으로 w를 조금씩 이동시켜 Loss의
최솟값을 찾는 방법이다. 수식은 w_new = w_old - lr × 그래디언트이며, 여기서 lr은 학습률로 한 번에 얼마나 이동할지를 결정한다.
가중치가 여러 개일 때는 각 w에 대해 편미분(나머지는 상수 취급)을 계산하고 이를 모아 그래디언트 벡터 ∇Loss를 구한다.
이 벡터는 Loss가 가장 가파르게 올라가는 방향을 가리키므로, 반대 방향으로 이동하면 가장 빠르게 내려갈 수 있다.
4) 확률적 경사하강법을 설명하라.
일반 경사하강법은 전체 데이터를 다 사용해 그래디언트를 계산한 뒤 w를 한 번 업데이트하므로 데이터가 많으면 학습이 느리지만
확률적 경사하강법은 데이터를 전부 보지 않고 조금씩 나눠서 중간중간 w를 업데이트하는 방식이다.
배치 경사하강법: 전체 데이터를 한꺼번에 사용
확률적 경사하강법(SGD): 데이터 1개씩 사용
미니배치 SGD: 데이터를 N개씩 묶어서 사용 (현실에서 주로 사용)
또한 현실에서는 미니배치를 그냥 '배치'라고 부르는 경우가 대부분이므로, '배치'라는 말은 문맥에 따라 미니배치를 의미할 수 있다.
5) 퍼셉트론, 다층퍼셉트론, 심층신경망을 구분하여 설명하시오.
퍼셉트론: 뇌의 뉴런 하나를 흉내낸 가장 단순한 구조로, 입력에 가중치를 곱해 합산한 뒤 활성화함수를 통과시켜 출력 하나를 만든다.
직선 하나로 분류할 수 있는 문제만 풀 수 있으며, XOR 문제처럼 직선 하나로 분리 불가능한 문제는 풀 수 없다.
다층퍼셉트론(MLP): 퍼셉트론을 여러 층(입력층 -> 은닉층 -> 출력층)으로 쌓은 구조로, XOR 문제처럼 복잡한 패턴도 학습할 수 있다.
심층신경망(DNN): 은닉층을 많이 쌓은 구조(3개 이상)로, 층이 깊을수록 더 추상적인 특징을 학습한다.
6) 활성화 함수란 무엇인가? 또, 왜 필요한가?
활성화 함수는 퍼셉트론에서 가중치 합산 결과를 변환해주는 함수이다.
가중치 곱셈과 덧셈은 본질적으로 1차함수(직선)이므로, 층을 아무리 많이 쌓아도 활성화 함수 없이는 결국 직선 하나와 같지만,
활성화 함수가 비선형성을 추가해 꺾이는 지점을 만들고, 꺾임이 많아질수록 복잡한 곡선 형태를 표현할 수 있게 된다.
Sigmoid: 출력을 0~1 사이로 압축. 미분값이 항상 0.25 이하여서 깊은 층에서 기울기 소실 문제 발생
ReLU: x < 0이면 0, x ≥ 0이면 x 그대로 출력. 미분값이 0 또는 1이어서 기울기 소실 문제를 완화할 수 있다.
단, 뉴런이 항상 음수 입력을 받으면 미분값이 항상 0이 되어 영원히 업데이트되지 않는 '죽은 뉴런'이 생길 수 있다.
7) 훈련데이터는 영상과 레이블로 구성된다. 레이블이 무엇인가?
레이블은 훈련 데이터에서 각 입력 데이터에 대응하는 정답 태그이다.
손실함수 계산 시 모델 출력과 비교하는 정답값이 바로 레이블이며, 레이블이 없으면 손실 계산 자체가 불가능하다.
레이블은 사람이 직접 붙이는 작업(annotation)이 필요하므로 대규모 레이블 데이터 구축에는 높은 비용이 든다.
8) 에폭(epoch)이 무엇인가?
에폭은 전체 훈련 데이터를 한 번 다 돌았을 때를 1로 세는 단위로, 전체 데이터를 몇 번 학습했는지를 나타낸다.
에폭이 너무 적으면 학습 부족(과소적합)이 되고, 너무 많으면 훈련 데이터만 과하게 외워버리는 과적합이 발생할 수 있어
적절한 에폭 수를 설정하는 것이 중요하다.
9) 배치, 미니배치가 무엇인가?
배치는 한 번의 가중치 업데이트에 사용하는 데이터 묶음이다.
배치는 전체 데이터를 한꺼번에 사용하는 것이고, 미니배치는 전체 데이터를 N개씩 쪼개어 사용하는 것이다. 현실에서는 미니배치를
그냥 '배치'라고 부르는 경우가 많으며, 배치 크기는 GPU 메모리 효율을 위해 보통 32, 64, 128 같은 2의 배수를 사용한다.
10) 역전파 알고리즘을 설명하라.
역전파는 신경망의 수백만 개 가중치에 대한 그래디언트를 효율적으로 계산하는 알고리즘이다. 출력에서 입력 방향으로 거꾸로 이동하며, 연쇄법칙을 이용해 이전 층에서 계산한 그래디언트 결과를 재활용함으로써 각 층의 그래디언트를 순차적으로 구한다.
기울기 소실: 역전파 시 그래디언트가 층을 거칠수록 계속 곱해지는데, Sigmoid처럼 미분값이 항상 0.25 이하인 함수를 쓰면 층이
깊을수록 그래디언트가 0에 가까워져 앞쪽 층의 가중치가 업데이트되지 않는 문제가 발생한다.
ReLU는 미분값이 0 또는 1이어서 이 문제를 완화할 수 있다.
11) 신경망의 훈련이 수렴한다는 말의 의미를 설명하라.
수렴은 Loss값이 더 이상 줄어들지 않고 안정된 상태를 의미한다.
이 때, 수렴 자체보다 어디서 멈췄는지가 중요한데, Loss가 충분히 낮은 상태에서 안정되면 좋은 수렴이고, 높은 상태에서 멈추면
지역 최솟값에 빠진 나쁜 수렴이다.
현실에서는 수렴 품질을 훈련 데이터 Loss와 한 번도 본 적 없는 검증 데이터 Loss를 비교해 간접적으로 판단한다.
12) 신경망의 훈련에서 학습률의 영향을 자세히 설명하라.
학습률은 경사하강법에서 한 번에 가중치를 얼마나 이동할지 결정하는 값(lr)으로, 딥러닝에서 가장 중요한 하이퍼파라미터 중 하나로,
학습률이 너무 크면 최솟값을 지나쳐 Loss가 계속 왔다갔다하며 발산하고, 너무 작으면 수렴이 너무 느리거나 지역 최솟값에 갇힌다.
따라서 학습률 스케줄링은 초반에 학습률을 크게 해서 빠르게 최솟값 근처로 이동하고, 후반에 점점 줄여서 세밀하게 수렴시키는
방식을 주로 사용한다.
13) 손실함수를 최적화한다는 의미를 설명하라.
손실함수를 최적화한다는 것은 Loss를 최소화하는 가중치 w를 찾는 과정이다. 문제 유형에 따라 손실함수를 다르게 선택하며,
분류: Cross Entropy Loss, 회귀: MSE Loss 손실함수 선택이 곧 모델이 풀어야 할 문제의 방향을 결정한다.
'손실함수 최적화', 'Loss 최소화', '좋은 가중치 찾기', '학습'은 모두 같은 의미를 가진다.
14) mnist 영상(2차원데이터)을 다층퍼셉트론으로 분류가 잘 안되는 이유를 설명하라.
MNIST는 28×28 픽셀의 손글씨 숫자 이미지 데이터셋으로, 다층퍼셉트론에 입력하려면 2차원 이미지를 784개의 숫자로 펼쳐야 한다. 그러나 MLP의 완전연결층은 모든 픽셀을 동등하게 연결하므로, 어떤 픽셀이 어디 있는지, 주변 픽셀과 어떤 관계인지를 구조적으로
저장할 수 없다. 또한 같은 숫자라도 위치가 조금만 바뀌면 펼친 후 완전히 다른 입력이 되어버려 같은 숫자로 인식하지 못한다.
이를 해결하기 위해 CNN(합성곱 신경망)이 사용되는데, CNN은 필터(커널)가 이미지 위를 슬라이딩하며 주변 픽셀을 함께 보기 때문에 공간 정보와 픽셀 간 연관성을 보존하고, 숫자의 위치가 바뀌어도 동일하게 인식할 수 있다.
12장 정리문제
1) 텐서란 무엇인가?
텐서란 숫자를 각 축 방향으로 빈 공간 없이 꽉 채운 다차원 배열을 의미한다. 스칼라(0차원), 벡터(1차원), 행렬(2차원)은 모두 텐서의
특수한 경우이며, 파이토치에서는 모든 차원의 데이터를 torch.Tensor 하나로 통일하여 다룬다.
2) 텐서의 차원을 확인하는 방법은?
.shape는 각 축의 크기를 반환하고 .ndim은 축의 개수를 반환한다. 예를 들어 shape가 (2, 3, 4)인 텐서는 ndim이 3이 된다.
3) torch.squeeze 함수의 기능을 설명하라.
torch.squeeze는 텐서에서 크기가 1인 축을 제거하는 함수이다.
데이터 자체는 그대로이며 불필요한 축만 제거되므로 shape가 (1, 3, 1, 4)인 텐서에 적용하면 (3, 4)가 된다.
4) torch.cat, torch.stack에서 매개변수 axis의 기능을 설명하라.
axis는 어느 축 방향으로 텐서를 합칠지를 결정하는 매개변수이다. torch.cat은 기존 축 방향으로 텐서를 이어붙이므로 차원이 유지되고, torch.stack은 새로운 축을 생성하여 텐서를 쌓으므로 차원이 1 증가한다.
5) 파이토치에서 Dataset 클래스와 DataLoader 클래스의 기능을 설명하라.
Dataset은 데이터를 저장하고 관리하는 클래스로, __len__과 getitem 두 함수를 반드시 구현해야 하는 기본 스키마가 존재한다.
내부에는 입력 데이터와 정답 레이블이 쌍으로 저장되며 저장 방식은 리스트, 텐서, 파일 경로 등 사용자가 자유롭게 정의할 수 있다. DataLoader는 Dataset에서 데이터를 꺼내 배치로 묶어주는 클래스로, 데이터를 직접 저장하지 않고 Dataset 객체의 참조와
batch_size, shuffle 등의 설정값만 저장한다. 실제 데이터는 DataLoader가 배치를 요청할 때 설정값에 따라 Dataset에서 꺼내온다.
6) Dataset 클래스에서 getitem 멤버함수의 기능을 설명하라.
__getitem__은 인덱스를 입력받아 해당 인덱스의 데이터와 레이블을 반환하는 함수이다.
DataLoader가 배치를 구성할 때 __getitem__을 batch_size만큼 반복 호출하여 데이터를 꺼내온다.
7) 훈련데이터가 100개이고 배치사이즈가 20개일때 1에폭동안 가중치는 몇번 업데이트 되는가?
1에폭은 전체 데이터를 한 번 모두 사용하는 것을 의미하며, 가중치는 배치 하나가 끝날 때마다 한 번씩 업데이트된다.
따라서 업데이트 횟수는 전체 데이터 수를 배치사이즈로 나눈 100 ÷ 20 = 5번이 된다.
8) PIL, matplotlib 패키지를 이용하여 영상파일을 읽어서 화면에 출력하는 방법을 설명하라.
PIL의 Image.open() 함수로 이미지 파일을 읽으면 PIL.Image.Image 객체로 저장되며, 이를 matplotlib의 plt.imshow()에 전달하면
화면에 출력할 수 있다. PIL은 이미지를 읽고 처리하는 역할을 하고 matplotlib은 데이터를 화면에 시각화하는 역할을 담당한다.
9) 영상파일을 읽어서 텐서형태로 변환하여 저장 및 출력하는 방법을 설명하라.
PIL로 읽은 이미지를 torchvision.transforms.ToTensor()를 통해 텐서로 변환할 수 있다.
이 과정에서 저장 순서가 HWC에서 CHW로 바뀌고 픽셀값이 0~255에서 0.0~1.0으로 정규화된다.
변환된 텐서를 다시 화면에 출력하려면 permute(1, 2, 0)으로 CHW를 HWC로 되돌린 후 matplotlib으로 출력한다.
from PIL import Image
from torchvision import transforms
import matplotlib.pyplot as plt
# 이미지 읽기
img = Image.open('cat.jpg')
# 텐서로 변환
transform = transforms.ToTensor()
tensor_img = transform(img)
print(tensor_img.shape) # → torch.Size([3, 28, 28])
# 텐서를 화면에 출력
plt.imshow(tensor_img.permute(1, 2, 0)) # CHW → HWC
plt.axis('off')
plt.show()
10) Dataset 클래스에서 데이터 증식을 위한 영상변환을 추가하는 방법을 설명하라.
transforms.Compose로 원하는 변환 함수들을 순서대로 묶어 정의한 후 Dataset 생성 시 인자로 넘겨주면 된다.
Dataset의 __init__에서는 transform을 저장만 해두고 __getitem__에서 데이터를 꺼낼 때 적용한다.
데이터 증식에 사용되는 변환 함수들은 호출할 때마다 랜덤값이 적용되므로 같은 이미지도 에폭마다 다르게 변환되어 데이터가 증식되는 효과를 얻을 수 있다.
11) Dataset, DataLoader객체안에 저장된 영상을 로드할때 영상변환이 적용되는 원리를 설명하라.
transform은 Dataset 생성 시 저장만 되고 실행되지 않는다. DataLoader가 배치를 요청하면 Dataset의 __getitem__이 호출되고
그 시점에 transform이 실행되어 변환된 이미지가 반환된다. 이처럼 꺼낼 때마다 랜덤 변환이 적용되기 때문에 같은 이미지도 에폭마다 다른 형태로 모델에 입력되어 데이터 증식 효과를 얻을 수 있다.
12) iter, next, enumerate 함수의 기능을 설명하라.
iter는 반복 가능한 객체를 이터레이터로 변환하는 함수이고, next는 이터레이터에서 다음 데이터를 하나씩 꺼내는 함수로 ++ 연산과
유사한 역할을 한다. enumerate는 데이터를 꺼낼 때 인덱스를 함께 반환하는 함수로, 몇 번째 배치인지 추적할 때 사용한다.
13) 손실함수를 최적화한다는 의미를 설명하라.
손실함수를 최적화한다는 것은 손실함수의 값이 최소가 되도록 가중치를 업데이트하는 과정을 의미한다. 가중치를 조절하면 손실값이
변화하므로 손실값을 최소화하는 것과 가중치를 최적화하는 것은 같은 의미이다.
14) 손실함수의 종류를 설명하라.
MSELoss는 회귀 문제에 사용되며 예측값과 정답의 차이를 제곱하여 평균한 값을 손실로 사용한다. 제곱을 사용하는 이유는 부호를
제거하고 큰 오차를 더 강하게 벌주기 위해서이다. CrossEntropyLoss는 다중 분류 문제에 사용되며 정답 클래스의 확률에 -log를
취하여 손실값을 계산하므로 정답 확률이 낮을수록 손실값이 폭발적으로 커진다.
BCELoss는 이진 분류 문제에 사용되며 0~1 사이의 확률값으로 정답과의 차이를 계산한다.
15) 최적화 방법의 종류를 설명하라.
SGD는 기본 경사하강법으로 손실함수의 기울기 반대 방향으로 가중치를 업데이트한다. Momentum은 SGD에 관성을 추가한 방법으로 이전 업데이트 방향을 momentum값(0~1)만큼 반영하여 학습 속도를 높인다.
Adam은 가중치마다 학습률을 자동으로 조절하는 방법으로, 많이 업데이트된 가중치는 학습률을 줄이고 적게 업데이트된 가중치는
학습률을 늘려 효율적으로 학습한다. 실제로는 Adam이 가장 많이 사용된다.
16) 소프트맥스 활성화 함수의 기능을 설명하라.
소프트맥스는 모델의 출력값을 합이 1인 확률 분포로 변환하는 함수이다. 각 값을 e로 지수화한 후 전체 합으로 나누어 계산하며,
단순 비율과 달리 e를 사용하기 때문에 큰 값은 더 크게 작은 값은 더 작게 변환되어 차이가 극대화된다.
17) torch.argmax함수를 설명하라.
torch.argmax는 텐서에서 가장 큰 값을 가지는 원소의 인덱스를 반환하는 함수이다.
소프트맥스로 변환된 확률 분포에서 가장 높은 확률을 가지는 클래스의 인덱스를 반환하여 최종 예측 결과를 구할 때 사용한다.
|
|
