Spaces:
Paused
Paused
File size: 10,048 Bytes
5551585 | 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 | Mình đã rà lại toàn bộ source + tài liệu mô tả chính của project, và có 2 điểm rất quan trọng trước khi bạn viết báo cáo:
README/baseline/optimization docs có vài chỗ đã cũ hoặc mô tả “định hướng” hơn là code đang có thật.
Báo cáo nên bám vào code thực tế trong repo, đặc biệt là:
train_medical.py
src/models/medical_vqa_model.py
src/models/transformer_decoder.py
src/models/multimodal_vqa.py
src/engine/trainer.py
src/engine/medical_eval.py
web/main.py
configs/medical_vqa.yaml
Một số lệch cần sửa trong báo cáo:
README nhắc app.py, nhưng demo thực tế là web/main.py.
README nhắc src/data/translate_med_vqa.py, nhưng pipeline dịch thực tế nằm ở scripts/data_pipeline.py và src/utils/translator.py.
README nhắc scripts/prepare_ood_test.py, nhưng file thực tế để tạo tập test thủ công là scripts/create_manual_test.py.
OPTIMIZATION_REPORT.md nhắc một số file như src/utils/optimized_metrics.py và src/utils/medical_augmentation.py, nhưng chúng không có trong snapshot repo hiện tại, nên không nên viết vào báo cáo như là code đã có.
Dưới đây là nội dung báo cáo mình khuyên bạn dùng.
1. Tóm tắt đề tài
Đề tài xây dựng hệ thống Medical Visual Question Answering tiếng Việt trên bộ dữ liệu SLAKE và VQA-RAD đã được dịch sang tiếng Việt. Mục tiêu của project là tạo ra một mô hình có khả năng trả lời câu hỏi y khoa dựa trên ảnh chẩn đoán bằng cả hai hướng: hướng rời rạc truyền thống với encoder-decoder, và hướng sinh tự do dựa trên mô hình đa phương thức lớn. Hệ thống được thiết kế để xử lý cả câu hỏi đóng dạng Yes/No lẫn câu hỏi mở mô tả tổn thương, vị trí, phương thức chụp và cơ quan.
2. Cơ sở dữ liệu
Project sử dụng hai nguồn chính:
SLAKE, một dataset y khoa đa ngôn ngữ có chú thích ngữ nghĩa.
VQA-RAD, dataset câu hỏi trả lời cho ảnh X-quang và chẩn đoán hình ảnh.
Dữ liệu gốc được chuẩn hóa sang tiếng Việt, gắn nhãn theo kiểu câu hỏi đóng/mở, và được lưu thành bộ dữ liệu đã merge để train/validation/test. Một pipeline khác được dùng để tạo tập test thủ công nhằm đánh giá thực tế và phục vụ human review.
3. Cơ sở lý thuyết và kiến thức sử dụng
Hệ thống này kết hợp nhiều mảng kiến thức:
Computer Vision: dùng CNN DenseNet-121 làm image encoder, có tối ưu riêng cho ảnh y khoa.
NLP tiếng Việt: dùng PhoBERT để biểu diễn câu hỏi tiếng Việt.
Multimodal learning: dùng co-attention/cross-attention để trộn đặc trưng ảnh và văn bản.
Sequence generation: dùng LSTM và Transformer Decoder để sinh câu trả lời.
Efficient fine-tuning: dùng LoRA và QLoRA cho LLaVA-Med.
RLHF/alignment: dùng DPO và PPO để tinh chỉnh đầu ra theo preference y khoa.
Evaluation NLP: dùng Accuracy, EM, F1, BLEU, ROUGE-L, METEOR, BERTScore và semantic similarity.
4. Kiến trúc hệ thống
Project tách thành hai hướng:
Hướng A là mô hình modular:
Image encoder: DenseNet-121 từ TorchXRayVision.
Text encoder: PhoBERT.
Fusion: co-attention.
Decoder: hai biến thể, A1 là LSTM, A2 là Transformer Decoder.
Output head: tách nhánh closed-head cho câu trả lời Yes/No và open-head cho câu trả lời sinh tự do.
Hướng B là mô hình generative:
Dùng LLaVA-Med 7B làm nền tảng.
B1 là zero-shot.
B2 là fine-tuned bằng LoRA/QLoRA.
DPO và PPO là các bước tinh chỉnh bổ sung để cải thiện độ phù hợp với preference y khoa.
5. Luồng dữ liệu
Dữ liệu đi qua các bước:
Chuẩn hóa câu hỏi và câu trả lời.
Dịch sang tiếng Việt bằng pipeline translation có từ điển y khoa.
Làm sạch output và canonicalize các thuật ngữ y khoa.
Tạo train/validation/test.
Tạo preference pairs cho DPO.
Tạo tập test thủ công để kiểm tra thủ công hoặc làm benchmark bổ sung.
File trung tâm cho phần này là:
src/data/medical_dataset.py
src/utils/text_utils.py
src/utils/translator.py
scripts/data_pipeline.py
scripts/create_manual_test.py
6. Mô hình A1/A2
Trong src/models/medical_vqa_model.py, mô hình A dùng DenseNet-121 để trích đặc trưng không gian của ảnh và PhoBERT để mã hóa câu hỏi. Đặc trưng ảnh và text được đưa vào lớp co-attention để học tương tác liên miền. Sau đó decoder sinh hai đầu ra:
classifier head cho câu hỏi đóng.
generator head cho câu hỏi mở.
A1 dùng LSTM decoder, phù hợp làm baseline tuần tự.
A2 thay LSTM bằng Transformer Decoder, cho khả năng mô hình hóa phụ thuộc dài hơn và thường cho kết quả tốt hơn trên câu hỏi mở.
MedicalVQADecoder trong src/models/transformer_decoder.py còn có các điểm đáng chú ý:
weight tying giữa embedding và output projection.
beam search có length normalization.
causal mask cache.
tách training/inference rõ ràng.
7. Mô hình B1/B2/DPO/PPO
Trong src/models/multimodal_vqa.py, LLaVA-Med được nạp với 4-bit quantization và LoRA để giảm VRAM. Đây là lựa chọn phù hợp nếu muốn fine-tune mô hình lớn trên phần cứng giới hạn.
Trong train_medical.py, B2 được train bằng SFT với prompt tiếng Việt, còn DPO và PPO là các bước refinement:
B2 học từ cặp prompt-answer chuẩn.
DPO học từ preference data gồm chosen/rejected.
PPO dùng reward từ câu trả lời sinh ra, nhấn mạnh consistency và semantic match.
8. Huấn luyện
Trong src/engine/trainer.py, training loop của hướng A có các kỹ thuật:
AMP mixed precision.
gradient accumulation.
dynamic class weights cho nhãn Yes/No.
cosine scheduler với warmup.
label smoothing cho nhánh open.
early stopping theo patience.
Loss cũng được tách theo hai nhánh:
closed loss cho câu hỏi đóng.
open loss cho câu hỏi mở, kèm penalty để tránh model quá ngắn hoặc quá “chỉ đoán một token”.
Trong configs/medical_vqa.yaml, các biến thể A1/A2/B1/B2/DPO/PPO được cấu hình riêng, bao gồm batch size, learning rate, beam width, số token tối đa và các tham số LoRA/QLoRA.
9. Tiền xử lý ảnh
src/utils/visualization.py chứa MedicalImageTransform, hiện thực:
resize ảnh.
áp dụng CLAHE để tăng tương phản cục bộ.
chuyển sang tensor 1 kênh.
scale theo dải phù hợp cho XRayVision.
Trong tài liệu safety, project nhấn mạnh không nên dùng augmentation nguy hiểm như flip lớn hay rotation lớn đối với ảnh y khoa. Tuy nhiên trong code hiện tại, phần augmentation thực tế chủ yếu là CLAHE và normalization, nên báo cáo nên mô tả đúng như vậy.
10. Đánh giá
src/engine/medical_eval.py là file đánh giá quan trọng nhất. Nó tách rõ:
prediction raw.
prediction normalized.
closed vs open.
long-answer evaluation.
Cách đánh giá này rất hợp lý cho Medical VQA vì:
câu hỏi đóng cần so khớp nhãn chuẩn.
câu hỏi mở cần đánh giá ngữ nghĩa, không chỉ exact match.
Các metric dùng trong repo:
Accuracy, EM, F1 cho câu trả lời ngắn.
BLEU-1/2/3/4, ROUGE-L, METEOR cho sinh tự do.
BERTScore và semantic score để đo độ gần về nghĩa.
human review và LLM-judge để kiểm tra chất lượng dịch thuật và câu trả lời.
11. Demo web
web/main.py xây dựng FastAPI server để:
upload ảnh.
nhập câu hỏi.
chạy so sánh giữa A1, A2, B1, B2, DPO, PPO.
cache model.
rewrite câu trả lời đầu ra bằng một layer phụ.
Phần này rất phù hợp để đưa vào báo cáo như “hệ thống triển khai thực nghiệm” hoặc “giao diện minh họa mô hình”.
12. Kết luận kỹ thuật
Điểm mạnh lớn nhất của project là không chỉ xây model, mà còn xây đủ pipeline hoàn chỉnh:
dữ liệu,
dịch thuật,
preprocessing,
training,
evaluation,
alignment,
web demo,
logging với WandB,
xuất biểu đồ so sánh.
Điều này giúp báo cáo có thể viết theo hướng một hệ thống end-to-end cho Medical VQA tiếng Việt, chứ không phải chỉ là một mô hình đơn lẻ.
13. Phần nên đưa thẳng vào báo cáo
Bạn có thể viết phần “đóng góp chính” như sau:
Xây dựng pipeline Medical VQA tiếng Việt từ hai dataset y khoa lớn là SLAKE và VQA-RAD.
Thiết kế kiến trúc modular với DenseNet-121, PhoBERT và co-attention cho hướng truyền thống.
Thiết kế hướng generative với LLaVA-Med và fine-tuning bằng LoRA/QLoRA.
Bổ sung DPO/PPO để cải thiện alignment và tính y khoa của câu trả lời.
Xây dựng hệ thống đánh giá đa tầng kết hợp metric tự động, LLM-as-a-judge và human review.
Triển khai web demo phục vụ thử nghiệm và so sánh nhiều biến thể mô hình.
14. Tài liệu tham khảo nên trích
Dưới đây là danh sách paper/link chuẩn để bạn đưa vào báo cáo:
SLAKE: arXiv 2102.09542
VQA-RAD: Nature Scientific Data 2018
DenseNet: arXiv 1608.06993
Bahdanau attention: arXiv 1409.0473
Transformer: arXiv 1706.03762
Co-attention: arXiv 1606.00061
PhoBERT: arXiv 2003.00744
Medical VQA survey: arXiv 2111.10056
LLaVA: arXiv 2304.08485
LLaVA-Med: arXiv 2306.00890
LoRA: arXiv 2106.09685
QLoRA: arXiv 2305.14314
DPO: arXiv 2305.18290
PPO: arXiv 1707.06347
BERTScore: arXiv 1904.09675
Dictionary-enhanced prompting cho MT/domain adaptation: arXiv 2402.15061 |