분류 전체보기 (298)


두 정규분포 모양의 모집단의 모평균의 차이에 대한 검정: Two sample t-test 


예를 들어, 서울사람과 부산사람의 몸무게의 평균의 차이가 있는지에 대해 검정하고자 한다. 이럴 때 흔히 쓸 수 있는 방법이 바로 two sample t-test 방법이다. 두 집단의 평균을 비교하여 차이가 유의한지를 보는 방법이다. 우선 언제 t-test 를 할 수 있는지 정리해보자.


t-test 는 연속형 확률 변수이고 평균이 mu 이고 표준편차가 sigma 인 분포를 갖는 모집단으로부터 n 개의 표본을 추출했을 때, n 이 크면 클 수록 중심극한정리에 의해 표본 평균이 평균이 mu 이고, 표준편차가 sigma/root(n) 인 정규분포에 근사된다는 사실을 이용한 방법이다. 따라서 t-test 의 가정은 아래 두 가지로 요약된다. 


t-test 의 가정


1. 연속형 변수 

2. 정규성

3. 임의추출 

4. 큰 샘플 사이즈 


변수가 연속형이어야하고 임의추출을 해야한다는것은 당연해 보이지만, t-test 에서 왜 정규성을 따라야할까? 처음 t-test 를 배울 때, 많이 질문하는 부분이 't-test 는 샘플이 정규분포를 따라야하나요?' 이다. 결론은 '정규분포를 따르면 좋다.' 라고 생각한다. 왜냐하면, 표본 크기가 크면, 어쨌든 표본 평균의 분포는 정규분포에 근사되기 때문에 t-test 가 불가능한 것은 아니기 때문이다. 하지만 문제는 평균이 대표성을 갖는가이다. 그리고 평균이 대표성을 갖기 위해서는 정규분포와 같은 모양이어야한다. 따라서 모평균을 비교하는 문제에 있어서, 모집단이 정규 분포와 비슷해야 타당한 것인데 모집단이 정규 분포임을 확인하는 방법은 샘플의 분포를 이용하는 길밖에 없다. 따라서 샘플의 정규성을 확인함으로써 평균이 대표성을 갖는지 확인해야한다. 만약 샘플이 정규성을 보이지 않는다면, t-test 의 타당성이 떨어지게 된다. 


예를 들어 모집단의 분포가 이항분포나 포아송 분포처럼 특정 상황에서 정규분포로 근사된다면, t-test 의 결과는 타당할 것이다. 하지만 정규성을 띄지 않는 분포에서 왔다면, t-test 보다는 비모수 검정이 더 적합하다. 왜냐하면 평균이 대표성을 띄지 않기 때문이다. 


Two sample t-test 의 종류



More about the basic assumptions of t-test: normality and sample size, statistical round, 2019


위 그림은 mu1-mu2 의 분포를 H0가 참일때와 H1 이 참일 때로 나누어서 보여주는 그림이다. 1종 오류와 2종 오류의 개념에 대해 잘 이해할 수 있는 그림이다. two sample t-test 에 개념에 대해 간단히 설명해보자. 두 집단의 모평균 (mu1, mu2) 에 차이가 있는지 검정하는 two-sample t-test 는 아래의 분포를 이용해 검정한다. 


$$ \tilde X - \tilde Y \sim N(\mu_1, \mu_2, \frac{s^2_1}{n_1} + \frac{s^2_2}{n_2}) $$ 


H0가 참일 때 (mu1-mu2=0) 검정 통계량은 표본 분산을 이용해 아래와 같은 분포를 갖는다.


$$ \frac{\tilde X - \tilde Y}{\sqrt{\frac{s^2_1}{n_1}+\frac{s^2_2}{n_2}}} ... 식 1 $$


위 검정 통계량이 특정한 자유도를 갖는 t 분포를 갖는다는 사실을 이용해서 검정하는 것인데, t 분포의 자유도는 두 그룹의 분산에 대한 가정에 따라 다르기 계산된다.


1. 등분산 가정 (합동분산 추정량을 이용한 t-test)


합동분산추정량은 아래와 같이 계산된다. 


$$ s^2_p = \frac{n_1-1}{(n_1-1)+(n_2+1)}s^2_1 + \frac{n_2-1}{(n_1-1)+(n_2+1)}s^2_2 = \frac{(n_1-1)s^2_1 + (n_2-1)s^2_2}{n_1+n_2-2} $$ 


이 합동분산 추정량을 위 식1 의 s_1, s_2 대신에 넣으면 검정통계량을 계산할 수 있고, 이 검정통계량은 자유도가 n_1+n_2-2 인 t 분포를 따른다. 식 1을 합동 분산 추정량을 통해 쉽게 계산하기 위해 다음과 같이 정리할 수 있다. 


$$ \frac{\tilde X - \tilde Y}{\sqrt{s^2_p(\frac{1}{n_1}+\frac{1}{n_2})}} \sim t(n_1+n_2-2) $$


