- 개발했던 deep learning 추천 시스템에 shap(https://github.com/slundberg/shap) 을 적용해보았다.
- 이때 발견했던 해당 레포의 문제점들과, 삽질들, 해결과정을 기록한다.
- 아래 내용은 2021년 9월 29일에 적용해보았던 내용으로, 그 이후에 해당 레포에 수정이 있었을 수 있다.
1. explainer 의 선택
- 해당 레포는 아래 링크에서의 여러 explainable model 논문의 구현체를 통합하여 제공하고 있다.
- 이 9개의 explainer 들 중 deep learning model 에 활용할 수 있는 건, DeepExplainer 와 GradientExplainer, 이렇게 딱 두 가지이다.
- 이중 GradientExplainer 는 tensorflow, keras, pytorch의 세 모델 코드에 적용이 가능한 한편, DeepExplainer 는 tensorflow, keras 에만 적용이 가능하니 주의하자.
2. embedding layer 의 존재에 따른 explainer 선택
- (이걸 꽤 나중에야 깨달아서 많이 화가났었다...)
- gradient explainer 의 경우 multi input 을 받으면서도, embedding layer 를 포함한 경우 사용할 수 없다!
- issue에 보면 이것과 관련해서 말이 많은데, 명확히 된다 안된다 말이 나오는 경우 없이, 성토의 자리가 되고 있어서(혹은 이거말고 다른 explainer 를 썼더니 되는것같더라) 이걸 확신하고 다른 길로 트는데에 나도 오래걸렸다.
- 2021년 9월 29일까지는 분명히 안된다...
- issue 에는 embedding layer 의 element 각각을 평균 내서라도 어떤 값을 떨어트려주면 안되냐는 식의 요청 혹은 질문들인데, 아직까지 반영이 안되고 있다.
- 위에서와 같이, 여러 feature 들을 list 로 받다보니, feature 입력 순서가 중요해진다.(input layer 이름과 매핑하는 등의 과정이 전혀 없다.)
- 이때 tensorflow 와 keras의 경우, model.summary()에서 표시되는 feature 의 순서로 하면 된다.
5. tf2 지원X
- deep explainer 의 경우, tf2 지원이 되지 않는다.(gradient explainer는 된다!)
- 사실 5번의 이유를 먼저 깨닫고, 2번의 이유를 나중에 깨달았기때문에, 본인은 gradient explainer 를 쉽게 포기하지 못하여 길게 삽질을 했었다...
- 아래의 글을 잔뜩 참조하고 나서야 tf2지원이 안되는것을 깨달았다.
- 위에 글에서와 같이 eager execution 을 끄고 진행하면 잘 동작한다.
- 그러나 이때에는 tf2에서처럼 tfrecord 에서 parsing 한 tensor 자체를 input으로 바로 넣어줄 수는 없게 돼서, 3번의 그림에서와 같은 괴상한 형태로 input을 만들게 된다 ;ㅁ;
마무리 하며...
- 내가 사용한 https://github.com/slundberg/shap의 레포는 받는 관심에 비해서, as가 활발하지는 않은 안타까운 레포인 것 같다.
- 글을 쓰고 있는 현재(2021년 12월 20일)star 수가 14k 인 것에 반해, issue 1.2k개가 open 된 상태로 방치되어있다...
- 쓸 수는 있는 상태지만, 그 편의성이 다소 안타까울 따름이다...
감사합니다 ㅜㅜ 제가 삽질할 시간을 크게 줄여주셨습니다