일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 기계학습
- n과 m
- BOJ
- 1101
- 15649
- 그리디 알고리즘
- 4948
- 오블완
- 밑바닥부터 시작하는 딥러닝
- 가상환경
- REST
- 재귀
- streamlit
- 티스토리챌린지
- 손실함수
- REST API
- 신경망 학습
- N-Queen
- 경사하강법
- 9020
- 파이썬
- 실버
- Python
- 백준
- 개발환경
- pyenv
- 1002
- end to end
- 파이싼
- 백트래킹
- Today
- Total
파이톨치
[BoostCamp AI Tech] 머신러닝 본문
머신러닝
머신러닝은 어떠한 작업에 대해 경험과 함께 성능을 향상시키는 것이라고 한다.
우리도 학교를 다니며, 공부를 하고 지식을 알게 되고, 시험 성적을 받는다.
인간이 동작하는 방식과 유사하다.
모델 평가 지표
모델에게 있어서 시험 성적은 무엇일까?
대표적으로 MAE와 MSE가 있다. Mean Absolute Error와 Mean Square Error의 약자이다.
MAE는 정답값과 예측값 사이의 절대값을 모두 더하고 평균을 내는 것이고,
MSE는 정값값과 예측값 사이의 제곱을 한 후 평균을 내는 것이다.
아래 코드는 이미지에 대해서 거리를 계산하는 알고리즘이다.
한 행만 비교하는게 사실 잘 이해가 안 간다.
import numpy as np
class NearestNeighbor:
def __init__(self):
pass
def train(self, images, labels):
self.images = images
self.labels = labels
def predict(self, test_image):
# 시스템 상 최대 정수를 넣어준다.
min_dist = sys.maxint
# 이미지의 세로 길이만큼 반복해준다.
for i in range(self.images.shape[0]):
# abs니까 MAE를 사용한 것이다.
# 입력으로 넣어준 test_image와 이미지의 한 행의 거리를 계산한다.
dist = np.sum(np.abs(self.images[i, :] - test_image))
# 거리가 가장 짧으면 업데이트 해준다.
if dist < min_dist:
min_dist = dist
min_index = i
# dist가 가장 짧은 인덱스의 라벨을 반환한다.
return self.labels[mins_index]
Computer Vision 분야에서는 픽셀 거리에는 k-nearest neighbor가 사용되지 않는다고 한다.
왜냐하면, 픽셀 거리를 사용하면 테스트 할 때 굉장히 느리다.
또, shifted or boxed된 이미지인데, 계산상 동일하게 나올 수 있기 때문이다.
모델 평가 지표 2
다음으로는 제곱근 평균 제곱 오차 (RMSE)와 결정 계수 (R^2)이 있다.
제곱근 평균 제곱 오차는 MSE에 제곱근을 취한 값이다. 큰 오차에 민감하게 반응한다.
모델 평가에서 일반적으로 많이 사용하는 값이다.
결정 계수는 모델이 종속 변수의 변동성을 얼마나 설명하는지를 나타내는 지표이다. 말이 참 어렵다.
0~1 사이 값이며, 1에 가까울수록 모델이 데이터를 잘 설명한다는 것만 기억하자.
Kullback Divergence (KL 발산)
# chatgpt write
Kullback-Leibler Divergence (KL 발산)는 두 확률분포 간의 차이를 측정하는 통계적 지표로, 특정 분포 P가 실제 분포라고 가정할 때, 다른 분포 Q가 얼마나 이 P와 다른지를 나타냅니다. 이 개념은 정보 이론에서 유래했으며, 특히 두 분포 간의 정보 손실을 정량적으로 표현하는 데 유용합니다.
KL 발산은 주어진 데이터 분포 P에 비해, 대체 분포 Q를 사용함으로써 얼마나 많은 정보가 손실되는지를 측정합니다. 이는 예를 들어, P가 실제로 데이터가 생성되는 방법을 설명하는 "진짜" 분포라고 할 때, Q가 그 데이터를 설명하기 위해 사용되는 분포라고 생각할 수 있습니다. Q가 P와 매우 비슷하다면 KL 발산 값은 작습니다. 그러나 Q가 P와 많이 다르면, KL 발산 값은 커집니다.
np.hstack()
# np.hstack 동작 방식
# 기존 배열 X
X = np.array([[2, 3], [4, 5], [6, 7]])
# X의 모양 확인
print(X.shape) # 출력: (3, 2)
# X의 왼쪽에 새로운 열을 추가
X_new = np.hstack((np.ones((X.shape[0], 1)), X))
[[1. 2. 3.]
[1. 4. 5.]
[1. 6. 7.]]
선형회귀 Weight 구하기 유도식
https://subprofessor.tistory.com/104
[선형대수학] 최소제곱법 (Method of Least Squares)
#선형대수학 1. Introduction 최소제곱법은 주어진 데이터와의 오차를 최소화하는 직선을 구하는 방법입니다. 위 그림은 주어진 5개의 데이터에 대해 두 개의 점을 지나며 오차를 줄이는
subprofessor.tistory.com
결과적으로, 유도를 내가 할 필요는 없다. 이해하고 넘어가면 될 것 같다.
# closed form solution: w = (X^T * X)^(-1) * X^T * y
self.weights = np.linalg.inv(X.T @ X) @ X.T @ y
위와 같은 AI 수학이 있다는 것 정도만 기억하자.
오차 역전파
이번주 나를 가장 괴롭힌 내용이다. 어떻게 곱하기와 더하기만 들어가면 이해하기 쉬운데, sigmoid, cross entropy가 들어가면서 이해하기 어려웠다.
역전파에서 곱셈 노드의 차원에 대해 설명해보고자 한다.
역전파(Backpropagation) 과정에서는 각 층에서의 가중치와 편향에 대한 그래디언트를 계산하기 위해 입력값과 출력값 간의 관계를 역으로 추적합니다. 이 과정에서 행렬 곱셈의 연쇄 법칙(chain rule)을 사용하게 되며, 특히 역전파를 위해 행렬의 전치(transpose)가 필요합니다.
행렬 곱셈의 역전파
행렬 곱셈에서 두 행렬 A와 B를 곱하여 행렬 C를 만든다고 가정해봅시다:
여기서:
- A의 크기는 (B,H)입니다.
- B의 크기는 (H,C)입니다.
- C의 크기는 (B,C)입니다.
# softmax + cross entropy 역전파
dy = y_pred - Y
dW2 = a1.T @ dy / N
db2 = np.sum(dy, axis=0) / N
# 순전파랑 거꾸로 곱해준다.
da1 = dy @ self.params['W2'].T
dy로부터 역전파를 하기 위해서는 이렇게 전치를 해주어야 한다.
A @ B = C를 만들었을 때, A를 (B, H)라고, B를 (H, C)라 하고, C를 (B, C)라 가정해보면, 역전파에서 C로부터 A를 만들기 위해서는 B를 전치해야 하고 (C @ B.T) C로부터 B를 만들기 위해서는 A를 전치해야 한다.
한가지 특이한 점은 저기에 있는 sum 인데, 이는 dy가 배치단위로 넘어오기 때문이다. b의 값은 1차원 벡터인데, 배치단위로 바이어스가 생성될 수 없어서 axis=0을 기준으로 한 행으로 합쳐준다. 그 뒤에 배치 단위로 나누어 준 값으로 바이어스를 업데이트 한다.
그림으로 보면 다음과 같다. 참고하세영.
'AI&ML > BoostCamp AI Tech' 카테고리의 다른 글
[BoostCamp AI Tech] 데이터 분석 (0) | 2024.08.20 |
---|---|
[BoostCamp AI Tech] Transformer (0) | 2024.08.16 |
[BoostCamp AI Tech] RNN & LSTM & Attention (0) | 2024.08.14 |
[BoostCamp AI Tech] 선형 회귀 모델 (0) | 2024.08.09 |
[BoostCamp AI Tech] 파이토치 기본 (0) | 2024.08.09 |