카테고리 없음
CS 면접 준비1
imsmile2000
2023. 7. 7. 01:08
쿨백-라이블러 발산(Kullback-Leibler divergence)
KLD는 두 확률분포의 차이를 계산하는 데에 사용하는 함수이다.
- 어떤 이상적인 분포에 대해, 그 분포를 근사하는 다른 분포를 사용해 샘플링을 한다면 발생할 수 있는, 정보 엔트로피 차이를 계산한다.
- 두 확률 분포의 차이라고 거리 함수는 아니다.
- 비대칭으로, 두 함수의 위치를 바꾸면 함수값도 달라진다
- 두 함수가 완전히 일치할 때 KLD는 0이되고 떨어질수록 값이 커진다.
- KLD의 식을 전개해보면 (P의 기준으로 봤을 때 Q에 대한 Cross entropy) - (P에 대한 정보 엔트로피)
다양한 쓰임
- Teacher-student network structiure
- 한 모델이 학습한 것을 작은 모델에 넘겨주는 것
- knowledge distillation에서도 비지도학습과 지도학습 방식으로 나뉘는데 라벨값이 없는 비지도 학습의 경우에 사용되는 loss 함수가 KL-Divergence이다. 두 모델이 점차 닮아갈수록 분포의 차이가 점점 줄어드므로 KLD가 0이 되는 것이 목표
- Variational Inference
- 사후 분포를 직접 구하는 것은 어렵기 때문에 사후 분포를 근사하는 variational distribution q(z)를 구하는 경우가 많다.
- 이것을 variational inference라고 하며 p(z|x)와 q(z) 간의 KLD를 구하여 근사하도록 한다.
- variational inference 개념은 생성모델 VAE의 기본 개념이 된다.
- Kullback-Leibler divergence를 최소화하거나 최대화하는 것은 어떤 의미를 갖나요?
- KL divergence를 최소화하는 것은 두 분포를 가능한 한 가깝게 맞추는 것을 의미합니다. 예를 들어, 생성 모델링에서는 KL divergence를 최소화하여 생성된 샘플 분포를 실제 데이터 분포에 가깝게 만들려는 목표로 사용될 수 있습니다.
- 반대로, KL divergence를 최대화하는 것은 두 분포를 가능한 한 멀리 떨어뜨리는 것을 의미합니다. 이는 분포 간의 차이를 강조하고, classification 문제에서는 클래스 간의 분류 정확도를 높이는 데 사용될 수 있습니다.
- 결론적으로 목표에 따라 분포의 유사성을 조절할 수 있어, 클래스를 잘 구분하고 싶을 때 사용
- Kullback-Leibler divergence를 사용하여 분포 간의 차이를 줄이거나 유사성을 높이는 문제에 대한 예시
- 생성 모델에서 실제 데이터 분포와 생성된 데이터 분포간의 차이를 측정하는데 사용됨. 생성된 데이터의 분포가 실제 분포와 최대한 가깝게 만들어서 KLD가 0이 되도록 하는 것이 목표
- 분류 문제에서 KLD를 최대화하여 클래스 간의 분포를 최대한 차이나게 만들어 클래스 구분
- 확률적 모델 간의 차이를 측정하고 모델의 정확성을 평가. KLD를 줄이는 방향으로 모델을 개선
Comprehesion
- 반복되거나 특정 조건을 만족하는 리스트를 보다 쉽게 만들어내기 위한 방법
Decorator
- 데코레이터(decorator)를 사용하면 함수를 수정하지 않고도 유연하게 함수에 특정 동작을 추가하거나 작동 방식을 바꿀 수 있습니다.
>>> def say_hi():
... print("Hi!")
...
...
>>> say_hi()
Hi!
--------------------------------------------------------------
>>> def decorate(func):
... def wrapper():
... print("before")
... func()
... print("after")
... return wrapper
--------------------------------------------------------------
>>> say_hi = decorate(say_hi)
>>> say_hi()
before
Hi!
after
Compile 함수
- 파이썬 내장 함수이며, 문자열을 컴파일하여 파이썬 코드로 반환한다
- eval()과 exec() 함수의 기능을 반복적으로 실행
- eval() 함수 - 지정 표현식 평가 후, Python 실행 구문이면 실행.
- exec() 함수 - 지정 코드 (또는, 객체)를 실행.
- compile(source, filename, mode=eval,exec,single, .....etc)
- x = compile('print("Homzzang.com")', 'hz', 'eval')
- exec(x)
- 결과값: Homzzang.com
Interpreter
- 파이썬은 인터프리터 언어로서 코드를 한 줄씩 읽고 해석하여 실행하는 방식으로 동작합니다. 인터프리터는 코드를 실행하기 위해 컴파일된 바이트 코드를 해석하고 결과를 출력합니다.
- 파이썬 인터프리터는 코드를 직접 실행하며, REPL(Read-Eval-Print Loop) 환경에서 대화식으로 코드를 작성하고 실행할 수 있습니다.
Copy
- 얕은 복사 (copy.copy): 변수를 복사했지만 참조하는 곳이 동일해서 같은 곳을 참조함
- 그래서 원본에 값을 추가하면 복사한 값도 동일하게 적용됨
- 복사를 했음에도, 값을 변경하면 다른 변수에 영향을 끼침
- 복사한 값에 append를 한다고 원본이 바뀌지는 않음. 그대로
- append를 하게되면 메모리 주소가 달라지기 때문
- 얕은 복사로는 mutable 내부의 mutable의 메모리 주소는 달라지지 않는다는 것
- 변수간 독립성이 보장되지 않는다
- 깊은 복사 (deep copy)
- 서로간의 독립성이 완전히 유지됨
- 원본/복사한 값 둘다 바꿔도 안바뀜
- 확률적 경사하강법(Stochastic Gradient Descent)과 배치 경사하강법(Batch Gradient Descent)의 차이는 무엇인가요?
- 배치 경사하강법
- 매 gradient 업데이트마다 전체 훈련 데이터 세트를 사용하여 경사를 계산하고 파라미터를 업데이트합니다. 즉, 한 번의 업데이트에는 모든 데이터가 사용됩니다.
- 전체 데이터 세트를 사용하여 경사를 계산하므로 각 경사 업데이트에는 계산 비용이 크지만, 업데이트 속도가 상대적으로 느릴 수 있습니다.
- 모든 데이터를 사용하므로 global 최적점에 수렴하는 경향이 있습니다. 그러나 데이터 세트가 크면 한 번의 업데이트에 많은 계산이 필요하므로 수렴 속도가 느릴 수 있습니다.
- 확률적 경사하강법 (배치가 1인 경사하강법)
- 매 gradient 업데이트마다 하나의 미니배치를 랜덤하게 선택하여 gradient를 계산하고 파라미터를 업데이트합니다. 따라서 각 업데이트는 단일 배치에 대해 수행됩니다.
- 각 업데이트에서 하나의 미니배치만 사용하므로 계산 비용이 낮지만, 업데이트 속도가 더 빠르며 불안정할 수 있습니다.
- 각 업데이트마다 랜덤하게 선택된 데이터 포인트를 사용하므로 local 최적점에 수렴할 가능성이 높지만, 업데이트의 노이즈로 인해 수렴 속도가 더 빠를 수 있습니다.
- 배치 경사하강법
- 유클리드 거리: 두 점 사이의 거리
- 코사인 유사도: 두 벡터 간의 코사인 각도 (-1~1)
- Scale 차이가 크지 않으면 유클리드 유사도
- Scale 차이가 크면 코사인 유사도
- 거리 기반으로 두 책의 유사도를 측정하면 (1,1)과 (2,000, 2,000)사이의 거리는 큰차이가 나기때문에 두 책의 유사도는 낮다고 말할 수 있지만, 각도 기반으로 두 책의 유사도를 측정하면 기울기가 같고 방향이 같기 때문에 두 책의 유사도는 매우 높게 나타난다.