歡迎來到這個從實用 觀點來看深度學習的課程 也許您已經學到如何 建置一個神經網路 在這個禮拜您將學到 用實用的觀點如何去 讓您的神經網路可行 從像是超參數 調整到如何設定您的資料 如何確認您的最佳化 演算法跑得最快 使得您的學習演算法 的學習時間合理 在第一個星期我們先談到 如何設定機器學習問題 然後我們會談到正規化 然後我們會談到一些技巧來 確認您的神經網路 建置是正確的 這樣,讓我們開始吧 選擇好您如何 設定訓練, 開發 及測試集可能會造成很大 的不同在幫助您很快的 找到一個高 效能的神經網路 當訓練一個神經網路您 必須做很多決定 像是您的神經網路要幾層? 您每一層要幾個隱藏單元? 學習率是多少? 您在不同層要用哪些啟動函數? 當您開始一個新的應用時 幾乎不可能正確的 猜出所有這些正確值 還有其他超參數 的選擇在您第一次嘗試時 實際上應用機器學習 是高度的循環程序 您通常開始於一個想法 像是您想建立一個神經 網路有特定的層數 特定的隱藏單元 也許特定的資料集等等 然後您就開始寫程式 試著去跑它 跑完以後 您得到結果告訴您 這個特定的網路作用得如何 或者說這個特定的設定作用如何 基於成果 您也許改進您的想法 改變您的選擇 也許繼續循環為了試著 找到更好的神經網路 在今天, 深度學習已經在 很多領域獲得很大的成功 從自然語言處理 到電腦視覺 到語音辨識到很多 應用在結構式資料 而結構性資料包含了 從廣告到網路搜尋 不只是網路搜尋引擎 同時, 舉個例子, 購物網站 任何網站想要 送出好的搜尋結果 當您在搜尋欄中鍵入術語時 到電腦安全, 到物流 像是找出 送司機到取貨點及送貨點到其他更多的應用 我見到的是有時候 有很多 NLP 經驗的研究人員 也許試著 做電腦視覺 或者也許有很多語音辨識經驗 的研究人員也許 進入 試圖做廣告有關的東西 或者從保全也許 進入做起物流相關 我見到的是 一個領域的直覺或者 從一個應用領域通常並不能 轉換到另一個應用領域上 最佳的選擇則是依靠在 您有的資料量多寡 您有多少輸入特徵 您的電腦設定 是否訓練在 GPU 或 CPU 上 如果有,真正的 GPU 跟 CPU 的配置等等很多事 對於很多的應用, 我 想那是不可能 即使有經驗的深度學習達人 也不可能正確 猜出最佳的 超參數選擇在第一次時 所以在今天 應用深度學習是很循環 的程序您需要 循環這個圈圈很多次 期望找出 對於您的應用的一個好的選擇 如何快速獲得進展 的其中一件事是 您如何用最有效的方式 來循環這個圈圈 而設定您的資料集 成為訓練, 開發及 測試集可以讓您更有效率 如果這是您的訓練集 我們畫一個框框 傳統上您也許 拿所有的資料 切成一部分是您的訓練集 一部分是您的交叉驗證集 有時候也稱為開發集 簡化起見我叫它為 dev 集 但所有這些名詞大約同義 然後您也許切剩下的部分成為您的測試集 所以程序是您一直 訓練演算法在訓練集上 然後使用您的開發集或者說 交叉驗證集看看 哪一種模型 在您的開發集作用得最好 然後做完足夠長的時間 當您有最後的模型 您想要評估 您可以拿這個您找到的最佳模型 在測試集評估 為了得到您演算法 作用如何的無偏估計 在先前的機器學習時代 通常做法是 拿所有您的資料 拆開成也許是 70/30% 這方面,人們通常談到 70/30 訓練測試分拆 當您不用開發集的話, 或者 60/20/20% 分拆, 就是 60% 訓練 20% 開發, 20% 測試 幾年前這是 廣泛使用的 機器學習最佳典範 如果您也許有 100 個例子 也許 1000 個例子 也許 10,000 個例子 這樣的比率 是完美的經驗法則 但在現代大數據時代 舉個例子 您也許有數百萬個例子 趨勢是您的開發跟 測試集已經變得 小一點的比率了 因為記得, 開發集的目標是 您用不同的演算法來測試看看哪一種演算法作用最好 所以開發集只需要夠大來 讓您評估 兩個不同的演算法或者 十個不同演算法選擇 很快決定哪一個最好 而您不需要整個 20% 的資料來做這件事 舉個例子, 如果您有百萬個 訓練例子, 您也許決定 只需要用 10,000 個例子 在開發集已經夠了 來評估哪一個 或兩個演算法作用最好 同樣地,您測試集的目的是給您最終的 分類器, 給您相當自信 的評估它作用的如何? 再次, 如果您有百萬個例子 您也許決定用 10,000 個例子已經夠了為了要 評估一個單一分類器而 給您一個好的評估 對於它作用得如何? 所以在這個例子 當您有百萬個例子 如果您只需要用 10,000 給開發集, 10,000 給測試集 您的比率會是 10,000 是 1% 的一百萬 您有98% 訓練,1% 開發, 1% 測試 我也看過一些應用 如果您有甚至比百萬個 例子還多, 您或許 用 99.5% 訓練, 0.25% 開發, 0.25% 測試 或者 0.4% 開發, 0.1% 測試 總結一下,當設定 您的機器學習問題時 我通常設定成訓練, 開發,跟測試集 如果您有相對小的資料集 傳統的比率也許可用 但如果您有很大的資料集 設定您的開發跟 測試集小一點像是 比20%小甚至10% 也都可行 我們會給予特定的 準則在開發集 及測試集 在晚一點這個學程中 另一個趨勢我們在現代深度學習時代是越來越多 人們訓練在不同的訓練及測試分佈 假釋您設置一個應用 讓使用者上傳很多的照片 您的目標是找出 貓的照片來給您的使用者 也許您所有個使用者都是愛貓者 也許您的訓練集是 從網路下載的貓的照片 您的開發及測試集也許包括了 從我們 app 的使用者來的貓照片 也許您的訓練集很多 來自網路爬下來的 但是開發跟 測試集是從使用者上傳來的 結果是很多網頁有很 高解析度專業 很棒的貓的照片 但或許您的使用者 上傳模糊 低解析度影像從手機 照相或是比較休閒的狀況下 所以這兩種分佈 的資料是不同的 按照經驗準則是鼓勵您 在這情況下 確定您的開發及 測試集來自相同的分佈 我們將會談到這個 準則,但 因為您會使用開發集來 評估很多不同的模型 努力試著增進 在開發集的表現 如果您的開發集跟測試集 來自同樣的分佈會很好 但因為深度學習演算法 對訓練資料極度飢渴 一種趨勢我看到的是您或許 使用種種創意的策略 像是爬網路 為了獲得比原先 更大的訓練集 即使部分的成本會是 您的訓練集 資料也許不是來自於 您開發及測試集同樣的分佈 但您會發現只要您遵循這個準則 您機器學習演算法的進度會更快 我會給更多的解釋對於 這種特別的準則 在往後的學程中 最後, 也許沒有測試集是可行的 記得測試集的目的是給您一種無偏估計 在您最終網路的表現 您所選擇的網路 但如果您不需要無偏估計 那也許不需要 測試集是可行的 如果您只有開發集 而沒有測試集您會做的是 您在訓練集上訓練然後 您試著不同的模型架構 在開發集評估它們 然後運用它們用循環的方式 來試著得到好的模型 因為您用您的開發集來配模型 這不再能給您模型 表現的無偏估計 但如果您不需要這個 也許完全可行 在機器學習世界裡 當您只有訓練跟 開發集沒有另外的測試集 大部分的人會稱 這個為訓練集而 稱開發集為測試集 但其實他們是用測試集來作為 交叉驗證集用 也許不是好的 專業術語使用方式 因為他們會 對測試集過適 所以當一個團隊告訴您他們 只有訓練及測試集 我會謹慎地想 他們真的有訓練開發集? 因為他們會 對測試集過適 文化上也許要改變 一些團隊的術語很難 要他們稱之為訓練開發集 而不是訓練測試集 即使我想稱之為訓練跟 開發集是 比較正確的術語 而這實際上是可行的 如果您完全不需要 您演算法表現 的無偏估計 所以設定好訓練, 開發, 測試集 會讓您更快循環 也會讓您更有效地測量 變異及偏差對於您的 演算法, 所以您可以有效地 選擇改進您演算法的方式 我們在下一段影片 來開始談這個