Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

러닝머신 하는 K-공대생

Pygame 을 이용한 딥러닝 모델 시각화 툴 개발 본문

Machine Learning

Pygame 을 이용한 딥러닝 모델 시각화 툴 개발

prgmti1 2021. 12. 26. 23:52

1. 개발 동기와 목적 

CNN(Convolution Neural Networks)은 컴퓨터 비전 및 시각적 이미지를 분석하는 데 매우 자주 사용되는 딥러닝 네트워크이다. 하지만 모델에 입력으로 이미지를 넣었을 때 모델 내부에서 연산 과정을 거쳐 예측한 클래스를 결과로 반환할 뿐 어떤 이유로 해당 클래스로 예측하게 되었는지 사람이 납득할만한 근거를 제시해주지는 않는다. 이런 이유에서 딥러닝 모델들을 마치 블랙박스와 같다고 표현하기도 한다. 본 연구자는 이런 궁금증으로 이전에 CNN 모델의 각 레이어의 출력값, 각 레이어의 필터 패턴을 시각화해보고 클래스에 대한 정보를 얻기 위해 Grad-CAM을 적용해서 해석해봤었다. 이후에 개발한 CNN 모델이 잘 작동하지 않는 이유를 파악하기 위해 이전에 작성했었던 파이썬 코드를 열어 적용하려고 하니 모든 레이어마다 파악하려면 추가적으로 코딩을 진행해야하는 등 매우 번거로웠고 Grad-CAM 뿐만으론 클래스에 관한 모델의 특징을 파악하기 힘들었다. 이에 GUI 방식으로 특정 레이어를 클릭하고 모드를 선택하면 해당 모드에 해당하는 결과(Feature Map, Filter, Grad-CAM, 추가적인 XAI 기법 등)을 알려주면 편할 것으로 생각했다. 따라서 pygame으로 딥러닝 모델을 쉽게 해석할 수 있는 툴을 만들어 쉽게 모델을 해석하고 분석하여 개선하도록 돕는 것이 이번 프로젝트의 목적이었다. 

 

2. 개발 과정 및 내용 

이 프로젝트에서 구현할 시각화 툴의 기능들은 이전에 포스팅한 'Convolution Netural Networks, 그 내부를 보다' 에서 소개한 내용을 베이스로 하므로 먼저 읽으면 내용을 이해하는데 도움이 될 것이다. 

2.0. CNN 모델 선정 

자주 사용하고 residual block이나 skip connection 등이 존재하지 않는 간단한 형태의 CNN 모델이 분석하기에 편하다고 판단하였고 이에 VGG16 모델 구조를 선택했으며 imagenet 데이터셋에서 학습된 pretrained VGG16 모델을 불러와 분석할 모델로 삼았다

[Fig. 1] VGG16 Architecture

2.1. CNN 모델의 각 레이어의 출력값 (feature map) 시각화 

CNN의 모든 층을 보면서 입력으로 들어간 이미지가 각 레이어를 거치면서 feature map이 어떻게 변화하는지를 확인하고자 했다. 모델의 output이 클래스가 아닌 각각의 레이어의 output들을 output으로 하는 모델을 구성하고 너무 작으면 육안으로 확인이 힘들어 필터 수를 제한해 4*16 matrixfeature map을 구성하였다.

 

[Fig. 2] 특정 레이어에서 각 필터를 거친 결과(feature map)을 얻는 과정

2.2. VGG16 필터 패턴 시각화

Imagenet 데이터셋에 대해 학습된 VGG16 모델을 불러와 각 레이어별 필터를 시각화한다. 빈 입력 이미지에서 시작해서 특정 필터의 응답을 최대화하기 위해 입력 이미지에 확률적 경사 상승법을 적용해 필터 응답을 최대화하는 패턴을 이미지 텐서로 출력하고자 했다. 각 레이어의 필터들에 경사 상승법을 적용해 얻은 이미지 텐서들을 8*8 그리드로 묶어 출력했다.

[Fig. 3] 손실 텐서를 정의하고 경사 상승법을 진행하는 함수 

