From 104aabcfd5f385334ad194d11cd65a0ca307c7cc Mon Sep 17 00:00:00 2001 From: Cong Date: Thu, 28 Jul 2022 09:19:08 +0900 Subject: [PATCH] Handle edge cases. - Make clear the difference to CleanLab. --- docs/_main.pdf | Bin 59400 -> 59984 bytes docs/lapros.jl.html | 4 +- docs/search_index.json | 2 +- ...\221\341\273\231-kh\341\272\243-nghi.html" | 53 +++-- index.Rmd | 30 ++- lapros.jl | 206 ++++++++++-------- 6 files changed, 170 insertions(+), 125 deletions(-) diff --git a/docs/_main.pdf b/docs/_main.pdf index 74b2b0e9ae1f4921ffaa8000c41d962a9aee1957..63f0287d88c674a6bddde04a9ddd4e7b46da5bab 100644 GIT binary patch delta 34723 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 diff --git a/docs/lapros.jl.html b/docs/lapros.jl.html index 526b0c5..fde8c89 100644 --- a/docs/lapros.jl.html +++ b/docs/lapros.jl.html @@ -3,11 +3,11 @@ diff --git a/docs/search_index.json b/docs/search_index.json index 6c96c43..46fc167 100644 --- a/docs/search_index.json +++ b/docs/search_index.json @@ -1 +1 @@ -[["index.html", "LaPros Mở đầu Lỗi quan sát nhãn là gì? Quy trình nhiễu theo lớp Ví dụ cụ thể Ma trận nhiễu theo lớp", " LaPros Chi Cong Vo July 2022 Mở đầu Có một bộ dữ liệu bảng số, được gắn nhãn để phân loại, ví dụ nhãn dương tính và âm tính. Giả sử các nhãn dương tính có độ tin cậy cao, còn các nhãn âm tính có độ tin cậy thấp hơn, có thể xem như chứa cả dữ liệu dương tính chưa bộc phát. Lấy ví dụ với dữ liệu đánh giá tín dụng thì những ca vỡ nợ sẽ có nhãn dương tính. Với dữ liệu khám nghiệm ung thư thì những ca đã phát bệnh là dương tính. Giả sử phân bố nhãn trong bộ dữ liệu trên có tương quan đủ mạnh với phân bố nhãn tiềm ẩn thật sự. Trong phân bố nhãn có tiềm ẩn tính đa dạng, bất định mang tính bản chất. Ví dụ có 10 người có các thuộc tính xấu gần giống nhau, nhưng sẽ trong đó sẽ chỉ có 8 người ngẫu nhiên nào đó vỡ nợ, hoặc bị ung thư. Bộ dữ liệu trên có một số lượng nhất định các nhãn bị gắn sai. Có thể nào xác định được ranh giới để phân biệt được lỗi gắn nhãn với tính bất định bản chất của dữ liệu hay không? Giả sử rằng suất nhãn bị gán sai không phụ thuộc vào từng ca dữ liệu cụ thể mà chỉ phụ thuộc vào đặc tính của các lớp nhãn dữ liệu. Ví dụ trường hợp phân loại 3 loài vật là chó, mèo và chuột, thì xác suất nhầm chó với mèo cao hơn là nhầm mèo với chuột hoặc chó với chuột. Có một mô hình dự đoán xác suất dương tính đối với bộ dữ liệu nêu trên. Giả sử xác suất do mô hình đưa ra có tương quan đủ mạnh đối với phân bố thật sự của nhãn. Với những giả sử nêu trên, ta có thể ước lượng được xác suất nhãn gắn trên một ca dữ liệu là thật sự đúng hay không? Lỗi quan sát nhãn là gì? Với một đối tượng khảo sát, quan sát viên sẽ quan sát, xem xét, nghiên cứu rồi gán một nhãn nhất định cho dữ liệu đó. Trong môi trường lý tưởng thì ta sẽ nhận định và gán đúng nhãn “chân lý” cho đối tượng. Ví dụ ta có thể quan sát ngực, bụng, mông của một người nào đó và nhận định giới tính. Trong thực tế thì có thể xảy ra nhầm lẫn ở một bước nào đó trong quá trình từ khi bắt đầu quan sát cho đến khi gắn xong nhãn. Nhầm lẫn đó có thể dẫn tới gán nhầm nhãn “Nam” cho đối tượng vốn là “Nữ”, hoặc ngược lại. Chúng ta gọi “lỗi quan sát nhãn” và “lỗi gắn nhãn” với cùng một ý nghĩa. Có thể có một số nam giới và nữ giới có số đo 3 vòng khá giống nhau, nhưng “đương nhiên” họ có 2 giới tính khác nhau, tức là các nhãn “chân lý” của họ là khác nhau về bản chất, chứ không nhất thiết có liên quan đến việc gắn nhãn có lỗi hay không. Nói cách khác từ số đo 3 vòng ta có thể không suy đoán được chắc chắn 100% nhưng có thể tính được xác suất giới tính Nam/Nữ của đối tượng. Quy tắc hay mô hình suy đoán có thể học được từ một tập dữ liệu có số đo 3 vòng và giới tính tương ứng của nhiều mẫu người khác nhau. Nếu trong tập dữ liệu này có những nhãn giới tính bị gắn sai thì việc học xác suất “chân lý” sẽ bị lệch lạc. Quy trình nhiễu theo lớp Giả sử có một bộ dữ liệu số được gắn nhãn phân loại thành \\(m\\) lớp khác nhau \\(M ≔{1,2,\\ldots,m}\\). Giả sử đối với mỗi mẫu dữ liệu ta có một nhãn “tiềm ẩn” thật là \\(\\dot{y}\\). Trước khi quan sát được nhãn \\(\\tilde{y}\\), giả sử có một quy trình gây nhiễu biến \\(\\dot{y}=j\\) thành \\(\\tilde{y}=i\\) với xác suất \\(\\dot{p}(\\tilde{y}=i, \\dot{y}=j)\\) chỉ phụ thuộc vào \\(i,j \\in M\\) và độc lập với các mẫu dữ liệu cụ thể, \\[\\dot{p}(\\tilde{y}| \\dot{y}; {\\boldsymbol{{x}}}) \\equiv \\dot{p}(\\tilde{y}| \\dot{y}) \\forall{\\boldsymbol{{x}}}.\\] Ví dụ khi phân loại 3 loài vật là chó, mèo và chuột, thì xác suất nhầm chó với mèo cao hơn là nhầm mèo với chuột hoặc chó với chuột, và xác suất đó không phụ thuộc vào từng con thú cụ thể. Giả sử này là hợp lý và thường được sử dụng trong các nghiên cứu về xử lý nhiễu (Goldberger and Ben-Reuven, 2017; Sukhbaatar et al., 2015). Ví dụ cụ thể Xem ví dụ với dữ liệu cụ thể tại đây. Ma trận nhiễu theo lớp \\[\\dot{{\\boldsymbol{{Q}}}}_{\\tilde{y}, \\dot{y}} ≔\\left[ {\\begin{array}{ccc} \\dot{p}(\\tilde{y}=1, \\dot{y}=1) & \\ldots & \\dot{p}(\\tilde{y}=1, \\dot{y}=m) \\\\ \\vdots & \\dot{p}(\\tilde{y}=i, \\dot{y}=j) & \\vdots \\\\ \\dot{p}(\\tilde{y}=m, \\dot{y}=1) & \\ldots & \\dot{p}(\\tilde{y}=m, \\dot{y}=m) \\\\ \\end{array} } \\right]\\] là ma trận kích thước \\(m\\times m\\) thể hiện phân phối xác suất đồng thời cho \\(\\tilde{y}\\) và \\(\\dot{y}.\\) Độ thưa là tỷ lệ số \\(0\\) chiếm lĩnh các vị trí ngoại trừ đường chéo của ma trận \\(\\dot{{\\boldsymbol{{Q}}}}_{\\tilde{y},\\dot{y}}\\): độ thưa bằng \\(0\\) nói rằng mọi tỷ lệ nhiễu \\(p_{\\tilde{y},\\dot{y}}\\) đều khác \\(0\\), còn độ thưa \\(1\\) thể hiện tình trạng lý tưởng, hoàn toàn không có nhiễu trong nhãn. Gọi \\({\\boldsymbol{{X}}}_{\\tilde{y}=i}\\) là tập hợp các mẫu \\({\\boldsymbol{{x}}}\\) đã được gán nhãn \\(\\tilde{y}=i\\). Độ tự tin \\(p_{{\\boldsymbol{{\\phi}}}}(\\tilde{y}=i; {\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i})\\) là xác suất mô hình \\({{\\boldsymbol{{\\phi}}}}\\) đưa ra đối với mẫu \\({\\boldsymbol{{x}}}\\), dự đoán nó có label đúng như label \\(\\tilde{y}\\) đã được gán. Độ tự tin thấp là một dấu hiệu của khả năng nhãn có lỗi. "],["đánh-giá-độ-khả-nghi.html", "Đánh giá độ khả nghi Khái quát Chỉ tiêu tự tin Xếp hạng khả nghi Ước lượng ma trận nhiễu", " Đánh giá độ khả nghi Khái quát Đầu vào Các nhãn \\(\\tilde{y}_k\\) đã quan sát được đối với các mẫu \\({\\boldsymbol{{x}}}_k\\in{\\boldsymbol{{X}}}\\) Xác suất \\(p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}_k})\\) mà mô hình \\({{\\boldsymbol{{\\phi}}}}\\) dự đoán mẫu \\({\\boldsymbol{{x}}}_k\\in{\\boldsymbol{{X}}}\\) có nhãn \\(i\\in M\\) Mặc nhiên \\[\\begin{equation} \\begin{cases} p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}}) \\geq 0 & \\quad\\forall i\\in M, \\forall{\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}\\\\ \\sum\\limits_{i\\in M}{p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})} \\equiv 1 & \\quad\\forall {\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}} \\end{cases} \\tag{1} \\end{equation}\\] Các bước Tính \\(t_i\\), độ tự tin trung bình theo \\({{\\boldsymbol{{\\phi}}}}\\) trong từng lớp \\(i\\in M\\) Ước lượng phân bố xác suất đồng thời \\(\\dot{{\\boldsymbol{{Q}}}}_{\\tilde{y}, \\dot{y}}\\) cho nhãn quan sát và nhãn thật Lọc và xếp hạng các mẫu theo mức độ khả nghi nhãn bị lỗi Loại bỏ các mẫu khả nghi nhất là nhãn bị lỗi Đặt trọng số cho các mẫu trong từng lớp \\(i\\in M\\) để học một mô hình mới. Chỉ tiêu tự tin Gọi số lượng mẫu được quan sát có nhãn \\(\\tilde{y}=i\\) là \\({\\boldsymbol{{C}}}_{\\tilde{y}=i} ≔|{\\boldsymbol{{X}}}_{\\tilde{y}=i}|.\\) Độ tự tin trung bình của mô hình \\({{\\boldsymbol{{\\phi}}}}\\) đối với lớp \\(i\\in M\\) là \\[\\begin{equation} {\\boldsymbol{{t}}}_i = \\frac{1}{{\\boldsymbol{{C}}}_{\\tilde{y}=i}} {\\sum\\limits_{{\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i}}p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})}. \\tag{2} \\end{equation}\\] Vì phép tính trung bình được thực hiện trên từng tập \\({\\boldsymbol{{X}}}_{\\tilde{y}=i}\\) nên có thể \\(\\sum\\limits_{i\\in M}{{\\boldsymbol{{t}}}_i} \\neq 1.\\) Với mỗi lớp \\(i\\in M\\) ta chọn chỉ tiêu tự tin \\({\\boldsymbol{{t}}}_i\\in(0,1)\\) bằng độ tự tin trung bình (2). Đối với từng mẫu \\({\\boldsymbol{{x}}}\\) và từng nhãn \\(i\\), giá trị xác suất dự đoán \\(p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})\\) đưa ra bởi mô hình \\({{\\boldsymbol{{\\phi}}}}\\), nếu không nhỏ hơn chỉ tiêu \\({\\boldsymbol{{t}}}_i\\) thì ta cho rằng nhãn \\(i\\) có khả năng đúng với mẫu \\({\\boldsymbol{{x}}}\\). Tập hợp nhãn khả dĩ đối với mẫu \\({\\boldsymbol{{x}}}\\) là \\[\\begin{equation} L_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})≔\\left\\{i\\in M: p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})\\geq {\\boldsymbol{{t}}}_i\\right\\} \\tag{3} \\end{equation}\\] Với giả định xác suất (1) và chỉ tiêu tự tin (2), ta kỳ vọng \\(L_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})\\neq\\emptyset.\\) Từ đó chọn một nhãn có xác suất dự đoán lớn nhất: \\[\\begin{equation} \\hat{l}_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})≔ \\begin{cases} \\mathop{\\rm arg max} \\limits_{i\\in L_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})} p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}}), & \\text{không xét chỉ tiêu}\\\\ \\mathop{\\rm arg max} \\limits_{i\\in L_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})} \\{p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}}) - {\\boldsymbol{{t}}}_i\\}, & \\text{có bù trừ chỉ tiêu} \\end{cases} \\tag{4} \\end{equation}\\] để làm nhãn “đáng tin nhất” cho mẫu \\({\\boldsymbol{{x}}}.\\) Xếp hạng khả nghi Gọi \\(\\dot{{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}\\) là tập (bất khả tri) các mẫu có nhãn quan sát là \\(i\\) và nhãn thật là \\(j\\), ta ước lượng nó bằng cách dùng các nhãn đáng tin nhất \\(\\hat{l}_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})\\) tại (4): \\[\\begin{equation} {{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j} ≔ \\left\\{{\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i}: \\hat{l}_{{{\\boldsymbol{{\\phi}}}}({\\boldsymbol{{x}}}),{\\boldsymbol{{t}}}} \\equiv j \\right\\} \\tag{5} \\end{equation}\\] Đơn thuần (mà lại hiệu quả) nhất, ta nghi ngờ các mẫu \\(\\left\\{{\\boldsymbol{{x}}}\\in{{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}: i\\neq j\\right\\}\\) nằm ngoài đường chéo của ma trận \\({{\\boldsymbol{{X}}}}_{\\tilde{y},\\dot{y}}\\) là có nhãn lỗi. Xếp hạng mức độ khả nghi của các mẫu đó dựa theo xác suất do mô hình \\({{\\boldsymbol{{\\phi}}}}\\) dự đoán: \\[\\begin{equation} {e}({{\\boldsymbol{{x}}}}) ≔\\max_{j\\neq i}{p_{\\tilde{y}={j}}({{\\boldsymbol{{x}}}})} -p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})\\quad \\forall {\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i} \\tag{6} \\end{equation}\\] theo cách làm trong CleanLab của Curtis et al.’s (2021), và đảo dấu so với Wei et al.’s (2018). Ta cũng có thể bù trừ chỉ tiêu tự tin vào để tính độ khả nghi: \\[\\begin{equation} e_{\\boldsymbol{{t}}}({\\boldsymbol{{x}}}) ≔ \\max_{j\\neq i}{\\{p_{\\tilde{y}={j}}({{\\boldsymbol{{x}}}})-{\\boldsymbol{{t}}}_j\\}} -\\{p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}}) - {\\boldsymbol{{t}}}_i\\} \\quad \\forall {\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i}. \\tag{7} \\end{equation}\\] Ước lượng ma trận nhiễu Ma trận đếm cặp nhãn \\({{\\boldsymbol{{C}}}}_{\\tilde{y},\\dot{y}}\\) kích thước \\(m\\times m\\) lưu số phần tử của các tập \\({{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}\\), \\[\\begin{equation} {{\\boldsymbol{{C}}}}_{\\tilde{y}=i,\\dot{y}=j} ≔|{{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j} | \\tag{8} \\end{equation}\\] ví dụ \\({{\\boldsymbol{{C}}}}_{\\tilde{y}=3,\\dot{y}=1} = 10\\) có nghĩa là, đếm được 10 mẫu được gán nhãn \\(3\\) nhưng “thật ra” nên có nhãn \\(1.\\) Vì (5) ước lượng \\({{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}\\approx\\dot{{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}\\) cho nên \\(\\sum\\limits_{j\\in M}{{\\boldsymbol{{C}}}}_{\\tilde{y}=i,\\dot{y}=j} \\approx {\\boldsymbol{{C}}}_{\\tilde{y}=i}.\\) Hiệu chỉnh ma trận đếm cặp nhãn qua hai bước. Bước đầu, hiệu chỉnh từng dòng theo số mẫu của từng lớp đã quan sát \\(i\\in M,\\) \\[\\begin{equation} \\check{Q}_{\\tilde{y}=i,\\dot{y}=j} = \\frac{{{\\boldsymbol{{C}}}}_{\\tilde{y}=i,\\dot{y}=j}}{\\sum\\limits_{j\\in M}{{\\boldsymbol{{C}}}}_{\\tilde{y}=i,\\dot{y}=j}} {{\\boldsymbol{{C}}}_{\\tilde{y}=i}}. \\tag{9} \\end{equation}\\] Cuối cùng, ta chia đều toàn bộ để tổng ma trận trở thành \\(1.\\) \\[\\begin{equation} {\\boldsymbol{{Q}}}_{\\tilde{y}=i,\\dot{y}=j}=\\frac{\\check{Q}_{\\tilde{y}=i,\\dot{y}=j}}{\\sum\\limits_{i,j\\in M}\\check{Q}_{\\tilde{y}=i,\\dot{y}=j}}. \\tag{10} \\end{equation}\\] Curtis et al.’s (2021) trình bày một số phương pháp dùng ma trận nhiễu (10) để chọn lọc và xếp hạng nhãn khả nghi có lỗi. "],["cuối-cùng.html", "Cuối cùng Triển vọng Tham khảo", " Cuối cùng Triển vọng Một số hướng nghiên cứu tương lai Tối ưu hóa giá trị chỉ tiêu tự tin Xử lý với bài toán hồi quy Tương tác qua lại giữa việc học mô hình và việc khử lỗi Tham khảo Curtis G. Northcutt and Lu Jiang and Isaac L. Chuang (2021). Confident Learning: Estimating Uncertainty in Dataset Labels. Journal of Artificial Intelligence Research (JAIR) An Introduction to Confident Learning: Finding and Learning with Label Errors in Datasets (curtisnorthcutt.com) cleanlab/cleanlab: The standard data-centric AI package for data quality and machine learning with messy, real-world data and labels. (github.com) Are Label Errors Imperative? Is Confident Learning Useful? | by Suneeta Mall | May, 2022 | Towards Data Science (medium.com) Wei, C., Lee, J. D., Liu, Q., and Ma, T. (2018). On the margin theory of feedforward neural networks. Computing Research Repository (CoRR) "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] +[["index.html", "LaPros Mở đầu Lỗi quan sát nhãn là gì? Quy trình nhiễu theo lớp Ví dụ cụ thể Ma trận nhiễu theo lớp", " LaPros Chi Cong Vo July 2022 Mở đầu Có một bộ dữ liệu bảng số, được gắn nhãn để phân loại, ví dụ nhãn dương tính và âm tính. Giả sử các nhãn dương tính có độ tin cậy cao, còn các nhãn âm tính có độ tin cậy thấp hơn, có thể xem như chứa cả dữ liệu dương tính chưa bộc phát. Lấy ví dụ với dữ liệu đánh giá tín dụng thì những ca vỡ nợ sẽ có nhãn dương tính. Với dữ liệu khám nghiệm ung thư thì những ca đã phát bệnh là dương tính. Giả sử phân bố nhãn trong bộ dữ liệu trên có tương quan đủ mạnh với phân bố nhãn tiềm ẩn thật sự. Trong phân bố nhãn có tiềm ẩn tính đa dạng, bất định mang tính bản chất. Ví dụ có 10 người có các thuộc tính xấu gần giống nhau, nhưng sẽ trong đó sẽ chỉ có 8 người ngẫu nhiên nào đó vỡ nợ, hoặc bị ung thư. Bộ dữ liệu trên có một số lượng nhất định các nhãn bị gắn sai. Có thể nào xác định được ranh giới để phân biệt được lỗi gắn nhãn với tính bất định bản chất của dữ liệu hay không? Giả sử rằng suất nhãn bị gán sai không phụ thuộc vào từng ca dữ liệu cụ thể mà chỉ phụ thuộc vào đặc tính của các lớp nhãn dữ liệu. Ví dụ trường hợp phân loại 3 loài vật là chó, mèo và chuột, thì xác suất nhầm chó với mèo cao hơn là nhầm mèo với chuột hoặc chó với chuột. Có một mô hình dự đoán xác suất dương tính đối với bộ dữ liệu nêu trên. Giả sử xác suất do mô hình đưa ra có tương quan đủ mạnh đối với phân bố thật sự của nhãn. Với những giả sử nêu trên, ta có thể ước lượng được xác suất nhãn gắn trên một ca dữ liệu là thật sự đúng hay không? Lỗi quan sát nhãn là gì? Với một đối tượng khảo sát, quan sát viên sẽ quan sát, xem xét, nghiên cứu rồi gán một nhãn nhất định cho dữ liệu đó. Trong môi trường lý tưởng thì ta sẽ nhận định và gán đúng nhãn “chân lý” cho đối tượng. Ví dụ ta có thể quan sát ngực, bụng, mông của một người nào đó và nhận định giới tính. Trong thực tế thì có thể xảy ra nhầm lẫn ở một bước nào đó trong quá trình từ khi bắt đầu quan sát cho đến khi gắn xong nhãn. Nhầm lẫn đó có thể dẫn tới gán nhầm nhãn “Nam” cho đối tượng vốn là “Nữ”, hoặc ngược lại. Chúng ta gọi “lỗi quan sát nhãn” và “lỗi gắn nhãn” với cùng một ý nghĩa. Có thể có một số nam giới và nữ giới có số đo 3 vòng khá giống nhau, nhưng “đương nhiên” họ có 2 giới tính khác nhau, tức là các nhãn “chân lý” của họ là khác nhau về bản chất, chứ không nhất thiết có liên quan đến việc gắn nhãn có lỗi hay không. Nói cách khác từ số đo 3 vòng ta có thể không suy đoán được chắc chắn 100% nhưng có thể tính được xác suất giới tính Nam/Nữ của đối tượng. Quy tắc hay mô hình suy đoán có thể học được từ một tập dữ liệu có số đo 3 vòng và giới tính tương ứng của nhiều mẫu người khác nhau. Nếu trong tập dữ liệu này có những nhãn giới tính bị gắn sai thì việc học xác suất “chân lý” sẽ bị lệch lạc. Quy trình nhiễu theo lớp Giả sử có một bộ dữ liệu số được gắn nhãn phân loại thành \\(m\\) lớp khác nhau \\(M ≔{1,2,\\ldots,m}\\). Giả sử đối với mỗi mẫu dữ liệu ta có một nhãn “tiềm ẩn” thật là \\(\\dot{y}\\). Trước khi quan sát được nhãn \\(\\tilde{y}\\), giả sử có một quy trình gây nhiễu biến \\(\\dot{y}=j\\) thành \\(\\tilde{y}=i\\) với xác suất \\(\\dot{p}(\\tilde{y}=i, \\dot{y}=j)\\) chỉ phụ thuộc vào \\(i,j \\in M\\) và độc lập với các mẫu dữ liệu cụ thể, \\[\\dot{p}(\\tilde{y}| \\dot{y}; {\\boldsymbol{{x}}}) \\equiv \\dot{p}(\\tilde{y}| \\dot{y}) \\forall{\\boldsymbol{{x}}}.\\] Ví dụ khi phân loại 3 loài vật là chó, mèo và chuột, thì xác suất nhầm chó với mèo cao hơn là nhầm mèo với chuột hoặc chó với chuột, và xác suất đó không phụ thuộc vào từng con thú cụ thể. Giả sử này là hợp lý và thường được sử dụng trong các nghiên cứu về xử lý nhiễu (Goldberger and Ben-Reuven, 2017; Sukhbaatar et al., 2015). Ví dụ cụ thể Xem ví dụ với dữ liệu cụ thể tại đây. Ma trận nhiễu theo lớp \\[\\dot{{\\boldsymbol{{Q}}}}_{\\tilde{y}, \\dot{y}} ≔\\left[ {\\begin{array}{ccc} \\dot{p}(\\tilde{y}=1, \\dot{y}=1) & \\ldots & \\dot{p}(\\tilde{y}=1, \\dot{y}=m) \\\\ \\vdots & \\dot{p}(\\tilde{y}=i, \\dot{y}=j) & \\vdots \\\\ \\dot{p}(\\tilde{y}=m, \\dot{y}=1) & \\ldots & \\dot{p}(\\tilde{y}=m, \\dot{y}=m) \\\\ \\end{array} } \\right]\\] là ma trận kích thước \\(m\\times m\\) thể hiện phân phối xác suất đồng thời cho \\(\\tilde{y}\\) và \\(\\dot{y}.\\) Độ thưa là tỷ lệ số \\(0\\) chiếm lĩnh các vị trí ngoại trừ đường chéo của ma trận \\(\\dot{{\\boldsymbol{{Q}}}}_{\\tilde{y},\\dot{y}}\\): độ thưa bằng \\(0\\) nói rằng mọi tỷ lệ nhiễu \\(p_{\\tilde{y},\\dot{y}}\\) đều khác \\(0\\), còn độ thưa \\(1\\) thể hiện tình trạng lý tưởng, hoàn toàn không có nhiễu trong nhãn. Gọi \\({\\boldsymbol{{X}}}_{\\tilde{y}=i}\\) là tập hợp các mẫu \\({\\boldsymbol{{x}}}\\) đã được gán nhãn \\(\\tilde{y}=i\\). Độ tự tin \\(p_{{\\boldsymbol{{\\phi}}}}(\\tilde{y}=i; {\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i})\\) là xác suất mô hình \\({{\\boldsymbol{{\\phi}}}}\\) đưa ra đối với mẫu \\({\\boldsymbol{{x}}}\\), dự đoán nó có label đúng như label \\(\\tilde{y}\\) đã được gán. Độ tự tin thấp là một dấu hiệu của khả năng nhãn có lỗi. "],["đánh-giá-độ-khả-nghi.html", "Đánh giá độ khả nghi Khái quát Chỉ tiêu tự tin Xếp hạng khả nghi Ước lượng ma trận nhiễu", " Đánh giá độ khả nghi Khái quát Đầu vào Các nhãn \\(\\tilde{y}_k\\) đã quan sát được đối với các mẫu \\({\\boldsymbol{{x}}}_k\\in{\\boldsymbol{{X}}}\\) Xác suất \\(p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}_k})\\) mà mô hình \\({{\\boldsymbol{{\\phi}}}}\\) dự đoán mẫu \\({\\boldsymbol{{x}}}_k\\in{\\boldsymbol{{X}}}\\) có nhãn \\(i\\in M\\) Mặc nhiên \\[\\begin{equation} \\begin{cases} p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}}) \\geq 0 & \\quad\\forall i\\in M, \\forall{\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}\\\\ \\sum\\limits_{i\\in M}{p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})} \\equiv 1 & \\quad\\forall {\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}} \\end{cases} \\tag{1} \\end{equation}\\] Các bước Tính \\(t_i\\), độ tự tin trung bình theo \\({{\\boldsymbol{{\\phi}}}}\\) trong từng lớp \\(i\\in M\\) Ước lượng phân bố xác suất đồng thời \\(\\dot{{\\boldsymbol{{Q}}}}_{\\tilde{y}, \\dot{y}}\\) cho nhãn quan sát và nhãn thật Lọc và xếp hạng các mẫu theo mức độ khả nghi nhãn bị lỗi Loại bỏ các mẫu khả nghi nhất là nhãn bị lỗi Đặt trọng số cho các mẫu trong từng lớp \\(i\\in M\\) để học một mô hình mới. Chỉ tiêu tự tin Gọi số lượng mẫu được quan sát có nhãn \\(\\tilde{y}=i\\) là \\({\\boldsymbol{{C}}}_{\\tilde{y}=i} ≔|{\\boldsymbol{{X}}}_{\\tilde{y}=i}|.\\) Độ tự tin trung bình của mô hình \\({{\\boldsymbol{{\\phi}}}}\\) đối với lớp \\(i\\in M\\) là \\[\\begin{equation} {\\boldsymbol{{t}}}_i = \\frac{1}{{\\boldsymbol{{C}}}_{\\tilde{y}=i}} {\\sum\\limits_{{\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i}}p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})}. \\tag{2} \\end{equation}\\] Vì phép tính trung bình được thực hiện trên từng tập \\({\\boldsymbol{{X}}}_{\\tilde{y}=i}\\) nên có thể \\(\\sum\\limits_{i\\in M}{{\\boldsymbol{{t}}}_i} \\neq 1.\\) Ta đề xuất lấy trung bình trên toàn bộ tập \\({\\boldsymbol{{X}}}\\) nếu \\({\\boldsymbol{{X}}}_{\\tilde{y}=i}\\equiv\\emptyset.\\) Với mỗi lớp \\(i\\in M\\) ta chọn chỉ tiêu tự tin \\({\\boldsymbol{{t}}}_i\\in(0,1)\\) bằng độ tự tin trung bình (2). Đối với từng mẫu \\({\\boldsymbol{{x}}}\\) và từng nhãn \\(i\\), giá trị xác suất dự đoán \\(p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})\\) đưa ra bởi mô hình \\({{\\boldsymbol{{\\phi}}}}\\), nếu không nhỏ hơn chỉ tiêu \\({\\boldsymbol{{t}}}_i\\) thì ta cho rằng nhãn \\(i\\) có khả năng đúng với mẫu \\({\\boldsymbol{{x}}}\\). Tập hợp nhãn khả dĩ đối với mẫu \\({\\boldsymbol{{x}}}\\) là \\[\\begin{equation} L_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})≔\\left\\{i\\in M: p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})\\geq {\\boldsymbol{{t}}}_i\\right\\} \\tag{3} \\end{equation}\\] Với giả định xác suất (1) và chỉ tiêu tự tin (2), với kỳ vọng \\(L_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})\\neq\\emptyset,\\) CleanLab (Curtis et al.’s 2021) chọn một nhãn có xác suất dự đoán lớn nhất: \\[\\begin{equation} \\hat{l}_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})≔ \\mathop{\\rm arg max}\\limits_{i\\in L_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})}p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}}) \\tag{4} \\end{equation}\\] để làm nhãn “đáng tin nhất” cho mẫu \\({\\boldsymbol{{x}}}.\\) Ta đề xuất bù trừ chỉ tiêu vào công thức trên để cân đối với độ tự tin của mô hình, đồng thời nới lỏng ràng buộc \\(i\\in L_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})\\) để tránh trường hợp không chọn được nhãn đáng tin, \\[\\begin{equation} \\hat{l}_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})≔ \\mathop{\\rm arg max}\\limits_{i\\in M}\\{p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}}) - {\\boldsymbol{{t}}}_i\\}. \\tag{5} \\end{equation}\\] Xếp hạng khả nghi Gọi \\(\\dot{{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}\\) là tập (bất khả tri) các mẫu có nhãn quan sát là \\(i\\) và nhãn thật là \\(j\\), ta ước lượng nó bằng cách dùng các nhãn đáng tin nhất \\(\\hat{l}_{{{\\boldsymbol{{\\phi}}}},{\\boldsymbol{{t}}}}({\\boldsymbol{{x}}})\\) tại (5): \\[\\begin{equation} {{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j} ≔ \\left\\{{\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i}: \\hat{l}_{{{\\boldsymbol{{\\phi}}}}({\\boldsymbol{{x}}}),{\\boldsymbol{{t}}}} \\equiv j \\right\\} \\tag{6} \\end{equation}\\] Đơn thuần (mà lại hiệu quả) nhất, ta nghi ngờ các mẫu \\(\\left\\{{\\boldsymbol{{x}}}\\in{{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}: i\\neq j\\right\\}\\) nằm ngoài đường chéo của ma trận \\({{\\boldsymbol{{X}}}}_{\\tilde{y},\\dot{y}}\\) là có nhãn lỗi. Xếp hạng mức độ khả nghi của các mẫu đó dựa theo xác suất do mô hình \\({{\\boldsymbol{{\\phi}}}}\\) dự đoán: \\[\\begin{equation} {e}({{\\boldsymbol{{x}}}}) ≔\\max_{j\\neq i}{p_{\\tilde{y}={j}}({{\\boldsymbol{{x}}}})} -p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}})\\quad \\forall {\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i} \\tag{7} \\end{equation}\\] theo cách làm trong CleanLab của Curtis et al.’s (2021), và đảo dấu so với Wei et al.’s (2018). Chúng tôi đề xuất bù trừ chỉ tiêu tự tin vào để tính độ khả nghi: \\[\\begin{equation} e_{\\boldsymbol{{t}}}({\\boldsymbol{{x}}}) ≔ \\max_{j\\neq i}{\\{p_{\\tilde{y}={j}}({{\\boldsymbol{{x}}}})-{\\boldsymbol{{t}}}_j\\}} -\\{p_{\\tilde{y}={i}}({{\\boldsymbol{{x}}}}) - {\\boldsymbol{{t}}}_i\\} \\quad \\forall {\\boldsymbol{{x}}}\\in{\\boldsymbol{{X}}}_{\\tilde{y}=i}; \\tag{8} \\end{equation}\\] bảo đảm \\(e_{\\boldsymbol{{t}}}({\\boldsymbol{{x}}})\\in[0,1].\\) Ước lượng ma trận nhiễu Ma trận đếm cặp nhãn \\({{\\boldsymbol{{C}}}}_{\\tilde{y},\\dot{y}}\\) kích thước \\(m\\times m\\) lưu số phần tử của các tập \\({{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}\\), \\[\\begin{equation} {{\\boldsymbol{{C}}}}_{\\tilde{y}=i,\\dot{y}=j} ≔|{{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j} | \\tag{9} \\end{equation}\\] ví dụ \\({{\\boldsymbol{{C}}}}_{\\tilde{y}=3,\\dot{y}=1} = 10\\) có nghĩa là, đếm được 10 mẫu được gán nhãn \\(3\\) nhưng “thật ra” nên có nhãn \\(1.\\) Vì (6) ước lượng \\({{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}\\approx\\dot{{\\boldsymbol{{X}}}}_{\\tilde{y}=i,\\dot{y}=j}\\) cho nên \\(\\sum\\limits_{j\\in M}{{\\boldsymbol{{C}}}}_{\\tilde{y}=i,\\dot{y}=j} \\approx {\\boldsymbol{{C}}}_{\\tilde{y}=i}.\\) Hiệu chỉnh ma trận đếm cặp nhãn qua hai bước. Bước đầu, hiệu chỉnh từng dòng theo số mẫu của từng lớp đã quan sát \\(i\\in M,\\) \\[\\begin{equation} \\check{Q}_{\\tilde{y}=i,\\dot{y}=j} = \\frac{{{\\boldsymbol{{C}}}}_{\\tilde{y}=i,\\dot{y}=j}}{\\sum\\limits_{j\\in M}{{\\boldsymbol{{C}}}}_{\\tilde{y}=i,\\dot{y}=j}} {{\\boldsymbol{{C}}}_{\\tilde{y}=i}}. \\tag{10} \\end{equation}\\] Cuối cùng, ta chia đều toàn bộ để tổng ma trận trở thành \\(1.\\) \\[\\begin{equation} {\\boldsymbol{{Q}}}_{\\tilde{y}=i,\\dot{y}=j}=\\frac{\\check{Q}_{\\tilde{y}=i,\\dot{y}=j}}{\\sum\\limits_{i,j\\in M}\\check{Q}_{\\tilde{y}=i,\\dot{y}=j}}. \\tag{11} \\end{equation}\\] Curtis et al.’s (2021) trình bày một số phương pháp dùng ma trận nhiễu (11) để chọn lọc và xếp hạng nhãn khả nghi có lỗi. "],["cuối-cùng.html", "Cuối cùng Triển vọng Tham khảo", " Cuối cùng Triển vọng Một số hướng nghiên cứu tương lai Tối ưu hóa giá trị chỉ tiêu tự tin Xử lý với bài toán hồi quy Tương tác qua lại giữa việc học mô hình và việc khử lỗi Tham khảo Curtis G. Northcutt and Lu Jiang and Isaac L. Chuang (2021). Confident Learning: Estimating Uncertainty in Dataset Labels. Journal of Artificial Intelligence Research (JAIR) An Introduction to Confident Learning: Finding and Learning with Label Errors in Datasets (curtisnorthcutt.com) cleanlab/cleanlab: The standard data-centric AI package for data quality and machine learning with messy, real-world data and labels. (github.com) Are Label Errors Imperative? Is Confident Learning Useful? | by Suneeta Mall | May, 2022 | Towards Data Science (medium.com) Wei, C., Lee, J. D., Liu, Q., and Ma, T. (2018). On the margin theory of feedforward neural networks. Computing Research Repository (CoRR) "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] diff --git "a/docs/\304\221\303\241nh-gi\303\241-\304\221\341\273\231-kh\341\272\243-nghi.html" "b/docs/\304\221\303\241nh-gi\303\241-\304\221\341\273\231-kh\341\272\243-nghi.html" index 8b2aaf3..6783451 100644 --- "a/docs/\304\221\303\241nh-gi\303\241-\304\221\341\273\231-kh\341\272\243-nghi.html" +++ "b/docs/\304\221\303\241nh-gi\303\241-\304\221\341\273\231-kh\341\272\243-nghi.html" @@ -142,7 +142,9 @@

Chỉ tiêu tự tin\({\boldsymbol{{X}}}_{\tilde{y}=i}\) -nên có thể \(\sum\limits_{i\in M}{{\boldsymbol{{t}}}_i} \neq 1.\)

+nên có thể \(\sum\limits_{i\in M}{{\boldsymbol{{t}}}_i} \neq 1.\) +Ta đề xuất lấy trung bình trên toàn bộ tập \({\boldsymbol{{X}}}\) +nếu \({\boldsymbol{{X}}}_{\tilde{y}=i}\equiv\emptyset.\)

Với mỗi lớp \(i\in M\) ta chọn chỉ tiêu tự tin \({\boldsymbol{{t}}}_i\in(0,1)\) bằng độ tự tin trung bình (2). Đối với từng mẫu \({\boldsymbol{{x}}}\) và từng nhãn \(i\), giá trị xác suất dự đoán @@ -155,27 +157,34 @@

Chỉ tiêu tự tin(1) và chỉ tiêu tự tin (2), -ta kỳ vọng \(L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\neq\emptyset.\) -Từ đó chọn một nhãn có xác suất dự đoán lớn nhất: -\[\begin{equation} +với kỳ vọng \(L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\neq\emptyset,\) +CleanLab (Curtis et al.’s 2021) +chọn một nhãn có xác suất dự đoán lớn nhất: +\[\begin{equation} \hat{l}_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})≔ -\begin{cases} -\mathop{\rm arg max} \limits_{i\in L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})} p_{\tilde{y}={i}}({{\boldsymbol{{x}}}}), & \text{không xét chỉ tiêu}\\ -\mathop{\rm arg max} \limits_{i\in L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})} \{p_{\tilde{y}={i}}({{\boldsymbol{{x}}}}) - {\boldsymbol{{t}}}_i\}, & \text{có bù trừ chỉ tiêu} -\end{cases} +\mathop{\rm arg max}\limits_{i\in L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})}p_{\tilde{y}={i}}({{\boldsymbol{{x}}}}) \tag{4} \end{equation}\]

