728x90

1) 파이썬 object에 대한 설명

 

먼저 파이썬 언어 자체가 '객체 지향 프로그래밍' 기반으로 만들어진 언어이다.

 

따라서 단순한 문자 및 숫자 변수 보두 객체로 만들어진다.

 

예를들어 'a'같은 경우 'str' class로 구성되어 만들어지는 객체이며,

'str' class가 가지는 attribute(상태) 나 method(행동, 함수)를 모두 활용할 수 있다.

 

마찬가지로 1과 같은 숫자 변수도 'int' class로 구성되고 이에 해당되는

attribute 나 method를 활용할 수 있다.

 

2) 파이썬 네임스페이스에 대한 설명

 

즉, 파이썬에서 우리가 선언하는 변수들은 모두 객체(object)이다.

따라서 하나의 변수를 선언할 때마다 그 변수명과 매칭되는 object가 존재한다.

 

이러한 namespace에서 각 obejct에 대한 매핑은 dictionary 형태의 자료형으로 구현된다.

 

파이썬에서의 namespace는 3가지로 분류된다.

  • 전역 네임스페이스: 모듈별로 존재하며, 모듈 전체에서 통용될 수 있는 이름들이 소속된다.
  • 지역 네임스페이스: 함수 및 메서드 별로 존재하며, 함수 내의 지역 변수들의 이름들이 소속된다.
  • 빌트인 네임스페이스: 기본 내장 함수 및 기본 예외들의 이름들이 소속된다. 파이썬으로 작성된 모든 코드 범위가 포함된다.

 

저장된 형태의 예 하나 보면 아래와 같다.

{'a': 10, 'outer_func': <function outer_func at 0x7f90c3ac5f28>, '__package__': None, '__file__': 'namespace_example01.py', '__spec__': None, '__builtins__': <module 'builtins' (built-in)>, '__name__': '__main__', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f90c3a8ec18>, '__doc__': None, '__cached__': None}

 

 

3. argparse

 

일단 argparse는 python code를 실행할 때 , command line에서 쉽게 인자(argument)를 받아서 실행할 수 있게 만들어 놓은 라이브러리이다. 기본 구성은 다음과 같다.

 

##main.py 

import argparse

#파서 만들기
parser = argparse.ArgumentParser(description='Argparse example')

#인자 추가하기
parser.add_argument('--learning_rate', '-lr', type=float, default=0.001, help='learning rate')
parser.add_argument('--mode', type=str, defualt='train', choices=['train', 'test'])
parser.add_argument('--no_gpu', action='store_true')
parser.add_argument('--epochs', type=int, required=True, help='number of epochs')

#내가 쓴 인자 저장
args = parser.parse_args()

#인자 사용
lr = args.lr

https://jayeon8282.tistory.com/6

 

Argparse, python 기반의 명령형 인터페이스 라이브러리

argparse란 프로그램에 필요한 인자를 사용자 친화적인 명령행 인터페이스로 쉽게 작성하도록 돕는 라이브러리 이다. 즉, command 창에서 프로그램 내의 인자를 조절하게끔 도와준다. 참고로 argparse

jayeon8282.tistory.com

 

 

4. vars()를 통한 args dictionary형태로 변환

 

이렇게 저장한 인자를 'vars()'를 이용해 dictionary형태로 변환하여 사용이 가능하다.

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> args = parser.parse_args(['--foo', 'BAR'])
>>> vars(args)
{'foo': 'BAR'}

 

 

 

 

728x90
728x90

 

파이썬을 사용할 때, 특정 폴더 내의 파일 리스트를 가져와야 할 때가 있다.

 

나같은 경우는 pytorch dataloader를 구성할 때 주로 사용한다.

 

 

'/mnt/ssd0/CHC/Project/ICT_Admin/DeepLabV3Plus-Pytorch/datasets/data/traffic/test_data_20210127/다발_서울경인_test_data/다발지역_서울'

 

위와 같은 경로 아래의 하위 폴더 내의 jpg파일을 리스트로 가지고 오고 싶다고 해보자

 

하위폴더 리스트의 경우 다음과 같은 명령어로 가져올 수 있다.

 

glob("./*/")

 

결과는 아래와 같다.

 

