x = [1,7,2]
x = np.array([1,7,2]) # 행이 하나인 행벡터
import numpy as np
x = np.array([1,7,2])
y = np.array([5,2,1])
print(x+y) # [6,9,3]
print(x-y) # [-4,5,1]
print(x*y) # [5,14,2]
norm : 원점에서부터의 거리 , 임의의 차원 d에 대해 성립함
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
def angle(x,y):
v = np.inner(x,y) / l2_norm(x) * l2_norm(y))
theta = np.arccos(v)
return theta
벡터를 원소로 가지는 2차원 배열
행렬은 덧셈,뺄셈,성분곱이 가능하며 모두 element wise로 계산
행렬 곱셈은 i번째 행벡터와 j번째 열벡터 사이의 내적
//주의 : numpy의 inner는 i번째 행벡터와 j번재 행벡터 사이의 내적
어떤 행렬 A의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)하고 하고 로 표기. 역행렬은 행과 열 숫자가 같고 행렬식이 0이 아닌 경우에만 계산 가능
역행렬을 계산할 수 없다면 무어펜로즈(Moore-Penrose) 역행렬 을 이용
행렬은 연립방정식, 선형회귀 분석 등에 사용됨
경사하강법은 모델 학습시 loss function의 최소값을 찾기 위해 사용되는 기법.
함수의 주어진 점에서 미분을 통해 접선의 기울기를 구한 후, 그 값을 더하거나 빼서 어느방향으로 움직여야 함수값이 증감하는지 알 수 있음
미분값을 더하는 경우
기울기 값이 음수라면 미분값을 더하면 왼쪽으로 이동하여 함수값이 증가
기울기 값이 양수라면 미분값을 더하면 오른쪽으로 이동하여 함수값이 증가함
미분값을 뺴는 경우
기울기 값이 음수라면 미분값을 빼서 오른쪽으로 이동하여 함수값이 감소
기울기 값이 양수라면 미분값을 빼서 왼쪽으로 이동하여 함수값이 감소
따라서 미분값의 부호에 상관없이 극대값의 위치를 구할때는 미분값을 더하고(경사상승법), 극소값의 위치를 구할때는 미분값을 빼면 됨(경사하강법)
두 방법 모두 극값에 도착하면 미분값이 0이 되어 움직임을 멈추게 됨
경사하강법 : 무어 펜로즈 역행렬을 이용하지 않고 선형 모델(또는 선형 모델이 아닌 모델) 찾는 방법
선형회귀 목적식 : L2 norm : 을 최소화 하는 를 찾아야 함
해당 목적식을 로 미분한 다음 주어진 베타에서 미분값을 빼주면 최소값 구할 수 있음
따라서 그레디언트 벡터를 구해야 함
주의 ! 여기서 사용되는 L2 norm은 n개의 데이터를 가지고 계산되기 때문에 sum한 값을 n으로 나눈 뒤 제곱근을 취해줘야 함
를 계수 에 대해 미분한 결과인 만 곱해지는 것
이렇게 계산된 목적식을 최소화하는 경사하강법 알고리즘
선형회귀의 목적식은 L2 norm이긴 하지만 L2 norm의 제곱을 목적식으로 사용해도 목적식을 최적화하는 방향은 같음 (결국 목적식을 최소화하는 베타를 찾는 것이기 때문에) / 또한 제곱을 하면 미분식이 더욱 깔끔해짐
코드 구현
# norm : L2 norm 계산 함수
# lr : 학습률, T : 학습횟수
for t in range(T):
error = y - X @ beta
grad = - transpose(X) @ error
beta = beta - lr * grad
grad 계산하여 beta 없데이트
학습횟수를 너무 작게하면 수렴이 잘 안됨
학습률을 너무 작게하면 수렴 속도 느림
딥러닝에서 사용되는 함수는 대부분 non-convex하기 때문에 최적값을 찾을 수 없는 경우가 있음
모든 데이터를 사용해서 업데이트하는 대신 데이터 한개 또는 일부(미니배치) 활용하여 업데이트함
딥러닝의 경우 SGD가 경사하강법보다 낫다
데이터의 일부를 사용하기 때문에 연산량이 줄어듬(b/n으로 줄어듬)
원리
미니배치를 이용해서 그래디언드 벡터를 계산하기 때문제 목적식 형태는 조금 바뀌지만 방향은 동일
미니배치는 확률적으로 선택하므로 매번 목적식 모양이 바뀜 -> 볼록 함수가 아닌 non-convex의 경우 local minimum에 도착하더라도 탈출할 수 있음
따라서 지그재그, 왔다갔다하는 방식으로 움직이지만 매번 계산하는 데이터의 수가 작기 떄문에 수렴속도는 경사하강법보다 훨씬 빠름(미니배치를 너무 작게 잡지 않은 이상)
하드웨어적인 원리
미니배치로 쪼개어 병렬적으로 학습 가능
ex) 이미지데이터 256x256X3X1000000 = 2^37
-> 메모리 초과
GPU에서 행렬연산과 모델 파라미터를 업데이트하는 동안 CPU는 전처리와 GPU에 업로드할 데이터를 준비
크기가 3 이상인 행렬에서 가우스 조던외에 역행렬을 더 쉽게 구할 수 있는 방법에 대한 토의 - 없음
무어 펜로즈 역행렬이 존재하기 위해서는 A의 열벡터가 모두 선형독립이어야 한다
이때 행렬에서 열벡터가 선형독립이라는게 어떤 의미를 가지는지에 대한 토의
https://math.stackexchange.com/questions/3133430/pseudoinverse-of-a-matrix
단순 야구게임을 구현하는데에 굉장히 많은 시간을 썼다. 구현 능력을 길러야겠다.