확률론 맛보기

딥러닝에서 확률론이 필요한 이유

  • 딥러닝은 확률론 기반의 기계학습 이론에 바탕을 둔다.
  • 손실함수 등의 작동원리가 데이터 공간을 통계적으로 해석해서 유도하기 때문.
  • 회귀분석에서 손실함수로 사용되는 L2-노름은 예측오차의 분산을 가장 최소화하는 방향으로 학습
  • 분류문제에서 사용되는 교차엔트로피(cross-entropy)는 모델 예측의 불확실성을 최소화하는 방향으로 학습
  • 분산 및 불확실성을 최소화하기 위해서는 측정 방법을 알아야한다.

확률분포

  • 확률분포란 데이터 공간에서 데이터를 추출하는 분포이다.
  • 데이터는 확률변수로 (x, y) ~ D 라고 표기한다.
  • 결합분포 P(x, y)는 D를 모델링한다.
    • D는 이론적으로 존재하는 확률분포이기 때문에 사전에 알 수 없다.

확률변수

이산확률변수

  • 이산형 확률변수는 확률변수가 가질 수 있는 경우의 수를 모두 고려하여 확률을 더해서 모델링한다.

연속확률변수

  • 연속형 확률변수는 데이터 공간에 정의된 확률변수의 밀도 위에서의 적분을 통해 모델링한다.
  • 밀도함수는 누적확률분포의 변화율을 모델링한 것으로 확률로 해석해서는 안된다.

조건부확률과 기계학습

자세히 보기

딥러닝 학습방법 이해하기

비선형모델 신경망

  • 신경망 모델은 기본적으로 비선형 모델이지만, 보통 선형 모델과 비선형 모델의 결합으로 이루어져 있다.

  • 소프트맥스(softmax) 연산

    • 모델의 출력을 확률로 해석할 수 있게 변환해주는 연산임.

    • 분류 문제를 풀 때 선형모델과 소프트맥스 함수를 결합하여 예측한다.

    • def softmax(vec):
          denumerator = np.exp(vec = np.max(vec, axis=-1, keepdims=True))
          numerator = np.sum(denumerator, axis=-1, keepdims=True)
          val = denumerator / numerator
          return val
      
  • 신경망은 선형모델과 활성함수(activation function)을 합성한 함수이다.

  • Multi-layer Perceptron(MLP)은 신경망이 여러층 합성된 함수이다.

활성함수

  • 활성함수는 비선형함수이다.
  • 활성함수를 쓰지 않으면 딥러닝은 선형모형과 차이가 없다.
  • 시그모이드 함수나 tanh 함수는 전통적으로 많이 쓰이던 활성함수지만 딥러닝에선 ReLU 함수를 많이 쓰고 있다.

층을 여러 개 쌓는 이유

  • 이론적으로는 2층 신경망으로도 임의의 연속함수를 근사할 수 있다.
  • 층이 깊을수록 목적함수를 근사하는데 필요한 뉴런(노드)의 숫자가 훨씬 빨리 줄어들어 좀 더 효율적으로 학습이 가능하다.
    • 층이 얇으면 필요한 뉴런의 숫자가 기하급수적으로 늘어나서 넓은(wide) 신경망이 되어야 한다.

딥러닝 학습원리: 역전파 알고리즘

  • 딥러닝은 역전파(backpropagation) 알고리즘을 이용하여 각 층에 사용된 파라미터를 학습한다.
  • 역전파 알고리즘은 합성함수 미분법인 ‘연쇄법칙(chain-rule)’ 기반 자동미분(auto-differentiation)을 사용한다.
자세히 보기

경사하강법

미분

  • 미분은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 가장 많이 사용하는 기법이다.
  • 미분은 함수 f의 주어진 점 (x, f(x))에서의 접선의 기울기를 구한다.
  • 미분값을 더하면 경사상승법(gradient ascent)이라 하며, 함수의 극대값의 위치를 구할 때 사용한다.
  • 미분값을 빼면 경사하강법(gradient descent)이라 하며, 함수의 극소값의 위치를 구할 때 사용한다.
  • 경사상승/경사하강법은 극값에 도달하면 움직임을 멈춘다.
1
2
3
4
5
6
7
8
# gradient: 미분 계산 함수
# init: 시작점, lr: 학습률, eps: 알고리즘 종료조건

var = init
grad = gradient(var)
while(abs(grad) > eps):
var = var - lr * grad
grad = gradient(var)
  • 미분은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로서, 최적화에서 제일 많이 사용하는 기법이다.
  • 벡터가 입력인 다변수 함수의 경우 편미분(partial differentiation)을 사용한다.
  • 각 변수 별로 편미분을 계산한 그래디언트 벡터(gradient vector)를 이용하여 경사하강/상승법에 사용할 수 있다.
    • Nabla(역삼각형) 기호로 표기

역행렬을 이용한 선형회귀분석

  • np.linalg.pinv 를 이용하면 데이터를 선형모델로 해석하는 선형회귀식을 찾을 수 있다.

  • 행렬 X(n, m)에서 n >= m인 경우,

    • XB = y_hat ~= y

      -> B = X^+ * y (L2-노름을 최소화)

      -> = (X^T X)^-1 X^T * y

  • 선형모델의 경우 역행렬을 이용하여 회귀분석이 가능하다.

