오늘은 인과 그래프 발견에 대해 공부하고 과제를 진행했다.
Counterfactual reasoning
일어나지 않은 상황을 고려해 그 상황이 추천 시스템의 결과에 미치는 영향을 파악하는 방법
ex) 환자가 특정 약을 복용해 병이 나았다면, 만약 환자가 이 약을 안먹었어도 병이 나았을까를 추정하는 것.
인과 충분성(Causal sufficiency)
모든 측정되지 않은 교란변수(Unmeasured confounder)를 모델에서 고려하고 있다는 가정
교란변수는 두 변수 사이의 인과관계를 왜곡하는 제 3의 변수다.
모델이 충분히 모든 관련 변수를 포함하고 있어 인과관계를 제대로 추론할 수 있다는 것
관측 데이터를 학습하는 일반적인 머신러닝 모델은 상관관계는 학습해도 인과관계를 파악하긴 힘들다. 그래서 RCT같은 실험이나 인과 추론, 인과 그래프 발견 같은 방법을 사용한다.
Randomized Controlled Trial, RCT
무작위 대조 실험. 무작위 배정 후 대조그룹과 실험그룹으로 나눠 평가해 인과관계를 확인한다.
data가 어떻게 생성되냐에 따라 어떤 모델이 성능이 더 좋은지 달라질 수 있다.
따라서 데이터의 생성과정과 변수들간의 관계성을 아는 것이 중요하다.
이를 알기 위해 변수들간의 인과 관계를 시각적으로 표현한 것이 인과 그래프
Causal discovery(인과 발견)
관측된 데이터를 기반으로 변수들 간의 인과관계를 탐지하고 추론하는 과정
인과 그래프 탐색의 가정
실제 관측된 데이터 상으로는 독립으로 보이나 graph상으로는 독립이 아닌 경우가 있을 수 있다. 하지만 여기서는 일단 그런 상황은 없다고 가정한다. + cycle은 없고, 관측하지 못한
변수는 없다고 가정한다.
실제 관측된 데이터를 토대로 DAG형태의 인과 그래프를 추론하는 것이 목적인 알고리즘
모든 변수들이 완전 연결된 그래프에서 시작해서 2개씩 조건부 독립성을 검증해 변수들간의 연결 구조 골격을 추정한다. 그 후 v(immorality)구조를 탐색하고 cycle이 발생하지 않도록 방향성을 설정해 DAG그래프를 만든다.
효율적인 비용으로 올바른 인과 구조를 식별할 수 있지만 많은 데이터가 필요하고 노이즈에 민감하고, 비선형 관계는 알아내기 힘들다는 단점이 있다.
변수 간의 인과 관계를 찾기 위해 연속적인 최적화 기법을 사용하는 접근법
그래프 구조를 직접 탐색하지 않고 최적화 문제로 변환해서 구조를 학습한다.
이론보다는 현실에서 실험적으로 잘 작동하는 알고리즘.
변수 A,B를 놓고 A->B인지 B->A인지 인과관계를 찾고 싶을 때는 아래의 방법을 사용한다.
sample data(관측된 데이터)를 기반으로 input, output 페어가 다른(A->B or B->A) 2가지 모델을 학습한다. 그 후 새로운 intervention(인위적 개입, 중재) data를 두 모델에 다시 학습해서 adaptation speed를 확인해 더 빠른 adaptation 속도(log likelihood가 더 빠르게 올라가는)를 보이는 모델을 고른다.
추가 학습 속도가 빠른게 더 좋은 이유는 이미 좋은 data로 parameter를 잘 학습했기 때문에 새로운 intervention data로 추가학습해도 더 빨리 수렴한다는 논리
변수가 여러개가 되면 각 변수를 input으로 주고 가장 output을 잘 예측하는 걸 찾고, 그래프에 mask(차단)를 어디에 주면 좋을 지 찾는다.
즉, observation data를 기반으로 학습해 여러 conditional distribution을 모델링한다.
그 중에서 interventional data에 대해 가장 잘 일반화하는 부분을 선택한다.
기본-5번 과제
Gibbs sampling을 추천 시스템 알고리즘에 어떻게 적용하는 지 Bayesian Probabilistic Matrix Factorization (BPMF) 논문을 기반으로 과제를 진행했다.
기본-6번 과제
데이터 가치측정 기법인 Influence Function을 AutoRec 모델을 기반으로 구현하는 방법에 대한 과제를 진행했다.
IF를 사용하면 Hessian행렬 계산에서 연산이 많이 필요한데 이를 극복하기 위해 Hessian-vector product로 Hessian 계산을 근사한다.
기본-7번 과제
Backdoor adjustment를 실제로 구현하는 과제.
def backdoor_adjustment_estimator(data, t, adjustment_set):
"""
backdoor adjustment to estimate E[Y | do(T = t)]
"""
estimate=0
for z, subpop_data in data.groupby(adjustment_set):
# TODO: P(Z=z) = num of (Z=z) / num of total
num_data = data.shape[0]
p_z = subpop_data.shape[0] / num_data # Z=z를 가진 데이터의 수 / 전체 데이터의 수
# TODO: P(Y=1|T=t, Z=z) = num of (Y=1, T=t, Z=z) / num of (T=t, Z=z)
num_t_z = subpop_data.loc[subpop_data['T']==t].shape[0] # T=t면서 Z=z인 데이터의 수
expected_y = subpop_data.loc[(subpop_data['T']==t) & (subpop_data['Y']==1)].shape[0] / num_t_z # Y=1 & T=t면서 Z=z인 데이터의 수 / T=t면서 Z=z인 데이터의 수
estimate += expected_y * p_z
return estimate
# TODO: backdoor_adjustment_estimator 함수를 이용하여 E[Y=1|do(T=1)]을 추정하시오.
stat_estimand_t1 = backdoor_adjustment_estimator(data, 1, 'Z')
# TODO: backdoor_adjustment_estimator 함수를 이용하여 E[Y=1|do(T=0)]을 추정하시오.
stat_estimand_t0 = backdoor_adjustment_estimator(data, 0, 'Z')
# Treatment의 causal effect를 구하시오.
causal_effect_T = stat_estimand_t1 - stat_estimand_t0
ate['Backdoor_adjustment']=causal_effect_T