일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
- 주간회고
- 부스트캠프_AITech3기
- 알고리즘_스터디
- 구현
- 기술면접
- 그리디
- dp
- 최단경로
- python3
- 백트랙킹
- ODQA
- 글또
- 프로그래머스
- 그래프이론
- 이진탐색
- Level1
- 다시보기
- U_stage
- mrc
- Level2_PStage
- Level2
- dfs
- 파이썬 3
- 단계별문제풀이
- 부스트캠프_AITech_3기
- 정렬
- 이코테
- 알고리즘스터디
- 백준
- 개인회고
- Today
- Total
국문과 유목민
[일일리포트] Day 03 본문
해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수 없어, 핵심 이론과 코드 위주로 정리하고 있기에 내용이 부족할 수 있습니다.
▶ Today I Learned (핵심 요약 정리)
DeepLearningBasic(딥러닝 기초)
- 비선형모델 신경망: 각 행벡터 $O_i$는 데이터 $X_i$와 가중치 행렬 $W$사이의 행렬곱과 절편 $b$합으로 표현된다고 가정한다. $O = XW+b$ 로 이루어진 비선형모델 $O$는 데이터 $X$와 가중치 $W$의 행렬곱에 $b$를 더한 값이다.
- 소프트 맥스: 모델의 출력을 확률로 해석할 수 있게 반환해주는 연산이다. 분류 문제를 풀 때는 선형 모델 + 소프트맥스 함수의 결합으로 예측한다. 추론을 할 때는 쓰지 않는다 (one-hot vector를 사용하기 때문이다)
- 활성함수: 비선형 함수로서 딥러닝에서 매우 중요한 개념이다. 활성함수를 쓰지 않으면 딥러닝은 선형 모형과 차이가 없다. 시그모이드. 하이퍼볼릭탄젠트, ReLU와 같은 함수가 있지만 딥러닝에서는 ReLU함수를 많이 사용한다.
잠재벡터 $H$에서 가중치 행렬 $W^{(2)}$와 $b^{(2)}$를 통해 다시 한 번 선형변환해서 출력하게 되면 ($W^{(2)}, W^{(1)}$)를 패러미터로 가진 2-layers(2층) [2-layers인 이유는 가중치 행렬을 2개 사용하기 때문] 신경망이 된다. 다층 퍼셉트론(MLP)은 신경망이 여러층 합성된 함수이다. - 신경망(★): 선형모델과 활성함수를 합성한 함수이다. 활성함수 $\sigma$는 비선형함수로 잠재벡터 $z$의 각 노드에 개별적으로 적용하여 새로운 잠재벡터 $H$를 만든다. 그리고 이러한 벡터를 뉴런이라고 부른다. 선형모델로 나온 출력물을 활성함수로 한번 씌우게 된 기본적인 뉴럴네트워크를 Perceptron이라고 한다.
Q.층을 여러개 쌓는 이유?
A. 이론적으로는 2층 신경망으로도 임의의 연속함수를 근사할 수 있지만, MLP 층이 깊을수록 목적함수를 근사하는데 필요한 뉴런의 숫자가 훨씬 빨리 줄어 효율적으로 학습이 가능하다.
- 역전파 알고리즘 (BackPropagation): 순전파를 통해서 계산된 그레디언트 벡터를 이용해서 연쇄법칙(chain-rule)을 통해 역순서로 그레디언트를 전달한다. 각각의 가중치행렬을 계산하고 SGD를 이용해서 각각의 파라미터를 미니배치로 번갈아 가면서 학습하게 됨으로써 주어진 목적식을 최소화하는 파라미터들을 찾을 수 있다.
딥러닝은 선형모델과 활성함수의 합성함수이고, 그레디언트를 계산하기 위해 체인룰이 필요한 것이고, 체인룰을 활용하기 위해 역전파을 이용한다.
ProbabilityBasic(확률론 기초)
딥러닝과 확률론: 딥러닝은 확률론 기반의 기계학습 이론에 바탕을 둔다. 분산이나 불확실성을 최소화하는 방법 등 기계학습을 이해하기 위해서는 확률론의 기본 개념을 알아야 한다.
확률분포 (★)
- 확률분포는 데이터의 초상화라고 할 수 있다.
- 확률변수는 데이터 공간 상의 관측 가능한 임의의 데이터를 의미한다.
- 결합분포 $P(x, y)$는 $D$를 모델링한다. $D$는 이론적으로 존재하는 확률분포이다.
- 주변확률분포 $P(X)$는 입력 x에 대한 것으로 y에 대한 정보를 주진 않는다. 주변확률분포는 결합분포에서 유도 가능하다.
- 조건부확률분포 $P(x|y)$는 데이터 공간에서 입력 x와 출력 y사이의 관계를 모델링한다. $P(x|y)$는 특정 클래스가 주어진 조건에서 데이터의 확률분포를 보여준다.
확률변수: 이산확률변수, 연속확률변수는 확률분포의 종류에 의해 결정된다.
- 이산확률변수: 확률변수가 가질 수 있는 경우의 수를 모두 고려하여 확률을 더해 모델링한다.
- 연속확률변수: 데이터 공간에 정의된 확률변수의 밀도 위에서의 적분을 통해 모델링한다. 밀도는 누적확률분포의 변화율을 모델링하며 확률로 해석하면 안된다.
조건부확률: 조건부 확률 $P(y|x)$는 입력변수 x에 대해 정답이 y일 확률을 의미한다. 연속확률분포의 경우 확률이 아니고 밀도로 해석한다.
- 분류문제의 경우 $softmax(W\phi+b)$은 데이터 $x$로부터 추출된 특징패턴 $\phi(x)$과 가중치행렬 $W$을 통해 조건부확률 $P(y|x)$을 계산한다.
- 회귀문제의 경우 조건부기대값 $E[y|x]$을 추정한다. 조건부 기대값은 $L_2$norm을 최소화하는 함수 $f(x)$와 일치한다.
기댓값: 데이터를 대표하는 통계량이며, 평균으로 이해할 수 있다.
- 기댓값으로 연속확률분포의 경우엔 적분을 이산확률분포의 경우엔 급수를 사용한다.
- 확률분포의 종류에 따라서 계산방법이 달라진다. 기댓값을 이용해 분산, 첨도, 공분산 등 여러 통계량을 계산할 수 있다.
몬테카를로 샘플링: 기계학습의 많은 문제들은 확률분포를 명시적으로 모르는 경우가 많기에, 데이터를 이용해 기댓값을 계산기위해 사용하는 방법.
- 단, 값을 계산할 때, 만약 샘플 사이즈가 너무 적으면 오차가 커질 수가 있다.
StatisticBasic(통계학 기초)
모수: 유한한 개수의 데이터만 관찰해서는 모집단의 분포를 정확하게 알아낼 수 없다. 따라서 근사적으로 확률분포를 추정할 수밖에 없다. 이 때, 데이터가 특정확률분포를 따른다고 선험적(a prior)으로 가정한 후 그 분포를 결정하는 모수를 추정하는 방법을 모수적 방법론이라고 한다. 추가적으로 데이터에 따라 모델의 구조 및 모수의 개수가 유연하게 바뀌면 '비모수(nonparametric) 방법론'이라 부른다. (모수를 안 쓰는게 아님)
- 확률분포 가정방법
- 데이터가 2개의 값(0, 1)만 가지는 경우 → 베르누이 분포
- 데이터가 n개의 이산적인 값을 가지는 경우 → 카테고리 분포
- 데이터가 [0, 1]사이에서 값을 가지는 경우 → 베타 분포
- 데이터가 0이상의 값을 가지는 경우 → 감마분포, 로그정규분포 등
- 데이터가 R전체에서 값을 가지는 경우 → 정규분포, 라플라스분포 등
단, 기계적으로 확률분포를 가정하면 안되며, 데이터 생성 원리를 먼저 고려하는 것이 원칙이다. 그리고 각 분포마다 검정하는 방법들이 있기에 모수 추정 후 반드시 통계적 검정이 필요하다
모수추정: 데이터의 확률분포를 가정했으면 모수추정을 할 수 있다. 정규분포의 모수는 평균 $\mu$과 분산 $\sigma^{2}$이 있다.
$$\begin{matrix}\text{기댓값} &=&\mu_X = E[X] = \frac{1}{N}\sum_{i=1}^{N}X_i \\ 분산 &=& \sigma^2 = Var[X] = E[(X-\mu)^2]\end{matrix}$$
$$\begin{matrix}표본평균의 분산 &=& Var[\bar{X}] = \frac{1}{N}Var[X] \\ 비편향 표본분산 &=& Var[\bar{X}] = \frac{1}{N-1}\sum(X_i-\bar{X})^2\end{matrix}$$
- 표본분산을 구할 때, $N$이 아니라 $N-1$로 나누는 이유는 불편 추정량을 구하기 위해서이다.
- 중심극한정리: 통계량의 확률분포를 표집분포(sampling distribution)라 부르며, 특히 표본평균의 표집분포는 $N$이 커질수록(데이터가 많을수록) 정규분포를 따른다. 이를 중심극한정리라 부른다. 모집단의 분포는 정규분포를 따르지 않아도 된다.
최대가능도 추정법 (MLE, Maximun Likelihood Estimation):
이론적으로 가장 가능성이 높은 모수를 추정하는 방법이다. 가능도(likelihood) 함수는 모수 $\theta$를 따르는 분포가 데이터 $X$를 관찰할 가능성을 뜻하지만 이 자체를 확률로 해석하면 안된다.
- 로그가능도(LogLikelihood): 데이터가 수억개로 커지게 되면 컴퓨터의 정확도로는 가능도를 계산하는 것이 불가능하다. 하지만 로그가능도를 사용하게 되면 효율적으로 연산을 할 수 있는데, 특히 경사하강법으로 최적화할 때 로그가능도 연산을 활용하면 연산량을 $O(n^2)$ 에서 $O(n)$으로 줄여준다. 그리고 대개 손실함수의 경우 경사하강법을 사용하기에 음의 로그가능도를 활용해 최적화한다.
최대가능도 추법(분포에 따라)
- 정규분포: 두 미분이 모두 0이 되는 $\mu$, $\sigma$를 찾으면 가능도를 최대화하게 된다. MLE는 불편추정량을 보장하지 않기 때문에 그냥 n으로 나눈다.
$$\begin{matrix}
\hat{\mu}MLE &=& \frac{1}{n}\sum_{i=1}^n x_i\\
\hat{\sigma}MLE &=& \frac{1}{n}\sum_{i=1}^n (x_i-\mu)^2
\end{matrix}$$
- 카테고리분포: 라그랑주 승수법을 통해서 목적식에 lambda를 추가함으로써 최적화 문제를 풀 수 있다. 그리고 카테고리 분포의 MLE는 각각의 차원에 해당하는 경우의 수를 세어서 비율을 구하는 것이다. 우리가 추정하는 모수 ($p_1$, ...., $p_d$)까지는 카테고리 분포의 확률질량함수에 해당하는 모수이다. 따라서 카테고리 분포의 모수는 다음 제약식을 만족해야 한다. ($\sum_{k=1}^d p_k = 1$)
$$\sum_{k=1}^d n_k logp_k$$ - 딥러닝에서 최대가능도 추정법(★): 딥러닝 모델의 가중치를 $\theta$라고 할 때, 분류 문제에서 소프트맥스 벡터는 카테고리분포의 모수로 모델링한다. 원핫벡터로 표현한 정답 레이블 y를 관찰데이터로 이용해 확률분포인 소프트맥스 벡터의 로그 가능도를 최적화할 수 있다. 정답레이블 벡터의 원소의 개수는 1이 아니다.
$$
\hat{\theta}_{MLE} = argmax_{\theta} \frac{1}{n} \sum_{i=1}^n\sum_{k=1}^K y_{i, k} log(MLP_\theta(x_i)_k)
$$
확률분포의 거리: 손실함수들은 모델이 학습하는 확률분포와 데이터에서 관찰되는 확률분포의 거리를 통해 유도한다.두 확률분포 사이의 거리를 계산할 때, 총변동 거리, 쿨백-라이블러 발산, 바슈타인 거리 등을 활용할 수 있다.
- 쿨백-라이블러 발산: 이산확률변수는 sum, 연속확률변수는 적분을 활용한다.
쿨백-라이블러는 크로스엔트로피와 엔트로피로 분해할 수 있다. 분류문제에서 정답레이블을 $P$, 모델 예측을 $Q$라 두고 쿨백-라이블러 발산을 최소화하는 것을 보면, 로그가능도를 최대화하는 개념과 밀접하게 연관되어있다는 것을 알 수 있다. 즉, 기계학습의 원리는 데이터로부터 확률분포 사이의 거리를 최소화하는 것과 동일한 것으로 이해할 수 있다.
파이썬 기초(OOP, Module)
- class(클래스)
class SoccerPlayer(object):
def __init__(self, name, position, back_number):
self.name = name
self.position = position
self.back_number = back_number
def __str__(self):
return f"선수정보 {self.name}"
def method(self, new_param):
self.back_number = new_param
son = SoccerPlayer("sonHM", "FW", 10)
print(son)
# 출력: 선수정보 son
- OOP특성: Inheritance, Polyorphism, Visibility, Encapsulation
- decorator: @ (이해하기 쉽지는 않음. Wrapper클래스와 연관)
def star(func):
def inner(*args, **kwargs):
print("*"*30)
func(*args, **kwargs)
print("*"*30)
return inner
@star
def printer(msg):
print(msg)
printer("Hello")
"""
******************************
Hello
******************************
"""
- 가상환경 설정하기 (Virtual Environment): 프로젝트 진행 시 필요한 패키지만 설치하는 환경
- 생성: conda create -n 가상환경명 python=3.9
- 활성화/비활성화: conda activate 가상환경명 / conda deactivate
- 라이브러리 설치: conda intstall 패키지명
- 가상환경 리스트 확인: conda info --envs
▶ Review (생각)
오늘 좀 많은 분량을 많이 나간 것 같다는 것을 정리하면서 깨달아버렸다. 확실히 확률, 통계 부분은 이전에 배웠다고 하더라도 어려운 것 같다. 그래도 다행인 점은 예전에 들었을 때보다는 조금 더 이해할 수 있게 되었다는 것이라고 생각한다. 그래도 강의를 들으면서 DL과 확률, 통계가 연관이 있는지에 대해서 조금 더 깊게 알게 된 것 같다. 수학적으로 식을 이해하는 부분에서는 조금 부족했지만, 수학이 왜 필요한지에 대한 당위성 측면에서는 어느정도 의문이 해결됐던 것 같다.
추가적으로 오늘 피어세션에 코드리뷰를 진행했는데, 다른 분들의 코드를 통해 또 배울 점이 있었던 것 같다. 특히 기억에 남는 것은 정규식을 활용해서 쉽게 문제를 해결하는 모습을 보면서 뭔가 정규식을 잘 활용하고 싶다는 생각을 하게 됐다. 정규식에 대해서 계속해서 결핍감을 갖고 있었는데 시간을 잡아서 정규식에 대해서 조금 더 깊게 이해해보는 시간을 가져야겠다. 나중에 이와 관련해서 포스팅으로 정리하는 것도 나쁘지 않은 것 같다.
'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글
[1주차] 학습 정리 및 회고 (0) | 2022.01.21 |
---|---|
[일일리포트] Day 05 (0) | 2022.01.21 |
[일일리포트] Day 04 (0) | 2022.01.20 |
[일일리포트] Day 02 (1) | 2022.01.18 |
[일일리포트] Day 01 (머신러닝 기초) (0) | 2022.01.17 |