[Fig. 4] block3_conv1의 필터 패턴 시각화 결과
 

2.3. Class Activation Map(CAM)Grad-CAM

[Fig. 5] Convolution 연산을 거친 출력을 각 채널별로 GAP을 적용하여 FC를 수행하는 과정

k번째 채널의 값들 중 (x, y)에 위치한 값을 라고 하고 GAP을 거친 값을  $F^{k}=\sum _{x,y}f_{k}\left( x,y\right)$, 클래스 c에 대해 softmax 입력으로 주어지는 값 $S _{c}=\sum _{k}w_{k}^{c}F^{k}$ 라고 표현하면 가 k번째 채널과 클래스 c에 대하는 값이라면 $w_{k}^{c}$ 는 클래스 c에서 $F^k$의 중요성을 나타낸다. $S_c$ 에서 $F^k$를  풀어 정리하면 $S_{c}=\sum _{x,y}\sum _{k}w_{k}^{c}f_{k}\left( x,y\right)$  이며 $L_{CAn}^{c}\left( x,y\right) =\sum _{k}w_{k}^{c}f_{k}\left( x,y\right)$ 으로 클래스 c에 대한 CAM을 나타낼 수 있다. 즉, 수식적으로 정리해보면 $L_{CAM}^{c}\left( x,y\right)$ 는 (x,y)에 위치한 값이 클래스 c로 분류되는데 미치는 중요도로 해석할 수 있다. 

 

Grad-CAM CAM의 보다 일반화된 버전으로 Grad-CAM GAP이 없어도 쓸 수 있으며, Grad-CAM은 마지막 Convolution Layer에 한정되지 않고, gradient weights로부터 사용하기 때문에 CAM에서 차원이 맞지 않는 문제로부터 자유롭다. Grad-CAM 기법에서 뉴런 중요도 가중치는 $a_{k}^{c}=\dfrac{1}{Z}\sum _{i}\sum _{j}\dfrac{\delta y^{c}\cdot }{\delta A_{ij}^{k}}$ 로 구해지며 마지막 conv layer로 들어오는 기울기 정보 $\delta A_{ij}^{k}$ 는 $y^c$가 $A^k$ 에 가지는 가중치, $a^k$ 는 타켓 클래스 c에 대한 k번재 피쳐맵이 가지는 중요도, $A^k$는 어떤 layer k번째 피처맵을 의미할 때 Grad-CAM인 $L_{Grad-CAM}^{c}=ReLU\left( \sum _{k}a_{k}^{c}A^{k}\right)$ 로 구할 수 있으며 ReLU는 음수를 0으로 치환하는 연산이다. 이것을 활용해 CNNFC이전 레이어들의 CAM을 얻어내며 특징을 분석할 수 있다.

 

[Fig. 6] Grad-CAM Algorithm

2.4. LIME(Local Interpretable Model-agnostic Explanations)

LIME 은 모델이 현재 데이터의 어떤 영역을 집중해서 분석했고 어떤 영역을 분류 근거로 사용했는지 알려주는 XAI 기법이다. CAM 과 마찬가지로 영역을 통해 분류 근거를 제시한다는 점은 비슷하지만 LIME은 모델 학습 방법과 관계없이 (Model-agnositc) 적용할 수 있으며 가볍다는 점에서 개발하는 툴의 기능으로 넣고 싶었다. LIME는 입력 데이터에 대해 부분적으로 변형을 진행하고 어떤 이미지 X가 입력으로 들어왔을 때 입력 이미지에 대해 해석 가능하도록 인식 단위를 쪼개고 이미지를 해석한다.

 

[Fig. 7] VGG16 모델에 LIME를 적용하는 함수