2. 등분산 가정을 하지 않을 때 (Welch's t-test)


등분산 가정을 하지 않으면 위 식1을 그대로 계산하면 된다. 다만, 자유도의 계산이 다소 복잡하다. 이 방법을 Welch's t-test 라 하는데 이 방법에 따라 자유도를 유도하는 것은 어려운 부분이므로, 단지 이렇게 계산한다는 것만 알고 넘어가도록 하자. Welch's t-test 에서 자유도는 아래와 같이 계산된다. 


$$ v=\frac{(s^2_1/n_1 + s^2_2/n_2)^2}{\frac{(s^2_1/n_1)^2}{n_1-1} + \frac{(s^2_2/n_2)^2}{n_2-1}} $$


즉, Welch's t-test 는 다음의 분포를 통해 검정한다. 


$$ \frac{\tilde X - \tilde Y}{\sqrt{\frac{s^2_1}{n_1}+\frac{s^2_2}{n_2}}} \sim t(v) $$



1, 2 두 방법 모두 표본수가 많다면 정규근사를 이용할 수 있다. 이 경우 t분포를 이용하지 않고 표본 수가 많을 때, 검정 통계량이 표준정규분포를 근사적으로 따른 다는 사실을 통해 검정한다. 

중심극한정리를 통한 표본 비율 분포 근사와 모비율의 검정


비율의 분포 


당신이 정책 담당자이고 전체 국민들 중 대상으로 새로운 교육 개혁에 대해 찬성하는 사람들의 비율을 알고 싶다고 해보자. 그리고 그 비율을 p 라고 할 때, p > 0.5 임을 보이고 싶다고 하자. 하지만 현실적으로 전체 국민에 대해 찬반 여부를 조사하는 것은 불가능에 가깝다. 따라서 전체 인구 집단에서 샘플링한 표본에서 구한 비율을 통해 위 가설 (p > 0.5) 을 보이고 싶다. 


예를 들어, 1000명을 조사해서 p=0.48 을 얻었다고 하자. 이 때, p > 0.5 라고 할 수 있을까? 이 표본에서는 p 가 0.5를 넘지 못했지만, 0.5 에 매우 근접했기 때문에 다른 1000 명을 조사하면 0.5가 넘을 수 있을 것을 기대할 수 있을 법하다. 한 가지 방법은, 1000 명을 여러번 뽑아서 p가 0.5를 넘는 비율을 보는 것일 것이다. 예를 들어, 1000 명을 100번 뽑았는데, 95번이 p>0.5 일 경우, p > 0.5 라고 결론내려볼 수 있을 것이다. 


하지만 1000 명을 100 번 뽑는 것도 마찬가지로 시간과 비용이 많이 든다. 따라서 현실적으로 비율의 분포를 이용한다. 표본을 통해 비율의 분포를 구할 수 있다면 더욱 쉬운 방법을 통해 가설을 검정할 수 있을 것이다. 표본 안에서 뽑은 값이 분포 안에서 어디에 위치해 있는 가를 보는 것이다. 가설이 분포 흔히 관찰할 수 있는 것이라면 그 가설이 맞는 것이고, 그렇지 않다면 가설이 틀린 것이다. 우선, 모집단의 일부를 샘플링하여 찬성 비율을 보는 것은 다음과 같이 모델링 해볼 수 있다. 모집단의 정책에 대한 찬반여부를 확률변수 X 라 할 때, 다음과 같은 베르누이 분포를 갖는다. 


$$ X \sim Be(P) $$ 


이 때, 1000의 크기를 갖는 표본 X1,...,X1000 이 존재하면, 찬성 비율은 다음과 같이 계산할 수 있다. 


$$ \tilde P = \frac{\sum_{i=1}^{i=1000}{X_i}}{n} $$ 


중심극한정리에 의해 p^ 은 정규근사가 가능하다. 왜냐하면 p^ 은 베르누이 분포의 표본 평균이기 때문이다. 


$$\tilde P \sim N(P, \frac{p(1-p)}{n}) $$ 


비율의 검정


중심극한정리를 통해 p^ 의 분포는 구했는데, 이것을 통해 p > 0.5 인지 아닌지를 어떻게 검정할 수 있을까? 사실 좋은 방법은 앞서 언급했듯, 1000 명을 여러번 뽑아서 p가 0.5를 넘는 비율을 보는 것일 것이다. 이 경우 분포를 모르더라도 결론을 내려볼 수 있다. 하지만 우리는 통계적, 근사적으로 이 문제를 해결하려고 한다. 


검정의 방법은 크게 두 가지로 나누어볼 수 있다. 


1. 가설검정을 이용한 방법

2. 신뢰구간을 이용한 방법 


가설검정을 이용한 방법


가설검정을 이용한 방법의 절차는 다음과 같다. 


1. 귀무가설 및 대립가설의 설정 


양측 검정, 단측 검정 둘 중 하나를 선택해 수행한다. 


$$ H_0 = 0.5 $$

$$ H_1 > 0.5 $$ 


2. 검정 통계량 계산 


아래분포를 이용해 검정통계량을 계산

$$ \tilde P \sim N(0.5, \frac{0.5*0.5}{1000}) = N(0.5, 0.00025) $$ 


> x = seq(0.01, 1, 0.001)

> y = dnorm(x=seq(0.01, 1, 0.001), mean=0.5, sd=sqrt(0.00025))

> plot(x, y)


검정통계량은 아래와 같다. 


$$ \frac{0.48-0.5}{\sqrt{0.00025}} = -1.26 $$ 


3. 유의수준 설정 


일반적으로 5 %의 유의수준을 설정한다. 


4. 기각역 (또는 p-value) 계산 


검정통계량과 유의수준을 통해 기각역을 결정한다.


기각역은 아래와 같은 절차로 계산한다. 


$$ P(\tilde p > R) = 0.05 $$ 


위 식에서 R 이 기각역인데, R = 0.526 이다. 


>qnorm(p=0.95, mean=0.5, sd=sqrt(0.00025)) 

0.526


유의수준을 통한 기각여부 결정은 아래와 같이한다. 유의수준 계산에는 검정통계량을 이용한다.


> 1-pnorm(-1.26)

0.89

 

$$ P(X > -1.26) = 0.89 $$ 


5. 기각역 포함 여부를 통해 의사 결정을 수행한다. 


p-value 가 0.05 보다 큰 0.89 이고, 기각역 (X > 0.526) 에 포함되지 않으므로, (사실 두 개는 같은 정보이다.) 귀무가설을 기각할 수 없다. 


신뢰구간을 이용하는 방법


신뢰구간을 이용한 검정 방법의 절차는 다음과 같다. 신뢰구간을 이용한 방법은 양측 검정을 위해 사용할 수 있다. 


귀무가설 및 대립가설의 설정 


$$ H_0 = 0.5 $$

$$ H_1 != 0.5 $$ 


신뢰수준을 정하고 p 의 구간추정을 통해 신뢰구간을 구한다. 95% 신뢰구간은 다음과 같이 구할 수 있다. 


$$ \tilde P \sim N(p, \frac{p(1-p)}{n}) $$ 

$$ P[\tilde p - 1.96* \sqrt{p(1-p)/n} < p < \tilde p+ 1.96 * \sqrt{p(1-p)/n}] = 0.95 $$

$$ (\tilde p - 1.96* \sqrt{p(1-p)/n}, \tilde p+ 1.96 * \sqrt{p(1-p)/n}) $$


위 식에서 n,p,sd 를 대입하면 다음과 같은 신뢰구간을 얻을 수 있다. p 대신의 p의 추정량 p^을 넣는다. 


(0.469, 0.531)


따라서 p^ 은 0.48 이고, 위 구간에 들어가기 때문에 귀무가설을 기각할 수 없다. 


모비율의 신뢰구간을 구할 때, 한가지 알아두면 좋은 테크닉은, p 에 표본 비율 p^을 대입하지 않고, 0.5를 대입하면 가장 보수적인 신뢰구간을 구할 수 있다는 것이다. 


$$ (\tilde p - 1.96* \sqrt{0.5(1-0.5)/n}, \tilde p+ 1.96 * \sqrt{0.5(1-0.5)/n}) $$


p를 0.5로 추정할 때, 신뢰구간의 길이가 가장 넓어지기 때문에 만약 표본 수가 충분한다면 신뢰구간의 타당성을 확보하기 좋은 방법이라고 할 수 있고, 표본수가 적어 표본비율의 변동이 큰 상황에서도 대략적인 신뢰구간을 구할 수 있다는 장점이 있다. 



Label smoothing


본 포스팅에서는 최근 딥러닝 모델의 정확도와 Calibration 향상 최종적으로는 model generalization 에 도움이 된다고 알려진 Label smoothing 에 대해서 살펴보도록 하겠습니다. 


Introduction


이미지 분류는 이미지를 n 개의 카테고리로 할당하는 일을 말합니다. 예를 들어, 고양이와 개를 분류하는 이미지 분류문제를 예로 들어보자. 이미지의 크기가 248x400 라면, RGB 각 3개의 채널이 존재하기 때문에 하나의 이미지는 248x400x3 의 3차원 벡터로 표현할 수 있습니다. 이 벡터를 단 하나의 값으로 요약하는 것이 이미지 분류 문제에서 하는 것입니다. 

이미지 분류 문제의 예



고양이와 개를 분류하는 위의 예는 이진 분류 (binary classification) 의 예로 볼 수 있습니다. 이미지 분류의 목적 (248x400x3) 의 벡터를 하나의 값으로 요약하는) 을 달성하기 위해서는 학습 데이터 (training data) 가 필요합니다. 즉, 데이터의 갯수가 n 일 때, 학습 데이터의 형태는 이미지 : nx248x400x3 / Label: n 의 벡터로 표현할 수 있습니다. 근데 문제는, 잘못 labeling 된 이미지가 있을 수 있다는 것입니다. 특히, 이미지의 출처가 인터넷인 경우에는 이러한 mislabeling 의 문제가 빈번하게 일어납니다. 

