1. 머신러닝 vs 딥러닝

1) 머신러닝 vs 딥러닝 차이점
- 사람의 개입 여부
- 머신러닝: 주어진 데이터를 인간이 처리합니다. 사람이 먼저 컴퓨터에 특정 패턴을 추출하는 방법을 지시하고, 그 이후 컴퓨터가 스스로 데이터의 특징을 분석하고 축적합니다.
- 딥러닝: 컴퓨터가 스스로 데이터를 기반으로 학습할 수 있도록 정해진 신경망을 컴퓨터에게 주고, 경험 중심으로 학습을 수행합니다.


입력층(Input Layer)
입력층은 신경망에 데이터를 제공하는 첫 번째 층이다. 이 층은 외부로부터 데이터를 받아 신경망의 내부로 전달하는 역할을 한다. 예를들어, X값이 3개면 입력층 노드는 3개이다.
은닉층 (Hidden Layer)
은닉층은 데이터의 패턴이나 특징을 학습하는 층이다. 각 은닉층은 이전 층으로부터의 입력값을 받아 처리하고 다음 층으로 결과를 전달한다. 이 과정에서 각 입력값에 특정 가중치를 곱하여 중요한 특징을 더 잘 인식할 수 있게 한다. 은닉층의 수는 문제의 복잡성, 데이터의 양, 그리고 모델의 성능 요구 사항에 따라 다르게 설정된다.
출력층 (Output Layer)
출력층은 신경망의 마지막 층으로 결과나 예측을 나타낸다. 출력층에서는 가능한 답들의 확률을 계산해, 가장 높은 확률을 가진 답을 최종적으로 선택한다
- Y = WX + B
✔W(가중치)와 B(편향)는 처음엔 랜덤값!
✔학습(Training)하면서 오차(Error)를 줄이는 방향으로 W와 B를 수정
✔손실 함수(Loss)로 오차를 계산하고, 경사 하강법(Gradient Descent)으로 조금씩 조정
✔반복하면 W와 B가 점점 정답에 가까워져서 좋은 모델이 됨!
2) 퍼셉트론
- 퍼셉트론: 뉴런 작동 방식에서 착안한 가장 기초적인 형태의 인공 신경망 모델
- 구성요소: 인풋(input), 가중치(connection weight), 편향(bias), 합(sum), 활성화함수(Activation Function)
- 퍼셉트론 수식


- Deep Neural Network 구조

- MLP(multi layer Perceptron)

3) 활성화 함수(Activation Function):
- 뉴런의 출력값을 결정하고, 다음 층으로 전달할 값을 지정
- 신경망에서 비선형성을 추가 → 비선형 문제 해결 가능
- 선형 함수는 층을 쌓아도 선형 모델이 되기 때문에 반드시 비선형 함수가 필요

활성화 함수 종류:

시그모이드 함수(Sigmoid)

- 출력값 범위: (0, 1)
- 확률값 출력에 적합 → 이진 분류에서 사용
- 단점:
- 기울기 소실 문제(Vanishing Gradient) 발생 → 입력값이 크면 기울기가 거의 0이 됨
- 학습이 잘 안 됨
ReLU (Rectified Linear Unit)

- 출력값 범위: [0, ∞)
- 가장 많이 사용되는 활성화 함수
- 기울기 소실 문제 완화: 오차역전파

단점: 죽은 ReLU 문제(Dead ReLU) → 입력값이 0 이하이면 기울기가 0 → 뉴런이 죽음
4) 손실함수(loss function)
- 학습된 신경망으로부터 도출된 결과 값과 실제 정답이 얼마나 차이가 나는지를 계산하는 함수
→ loss function 값이 작을수록 모델 성능이 좋다는 의미입니다.
- 최적의 가중치(weight)를 찾기 위해 손실 함수 값이 최소가 되는 지점을 찾는 것이 중요

① 회귀 문제 손실함수
MSE(Mean Squared Error) : 예측값과 실제값의 차이의 제곱 평균
MAE(Mean Absolute Error) : y_i - hat{y}_i
② 분류 문제 손실 함수
Binary Cross Entropy : 이진 분류 에서 사용
Categorical Cross Entropy : 다중 클래스 분류에서 사용
경사 하강법(Gradient Descent)
모델의 손실 함수(Loss Function)를 최소화하기 위해 가중치(Weight)를 반복적으로 업데이트하는 알고리즘


Learning Rate
- 경사 하강법(Gradient Descent)에서 기울기를 따라 이동하는 보폭(step size)을 결정하는 값입니다.
- 학습 속도와 관련된 하이퍼파라미터. 한 번에 얼마만큼 이동할지를 결정
learning rate 따른 과적합 구분 (loss function 시각화)

Local minima vs Global minimum
- 경사 하강법은 현재 기울기 방향을 따라가기 때문에 local minima에 빠질 위험이 있음
- 모델이 local minima에 빠지지 않고 global minimum을 찾는 것이 학습의 핵심

