본 글은 네이버 부스트 캠프 AI Tech 기간동안
개인적으로 배운 내용들을 주단위로 정리한 글입니다
본 글의 내용은 새롭게 알게 된 내용을 중심으로 정리하였고
복습 중요도를 선정해서 정리하였습니다
✅ Week 1
목차
- 벡터
- 행렬
- 경사하강법
- 역전파
- 확률, 통계
벡터 (복습 중요도 : ⭐⭐)
벡터는 공간에서 한 점
n차원 공간에서 한 점 (공간 ⬇️)
1 차원 - 수직선
2 차원 - 좌표 평면
- 벡터는 원점으로부터 상대적 위치를 표현
- 벡터에 숫자를 곱해주면(스칼라 곱) 길이만 변화 (방향 변화 x)
- 단, 곱해주는 실수의 값이 0보다 작다면 반대 방향으로 변화
- 벡터끼리 같은 모양이면 덧셈, 뺄셈을 계산할 수 있다.
- 같은 모양이 아니면 불가
- 벡터가 같은 모양이면 성분곱(Hadamard product)를 계산할 수 있다
- 두 벡터의 덧셈은 다른 벡터로 부터 상대적 위치 이동
- 벡터는 원점에서 거리 → 0 + x
- 만약 0 위치에 다른 벡터를 추가하면 벡터의 덧셈
- 벡터의 뺄셈은 반대 방향으로 덧셈 해준 것
벡터의 노름(norm)
- 원점에서부터의 거리
- 노름은 2가지 종류가 있다
- L1 노름과 L2 노름
#넘파이를 활용해서 norm을 구현한다면
def l1_norm(x):
x_norm = np.abs(x) #절대값
x_norm = np.sum(x_norm) #합
return x_norm
def l2_norm(x):
x_norm = x * x
x_norm = np.sum(x_norm)
x_norm = np.sqrt(x_norm)
return x_norm
노름을 나누는 이유
노름의 종류에 따라서 기하학적 성질이 달라진다
L1 norm
- 벡터의 절대값에 대한 합을 의미
- 맨하탄 거리(Manhattan distance)로도 불림
L2 norm
- 유클리드 거리(Euclidean distance)와 같은 개념
- 벡터의 각 성분을 제곱한 후에 더한 뒤, 제곱근을 씌운 값
- L2 norm은 벡터의 크기를 나타내는 가장 일반적인 방식
Norm1, Norm2를 활용해서 거리, 각도 구하기
- 각도의 경우 L2 Norm만 구할 수 있다
- 제2 코사인 법칙에 의해 두 벡터 사이의 각도를 계산할 수 있다
- 두 벡터 내적곱 / (l2 norm[x] * l2 norm[y])
- 2차원이 아니더라도 임의의 N차원에서 연산가능
def angle(x, y):
v = np.inner(x,y) / (l2_norm(x) * l2_norm(y))
theta = np.arccos(v)
return theta
내적의 의미
- 내적은 정사영(orthogonal projection)된 벡터의 길이와 관련
- Proj(x)의 길이는 코사인 법칙에 의해서 llxll cos(theta)가 된다.
- 내적은 정사영의 길이를 벡터 y 의 길이를 llyll 만큼 조정한것
행렬 (복습 중요도 ⭐⭐)
행렬(matrix)은 벡터를 원소로 가지는 2 차원 배열
행렬의 전치 행렬
행과 열을 바꿔주는 행렬
행렬의 덧셈과 뺄셈, 그리고 성분곱, 스칼라곱
- 벡터와 같음
행렬 곱셈은 다름
matrix multiplication
- 내적으로 곱해짐
그래서 x 행과 y열의 크기가 같아야 x행렬과 y행렬이 곱해질 수 있음
역행렬
np.linalg.inv(x)
#역행렬을 계산하려면 행과 열이 같아야함(크기가)
만약 행과 열의 크기가 다르다면 → under or over
유사 역행렬 (pseudo-inverse)를 이용해서 연산
= 무어 펜로즈(Moore-Penros)
n ≥ m이면 A^+*A = I
n ≤ m 이면 AA^+ = I
np.linalg.pinv(y)
#유사역행렬 계산
선형회귀 분석
#sklearn 이용
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
y_test = model.predict(x_test)
#Moore_penrose 역행렬 이용
X_ = np.array([np.append(x,[1]) for x in x]) #intercept 항 추가
beta = np.linalg.pinv(X_) @ y
y_test = np.append(x, [1]) @ beta
✅경사 하강법
미분 (differentitation) → 변수의 움직임에 따른 함수값의 변화를 측정하기 위해 사용할 수 있다
#미분계산
import sympy as sym
from sympy.abc import x
sym.diff(sym.poly(x**2 + 2*x + 3, x))
함수를 증가 시키고 싶으면 미분값을 더해주고
함수를 감소 시키고 싶으면 미분값을 빼준다
'''
Input : gradinet, init, lr, eps,
Output : var
'''
var = init
grad = gradient(var)
while(abs(grad) > eps):
var = var - lr * grad
grad = gradient(var)
변수가 벡터이면?
- 미분은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구
- 벡터가 입력인 다변수 함수의 경우 편미분(partial differentiation)을 사용한다.
파이썬에서 미분하는 법 ⬇️
import sympy as sym
from sympy.abc import x, y
sym.diff(sym.poly(x**2 + 2*x*y + 3) + sym.cos(x + 2*y), x)
변수가 D개라면 D개만큼 편미분
경사 하강법 기반 선형 회귀 알고리즘
for t in range(T):
error = y - X @ beta
grad = - transpose(X) @ error
beta = beta - lr * grad
import numpy as np
X = np.array([[1,1], [1,2], [2,2], [2,3]])
y = np.dot(X, np.array([1, 2])) + 3
beta_gd = [10.1, 15.1, -6.5]
X_ = np.array([np.append(x, [1]) for x in X])
for t in range(5000):
error = y - X_ @ beta_gd
grad = - np.transpose(X_) @ error
beta_gd = beta_gd - 0.01 * grad
print(beta_gd)
✅역전파 (복습 중요도 ⭐⭐⭐⭐)
backpropagation (역전파)
- 각층 파라미터에 대한 그레디언트를 계산한 다음 → 윗층에서 아래 층으로 이동 하면서 역순으로 계산
- 연쇄법칙 (Chain rule)을 활용해서 auto-differentitaion(자동미분)을 활용
딥러닝에서 역전파는 혁식에 가까웠음
딥러닝 모델은 합성함수 이기때문에 Chain rule을 활용해서 계산해줄 수 있다.
역전파 논문 🆙
https://www.iro.umontreal.ca/~vincentp/ift3395/lectures/backprop_old.pdf
+추가) 작년에 forward - forward 방식의 새로운 방법도 제안
✅확률 변수 - 복습 중요도 (⭐⭐⭐)
이산확률변수 vs 연속확률변수
→ 확률 변수는 확률 분포에 따라서 이산형(discrete)과 연속형(continuous)로 구분된다.
이산형 확률 변수는 확률 변수가 가질 수 있는 경우의 수를 모두 고려하여 확률을 더해서 모델링
연속형 확률 변수는 데이터 공간에 정의된 확률변수의 밀도(density)위에서 적분을 통해 모델링
주변 확률 분포
주변 확률 분포는 결합확률 분포를 전제로 시작
✅통계 (복습중요도 ⭐⭐⭐⭐)
Maximum liklihood estimation, MLE
'네이버 부스트캠프 🔗 > ⭐주간 학습 정리' 카테고리의 다른 글
[네이버 부스트 캠프 AI Tech] Pytorch nn.Module & Dataset (0) | 2023.03.14 |
---|---|
[네이버 부스트 캠프 AI Tech] Pytorch 기본 (0) | 2023.03.13 |
[부스트 캠프]Week 1 회고 및 Week 2 목표 정리 (0) | 2023.03.13 |
[네이버 부스트 캠프 AI Tech] CNN & RNN (0) | 2023.03.10 |
[네이버 부스트 캠프 AI Tech] 파이썬, Numpy, Pandas (0) | 2023.03.10 |