예를 들어, 위와 같은 상황에서 딥러닝 모델은 Dog 라고 잘못 labeling 된 고양이의 이미지까지 학습하게 됩니다. 물론 데이터의 수가 적다면 이를 눈으로 일일히 확인하며 수정할 수 있지만, 데이터의 수가 많다면 이는 불가능합니다. 


$$ L = −(ylog(p)+(1−y)log(1−p)) $$

Binary classification 에서는 위와 같은 binary cross entropy 를 씁니다. 딥러닝 모델을 트레이닝하면서 loss 를 계산할 때, 잘못 labeling 된 sample 에 대해서는 loss 값이 크게 계산되게 됩니다. 이것은 training 도중 문제를 발생시킬 수 있습니다. 

Label Smoothing — One Possible Solution

이러한 문제를 해결하기 위한 한 가지 가능한 방법이 label smoothing 입니다. 이진 분류 문제에서 label 은 0 또는 1로 주어집니다. label 이 1이라고 하는 것은 그것의 label 이 1 임을 100 % 확신한다는 뜻입니다. 하지만 반드시 그렇지 않을 수 있다는 것이 핵심 문제입니다. 왜냐하면 사람이 annotation 하는 것이기 때문에 실수의 가능성이 언제나 존재합니다. 이 때 발생할 수 있는 잘못된 loss 의 영향을 줄이기 위하여 label 을 0또는 1이 아니라 smooth 하게 부여하는 것이 label smoothing 의 아이디어입니다. 또한 label smoothing 은 mislabeling 된 데이터를 고려하기 위해 사용되는 것에 추가적으로 regularization에 도움을 주면서, model generalization 과 calibration 에 도움이 된다는 것이 알려져있습니다.

Maximum likelihood learning with a softmax classifier and hard targets may actually never converge, the softmax can never predict a probability of exactly 0 or exactly 1, so it will continue to learn larger and larger weights, making more extreme predictions. forever (출처)

tensorflow 에는 label smoothing 에 대한 implementation 을 제공합니다. 아래와 같이 softmax_cross_entropy 의 parameter 로 label_smoothing 값을 전달할 수 있습니다. 


tensorflow document 를 보면 label_smoothing 값이 0이 아닌 경우, 아래와 같이 label smoothing 을 한다고 설명이 되어있습니다. 

"If label_smoothing is nonzero, smooth the labels towards 1/num_classes: new_onehot_labels = onehot_labels * (1 - label_smoothing) + label_smoothing / num_classes"

이것이 무엇을 뜻할까요? 

예를 들어 개/고양이 이진분류문제에서 label_smoothing 이 0.2로 설정되었다고 해봅시다. 그리고, 0은 고양이, 1은 개라는 rule 로 labeling 을 했다고 합시다. 위의 식을 이용하면 새로운 label 은 아래와 같이 계산됩니다. 

new_onehot_labels = 1 * (1 — 0.2) + 0.2 / 2 = 1*(0.8) + 0.1
new_onehot_labels = 0.9 

그리고 원래 0으로 부여되었던 label 의 경우 tensorflow 에서는 1-0.9 = 0.1 로 부여하게됩니다. 왜 label smoothing 을 이용하면 model calibration 에 도움이 될까요? 직관적인 해석은, 모델이 target 을 정확하게 예측하지 않아도 되도록 만드는 것입니다. 예를 들어, 원래 label 이 1인 데이터에 대해서 모델은 1을 최대한 예측하도록 트레이닝되는데 label smoothing 을 적용하면 '그래 0.9 정도면 잘 예측했다.' 정도의 loss 값을 산출하게 되는 것입니다. 그렇기 때문에 모델이 overconfident 해지는 경향을 막게 되아 calibration 및 regularization 이 되는 효과를 갖게 됩니다.  

Reference

https://towardsdatascience.com/label-smoothing-making-model-robust-to-incorrect-labels-2fae037ffbd0

https://arxiv.org/pdf/1906.02629.pdf

https://medium.com/@nainaakash012/when-does-label-smoothing-help-89654ec75326

https://rickwierenga.com/blog/fast.ai/FastAI2019-12.html

  • Lee 2020.02.04 11:24

    심플하면서도 실용적이고 재미있는 아이디어네요.ㅎㅎ 포스팅 잘보고갑니다.

Chip-seq 의 기초 이해 


Genome 상의 단백질을 코딩하는 부분이 아닌 지역 (non-coding region) 에서 기능적인 부분을 찾기 위한 노력들이 이루어지고 있습니다. genome 연구 초창기에는 non-coding region 이 junk DNA 즉, 아무런 기능을 하지 않는다고 잘못 알려져 있었던 적도 있지만, non-coding region 에 위치한 다양한 기능 부위 (functional elements)들은 유전자 발현에 중대한 영향을 미치며, 이것이 인간의 복잡성을 결정하는 것으로 이해되고 있습니다. 이런 의미에서 non-coding region 을 이해하는 것은 중요하며, 이를 위해 다양한 실험 데이터가 모이고 있습니다. 그 중 하나가 바로 chip-seq 데이터입니다. 





Chip-seq의 핵심



  • Chip-Seq = Chip + Next Generation Sequencing 
  • Chip = Chromatin + Immunoprecipitation 


Immunoprecipitation (면역침강반응) 어떠한 sample에서 '특정 물질' (target) 을 찾기 위해 그 특정물질의 항체 (antibody) 를 이용하는 것입니다. Chip은 Chromatin (염색질) 에 Immunoprecipitation 을 하는 것입니다. 이것이 Chromatin 에 적용되는 경우, antibody 를 이용해 DNA 에 특정 위치에 결합한 단백질 (ex. transcription factor) 을 찾을 수 있습니다. 이 부분을 침강시킨 후, NGS 기술을 이용해 시퀀싱하는 것이 Chip-seq 입니다. 


Chip-seq 의 종류 


ChIP–seq and beyond: new and improved methodologies to detect and characterize protein–DNA interactions (Nature review genetics, 2012)


  • Transcription factor chip-seq 
  • Histone modification chip-seq 


Chip-seq은 크게 transcription binding site (tfbs) 를 찾기 위한 tf chip-seq 과 histone modification site 를 찾기위한 hm chip-seq 으로 나뉩니다. 두 경우 실험적으로 약간의 차이가 납니다 (위 그림 참). 또한 sequencing 이후에, 관찰되는 결과도 상당히 다른데, tf chip-seq 의 결과 나타나는 peak는 수십에서 최대 수백 서열 정도 (narrow)이지만, hm chip-seq 의 경우, 많게는 100만 서열 단위까지 길게 나타납니다 (broad peak).



Chip-seq control 


Chip-seq의 목적 중 하나는 genome 상의 특정 기능을 수행하는 부분: tfbs 또는 hm 을 찾기 위한 것입니다. 이를 chippeak finding 라 하는데, 이를 위해 control 데이터가 필요합니다. control 데이터가 필요한 이유는 간단히 말해 Chip-seq 에서 발생하는 noise 때문인데, noise 는 실험적 noise 와, 실제 생물학적 noise 로 나누어볼 수 있을 것 같습니다. 실험적 noise 의 경우, 해당 target 이 아닌 genome  상의 다른 부분이 sequencing 이 된 것입니다. 약 80~90 % 정도가 target 이 아닌데도 sequencing 이 된 부분 입니다. 이를 background noise 라고도 부릅니다. 생물학적인 noise 의 경우, genome 상의 특정 부분 예를 들어 repetitive sequence 가 있는 부분은 실험적인 이유에서가 아니라 그냥 reference genome 에 alignment 가 잘 되기 때문에 peak 처럼 보이기도 합니다. 따라서 이러한 noise 들을 보정하기 위해 control 데이터가 필요합니다. 