'./1898/', './6838/', './255/', './8218/', './5145/', './5232/', './6835/', './4150/', './5130/', './6705/', './4116/', './6817/', './5194/', './1906/', './6843/', './4106/', './5020/', './1846/', './341/', './1884/', './9451/', './235/', './6746/', './4064/', './237/', './301/', './1865/', './4146/', './8112/', './8100/', './8111/', './9474/', './8223/', './9464/', './6724/', './5165/', './4137/', './4113/', './5120/', './6800/', './6861/', './357/', './8201/', './6856/', './6762/', './1808/', './8174/', './5199/', './5128/', './8136/', './6798/', './8197/', './9297/', './1832/', './3994/', './9388/', './4013/', './4052/', './5004/', './1829/', './8202/', './4151/', './328/', './6747/', './8115/', './5124/', './9419/', './38/', './2840/', './9381/', './5144/', './8211/', './9431/', './5138/', './4092/', './9391/', './6742/', './8187/', './1844/', './6848/', './6748/', './4134/', './6808/', './5149/', './4085/', './2825/', './36/', './1892/', './9450/', './337/', './5224/', './6819/', './5147/', './302/', './9397/', './321/', './9400/', './5231/', './9374/', './6822/', './5262/', './1886/', './5160/', './4109/', './50/', './1819/', './9437/', './4036/', './6812/', './4129/', './9457/', './8145/', './6613/', './9402/', './6778/', './9445/', './267/', './6851/', './5143/', './5121/', './5220/', './58/', './5169/', './2822/', './6714/', './4007/', './6847/', './4059/', './6745/', './6731/', './9384/', './5247/', './8173/', './4600/', './6792/', './1847/', './6829/', './6719/', './6730/', './6751/', './5198/', './4111/', './8159/', './1895/', './8188/', './9442/', './1890/', './353/', './9385/', './4067/', './295/', './7990/', './4114/', './1894/', './8210/', './5015/', './1863/', './9293/', './5218/', './8206/']

 

그러면 이 하위폴더 아래의 jpg 파일을 가지고 오고 싶으면 어떻게 하면 될까?

 

다음과 같이 하면 된다.

 

glob("./*/*.jpg")

 

결과는 다음과 같다.

 

'./1863/gsv_1.jpg', './1863/gsv_2.jpg', './9293/gsv_3.jpg', './9293/gsv_0.jpg', './9293/gsv_1.jpg', './9293/gsv_2.jpg', './5218/gsv_3.jpg', './5218/gsv_0.jpg', './5218/gsv_1.jpg', './5218/gsv_2.jpg', './8206/gsv_3.jpg', './8206/gsv_0.jpg', './8206/gsv_1.jpg', './8206/gsv_2.jpg']

 

그러면 만약에 각 하위폴더내에 또다른 하위 폴더가 있고, 그 아래에 있는 image파일까지 가지고 오고 싶을때는 어떻게 하면 될까?

 

다음과 같은 명령어를 사용하면 된다.

 

glob("./**/*.jpg", recursive=True)

 

여기서 '**'은 recursive의 의미로서 glob("./*/*.jpg") 명령어를 하위폴더에서 계속해서 반복해서 시행한다고 생각하면 된다. (recursive=True를 넣어야 함)

 

관련하여 설명이 있는 사이트는 아래와 같다.

 

 

https://resumetmachine.tistory.com/entry/%ED%8F%B4%EB%8D%94%EC%99%80-%ED%95%98%EC%9C%84%ED%8F%B4%EB%8D%94-%ED%8C%8C%EC%9D%BC-%EB%AA%A9%EB%A1%9D-%EB%A7%8C%EB%93%A4%EA%B8%B0-globglob

 

[Python] 파이썬으로 폴더와 하위폴더 파일 목록 만들기 glob.glob()

파일을 다루는 파이썬 프로그램 코딩시, 특정 폴더와 그 하위 폴더에 있는 파일 목록이 필요할 때가 있습니다. glob 모듈의 glob 함수는 제시된 조건에 맞추어 파일명을 구하여 리스트 형식으로 만

resumetmachine.tistory.com

 

https://velog.io/@k7120792/Glob-%ED%8C%A8%ED%84%B4%EA%B3%BC-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D

 

Glob 패턴이 뭘까?

서론 타입스크립트의 tsconfig, tslint 설정과 웹팩 설정을 직접 해보면서 이게 도대체 뭘 나타내는 코드일까..?라고 생각하게 만드는 것들이 있었습니다. 그 중에 하나가 바로 글롭 패턴(Glob Pattern)

velog.io

 

728x90
728x90

map의 경우 파이썬 list에 있는 요소를 지정된 함수로 처리해주는 함수이다.

 

