Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- VAE
- 주간학습정리
- 네이버 부스트캠프 KDT 전형
- 네이버 부스트캠프 AI Tech 6기
- Transformer 디코더
- transformer
- 네이버 부스트캠프
- self-attention
- 트랜스포머 모델
- Transformer Decoder
- AI Math
- boostcamp
- 어텐션 행렬
- 네이버 부스트캠프 코딩테스트 후기
- 셀프 어텐션
- 포지셔널 인코딩
- pytorch
- Auto-Encoding Variational Bayes
- 트랜스포머
- Positional Encoding
- 네이버 ai 부스트캠프
- VAE 설명
- 어텐션
- 트랜스포머 행렬
- Transformer 모델
- 부스트캠프
- seq2seq
- VAE 논문 리뷰 #
- Transformer model
- 네이버 부스트캠프 AI Tech
Archives
- Today
- Total
DH. AI
[Boost Camp AI Tech] Week1 본문
Notion에 정리한 내용중 새로 알게된 내용과 중요하다고 생각되는 내용을 다시 정리하며 복습하기 위해서 쓰는 글.
Python, AI Math에 대해서 전반적으로 다룸.
Python
(1강 ~ 3강) 파이썬 기본, 함수, 자료구조, Pythonic code 등
- 파이썬은 운영체제에 독립적이다. Dynamic Typing Language이다. 코드 실행 시점에 데이터의 Type을 결정한다.
- 문자와 숫자 비교 불가, a is b : 메모리 주소를 비교한다.
- String 은 리스트와 거의 동일하다. 문자열의 각 문자는 개별 주소(offset)를 가진다. 그리고 인덱싱이 가능하다.
- String은 시퀀스 데이터다! iter 가능
- 전역변수 s가 있더라도 함수 안에 새로운 지역변수인 s가 있다면 그 둘은 서로 다른 변수이다. 전역변수를 함수 내에서 받아서 사용하고 싶으면
global s
로 선언 해줘야한다. - 파이썬의 함수가 pass by value(값만 리턴)과 같은 형식 pass by reference(적용 자료구조가 변함)에 따른 list.pop() : return 동시에 list도 바뀌어버림.
- from collections import deque : list에 비해 효율적이고 빠른 자료저장 방식 지원. rotate, reverse등 Linked List의 특성을 지원한다.
- from collections import defaultdict : 값이 없을때 기본값을 지정 가능하다. defaultdict(lambda : 1)
- from collections import Counter : 리스트 원소들의 개수를 구해줌. set의 연산을 지원한다!!
-
namedtuple : Point = namedtuple(’Point’, [x,y]), p = Point(x = 11 , y = 22)
약간 클래스처럼 사용 가능 - def get_key(x) : return x[1] 선언 후 soreted(list, key = get_key) or soreted(list, key = lambda x : x[1])하면 두번째 값 기준으로 정렬 가능
- (dict.items(), key = lambda item: item[1]) 이런것 도 가능 (value 값을 기준으로 정렬)
- zip(list_a, list_b) : 두 개의 list값을 병렬적으로 추출 함. enumerate(zip())과 같은 형태로 쓸 수 있다.
- reduce(lambda x, y : x+y, [1,2,3,4,5] ) : 순차적으로 값 넘기면서 함수 실행! 결과는 15. 큰 데이터를 다룰 때 사용하기도 한다.
iterable object, generator object
- iterable object : 반복가능한 객체. 배열을 일반화 한 객체
- cities = [1,2,5,4] : 메모리에 올라간다.
- memory = iter(cities) : 메모리에 올라가지 않음 <list_iterator at 0x150ac3043> : 리스트의 메모리 위치에 대한 정보를 가질 뿐, 실제 생성하진 않은 상태.
- next(memory) : 1, next(memory) : 2, next(memory) : 5 ... 이런식으로 값 하나씩 출력 가능.. Dataloader의 값을 확인할때 next(iter(dataloader))로 확인할 수 있다. dataloader[0]은 안돼, iter(dataloader)를 해주면 generator 형식으로 바뀜
- generator object : element가 사용되는 시점에 메모리 값을 반환한다. 그 전에는 주소값만 가지고있다.
- 아래와 같이 사용 가능!
def generator_list(value):
result = []
for i in range(value) :
yield i
generator_list(50)
>>> <generator object generator_list at 0x0001401294901>
for a in generator_list(50) :
print(a)
>>> 1
>>> 2
>>> ...
- 평소에는 값을 메모리에 올려놓지 않고, 메모리의 주소값만 가지고 있는데, print명령으로 값을 부를 때마다 yield가 값을 하나씩 던져주는 것과 같이 동작..
- 이렇게 되면 메모리 주소만을 가지고 있기때문에 yield 없이 그냥 구현하는 것 보다 메모리 잡는 크기가 훨씬 줄어든다.
- 대용량의 데이터를 반환해주는 함수 정의시, 또는 파일 데이터를 처리할때 항상 generator를 사용하자!!
- 실제로 파이썬의 대부분의 자료형들은 generator 형태로 만들어진다. (PyTroch의 DataLoader도 generator 사용)
- 가변인자
def fun(a,b, *args):
→ args 는 튜플로 저장한다. 키워드 없이 들어온 인자 처리 - 키워드 가변인자
def fun(**kwargs):
kwargs는 dictionary로 저장한다. 키워드로 들어온 인자 처리
(4강 ~ 5강) OOP, 모듈, 예외처리, data handling 등
- class MyClass(object) : object는 상속받는 것!
- 예약 함수(magic mthod) : 클래스에서 사용할수 있는 미리 지정된 함수! → C++로 따지면 함수 overriding 하는 느낌..
__init__ : # 객체 초기화, 생성자 예약함수
__str__ : # 객체를 출력하면 아래 리턴
__add__ : # 객체 끼리 더하면 아래 리턴
__len__ : # 길이 반환. len()함수가 내부적으로 객체의 이 메소드를 호출
# 등등
- 클래스에서 method(함수)를 추가할때는 항상 self를 추가해야 class의 함수로 인정된다.
- Inheritnace(상속) : 부모클래스로부터 attribute(속성 = 변수)와 method를 그대로 물려받은 자식 클래스를 생성하는 것.
- Pytorch에서 커스텀 데이터셋 만들때 torch.util.data 에서 Dataset을 import하여 CustomDataset(Dataset)과 같은 형식으로 활용 가능
- super().__init__ : 부모 클래스의 생성자. super() : 자기 자신의 부모, self : 자기자신
- Polymorphism(다형성) : 같은 이름 메소드의 내부 로직을 다르게 작성. 예시로 부모의 draw의 함수를 자식들이 모두 물려받지만 각각의 자식들이 모두 다르게 오버라이딩하여 같은 이름의 함수라도 다른 draw를 할 수 있도록 함.
- Visibility(가시성) : 객체의 정보를 볼 수 있는 레벨을 조절 하는것!! 접근을 많이 줄 수록 위험한 코드임!
C++ 에서 private, public 개념!! Python에서는 변수 앞에 __를 붙여줘서 private 처럼 작동하게 할 수 있다. - Encapsulation(캡슐화) : Class를 설계할 때, 클래스 간의 간섭/정보공유의 최소화하면서 서로가 인터페이스만 알면 서로가 내 클래스를 이용할 수 있게 해주는것. 즉 꼭 필요한 정보만 쓰게하고 나머지는 숨기고 이런식으로 코딩
- 파이썬의 모든 함수 == 일급함수(일급 객체) : 변수( = 함수를 변수로 사용)나 데이터 구조에 할당이 가능한 객체, 파라미터로 전달이 가능함. 리턴 값으로 사용 가능. 예시 : map(int, list) !!
def f1(x):
return x * 2
def f2(x):
return x * 3
# 일급함수
def formula(method, argument_list):
return [method(value) for value in argument_list]
# formula에 f1, f2 넣어서 쓰고싶은대로 list에 적용 가능하도록 만들 수 있다.
# map이 이런식으로 짜여져 있을 듯
# 내재 함수(inner function) 흔한 구조
def fun1(m):
def p():
print(m)
p()
fun1("hi")
>>> hi
# closures : inner function을 return값으로 반환 js에서 자주쓰임 !!
def fun1(m):
def p():
print(m)
return p
another = fun1("hi")
another()
>>> hi
- decorater function : 복잡한 클로져 함수를 간단하게!! :
def star(func):
def inner(*args, **kwargs):
print(args[1] * 30)
func(*args, **kwargs)
print(args[1] * 30)
return inner
@star
def printer(msg, mark): # 이 printer function이 star의 인자인 func에 꽂힌다.
print(msg)
printer("Hello", "*")
# printer가 star라는 함수에 들어가서 결국에 printer함수에 어떠한 decorate(꾸며주다)를 해주는 것??
>>> *****************************************
>>> Hello
>>> *****************************************
def generate_power(exponent): # exponent에 2가 들어감
def wrapper(f): # f에 raise_two가 들어감
def inner(*args): # n을 args가 받음
result = f(*args)
return exponent**result # 2 * (3**2)
return inner
return wrapper
@generate_power(2)
def raise_two(n):
return n**2
print(raise_two(3))
>>> 512
Module
- 패키지 안에 모듈이 들어가 있음. 패키지를 공개하면 프로젝트라고 부른다.
- 남들이 만든 프로그램들을 단위로 가져와서 쓰는것을 모듈화된 프로그램을 썼다. 또는 API를 사용한다.라고 말함
- Module : 파이썬의 py 파일을 의미! 같은폴더에 Module에 해당하는 py와, Module을 사용하는 py을 저장한후 import를 이용해서 Module호출 가능! fun.py 라는 파일에 fun1() 이라는 함수가 있다면, import fun 후에 fun.fun1()을 사용가능하다. 모듈의 이름은 fun!
- import fun이라고 하면 fun.py의 모든 코드가 메모리에 로딩이 된다.
if __name__ == "__main__" : # 해당 모듈이 임포트된 경우가 아니라 인터프리터에서 직접 실행된 경우에만, if문 이하의 코드를 돌리라는 명령입니다.
- __pyche__ 파일 : 컴파일 된 파일. 임포트 할때 쉽게 로딩 할 수 있도록 기계어로 번역된 파일.
- from module import funA, from module import ClassA : 특정 module에서 funA함수 or ClassA클래스만 호출
- from module import * : 모듈 싹다 호출
패키지
- 패키지 : 하나의 대형 프로젝트를 만드는 코드의 묶음. 다양한 모듈, 폴더로써 연결된다. 배포를 하게 되면 프로젝트가 된다.
- game이라는 패키지를 만들때,,,
- game 폴더 안에 image, sound, stage 폴더를 생성! sound안에 있는 echo.py를 from sound import echo과 같은 식으로 호출 할 수 있다. from 을 이용해서 폴더에 접근하고 import로 모듈에 접근이 가능.
- python 3.3 이전 버전에서는 패키지로 간주되기 위해서는 폴더별로 __init__.py를 작성해줘야 했는데, 이제는 없어도 된다. 그래도 관습적으로? 보통 해준다.
game의 __init__
아래와 같이 코드 작성.
__all__ = [image, sound, stage]
from . import image
from . import sound
from . import stage
# 이런식으로 __init__파일 구성
-
game의 __main__
아래와 같이 코드 작성. : 콘솔에서 python game 명령어로 폴더 자체를 실행시키기 위함.
from sound import echo
if __name__ == '__main__':
print('hello game')
print(echo.echo_play())
# 이런식으로 코드 작성 가능
- 상대참조, 절대참조로 각 모듈에 접근 가능하다.
- 가상환경 설정하기 : 내 컴퓨터에 파이썬 환경이 있는데, 그 환경이랑 조금 다른 환경으로 새로 설치하고 싶을때! 사용한다 예를 들어 어떤 환경은 데이터 분석, 어떤 환경은 게임개발.. 각 개발(프로젝트) 목적에 맞는 패키지들의 종류와 버전이 다르기 때문에 이것들이 종종 충돌이 나기 때문에, 충돌을 방지 하기위해서 가상환경을 만든다.
- conda create -n my_project python=3.8 이런식으로 가상환경 생성가능
- conda activate my_project로 가상환경 활성화 가능. conda deactivate : 가상환경 비활성화
- conda install로 여러 패키지를 설치 가능.
Exception
- try ~ except 만약 for문 안에서 에러가 발생하면 except 아래 코드 실행 후 프로그램 강제 종료가 아니라. 다시 위로 올라가서 코드 실행 시켜줌.
- error의 종류는 매무 많다. except은 여러개 달 수 있고 Exception이 모든에러를 잡을 수 있다.
- raise : 강제로 Exception을 발생시킨다.
- assert : 조건에 만족하지 않을 경우 예외를 발생! 예시 : assert isinstance(decimal_number, int) False이면 error 발생
예를 들어 정수를 입력하길 바랬지만 문자를 입력한 경우. 그냥 아래 코드로 넘어가게 되면 너무 많은 시간이 걸리거나 심각한 오류가 생기는 경우, 사전에 사용자에게 에러가 났다는 경고를 줄 수 있다!
Pickle
- 객체는 원래 메모리에만 존재. pickle을 사용하면 객체를 영속화(persistence) 할 수 있다. 데이터, object등 실행중 정보를 저장해서 나중에 불러와서 다시 사용 가능. 예시 Pytorch 모델에서 최적의 loss 값을 가진 모델의 파라미터 정보를 .pt 파일로 저장.
- python에 특화된 binary 파일이고, 저장시에는 wb, 읽을때는 rb로 읽는다.
Logging Handling
- Logging : 로그 남기기. 프로그램이 실행되는 동안 일어나는 정보를 기록을 남기기!
- 기록된 로그를 분석하여 의미있는 결과 도출 가능. 실행시점(유저 분석), 개발 시점(디버깅을 위해, 에러를 잡기 위해)에 남겨야하는 Log가 있음
- 기록을 print로 남기는 것도 가능한데, 콘솔 창에만 남기면 분석 시 사용 불가. 때로는 개발, 운영 별로 기록을 남길 필요가 있다. Logging은 print가 실행되는것과 기본적으로 비슷하게 동작.
import logging
if __name__ == '__main__' :
logger = logging.getLogger("main")
logging.basicConfig(level = logging.DEBUG)
logger.setLevel(logging.ERROR)
steam_handler = logging.FileHander("my.log", mode='w', encoding='utf8')
logger.addHandler(steam_hander) # 이렇게하면 my.log라는 파일에 로그를 남길 수 있음!!!
logging.debug('틀렸잖아')
logging.info('확인해')
logging.warning('조심해!') # 기본설정. 보통 warning 부터 user들도 볼 수 있게 해줌
logging.error('에러났어!!') # 5번, 6번 line 코드 때문에 error부터 출력해줌
logging.critical('망했다...')
- Log 관리시 가장 기본이 되는 설정 정보
- logging level을 바꿔주게 되면 user들이 볼 수 있는 범위를 바꿔줄 수 있음. 파일에도 남길 수 있음.
- 실제 프로그램을 실행할 땐 여러 설정들이 필요!! (위의 Handler처럼...) [TMI 겨울 학부연구생 활동을 할때 데이콘 대회에 참가하였는데 모델링 할때 parser 관련 부분의 이해가 완벽하지 않았는데 이번 기회에 완벽하게 이해함.]
- configparser : 파일에 설정
# example.cfg
[SectionOne]
# key : value
Status : Single
Name : Derek
Age : 25
[SectionTwo]
FavoriteColor = Green
Age : 26
...
import configparser
config = configparser.ConfigParser()
config.sections()
config.read('example.cfg')
print(config.sections())
>>> ['SectionOne', 'SectionTwo']
print(config['SectionTwo'])
>>> <Section : SectionTwo>
for key in config['SectionTwo']:
value = config['SectionTwo'][key]
print("{0} : {1}".format(key, value))
>>> 'FavoriteColor' : Green
>>> 'Age' : 26
config['SectionOne']["status"]
- argparser : 실행시점에 설정
# arg_sum.py
import argparse
parser = argparse.ArgumentParser(description = 'Sum two integers.')
parser.add_argument('-a', "--a_value", dest = "A_value", help ="A integers", type = int)
# 짧은 이름 # 긴이름 # 표시명 # Help 설명 # Argument Type
parser.add_argument('-b', "--b_value", dest = "B_value", help ="B integers", type = int)
args = parser.parse_args()
print(args) # 값들은 Namespace (namedtuple과 비슷한) 형태로 args에 들어가게 된다....
print(args.a)
print(args.b)
print(args.a + args.b)
####################
python arg_sum.py -a 10 -b 10
>>> Namespace(a=10, b=10)
>>> 10
>>> 10
>>> 20
Python data handling
- 데이터 저장 방식 CSV, 웹(html), XML, JSON
CSV
- 엑셀 양식의 데이터를 프로그램에 상관없이 쓰기 위한 데이터 형식. 데이터가 ','로 나눠져 있음
- shell만 돌아가는 리눅스에서 xlsx 파일 처리가 힘드니까 csv 파일로 처리하면 쉽게 처리가능.
XML
- 데이터의 구조와 의미를 설명하는 TAG(MarkUP)를 사용하여 표시하는 언어
- 2000년도 초반까지 XML로 주고받음. 서로다른 디바이스(컴퓨터 ↔ 스마트폰) 간에 정보를 주고받기에 유용한 방식으로 사용되어왔음.
- from bs4 import BeautifulSoup을 이용해서 데이터 불러올 수 있음.
JSON
- 웹 언어인 Java Script의 데이터 객체 표현 방식
- 간결성이 좋고, 데이터가 용량이 적고, code로의 전환이 쉽다. → XML의 대체제로 많이 활용되고 있다.
- python에서 데이터 저장 및 읽기는 dict와 완벽하게 동일함.
- import json 해서 데이터 받아오면 된다. json.loads, json.dump
(6강 ~ 7강) numpy, pandas는 따로 정리 하지 않음.
AI Math
(1강 ~ 2강) 벡터, 행렬
- 벡터는 하나의 데이터 표현에 쓰임. norm, 정사영 등의 개념
- 행렬은 행벡터를 원소로 가지는 2차원 배열이라고 생각하자. 공간상의 점들의 모임으로 이해할 수 있다.
- 보통 행벡터의 X_i는 i번째 데이터를 의미한다. X_ij는 i번째 데이터의 j번째 변수 값.
- 행렬은 벡터공간에서 두 서로 다른 데이터(벡터)를 연결시키는 데 사용되는 연산자(Operator)로 이해할 수 있다. 즉 선형 변환
- 행렬곱을 통해 패턴을 추출할 수 있고 데이터를 압축할 수도 있다. 또한 벡터를 다른 차원으로 보낼 수 있다.
- 역행렬은 행과 열의 차원이 같고, 행렬식이 0이 아닌경우만 존재 가능하다.\
- 행과 열의 차원이 다르더라도 유사 역행렬(무어-펜로즈 역행렬)을 구해서 사용 가능하다. → 행의 개수와 열의 개수의 대소관계에 따라서 사용법이달라짐
(3강 ~ 4강) 경사 하강법
- 문제를 해결하기 위해서 Loss 함수를 정의하고 그 Loss 함수를 최소화 하기 위해서 경사하강법을 사용한다.
- Loss 함수의 미분값을 계산하여 이전 step의 가중치 값에서 그 미분값을 빼서 최적의 가중치를 찾는다.
(5강 ~ 8강) 딥러닝 학습방법, 확률론, 통계학, 베이즈 통계학
- multi-classification문제에서는 모델에 소프트맥스 연산을 추가해주어야함.
하지만 보통 inference를 할 때에는 마지막에 확률값을 계산하지않고 가장 큰 값을 내보내면 되기 때문에, 원 핫 벡터로 최대값을 가진 주소만 1로 출력하는 연산을 사용하므로 소프트맥스 연산을 하지 않는다. - 활성화 함수는 딥러닝 모델에 비선형성을 준다. 활성화 함수가 없다면 선형모델과 차이가 없다. 시그모이드나 하이퍼볼릭탄젠트(tanh) 함수보단 RELU함수의 특성이 학습에 도움이 되는 성질을 많이 가지고 있기 때문에 가장 많이 쓰임. RELU는 sigmoid, tanh의 문제인 층이 깊어짐에 따라 발생할 수 있는 기울기 소실 문제를 해결해준다.
- 딥러닝 학습원리 : 역전파 알고리즘!!! 가중치 행렬의 모든 원소의 개수만큼 역전파가 일어나게 된다. 선형모델에서는 하나의 층만 있었기에 한번에 그레디언트 벡터를 계산할 수 있었지만 딥러닝에서는 불가능하다. 체인룰(연쇄법칙)기반 자동미분을 사용해서 역순으로 순차적으로 그레디언트를 계산하여야 한다. 저층의 그레디언트 벡터는 위층의 그레디언트 벡터를 계산한 후에 계산 가능하다.
- 각 노드의 텐서 값을 컴퓨터가 기억해야 미분이 계산이 가능하다. 따라서 메모리 사용량이 forward propagation 보다 많음
- https://wikidocs.net/37406 역전파 이해 도움 되는 문서
확률론
- 확률변수는 함수로 이해할 수 있음. 이산형 or 연속형은 데이터 공간이 아닌 확률분포에 따라서 결정된다. 데이터의 확률분포는 이론적으로 존재하는 확률분포이기에 사전에 알 수 없다.
- 원래 분포와는 관계없이 확률 분포를 모델링 할때에는 이산형을 하든 연속형으로하든 상관이 없다고 한다. → 컴퓨터를 가지고 모델링 하기 때문에 원래의 분포에 근사하도록 계산 할 수 있다.
- 주어진 클래스에 대해서 x의 분포가 어떠한지 각각을 살펴보기위해서는 주변확률 분포보다 조건부 확률분포를 사용하면 명확하게 통계적 관계를 모델링 가능함.. 나중에 나오겠지만 인과관계를 고려하지 않은 조건부 확률분포만을 사용해서 모델링을 하게되면 문제가 발생할 수 있다.
- 회귀문제에서 조건부 기대값은 L2 norm을 최소화(예측의 오차의 제곱을 최소화)하는 함수 F(x)와 일치하기 때문에(수학적으로 증명되어있음) 조건부 기대값으로 표현가능
기대값
- 확률분포가 주어지면 데이터를 분석하는 데 사용 가능한 여러 통계적 범함수를 계산가능함
- 기대값은 데이터를 대표하는 통계량 이고 동시에 확률분포를 통해 다른 통계적 범함수를 계산하는 데 사용된다.
몬테카를로 샘플링
- 몬테카를로 샘플링 : 데이터의 확률분포를 명시적으로 모르기 때문에 기대값을 구하고 싶을때는, 가지고 있는 데이터를 이용해서 샘플링(독립적으로)을 하여서 산술평균을 내서 기대값을 구하는 방법을 사용함
- 독립일때 대수의 법칙에 따라서 몬테카를로 샘플링의 수렴성이 보장된다.
통계적 모델링
- 통계적 모델링은 적절한 가정 위에서 확률분포를 추정(inference)하는 것이 목표이다. 기계학습과 목표하는 바가 같음.
- 실제 유한한 데이터만 관찰해서 모집단의 확률분포를 정확히 알아낼 수 없음. → 근사적으로 확률분포를 추정해야 함. 불확실성 고려하여 위험(리스크) 최소화를 함.
- 모수적 방법론 : 데이터가 특정 확률분포를 따른다고 선험적으로(prior) 가정한 후 그 분포를 결정하는 모수(정규분포 : 평균, 분산)를 추정
- 비모수 방법론 : 특정 분포를 가정하지 않고 데이터에 따라, 모델의 구조 및 모수의 개수가 유연하게 바뀌면 비모수 방법론이라 부른다. 기계학습 방법론은 비모수 방법론에 속함.
- 기계적으로 확률분포를 가정하면 안되고, 데이터를 생성하는 원리를 먼저 고려하는 것이 원칙!! 항상 모수를 추정한 후에는 반드시 검정을 해야함!!
- *** 정규 분포의 모수는 평균과 분산임, 이를 추정하는 통계량(statistic)으로는 표본평균, 표본분산이 있음.
- 통계량의 확률분포를 표집분포라고 한다. 표본평균의 표집분포는 정규분포를 따름, 이를 중심극한정리라고 하고 모집단의 분포가 정규분포를 따르지 않아도 성립함.
likelihood
- 표본평균이나 표본분산은 중요한 통계량이지만 확률분포마다 사용하는 모수가 다르기때문에 적절한 통계량이 달라지게 된다. 이론적으로 가장 가능성이 높은 모수를 추정하는 방법 중 하나는 최대가능도(maximum likelihood estimation, MLE)이다.
- 가능도 함수 : pdf와 관점을 바꿔서 모수를 세타를 따르는 분포가 x들을 가질 가능성!! 근데 확률로 해석하면 안된다. 세타에 대해서 다 더하거나 적분하면 1이 아니기 때문에 확률로 보면 안된다.
- 데이터 집합 X가 독립적으로 추출되었을 경우 로그가능도를 최적화 할 수 있다.
- 로그 가능도를 사용하는이유
1. 데이터의 수가 수억개라면 컴퓨터의 정확도로도는 0.X의 값을 계속 곱해주는 가능도(엄청 작음)를 계산하는 것이 연산오차 때문에 불가능하다. 따라서 로그 가능도를 써서 덧셈으로 바꿈!
2. 또한 역전파 시 연산량을 O(n^2)에서 O(n)으로 줄여준다. - 정규분포따른다고 가정하고 최대 가능도 추정 하면,, 로그가능도를 평균과 분산으로 각각 미분하고 각각 두 미분이 모두 0이되는 모수를 찾으면 된다!
- 최대 가능도 추정은 불편추정량을 보장하진 않지만, 일치성을 보장한다(consistency).
일치성 : 표본의 수가 커질 때, 추정량이 모수값으로 확률 수렴(convergence in probability)하는 성질 - 카테고리 분포에서 최대 가능도 추정.. X ~ Multinoulli(x:p1,,,,pd) 에서… p들 다 더하면 1이라는 제약조건이 있음, X는 0과 1값만 가질 수 있다.
- 라그랑주 승수법을 통해서 제약조건이 있을때 최적화를 할 수 있음…!!
- 딥러닝에서도 최대 가능도 추정법을 사용 가능하다.
- 기계학습에서 사용되는 손실함수들은 모델이 학습하는 확률분포와, 데이터에서 관찰되는 (MLE로 유도하는 모델학습 방법론은) 확률분포의 거리의 최적화를 통해 유도 가능하다.
- 데이터 공간의 두개의 확률분포 P, Q가 있을경우 두 확률분포 사이의 거리(distance)를 계산할때 아래와 같은 함수들을 이용한다.
- 총변동거리(Total Variation Distance, TV)
- 쿨백-라이블러 발산(Kullback-Leibler Divergence, KL)
- 바슈타인 거리(Wasserstein Distacne)
- 최대가능도방법에서 로그가능도를 최대화 하는것이,,, 분류문제에서 정답레이블 P와 모델예측 Q사이의 쿨백-라이블러 발산을 최소화하는것과 같음!!
베이즈 통계학
- 위의 통계학은 빈도주의적 관점!!, 기계학습에서 베이즈 통계학이 많이 사용되기도 한다(데이터가 추가될때마다 정보를 업데이트).
- 베이즈 정리는 조건부확률을 이용하여 정보를 갱신하는 방법을 알려준다.
- 베이즈 정리는 A라는 새로운 정보가 주어졌을때 P(B)로부터 P(B|A)를 계산하는 방법을 제공한다.
- 사후확률 = 사전확률 * 가능도 / Evidnece(데이터 전체의 분포)
- 베이즈 정리를 통해 새로운 데이터가 들어왔을 때 앞서 계산한 사후확률을 사전확률로 사용하여 갱신된 사후확률을 계산할 수 있다.
- 조건부 확률은 유용한 통계적 해석을 제공하지만 인과관계를 추론할 때 함수로 사용해서는 안된다.
- 인과관계는 데이터분포의 변화에 강건한(robust) 예측모형을 만들 때 필요하다. → 그러나 인과관계만으로는 높은 예측 정확도를 담보하기는 어렵다. 예를 들어 인과관계 고려없이 조건부확률에 기반하여 모델을 만들면, 실제 테스트 시에는 높은 정확도를 가진 모델을 세울 수 있다… 그러나 데이터 분포가 바뀌는경우, 즉, 데이터가 유입되는 상황이 바뀌거나, 새로운 정책을 도입하거나, 새로운 치료법을 도입했을 때 유입되는 데이터 분포가 변한다. → 데이터 분포에 강건한 모델을 원하는 경우 인과관계를 고려하자.
- 인과관계를 알아내기 위해서는 중첩요인(confounding factor)의 효과를 제거하고, 원인에 해당하는 변수만의 인과관계를 계산해야 한다. 중첩 요인 : X(원인) → Y(결과) 의 모델을 만들때 X, Y에 모두 영향을 주는 Z의 효과를 제거하지 않으면 가짜 연관성(spurious correlation)이 나온다.
- 예시로 키와 아이큐의 인과관계를 보면 상당히 높게 나온다. 이는 나이라는 Z(중첩요인)의 효과를 제거하지 않았기 때문에 일어나는 문제이다.
(9강 ~ 10강) CNN, RNN
CNN
- CNN은 일반적인 NN과 달리 고정된 크기의 커널을 사용. 각 layer의 뉴런의 수와 무관한 개수의 가중치를 사용한다.
- Convolution(엄밀히 말하자면 cross correlaction) 연산의 수학적인 의미는 신호를 커널을 이용해 국소적으로 증폭 또는 감소 시켜서 정보를 추출 또는 필터링 하는것.
- Conv 연산의 출력 크기 : 입력크기+ 2 * 패딩 - 커널크기 + 1 / 스트라이드
- 채널이 여러개인 2차원 입력의 경우 2차원 Convolution을 채널 개수만큼 적용한다고 생각!
- Convolution 연산은 역전파를 할때에도 Convolution 연산이 나오게 된다.
RNN
- 시계열 데이터는 시간순서에 따라 나열된 데이터, 순서가 매우 중요함
- 시퀀스 데이터는 독립 동등분포 가정을 잘 위배하기 때문에 순서를 바꾸거나 정보에 손실이 발생하면 데이터의 확률분포도 바뀌게 된다.
- 시퀀스 데이터를 분석할때 모든 과거의 정보들이 필요한 것은 아니다. 어느정도의 최근 과거의 정보만을 이용하는것이 좋을때가 있다!
- 시퀀스 데이터를 다루긴 위해서는, 길이가 가변적인 데이터를 다룰 수 있는 모델이 필요하다!! 고정된 길이(C)만큼의 시퀀스만 사용하여 모델링하는 경우 AR(C) Autoregressive Model이라고 부른다.
- 또다른 방법으로는 바로 이전 정보를 제외한 나머지 정보들을 Ht라는 잠재변수로 인코딩해서 활용하는 잠재 AR모형도 있다. 잠재 변수를 어떻게 인코딩할것인가? → RNN으로 해결 가능 → 잠재변수 Ht를 신경망을 통해 반복해서 사용하여 시퀀스 데이터의 패턴을 학습하는 모델이 RNN.
- t에 따라서 변하는것은 잠재변수와 입력 데이터!!
- RNN의 역전파는 잠재변수의 연결그래프에 따라 순차적으로 계산한다. BPTT
- 시퀀스 길이가 길어지면 기울기 소실이 발생할 수 있다. → 모델이 불안정해진다. 이를 해결하기위해 미래 시점의 몇개의 시점은 끊고 그래디언트를 계산해주어 역전파 해주는 것! truncated BPTT : 미래시점부터 Ht+1까지만 역전파 받고, Ht는 Ot에서만 역전파 받아서 다시 쭉~~ 가는 느낌. → 사실 이렇게 해도 문제가 있음 → LSTM, GRU을 사용한다!!
'[Boost Camp AI Tech]' 카테고리의 다른 글
[Boost Camp AI Tech] Week4 (0) | 2023.04.30 |
---|---|
[Boost Camp AI Tech] Week3 (0) | 2023.04.29 |
[Boost Camp AI Tech] Week2 (0) | 2023.03.31 |
[Review] 네이버 부스트 캠프 AI Tech 5기 합격 후기 (0) | 2023.02.14 |