control 데이터는 크게 "input"과 "mock" 으로 나뉩니다. 


  • input: cross-link와 sonication 은 됐는데, immunoprecipitation 안된 것 
  • mock: IgG 라고하는 특별한 항체를 이용해 genome 상의 random 한 부분이 immunoprecipitation 되도록한 것 


이 중에서 일반적으로 input 이 control 로 많이 쓰입니다. 



Peak Finding


Chip-seq 도 NGS 이기 때문에, 최종 결과로 fastq 파일이 나옵니다. 이를 reference genome 에 alignment 를 해서 bam 파일이 나오게 되는데, 이 bam 파일에서 chip-seq 의 한가지 목적 = functional region 찾기를  하기 위한 것 peak finding 입니다. peak 가 있는 부분은 더 많이 sequencing 이 되었다는 것이고, chip-seq 에서 immunoprecipitation 이 많이 된 부분이기 때문에 알고자 하던 부분 (tfbs, hm)일 가능성이 크기 때문입니다. peak finding 을 할 때 여러가지 이슈가 있기 때문에 여러 복잡한 알고리즘들이 많이 쓰입니다. 이러한 알고리즘을 종합해서 구현해 놓은 tool 중 가장 많이 쓰이는 것이 MACS2 라는 Tool 입니다. Chip-seq 의 경우, single-end sequencing 이기 때문에 strand-dependant bimodality 의 문제가 생기는데, MACS 에서는 이를 보정하기 위한 shifting 모델을 사용하고, local dynamic 파라미터를 활용한 포아송 분포 모델을 통해 특정한 크기를 갖는 window로 genome 을 훑으며 통계적으로 유의한 지역 (peak) 을 찾습다. 


참고

http://epigenie.com/wp-content/uploads/2013/02/Getting-Started-with-ChIP-Seq.pdf

'Domains > Bioinformatics' 카테고리의 다른 글

Functional genomics - Chip-seq 의 기초  (0) 2019.09.05
Samtools, Bcftools 설치 방법  (0) 2018.05.14
GATK4 설치  (0) 2018.02.20
Chip-seq 데이터를 통한 binding motif 분석 [rGADEM]  (0) 2018.01.13
Variant calling 이란?  (0) 2017.11.20
IGV Tutorial [BAM File]  (0) 2017.10.16


2019 대한의료인공지능학회 Summer School 참석후기


2019 대한의료인공지능학회 Summer School 에 참석하였습니다. 참여자들을 조사했는데, 대략 전체 참석자중 MD 가 절반정도, 나머지 연구원 및 학생이 절반 정도되었던 것 같습니다. 각 교육 세션은 50분에서 1시간 30분사이로 진행되었습니다. 


1일차에는 의료인공지능을 하기 위한 방법론들을 주로 다루었습니다. 역시 현재 의료인공지능 분야의 state-of-the-art 인 deep learning 에 대한 내용이 중점이었습니다 (물론 이를 설명하기 위한 수학적, 통계적 개념은 많이 다루었습니다). 교육 내용은 deep learning 을 기초부터 다루지는 않았고, deep learning을 의료 데이터에 적용할 때 발생할 수 있는 주요 이슈들에 대해서 개념부터 최근 연구 동향까지 다루었습니다. 현재 연구원으로서 엔지니어링을 의료 데이터에 적용하고 있는 저로서는 발표자 분들과 같은 관심선상에서 많은 것을 배울 수 있었습니다. 


Recent updates of ML/DL/DCNN 


deep learning 중 특히 convolutional neural network (cnn) 을 의료데이터에 적용할 때 생기는 다양한 이슈들에 대해 개념부터 시작해 최근 연구 동향까지 빠르게 다루는 시간이었습니다. 발표자 분께서는 하나의 개념에 대해 깊게 설명하지는 않았으나, 앞으로 관련 개념을 찾아볼 때 충분한 guide 가 될 수 있을 정도로 잘 설명을 해주셨습니다. 


이 세션에서는 아래와 같은 주제들을 다루었습니다. 

  • Transfer learning and domain adaptation
  • Weakly supervised learning
  • Self-supervised learning
  • Explainability
  • Model compression and architecture search
  • Other issues

위 주제들은 모두 의료 인공지능 분야에서 중요한 이슈가 되는 주제들이라고 생각합니다. 


Recent updates of GANs: basic to advanced


아직 연구에 GAN 을 활용하지 않고 있는 저로서는 GAN 의 개념을 잘 모르고 있었는데, 기본 개념과 초기 GAN 의 문제점, 그리고 발전사에 대해 이해하기 쉽게 잘 설명을 해주셨습니다. GAN 은 Generative + Adversarial 두 가지 컴포넌트로 나뉘며, Generator 가 생성된 데이터를 Adversarial 가 진짜 데이터인지 Generator가 생성한 데이터인지를 평가합니다. 이 과정을 반복하면서 Generator 는 Adversarial 을 속일 수 있을 만큼 진짜 같은 데이터를 생성하내게 됩니다. Ian goodfellow가 제안한 초창기 GAN  모델에서 advanced 된 WGAN, CGAN, InfoGAN, Cycle GAN, GauGAN 등의 최근 모델도 다루었습니다. 특히 Cycle GAN 이나 GauGAN 등을 통해 Style transfer를 할 수 있고, 이러한 개념을 활용해 MRI 데이터를 CT 데이터로 변환할 수 있다는 내용이 흥미로웠습니다. 또한 U-net 과 같은 Semantic segmentation model 뿐 아니라, GAN 을 통해서도 segmentation 을 할 수 있다는 사실도 알게 되었습니다. 의료 인공지능 분야에 관심을 갖으며, 아직 GAN 을 많이 접해보지는 않았는데, 이번 강연을 계기로 GAN 관련 내용을 앞으로 공부를 해 보아야겠습니다. 


Mathematical tools in deep learning: A primer