어떤 이미지가 주어질 때 특정 관심 영역을 x라고 하면 주변으로 관심 영역을 확장해 나갈 때 기준 x로부터 동일한 정보를 갖고 있다고 간주할 영역을 $\pi_{s}$ (슈퍼 픽셀) 이라 하자. 해석할 블랙박스 모델을 $f$, 슈퍼 픽셀 $\pi_{s}$ 을 받아 $f(\pi_{s})$와 동일한 값을 반환하도로 학습된 모델을 $g$ 라고 하면 각 $\pi_{s}$ 로 $f$가 예측하는데 얼마나 영향을 미치는지 예측할 수 있다. LIME 에서 $g$는 단순한 선형결합으로 $g(m_1,m_2,...) = w_1m_1 + w_2m_2+...$ 으로 나타내어 마스크 $m_x$ 로 대표되는 각 슈퍼 픽셀에 대해 분류 모델 $f$의 예측 결과와 마스킹 데이터 $m_x$에 대해 회귀 모델 $g$의 검증 결과를 비교해 유사성을 계산한다. LIME 는 손실 함수가 최저가 되게 하는 슈퍼 픽셀 조합을 찾고 모델 $f$가 가장 영향을 많이 받는 슈퍼 픽셀을 찾는다. 

 

2.5. SHAP (SHapley Additive exPlanations)

SHAP는 섀플리 값(Shapley value)과 피처 간 독립성을 근거로 덧셈이 가능하게 활용도를 넓혀 이를 아이디어로 사용하는 XAI 기법이다. 예를들어 섀플리 값에 의해 각 사람의 기여도는 그 사람의 기여도를 제외했을 때 전체 성과의 변화 정도로 나타낼 수 있고 이를 수식으로 표현하면 다음과 같다.

model agnostic 하며 딥러닝 모델이나 이미지 데이터에 적용할 수 있다. SHAP는 피처 중요도가 고려하지 못하는 음의 영향력을 고려하며 부분 의존성과 달리 하나 이상의 중요한 피처를 시각화 할 수 있다. 다만 섀플리 값을 계산하기 위해 모든 피처를 순서대로 계산해야 하며 데이터 수의 제곱에 비례해 계산량이 증가한다는 단점이 있다

 

[Fig. 8] VGG16 모델의 특정 레이어에서 SHAP를 적용하는 함수
[Fig. 9] VGG16의 block5_conv1에서 SAHP를 적용한 결과이다. 순서대로 입력 이미지, 가장 높은 확률로 예측한 클래스에 대한 SHAP 결과, 두 번째로 높은 확률로 예측한 클래스에 대한 SAHP 결과

 

2.5. pygame을 이용한 딥러닝 시각화 툴 개발

 

앞서 구현한 함수들을 vgg16.py에 넣어서 불러왔다. 이때 SHAP 같은 경우에는 tensorflow 1 문법을 사용하기에 함수로 만들지 않고 subprocess로 중간에 파이썬 파일을 실행시키는 방향으로 작성했다. LIME는 모델 레이어에 상관없으므로 pygame 시작할 때 함수를 사용한다. 또한 필터 패턴 시각화의 경우 모델을 다시 학습 시키지 않는 이상 변하지 않으므로 필터 패턴을 시각화한 결과를 저장하는 파이썬 파일을 미리 실행시키고 저장해두었다.

[Fig. 9] 라이브러리와 필요한 함수를 불러오는 과정

pygame 내에서 이미지 로드, 크기 변경, 좌표 설정 및 화면에 출력등을 쉽게 하기 위해 오브젝트 class를 만들었다. 그리고 input, vgg16, output, mode, layer, option, feature, grad_cam, heatmap, lime, shap 오브젝트 등을 선언해 초기화해주었다

[Fig. 10] obj class를 만드는 코드

마우스로 클릭하는 이벤트가 발생했을 때 클릭 지점의 좌표 (mx,my) 로 현재 레이어의 이름과 옵션의 상태를 가져오는 함수(get_layer(), get_option())을 제작하였다. 이제 각 옵션별로 확인을 해보면 feature map을 보여주는 ‘feature’ 모드에서는 get_featuremap() 함수를 실행시키고 현재 layer에 대한 feature map 사진을 feature 객체에 넣고 위치와 사이즈를 적절히 조절한다.

[Fig. 11] ‘Feature map’모드일 때 작동되는 부분

 

