네이버 부스트캠프 AI Tech 2기

[08.04] Day3 - '확통공부 다시..😵‍💫 + Numpy 기능들 + CNN'

Jay x 2 2021. 8. 6. 22:32
728x90
반응형

🧐 통계학 맛보기(AI Math 7강)

[수업 내용]

강사 : 임성빈 교수님

모수란?

통계적 모델링은 적절한 가정 위에서 데이터의 확률분포를 추정하는 것이 목표.

유한한 개수의 데이터만으로 모집단의 분포를 정확하게. 알아내는 것은 불가능하다. 그래서 근사적으로 확률분포를 추정할 수 밖에 없다.

  • 모수 방법론 : 데이터가 어떤 확률분포가 따른다고 가정하고(선험적) 그 분포를 결정하는 모수를 추정하는 방법(모수는 모집단의 특성을 나타내는 값이다.)
  • 비모수 방법론 : 확률분포를 가정하지 않고 데이터에 따라 모델의 구조, 모수의 개수가 유연히 바뀐다.(모수가 없는 것이 아니다. 무한히 많거나 데이터에 따라 바뀌는 것이다. 그래서 모수가 없다라고 하는 것은 아니니 주의한다.)

확률분포 가정하기

  1. 히스토그램을 통해서 모양을 본다.
  2. 2개만 있는 경우 → 베르누이 분포
  3. N개의 이산적인 값인 경우 → 카테고리분포, 다항분포
  4. 0~1사이 실수값인 경우 → 베타 분포
  5. 0이상의 값, 실수전체인 경우 → 감마분포, 로그정규분포, 정규분포, 라플라스 분포 등

주의) 기계적으로 확률분포를 가정하는 것은 안된다! 데이터 생성 원리를 먼저 고려, 관찰하고 어떤 확률분포가 적절한지 따지는 것이 맞는 방법이고 중요하다.