예를 들면 다음과 같이 실수로 이루어져 있는 list를 map함수를 이용하여 간편하게 정수로 변환할 수 있다.

 

a = [1.2 , 2.5 ,3.7, 4.6]
a = list(map(int, a))
a
[1,2,3,4]

https://dojang.io/mod/page/view.php?id=2286 

 

파이썬 코딩 도장: 22.6 리스트에 map 사용하기

이번에는 리스트에 map을 사용해보겠습니다. map은 리스트의 요소를 지정된 함수로 처리해주는 함수입니다(map은 원본 리스트를 변경하지 않고 새 리스트를 생성합니다). list(map(함수, 리스트)) tupl

dojang.io

 

728x90
728x90

쉘스크립트 명령어를 보다가 다음과 같은 명령어를 발견함.

 

2>&1 | tee

 

여기서 tee명령어는 표준출력(stdout)을 화면과 파일 동시에 출력하는 명령어이다.

 

이때 2>&1는 오류가 발생할 경우 오류메시지를 포함하여 파일로 저장하는 명령어이다.

 

https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_tee,_%ED%99%94%EB%A9%B4%EA%B3%BC_%ED%8C%8C%EC%9D%BC%EC%97%90_%EB%8F%99%EC%8B%9C_%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0

 

리눅스 tee, 화면과 파일에 동시 출력하기 - 제타위키

다음 문자열 포함...

zetawiki.com

 

728x90
728x90

scp 파일전송을 다음과 같이 local에서 server로 시도하려는데 권한 error가 나는 경우가 있다.

 

sudo scp -P 1214 -r ./gtFine_trainvaltest.zip vclab@115.145.135.150:/mnt/ssd0/CHC/Project/ICT_Admin/Se_Seg/datasets/cityscapes
scp: /mnt/ssd0/CHC/Project/ICT_Admin/Se_Seg/datasets/cityscapes/gtFine_trainvaltest.zip: Permission denied

 

이는 server에서 docker container 환경으로 폴더를 생성할 경우 root 권한으로 생성되는데

현재 전송을 시도하는 계정은 'vclab'계정이기 때문에 root계정으로 생성된 폴더에는 전송이 불가능하기 때문이다.

 

따라서 서버에 접속하여 root 권한으로 생성된 폴더를 vclab권한으로 변경해주어야 한다.

 

다음 명령어로 폴더 권한을 확인한다.

ls  -al

 

결과는 다음과 같다.

drwxrwxrwx  7 vclab vclab 4096 Aug 13 05:00 .
drwxrwxrwx  5 vclab vclab 4096 May 24 02:13 ..
drwxrwxrwx  3 root  root  4096 Aug 13 05:04 ICT_Admin
drwxrwxrwx  3 root  root  4096 Jun  2 02:38 ICT_Medical
drwxrwxrwx 11 root  root  4096 Jul 29 13:33 LG_edu
drwxrwxrwx  4 root  root  4096 Jul 11 11:16 RE_openset
drwxrwxrwx  3 vclab vclab 4096 Jul 18 11:17 SDS_edu

 

root 권한으로 된 폴더를 다음 명령어로 vclab 권한으로 바꿔주자.

 

sudo chown -R vclab Project/

 

위 명령어를 사용하면 Project 하위 폴더를 모두 vclab 계정으로 권한을 변경하여 준다.

( -R 옵션 : 하위폴더 모두 적용)

 

이후 시도하면 전송 가능하다.

 

728x90
728x90

Paper

https://arxiv.org/abs/2103.00953

 

Adversarial Reciprocal Points Learning for Open Set Recognition

Open set recognition (OSR), aiming to simultaneously classify the seen classes and identify the unseen classes as 'unknown', is essential for reliable machine learning.The key challenge of OSR is how to reduce the empirical classification risk on the label

arxiv.org

Code

https://github.com/iCGY96/ARPL

 

GitHub - iCGY96/ARPL: Official PyTorch implementation of "Adversarial Reciprocal Points Learning for Open Set Recognition"

Official PyTorch implementation of "Adversarial Reciprocal Points Learning for Open Set Recognition" - GitHub - iCGY96/ARPL: Official PyTorch implementation of "Adversarial Reciproc...

github.com

 

 

 

Introduction

 

기존의 softmax방법이나 Prototype learning 모두 known data에 대해서만 objective function을 적용해주기 때문에 known class와 unknown class sample이 유사한 곳에 embedding되는 현상을 막을 수 없었다.

