Explainable AI - Bạn có hiểu model của bạn không?
Bài đăng này đã không được cập nhật trong 2 năm
Giới thiệu Explainable AI
Sự thành công của Deep Neural Network (DNN - mạng nơ-ron sâu) đã mang đến những bước tiến lớn trong các ứng dụng, nghiên cứu A.I (trí tuệ nhân tạo). Mặc dù vô cùng thành công, nhưng DNN hoạt động giống như một chiếc hộp đen, ta không biết tại sao mạng nơ-ron lại đưa ra một quyết định cụ thể. Do đó, khi một hệ thống A.I dự đoán sai, ta không hề biết tại sao hệ thống đó lại dự đoán sai, để lại chúng ta ngơ ngác chấp nhận rằng với trường hợp này thì chúng dự đoán sai.
Vì vậy, khả năng có thể diễn giải, hiểu một model A.I là cần thiết. Để có thể tạo ra một hệ thống A.I đáng tin tưởng, ta cần phải có một model có thể giải thích tại sao chúng lại đưa ra dự đoán như vậy. Nói rộng hơn, việc tạo ra một hệ thống A.I có thể tự diễn giải được chia làm 3 giai đoạn sử dụng.
- Trước hết, khi khả năng của A.I yếu hơn con người rất nhiều và không sẵn sàng để deploy, việc có một model tự diễn giải lúc này sẽ giúp chúng ta xác định nguyên nhân của sự thất bại của chúng, để các A.I Engineer có thể cải tiến model theo một hướng rõ ràng.
- Thứ hai, nếu khả năng của A.I ngang cơ với con người, việc có thể tự diễn giải có thể tạo dựng sự tin tưởng cho model đó đối với người dùng.
- Thứ ba, nếu khả năng của A.I vượt con người, ta có thể dùng model đó hướng dẫn con người học tác vụ đó.
CAM - Class Activation Map
Trong phần này, mình sẽ nói về cách tạo ra Class Activation Map (CAM) sử dụng Global Average Pooling (GAP) trong CNN. Một Class Activation Map cho một class cụ thể sẽ biểu thị những vùng được cho là quan trọng ở trong ảnh dùng để nhận diện class đó (Hình 1).
Ý tưởng
Để có thể tạo các Maps đó, nhóm tác giả của paper CAM đã tạo nên một mạng nơ-ron riêng lấy ý tưởng từ InceptionNet. Ngay trước layer softmax để đưa ra output của mạng, ta thực hiện GAP, rồi mới đưa feature đã được GAP vào lớp Fully-Connected (FC) cuối sử dụng softmax để phân loại. Sử dụng kiến trúc này, ta có thể xác định được vùng quan trọng trong bức ảnh bằng việc ánh xạ lại weight của output layer lên feature map từ lớp Convolution (Conv), kĩ thuật này được gọi là Class Activation Mapping (Hình 2).
Nhìn vào Hình 2, GAP sẽ đưa ra trung bình về mặt vị trí của từng feature map trong lớp Conv cuối. Để có thể đưa ra dự đoán của một class, ta thực hiện một phép cộng sử dụng trọng số (weighted sum) lên toàn bộ các unit sau khi GAP. Tương tự, ta thực hiện weighted sum lên từng feature map trong lớp Conv cuối để thu được CAM.
Phía trên là toàn bộ ý tưởng để tạo ra CAM, tiếp theo mình sẽ đi rõ vào cách thực hiện gồm khá nhiều toán, các bạn có thể bỏ qua nếu muốn.
Cách thực hiện
Với một ảnh đầu vào, gọi là activation của feature map thứ (unit ) trong lớp Conv cuối tại vị trí . Gọi kết quả của phép GAP là , với unit , kết quả khi áp dụng GAP là . Với class , input trước khi đưa vào softmax với là weight của unit ứng với class . Cuối cùng, đầu ra softmax cho class là .
Thay vào class score , ta thu được:
Gọi là CAM cho class , mỗi điểm tọa độ trong CAM sẽ được tính theo công thức:
Ta có thể thấy, , do đó, sẽ biểu thị độ quan trọng của vị trí ứng với class .
Nhưng kích thước của feature map từ lớp Conv cuối khá là nhỏ, vì vậy, để thu được CAM trên ảnh, ta sử dụng một phép upsampling đơn giản CAM cho bằng với kích thước của ảnh đầu vào là xong.
Grad-CAM: CAM nhưng sử dụng Gradient
Một điểm yếu của CAM là chỉ có thể sử dụng được lên feature maps trong lớp Conv ngay trước khi đưa vào lớp output, và chỉ phù hợp với các model mà sử dụng GAP trước khi đưa vào lớp output (feature maps -> GAP -> output prediction). Grad-CAM sử dụng tín hiệu của gradient để kết hợp các feature maps mà không cần phải thay đổi kiến trúc của mạng (thêm vào GAP) (Hình 4).
Ý tưởng
Grad-CAM là một trường hợp Generalized của CAM, có thể sử dụng với bất kì kiến trúc mạng nào. Ý tưởng của Grad-CAM cũng giống với CAM, ta tận dụng thông tin về không gian ở trong các lớp Conv để có thể hiểu vùng nào là quan trọng đối với một class cụ thể. Grad-CAM có thể sử dụng lên bất kì feature maps từ bất kì layer nào ở trong mạng, nhưng để chứng minh độ hiệu quả cũng như tính giải thích cao của mô hình, paper Grad-CAM sử dụng lớp Conv cuối, vì lớp Conv cuối thường là lớp chứa nhiều thông tin nhất (Hình 5).
Các feature maps được sinh ra từ lớp Conv cuối kí hiệu là . Lúc này, ở CAM, ta sẽ phải thực hiện GAP và theo sau đó là một lớp FC. Tuy nhiên, trong Grad-CAM, sau đó có thể là gì cũng được, có thể là vài lớp FC, hay Conv, kí hiệu là "any neural network layers" ở trên Hình 5. Yêu cầu duy nhất là các layers chèn thêm phía sau layer sinh ra phải khả vi để có thể lấy được gradient.
Sự khác biết giữa CAM và Grad-CAM lúc này là cách tính weight cho từng feature map để tạo nên heatmap. Ở CAM, các giá trị weight này được lấy từ weight của lớp GAP với lớp FC cuối của mạng, còn trong Grad-CAM, ta sử dụng giá trị "alpha" dựa trên gradient.
Phía trên là toàn bộ ý tưởng để tạo ra heatmap sử dụng Grad-CAM, tiếp theo mình sẽ đi rõ vào cách thực hiện gồm khá nhiều toán, các bạn có thể bỏ qua nếu muốn.
Cách thực hiện
Grad-CAM sẽ gồm 3 bước:
Bước 1: Tính gradient. Ta cần phải tính gradient của ứng với feature map activation sinh ra từ một lớp Conv: (Hình 6).
Bước 2: Tính "alpha". Ta sẽ tính giá trị "alpha" bằng trung bình gradients. Gradient thu được ở bước 1 là một tensor 3 chiều (channels, height, width). Ta thực hiện GAP lên Gradient đó, thu được tensor weight có chiều (channels, 1, 1) (Hình 7).
Bước 3: Tạo Class Activation Map. Ta thực hiện weighted sum kết hợp với hàm ReLU để tạo ra heatmap (CAM).
Nếu để ý công thức, các bạn có thể thấy nó hơi giống kĩ thuật Attention thường sử dụng ở trong Computer Vision.
Kết quả của Grad-CAM, các bạn có thể tìm thấy ở hình dưới.
Ablation-CAM: CAM nhưng không sử dụng Gradient, sử dụng loại bỏ thông tin
Ablation-CAM nêu ra một vài nhược điểm của Grad-CAM như sau:
- Grad-CAM dựa vào dòng chảy của gradient từ output layer đến Conv layer mong muốn để tạo ra Class Activation Map. Nhưng mỗi layer lại là một hàm phi tuyến tính của ảnh đầu vào cũng như là của những layer trước đó, vì vậy, Grad-CAM chịu ảnh hưởng của gradient saturation, dẫn đến việc gradient trong quá trình backprop nhỏ dần rồi biến mất, ảnh hưởng đến chất lượng Visualization
- Model chỉ cần thực hiện forward pass để dưa ra prediction, vậy tại sao lại giải thích prediction của model sử dụng backprop để lấy gradient?
Ý tưởng
Ý tưởng của Ablation-CAM đến từ việc Ablation (loại bỏ) đi thông tin của feature maps. Morcos và đồng bọn [1] đã thực hiện Ablation Analysis (thử nghiệm loại bỏ) để tìm ra độ quan trọng của từng unit trong layer đối với model. Họ kết luận rằng, với một model mà có tính generalized cao thì sẽ ít phụ thuộc vào một neuron hơn, và việc Ablation (đặt giá trị của neuron đó = 0) sẽ không làm ảnh hưởng đến hiệu suất của model. Tuy nhiên, Morcos và đồng bọn lại chưa phân tích đến ảnh hưởng của việc Ablation tới một class cụ thể. Sau đó, Zhou và đồng bọn [2] đã cho thấy việc bỏ đi một feature map từ output feature maps của một layer có ảnh hưởng nghiêm trọng đến đầu ra logit từ output layer của model (Hình 8).
Ablation-CAM cho rằng việc đó thể hiện được độ quan trọng của feature map bị bỏ đi đó lên class cần xác định. Vì vậy, thay vì sử dụng GAP lên ma trận gradient, Ablation-CAM thực hiện Ablation từng feature map trong feature maps đầu ra của một lớp Conv, và sử dụng chúng làm weight.
Phía trên là toàn bộ ý tưởng để tạo ra heatmap sử dụng Ablation-CAM, tiếp theo mình sẽ đi rõ vào cách thực hiện gồm khá nhiều toán, các bạn có thể bỏ qua nếu muốn.
Cách thực hiện
Xét việc ta cần tạo ra Class Activation Map cho một ảnh đầu vào . Thực hiện forward pass qua model, ta thu được đầu ra logit ứng với class là . này là giá trị của một hàm phi tuyến tính của feature map , tức là với . Đặt toàn bộ giá trị của feature map , thực hiện forward pass ảnh lần nữa qua model, thu được . này có thể giảm so với . Lúc này, với .
Ta có slope mô tả ảnh hưởng của việc ablation feature map như sau:
Nhưng trong Ablation-CAM, ta sẽ sử dụng một biến thể của slope trên để đo độ quan trọng của với class bởi vì mẫu số norm A () có giá trị cực kì lớn so với tử số . Vì vậy, công thức biến đổi để tính weight là:
có thể hiểu là fraction of drop trong logit output của class khi feature map .
Ta thu được Class Activation Map bằng weighted sum và ReLU tương tự như Grad-CAM:
Reference
[1]. A. S. Morcos, D. G. Barrett, N. C. Rabinowitz, and M. Botvinick. On the importance of single directions for generalization. ICLR, 2018.
[2]. B. Zhou, Y. Sun, D. Bau, and A. Torralba. Revisiting the importance of individual units in cnns via ablation. arXiv preprint arXiv:1806.02891, 2018.
https://github.com/jacobgil/pytorch-grad-cam: Một thư viện chứa rất nhiều các phương pháp CAM
Interpretable Machine Learning bản dịch tiếng Việt: https://github.com/giangnguyen2412/InterpretableMLBook-Vietnamese/blob/master/IML_bookv1.0.pdf
All rights reserved