để làm nhãn “đáng tin nhất” cho mẫu \({\boldsymbol{{x}}}.\)

+

Ta đề xuất +bù trừ chỉ tiêu vào công thức trên để cân đối với độ tự tin của mô hình, +đồng thời +nới lỏng ràng buộc \(i\in L_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\) để tránh trường hợp không chọn được nhãn đáng tin, +\[\begin{equation} +\hat{l}_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})≔ +\mathop{\rm arg max}\limits_{i\in M}\{p_{\tilde{y}={i}}({{\boldsymbol{{x}}}}) - {\boldsymbol{{t}}}_i\}. +\tag{5} +\end{equation}\]

Xếp hạng khả nghi

-

Gọi \(\dot{{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j}\) là tập (bất khả tri) các mẫu có nhãn quan sát là \(i\) và nhãn thật là \(j\), ta ước lượng nó bằng cách dùng các nhãn đáng tin nhất \(\hat{l}_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\) tại (4):

+

Gọi \(\dot{{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j}\) là tập (bất khả tri) các mẫu có nhãn quan sát là \(i\) và nhãn thật là \(j\), ta ước lượng nó bằng cách dùng các nhãn đáng tin nhất \(\hat{l}_{{{\boldsymbol{{\phi}}}},{\boldsymbol{{t}}}}({\boldsymbol{{x}}})\) tại (5):

\[\begin{equation} {{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j} ≔ \left\{{\boldsymbol{{x}}}\in{\boldsymbol{{X}}}_{\tilde{y}=i}: \hat{l}_{{{\boldsymbol{{\phi}}}}({\boldsymbol{{x}}}),{\boldsymbol{{t}}}} \equiv j \right\} -\tag{5} +\tag{6} \end{equation}\]

Đơn thuần (mà lại hiệu quả) nhất, ta nghi ngờ các mẫu \(\left\{{\boldsymbol{{x}}}\in{{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j}: i\neq j\right\}\) @@ -187,17 +196,19 @@

Xếp hạng khả nghi\[\begin{equation} {e}({{\boldsymbol{{x}}}}) ≔\max_{j\neq i}{p_{\tilde{y}={j}}({{\boldsymbol{{x}}}})} -p_{\tilde{y}={i}}({{\boldsymbol{{x}}}})\quad \forall {\boldsymbol{{x}}}\in{\boldsymbol{{X}}}_{\tilde{y}=i} -\tag{6} +\tag{7} \end{equation}\] -theo cách làm trong CleanLab của Curtis et al.’s (2021), và đảo dấu so với Wei et al.’s (2018). -Ta cũng có thể bù trừ chỉ tiêu tự tin vào để tính độ khả nghi: +theo cách làm trong CleanLab của Curtis et al.’s (2021), và đảo dấu so với Wei et al.’s (2018).

+

Chúng tôi đề xuất bù trừ chỉ tiêu tự tin vào để tính độ khả nghi: \[\begin{equation} e_{\boldsymbol{{t}}}({\boldsymbol{{x}}}) ≔ \max_{j\neq i}{\{p_{\tilde{y}={j}}({{\boldsymbol{{x}}}})-{\boldsymbol{{t}}}_j\}} -\{p_{\tilde{y}={i}}({{\boldsymbol{{x}}}}) - {\boldsymbol{{t}}}_i\} -\quad \forall {\boldsymbol{{x}}}\in{\boldsymbol{{X}}}_{\tilde{y}=i}. -\tag{7} -\end{equation}\]

+\quad \forall {\boldsymbol{{x}}}\in{\boldsymbol{{X}}}_{\tilde{y}=i}; +\tag{8} +\end{equation}\] +bảo đảm +\(e_{\boldsymbol{{t}}}({\boldsymbol{{x}}})\in[0,1].\)

Ước lượng ma trận nhiễu

@@ -205,11 +216,11 @@

Ước lượng ma trận nhiễu\({{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j}\),

\[\begin{equation} {{\boldsymbol{{C}}}}_{\tilde{y}=i,\dot{y}=j} ≔|{{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j} | -\tag{8} +\tag{9} \end{equation}\]

ví dụ \({{\boldsymbol{{C}}}}_{\tilde{y}=3,\dot{y}=1} = 10\) có nghĩa là, đếm được 10 mẫu được gán nhãn \(3\) nhưng “thật ra” nên có nhãn \(1.\)

-

(5) ước lượng +

(6) ước lượng \({{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j}\approx\dot{{\boldsymbol{{X}}}}_{\tilde{y}=i,\dot{y}=j}\) cho nên \(\sum\limits_{j\in M}{{\boldsymbol{{C}}}}_{\tilde{y}=i,\dot{y}=j} \approx {\boldsymbol{{C}}}_{\tilde{y}=i}.\)

Hiệu chỉnh ma trận đếm cặp nhãn qua hai bước. @@ -217,15 +228,15 @@

Ước lượng ma trận nhiễu\[\begin{equation} \check{Q}_{\tilde{y}=i,\dot{y}=j} = \frac{{{\boldsymbol{{C}}}}_{\tilde{y}=i,\dot{y}=j}}{\sum\limits_{j\in M}{{\boldsymbol{{C}}}}_{\tilde{y}=i,\dot{y}=j}} {{\boldsymbol{{C}}}_{\tilde{y}=i}}. -\tag{9} +\tag{10} \end{equation}\]

Cuối cùng, ta chia đều toàn bộ để tổng ma trận trở thành \(1.\)

\[\begin{equation} {\boldsymbol{{Q}}}_{\tilde{y}=i,\dot{y}=j}=\frac{\check{Q}_{\tilde{y}=i,\dot{y}=j}}{\sum\limits_{i,j\in M}\check{Q}_{\tilde{y}=i,\dot{y}=j}}. -\tag{10} +\tag{11} \end{equation}\]

Curtis et al.’s (2021) trình bày một số -phương pháp dùng ma trận nhiễu (10) +phương pháp dùng ma trận nhiễu (11) để chọn lọc và xếp hạng nhãn khả nghi có lỗi.

diff --git a/index.Rmd b/index.Rmd index af2120c..a7a55ac 100644 --- a/index.Rmd +++ b/index.Rmd @@ -132,6 +132,8 @@ $\vect{C}_{\yo=i} \defined |\X_{\yo=i}|.$ Vì phép tính trung bình được thực hiện trên từng tập $\X_{\yo=i}$ nên có thể $\sum\limits_{i\in M}{\thres_i} \neq 1.$ +Ta đề xuất lấy trung bình trên toàn bộ tập $\X$ +nếu $\X_{\yo=i}\equiv\emptyset.$ Với mỗi lớp $i\in M$ ta chọn chỉ tiêu tự tin $\thres_i\in(0,1)$ bằng độ tự tin trung bình \@ref(eq:avgconfidence). @@ -150,19 +152,26 @@ Tập hợp nhãn khả dĩ đối với mẫu $\x$ là Với giả định xác suất \@ref(eq:probasum1) và chỉ tiêu tự tin \@ref(eq:avgconfidence), -ta kỳ vọng $\Lmtx\neq\emptyset.$ -Từ đó chọn một nhãn có xác suất dự đoán lớn nhất: +với kỳ vọng $\Lmtx\neq\emptyset,$ +CleanLab (Curtis et al.’s 2021) +chọn một nhãn có xác suất dự đoán lớn nhất: \begin{equation} \lmtx \defined -\begin{cases} -\mathop{\rm arg max} \limits_{i\in \Lmtx} \pyx{\x}, & \text{không xét chỉ tiêu}\\ -\mathop{\rm arg max} \limits_{i\in \Lmtx} \{\pyx{\x} - \thres_i\}, & \text{có bù trừ chỉ tiêu} -\end{cases} -(\#eq:lmtx) +\mathop{\rm arg max}\limits_{i\in \Lmtx}\pyx{\x} +(\#eq:lmtxcleanlab) \end{equation} để làm nhãn "đáng tin nhất" cho mẫu $\x.$ +Ta đề xuất +bù trừ chỉ tiêu vào công thức trên để cân đối với độ tự tin của mô hình, +đồng thời +nới lỏng ràng buộc $i\in \Lmtx$ để tránh trường hợp không chọn được nhãn đáng tin, +\begin{equation} +\lmtx \defined +\mathop{\rm arg max}\limits_{i\in M}\{\pyx{\x} - \thres_i\}. +(\#eq:lmtx) +\end{equation} ## Xếp hạng khả nghi @@ -189,14 +198,17 @@ dựa theo xác suất do mô hình $\model$ dự đoán: (\#eq:errnoise) \end{equation} theo cách làm trong CleanLab của Curtis et al.’s (2021), và đảo dấu so với Wei et al.’s (2018). -Ta cũng có thể bù trừ chỉ tiêu tự tin vào để tính độ khả nghi: + +Chúng tôi đề xuất bù trừ chỉ tiêu tự tin vào để tính độ khả nghi: \begin{equation} e_\thres(\x) \defined \max_{j\neq i}{\{\pyix{j}{\x}-\thres_j\}} -\{\pyx{\x} - \thres_i\} -\quad \forall \x\in\X_{\yo=i}. +\quad \forall \x\in\X_{\yo=i}; (\#eq:eq4) \end{equation} +bảo đảm +$e_\thres(\x)\in[0,1].$ ## Ước lượng ma trận nhiễu diff --git a/lapros.jl b/lapros.jl index 28f3333..0a547d5 100644 --- a/lapros.jl +++ b/lapros.jl @@ -9,6 +9,7 @@ begin using Chain using DataFrames using DataStructures + using Formatting: format import Random using SparseArrays: spzeros using StatsBase: sample @@ -18,29 +19,25 @@ begin end; # ╔═╡ 34e904a0-5909-4cdd-a025-068dbb1a6cd1 -n = 10^7 # number of samples +n = 10*10^6 # number of samples + +# ╔═╡ dc3a9ad9-6a90-437b-9893-d59788b8bafb +m = 3 # number of classes # ╔═╡ 9cb3568a-9b59-438e-9ca0-c10c93247d92 md""" ## Dữ liệu mẫu -Lấy ví dụ cụ thể -đối với $n mẫu dữ liệu -ta có các phân lớp, -nhãn quan sát và xác suất dự đoán -như sau. +Lấy ví dụ cụ thể +đối với $(format(n, commas = true)) mẫu dữ liệu +trong $(m) phân lớp, +đã được gán nhãn quan sát và có xác suất dự đoán từ một mô hình nào đó. Đặt mục tiêu viết thuật toán tìm nhãn lỗi chạy trong vòng 1 giây. """ -# ╔═╡ dc3a9ad9-6a90-437b-9893-d59788b8bafb -m = 3 # number of classes - -# ╔═╡ d1dd37af-7def-4a27-add4-223bf76757e2 -M = collect(1:m) - # ╔═╡ 8c9ff1af-26ef-42b4-8e1b-39d978b08674 -ỹ = sample(M, n) +ỹ = sample(1:m, n) # ╔═╡ 99e5c1b4-89a0-4e70-972e-37dd22d57d37 p̂ = @chain rand(Float64, (n, m)) begin @@ -61,20 +58,9 @@ Xếp hạng độ khả nghi của các nhãn là như sau. # ╔═╡ 1dbe808e-85e0-4052-b6ac-90fa86300ba7 md""" -Nếu không chỉ đỉnh `classes` thì dùng mặc định là các giá trị unique của `observed`. +Nếu không chỉ đỉnh `classes` thì dùng mặc định là các giá trị unique của `observed`. """ -# ╔═╡ a6a56ac9-6849-49f9-bbce-4222cf663c80 -function lapros( - p::Array{Float64,2}, - y::Array{Int64,1}, -) - M::Array{Int64,1} = unique(y) - M = sort(M) - # @show M - lapros(p, y, M) -end - # ╔═╡ faa8ebef-ff1a-486d-926f-3ab1a782eaf1 md""" @@ -84,7 +70,7 @@ Tập hợp mẫu quan sát được cho từng lớp là """ # ╔═╡ 95d29260-af27-48ca-a3a7-120575b318a4 -Xỹ = [(1:n)[ỹ .== i] for i ∈ M] +Xỹ = [(1:n)[ỹ .== i] for i ∈ 1:m] # ╔═╡ 0327985e-859f-4c0e-a232-856aa31b0c44 md""" @@ -92,7 +78,7 @@ Ta đếm được số lượng mẫu quan sát được cho từng lớp là """ # ╔═╡ 846072fc-2269-4fbe-89d4-270b71cf5339 -C = [sum(ỹ .== i) for i ∈ M] +C = [sum(ỹ .== i) for i ∈ 1:m] # ╔═╡ 68fef702-a604-4f03-87da-09984af59898 md""" @@ -102,11 +88,43 @@ md""" Độ tự tin trung bình của từng lớp là """ +# ╔═╡ 8fadfa66-a730-4f99-aa70-e25fec26cb09 +" Compute the average model confidence for samples in each class. +If there is no sample in some specific class, +we take the avarage over all samples. +" +function avg_confidence( + ps::Array{Float64,2}, + ys::Array{Int64,1}, +) + m = size(ps, 2) + t = zeros(Float64, m) + for i ∈ 1:m + x_yi = ys .== i + if any(x_yi) + t[i] = mean(ps[x_yi, i]) + else + t[i] = mean(ps[:, i]) + end + end + t + # @show t +end + +# ╔═╡ 1dba3ac3-eb7c-442c-a474-cd7b415a4594 +@time t = avg_confidence(p̂, ỹ) + +# ╔═╡ 154ea90b-578c-4348-be28-69a3877e48d0 +sum(t) + # ╔═╡ 6c190eec-b8bc-4915-9d20-cac0280b4131 md""" -Mức độ vượt chỉ tiêu của từng xác suất dự đoán là +Mức độ vượt chỉ tiêu của từng xác suất dự đoán là """ +# ╔═╡ 71c14b17-6fda-4b0a-b30f-c3c181d35b12 +t2p = p̂ .- t' + # ╔═╡ 73ef22d7-0961-46fa-93a8-c149c62f0ba8 md""" ## Chọn nhãn khả tín """ @@ -131,27 +149,36 @@ Danh sách nhãn đáng tin nhất đối với từng mẫu là như sau, trong - mask_negative: For some specific sample, if the normalized probabilities are all negative then we use 0 to mark that there is no likely class label for the sample." function find_likely_label(t2p::Array{Float64,2}, mask_negative::Bool=false) - am = argmax(t2p, dims=2)[:] + # @show t2p + am = argmax(t2p, dims=2) + # @show am + # @time am = am[:] + # @show am likely_labels = last.(Tuple.(am)) - if mask_negative + ll = if mask_negative ifelse.(any(t2p .≥ 0, dims=2)[:], likely_labels, 0) else likely_labels end + vec(ll) + # @show ll end +# ╔═╡ 5921b759-9474-414f-a25a-416aec299afb +@time l̂ = find_likely_label(t2p) + # ╔═╡ 451f8698-2c6c-4cf1-8e1a-ede8cc1c535b md""" Xếp các mẫu vào ma trận có hàng thể hiện nhãn đã quan sát $\tilde{y}$, còn cột thể hiện nhãn đáng tin nhất $\hat{l}.$ """ # ╔═╡ 45b1feb2-45d3-46df-973a-8b95a70ea164 -# Xỹẏ = partition_X(l̂, ỹ, M) +# Xỹẏ = partition_X(l̂, ỹ, 1:m) # ╔═╡ 2a49d3be-d6ae-43fd-8fe8-a14800c023c9 function partition_X( - ls::Array{Int64,1}, - ys::Array{Int64,1}, + ls::Array{Int64,1}, + ys::Array{Int64,1}, M::Array{Int64,1}) # @show ys # @show ls @@ -171,85 +198,81 @@ md""" Độ khả nghi của các mẫu dữ liệu là như sau. """ -# ╔═╡ b33c68aa-0a24-4622-8e4d-d9abbce885a5 +# ╔═╡ 14d5fa77-7393-41ef-95e2-6848976c3346 +t2p + +# ╔═╡ f44f3c50-2c8f-4ea6-b712-07fa9f951ffb function rank_suspicious( - ps::Array{Float64,2}, + ps::Array{Float64,2}, ls::Array{Int64,1}, - ys::Array{Int64,1}, + ys::Array{Int64,1} ) - # @show ps # @show ls # @show ys - n = length(ys) - e = spzeros(Float64, n) - # @show e + n,m = size(ps) + e = spzeros(Float64, n) ids = (ls.≠ys) .&& (ls.≠0) for k in (1:n)[ids] - e[k] = ps[k, ls[k]] - ps[k, ys[k]] + e[k] = ps[k, ls[k]] - ps[k, ys[k]] + # @show k, ls[k], ys[k], e[k] end # @show e e end -# ╔═╡ 8fadfa66-a730-4f99-aa70-e25fec26cb09 -function avg_confidence( - ps::Array{Float64,2}, - ys::Array{Int64,1}, - M::Array{Int64,1}, -) - t = [mean(ps[ys .== i, i]) for i ∈ M]' -end - # ╔═╡ df59e679-7e5d-4c3e-b49d-6cd899ca55d9 "Rank the suspiciouness of observed labels. -Parameters: +Parameters: - `p`: predicted probabilities given by some model - `y`: observed labels of the samples -- `M`: unique classes of possible labels - -If not specified, `M` will be computed by taking unique values of `y` and sort them. " function lapros( - p::Array{Float64,2}, - y::Array{Int64,1}, - M::Array{Int64,1}, + p::Array{Float64,2}, + y::Array{Int64,1} ) - t = avg_confidence(p, y, M) - ll = find_likely_label(p .- t) - rank = rank_suspicious(p, ll, y) + t = avg_confidence(p, y) + @time ll = find_likely_label(p .- t') + @time rank = rank_suspicious(p, ll, y) end # ╔═╡ 2c9a31f4-6abd-40ef-a3b3-f6eb39eda059 -errs = lapros(p̂, ỹ, M) - -# ╔═╡ 026a4124-a6df-4ae3-a23b-fd676fd3b2cb -errs_ = lapros(p̂, ỹ) - -# ╔═╡ b8555fa5-d21c-44da-832c-1366f304cde4 -@assert all(errs .≡ errs_) - -# ╔═╡ 1dba3ac3-eb7c-442c-a474-cd7b415a4594 -t = avg_confidence(p̂, ỹ, M) - -# ╔═╡ 154ea90b-578c-4348-be28-69a3877e48d0 -sum(t) - -# ╔═╡ 71c14b17-6fda-4b0a-b30f-c3c181d35b12 -t2p = p̂ .- t - -# ╔═╡ 5921b759-9474-414f-a25a-416aec299afb -l̂ = find_likely_label(t2p) +@time errs = lapros(p̂, ỹ) # ╔═╡ a7dfaa5e-7376-49c7-b025-f16e4c5b8f56 -rank_suspicious(t2p, l̂, ỹ) +@time rank = rank_suspicious(t2p, l̂, ỹ) -# ╔═╡ 2dbdc102-5f61-4888-9bae-96d8bbf333a5 -# Ma trận True/False thể hiện việc xác suất dự đoán có đạt chỉ tiêu hay không: -t2p_positive = t2p .≥ 0; +# ╔═╡ 7edc3678-03fe-4eb8-ab39-f7033a06e93d +# begin +# @time rank_v1 = rank_suspicious_v1(t2p, l̂, ỹ) +# @assert all(rank .≡ rank_v1) +# end -# ╔═╡ 82974108-2917-41f8-a8b2-0fe323331b48 -@assert t2p_positive == (p̂ .≥ t) +# ╔═╡ b33c68aa-0a24-4622-8e4d-d9abbce885a5 +function rank_suspicious_v1( + ps::Array{Float64,2}, + ls::Array{Int64,1}, + ys::Array{Int64,1} +) + # @show ls + # @show ys + n,m = size(ps) + e = spzeros(Float64, n) + ids = (ls.≠ys) .&& (ls.≠0) + # @show ids + # @show (1:n)[ids] + for j in 1:m + # @show j + idls = (1:n)[ids .&& (ls.≡j)] + # @show idls + e[idls] += ps[idls, j] + idys = (1:n)[ids .&& (ys.≡j)] + # @show idys + e[idys] -= ps[idys, j] + # @show e + end + e +end # ╔═╡ 29cd589c-b3e9-4a65-9641-352129a27c1e # using PlutoUI; TableOfContents() @@ -260,6 +283,7 @@ PLUTO_PROJECT_TOML_CONTENTS = """ Chain = "8be319e6-bccf-4806-a6f7-6fae938471bc" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +Formatting = "59287772-0a20-5a39-b81b-1366585eb4c0" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" @@ -269,6 +293,7 @@ StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" Chain = "~0.5.0" DataFrames = "~1.3.4" DataStructures = "~0.18.13" +Formatting = "~0.4.2" StatsBase = "~0.33.19" """ @@ -590,7 +615,6 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" # ╟─9cb3568a-9b59-438e-9ca0-c10c93247d92 # ╠═34e904a0-5909-4cdd-a025-068dbb1a6cd1 # ╟─dc3a9ad9-6a90-437b-9893-d59788b8bafb -# ╟─d1dd37af-7def-4a27-add4-223bf76757e2 # ╟─8c9ff1af-26ef-42b4-8e1b-39d978b08674 # ╟─99e5c1b4-89a0-4e70-972e-37dd22d57d37 # ╠═bbb3b95f-e45f-46b6-b6e6-b41b2b283ab2 @@ -598,15 +622,13 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" # ╠═2c9a31f4-6abd-40ef-a3b3-f6eb39eda059 # ╠═df59e679-7e5d-4c3e-b49d-6cd899ca55d9 # ╟─1dbe808e-85e0-4052-b6ac-90fa86300ba7 -# ╠═b8555fa5-d21c-44da-832c-1366f304cde4 -# ╠═026a4124-a6df-4ae3-a23b-fd676fd3b2cb -# ╠═a6a56ac9-6849-49f9-bbce-4222cf663c80 # ╟─faa8ebef-ff1a-486d-926f-3ab1a782eaf1 # ╠═95d29260-af27-48ca-a3a7-120575b318a4 # ╟─0327985e-859f-4c0e-a232-856aa31b0c44 # ╟─846072fc-2269-4fbe-89d4-270b71cf5339 # ╟─68fef702-a604-4f03-87da-09984af59898 # ╠═1dba3ac3-eb7c-442c-a474-cd7b415a4594 +# ╠═8fadfa66-a730-4f99-aa70-e25fec26cb09 # ╠═154ea90b-578c-4348-be28-69a3877e48d0 # ╟─6c190eec-b8bc-4915-9d20-cac0280b4131 # ╠═71c14b17-6fda-4b0a-b30f-c3c181d35b12 @@ -621,10 +643,10 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" # ╠═2a49d3be-d6ae-43fd-8fe8-a14800c023c9 # ╟─9c063c91-0497-40c2-8eb1-bdf8060aaf70 # ╠═a7dfaa5e-7376-49c7-b025-f16e4c5b8f56 +# ╠═14d5fa77-7393-41ef-95e2-6848976c3346 +# ╠═f44f3c50-2c8f-4ea6-b712-07fa9f951ffb +# ╠═7edc3678-03fe-4eb8-ab39-f7033a06e93d # ╠═b33c68aa-0a24-4622-8e4d-d9abbce885a5 -# ╠═8fadfa66-a730-4f99-aa70-e25fec26cb09 -# ╠═2dbdc102-5f61-4888-9bae-96d8bbf333a5 -# ╠═82974108-2917-41f8-a8b2-0fe323331b48 # ╠═0911e262-5124-4aa9-b1ba-feacec87b49e # ╟─29cd589c-b3e9-4a65-9641-352129a27c1e # ╟─00000000-0000-0000-0000-000000000001