ex) 정규분포의 모수는 두가지를 가진다.(왼쪽 : 평균, 오른쪽 : 분산(N으로 나눠주는 것이 아니라 N-1로 나눠주는 것이 특징이다.)

이런 평균, 분산을 통해서 데이터의 확률분포의 모수를 추정할 수 있고, 이 모수를 가지고 원래데이터를 또 추정할 수 있고 그래서 예측이나 다른 통계적 분석에 쓰인다.

표본분포(sampling distribution) - 통계량의 확률분포(표본에서 도출되는 통계량에 대한 확률분포)

: N이 커질 수록 정규분포를 따르게 된다. → 중심 극한 정리 (표집분포 ≠ 표본분포)

표본평균의 오차 : 표본으로부터 모수를 추정했을때, 모수와 통계량 간의 차이

N이 충분히 크다면 모수를 몰라도, 표본 통계량으로 정규분포를 구성해서 모수를 추정할 수 있다.

중심 극한 정리

최대가능도 추정법(MLE)

확률분포마다 사용하는 모수가 다르므로 적절한 통계량이 달라지게된다.

: 이론적으로 가장 가능성 높은 모수를 추정하는 방법 → 최대가능도 추정법

가운데 L 함수가 가능도 함수이다. 모수를 따르는 분포가 x를 관찰할 가능성을 뜻한다.(확률로 해석하면 안된다.), 세타에 따라 변화하는 함수.

데이터 셋의 행벡터가 독립적으로 추출되었을때, 로그가능도를 최적화한다. 곱을 사용하지만, 로그를 사용해서 덧셈으로 구할 수 있다.

Why? 로그를 사용하나

원래 가능도나 로그 가능도나 똑같이 MLE가 된다.

근데 왜 굳이 log인가

  1. 데이터가 엄청 많을때, 컴퓨터에서 연산 오차가 발생한다. 원래 가능도를 가지고 판단하는 것이 쉽지 않다. 그래서 Log를 사용해서 덧셈을 쓴다면 수억단위 데이터라도 최적화가 가능하다.
  2. 경사하강법의 가능도를 최적화할때 미분연산을 하는데, 로그 가능도는 O(n^2) → O(n)으로 시간복잡도를 줄여준다.(대부분 Loss 함수는 경사하강법을 사용하기 때문에 음의 로그가능도를 최적화한다.)

1. 정규분포를 예제로 최대가능도를 추정해본다.(연속 확률 분포)

확률분포 X에서 모든 표본이 독립적이라고 할때, 최대가능도 추정법으로 모수를 추정하게 된다면?

정규분포 함수에 로그를 씌운 형태로 표현하며, 평균을 가진항, 분산을 가진항 두부분으로 나눌 수 있게 된다.(로그의 성질로)

이 부분을 평균과 분산으로 각각 미분하면 두개의 수식을 얻게 된다.

위는 로그가능도를 평균으로 미분한 식이고 아래는 로그가능도를 분산으로 미분한 식이다.

주어진 수식들의 0이되는 평균과 분산을 구하게 된다면,

평균에 대한 최대가능도 추정법으로 추정된 모수

분산에 대한 최대가능도 추정법으로 추정된 모수

(재밌는 점, 앞에서 추정된 모수에서는 N-1로 나누지만, 여기는 N으로 나눠진다.)

2. 카테고리 분포를 예제로 최대가능도를 추정해본다.(이산 확률 분포)

(p1 ~ pd 를 다더하면 1이 되는 성질이 있다.)

이도, 로그 가능도로 변환한다면 덧셈 연산으로 바꿀 수 있다.

(Xik는 0 또는 1이다. 그래서 안에 nk는 갯수를 카운트하는 역할을 하게 된다. 즉, 각 차원별로 덧셈을 표현할 수 있다. 주어진 각 데이터 xi에 대해서 k가 1(차원)인 갯수를 세는 것을 의미한다.)

라그랑주 승수법으로 최적화가 가능하다. 람다에 목적식을 곱한 식이 추가가 된다.

각각 Pk에 대해 미분, 라그랑주 승수 람다에 대해 미분 두 식을 구할 수 있고

이 값들이 0을 만족시키도록 최적화가 진행된다.

정리 : 카테고리 분포의 MLE는 경우의 수를 세어 비율을 구하는 것이다.

3. 딥러닝에서 최대가능도를 추정해본다.

최대 가능도 추정법으로 기계학습 모델을 학습할 수 있다.

우선 모든 레이어의 가중치 벡터를 세타로 묶을 수 있다. 소프트맥스함수의 최적은 카테고리 분포의 최적과 동일하기 때문에 같은 MLE를 적용한다.

확률 분포사이의 거리

: 기계학습에서 손실함수들은 모델이 학습하는 확률분포데이터에서 관찰되는 확률분포의 거리를 통해 유도된다.

  1. 쿨백 - 라이블러 발산
  2. 총변동 거리
  3. 바슈타인 거리

쿨백 - 라이블러 발산

분류 문제에서 정답레이블을 P, 모델 예측을 Q라고 두면 최대가능도 추정법은 쿨백-라이블러 발산을 최소화하는 것과 같다.

[회고]

최대우도법

(우리가 확률 밀도함수를 모른다! 그래서 이걸 알고 싶다.)최대우도법은 모수적 데이터 밀도 추정 방법이다.

파라미터 세타들로 구성된 어떠한 확률밀도함수에서 관측된 표본 데이터 집합이 X라 할때 이 표본들에서 세타를 역으로 추정하는 방법이다.

가능도 함수를 알아보았다.

어떤 함수 f에 대해서 출력 y값이 가능성(가능도)가 된다.

💡 확률통계에 대해서 기본적인 것을 추가적으로 공부했다.

확률 변수 : 모든 경우에서 원하는 집합(치역)으로 변화시켜주는 함수 역할

확률 분포 : 원하는 집합(확률변수)에서 발생할 확률들로 매핑시켜주는 역할 (즉, 확률들의 분포)

모집단 : 우리가 구하고 싶은 전체집단(이것을 못구하기 때문에 샘플의 통계량을 통해 모집단을 추정)

샘플(표본) : 모집단에서 일부 집합

  • 복원추출 : 한번 샘플링하고 다시 넣어서 샘플링을 반복한다.
  • 비복원추출 : 한번 꺼낸것은 다시 넣지 않고 샘플링을 진행한다.

표본 기대값(평균) : 이렇게 표본하나의 평균값 → 이 통계량이 또다른 확률변수가 될 수 있다.

표본 분산 : 표본 오차의 제곱의 평균

표본 평균의 기대값 : 표본들의 평균의 평균을 의미한다. 이를 통해서 모집단을 추정한다.

[궁금한 점]

쿨백 라이블러 발산을 최소화 시킨다는 개념은 정답 레이블의 엔트로피는 고정이기 때문에 모델 예측부분인 크로스엔트로피가 증가하는 방향으로 학습시킨다는 내용으로 이해하면 되는건가?

공부해볼 질문

Further Question

  1. 확률과 가능도의 차이는 무엇일까요? (개념적인 차이, 수식에서의 차이, 확률밀도함수에서의 차이)
  2. 확률 대신 가능도를 사용하였을 때의 이점은 어떤 것이 있을까요?

😇 베이즈 통계학 맛보기(AI Math 8강)

[수업 내용]

강사 : 임성빈 교수님

조건부 확률

오른쪽 조건부확률은 사건 B가 일어난 상황에서 A가 발생할 확률을 의미한다.

이 조건부확률을 이용해 정보를 갱신하는 방법을 배운다.

두번째 수식처럼 베이즈 수식을 유도할 수 있다.

개념)

  1. B라는 사건이 발생할 확률
  2. B가 일어났을때 A가 발생할 확률
  3. A가 발생할 확률
  4. A가 발생했을때 B가 발생할 확률을 유도할 수 있다.