기존의 방법들이 known class의 구분을 신경썼다. 따라서 각 known class에 대한 prototype을 지정하거나 신경을 썼다.

그러나 ARPL의 경우 '반대로 각 Class에 해당하지 않는 것에 대한 center, prototype 지점을 정의'한다. 그리고 그 점을 Reciprocal point라고 명명한다.

 

 

 

위의 그림 (a)와 같이 특정 클래스가 아닌 sample들의 prototype point를 각 Class에 대해서 지정해준다. (Not C1 , Not C2 , Not C3) 이렇게 하기 위해서는 기존 Class와 reciprocal point의 거리를 멀게 objective를 설정하면 되긴 하지만, unknown sample들이 embedding 되는 위치가 적절히 bounded되지 않는다는 단점이 있다. 때문에 논문에서는 open space를 최대한 줄이기 위한 bound를 설정해주게 된다. 

 

또한 추가적으로 gan model을 이용해 sample을 생성하고 이를 활용한다. 기존 gan과 다른점은 생성한 sample이 classifier를 통과했을때, recipocal point와 가깝게 mapping이 되도록 유도한다는 점이다. (실제 sample이 아니므로)

이와 같은 유도를 표현한 것이 바로 Fig3.(c)이다.

 

 

Method

 

method를 설명하기 위해 여러가지 용어정의가 필요하다.

Sk 는 k번째 class가 embedding 되는 space를 의미한다. 그러므로 k번째 class에 대한 open space는 다음과 같이 정의된다.

그리고 k class에 대한 open space Ok는 다음과 같이 나눌 수 있다. 

k class가 아닌 다른 known class들이 mapping되는 O pos k , 그리고 나머지 unknown class가 mapping 되는 O neg k,

그러므로 다음과 같이 표현이 가능하다.

 

이렇게 정의하였을 때, 다음과 같은 에러를 줄이는 것이 objective이다.

 

 

첫번째 term은 classification loss term이고, 두번째 term은 open space를 줄이는 term이다.

open space, R_0는 다음과 같이 정의된다.

식을 해석하면, 아래는 전체 embedding space를 의미하고, 위는 unknown class sample이 embedding되는 space를 의미한다. 즉, 전체 embedding space중에서 unknown class sample이 embedding되는 space의 비율을 open space라고 정의한다. 그리고 본 논문에서는 이러한 space를 줄이는 것을 목표로 한다.

 

이러한 loss term을 각 Class 모두에서 행하기 때문에 아래와 같이 표현이 가능하다.

이를 다시 표현하면 아래와 같다. ( one vs rest를  multiclass classification 형태로 변형)

 

이때, D_L은 labelled data이고, D_U는 unlabelled data이다.

 

 

 

class k의 reciprocal point를 P k라고 나타내면, reciprocal point는 k class에 속하지 않는 sample들의 Prototype을 의미하기 때문에  O_k에 속하는 sample들은 S_k에 속하는 sample보다 P_k에 가까워야 한다. 

 

 

위의 식을 살펴보면, K class에 속하지 않는 labeled data및 unlabeld data들과 reciprocal point Pk과의 거리를 쟀을 때, 가장 큰 값을 추출하더라도, k-class에 해당하는 labeled data sample과 P_k와의 거리보다는 작길 바라는 식이다.

 

이때,  distance는 다음과 같이 정의된다.

de는 둘간의 euclidean distance를 줄이겠다는 의미이고, dd는 둘간의 각도를 줄이겠다는 의미이다.

각도의 경우 (-)를 붙여서 값이 작을때 , 즉 각이 클때, 거리가 먼것으로 정의하였다.

 

 

 

Classification probability는 아래와 같이 정의한다.

 

 

식의 의미는 다음과 같다. 분모는 normalization term이고, 모든 reciprocal point와 sample이 embedding된 위치와의 거리를 구한다. 그리고 분자의 경우 해당 class k에 대한 reciprocal point에 대한 distance이다.  reciprocal point와의 거리는 멀수록 해당 class일 확률이 높기 때문에 위와 같이 식을 정의한다.

 

이에대해서 NLL loss를 적용함으로 classsicfication에 대한  optimization을 수행한다.

 

이러한 objective function을 unknown sample과 known sample에 대한 거리를 maximization하기는 하지만, open space O_k에 대해서 제약이 없기 때문에 S_k와 O_k간의 overlap이 발생한다는 단점이 있다.

 

 

