本文是吳恩達老師的深度學習課程[1]筆記部分。 做者:黃海廣[2] 主要編寫人員:黃海廣、林興木(第四全部底稿,第五課第一二週,第三週前三節)、祝彥森:(第三課全部底稿)、賀志堯(第五課第三週底稿)、王翔、胡瀚文、 餘笑、 鄭浩、李懷鬆、 朱越鵬、陳偉賀、 曹越、 路皓翔、邱牧宸、 唐天澤、 張浩、 陳志豪、 遊忍、 澤霖、沈偉臣、 賈紅順、 時超、 陳哲、趙一帆、 胡瀟楊、段希、於衝、張鑫倩 參與編輯人員:黃海廣、陳康凱、石晴路、鍾博彥、向偉、嚴鳳龍、劉成 、賀志堯、段希、陳瑤、林家泳、王翔、 謝士晨、蔣鵬 備註:筆記和做業(含數據、原始做業文件)、視頻都在 github[3]中下載。 我將陸續將課程筆記發佈在公衆號「機器學習初學者」,敬請關注。
你們好,歡迎收聽本課,如何構建你的機器學習項目也就是說機器學習的策略。我但願經過這門課程大家可以學到如何更快速高效地優化你的機器學習系統。那麼,什麼是機器學習策略呢?git
咱們從一個啓發性的例子開始講,假設你正在調試你的貓分類器,通過一段時間的調整,你的系統達到了90%準確率,但對你的應用程序來講還不夠好。github
你可能有不少想法去改善你的系統,好比,你可能想咱們去收集更多的訓練數據吧。或者你會說,可能你的訓練集的多樣性還不夠,你應該收集更多不一樣姿式的貓咪圖片,或者更多樣化的反例集。或者你想再用梯度降低訓練算法,訓練久一點。或者你想嘗試用一個徹底不一樣的優化算法,好比Adam優化算法。或者嘗試使用規模更大或者更小的神經網絡。或者你想試試dropout或者L2
正則化。或者你想修改網絡的架構,好比修改激活函數,改變隱藏單元的數目之類的方法。算法
當你嘗試優化一個深度學習系統時,你一般能夠有不少想法能夠去試,問題在於,若是你作出了錯誤的選擇,你徹底有可能白費6個月的時間,往錯誤的方向前進,在6個月以後才意識到這方法根本無論用。好比,我見過一些團隊花了6個月時間收集更多數據,卻在6個月以後發現,這些數據幾乎沒有改善他們系統的性能。因此,假設你的項目沒有6個月的時間能夠浪費,若是有快速有效的方法可以判斷哪些想法是靠譜的,或者甚至提出新的想法,判斷哪些是值得一試的想法,哪些是能夠放心捨棄的。數據庫
我但願在這門課程中,能夠教給大家一些策略,一些分析機器學習問題的方法,能夠指引大家朝着最有但願的方向前進。這門課中,我會和大家分享我在搭建和部署大量深度學習產品時學到的經驗和教訓,我想這些內容是這門課程獨有的。好比說,不少大學深度學習課程不多提到這些策略。事實上,機器學習策略在深度學習的時代也在變化,由於如今對於深度學習算法來講可以作到的事情,比上一代機器學習算法大不同。我但願這些策略能幫助大家提升效率,讓大家的深度學習系統更快投入實用。編程
搭建創建機器學習系統的挑戰之一是,你能夠嘗試和改變的東西太多太多了。包括,好比說,有那麼多的超參數能夠調。我留意到,那些效率很高的機器學習專家有個特色,他們思惟清晰,對於要調整什麼來達到某個效果,很是清楚,這個步驟咱們稱之爲正交化,讓我告訴你是什麼意思吧。網絡
這是一張老式電視圖片,有不少旋鈕能夠用來調整圖像的各類性質,因此對於這些舊式電視,可能有一個旋鈕用來調圖像垂直方向的高度,另外有一個旋鈕用來調圖像寬度,也許還有一個旋鈕用來調梯形角度,還有一個旋鈕用來調整圖像左右偏移,還有一個旋鈕用來調圖像旋轉角度之類的。電視設計師花了大量時間設計電路,那時一般都是模擬電路來確保每一個旋鈕都有相對明確的功能。如一個旋鈕來調整這個(高度),一個旋鈕調整這個(寬度),一個旋鈕調整這個(梯形角度),以此類推。架構
因此正交化的概念是指,你能夠想出一個維度,這個維度你想作的是控制轉向角,還有另外一個維度來控制你的速度,那麼你就須要一個旋鈕儘可能只控制轉向角,另外一個旋鈕,在這個開車的例子裏實際上是油門和剎車控制了你的速度。但若是你有一個控制旋鈕將二者混在一塊兒,好比說這樣一個控制裝置同時影響你的轉向角和速度,同時改變了兩個性質,那麼就很難令你的車子以想要的速度和角度前進。然而正交化以後,正交意味着互成90度。設計出正交化的控制裝置,最理想的狀況是和你實際想控制的性質一致,這樣你調整參數時就容易得多。能夠單獨調整轉向角,還有你的油門和剎車,令車子以你想要的方式運動。併發
那麼這與機器學習有什麼關係呢?要弄好一個監督學習系統,你一般須要調你的系統的旋鈕。機器學習
確保四件事情,首先,你一般必須確保至少系統在訓練集上獲得的結果不錯,因此訓練集上的表現必須經過某種評估,達到能接受的程度,對於某些應用,這可能意味着達到人類水平的表現,但這取決於你的應用,咱們將在下週更多地談談如何與人類水平的表現進行比較。可是,在訓練集上表現不錯以後,你就但願系統也能在開發集上有好的表現,而後你但願系統在測試集上也有好的表現。在最後,你但願系統在測試集上系統的成本函數在實際使用中表現使人滿意,好比說,你但願這些貓圖片應用的用戶滿意。ide
咱們回到電視調節的例子,若是你的電視圖像太寬或太窄,你想要一個旋鈕去調整,你可不想要仔細調節五個不一樣的旋鈕,它們也會影響別的圖像性質,你只須要一個旋鈕去改變電視圖像的寬度。
因此相似地,若是你的算法在成本函數上不能很好地擬合訓練集,你想要一個旋鈕,是的我畫這東西表示旋鈕,或者一組特定的旋鈕,這樣你能夠用來確保你的能夠調整你的算法,讓它很好地擬合訓練集,因此你用來調試的旋鈕是你可能能夠訓練更大的網絡,或者能夠切換到更好的優化算法,好比Adam優化算法,等等。咱們將在本週和下週討論一些其餘選項。
相比之下,若是發現算法對開發集的擬合不好,那麼應該有獨立的一組旋鈕,是的,這就是我畫得毛毛躁躁的另外一個旋鈕,你但願有一組獨立的旋鈕去調試。好比說,你的算法在開發集上作的很差,它在訓練集上作得很好,但開發集不行,而後你有一組正則化的旋鈕能夠調節,嘗試讓系統知足第二個條件。類比到電視,就是如今你調好了電視的寬度,若是圖像的高度不太對,你就須要一個不一樣的旋鈕來調節電視圖像的高度,而後你但願這個旋鈕儘可能不會影響到電視的寬度。增大訓練集能夠是另外一個可用的旋鈕,它能夠幫助你的學習算法更好地概括開發集的規律,如今調好了電視圖像的高度和寬度。
若是它不符合第三個標準呢?若是系統在開發集上作的很好,但測試集上作得很差呢?若是是這樣,那麼你須要調的旋鈕,多是更大的開發集。由於若是它在開發集上作的不錯,但測試集不行這可能意味着你對開發集過擬合了,你須要往回退一步,使用更大的開發集。
最後,若是它在測試集上作得很好,但沒法給你的貓圖片應用用戶提供良好的體驗,這意味着你須要回去,改變開發集或成本函數。由於若是根據某個成本函數,系統在測試集上作的很好,但它沒法反映你的算法在現實世界中的表現,這意味着要麼你的開發集分佈設置不正確,要麼你的成本函數測量的指標不對。
咱們很快會逐一講到這些例子,咱們之後會詳細介紹這些特定的旋鈕,在本週和下週晚些時候會介紹的。因此若是如今你沒法理解所有細節,別擔憂,但我但願大家對這種正交化過程有個概念。你要很是清楚,究竟是四個問題中的哪個,知道你能夠調節哪些不一樣的東西嘗試解決那個問題。
當我訓練神經網絡時,我通常不用early stopping,這個技巧也還不錯,不少人都這麼幹。但我的而言,我以爲用early stopping有點難以分析,由於這個旋鈕會同時影響你對訓練集的擬合,由於若是你早期中止,那麼對訓練集的擬合就不太好,但它同時也用來改善開發集的表現,因此這個旋鈕沒那麼正交化。由於它同時影響兩件事情,就像一個旋鈕同時影響電視圖像的寬度和高度。不是說這樣就不要用,若是你想用也是能夠的。但若是你有更多的正交化控制,好比我這裏寫出的其餘手段,用這些手段調網絡會簡單很多。
因此我但願大家對正交化的意義有點概念,就像你看電視圖像同樣。若是你說,個人電視圖像太寬,因此我要調整這個旋鈕(寬度旋鈕)。或者它過高了,因此我要調整那個旋鈕(高度旋鈕)。或者它太梯形了,因此我要調整這個旋鈕(梯形角度旋鈕),這就很好。
在機器學習中,若是你能夠觀察你的系統,而後說這一部分是錯的,它在訓練集上作的很差、在開發集上作的很差、它在測試集上作的很差,或者它在測試集上作的不錯,但在現實世界中很差,這就很好。必須弄清楚究竟是什麼地方出問題了,而後咱們恰好有對應的旋鈕,或者一組對應的旋鈕,恰好能夠解決那個問題,那個限制了機器學習系統性能的問題。
這就是咱們這周和下週要講到的,如何診斷出系統性能瓶頸到底在哪。還有找到你能夠用的一組特定的旋鈕來調整你的系統,來改善它特定方面的性能,咱們開始詳細講講這個過程吧。
不管你是調整超參數,或者是嘗試不一樣的學習算法,或者在搭建機器學習系統時嘗試不一樣手段,你會發現,若是你有一個單實數評估指標,你的進展會快得多,它能夠快速告訴你,新嘗試的手段比以前的手段好仍是差。因此當團隊開始進行機器學習項目時,我常常推薦他們爲問題設置一個單實數評估指標。
咱們來看一個例子,你以前聽過我說過,應用機器學習是一個很是經驗性的過程,咱們一般有一個想法,編程序,跑實驗,看看效果如何,而後使用這些實驗結果來改善你的想法,而後繼續走這個循環,不斷改進你的算法。
好比說對於你的貓分類器,以前你搭建了某個分類器A
,經過改變超參數,還有改變訓練集等手段,你如今訓練出來了一個新的分類器B,因此評估你的分類器的一個合理方式是觀察它的查準率(precision)和查全率(recall)。
查準率和查全率的確切細節對於這個例子來講不過重要。但簡而言之,查準率的定義是在你的分類器標記爲貓的例子中,有多少真的是貓。因此若是分類器A有95%的查準率,這意味着你的分類器說這圖有貓的時候,有95%的機會真的是貓。
查全率就是,對於全部真貓的圖片,你的分類器正確識別出了多少百分比。實際爲貓的圖片中,有多少被系統識別出來?若是分類器
A查全率是90%,這意味着對於全部的圖像,好比說你的開發集都是真的貓圖,分類器A準確地分辨出了其中的90%。
因此關於查準率和查全率的定義,不用想太多。事實證實,查準率和查全率之間每每須要折衷,兩個指標都要顧及到。你但願獲得的效果是,當你的分類器說某個東西是貓的時候,有很大的機會它真的是一隻貓,但對於全部是貓的圖片,你也但願系統可以將大部分分類爲貓,因此用查準率和查全率來評估分類器是比較合理的。
但使用查準率和查全率做爲評估指標的時候,有個問題,若是分類器A在查全率上表現更好,分類器A在查準率上表現更好,你就沒法判斷哪一個分類器更好。若是你嘗試了不少不一樣想法,不少不一樣的超參數,你但願可以快速試驗不只僅是兩個分類器,也許是十幾個分類器,快速選出「最好的」那個,這樣你能夠從那裏出發再迭代。若是有兩個評估指標,就很難去快速地二中選一或者十中選一,因此我並不推薦使用兩個評估指標,查準率和查全率來選擇一個分類器。你只須要找到一個新的評估指標,可以結合查準率和查全率。
這裏是另外一個例子,假設你正在構建一個系統來檢測喚醒語,也叫觸發詞,這指的是語音控制設備。好比亞馬遜Echo,你會說「Alexa」,或者用「Okay Google」來喚醒谷歌設備,或者對於蘋果設備,你會說「Hey Siri」,或者對於某些百度設備,咱們用「你好百度」喚醒。
對的,這些就是喚醒詞,能夠喚醒這些語音控制設備,而後監聽你想說的話。因此你可能會在意觸發字檢測系統的準確性,因此當有人說出其中一個觸發詞時,有多大機率能夠喚醒你的設備。
你可能也須要顧及假陽性(false positive)的數量,就是沒有人在說這個觸發詞時,它被隨機喚醒的機率有多大?因此這種狀況下,組合這兩種評估指標的合理方式多是最大化精確度。因此當某人說出喚醒詞時,你的設備被喚醒的機率最大化,而後必須知足24小時內最多隻能有1次假陽性,對吧?因此你的設備平均天天只會沒有人真的在說話時隨機喚醒一次。因此在這種狀況下,準確度是優化指標,而後每24小時發生一次假陽性是知足指標,你只要每24小時最多有一次假陽性就知足了。
總結一下,若是你須要顧及多個指標,好比說,有一個優化指標,你想盡量優化的,而後還有一個或多個知足指標,須要知足的,須要達到必定的門檻。如今你就有一個全自動的方法,在觀察多個成本大小時,選出"最好的"那個。如今這些評估指標必須是在訓練集或開發集或測試集上計算或求出來的。因此你還須要作一件事,就是設立訓練集、開發集,還有測試集。在下一個視頻裏,我想和你們分享一些如何設置訓練、開發和測試集的指導方針,咱們下一個視頻繼續。
設立訓練集,開發集和測試集的方式大大影響了你或者你的團隊在創建機器學習應用方面取得進展的速度。一樣的團隊,即便是大公司裏的團隊,在設立這些數據集的方式,真的會讓團隊的進展變慢而不是加快,咱們看看應該如何設立這些數據集,讓你的團隊效率最大化。
在這個視頻中,我想集中討論如何設立開發集和測試集,開發(dev)集也叫作開發集(development set),有時稱爲保留交叉驗證集(hold out cross validation set)。而後,機器學習中的工做流程是,你嘗試不少思路,用訓練集訓練不一樣的模型,而後使用開發集來評估不一樣的思路,而後選擇一個,而後不斷迭代去改善開發集的性能,直到最後你能夠獲得一個令你滿意的成本,而後你再用測試集去評估。
如今,舉個例子,你要開發一個貓分類器,而後你在這些區域裏運營,美國、英國、其餘歐洲國家,南美洲、印度、中國,其餘亞洲國家和澳大利亞,那麼你應該如何設立開發集和測試集呢?
其中一種作法是,你能夠選擇其中4個區域,我打算使用這四個(前四個),但也能夠是隨機選的區域,而後說,來自這四個區域的數據構成開發集。而後其餘四個區域,我打算用這四個(後四個),也能夠隨機選擇4個,這些數據構成測試集。
事實證實,這個想法很是糟糕,由於這個例子中,你的開發集和測試集來自不一樣的分佈。我建議大家不要這樣,而是讓你的開發集和測試集來自同一分佈。個人意思是這樣,大家要記住,我想就是設立你的開發集加上一個單實數評估指標,這就是像是定下目標,而後告訴你的團隊,那就是你要瞄準的靶心,由於你一旦創建了這樣的開發集和指標,團隊就能夠快速迭代,嘗試不一樣的想法,跑實驗,能夠很快地使用開發集和指標去評估不一樣分類器,而後嘗試選出最好的那個。因此,機器學習團隊通常都很擅長使用不一樣方法去逼近目標,而後不斷迭代,不斷逼近靶心。因此,針對開發集上的指標優化。
而後在左邊的例子中,設立開發集和測試集時存在一個問題,你的團隊可能會花上幾個月時間在開發集上迭代優化,結果發現,當大家最終在測試集上測試系統時,來自這四個國家或者說下面這四個地區的數據(即測試集數據)和開發集裏的數據可能差別很大,因此你可能會收穫"意外驚喜",並發現,花了那麼多個月的時間去針對開發集優化,在測試集上的表現卻不佳。因此,若是你的開發集和測試集來自不一樣的分佈,就像你設了一個目標,讓你的團隊花幾個月嘗試逼近靶心,結果在幾個月工做以後發現,你說「等等」,測試的時候,"我要把目標移到這裏",而後團隊可能會說"好吧,爲何你讓咱們花那麼多個月的時間去逼近那個靶心,而後忽然間你能夠把靶心移到不一樣的位置?"。
因此,爲了不這種狀況,我建議的是你將全部數據隨機洗牌,放入開發集和測試集,因此開發集和測試集都有來自八個地區的數據,而且開發集和測試集都來自同一分佈,這分佈就是你的全部數據混在一塊兒。
這裏有另外一個例子,這是個真實的故事,但有一些細節變了。因此我知道有一個機器學習團隊,花了好幾個月在開發集上優化,開發集裏面有中等收入郵政編碼的貸款審批數據。那麼具體的機器學習問題是,輸入x爲貸款申請,你是否能夠預測輸出,y,y是他們有沒有還貸能力?因此這系統能幫助銀行判斷是否批准貸款。因此開發集來自貸款申請,這些貸款申請來自中等收入郵政編碼,zip code就是美國的郵政編碼。可是在這上面訓練了幾個月以後,團隊忽然決定要在,低收入郵政編碼數據上測試一下。固然了,這個分佈數據裏面中等收入和低收入郵政編碼數據是很不同的,並且他們花了大量時間針對前面那組數據優化分類器,致使系統在後面那組數據中效果不好。因此這個特定團隊實際上浪費了3個月的時間,不得不退回去從新作不少工做。
這裏實際發生的事情是,這個團隊花了三個月瞄準一個目標,三個月以後經理忽然問"大家試試瞄準那個目標如何?",這新目標位置徹底不一樣,因此這件事對於這個團隊來講很是崩潰。
因此我建議大家在設立開發集和測試集時,要選擇這樣的開發集和測試集,可以反映你將來會獲得的數據,認爲很重要的數據,必須獲得好結果的數據,特別是,這裏的開發集和測試集可能來自同一個分佈。因此無論你將來會獲得什麼樣的數據,一旦你的算法效果不錯,要嘗試收集相似的數據,並且,無論那些數據是什麼,都要隨機分配到開發集和測試集上。由於這樣,你才能將瞄準想要的目標,讓你的團隊高效迭代來逼近同一個目標,但願最好是同一個目標。
咱們還沒提到如何設立訓練集,咱們會在以後的視頻裏談談如何設立訓練集,但這個視頻的重點在於,設立開發集以及評估指標,真的就定義了你要瞄準的目標。咱們但願經過在同一分佈中設立開發集和測試集,你就能夠瞄準你所但願的機器學習團隊瞄準的目標。而設立訓練集的方式則會影響你逼近那個目標有多快,但咱們能夠在另外一個講座裏提到。我知道有一些機器學習團隊,他們若是能遵循這個方針,就能夠省下幾個月的工做,因此我但願這些方針也能幫到大家。
接下來,實際上你的開發集和測試集的規模,如何選擇它們的大小,在深度學習時代也在變化,咱們會在下一個視頻裏提到這些內容。
在上一個視頻中大家知道了你的開發集和測試集爲何必須來自同一分佈,但它們規模應該多大?在深度學習時代,設立開發集和測試集的方針也在變化,咱們來看看一些最佳作法。
你可能據說過一條經驗法則,在機器學習中,把你取得的所有數據用70/30比例分紅訓練集和測試集。或者若是你必須設立訓練集、開發集和測試集,你會這麼分60%訓練集,20%開發集,20%測試集。在機器學習的早期,這樣分是至關合理的,特別是之前的數據集大小要小得多。因此若是你總共有100個樣本,這樣70/30或者60/20/20分的經驗法則是至關合理的。若是你有幾千個樣本或者有一萬個樣本,這些作法也仍是合理的。
但在現代機器學習中,咱們更習慣操做規模大得多的數據集,好比說你有1百萬個訓練樣本,這樣分可能更合理,98%做爲訓練集,1%開發集,1%測試集,咱們用
和
縮寫來表示開發集和測試集。由於若是你有1百萬個樣本,那麼1%就是10,000個樣本,這對於開發集和測試集來講可能已經夠了。因此在現代深度學習時代,有時咱們擁有大得多的數據集,因此使用小於20%的比例或者小於30%比例的數據做爲開發集和測試集也是合理的。並且由於深度學習算法對數據的胃口很大,咱們能夠看到那些有海量數據集的問題,有更高比例的數據劃分到訓練集裏,那麼測試集呢?
要記住,測試集的目的是完成系統開發以後,測試集能夠幫你評估投產系統的性能。方針就是,令你的測試集足夠大,可以以高置信度評估系統總體性能。因此除非你須要對最終投產系統有一個很精確的指標,通常來講測試集不須要上百萬個例子。對於你的應用程序,也許你想,有10,000個例子就能給你足夠的置信度來給出性能指標了,也許100,000個之類的可能就夠了,這數目可能遠遠小於好比說總體數據集的30%,取決於你有多少數據。
對於某些應用,你也許不須要對系統性能有置信度很高的評估,也許你只須要訓練集和開發集。我認爲,不單獨分出一個測試集也是能夠的。事實上,有時在實踐中有些人會只分紅訓練集和測試集,他們實際上在測試集上迭代,因此這裏沒有測試集,他們有的是訓練集和開發集,但沒有測試集。若是你真的在調試這個集,這個開發集或這個測試集,這最好稱爲開發集。
不過在機器學習的歷史裏,不是每一個人都把術語定義分得很清的,有時人們說的開發集,其實應該看做測試集。但若是你只要有數據去訓練,有數據去調試就夠了。你打算無論測試集,直接部署最終系統,因此不用太擔憂它的實際表現,我以爲這也是很好的,就將它們稱爲訓練集、開發集就好。而後說清楚你沒有測試集,這是否是有點不正常?我絕對不建議在搭建系統時省略測試集,由於有個單獨的測試集比較令我安心。由於你能夠使用這組不帶誤差的數據來測量系統的性能。但若是你的開發集很是大,這樣你就不會對開發集過擬合得太厲害,這種狀況,只有訓練集和測試集也不是徹底不合理的。不過我通常不建議這麼作。
總結一下,在大數據時代舊的經驗規則,這個70/30再也不適用了。如今流行的是把大量數據分到訓練集,而後少許數據分到開發集和測試集,特別是當你有一個很是大的數據集時。之前的經驗法則實際上是爲了確保開發集足夠大,可以達到它的目的,就是幫你評估不一樣的想法,而後選出
仍是
更好。測試集的目的是評估你最終的成本誤差,你只須要設立足夠大的測試集,能夠用來這麼評估就好了,可能只須要遠遠小於整體數據量的30%。
因此我但願本視頻能給大家一點指導和建議,讓大家知道如何在深度學習時代設立開發和測試集。接下來,有時候在研究機器學習的問題途中,你可能須要更改評估指標,或者改動你的開發集和測試集,咱們會講何時須要這樣作。
你已經學過如何設置開發集和評估指標,就像是把目標定在某個位置,讓你的團隊瞄準。但有時候在項目進行途中,你可能意識到,目標的位置放錯了。這種狀況下,你應該移動你的目標。
咱們來看一個例子,假設你在構建一個貓分類器,試圖找到不少貓的照片,向你的愛貓人士用戶展現,你決定使用的指標是分類錯誤率。因此算法A和B分別有3%錯誤率和5%錯誤率,因此算法A彷佛作得更好。
但咱們實際試一下這些算法,你觀察一下這些算法,算法
因爲某些緣由,把不少色情圖像分類成貓了。若是你部署算法,那麼用戶就會看到更多貓圖,由於它識別貓的錯誤率只有3%,但它同時也會給用戶推送一些色情圖像,這是你的公司徹底不能接受的,你的用戶也徹底不能接受。相比之下,算法有5%的錯誤率,這樣分類器就獲得較少的圖像,但它不會推送色情圖像。因此從大家公司的角度來看,以及從用戶接受的角度來看,算法
其實是一個更好的算法,由於它不讓任何色情圖像經過。
那麼在這個例子中,發生的事情就是,算法A在評估指標上作得更好,它的錯誤率達到3%,但其實是個更糟糕的算法。在這種狀況下,評估指標加上開發集它們都傾向於選擇算法
,由於它們會說,看算法A的錯誤率較低,這是大家本身定下來的指標評估出來的。但你和你的用戶更傾向於使用算法
,由於它不會將色情圖像分類爲貓。因此當這種狀況發生時,當你的評估指標沒法正確衡量算法之間的優劣排序時,在這種狀況下,原來的指標錯誤地預測算法A是更好的算法這就發出了信號,你應該改變評估指標了,或者要改變開發集或測試集。在這種狀況下,你用的分類錯誤率指標能夠寫成這樣:
我想你處理機器學習問題時,應該把它切分紅獨立的步驟。一步是弄清楚如何定義一個指標來衡量你想作的事情的表現,而後咱們能夠分開考慮如何改善系統在這個指標上的表現。大家要把機器學習任務當作兩個獨立的步驟,用目標這個比喻,第一步就是設定目標。因此要定義你要瞄準的目標,這是徹底獨立的一步,這是你能夠調節的一個旋鈕。如何設立目標是一個徹底獨立的問題,把它當作是一個單獨的旋鈕,能夠調試算法表現的旋鈕,如何精確瞄準,如何命中目標,定義指標是第一步。
這是另外一個指標和開發集測試集出問題的例子,問題在於,你作評估用的是很漂亮的高分辨率的開發集和測試集,圖片取景很專業。但你的用戶真正關心的是,他們上傳的圖片能不能被正確識別。那些圖片多是沒那麼專業的照片,有點模糊,取景很業餘。
因此方針是,若是你在指標上表現很好,在當前開發集或者開發集和測試集分佈中表現很好,但你的實際應用程序,你真正關注的地方表現很差,那麼就須要修改指標或者你的開發測試集。換句話說,若是你發現你的開發測試集都是這些高質量圖像,但在開發測試集上作的評估沒法預測你的應用實際的表現。由於你的應用處理的是低質量圖像,那麼就應該改變你的開發測試集,讓你的數據更能反映你實際須要處理好的數據。
但整體方針就是,若是你當前的指標和當前用來評估的數據和你真正關心必須作好的事情關係不大,那就應該更改你的指標或者你的開發測試集,讓它們能更夠好地反映你的算法須要處理好的數據。
有一個評估指標和開發集讓你能夠更快作出決策,判斷算法
仍是算法
更優,這真的能夠加速你和你的團隊迭代的速度。因此個人建議是,即便你沒法定義出一個很完美的評估指標和開發集,你直接快速設立出來,而後使用它們來驅動大家團隊的迭代速度。若是在這以後,你發現選的很差,你有更好的想法,那麼徹底能夠立刻改。對於大多數團隊,我建議最好不要在沒有評估指標和開發集時跑過久,由於那樣可能會減慢你的團隊迭代和改善算法的速度。本視頻講的是何時須要改變你的評估指標和開發測試集,我但願這些方針能讓你的整個團隊設立一個明確的目標,一個大家能夠高效迭代,改善性能的目標。
在過去的幾年裏,更多的機器學習團隊一直在討論如何比較機器學習系統和人類的表現,爲何呢?
我認爲有兩個主要緣由,首先是由於深度學習系統的進步,機器學習算法忽然變得更好了。在許多機器學習的應用領域已經開始見到算法已經能夠威脅到人類的表現了。其次,事實證實,當你試圖讓機器作人類能作的事情時,能夠精心設計機器學習系統的工做流程,讓工做流程效率更高,因此在這些場合,比較人類和機器是很天然的,或者你要讓機器模仿人類的行爲。
咱們來看幾個這樣的例子,我看到不少機器學習任務中,當你在一個問題上付出了不少時間以後,因此
軸是時間,這多是不少個月甚至是不少年。在這些時間裏,一些團隊或一些研究小組正在研究一個問題,當你開始往人類水平努力時,進展是很快的。可是過了一段時間,當這個算法表現比人類更好時,那麼進展和精確度的提高就變得更慢了。也許它還會愈來愈好,可是在超越人類水平以後,它還能夠變得更好,但性能增速,準確度上升的速度這個斜率,會變得愈來愈平緩,咱們都但願能達到理論最佳性能水平。隨着時間的推移,當您繼續訓練算法時,可能模型愈來愈大,數據愈來愈多,可是性能沒法超過某個理論上限,這就是所謂的貝葉斯最優錯誤率(Bayes optimal error)。因此貝葉斯最優錯誤率通常認爲是理論上可能達到的最優錯誤率,就是說沒有任何辦法設計出一個到
的函數,讓它可以超過必定的準確度。
例如,對於語音識別來講,若是
是音頻片斷,有些音頻就是這麼嘈雜,基本不可能知道說的是什麼,因此完美的準確率可能不是100%。或者對於貓圖識別來講,也許一些圖像很是模糊,無論是人類仍是機器,都沒法判斷該圖片中是否有貓。因此,完美的準確度可能不是100%。
事實證實,機器學習的進展每每至關快,直到你超越人類的表現以前一直很快,當你超越人類的表現時,有時進展會變慢。我認爲有兩個緣由,爲何當你超越人類的表現時,進展會慢下來。一個緣由是人類水平在不少任務中離貝葉斯最優錯誤率已經不遠了,人們很是擅長看圖像,分辨裏面有沒有貓或者聽寫音頻。因此,當你超越人類的表現以後也許沒有太多的空間繼續改善了。但第二個緣由是,只要你的表現比人類的表現更差,那麼實際上能夠使用某些工具來提升性能。一旦你超越了人類的表現,這些工具就沒那麼好用了。
個人意思是這樣,對於人類至關擅長的任務,包括看圖識別事物,聽寫音頻,或閱讀語言,人類通常很擅長處理這些天然數據。對於人類擅長的任務,只要你的機器學習算法比人類差,你就能夠從讓人幫你標記數據,你可讓人幫忙或者花錢請人幫你標記例子,這樣你就有更多的數據能夠餵給學習算法。下週咱們會討論,人工錯誤率分析,但只要人類的表現比任何其餘算法都要好,你就可讓人類看看你算法處理的例子,知道錯誤出在哪裏,並嘗試瞭解爲何人能作對,算法作錯。下週咱們會看到,這樣作有助於提升算法的性能。你也能夠更好地分析誤差和方差,咱們稍後會談一談。可是隻要你的算法仍然比人類糟糕,你就有這些重要策略能夠改善算法。而一旦你的算法作得比人類好,這三種策略就很難利用了。因此這多是另外一個和人類表現比較的好處,特別是在人類作得很好的任務上。
爲何機器學習算法每每很擅長模仿人類能作的事情,而後遇上甚至超越人類的表現。特別是,即便你知道誤差是多少,方差是多少。知道人類在特定任務上能作多好能夠幫助你更好地瞭解你應該重點嘗試減小誤差,仍是減小方差,我想在下一個視頻中給你一個例子。
咱們討論過,你但願你的學習算法能在訓練集上表現良好,但有時你實際上並不想作得太好。你得知道人類水平的表現是怎樣的,能夠確切告訴你算法在訓練集上的表現到底應該有多好,或者有多很差,讓我告訴你是什麼意思吧。
咱們常用貓分類器來作例子,好比人類具備近乎完美的準確度,因此人類水平的錯誤是1%。在這種狀況下,若是您的學習算法達到8%的訓練錯誤率和10%的開發錯誤率,那麼你也許想在訓練集上獲得更好的結果。因此事實上,你的算法在訓練集上的表現和人類水平的表現有很大差距的話,說明你的算法對訓練集的擬合併很差。因此從減小誤差和方差的工具這個角度看,在這種狀況下,我會把重點放在減小誤差上。你須要作的是,好比說訓練更大的神經網絡,或者跑久一點梯度降低,就試試能不能在訓練集上作得更好。
但如今咱們看看一樣的訓練錯誤率和開發錯誤率,假設人類的表現不是1%,咱們就把它抄寫過來。但你知道,在不一樣的應用或者說用在不一樣的數據集上,假設人類水平錯誤其實是7.5%,也許你的數據集中的圖像很是模糊,即便人類都沒法判斷這張照片中有沒有貓。這個例子可能稍微更復雜一些,由於人類其實很擅長看照片,分辨出照片裏有沒有貓。但就爲了舉這個例子,好比說你的數據集中的圖像很是模糊,分辨率很低,即便人類錯誤率也達到7.5%。在這種狀況下,即便你的訓練錯誤率和開發錯誤率和其餘例子裏同樣,你就知道,也許你的系統在訓練集上的表現還好,它只是比人類的表現差一點點。在第二個例子中,你可能但願專一減小這個份量,減小學習算法的方差,也許你能夠試試正則化,讓你的開發錯誤率更接近你的訓練錯誤率。
因此在以前的課程關於誤差和方差的討論中,咱們主要假設有一些任務的貝葉斯錯誤率幾乎爲0。因此要解釋這裏發生的事情,看看這個貓分類器,用人類水平的錯誤率估計或代替貝葉斯錯誤率或貝葉斯最優錯誤率,對於計算機視覺任務而言,這樣替代至關合理,由於人類其實是很是擅長計算機視覺任務的,因此人類能作到的水平和貝葉斯錯誤率相差不遠。根據定義,人類水平錯誤率比貝葉斯錯誤率高一點,由於貝葉斯錯誤率是理論上限,但人類水平錯誤率離貝葉斯錯誤率不會太遠。因此這裏比較意外的是取決於人類水平錯誤率有多少,或者這真的就很接近貝葉斯錯誤率,因此咱們假設它就是,但取決於咱們認爲何樣的水平是能夠實現的。
在這兩種狀況下,具備一樣的訓練錯誤率和開發錯誤率,咱們決定專一於減小誤差的策略或者減小方差的策略。那麼左邊的例子發生了什麼? 8%的訓練錯誤率真的很高,你認爲你能夠把它降到1%,那麼減小誤差的手段可能有效。而在右邊的例子中,若是你認爲貝葉斯錯誤率是7.5%,這裏咱們使用人類水平錯誤率來替代貝葉斯錯誤率,可是你認爲貝葉斯錯誤率接近7.5%,你就知道沒有太多改善的空間了,不能繼續減小你的訓練錯誤率了,你也不會但願它比7.5%好得多,由於這種目標只能經過可能須要提供更進一步的訓練。而這邊,就還(訓練偏差和開發偏差之間)有更多的改進空間,能夠將這個2%的差距縮小一點,使用減小方差的手段應該可行,好比正則化,或者收集更多的訓練數據。
因此要給這些概念命名一下,這不是普遍使用的術語,但我以爲這麼說思考起來比較流暢。就是把這個差值,貝葉斯錯誤率或者對貝葉斯錯誤率的估計和訓練錯誤率之間的差值稱爲可避免誤差,你可能但願一直提升訓練集表現,直到你接近貝葉斯錯誤率,但實際上你也不但願作到比貝葉斯錯誤率更好,這理論上是不可能超過貝葉斯錯誤率的,除非過擬合。而這個訓練錯誤率和開發錯誤率以前的差值,就大概說明你的算法在方差問題上還有多少改善空間。
可避免誤差這個詞說明了有一些別的誤差,或者錯誤率有個沒法超越的最低水平,那就是說若是貝葉斯錯誤率是7.5%。你實際上並不想獲得低於該級別的錯誤率,因此你不會說你的訓練錯誤率是8%,而後8%就衡量了例子中的誤差大小。你應該說,可避免誤差可能在0.5%左右,或者0.5%是可避免誤差的指標。而這個2%是方差的指標,因此要減小這個2%比減小這個0.5%空間要大得多。而在左邊的例子中,這7%衡量了可避免誤差大小,而2%衡量了方差大小。因此在左邊這個例子裏,專一減小可避免誤差可能潛力更大。
因此在這個例子中,當你理解人類水平錯誤率,理解你對貝葉斯錯誤率的估計,你就能夠在不一樣的場景中專一於不一樣的策略,使用避免誤差策略仍是避免方差策略。在訓練時如何考慮人類水平表現來決定工做着力點,具體怎麼作還有更多微妙的細節,因此在下一個視頻中,咱們會深刻了解人類水平表現的真正意義。
人類水平表現這個詞在論文裏常常隨意使用,但我如今告訴你這個詞更準確的定義,特別是使用人類水平表現這個詞的定義,能夠幫助大家推進機器學習項目的進展。還記得上個視頻中,咱們用過這個詞「人類水平錯誤率」用來估計貝葉斯偏差,那就是理論最低的錯誤率,任何函數無論是如今仍是未來,可以到達的最低值。咱們先記住這點,而後看看醫學圖像分類例子。
.
假設你要觀察這樣的放射科圖像,而後做出分類診斷,假設一個普通的人類,未經訓練的人類,在此任務上達到3%的錯誤率。普通的醫生,也許是普通的放射科醫生,能達到1%的錯誤率。經驗豐富的醫生作得更好,錯誤率爲0.7%。還有一隊經驗豐富的醫生,就是說若是你有一個經驗豐富的醫生團隊,讓他們都看看這個圖像,而後討論並辯論,他們達成共識的意見達到0.5%的錯誤率。因此我想問你的問題是,你應該如何界定人類水平錯誤率?人類水平錯誤率3%,1%, 0.7%仍是0.5%?
你也能夠暫停視頻思考一下,要回答這個問題,我想請你記住,思考人類水平錯誤率最有用的方式之一是,把它做爲貝葉斯錯誤率的替代或估計。若是你願意,也能夠暫停視頻,思考一下這個問題。
但這裏我就直接給出人類水平錯誤率的定義,就是若是你想要替代或估計貝葉斯錯誤率,那麼一隊經驗豐富的醫生討論和辯論以後,能夠達到0.5%的錯誤率。咱們知道貝葉斯錯誤率小於等於0.5%,由於有些系統,這些醫生團隊能夠達到0.5%的錯誤率。因此根據定義,最優錯誤率必須在0.5%如下。咱們不知道多少更好,也許有一個更大的團隊,更有經驗的醫生能作得更好,因此也許比0.5%好一點。可是咱們知道最優錯誤率不能高於0.5%,那麼在這個背景下,我就能夠用0.5%估計貝葉斯錯誤率。因此我將人類水平定義爲0.5%,至少若是你但願使用人類水平錯誤來分析誤差和方差的時候,就像上個視頻那樣。
如今,爲了發表研究論文或者部署系統,也許人類水平錯誤率的定義能夠不同,你能夠使用1%,只要你超越了一個普通醫生的表現,若是能達到這種水平,那系統已經達到實用了。也許超過一名放射科醫生,一名醫生的表現,意味着系統在一些狀況下能夠有部署價值了。
本視頻的要點是,在定義人類水平錯誤率時,要弄清楚你的目標所在,若是要代表你能夠超越單我的類,那麼就有理由在某些場合部署你的系統,也許這個定義是合適的。可是若是您的目標是替代貝葉斯錯誤率,那麼這個定義(經驗豐富的醫生團隊——0.5%)才合適。
要了解爲何這個很重要,咱們來看一個錯誤率分析的例子。比方說,在醫學圖像診斷例子中,你的訓練錯誤率是5%,你的開發錯誤率是6%。而在上一張幻燈片的例子中,咱們的人類水平表現,我將它當作是貝葉斯錯誤率的替代品,取決於你是否將它定義成普通單個醫生的表現,仍是有經驗的醫生或醫生團隊的表現,你可能會用1%或0.7%或0.5%。同時也回想一下,前面視頻中的定義,貝葉斯錯誤率或者說貝葉斯錯誤率的估計和訓練錯誤率直接的差值就衡量了所謂的可避免誤差,這(訓練偏差與開發偏差之間的差值)能夠衡量或者估計你的學習算法的方差問題有多嚴重。
因此在這個第一個例子中,不管你作出哪些選擇,可避免誤差大概是4%,這個值我想介於……,若是你取1%就是4%,若是你取0.5%就是4.5%,而這個差距(訓練偏差與開發偏差之間的差值)是1%。因此在這個例子中,我得說,無論你怎麼定義人類水平錯誤率,使用單個普通醫生的錯誤率定義,仍是單個經驗豐富醫生的錯誤率定義或經驗豐富的醫生團隊的錯誤率定義,這是4%仍是4.5%,這明顯比都比方差問題更大。因此在這種狀況下,你應該專一於減小誤差的技術,例如訓練更大的網絡。
如今來看看第二個例子,好比說你的訓練錯誤率是1%,開發錯誤率是5%,這其實也不怎麼重要,這種問題更像學術界討論的,人類水平表現是1%或0.7%仍是0.5%。由於無論你使用哪個定義,你測量可避免誤差的方法是,若是用那個值,就是0%到0.5%以前,對吧?那就是人類水平和訓練錯誤率以前的差距,而這個差距是4%,因此這個4%差距比任何一種定義的可避免誤差都大。因此他們就建議,你應該主要使用減小方差的工具,好比正則化或者去獲取更大的訓練集。
何時真正有效呢?
就是好比你的訓練錯誤率是0.7%,因此你如今已經作得很好了,你的開發錯誤率是0.8%。在這種狀況下,你用0.5%來估計貝葉斯錯誤率關係就很大。由於在這種狀況下,你測量到的可避免誤差是0.2%,這是你測量到的方差問題0.1%的兩倍,這代表也許誤差和方差都存在問題。可是,可避免誤差問題更嚴重。在這個例子中,咱們在上一張幻燈片中討論的是0.5%,就是對貝葉斯錯誤率的最佳估計,由於一羣人類醫生能夠實現這一目標。若是你用0.7代替貝葉斯錯誤率,你測得的可避免誤差基本上是0%,那你就可能忽略可避免誤差了。實際上你應該試試能不能在訓練集上作得更好。
我但願講這個能讓大家有點概念,知道爲何機器學習問題上取得進展會愈來愈難,當你接近人類水平時進展會愈來愈難。
在這個例子中,一旦你接近0.7%錯誤率,除非你很是當心估計貝葉斯錯誤率,你可能沒法知道離貝葉斯錯誤率有多遠,因此你應該儘可能減小可避免誤差。事實上,若是你只知道單個普通醫生能達到1%錯誤率,這可能很難知道是否是應該繼續去擬合訓練集,這種問題只會出如今你的算法已經作得很好的時候,只有你已經作到0.7%, 0.8%, 接近人類水平時會出現。
而在左邊的兩個例子中,當你遠離人類水平時,將優化目標放在誤差或方差上可能更容易一點。這就說明了,爲何當大家接近人類水平時,更難分辨出問題是誤差仍是方差。因此機器學習項目的進展在你已經作得很好的時候,很難更進一步。
總結一下咱們講到的,若是你想理解誤差和方差,那麼在人類能夠作得很好的任務中,你能夠估計人類水平的錯誤率,你能夠使用人類水平錯誤率來估計貝葉斯錯誤率。因此你到貝葉斯錯誤率估計值的差距,告訴你可避免誤差問題有多大,可避免誤差問題有多嚴重,而訓練錯誤率和開發錯誤率之間的差值告訴你方差上的問題有多大,你的算法是否可以從訓練集泛化推廣到開發集。
今天講的和以前課程中見到的重大區別是,之前大家比較的是訓練錯誤率和0%,直接用這個值估計誤差。相比之下,在這個視頻中,咱們有一個更微妙的分析,其中並無假設你應該獲得0%錯誤率,由於有時貝葉斯錯誤率是非零的,有時基本不可能作到比某個錯誤率閾值更低。因此在以前的課程中,咱們測量的是訓練錯誤率,而後觀察的是訓練錯誤率比0%高多少,就用這個差值來估計誤差有多大。而事實證實,對於貝葉斯錯誤率幾乎是0%的問題這樣就好了,例如識別貓,人類表現接近完美,因此貝葉斯錯誤率也接近完美。因此當貝葉斯錯誤率幾乎爲零時,能夠那麼作。但數據噪點不少時,好比背景聲音很嘈雜的語言識別,有時幾乎不可能聽清楚說的是什麼,並正確記錄下來。對於這樣的問題,更好的估計貝葉斯錯誤率頗有必要,能夠幫助你更好地估計可避免誤差和方差,這樣你就能更好的作出決策,選擇減小誤差的策略,仍是減小方差的策略。
回顧一下,對人類水平有大概的估計可讓你作出對貝葉斯錯誤率的估計,這樣可讓你更快地做出決定是否應該專一於減小算法的誤差,或者減小算法的方差。這個決策技巧一般頗有效,直到你的系統性能開始超越人類,那麼你對貝葉斯錯誤率的估計就再也不準確了,但這些技巧仍是能夠幫你作出明確的決定。
如今,深度學習的使人興奮的發展之一就是對於愈來愈多的任務,咱們的系統實際上能夠超越人類了。在下一個視頻中,讓咱們繼續談談超越人類水平的過程。
不少團隊會由於機器在特定的識別分類任務中超越了人類水平而激動不已,咱們談談這些狀況,看看大家本身能不能達到。
咱們討論過機器學習進展,會在接近或者超越人類水平的時候變得愈來愈慢。咱們舉例談談爲何會這樣。
假設你有一個問題,一組人類專家充分討論辯論以後,達到0.5%的錯誤率,單我的類專家錯誤率是1%,而後你訓練出來的算法有0.6%的訓練錯誤率,0.8%的開發錯誤率。因此在這種狀況下,可避免誤差是多少?這個比較容易回答,0.5%是你對貝葉斯錯誤率的估計,因此可避免誤差就是0.1%。你不會用這個1%的數字做爲參考,你用的是這個差值,因此也許你對可避免誤差的估計是至少0.1%,而後方差是0.2%。和減小可避免誤差比較起來,減小方差可能空間更大。
但如今咱們來看一個比較難的例子,一我的類專家團和單我的類專家的表現和之前同樣,但你的算法能夠獲得0.3%訓練錯誤率,還有0.4%開發錯誤率。如今,可避免誤差是什麼呢?如今其實很難回答,事實上你的訓練錯誤率是0.3%,這是否意味着你過擬合了0.2%,或者說貝葉斯錯誤率實際上是0.1%呢?或者也許貝葉斯錯誤率是0.2%?或者貝葉斯錯誤率是0.3%呢?你真的不知道。可是基於本例中給出的信息,你實際上沒有足夠的信息來判斷優化你的算法時應該專一減小誤差仍是減小方差,這樣你取得進展的效率就會下降。還有好比說,若是你的錯誤率已經比一羣充分討論辯論後的人類專家更低,那麼依靠人類直覺去判斷你的算法還能往什麼方向優化就很難了。因此在這個例子中,一旦你超過這個0.5%的門檻,要進一步優化你的機器學習問題就沒有明確的選項和前進的方向了。這並不意味着你不能取得進展,你仍然能夠取得重大進展。但現有的一些工具幫助你指明方向的工具就沒那麼好用了。
如今,機器學習有不少問題已經能夠大大超越人類水平了。例如,我想網絡廣告,估計某個用戶點擊廣告的可能性,可能學習算法作到的水平已經超越任何人類了。還有提出產品建議,向你推薦電影或書籍之類的任務。我想今天的網站作到的水平已經超越你最親近的朋友了。還有物流預測,從
到開車須要多久,或者預測快遞車從開到
須要多少時間。或者預測某人會不會償還貸款,這樣你就能判斷是否批准這人的貸款。我想這些問題都是今天的機器學習遠遠超過了單我的類的表現。
請注意這四個例子,全部這四個例子都是從結構化數據中學習得來的,這裏你可能有個數據庫記錄用戶點擊的歷史,你的購物歷史數據庫,或者從A到B須要多長時間的數據庫,之前的貸款申請及結果的數據庫,這些並非天然感知問題,這些不是計算機視覺問題,或語音識別,或天然語言處理任務。人類在天然感知任務中每每表現很是好,因此有可能對計算機來講在天然感知任務的表現要超越人類要更難一些。
最後,這些問題中,機器學習團隊均可以訪問大量數據,因此好比說,那四個應用中,最好的系統看到的數據量可能比任何人類能看到的都多,因此這樣就相對容易獲得超越人類水平的系統。如今計算機能夠檢索那麼多數據,它能夠比人類更敏銳地識別出數據中的統計規律。
除了這些問題,今天已經有語音識別系統超越人類水平了,還有一些計算機視覺任務,一些圖像識別任務,計算機已經超越了人類水平。可是因爲人類對這種天然感知任務很是擅長,我想計算機達到那種水平要可貴多。還有一些醫療方面的任務,好比閱讀ECG或診斷皮膚癌,或者某些特定領域的放射科讀圖任務,這些任務計算機作得很是好了,也許超越了單我的類的水平。
在深度學習的最新進展中,其中一個振奮人心的方面是,即便在天然感知任務中,在某些狀況下,計算機已經能夠超越人類的水平了。不過如今確定更加困難,由於人類通常很擅長這種天然感知任務。
因此要達到超越人類的表現每每不容易,但若是有足夠多的數據,已經有不少深度學習系統,在單一監督學習問題上已經超越了人類的水平,因此這對你在開發的應用是有意義的。我但願有一天你也可以搭建出超越人類水平的深度學習系統。
大家學過正交化,如何設立開發集和測試集,用人類水平錯誤率來估計貝葉斯錯誤率以及如何估計可避免誤差和方差。咱們如今把它們所有組合起來寫成一套指導方針,如何提升學習算法性能的指導方針。
因此我想要讓一個監督學習算法達到實用,基本上但願或者假設你能夠完成兩件事情。首先,你的算法對訓練集的擬合很好,這能夠當作是你能作到可避免誤差很低。還有第二件事你能夠作好的是,在訓練集中作得很好,而後推廣到開發集和測試集也很好,這就是說方差不是太大。
在正交化的精神下,你能夠看到這裏有第二組旋鈕,能夠修正可避免誤差問題,好比訓練更大的網絡或者訓練更久。還有一套獨立的技巧能夠用來處理方差問題,好比正則化或者收集更多訓練數據。
總結一下前幾段視頻咱們見到的步驟,若是你想提高機器學習系統的性能,我建議大家看看訓練錯誤率和貝葉斯錯誤率估計值之間的距離,讓你知道可避免誤差有多大。換句話說,就是你以爲還能作多好,你對訓練集的優化還有多少空間。而後看看你的開發錯誤率和訓練錯誤率之間的距離,就知道你的方差問題有多大。換句話說,你應該作多少努力讓你的算法表現可以從訓練集推廣到開發集,算法是沒有在開發集上訓練的。
若是你想用盡一切辦法減小可避免誤差,我建議試試這樣的策略:好比使用規模更大的模型,這樣算法在訓練集上的表現會更好,或者訓練更久。使用更好的優化算法,好比說加入momentum或者RMSprop,或者使用更好的算法,好比Adam。你還能夠試試尋找更好的新神經網絡架構,或者說更好的超參數。這些手段包羅萬有,你能夠改變激活函數,改變層數或者隱藏單位數,雖然你這麼作可能會讓模型規模變大。或者試用其餘模型,其餘架構,如循環神經網絡和卷積神經網絡。在以後的課程裏咱們會詳細介紹的,新的神經網絡架構可否更好地擬合你的訓練集,有時也很難預先判斷,但有時換架構可能會獲得好得多的結果。
另外當你發現方差是個問題時,你能夠試用不少技巧,包括如下這些:你能夠收集更多數據,由於收集更多數據去訓練能夠幫你更好地推廣到系統看不到的開發集數據。你能夠嘗試正則化,包括
正則化,dropout正則化或者咱們在以前課程中提到的數據加強。同時你也能夠試用不一樣的神經網絡架構,超參數搜索,看看能不能幫助你,找到一個更適合你的問題的神經網絡架構。
我想這些誤差、可避免誤差和方差的概念是容易上手,難以精通的。若是你能系統全面地應用本週課程裏的概念,你實際上會比不少現有的機器學習團隊更有效率、更系統、更有策略地系統提升機器學習系統的性能。
[1]
深度學習課程: https://mooc.study.163.com/university/deeplearning_ai
[2]
黃海廣: https://github.com/fengdu78
[3]