이 세션에서는 deep learning 에서 쓰이는 다양한 수학적 개념에 대해 훑어주셔습니다. 각종 커뮤니티에서 딥러닝을 하기 위해서 필요한 선행지식으로, 수리통계학, 확률론, 선형대수, 컴퓨터 알고리즘 등을 꼽고 있습니다. 물론, 이러한 분야에 대한 개념이 딥러닝을 이해하는데 있어서 큰 도움이 되는 것은 사실입니다. 하지만 딥러닝을 하기 위해서 이러한 학문을 처음부터 끝까지 새로 배우는 것은 큰 시간과 비용이 소모됩니다. 특히 수학 관련해서는, 딥러닝에 활용이되는 수학적인 내용중 핵심적인 부분만 빠르게 학습하는 것이 시간을 줄이는 법일 것입니다. 이러한 관점에서 강연자분은 딥러닝에 활용되고 있는, 수학적인 개념을 집어서 강연을 해주셨습니다.  또한 강연자분은 Dive into deep learning 을 딥러닝 처음 학습 교재로 추천해주셨습니다 (https://www.d2l.ai). 개인적으로 저도 Ian good fellow 의 딥러닝보다 더 딥러닝 입문서로 추천하는 책입니다. Ian goodfellow 의 저서는 다소 교과서적이고 딱딱한 면이 있지만 이 책의 경우 보다 insightful 하게 설명을 하고 있고, 코드도 함께 나와 있어 입문서로써도 좋으며 어느정도 딥러닝에 경험이 있는 사람에게도 충분히 도움될 것으로 생각합니다.  


Explainability


다음은 Unist XAIC 그룹에서 Explainability 에 대해 다루어주셨습니다. Interpretability와 Explainability의 차이와 그것이 의료에 있어서 왜 중요한지에 대해 조금 더 구체적으로 알 수 있었고, 이를 구현하는 기술적인 방법에 대해 파악할 수 있었던 시간이었습니다. Interpretability 란 모델을 해석할 수 있는 것, 즉 딥러닝을 예로 들면, 각각의 layer 와 node가 무엇을 하는지에 대해 이해하는 것으로 볼 수 있습니다. Explainability란 왜  모델이 그러한 판단 (decision-making)을 내렸는가에 대해 reasonable 한 설명을 할 수 있는가에 대한 것입니다. 딥러닝은 black box의 성격이 강한 over-hyperparameterized 된 모델입니다. 초창기에는 모델이 어떻게 돌아가는지보다는 성능, 즉, 도메인 데이터에 대해 잘 working 하는 것이 중점이었습니다. 특히 하지만 의료 분야의 경우 이러한 decision-making이 매우 중요한 분야 중 하나이기 때문에  Interpretability와 Explainability가 중요한 이슈일 것입니다. 


Explaining Deep Neural Networks

  • Input Attribution Method (TU Berlin)

딥러닝 모델의 예측 결과에 대해 시각적 해석을 돕는 방법입니다. LIME, CAM, Layer-wise Relevance Propagation(LRP) 등이 유명한 방법입니다. 여기서 LIME 과 CAM 의 경우, CNN 에만 사용할 수 있는 모형이고, LRP 의 경우 모든 Neural Net 에 사용할 수 있는 방법입니다. 



  • XCAD: Explainable Computer Aided Diagnosis
  • Dissecting Deep Neural Networks (MIT)
  • Generating Examples inside of Deep Neural Networks (UNIST)


Explaining by Combining Explainable Models

  • Automatic Statistician (MIT/Cambridge)
  • Relational Automatic Statistician (UNIST)


Automatic statistician 은 학습된 모델을 여러개의 설명 가능한 모델로 분할하여 설명하는 기법입니다. 


https://www.automaticstatistician.com/index/



Finding Local Explanations (Model Agnostic Methods)

  • Counterfactual Generation (Toronto)
  • SHapley Additive exPlanation (SHAP)


위 방법은 모델 불가지론적 방법이라고 부르는 모델에 상관없이 어떤 모델이든 설명 가능하도록 하는 방법들입니다. 즉, 신경망 뿐만 아니라 다른 머신러닝 모델에도 적용할 수 있습니다. 


Uncertainty


다음은 루닛의 김민철님께서 딥러닝 모델의 Uncertainty 에 대해 다루어주셨습니다. 아래 3가지 내용에 대해 설명하였습니다. 


  • Calibration
  • Uncertainty within a model
  • AUC confidence interval


Calibration 의 정의는 다음과 같습니다.


the probability associated with the predicted class label should reflect its ground truth correctness likelihood.


즉, 예측 모형에서 클래스를 Probability 를 의미하는 값을 통해서 예측할 때, 그것이 실제 정답일 정도 (likelihood) 를 나타내야한다는 것입니다. 모델의 Calibration 을 점검하는 방법은 validation set 에서 probability 가 validation set에서 accuracy 와 비슷한지를 보면 되는데 이 부분에 대해서는 제 이전 포스트를 참조드립니다. Calibration 이 잘되었는지를 측정하기 위해 Expected Calibration Error (ECE) 가 기본적으로 쓰입니다. 


Calibration 이 잘안되는 문제는 training 도 중 NLL (Negative log likelihood) Overfitting이 생기기 때문에 일어납니다. 이러한 calibration 문제를 해결하기 위해 가능한 방법은 다음과 같습니다. 


The reasons for uncertainty

만약 calibration 이 잘 완료된 모델이 어떤 validation 데이터에 대해 0.95 라는 값을 내보냈을 때, 95 % 확률로 해당 label 이라는 뜻입니다. 하지만 일반적으로 모델에 사용하는 데이터는 population data가 아니라 sample 이며, "모델" 을 사용하는 것이기 때문에 이 값을 얼마나 믿어야할지에 대한 고민이 필요합니다. 

두 번째 주제인 Uncertainty within a model 에서는 이러한 모델이 만들어낸 output 의 불확실성을 어떻게 측정하는지에 관한 것입니다. 즉, 모델을 사용하고, sample 을 사용하는 것으로부터 오는 불확실성을 어떻게 제어할 것인가에 관한 것입니다. Linear regression 의 경우 예측값에 대한 분산을 구해서 confidence interval 을 수학적으로 구할 수 있지만 non-linear 에는 분산을 구할 수가 없습니다. 

따라서 bayesian 방법을 통해 모델의 파라미터의 분산을 추정하고 이를 통해 예측값의 분산을 구하는 방법을 주로 사용하게됩니다. 즉, 신경망의 모든 weight 에 사전 분포가 존재한다고 가정합니다. 이를 bayesian neural network 라고 합니다. 

Dropout as Bayesian Approximation


이를 실제로 하는 방법 중에 drop-out 을 이용하는 방법이 있습니다. 아래와 같은 방법으로 model uncertainty 를 구하게됩니다. 


1. Apply Dropout in all layers

2. Train the NN with SGD

3. During the test phase

a. Inference multiple times

b. Aggregate the result to approximate the posterior distribution


ref. Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning (ICML 2016)


요약


Why uncertainty?

  • sample vs population
  • Model parameter and complexity
  • Non linear models like Deep NN have no closed form solution to model variance
  • Bayesian models offer a tractable way to approximate uncertainty within the model


AUC and Confidence Interval


classification 문제에서 label 을 확률값 또는 스코어를 의미하는 값을 통해 예측할 때 주로 사용되는 measure는 Area under curve (AUC) 입니다. 특히 의료분야에서는  모델이 case 와 control을 얼마나 잘 discrimination 할 수 있는지에 대해 default로 사용되는 measure 라고 볼 수 있습니다. 그리고 AUC 의 한 가지 중요한 성질은 Mann-Whitney-Wilcoxon 2-sample U-statistic 과 같다는 것입니다. (Wilcoxon 1945; Mann and Whitney 1947).



왜 그런지에 대해 생각하지 않고, AUC와  U-statistic 이 같은 것이라면, AUC 는 다음과 같은 뜻을 같습니다. 


"disease, non-disease 인 sample 각각 random 하게 하나 씩 뽑았을 때, disease 인 사람이 더 클 확률"


AUC의 confidence interval 을 이러한 Wilcoxon U-stat 이 sample size 가 클 때 정규분포를 따른다는 사실을 이용해 구할 수 있습니다 (Hanley and McNeil (1982))


만약 AUC의 95 % confidece interval 이 (a, b) 인 경우에 이를 어떻게 해석하는 방법은 다음과 같습니다.


같은 population 에서 같은 수의 sample 을 뽑아서 같은 model 을 여러번 만들었을 때, 실제 AUC 가 (a,b)에 포함될 확률이 95 % 이다.


하지만 모든 신뢰구간이 그렇듯 (a,b) 가 sample 을 뽑을 때마다 달라진다는 비판은 있을 수 있다고 생각합니다.


Meta-Learning


Meta-learning 세션에서는 아래와 같은 개념들을 다루었습니다.

  • One shot learning
  • Network Architecture Search (NAS)
  • Auto-agent (Augmentation rule 을 learning)
  • Population-based augmentation
  • optimization transfer (learn-to-learn)


Meta-learning 의 핵심은 task 마다 새로운 네트워크를 만들지 않고, 새로운 task 에 적용하는 것 (knowledge transfer) 입니다. 최종목적은 모델을 사람처럼 learning 하도록 하는 것입니다. 예를 들어, image classification 에서 동물의 종류를 classification 할 때, 각 class 마다 동물의 이미지가 한 장씩 있다고해보면, 모델은 제대로 학습할 수 없지만 사람은 단 한 장의 이미지만 보고도 classification 할 수 있습니다. 사람은 그만큼 적은수의 데이터를 가지고도 generalization 을 할 수 있습니다.  즉, 사람과 모델이 다른점은 지금까지 배워왔던 지식을 활용할 수 있다는 것입니다. 예를 들어 사람은 지금까지 살면서 쌓아온 지식을 토대로 동물 A와 동물 B가 다른 종이라는 것을 쉽게 파악할 수 있습니다. 하지만 모델은 각 task 마다 새로운 모델을 만들고 학습해야합니다. 이러한 문제를 해결하기 위한 분야가 meta-learning 입니다. 또한 Meta learning 의 범위는 매우 넓으며 network architecture search 나, hyper parameter optimization 같은 분야 (learning-to-learn) 도 meta-learning 으로 분류됩니다.

Post-GWAS 와 Functional Genomics 의 이해


Post-GWAS Era: From Association to Function 논문을 기초로하여 Post-GWAS 와 functional genomics 의 등장에 대해 포스팅해보려고합니다. 


DNA 의 구조 발견 및 코돈 


DNA (deoxyribonucleic acid) 의 구조와 유전암호 (genetic code, codon) 이 발견된 이후 수십년간, 인간 유전학 연구는 단백질 코딩 유전자 (protein-coding gene) 의 기능과 구조를 이해하고 왜 단백 코딩 유전자에 변이가 생겼을 때, 질병이 발생하는지에 대한 연구가 중점적으로 이루어져 왔습니다. Central dogma 라고 불리는 생물학의 중심 원리는 유전자가 mRNA 로 전사 (transcribe), 다시 mRNA는 단백질로 번역(translate) 된다고 상정하고 있습니다. 직관적인 유전암호 덕분에 단백질 코딩 유전자에 변이가 생겼을 때, 최종 산물인 단백질의 아미노산 구성에 어떤 영향이 미칠지 쉽게 예측할 수 있었습니다. 


멘델리안 질병


가족 직접성 (Familiar aggregation) 을 강하게 보이고, 가족 내에서 질병이 예측할 수 있는 패턴으로 관찰되는 멘델리안 질병 (Mendelian disease)은 한 유전자의 돌연변이가 생겨 발생합니다.1983년 헌팅턴 질병의 유전적원인을 찾은 것을 시작으로, 다한 멘델리안 질병의 인과성이 있는 유전적 변이를 positional cloning 방법을 통해 잇달아 발견했습니다. 이를 통해 멘델리안 질병에 대한 유전적 원인을 어느정도 이해할 수 있었습니다. 


복합 질환과 전장 유전체 분석


하지만 현재 흔하고, 질병 부담이 큰 질병, 예를 들어 심혈관 질환 (cardiovascular disease), 암 (cancer), 알츠하이머 병 (Alzheeimer's disease), 파킨슨 병 (Parkinson's disease), 당뇨병 (type 2 diabetes) 등의 질병의 경우, 하나의 유전자의 돌연변이로 인해 발생하지 않습니다. 이러한 질병을 "복합질환 (complex trait)" 라고 하는데, 복합질환은 여러 유전 요인 및 환경 요인과 그들의 조합에 의해 영향을 받아 발생합니다. 


복합질환과 연관성이 있는 DNA 의 돌연변이 (genetic variant) 를 찾기 위해 전장 유전체 분석 (genome-wide association study, GWAS) 이 2005 년부터 시작됩니다. 최초의 GWAS 연구라고 불리는 연구는 2005년 science에 출간된 나이 관련 황반병성 관련 연구입니다. 


Complement Factor H Polymorphism in Age-Related Macular Degeneration, Science, 2015)