그 다음 open space risk term을 다루기 위해서 본 논문에서는 Adversarial Margin Constraint (AMC)를 제안한다.

open space는 위에서 말한 것처럼 O pos k , O neg k로 나뉜다. 모든 k class에 대해서 open space를 모두 더하면 다음과 같이 표현이 가능하다.

 

S_k와 O_k를 잘 분리하기 위해서는 O_k의 space를 잘 bounding하는 것이 중요하다. 

그래서 다음과 같이 recipocal point와 해당 하는 k 클래스의 'not k class' sample들의 거리를 특정 R값이 이하로 bounding하여 준다.

 

물론 이러한 bounding만으로는 Openspace를 모두 바운딩하는 것은 불가능하다.

 

아무튼 아래와 같이 tranining sample과 해당 class reciprocal point의 거리를 최소한 R이상을 만들도록 함으로,

간접적으로 open space에 있는 sample들은 reciprocal point와 R이하의 거리를 가지도록 만든다.

 

위의 식과 classfication loss를 합치면 아래의 효과를 지닌다고 말하고 있고, 그에 대한 증명을 하고 있다.

 

 

이러한 것을 multi class에 대한 식으로 표현하면 다음과 같다.

 

 

그래서 앞의 내용을 종합하면 아래와 같이 Loss 식을 구성할 수 있다.

 

 

자세한 알고리즘은 다음과 같다.

 

 

 

 

 

 

이렇게까지 하면 unknown sample을 어느정도 걸러낼 수 있으나, generator로 부터 생성된 sample까지 cover하지는 못한다. 그러므로 Confusing samples (CS)를 생성해서 이용함으로서 unknown class sample을 더 잘 걸러내도록 한다.

 

 

일단 생성하는 sample은 gan을 이용한다.

gan에 대한 수식은 일단 일반적인 gan과 동일하다.

 

 

여기다가 optimization 식을 하나 더 추가해준다.

 

위 식은 기존의 Classsifition의 NLL Loss식과 동일하나 Minimization이 아니라 Maximization하는 것이 다르다.

 

위 optimization 식이 만족하는 경우는 confusing sample이 reciprocal point에 가깝게 embedding되는 경우이다.

논문에는 아래와 같이 표현되어 있다.

따라서 GAN 네트워크에 대한 Optimization식을 표현하면 다음과 같다.

이렇게 생성하는 경우, 결과론적으로 Confidence Calibrated 논문에서 uniform에 fitting해서 sample을 generating하는 것과 같은 효과를 가지게 된다. (realistic하지만, unknownc class의 경계에 위치하는 sample) 

 

 

 

또한 생성한 sample을 이용해서 추가적으로 Enhancement하는 term을 추가해준다.

생성한 sample의 경우, uniform distribution에 다시 fitting 해준다. ( Classificaition 부분에서 enhancement해줌.)

 

 

또한 real sample과 생성된 sample들이 같은 domain에 위치하는 것을 막기 위해 Auxiliary Batch Normalization(ABN)을 추가한다. 방법은 real sample과 generated된 sample들에 대해서  batch normalization을 따로 해주는 것으로, 실제로 성능향상에 효과를 보았다고 한다.

 

 

 

Experiments

 

먼저 network는 OSRCI  network와 동일하다. gan model은 confidence calibrated classifier와 동일한 model을 사용하였다.

 

본 논문에서는 OSCR이라는 척도로도 성능을 비교했는데, Classification을 잘 맞춘 비율과 Openset을 잘맞추는 비율을 threshold값을 변화해가며 그린 curve라고 보면 된다. (기존 AUROC는 classification 성능이 높을 필요는 없었음)

 

 

 

-OOD evaluation

 

 

 

 

 

 

Summary

 

본 논문은 기존의 method들이 각 class에 대해서 prototype을 설정하고 이에 맞춰서 학습을 진행한것과 달리, 

각 Class가 아닌 sample에 대해서 prototype을 설정하고 reciprocal point를 설정한 것이 특징이다.

이를 위해서 각 trainining class k에 대해 reciprocal point와의 거리가 멀어지도록, 학습을 진행한다. 또한 reciprocal point와 training sample간의 거리가 최소한 R보다는 크도록 만든다.

 

이렇게 학습하는 것이 원래 목적인 unknown class sample이 reciprocal point에 R이하로 bounding되어 embedding되는 효과를 지닌다고 논증하고 있다.

 