베이즈 정리

Confusion Matrix

베이즈 정리를 통해 정보를 갱신한다

: 베이즈 정리를 통해서 새로 데이터가 들어오면 앞에서 계산한 사후 확률을 사전확률로 사용해서 갱신된 사후확률을 계산할 수 있다.

인과관계

: 인과관계는 데이터 분포의 변화에 강건한 예측모형을 만들때 필요하다. 인과관계를 알아내기 위해서 중첩요인의 효과를 제거하고 원인에 해당하는 변수만 인과관계를 계산해야 한다.

[회고]

조건부 확률은 좋은 통계적 해석을 주지만, 인과관계로 추론할 때 함부로 사용하면 안된다. 인과관계는 데이터 분포의 변화에 강건한 예측모형을 만들때 필요하다.

(그러나, 인과관계만으로 높은 예측 정확도를 담보하기 어렵다.)

베이즈 정리를 잘 알고 있는 것이 나중에 모델에 대한 신뢰도를 입증할때 중요한 역할을 한다는 것을 알았다. 자주 보면서 익숙해져야겠다.


😊 CNN 첫걸음(AI Math 9강)

[수업 내용]

강사 : 임성빈 교수님

지금까지 배웠던 내용은 Fully-Connected 구조였다. (내부 구조는 선형모델과 활성함수로 연결되어있었다.)

이전에 궁금했던 것처럼 i가 커지면 그만큼 가중치 행렬도 커지게 되는 문제를 해결해 보려고 해서 CNN이 나왔다.

재밌는 점은 앞에서 가중치 행렬과는 다르게 커널(Kernel)을 사용해서 커널 사이즈에 대응되는 것 만큼 추출하게 되기 때문에 연산량이 엄청 줄고, 가중치행렬 역할인 커널이 작아진다.

고정된 커널을 입력벡터에 움직여가면서 진행된다는 것이 특징이다.

Convolution 연산의 수학적 의미

: 신호를 커널을 이용해 국소적으로 증폭, 감소시켜 정보를 추출, 필터링하는 것이다.

참고 수식

Convolution은 - 연산을 하는데 전체적으로 보면 + 로 처리해도 문제는 없고 보통 이렇게 많이 써서 수식은 + 연산을 많이쓴다.(엄밀히 말하면 Corelation 연산이다.)

커널은 정의역 내에서 움지여도 변하지 않고 주어진 신호에 국소적으로 적용한다.

2D - Convolution

:커널을 입력벡터 상에서 움직여가면서 선형모델과 합성함수가 적용되는 구조이다.

커널이 움직여가면서 각각 입력벡터와 맞는 성분곱으로 출력이 된다.

입력 사이즈, 커널 사이즈가 있을때 출력 사이즈를 미리 예측하기!

만일 채널이 여러개 있다면? 마치 3D 같이 보인다.

3차원 부터는 Tensor라고 부른다.

