[U stage DAY 3] AI Math (1)

먼지감자·2021년 8월 4일
0

AI Boostcamp 2기

목록 보기
3/48
post-custom-banner

강의 내용 복습

AI Math 1강

벡터

  • 숫자를 원소로 가진 리스트(list) 또는 배열(array)
x = [1,7,2]
x = np.array([1,7,2]) # 행이 하나인 행벡터
  • 공간에서의 한 점
  • 원점으로부터 상대적 위치를 표현

벡터의 연산

  • 스칼라 곱
    벡터에 숫자를 곱해주는 것, 스칼라 곱의 결과 벡터는 길이만 변함
    숫자 > 1 : 길이 늘어남
    숫자 < 1 : 길이 줄어듬
  • 덧셈/뺄셈/성분 곱
    벡터가 같은 모양을 가지면 덧셈, 뺄셈, 성분 곱 가능

    벡터의 덧셈은 다른 벡터로부터 상대적인 위치이동을 표현함 / 뺄셈은 방향을 뒤집은 덧셈

성분곱

  • 코드 구현
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)

norm : 원점에서부터의 거리 , 임의의 차원 d에 대해 성립함

  • L1 norm
    변화량의 절대값을 모두 더함
x1=i=1dxi\lVert x \rVert_1 = \sum_{i=1}^d \left\vert x_i \right\vert

  • L2 norm
    피타고라스 정리를 이용해 유클리드 거리 계산
    x2=i=1dxi2\lVert x \rVert_2 = \sqrt{\sum_{i=1}^d \left\vert x_i \right\vert^2}

  • 코드 구현
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

벡터 간 거리, 각도, 내적

  • 벡터 간 거리
    뺄셈 이용
  • 벡터 간 각도
    L2 노름만 이용 가능
    제 2 코사인 법칙 사용

    이때 분자는 내적으로 계산 가능
    • 코드 구현
def angle(x,y):
	v = np.inner(x,y) / l2_norm(x) * l2_norm(y))
    theta = np.arccos(v)
    return theta
  • 내적
    Proj(x)는 벡터 y로 정사영된 벡터 x의 그림자를 의미
    정사영(orthogonal projection)된 벡터의 길이
    정사영의 길이를 벡터 y 의 길이 y\lVert y \rVert만큼 조정함 값

AI Math 2강

행렬

벡터를 원소로 가지는 2차원 배열
행렬은 덧셈,뺄셈,성분곱이 가능하며 모두 element wise로 계산
행렬 곱셈은 i번째 행벡터와 j번째 열벡터 사이의 내적
//주의 : numpy의 inner는 i번째 행벡터와 j번재 행벡터 사이의 내적

역행렬

어떤 행렬 A의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)하고 하고 A1A^{-1}로 표기. 역행렬은 행과 열 숫자가 같고 행렬식이 0이 아닌 경우에만 계산 가능

무어펜로즈 역행렬

역행렬을 계산할 수 없다면 무어펜로즈(Moore-Penrose) 역행렬 A+A^{+}을 이용

행렬은 연립방정식, 선형회귀 분석 등에 사용됨

AI Math 3강

경사하강법

경사하강법은 모델 학습시 loss function의 최소값을 찾기 위해 사용되는 기법.
함수의 주어진 점에서 미분을 통해 접선의 기울기를 구한 후, 그 값을 더하거나 빼서 어느방향으로 움직여야 함수값이 증감하는지 알 수 있음

  • 미분값을 더하는 경우
    기울기 값이 음수라면 미분값을 더하면 왼쪽으로 이동하여 함수값이 증가
    기울기 값이 양수라면 미분값을 더하면 오른쪽으로 이동하여 함수값이 증가함

  • 미분값을 뺴는 경우
    기울기 값이 음수라면 미분값을 빼서 오른쪽으로 이동하여 함수값이 감소
    기울기 값이 양수라면 미분값을 빼서 왼쪽으로 이동하여 함수값이 감소

따라서 미분값의 부호에 상관없이 극대값의 위치를 구할때는 미분값을 더하고(경사상승법), 극소값의 위치를 구할때는 미분값을 빼면 됨(경사하강법)
두 방법 모두 극값에 도착하면 미분값이 0이 되어 움직임을 멈추게 됨

  • 그래디언트 벡터
    벡터가 입력인 다변수 함수인 경우 각 변수별로 편미분을 계산한 그래디언트 벡터를 계산함

