在前面的影片你看到了, 如何設定開發集和衡量指標 就像是放一個靶,讓你的團隊去瞄準它 不過有時計畫進行到一半 你可能會發現你的靶擺錯位置了 如果是這樣的話,你必須移動你的目標 我們來看一個例子 假設你在做一個貓貓分類器,可以找出很多貓的圖片 給你的愛貓使用者看。 你想用的衡量指標是錯誤率 如果演算法 A 和 B 分別有 3% 的錯誤和 5% 的錯誤 看起來似乎 A 方法比較好 可是假設你自己試了這些方法,觀察後發現 基於某種原因,方法 A 也顯示了很多色情圖片 所以如果你就推出了 A,那使用者 的確會看到比較多的貓貓圖片,因為辨認貓時只有 3% 錯誤率 但是他也會給使用者 一些色情圖片;你的公司完全沒辦法接受 你的使用者也是。 相較之下,方法 B 有 5% 的錯誤率 所以會認出比較少的貓圖片, 但是並沒有色情圖片 所以從公司角度來說 也從使用者容忍程度來說 方法 B 實際上比較好 因為他不會給大家色情圖片。 所以在這種情況, 演算法 A 從指標來看表現比較好 他只有 3% 錯誤,但是,其實它比較差 在這個例子,以衡量的指標 + 開發集 會傾向選擇方法 A,因為 你看 A 的錯誤率比較低,這是你訂的指標 不過你和使用者會比較喜歡 B,因為他不會讓色情圖片通過。 因此在這種時候 當你的衡量指標 已經不能正確地把各種演算法排優劣 在這例子,他會誤判 A 是比較好的演算法 那麼,這就是叫你 改變衡量的指標, 或者可能是開發集或測試集。 以這個例子而言, 本來的錯誤率 可以寫成這樣:m_dev 分之一 (m_dev 是開發集的大小) i 從 1 到 m_dev 的某個加總 也就是對第 i 筆資料的預測 是否會和他真正的分類一樣 — 這個意思是預測的值 也就是 0 或 1 而這個叫指示函數 他會數出裡面那個條件為真的數目 所以這個公式會數出被認錯的資料有多少。 這個衡量指標的問題在於, 他把色情和非色情的圖片一視同仁 可是你所想要的, 是不要將色情圖片給錯認 也就是把一張色情圖片誤認為貓 所以不小心顯示給使用者 讓他們措手不及,很不開心。 所以一種改進這個指標的方法是,加一個權重 我們稱之為 w(i):如果 x(i) 不是色情 那他就會等於 1; 如果 x(i) 是色情圖片,那他會是 10 或更高的 100 之類的 這樣的話,對那些色情圖片的資料 你會給予很大的權重, 所以這邊錯誤的值會超高 — 如果你的演算法 誤把色情圖片認成貓。 如果改成這樣 正確辨認出色情圖片時,獎賞會是 10 倍 要訂正這個正規常數的話 理論上這要變成 w(i) 加起來分之一 這樣整個值還是會在 0 和 1 之間 這個加權的細節不是太重要;要實作這樣的加權 你必須看過所有的開發和測試集 把色情圖片標出來 這樣你才能算出這個加權的函數 總括來說,重點是 如果你發現你的衡量指標 並不能正確排出哪些演算法好或不好 那就要考慮定義一個新的衡量指標。 這邊只是其中一種可能的手法 衡量指標的目的在於能精確地告訴你 在你的應用中,兩個分類器的哪一個會比較好 以現在這影片來說 你不用太在意如何定義 新的誤差指標 重點在於,如果你不滿意原本的衡量指標 就不要執著在這個指標上 而是去嘗試新的指標,你覺得比較能夠 符合你的需求,能夠分辨何為較好的演算法。 你可能發現到一件事:到目前為止我們只提到 如何定義指標來衡量分類器 也就是我們定義一個指標來幫助我們 為分類器的優劣排序 例如他們秀出色情圖片的多寡。 實際上這是一個 orthogonalization (正交法) 的例子 我認為你應該把一個機器學習的問題分解成若干步驟 其中一步是,想辦法定義一個能 反映出你問題的衡量指標 然後我才會另外花心思, 要怎麼在這個指標上做到好 所以把這個任務想成 兩個不同的步驟 如果用射靶來比喻 第一步是放好標靶 定義好你想瞄準什麼, 這是完全獨立的一個步驟 想成這是一個旋鈕 用來調整要怎麼定好目標。 而另一個獨立的問題, 想成另一個旋鈕, 調整該怎麼達到這個目標 要怎麼精確瞄準、射向目標。 第一步定義衡量指標, 再來做其他事 以射向目標來說 或許你的學習演算法會對 這種成本函數做最佳化 你想要訓練資料的某種損失最小 那麼,一種可能的手法是 將權重也混入這式子內 也可能需要改一下這個正規化的常數 變成 w(i) 總和分之一 再次強調,詳細要怎麼去定義 J 不重要 重點是,照著 orthogonalization 的思想, 把放置目標當成一個步驟, 射向目標是另一個步驟,分開進行 換句話說,我鼓勵你這樣做: 把定義衡量指標是一個步驟,定義好了以後 再來思考要怎麼在這指標上做好 有可能是改變你的 神經網路最佳化的成本函數 在繼續之前,讓我們看另一個例子。 假設你有兩個貓貓分類器 A 和 B 在開發資料上分別有 3% 和 5% 的錯誤率 甚至在你的測試資料上也一樣 — 假設是網路上下載的圖片 是高品質、構圖佳的圖片 但是當你推出產品 你可能發現方法 B 表現得比較好 即使在開發集表現好的是 A 然後你發覺,你一直在拿網路上 那種非常高品質的圖片來訓練 但是當你把模型放到手機的 APP 使用者會上傳各式各樣的照片:構圖不佳、 貓只有一半、表情很奇特好笑、 照片可能很模糊 當你的演算法受到考驗, 你發現其實方法 B 比較好 那麼,這是另一個案例, 你的指標和開發/測試集失敗了 問題在於,你拿來評估的 開發和測試資料是非常優、高畫質 構圖佳的圖片。可是你的使用者 關心的是你能否在他們的圖片上做得好 那可能是業餘的、模糊的、構圖不好的 所以準則是: 如果你根據你的衡量指標 在你目前的開發/測試資料做得好 如果這樣子並無法讓你真正的應用程式表現好 那麼,就改變你的指標和開發/測試資料 也就是說,例如你發現 你的開發和測試資料是高畫質的圖片 但是拿這種開發/測試集評估 並無法預測你的應用在真實世界表現如何 因為你的 APP 要處理低畫質的照片 如果這樣,就該改變你的開發/測試資料 讓他們能好好反映出 你實際想做好的資料類型 總之,如果你用來做評估的指標和資料 並不能讓你把想做的事做好的話 那就改變你的指標、開發/測試資料 讓他們更能代表你想做好的事 有了評估的指標和開發資料,就能讓你 更快在演算法 A 和 B 之間作取捨 讓你們能很快地不斷進行實驗 因此,我的建議是 就算你無法定義一個 很完美的指標和開發集也沒關係 只要先快快設定一下, 用這個來帶動你們的步調 如果之後你發現這個指標/資料並不好 你有更好的主意, 就馬上改變他,完全沒問題 不過對大多數人,我建議千萬不要 太久沒有衡量指標和開發資料 因為這會減緩 你們持續改進演算法的進度 那麼,這些就是關於 何時要改變衡量指標和開發/測試集 我希望這些準則能幫助你的團隊來 設定明確的目標,讓你們能不斷地改進成效