이렇게 채널이 여러개라면 채널의 갯수 만큼 커널의 수를 만들고 연산을 적용한다.

커널도 채널이 여러개인 Tensor, 입력도 채널이 여러개인 Tensor

출력은 커널의 갯수가 1개이다.

만약 출력의 커널을 여러개 만들고 싶다면?

역전파는 어떻게 적용될까

x3라는 입력하나를 보면 각각 3번의 연산을 거쳐가는데

ex) O1벡터에는 x3와 w3와 곱해서 더해졌기 때문에 Gradient도 w3를 곱해서 구하게 된다.

그래서 w3의 Gradient는 델타1 * w3가 될것이다.

[회고]

CNN은 Filter를 통해서 Object의 Feature를 찍어내는 역할같다.

다양한 필터를 가지고 여러가지 솔루션이나 서비스를 제공할 수 있을 것 같다고 생각했다.

기존에 MLP에서 가지고 있는 많은 가중치를 학습시키는데 필요한 연산을 효율적, 좀 더 줄일 수 있는 것이 장점일 것 같다.

[궁금한 점]

이런 filter는 어떤 기준으로 만들어 지는 것일까? 나중에 CNN 파트에서 질문해봐야겠다.


😊 Python numpy

[수업 내용]

NUMERICAL PYTHON!

Part 1️⃣

질문!

: 어떻게 행렬과 매트릭스를 코드로 표현할 것인가?!

  1. 그냥 리스트 형태로 표현한다.

문제 : 다양한 매트릭스 계산이 있다. Dot Product, Norm 등등 수식을 list로만 하려면 이걸 다 구현해야된다... 그래서 누군가 만들어 놓은 것을 쓰는게 효율적이다!

처리 속도 문제 - Python 자체는 인터프리터 언어..

그래서 Numpy 패키지를 통해서 고성능 과학 계산용 패키지를 이용한다.

Matrix와 Vector가 배열연산의 표준이다.

Numpy 특징

  1. 일반적 리스트에 비해서 빠르고, 메모리 효율적이다.
  2. 반복문 없이 데이터 배열에 대한 처리를 지원한다.
  3. 선형대수와 관련된 다양한 기능을 제공한다.
  4. C, C++, 포트란 등의 언어와 통합 기능을 제공한다.

1. ndarray

import numpy as np

#ndarray객체이름 = np.array(리스트, type)
array = np.array([1,2,3,4], float)

#array를 ndarray 객체라고 부른다.
#ndarray는 한가지 데이터 type만 넣을 수 있다.
#Dynamic Typing 이 동작하지 않는다.

Numpy Array 와 Python List의 차이

연산하는 것 자체가 index가 고정되어 있어서 Python List보다 빠르다.

메모리 공간도 선언하는 객체별로 독립적으로 할당한다.

용어

  1. shape : numpy array의 dimension을 반환(Tuple 형태)
#Vector
np.array([1,2,3], int).shape
-> (3,)

np.array([[1,2,3],[4,5,6]]).shape
[[1,2,3],
 [4,5,6]]
-> (3,2)
#(행,열)
np.array([[[1,2,3],[1,2,3],[1,2,3]],[[1,2,3],[1,2,3],[1,2,3]]]).shape
[[1,2,3],
 [1,2,3],
 [1,2,3]] * 2(channel)
-> (2,3,3)
#(channel, 행, 열)
  1. dtype : numpy array의 Data Type 반환
  2. nbytes : ndarray 객체의 메모리 크기를 반환

Part 2️⃣

  1. reshape : array의 shape의 크기를 변경한다. element개수는 동일하다.
  2. -1 → element size에 맞게 알아서 맞춰준다.
  3. flatten : 다차원 array를 1차원으로 펴주는 역할
  4. indexing & slicing :슬라이싱 - 행과 열부분을 나눠서 slicing이 가능하다.
  5. 인덱싱 - ex)A[0,0] == A[0][0]