경사하강법을 이용한 선형회귀분석

  • 선형회귀의 목적식은 ||y - XB||2 이고, 이를 최소화하는 B를 찾아야 하므로 아래와 같은 그래디언트 벡터를 구해야 한다.

  • # norm: L2-노름을 계산하는 함수
    # lr: 학습률, T: 학습횟수
    
    for t in range(T):
        error = y - X @ beta
        grad = - transpose(X) @ error
        beta = beta - lr * grad
    
  • 이론적으로 경사하강법은 미분가능하고 볼록(convex)한 함수에 대해선 적절한 학습률과 학습횟수를 선택했을 때 수렴이 보장되어 있다. (볼록한 함수는 그래디언트 벡터가 항상 최소점을 향하기 때문)

확률적 경사하강법(SGD, Stochastic Gradient Descent)

  • 확률적 경사하강법은 모든 데이터가 아닌 데이터 한 개 또는 일부(mini batch)를 활용하여 업데이트한다.
  • 볼록함수가 아닌(non-convex) 목적식은 SGD를 통해 최적화할 수 있다.
  • SGD는 데이터의 일부를 가지고 파라미터를 업데이트하기 때문에 연산자원을 좀 더 효율적으로 활용하는데 도움이 된다.
    • 전체 데이터(X, y)를 쓰지 않고 미니배치(X(b), y(b))를 사용하여 업데이트하므로 연산량이 b / n 으로 감소한다.
자세히 보기

협업을 위한 Git 사용 매뉴얼 순한맛

사전준비

  1. git init
  2. git config --global user.name "YOUR_GITHUB_NAME"
  3. git config --global user.email "YOUR GITHUB_EMAIL"

위 세 단계가 이루어지지 않으면 private 레포지토리에 접근할 수 없을 수도 있습니다!

USAGE

  1. git clone "YOUR_REPOSITORY" 관리할 레포지토리를 clone.
  2. cd "YOUR_REPOSITORY" clone 받은 레포지토리로 change directory
  3. git checkout -b "BRANCH_NAME" 을 통해 브랜치를 생성하고 해당 브랜치로 전환.
  4. git add & commit
  5. git push origin "BRANCH_NAME" add/commit 한 내역들을 BRANCH_NAME 브랜치에 push한다.
    • push 가 되어있지 않다면, git pull origin "BRANCH_NAME" 을 시도해볼 것.
  6. 브라우저로 해당 레포지토리로 이동한 후, push한 브랜치로 변경한다.
  7. compare & pull request 버튼을 클릭한다.
  8. pull request를 날리고 싶은 브랜치(head) 를 설정하고 pull request 버튼을 클릭한다.
  9. 다른 팀원들이 리뷰 및 커멘트를 날리고 리뷰가 끝났다면, Merge를 한다.

명령어

  1. git checkout -b "BRANCH_NAME" BRANCH_NAME으로 된 브랜치를 생성하고 현재 브랜치를 생성한 브랜치로 변경한다.
  2. git checkout "BRANCH_NAME" 현재 브랜치를 “이미 생성되어 있는 BRANCH_NAME”으로 변경한다.
  3. git branch -d "BRANCH_NAME" BRANCH_NAME으로 되어있는 브랜치를 삭제한다.
  4. git remote -v 깃에 연결된 원격저장소를 확인한다.
  • 추가예정

그 외 팁들

  1. 커밋메세지 템플릿 적용하기

    • touch ~/.gitmessage.txt gitmessage.txt 파일을 생성한다.

    • vim 등의 에디터로 gitmessage.txt 파일에 아래 내용을 복사&붙여넣기 한다.

      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
      # <타입>: <제목>

      ##### 제목은 최대 50 글자까지만 입력 ############## -> |


      # 본문은 위에 작성
      ######## 본문은 한 줄에 최대 72 글자까지만 입력 ########################### -> |

      # 꼬릿말은 아래에 작성: ex) #이슈 번호

      # --- COMMIT END ---
      # <타입> 리스트
      # feat : 기능 (새로운 기능)
      # fix : 버그 (버그 수정)
      # refactor: 리팩토링
      # style : 스타일 (코드 형식, 세미콜론 추가: 비즈니스 로직에 변경 없음)
      # docs : 문서 (문서 추가, 수정, 삭제)
      # test : 테스트 (테스트 코드 추가, 수정, 삭제: 비즈니스 로직에 변경 없음)
      # chore : 기타 변경사항 (빌드 스크립트 수정 등)
      # ------------------
      # 제목 첫 글자를 대문자로
      # 제목은 명령문으로
      # 제목 끝에 마침표(.) 금지
      # 제목과 본문을 한 줄 띄워 분리하기
      # 본문은 "어떻게" 보다 "무엇을", "왜"를 설명한다.
      # 본문에 여러줄의 메시지를 작성할 땐 "-"로 구분
      # ------------------
    • git config --global commit.template ~/.gitmessage.txt 해당 gitmessage.txt를 전역 커밋 템플릿으로 설정한다.

  2. Alias 적용하기. 아래와 같이 alias 를 (맥이라면 ./zshrc) 저장하면 단축어로 사용할 수 있다.

자세히 보기