complement factor H 유전자 주위의 유전적 변이를 나이관련 황반 변성과 연관시킨 이 연구를 시작으로해서 전세계 수많은 연구자들이 복합질환과 연관성이 있는 유전적 변이를 찾기 위한 수많은 전장 유전체 분석 연구를 수행하였습니다. 전장유전체분석은 통계적으로 유의하게 질병과 연관성이 있는 유전적 변이를 찾는 방법이며, 일반적으로 단일염기 다형성 (Single nucleotide polymorphism) 이 많이 사용됩니다. 같은 질병을 대상으로한 GWAS 연구에서 반복적으로 통계적으로 유의하다고 발견되면, 이 변이는 실제 연관성이 있는 (질병의 위험도를 높이는) 변이라고 생각해볼 수 있었습니다. 


하지만 문제는, GWAS 연구의 결과로 발견된 변이 (GWAS Hit) 라도 그것이 실제 생물학적으로 질병의 위험도를 높이는 변이가 아닐 수 있다는 것입니다. 어떤 변이가 질병과 연관성이 있다는 사실은, 해당 인구집단 내에서 개인의 질병 위험도를 계산하는데에는 유용하게 쓰일 수는 있어도, 이것을 통해 질병의 생물학적인 메커니즘을 이해할 수 있는 것은 아니었습니다. 이유는 다음과 같습니다. 


1) 많은 GWAS Hit 들이 실제 연관성이 있는 변이 (causal variant) 와 Linkage disequilibrium 관계에 있음

2) 많은 GWAS Hit 들이 non-coding region 에 위치 (> 90%)해 있는데 이 지역이 무엇을 하는지 모름 


1) Linkage disequilibrium 이란 genome 상의 특정 부분의 서열 (genotype) 이 다른 genotype 과 연관성이 있는 것을 말합니다. LD 가 있는 것은 두 genotype 을 골랐을 때, random 하게 나오는 쌍의 빈도보다 얼마다 deviation 되어있는지를 통해 판단하며, LD 는 genome 상의 실제 거리가 가까울 수록 높습니다. 따라서 causal variant 과 LD관계에 있는 변이들이 GWAS hit 으로 나오게 되는 것입니다. 만약 genome 상의 X 라는 위치에 AA, Aa, aa 3개의 genotype 이 있을 수 있는데, a가 causal variant 라고 할 때, X와 LD 관계에 있는 Y 에 b 라고 하는 대립유전자가 a와 연관이 되어있으면, b도 GWAS hit 으로 나올 가능성이 큽니다. 그리고 GWAS 자체가 imputation 이라는 방법을 이용해서 LD 를 '이용' 해서 통계적으로 유의한 variant 를 찾아내기도 합니다. 


2) 90 % 이상의 GWAS hit 들이 non-coding region 에 위치해 있습니다. 즉, genetic code를 이용해서 해당 변이가 어떤 결과를 불러오는지 알아낼 수 있는 protein coding region 에 비해 non-coding region 은 이러한 해석이 불가능했습니다. 한 가지 가능한 해석은 이 지역이 유전자 근처에 위치해 유전자 발현에 영향을 주는 지역 (cis-regulatory region, cRE) 이라는 것입니다. 이것이 가능한 해석이긴 했지만, 진핵생물의 경우, 전사 조절 (transcriptional regulation) 이 워낙 복잡하기 때문에, 그것이 LD 인지, cRE 인지 알기가 힘들었습니다. 유전자 발현은 조직별로 다르게 나타나며, 어떠한 variant가 transcription 에 영향을 주는 경로는, DNA methylation, histone modification, splicing, transcription factor binding intensity change, mRNA stability 등으로 매우 다양합니다. 