AI Math 4강

경사하강법 : 무어 펜로즈 역행렬을 이용하지 않고 선형 모델(또는 선형 모델이 아닌 모델) 찾는 방법

경사하강법 기반의 선형회귀 알고리즘

  • 선형회귀 목적식 : L2 norm : yXβ2\lVert y - X\beta\rVert_2 을 최소화 하는 β\beta를 찾아야 함
    해당 목적식을 β\beta로 미분한 다음 주어진 베타에서 미분값을 빼주면 최소값 구할 수 있음
    따라서 그레디언트 벡터를 구해야 함

  • 주의 ! 여기서 사용되는 L2 norm은 n개의 데이터를 가지고 계산되기 때문에 sum한 값을 n으로 나눈 뒤 제곱근을 취해줘야 함

    βyXβ2=(β1yXβ2,...,βdyXβ2)=XT(yXβ)nyXβ2\begin{matrix} \nabla_\beta \lVert y-X\beta \rVert_2 &=&(\partial_\beta1 \lVert y-X\beta \rVert_2 , ... , \partial_\beta d \lVert y-X\beta \rVert_2) \\ &=& -{X^T(y-X\beta) \over n\lVert y-X\beta \rVert_2} \end{matrix}

    XβX\beta를 계수 β\beta에 대해 미분한 결과인 XTX^T만 곱해지는 것

    이렇게 계산된 목적식을 최소화하는 경사하강법 알고리즘

    β(t+1)β(t)λβyXβ(t)β(t)+λnXT(yXβ)nyXβ2\begin{matrix} \beta^{(t+1)} &\longleftarrow& \beta^{(t)} - \lambda \partial_\beta \lVert y-X\beta^{(t)} \rVert \\ &\longleftarrow& \beta^{(t)} + {\lambda \over n} {X^T(y-X\beta) \over n\lVert y-X\beta \rVert_2} \end{matrix}
  • 선형회귀의 목적식은 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하기 때문에 최적값을 찾을 수 없는 경우가 있음

확률적 경사하강법(stochastic gradient descent)

  • 모든 데이터를 사용해서 업데이트하는 대신 데이터 한개 또는 일부(미니배치) 활용하여 업데이트함
    딥러닝의 경우 SGD가 경사하강법보다 낫다

  • 데이터의 일부를 사용하기 때문에 연산량이 줄어듬(b/n으로 줄어듬)

  • 원리

    • 미니배치를 이용해서 그래디언드 벡터를 계산하기 때문제 목적식 형태는 조금 바뀌지만 방향은 동일

    • 미니배치는 확률적으로 선택하므로 매번 목적식 모양이 바뀜 -> 볼록 함수가 아닌 non-convex의 경우 local minimum에 도착하더라도 탈출할 수 있음
      따라서 지그재그, 왔다갔다하는 방식으로 움직이지만 매번 계산하는 데이터의 수가 작기 떄문에 수렴속도는 경사하강법보다 훨씬 빠름(미니배치를 너무 작게 잡지 않은 이상)

    • 하드웨어적인 원리
      미니배치로 쪼개어 병렬적으로 학습 가능
      ex) 이미지데이터 256x256X3X1000000 = 2^37
      -> 메모리 초과

      GPU에서 행렬연산과 모델 파라미터를 업데이트하는 동안 CPU는 전처리와 GPU에 업로드할 데이터를 준비


과제 수행 과정 및 결과

  • 필수과제 4.
    야구게임. python 구현 과제
  • 필수과제 5.
    문자열을 이용하여 모스부호를 인코딩, 디코딩하는 과제라서 str 내부 모듈과 re 모듈을 사용하여 구현

피어 세션

  1. 크기가 3 이상인 행렬에서 가우스 조던외에 역행렬을 더 쉽게 구할 수 있는 방법에 대한 토의 - 없음

  2. 무어 펜로즈 역행렬이 존재하기 위해서는 A의 열벡터가 모두 선형독립이어야 한다
    이때 행렬에서 열벡터가 선형독립이라는게 어떤 의미를 가지는지에 대한 토의
    https://math.stackexchange.com/questions/3133430/pseudoinverse-of-a-matrix


학습 회고

단순 야구게임을 구현하는데에 굉장히 많은 시간을 썼다. 구현 능력을 길러야겠다.

profile
ML/AI Engineer
post-custom-banner

0개의 댓글