Grad-CAM 결과를 보여주는 ‘grad’ 옵션에서는 현재 layer에서의 heatmap과 입력 이미지와 heatmap을 합친 이미지를 저장하는 get_gradcam() 함수를 실행하고 마찬가지로 heatmapgrad_cam 오브젝트를 업데이트 하고 출력한다.

 
[Fig. 12] ‘Grad-CAM’모드일 때 작동되는 부분
 

‘filter’ 옵션일때는 현재 레이어가 컨볼루션 레이어일 때 해당 레이어에 해당하는 이미 저장된 사진을 업로드하고 출력하며, ‘lime’ 옵션일 때는 초반에 실행해서 저장된 lime.jpglime_mask.jpg를 업로드하고 출력한다.

[Fig. 13] ‘Filter’와 ‘LIME’모드일 때 실행되는 부분

‘shap’ 옵션일 때는 현재 레이어가 컨볼루션 레이어일 때 shap_vgg16.py 파일을 입력 이미지 위치와 현재 레이어 이름을 인자로 주어 실행하여 생긴 shap.jpg를 업로드하고 출력한다

[Fig. 14] ‘SHAP’모드일 때 실행되는 부분

 

3. CNN-Interpret-Tool 개발 결과

- 소스 코드: https://github.com/taegukang35/CNN-Interpret-Tool/tree/main?fbclid=IwAR0iUN8EoJP4IXc3RZfC1LDt6x9qI0c2AsuCF1-cmj41s2YuurKIleZM1xE

3.1. Feature map Visuallization

3.2. Filter Pattern Visuallization

3.3. Grad-CAM

3.4. SHAP

3.5. LIME

4. 결론 

pygame을 이용해 GUI 방식으로 특정 레이어를 클릭하고 모드를 선택하면 해당 모드에 해당하는 결과(Feature Map, Filter 패턴, Grad-CAM, LIME, SHAP)을 제공하는 툴 제작에 성공하였다. 모델에 대한 이해를 돕기 위해 feature mapfilter 패턴을 보고 분류 결과를 해석하기 위해서는 특정 클래스로 인식되는데 기여한 부분을 Grad-CAM으로 확인하고, model agnostic 하게 분석하는데 LIMESHAP를 적용해 특정 픽셀 영역이 어떻게 판단에 기여했는지를 확인하는 등 종합적으로 모델을 이해할 수 있었다. 다만 SHAP의 경우엔 메모리 할당 초과로 잘 진행되지 않거나 느리게 결과가 나와 최적화 등의 대안이 필요해 보인다. 이 툴은 딥러닝을 공부하는 학생들이 원리와 XAI 분야에 대한 흥미를 돕는데 활용이 될 수 있으며 현재는 VGG16 모델에 국한되어 적용하였으나 다른 딥러닝 모델에 대해 확장시킨다면 일반적으로 자신이 설계한 딥러닝 모델을 종합적으로 평가해 데이터셋을 수정하거나 모델 구조를 변경하는 등의 피드백이 가능할 것으로 예상된다.

 

+ 추가: Tensorflow KR에 자랑했었는데 나름대로 반응이 좋았다..ㅎㅎ

+ 또 공부하면서 새롭게 안 내용인데 Grad-CAM을 XAI에서 쓰이는 SHAP와 Deep-LIFT 아이디어를 가져와 LIFT-CAM으로 발전시켜 더욱 성능을 개선한 논문이 있다. (논문 리뷰: https://wewinserv.tistory.com/185 )

 

 


참고 문헌

[1] 프랑소와 숄레, 케라스 창시자에게 배우는 딥러닝, 길벗, 219~240pg

[2] 안재현, XAI 설명 가능한 인공지능, 인공지능을 해부하다, 위키북스

[3] Zhou, Bolei, et al. "Learning deep features for discriminative localization." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016

[4] Ramprasaath R. Selvaraju, Michael Cogswell, Abhishek Das, Ramakrishna Vedantam, Devi Parikh, Dhruv Batra, Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization

[5] https://github.com/slundberg/shap

[6] https://github.com/marcotcr/lime

 
 
Comments