Functional genomics 


Functional genomics의 최종적인 목적은 genome 상의 element 들이 어떤 기능을 하는지 알아내고자 하는 것입니다. GWAS hit 들의 많은 부분이 eQTL 과 겹칩니다. 하지만 문제는, variant가 expression 을 '아주 조금' 변화시킨다는 것입니다. 대부분의 variant 들인 target gene 의 expression을 평균적으로 2배 미만으로 증가시킵니다. 그리고 왜 expression 에 영향을 주는지 확실하게 밝히기가 어렵습니다. 현재까지로는, 복합질환의 경우 variant가 최종 표현형 (phenotype)인 질병에 영향을 주는 메커니즘이 수많은 variant 가 target gene의 expression 에 조금씩 영향을 주고, 이것이 최종적으로 질병 발생의 위험도를 증가시키는 것으로 이해할 수 있습니다. functional genomics 에는 많은 분야가 있지만, 아래 두 관계에 대한 생물학적인 이해를 하고자하는 것이 중요해보입니다. 


1) variant -> target gene expression 

2) target gene -> phenotype 


genotype-phenotype 관계를 생물학적 기능을 이해함으로서 풀고하는 분야가 바로 functional genomics 라고할 수 있습니다. 이를 위해 다양한 실험 데이터 (chip-seq, 5c, hi-c, dnase-seq ...)와 생물정보학적 방법이 동원되고 있습니다. functional genomics 의 한가지 특징은 전통적인 'gene-by-gene 분석보다는 NGS 등을 이용한 genome-wide 분석이 장려된다는 것입니다. 


Functional genomics (Wikipedia, Sep, 2019)

Functional genomics is a field of molecular biology that attempts to describe gene (and protein) functions and interactions. Functional genomics make use of the vast data generated by genomic and transcriptomic projects (such as genome sequencing projects and RNA sequencing). Functional genomics focuses on the dynamic aspects such as gene transcription, translation, regulation of gene expression and protein–protein interactions, as opposed to the static aspects of the genomic information such as DNA sequence or structures. A key characteristic of functional genomics studies is their genome-wide approach to these questions, generally involving high-throughput methods rather than a more traditional “gene-by-gene” approach.


Functional genomics 의 대표적인 데이터베이스


  • GTEX (Genotype-Tissue Expression): GTEX 는 genotype 과 tissue specific gene expression 을 저장하고 있는 DB 입니다. 50 개 이상의 tissue 에 대한 gene expression level 과 genotype 데이터를 갖고 있습니다. 이 때 어떤 genotype 이 어떤 tissue 의 어떤 gene 의 expression 에 영향을 주는 것이 통계적으로 관찰되면 이를 eQTL (expression quantitative trait loci) 라고 부릅니다. 실제로 많은 GWAS hit 들이 eQTL 과 겹치는 것으로 나타납니다 (ASHG, 2018). 
  • ENCODE (Encyclopedia of DNA Elements): genome 상에서의 transcription, transcription factor association, chromatin structure, histone modification을 밝혀내기 위한 프로젝트입니다. 이러한 genome 상에서의 기능적인 요소들을 식별함으로써 현재 인간 genome의 80%의 부분이 최소 1개 이상의 biochemical function 을 한다고 생각되어지고 있습니다. 

genome 상의 non-coding region 의 functional element 를 찾기 위한 ENCODE 프로젝트




Cookiecutter 패키지는 프로젝트 템플릿을 쉽게 생성해주는 파이썬 패키지입니다. 1) 자신이 만든 템플릿을 저장해서 reproducible 하게 사용할 수 있고, 2) 이미 만들어져 있는 템플릿을 불러와서 거기서부터 새로 프로젝트를 생성할 수 있습니다. 특히, cookiecutter-pypackage/ 를 많이 사용하는듯합니다. 이 템플릿은 PyPI 등록을 위한 파이썬 패키지를 위한 템플릿을 제공합니다. 기본적인 PyPI 등록을 위한 패키지 구조와 기본 파일 (setup.py 등), nox, tox, Click, travis 등과 같은 파이썬 패키지 관련 코드를 담은 파일이 탑재되어 있기 때문에 패키지 개발의 start point 로서 유용하고 실제로 많이 사용하고 있는 패키지입니다. 


homepage

https://cookiecutter.readthedocs.io


tutorial

https://cookiecutter.readthedocs.io/en/latest/tutorial1.html

https://cookiecutter-pypackage.readthedocs.io/en/latest/tutorial.html


다른 컴퓨터로 conda 가상환경 옮기는 방법


참고

conda-cheatsheet.pdf


기존에 사용하던 컴퓨터 A 에서 컴퓨터 B 로 conda 가상환경을 옮겨야할 때가 있다. 


컴퓨터 A 에서 해야할 일 


1. 가상환경 켜기


source activate [이름]


2. 가상환경이 켜진 상태에서 아래 명령어로 dependency 를 export 할수 있다.


conda env export > environment.yaml

environment.yaml 파일을 열어보면 아래와 같이 잘 export 되었다는 것을 확인할 수 있다. 



3. 현재 환경의 python 버전 체크


현재 사용하고 있는 가상환경에서 사용하고 있는 python version 을 체크한다. 


python --version
Python 3.6.6


컴퓨터 B 에서 해야할 일 


Requirements! 

  • 컴퓨터 B 에서는 컴퓨터 A 에서와 같은 anaconda (python 2 또는 python3) 를 사용해야한다. 만약 anaconda 버전이 하위버전이면 잘 안돌아갈 수도 있을듯 하다. 

4. 가상환경 생성 


conda create --name [이름] python=3.6


5. prefix 변경


environment.yaml 을 열고 원하는 경우, 가상 환경의 이름을 바꾸고, prefix 를 경로에 맞게 바꾸어준다. 예를 들어, 


prefix: C:\Users\[사용자이름] \Anaconda3\envs\[가상환경이름]


5. yaml 파일을 통한 가상환경 생성 


conda env create --file environment.yaml


이 때, 


Solving environment: failed

ResolvePackageNotFound:


에러가 뜰 수 있다. 이것은 A 컴퓨터에서 설치된 라이브러리가 B 컴퓨터에서 설치가 불가능한 것인데, 컴퓨터의 운영체제가 다른 경우에 발생하는 것으로 보인다. 해결 방법은 수동으로 ResoevePackageNotFound 에서 출력된 리스트를 environment.yaml 파일에서 지운 후, 다시 시도하면 된다. (참고)



6. 주피터를 사용하는 경우, 커널에 가상환경 등록


source activate myenv python -m ipykernel install --user --name myenv --display-name "Python (myenv)"


Django REST Framework



최근 tensorflow/keras 기반의 파이썬 어플리케이션을 코드를 공개하지 않으면서 서비스하기 위한 방향을 고민하던 도중, Web API 를 이용하면 좋을 것이라는 생각이 들었다. 찾아보니 Django REST Framework 라고 하는 Django 기반 프레임워크를 통해 이러한 Web API 를 간단하게 구현할 수 있는 것 같다. 


Django REST Framework 는 Django 기반의 Web API 개발을 위한 Framework이다. 홈페이지에 있는 튜토리얼을 따라하면 다음과 같이 간단한 정보를 요청하고 받아오는 간단한 샘플 어플리케이션을 만들어볼 수 있다. 