또한 이것에 추가하여 Confusion sample(CS)을 생성하고, 이를 추가로 학습에 이용한다.

이때, confusion sample은 Confident-Calibrated 논문에서 sample을 생성하는 것처럼, trainining sample과 유사하지만 unknown class sample을 생성한다. (자세한건 위 수식 참고) 또한 생성한 sample을 다시 uniform distribution에 mapping한다. 

 

그리고 ABN이라는 생성한 sample에 대해서만 따로 Batch normalization을 적용하여 생성한 sample과 기존의 real sample 과의 distribution이 겹치지 않도록 한다.

 

 

 

Pros

 

내가 생각하는 좋은 점은 open space를 bounding 시킨 점인듯하다. reciprocal point라는 개념도 좀 재밌긴 하다.

ABN 모듈도 작긴 하지만 신선한 생각이라고 느껴졌다.

 

Cons

 

split을 기존 논문들과 다른 split을 사용했다. 결국 좀 정당한 evalution이 이루어지지는 않은 논문이라고 생각한다.

그리고 샘플이 generation하여 추가로 학습하는 부분은 confident-calibration 논문과 너무 유사하다. 

단지 자신의 method에 적용할 수 있도록 수정한 것 밖에 없다고 생각한다.

728x90
728x90

https://www.inference.vc/causal-inference-3-counterfactuals/

 

Causal Inference 3: Counterfactuals

Counterfactuals are weird. I wasn't going to talk about them in my MLSS lectures on Causal Inference, mainly because wasn't sure I fully understood what they were all about, let alone knowing how to explain it to others. But during the Causality Panel, Dav

www.inference.vc

 

Counterfactuals

 

Conterfactual이라는 용어가 딥러닝 논문에서도 한번씩 나오는데 사실 이해하기 너무 어렵다.

counterfactual의 확률적 용어상의 정의는 다음과 같다.

 - a probablilistic answer to a "what would have happened if" question -

("만약 그랬다면 어떻게 되었을까"라는 질문에 대한 확률적 대답)

 

이번 글에서는 Counterfactual 용어에 대한 이해를 여러가지 예시를 통해 이해해본다.

 

 

Example 1: The election example

 

Given that Hilary Clinton did not win the 2016 presidential election, and given that she did not visit Michigan 3 days before the election, and given everything else we know about the circumstances of the election, what can we say about the probability of Hilary Clinton winning the election, had she visited Michigan 3 days before the election?

(힐러리 클린턴이 2016년 대선에서 승리하지 못했고, 선거 3일 전 미시간주를 방문하지 않았다고 하자. 선거 상황에 대해 아는 모든 것을 감안할 때 힐러리 클린턴이 3일 전 미시간주를 방문했다면 당선 가능성에 대해 어떻게 말할 수 있을까.)

 

이를 해석하면 다음과 같다.

 

Let's try to unpack this. We are are interested in the probability that:

  • she hypothetically wins the election (그녀가 선거에 이길 확률)

conditionied on four sets of things:

  • she lost the election (그녀는 사실은 선거에서 졌다.)
  • she did not visit Michigan (그녀는 미시건에 방문하지 않았다.)
  • any other relevant an observable facts (여러 다른 관측할 수 있는 사건들)
  • she hypothetically visits Michigan ( 만약 그녀가 미시건을 방문했다고 가정했을 때)

 

위의 상황을 보면 힐러리 클린턴이 선거에서 졌는데, 선거에서 이길 확률을 알고 싶어한다던가,

미시건에 사실은 방문하지 않았는데, 방문했다고 가정하는 등, 왜 이런일을 하는지 의문이 들 수 있다.

 

그러나 정치적 분석을 할 때, 왜 힐러리 클린턴이 졌는지 분석한다면, 다음 선거에서 이길 수 있을 것이고,

이러한 이유 때문에 counterfactual 분석을 하게 된다.

 

 

 

Example 2: Counterfactual fairness

 

Given that Alice did not get promoted in her job, and given that she is a woman, and given everything else we can observe about her circumstances and performance, what is the probability of her getting a promotion if she was a man instead?

(앨리스가 직장에서 승진하지 않았고, 그녀가 여자이고, 그녀의 상황과 실적에 대해 우리가 관찰할 수 있는 모든 것을 고려할 때, 그녀가 남자였다면 승진할 가능성은 얼마나 될까요?)

 