옵티마이저(Optimizer): 경사 하강법의 개선된 버전으로, 손실 함수를 최소화하도록 가중치와 바이어스를 조절하는 알고리즘
경사 하강법(Gradient Descent) 기반

하이퍼파라미터 (Hyper parameter)

2. CNN
1) MLP vs CNN
MLP: 이미지나 영상처리에는 부적절: 한 칸씩 움직였는데 변화값이 20개

CNN: 특징을 찾아서 이미지를 인식


Feature Extraction
: filter(kernel)을 이용하여 특징 추출(feature extraction)


CNN

4. 텐서플로우 vs 파이토치 비교
| 특징 | 텐서플로우 (TensorFlow) | 파이토치 (PyTorch) |
| 개발사 | 구글 (Google) | 페이스북(현 Meta) |
| 그래프 방식 | 정적 그래프 (Static Graph) → 최신 버전은 즉시 실행 (Eager Execution) 지원 | 동적 그래프 (Dynamic Graph) |
| 주요 활용 분야 | 생산 및 배포에 강점(모바일, 웹, 서버 등) | 연구 및 개발에 강점(빠른 실험, 프로토타입 제작) |
| 코드 직관성 | 비교적 복잡 (초기) | 매우 직관적이고 쉬움 |
| 커뮤니티 | 매우 방대하고 활발함 | 빠르게 성장 중이며 활발함 |
| 장점 | 안정적, 강력한 배포 환경, 다양한 도구 | 배우기 쉽고 디버깅이 용이, 유연한 모델 설계 |
| 단점 | 초기 학습 난이도가 높았음 | 생산 환경 도구가 상대적으로 적었음 (최근 개선) |
MNIST 실습
MNIST 데이터셋 소개MNIST는 60,000개의 트레이닝 셋과 10,000개의 테스트 셋으로 이루어져 있고 이중 트레이닝 셋을 학습데이터로 사용하고 테스트 셋을 신경망을 검증하는 데에 사용합니다. MNIST는 간단한 컴퓨터 비전 데이터 세트로, 손으로 쓰여진 이미지들로 구성되어 있습니다. 숫자는 0에서 1까지의 값을 갖는 고정 크기 이미지 (28x28 픽셀)로 크기 표준화되고 중심에 배치되었습니다.간단히 하기 위해 각 이미지는 평평하게되어 784 피쳐의 1-D numpy 배열로 변환되었습니다 (28 * 28). |


코드
import tensorflow as tf
import numpy as np
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
print(x_train.shape, y_train.shape) # (60000, 28, 28) (60000,)
print(x_test.shape, y_test.shape) # (10000, 28, 28) (10000,)
트레인데이터와 테스트 데이터를 나눠줍니다.
import matplotlib.pyplot as plt
# 첫 번째 이미지 출력
plt.imshow(x_train[0], cmap='gray') # 흑백으로 보기 위해 'gray' 설정
plt.title(f"Label: {y_train[0]}") # 정답(라벨)을 제목으로 표시
plt.show()

x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
이미지 데이터 전처리 0 ~ 255 데이터를 0 ~ 1로 값을 변경
추가내용: 백색이 0 흑색이 255인데 이걸 255로 나눠주면서 0~1의 실수범위로 맞춰주는 코드
x_train = np.expand_dims(x_train, axis=-1) # (60000, 28, 28, 1)
x_test = np.expand_dims(x_test, axis=-1) # (10000, 28, 28, 1)
print(x_train.shape, x_test.shape)
(60000, 28, 28, 1) (10000, 28, 28, 1)
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(28, 28, 1)),
tf.keras.layers.Conv2D(32, (3, 3), activation="relu"),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(64, (3, 3), activation="relu"),
tf.keras.layers.MaxPooling2D((2, 2)), # feature 추출을 하는곳이다.
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation="relu"),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Dense(10, activation="softmax"), #출력층 0~9 분류
])
입력 이미지 (28×28×1)
→ 합성곱 + 풀링 (특징 추출)
→ 합성곱 + 풀링 (더 복잡한 특징)
→ Flatten (1차원으로 변환)
→ Dense (판단)
→ Softmax (0~9 확률 출력)
의 과정입니다.
model.summary()

model.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
옵티마이저 학습, 손실함수 설정, 정확도 성능평가
history = model.fit(
x_train, y_train, #지도
epochs=5,
batch_size=128, # 8, 16, 32, 64, 128, 256
validation_split=0.1
)
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
print("Test accuracy:", test_acc)
Test accuracy: 0.9911999702453613
probs = model.predict(x_test[:5]) # (5, 10)
preds = np.argmax(probs, axis=1) # 예측 클래스
print("Pred:", preds)
print("True:", y_test[:5])
Pred: [7 2 1 0 4] True: [7 2 1 0 4]