일반적인 application 의 경우, json 을 통해 정형화된 데이터를 주고 받으면 되겠지만, 딥러닝을 기반으로한 어플리케이션이니만큼 파일이나 numpy array 와 같은 json 이 아닌 타입의 데이터를 어떻게 전송할 수 있는지를 조사해보는 게 필요해보인다. 개/고양이 이미지  사진을 전달하고 분류 결과를 출력하는 정도의 간단한 앱을 만들고자해도, 파일 및 numpy array 의 전송이 필수적일 것이기 때문이다. 우선 홈페이지에 튜토리얼을 살펴보면서 차근차근 이 프레임워크를 공부해나갈 예정이다. 혹시 Tensorflow/keras/pytorch 기반 appilcation을 서비스하고자 하는 데이터과학자/개발자라면 유용하게 사용할 수 있을 것 같다! 


2019 부산 여행 [흰여울, 감천마을, 해운대, 광안리]



1일차 일정

  • 부산역 도착 - 숙소 이동 - 저녁 식사

2일차 일정

  • 기상 - 전포 카페거리 아침식사 - 흰여울 문화마을 - 감천 문화마을 점심식사 - 해운대 - 광안리 - 저녁식사 - 숙소 


2019년도 여름 휴가로 부산에 2박 3일 여행을 하였는데 여행 후기와 여러 정보들을 공유해보려고 합니다. 우선 경비로는 KTX 왕복 1인당 약 6만원, 숙소 1박 9만원 정도로 교통비와 숙박비는 총 합쳐서 24만원 정도를 지출하였고, 부산에서 식비 및 교통비로 약 15만원 정도를 사용하여 총 40만원 정도 지출한 것 같네요. 


1일차


KTX 로 밤늦게 부산역에 도착하는 일정상 첫째날은 짐을 풀고 늦은 저녁을 먹는 걸로 일정을 정했습니다. 숙소는 서면역 근처로 잡았는데, 서면에 구워 삶기라고 하는 밥집에 가서 저녁을 먹었습니다. 이 식당의 단일 메뉴인 돼지 불고기, 오징어, 홍합, 수제비 등을 넣고 끓인 매콤 불고기 소 (20,000원) 을 주문해 먹었는데, 맛있었습니다. 맛은 약간 고추장 찌개 같은 맛인데 정말 맛있습니다. 다만 아쉬운 점은 영업 시간이 새벽 1시까지로 적혀있었는데도 불구하고 튀김기 마감을 밤 11시도 안돼서 했더라구요. 그래서 아쉽게도 튀김은 먹지 못했습니다. 맛은 좋았는데 서비스가 다소 아쉬웠습니다.






숙소 - 경성여관


숙소는 서면에 위치한 경성여관으로 잡았습니다. 숙소를 선택한 기준은 여행에서 숙소에 있어서는 안전을 추구하는 편이라 호텔 예약 사이트 평점과 가격을 기준으로 선택하였습니다. 1박에 8만원이라 저렴한 편이면서 9점이 넘는 평점이었기 때문에 망설임 없이 선택을 했던것 같아요 ㅎㅎ 숙박 후기는 정말 최고였습니다. 우선 호텔 내에 있는 모든 사람들이 친절해서 여행 동안 기분 좋게 해주고, 침구류 화장실도 정말 깨끗하구요. 모든 소품들을 하나하나 정성스럽게 선택한 느낌이 납니다. 그냥 잠만 자는 것이 아니라 분위기를 중요하게 생각하고, 가격대비 방 퀄리티를 중요시 하는 분들한테 추천하고 싶은 숙소입니다. 그나마 단점이라고 할 것은, 해운대/광안리 등과 같은 주요 관광지와 다소 거리가 있습니다. 서면역에서 지하철로 30~40분 정도 걸렸던 것 같아요. 





2일차


전포 카페거리


아침 식사는 전포 카페거리에서 간단히 빵과 커피를 먹기로 했습니다. 그리고 아침 10시쯤 전포 카페거리로 갔습니다. 근데 이 주변 카페들이 아침에는 대체로 문을 닫고 있는 경우가 많더라구요. 빈티지 38이라는 카페의 경우 24시간 문을 열고 있었지만, 문제는 빵이 아무것도 남아있지 않았습니다. 다행히 근처에 유동 커피라는 카페가 문을 열고있었고, 갓 나온 빵이 몇 종류 있었습니다. 그래서 이 곳에서 아침식사를 하게 되었습니다. 그리고 나갈 때 쯤 보니 훨씬 많은 종류의 빵이 나와있었습니다. 이 주변에 빵과 커피를 파는 카페들이 많은데, 대부분 아침 11시쯤 준비가 다 끝나는 느낌이었습니다. 아침일찍 밥을 먹고 다른 곳에 가고 싶은 분들에게는 그냥 주변에 스타벅스와 할리스 탐탐 같은 프랜차이즈 카페가 많으니 그곳들에 가는 것을 추천드립니다. 




흰여울 문화 마을


아침에 전포 카페거리에서 빵을 먹고 택시를 타고 흰여울 문화마을에 갔습니다. 해안가에 위치한 마을이였는데 풍경이 정말 좋았습니다. 전포동에서부터 택시를 타고 이동했는데 택시비는 10000원 정도 나왔던것 같아요. 택시기사분께 이야기를 들어보니 이런 마을이 있었는지 몰랐다고 하네요 ㅎㅎ 부산 주민들에게는 잘 알려지지 않은 곳인거 같기도 해요. 이곳에 오면서 느낀점은 고도가 조금 높았습니다. 그래서 위에서부터 내려다보는 풍경이 정말 좋아요! 



개인적으로 부산에서 요즘 가장 많이 찾는 마을이라고 할 수 있는 감천 마을보다 흰여울 마을이 더 좋았어요. 전경이 확 트여있고, 해안가를 따라 지어진 집들이 아름다웠습니다. 도심에서는 흔히 보기 힘든 그런 풍경이라 그런지 멋있게 느껴졌어요. 제가 갔을 때는 날씨가 너무 더워서 바닷가까지 내려가보지는 못했지만 날씨가 선선하면 해안가 따라서 산책하기도 괜찮을 것 같아요. 


감천 문화마을


다음으로는 감천문화마을로 버스를 타고 이동했습니다! 흰여울에서 감천까지 한 방에 가는 버스가 있더라구요. 감천은 우선 사람이 정말 많았습니다. 그리고 외국인들도 많아서 관광지라는 느낌이 확 들었어요. 



'감천문화밀면' 이라는 밀면집에서 밀면과 석쇠불고기를 먹었습니다. 그냥 기대하지 않고 들어갔는데 생각보다 맛있어서 놀랐어요. 근데 사람이 많이 없어서 이렇게 맛있는집에 왜이렇게 사람이 없지 생각이 들더라구요. 



광안리에서 광안국밥 이라는 곳에서 돼지국밥을 먹었습니다. 오직 돼지고기만 들어가 있는 국밥이었고, 설렁탕에 가까운 맛이었습니다. 그래도 가게 자체가 깔끔하고, 맛도 깔끔해서 무난하게 맛있는 맛이었습니다. 깔끔한거 좋아하시는 분이라면 좋아할 것 같습니다. 




촬영 정보


카메라 : RICOH GRII

세팅 : 포지티브 필름 모드 (상세설정 채도 5/ 콘트라스트3/샤프니스 7)

포커스 : 일부 근접 사진 스폿AF, 대부분 멀티 AF