이러한 counterfactual question의 특징 중 하나는 바로 specific datapoint에 대한 결과를 질문한다는 것이다.

위의 예에서는 전반적인 승진과정에 대한 fairness를 묻는 것이 아니라, 'Alice' case에 대한 결과만을 묻는다는 것이다.

 

또한 counterfactual은 우리가 실제로는 수행할 수 없거나 힘든 intervention을 포함하고 있다는 것이 또 다른 특징이다.

(위의 예시에서는 Alice는 실제로는 남자가 될 수 없다. 그러므로 남자가 되었을 때의 실험을 수행하는 것은 불가능하다.)

 

 

 

Example 3: My beard and my PhD

 

Given that I have a beard, and that I have a PhD degree, and everything else we know about me, with what probability would I have obtained a PhD degree, had I never grown a beard.

(제가 수염을 기르고 있고, 박사학위도 있고, 저에 대해 알고 있는 다른 모든 것들이 있다고 가정할때, 제가 수염을 기르지 않았다면, 박사학위를 받았을 확률이 얼마나 될까요?)

 

이 예시를 실제로 계산해보기 전에 한번 직관적으로 생각해보자. 수염을 기르는 것과 박사학위를 받는 것과 관련이 있을까? 아마 없을 것이다. 수염을 기르던, 안 기르던 공부는 열심히 했을 것이고, 어찌되었든 박사학위를 받았을 것이다.

그러므로 직관적으로 생각해 봤을때, 위의 예시의 확률을 아마 1에 가까울 것이다.

(수염을 기르지 않았을때, 박사학위를 받았을 확률)

 

 

 

Observational queries

 

다음은 위의 예시의 확률을 살펴보기 위해 수집한 data이다. feature로는 beard, married, fit, PhD가 있다.

 

 

이 data로부터 p(🎓|🧔=0)를 구하면 우리가 원하는 결과를 얻을 수 있을까?

안타깝게도 그건 불가능하다. 우리가 직관적으로 생각했을 때, p(🎓|🧔=0)는 1이 되어야 한다.그러나 위에서 p(🎓|🧔=0)를 계산하면 0.5가 나온다. 물론 데이터양이 충분하다면 이러한 문제는 해결될 수도 있지만,어찌되었든 counterfactual 문제에서 궁금한 인과관계에 대한 해답은 찾을 수 없다.

 

 

intervention queries

 

결론적으로 이 문제를 풀기 위해서 우리가 해야 되는 것은 p(🎓|do(🧔=0))를 구하는 것이다. (not p(🎓|🧔=0))이때 p(🎓|do(🧔=0))를 구하기 위해서는 dataset과 더불어 causal diagram이 필요하다.

 

이렇게 causal diagram이 있으면 우리는 실제로는 불가능하지만 가상으로  distribution을 생성할 수 있다. 위의 예에서는 원래는 수염이 있는 사람들을 수염이 없는 상태로 가상으로 distribution을 만들어 내어서 p(🎓|do(🧔=0))를 계산하고 있다.

 

그러면 p(🎓|do(🧔=0))가 우리가 원하는 counterfactual probability를 설명하는 것이 맞는가? 사실 p(🎓|do(🧔=0))는 counterfactual probability를 설명하는 것은 아니다. 

 

위의 counterfactual probability 예시를 보면 특정 사람 (ex: Alice, me)에 대해서 원하는 상황의 확률 값을 계산하는 것을 볼 수 있다. 그러나 p(🎓|do(🧔=0))의 경우 특정 사람 (me)가 아닌 randomly sampled individual에 대한 확률이다. 

 

 

Counterfactual queries

 

counterfactuals에 대한 설명을 끝내기 위해 stuctural equation models를 소개하려고 한다.

 

stuctural equation models은 causal graph보다 변수간의 관계를 좀 더 explicitly하게 나타낸 그림이다.

