CS230 Deep Learning
Lecture 5. AI + Healthcare
이번 강의는 처음에 객원(Pranav 박사)께서 AI를 헬스케어에 적용하는 것에 대한 전반적 Overview를 설명하시고,
뒤에는 Kian형님이 관련된 Case Study 사례를 소개하셨다.
DL for Healthcare (Phd. Pranav Rajpurkar)
객원강사께서는 크게 아래 3가지를 강의에서 다루려고 하였다.
1. 헬스케어에서의 AI 적용 방법
2. 3가지 Case Study와 Research
3. Healthcare에 직접 적용해볼 수 있는 AI에 대한 생각
먼저 헬스케어에서 중요한 것을 생각해보자.
헬스케어 분야를 다룰 때 다음과 같은 질문들을 생각해봐야 한다.
1. 어떤 증상이 발생할 때 이 증상에 대한 상세한 설명이 가능해야 한다.
2. 어떤 증상이 왜 일어나는지 알아야 한다.
3. 증상 발생이 환자에게 향후 미칠 영향에 대해 알아야된다.
4. 증상을 사전에 예방하는 방법은 무엇인지 알아야 한다.
증상에 대한 설명은 과거 연구에서 많이 이루어졌고, 증상이 일어나는 이유와 증상이 환자에 미치는 영향은 오늘날에 분석되고 있다.
증상을 예방하는 방법은 아직까지 발전이 더디다.
스탠포드 ML팀은 이 2, 3, 4의 질문들을 해결하기 위해 연구를 진행 중이다.
한편 다양한 데이터셋을 이용하여 Healthcare를 AI로 분석할 수 있다.
- Mobile: 이동용 device로 부터 수집되는 데이터
- EHR: 디지털 형태로 수집된 환자의 건강정보
- Medical Imaging: X-ray와 같은 환자 의료 이미지
- Genomics: 유전체 데이터
최근 Health care 분야에서 빅데이터가 축적되면서 이를 이용해 학습한 AI 모델 성능이 전문가 수준을 보여주고 있다.
그러면 Health care 분석에 AI를 적용한 사례를 알아보자.
아래 사례는 흉부 X-ray 사진을 통해 이상여부(폐렴)를 detect하는 딥러닝 CheXNet을 학습한 사례이다.
보통 흉부 X-ray를 통해 폐렴을 진단하는 방법은 아래와 같다.
먼저 폐렴 증상이 있는 경우에 X-ray의 폐 부분에 뿌연 가스가 찬 것처럼 나타난다.
하지만 위 사진에서는 폐렴 여부가 구분이 쉬워보이지만, 흉부에 있는 폐는 수많은 폐포로 가득하다.
그리고 폐포 내에 존재하는 세포 조직, 혈액 등 때문에 방사선과 의사들은 폐렴인지 여부를 파악하기 어렵다고 한다.
그래서 객원 강사의 팀은 폐렴인지 여부를 잘 판단하는 AI 모델을 개발할 필요성을 느꼈다고 한다.
모델은 Pretrained된 DenseNet을 사용하였다.
Input으로는 전면 흉부 X-ray 사진이 들어가고, Output으로는 폐렴인지 여부(0/1)가 binary로 나오게 된다.
모델로 사용한 DenseNet은 다음과 같다.
ResNet은 shortcut이 하나 존재한 것에 반해,
DenseNet은 각 layer에서 다른 layer로 가는 shortcut이 모두 존재한다.
그래서 각 layer가 이전 정보들을 더 잘 반영할 수 있다.
성능 면에서도 ResNet과 비교했을 때 적은 파라미터로 더 좋은 성능을 나타내는 것이 확인되었다.
데이터는 다음과 같이 처리하였다.
학습 데이터 셋은 전면 흉부 X-ray 사진을 10만장 정도를 사용하였다.
그리고 test set은 420장의 전면 흉부 x-ray 사진을 사용하였다.
여기서 labeling을 어떻게 하는지가 매우 중요한데, 실제 의사들도 결과 예측이 틀릴 수 있기 때문이다.
따라서 labeling의 경우, 4명의 흉부학과 의사들이 독립적으로 labeling한 결과를 사용하였다.
이렇게 정답이 확실하지 않을 때 어떤 기준을 정답으로 생각하는 것을 Ground-truth라고 한다.
또한 라벨링 하는 것을 annotation 한다고 표현한다.
다음으로 모델 성능 평가는 다음과 같이 하였다.
먼저 모델의 목표는 precision과 recall 둘 모두를 최대화 하는 것으로 설정하였다.
따라서 F1 score를 이용하여 모델의 성능을 평가하였다.
또한 전문가 수준과 비등한 모델 개발을 목표로 하였기 때문에 CheXNet 성능은 test set을 annotation한 흉부학과 의사 집단들의 정확도와 비교한다.
평가 방법은 다음과 같다.
먼저 의사 1의 폐렴 진단 정확도를 평가할 때에는 의사 2, 3, 4, 그리고 CheXNet이 진단한 결과를 각각 ground-truth(정답)으로 생각하고 성능을 각각 계산한다.
의사 2, 3, 4의 진단 정확도도 각각 본인을 제외한 의사와 모델의 정답과 일치하는지로 평가한다.
모델의 진단 정확도는 각 의사들이 진단한 결과를 ground-truth로 두고 평가한다.
위 방법을 통해서 의사 1~4와 모델의 진단 성능(F1 Score)의 평균과 95% 신뢰구간(Confidence Interval)을 제시한다.
결과는 다음과 같다.
성능 평가 결과 CheXNet의 성능이 방사선과 의사들의 평균 진단 성능보다 좋게 나타났다.
즉, 전문가 집단의 진단 능력에 버금가는 모델을 개발했다고 할 수 있다.
하지만 CheXNet의 한계도 존재하는데,
1. 환자의 과거 의료 기록에 접근할 수 없고
2. 단지 전면 흉부 X-ray 사진만을 통해 폐렴을 진단하는 것이
한계라고 볼 수 있다.
한편 개발한 CheXNet을 이용해 XRay4All이라는 간단한 웹사이트를 만들었다.
이 웹사이트는 전면 흉부 X-ray 사진을 올리면 해당 사진을 통해 폐렴 뿐만 아니라 다양한 질병이 있는지 여부를 예측해준다.
이를 통해 아프리카 등 의료 인프라가 열악한 지역들에 대해 도움이 될 수 있을거라 기대되었다.
다음으로 개발한 모델을 해석하는 방법에 대해 알아보았다.
모델 해석은 다음의 이유로 중요하다.
- 개발한 모델을 정말로 믿을 수 있는지? (Trust)
- 해당 예측에서 이미지의 어떤 부분이 중요한 영향을 미쳤는지? (Interpretability)
모델 해석을 위해서 heatmap을 이용할 수 있는데, 모델이 클래스를 분류하는데 있어서 이미지의 어느 부분을 중요하게 본지 파악할 수 있다.
이를 Class Activation Map(CAM)이라고 표현한다.
Class Activation Map, 즉 활성화 정도는 Chain rule에 의한 backpropagation으로 Input image의 특정 부분이 class를 활성화하는데 얼마나 기여하였는지로 파악할 수 있다.
즉, class k에 대한 결과(c_{k})에 대해 input image의 j번째 픽셀(i_{j})가 얼마나 영향을 미쳤는지를 gradient 크기를 이용해 판단한다.
gradient를 식으로 나타내면 아래와 같다.
이를 통해 CAM이 적절한 부분에 활성화 되었는지를 파악하여 모델이 잘 학습되었는지를 판단할 수 있다.
위 폐렴 X-ray 사진과 같이 이미지는 2D 데이터셋을 대표한다.
이외에도 1D의 대표격인 ECG 데이터를 통해 health care를 분석한 사례와
3D의 대표로 무릎의 상태를 분석한 사례를 제시하였다.
이외에도 데이터가 부족한 class에 대해 Data Augmentation을 활용하면 성능을 향상시킬 수 있음도 제시하였다.
Health Care Case Study (Kian Katanforoosh)
다음으로 Kian 형님이 Health care 사례에 대해 더 소개해주셨다.
아래와 같이 현미경 사진에서 겹쳐진 cell을 구분하는 문제였다.
그림 왼쪽과 같이 세포가 구분돼 있지 않은 Input data를 이용하여 오른쪽과 같이 각각의 세포를 구분한 Output을 출력하는 문제이다.
여기서 output은 각 픽셀이 cell에 속하는지(1), 아닌지(0)를 나타낸다 (각 픽셀에 대해서 binary classification 하는 문제이다).
또한 오른쪽에 분리된 cell 모습은 의사들이 annotation한 ground-truth 결과이다 (명확한 정답이 없다).
여기서 데이터는 어떤 현미경의 이미지인지에 따라 3가지 타입 (A, B, C)으로 나뉘는데, Type A는 50,000개의 이미지가, Type B와 C는 각각 25,000개의 이미지가 존재한다.
1. 여기서 첫번째 질문은 다음과 같다.
- 타입 C 이미지를 분류하는 모델을 개발하려고 할 때, 데이터셋을 training, dev, test 3가지로 어떻게 분리하는 것이 가장 적절한가?
이에 대해 Kian은 다음과 같이 답변한다.
- 우선 Type C 이미지를 분류하는 모델을 개발할 것이기 때문에 Train, Dev, Test셋은 Type C 이미지에서 분리하자. Type A와 B는 모두 Training 이미지로 사용한다.
- Type C 이미지에 대해서만 90 / 5 / 5의 비율로 분리하자. 데이터셋의 크기가 크기 때문에 꼭 80 / 20 / 20으로 나누지 않아도 된다.
- Dev와 Test 셋에 속하는 이미지들은 동일한 분포를 가지고 있어야 한다.
- 이미지 C에는 Training 데이터에도 학습될만큼 충분히 있어야 하며, Dev/Test 셋의 이미지보다는 많은 양이 존재해야 한다.
- Type A와 Type B의 distribution이 Type C와 달라 모델 성능에 부정적 영향을 줄 수 있다. 이 경우는 데이터를 제거하거나 Type C에 대한 Data Augmentation이 필요할 수 있다.
2. 다음으로 2번째 질문은 다음과 같다.
- 데이터셋을 Augment 한다면 어떤 방법이 좋을 것인가?
이에 대해서는 다양한 augmentation 방법을 소개한다.
- 자르기 (cropping)
- 랜덤한 노이즈 추가 (add random noise)
- 대조, 뿌옇게 하기 (change contrast, blurring)
- 뒤집기 (flip)
- 회전 (rotate)
한편 character recognition (6과 9, b와 g 등) 과 같이 회전, 뒤집기 등 augmentation을 하면 정답이 달라지는 경우는 augmentation에 대해 주의하여야 한다.
다음으로 위 문제를 학습할 모델 구조와 loss function은 어떻게 설정하면 좋을까?
Kian은 다음과 같이 질문과 답변을 한다.
Q1 > nx(x의 개수)와 ny(y의 개수)간 수리적 관계는?
A1 > nx = 3 * ny. 각 y는 해당 픽셀이 세포인지(1), 아닌지(0)을 나타내는 바이너리 값이다. x는 각 픽셀을 RGB로 표현하기 때문에 총 x의 수는 픽셀 수의 3배이다.
Q2> 네트워크의 마지막 activation function은 무엇을 사용할 것인가?
A2> Sigmoid function. 각 픽셀이 세포인지(1), 아닌지(0)를 binary로 나타내야 하기 때문
Q3> Loss function은 무엇을 사용해야 하는가?
A3> 각 픽셀의 y 값에 대한 binary cross entropy loss의 합. 이를 통해 각 픽셀이 세포에 속하는지 아닌지를 loss 함수로 설정하여 학습할 수 있다.
이 방법으로 학습한 모델을 M1이라고 하자.
한편 위와같이 학습하였는데 M1 모델의 성능이 좋지 않을 수 있다.
이 때는 이전에 학습된 모델(pre-trained model)을 이용하여 Transfer Learning을 시도해볼 수 있다.
Transfer Learning은 이전에 학습된 모델(pre-trained model)의 layer들과 weight를 가져와 지금 문제를 푸는 모델에 활용하는 방법이다.
예를 들어 다음의 딥러닝 모델 (M2)이 있다고 하자.
- 10가지 피부병을 classification하는 모델
- 모델 학습에 사용한 이미지셋이 많음
- 우리 문제의 이미지와 유사함
이 경우 M2모델을 우리 모델(M1)에 적용하기 위해 어떤 하이퍼파라미터를 가져와야 하는지에 대해 질문할 수 있다.
크게 transfer learning에서는 3가지 hyperparameter를 고려하게 되는데 아래와 같다.
- l: M2로부터 가져올 layer의 개수 (M2로 부터 transfer되는 layer 수)
- l_{f}: M2로부터 가져온 layer 중 weight를 freeze 시킬 layer 수 (보통 앞단은 edge, 이미지의 low-level 특성들에 대해 잘 학습하기 때문에 비슷한 이미지셋이라면 weight를 freezing 시키는 것이 이로울 수 있음).
- l_{a}: transfer되는 layer 뒤에 추가되는 새로운 layer들
이렇게 네트워크를 학습했을 때 Cell인지는 잘 맞춘다고 하자.
하지만 Cell의 경계는 잘 예측하지 못하면 어떻게 해야할까?
이 경우는 boundary를 잘 맞추게 Loss function을 바꿔줄 수 있다.
1. 먼저 0/1 binary classification이 아니라 라벨을 3개로 나누는 경우를 생각할 수 있다.
- 이 경우, p(no cell), p(cell), p(boundary) 3가지 경우에 대해 output을 예측한다.
- Loss 함수는 각 픽셀에 대해 softmax한 결과의 합으로 나타낸다.
이 경우 Loss function은 아래와 같이 나타낼 수 있다.
한편 1의 결과도 잘 working하지 않을 수 있다. 왜냐하면 boundary에 해당하는 픽셀 수가 매우 적기 때문이다.
2. 이 경우는 Loss function의 class마다 weight를 다르게 줄 수 있다. 즉, training 과정에서 boundary loss 값을 크게하는 trick을 주는 것이다.
- 셀이 없는 경우(no cell)가 가장 많기 때문에 weight를 작게 설정한다.
- 셀이 존재하는 곳(cell)을 맞추는게 가장 중요하기 때문에 weight를 크게 설정한다.
- 픽셀에서 boundary가 많이 없기 때문에 boundary를 못맞추는 경우 penalty가 크게 만들어준다. 즉, False Positive인 경우에 큰 penalty가 발생한다.
이를 통해 설정된 loss function은 아래와 같다.
한편 위에서 다룬 Cell segmentation 문제는 Object detection과 유사하면서도 다르다.
Object detection 문제는 빠르게 working하면서 해당 object가 위치한 곳에 bounding box로만 보여주면 된다.
하지만 Cell segmentation 문제는 Cell이 위치하는 픽셀의 경계를 나누어야 하며, cell이 속한 곳의 region만 나타내주기 때문에 Cell 자체의 위치를 더 정확히 나타낸다고 볼 수 있다.
마무리
5번째 강의는 두 강사님이 진행을 하셨다. 그만큼 내용이 많고, 빠르게 진행되었는지 정리하는데도 시간이 많이 걸렸다.
하지만 그만큼 유익한 내용이 많은 강의였다.
'Study > 딥러닝' 카테고리의 다른 글
[온라인 강의] 스탠포드 대학 딥러닝 강의 목록 (2) | 2022.11.04 |
---|---|
[CS230] Deep Learning Lecture 6 Deep Learning Project Strategy (0) | 2022.09.21 |
[CS230] Deep Learning Lecture 4 Adversarial Attacks / GANs (1) | 2022.09.20 |
[CS230] Deep Learning Lecture 3 Full-Cycle Deep Learing Projects (2) | 2022.09.19 |
[CS230] Deep Learning Lecture 2 Deep Learing Intuition (0) | 2022.09.19 |