#Slicing 예시
A = np.array([[1,2,3,4],[5,6,7,8]], int)
A[: 2:] #-> 전체 Row의 2열 이상
A[1, 1:3] #-> 1행의 1열부터 2열까지
A[1:3] #-> 1행부터 2행까지 전체
  1. creation function : array 범위를 지정해, 값의 list를 생성하는 병령어
    1. np.arange() : 범위에 따라 list를 생성할 수 있다.
    2. np.zeros() : np.zeros(shape, dtype, order) 형태
    3. np.empty() : shape만 주어지고 비어있는 ndarray를 생성한다. (메모리 초기화가 되지 않는다.)
  2. np.identity() : 단위행렬 생성한다.
  3. np.eye() : 대각선의 값이 1인 값(단위행렬과 다르게 시작하는 곳을 지정해서 대각선으로 만들 수 있다.)
  4. ⭐️ np.diag() : 대각 행렬의 값만 뽑을 수 있다.
  5. random sampling :
    1. np.random.uniform(모수값 시작, 모수값 끝, 데이터 개수)[균등분포]
    2. np.random.normal(모수값 시작, 모수값 끝, 데이터 개수)[정규분포]
    3. np.random.exponential(모수값)
  6. operation functions
    1. sum : 모든 것을 다 더해줌
    2. mean : 기대값
    3. std : 표준편차
    4. min : 최소값
    5. max : 최대값
    6. sqrt : 루트
    7. exp : 지수함수 씌어줌
  7. ⭐️ axis의 개념ex) 3 x 4 matrix의 axis = 0 → 행, axis = 1 → 열
  8. 모든 operation function을 실행할 때 기준이 되는 dimension 축
  9. concatenate : array를 합치는 함수(축을 기준으로)
    1. vstack : 행들을 붙힌다(가로들)
    2. hstack : 열들을 붙힌다.(세로들)
  10. array operation
    1. '+' : 각각 요소끼리 더하기(위치에 맞춰서)
    2. '*' : element wise-operation(요소끼리 곱함)
    3. '.dot' : matrix 간의 곱하기(일반적으로 아는 행렬곱)
  11. transpose() : 행렬을 전치행렬로 바꿔버린다.
  12. broadcasting(주의해야할 연산!) : shape이 다른 배열 간 연산을 지원
    1. #Matrix 와 #Scalar의 연산은 스칼라값을 행렬의 모든 element에 적용한다.
    2. #Matrix와 #Vector의 연산은 Vector의 크기를 Matrix에 맞춰서 계산한다.
  13. (Tip.)%timeit : jupyter 환경에서 코드 성능을 체크해주는 함수
    1. for loop < list comprehension < numpy (속도 순)

Part 3️⃣

  1. ALL & Any
    1. any → 하나라도 만족하면 True
    2. all → 모두 만족해야 True
  2. np.array 사이의 Comparison 은 element wise로 비교가 된다.
  3. np.where
np.where(조건, True, False)
-> 조건에 맞으면, True에 있는 값을, Flase이면 False에 있는 값을.

np.where(조건)
-> 조건에 맞는 것들의 index를 찾아준다.

np.isnan(array)
-> None 값을 찾아준다.

np.isfinite(array)
-> 발산하는 경우(메모리를 넘어갈때) 를 찾아준다.
  1. argmax & argmin(axis 별로도 가능하다.)
    1. argmax : 최대값의 index 반환
    2. argmin : 최소값의 index 반환
  2. boolean index : 특정 조건에 따른 값을 배열 형태로 추출한다.
    1. 조건) 원래 shape와 같아야 한다.
  3. fancy index : array를 index value로 사용해서 값을 추출한다.
    1. take 함수도 사용해서 쓸 수 있다.
  4. numpy data i /o
    1. loadtext & savetext[회고]numpy 같은 경우 C언어 기반으로 구현되어 있기 때문에 기존 Python언어보다는 더 빠를 것 같다. 그렇다면 Python과 같은 인터프리터 형식으로 실행할까 컴파일 방식으로 실행할까? 고민해보고 찾아봐야겠다.
    2. Numpy는 판다스와 마찬가지로 Python에서 제공하는 굉장히 중요한 데이터 처리 라이브러리이기 때문에, 익숙해져야겠다.
    3. #파일 load import numpy as np #txt 파일을 load한다. A = np.loadtext('~~.txt', delimiter= 자를 구분자) #csv 파일로 저장한다. np.savetext("파일이름.csv", A, fmt=포멧값, delimiter = 구분자)

반응형