(출처 : https://jmlr.org/papers/v14/bottou13a.html)

 

 

위 그림이 나타내는 각 변수간의 관계도는 다음과 같다.

이 SEM (The structural equation model)은 causal graph가 담고 있는 정보를 모두 담고 있으며, intervention 또한 해당되는 function을 제거함으로 표현이 가능하다.

 

 

Back to the beard example

 

 

그러면 SEM 모델을 위의 beaed 예시에 적용해 보면 어떨까?

위 그림과 같이 표현이 가능하다. 위에서 f1이 제거되는 것이 intervention을 의미하며 (수염이 없을 시를 가정하는 것)

왼쪽의 입실론1,2,3가 각 사람에 대한 확률 noise값을 의미한다.

 

이렇게 입실론 변수가 각 사람별로 추가됨으로서, 사람별로 intervention이 적용되었을 때의 결과를 추론하는 확률 모델을 만들 수 있으며, 따라서 우리가 원했던 counterfactual에 대한 확률을 계산하는 모델을 만들 수 있게 된다.

 

결론적으로 counterfactual에 대한 설명은 아래와 같이 할 수 있다.

 

"making a prediction about features of the unobserved twin datapoint based on features of the observed datapoint."

 

수학적으로 나타내면 아래와 같다.

 

p(🎓|🧔=0,🧔=1,💍=1,💪=1,🎓=1)

 

이때, *로 표시된 것이 바로 unobservable variable이다. *가 없는 것은 observable variable이다.

 

 

 

Summary

 

Despite it being untestable, and difficult to interpret, humans make use of counterfactual statements all the time, and intuitively it feels like they are pretty useful for intelligent behaviour. Being able to pinpoint the causes that lead to a particular situation or outcome is certainly useful for learning, reasoning and intelligence. So my strategy for now is to ignore the philosophical debate about counterfactuals, and just get on with it, knowing that the tools are there if such predictions have to be made.

728x90
728x90

https://www.inference.vc/causal-inference-2-illustrating-interventions-in-a-toy-example/

 

Causal Inference 2: Illustrating Interventions via a Toy Example

Last week I had the honor to lecture at the Machine Learning Summer School in Stellenbosch, South Africa. I chose to talk about Causal Inference, despite being a newcomer to this whole area. In fact, I chose it exactly because I'm a newcomer: causal infere

www.inference.vc

 

Three scripts

 

본 글에서는 앞서 살펴본 intervention이라는 개념을 Toy example을 통해서 살펴본다.

아래와 같이 실제로는 결과가 같지만 과정이 다른 3가지 gaussian distribution script가 있다.

 

이는 결과적으로는 모두 같기 때문에 결과를 봐서는 구분이 불가능하다.

 

 

Interventions

 

물론 이 3가지 scripts는 동일한 distribution을 나타내지만, 완전히 동일한 것은 아니다.

예를 들어 이 3가지 scripts에 interfere나 intervention이 들어가게 되면 다른 결과를 도출하게 된다.

 

예를 들어 나는 x가 3으로 고정되기를 원했고 그래서 아래와 같이 x=3으로 setting했다고 가정해보자.

 

 

이렇게 intervention이 이루어진 경우 다음과 같이 distribution이 바뀌게 된다.

 

이를 marginal distribution 형태로 표현하면 다음과 같다.

 

 

그러나 이러한 intervention이 들어가지 않은 경우에는 3개다 같은 distribution이다.

 

결론적으로 data의 joint distribution 정보만으로는 intervention이 적용되었을 때의 distribution을 알기는 힘들다는 것이다.

 

 

Causal Diagrams

 

이러한 상황에서 intervention을 적용했을 때, distribution을 어떻게 알 수 있을까?

바로 causal diagram을 이용하는 것이다.

 

아래 scripts 같은 경우는 아래와 같이 causal diagram을 그릴 수 있다.

이 causal diagram을 이용해서 실제로 어떤 setting에 대해서 실험을 하지 않아도

intervention distribution을 구할 수 있고, 이 부분에 사용되는 것이 바로 'do-calculus'이다.

 

 

이러한 intervention의 효과를  graphically하게 나타낸 것이 바로 causal diagram에서 mutilation (제거, 훼손)을 수행한 다음 그림이다.

 

이에 따라 intervention을 수행했을 때, distribution이 어떻게 바뀔지 우리는 sampling하지 않고도 예측이 가능하다.

예를 들어 맨처음 예시 같은 경우는 x=3으로 고정을 하면 그에 따른 영향을 받기 때문에. p(y|do(X)) = p(y|x)라고 생각할 수 있으나, 두번째 case의 경우는 x에 y가 관련이 없기 때문에 x=3으로 고정을 하더라도 p(y) 그대로 나옴을 알 수 있다.

 

실제로 아래와 같이 도출이 가능하다.

 

 

728x90

'Math > Causal Inference' 카테고리의 다른 글

Part 3: Counterfactuals  (0) 2021.07.21
Part 1: Intro to causal inference and do-calculus  (0) 2021.07.15

+ Recent posts