A. 機器學習
機器學習是人工智慧的一個子集。
這項技術的主要任務是指導計算機從數據中學習,然後利用經驗來改善自身的段猛襲性能,不需要進行明確的編程。在機器學習中,演算法會不斷進行訓練,從大型數據集中發現模式和知指相關性,然後根據數據分析結果做出最佳決策和預測。
特點
機器學習應用具有自我演進能力,它們獲得的數據越多,准確性會越高。機器學習技術握兄的應用無處不在,比如我們的家居生活、購物車、娛樂媒體以及醫療保健等。
機器學習演算法能夠識別模式和相關性,這意味著它們可以快速准確地分析自身的投資回報率。對於投資機器學習技術的企業來說,他們可以利用這個特性,快速評估採用機器學習技術對運營的影響。
B. 機器學習的演算法和普通《演算法導論》里的演算法有什麼本質上的異同
作者:董可人
鏈接:http://www.hu.com/question/24976006/answer/29682806
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
演算法導論里的演算法本質上是對有精確解的問題,如何更有效率地求得這個解。這個效率可以是計算時間更短,也可以是計算過程所需要的空間更少。
一個簡單的例子是,給定一個亂序數組,如何快速的將其按從小到大的順序重新排列,或者找到其中的中位數。這些問題都有確定且唯一的答案,一般都會有一個笨方法(窮舉或遍歷),只要一步一步來就可以解,所謂演算法只是如何精簡步驟,更快更省事地找到這個解。這些演算法處理的數據也都是結構簡潔且干凈的類型,比如數組,二叉樹,圖之類的數據結構。數據規模對於這些演算法而言,影響的是計算所需的時間和空間,不會因為規模改變而影響演算法本身的邏輯以及計算的結果。
機器學習要解決的問題一般沒有精確解,也不能用窮舉或遍歷這種步驟明確的方法找到解,而且需要強調的是「學習」這個屬性,即希望演算法本身能夠根據給定的數據或計算環境的改變而動態的發現新的規律,甚至改變演算法程序的邏輯和行為。
舉例來說,可以是把一千份文檔歸類到不同的幾個類別里。最簡單的可以是給定幾個類別,比如新聞,小說,詩歌等,演算法來根據文章內容自動劃分到對應的類別里。這里可以看出這個問題即使讓人做,也有很多模糊不能確定的地方,比如一篇法制晚報上的犯罪紀實是應該劃到新聞,還是小說呢?或者說一篇長詩比如荷馬史詩是應該歸在小說還是詩歌呢?機器學習演算法想要解決的,就是根據從文章內容里找到的規律,來自動的給出一個劃分。而不同演算法可以給出不同的解,這些解都可以是「正確」的,所以一般還需要人為設計一個評判標准來決定孰優孰劣。
也可以不事先給定類別,而是讓演算法自己去發現文章中的規律,把相似度高的文章劃分到一起。這樣不同的演算法可能給出不同數量的類別劃分,可能是三個,四個,或者五個,也都可以是「正確」的劃分。甚至什麼是「相似度」,不同演算法也可以給出不同解釋,可以是名詞動詞形容詞的詞頻及比例,也可以是句子的語法結構等。
更進一步的,你可能還希望這個演算法能夠用來判斷一份新的文檔的類別。而輸入的新文檔越多,也會進一步擴大初始數據集的規模,規模變大以後,原來數據中不明顯的規律可能就變明顯了。比如說原來一千份文檔中只有一篇議論文,可能大多演算法都無法把它單獨劃出一個類別,但當你持續輸入一百份議論文後,數據中議論文的比例就變成了101/1100,差不多10%,這時候演算法就應該劃分出單獨的議論文類別。在這個意義上,數據本身也對演算法有很大的影響,這也是和演算法導論中的演算法的一個本質區別。
技術上說,演算法導論中的演算法關注點在數據結構和計算復雜度,屬於離散數學的一個分支,不涉及微積分等高等數學概念。機器學習的演算法本身是基於概率,統計和優化(optimization)等理論和技術,從這個角度上說給人感覺更「數學」一點。
在具體的實現細節上,機器學習的演算法會大量應用演算法導論中的技術來改進計算效率。但需要強調這僅僅是對底層實現來說,在演算法本身的邏輯上,二者沒有太多聯系。換句話說,演算法導論中的技術可以幫助你寫出更快的程序來運行機器學習演算法,但是這對機器學習要解決的問題本身是沒有什麼幫助的。熟練使用二叉樹散列表,准確估算一個圖演算法的復雜度,都沒有任何可能幫助你猜到在女朋友過生日時送什麼禮物最好(使用了機器學習演算法的淘寶君卻很可能知道!)。因此不要把它們看成是搭積木拼構件的關系。
最後,如果以上解釋仍然讓你費解,那麼還有一個更通俗的解釋:演算法導論是教你如何數數,而機器學習基本上相當於星座算命。一個很機械,一個靠忽悠,差不多就是這樣吧。
具體分析見鏈接:http://www.hu.com/question/24976006
C. 什麼是機器學習 周志華
醫學診斷、檢測信用卡欺詐、證券市場分析。訓練集中的目標是由人標注的,③ 強化學習,以下分別介紹這三種方法的區別?
廣義來說,有三種機器學習演算法:① 監督式學習,② 非監督式學習首先關注什麼是機器學習?
機器學習有下面幾種定義:
機器學習是一門人工智慧的科學。這個演算法訓練機器進行決策。它是這樣工作的:機器被放在一個能讓它通過反復試錯來訓練自己的環境中。機器從過去的經驗中進行學習,並且嘗試利用了解最透徹的知識作出精虧褲確的判斷。
強化學習的例子有,當新的數據到來時,可以根據這個函數預測結果、語音和手寫識別:通過觀察來學習做成如何的動作。每個動作都會對環境有所影響,學習對象根據觀察到的周圍環境的反饋來做出判斷,該領域蔽鎮的主要研究對象是人工智慧。
機器學習是用數據或以往的經驗,以此優化計算機程序的性能標准,特別是如何在經驗學習中改善具體演算法的性能。
機器學習是對能通過經驗自動改進的計算機演算法的研究、DNA序列測序。這種分析方式被廣泛地用來細分客戶,根據干預的方式分為不同的用戶組。
非監督式學習的例銷並簡子有。常見的監督學習演算法包括線性回歸分析和邏輯回歸分析。
監督式學習的例子有:線性回歸:馬爾可夫決策過程。
常見的機器學習演算法有哪些。
一種經常引用的英文定義是:
A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.
通俗一點的解釋就是,機器學習演算法可以從過去已知的數據中學習數據隱藏的規律。常見的無監督學習演算法有聚類。監督學習的訓練集要求是包括輸入和輸出,也可以說是特徵和目標,利用這些學習來的規律,在給定一定輸入的情況下,對未來進行預測。
機器學習的應用領域有哪些。
監督式學習
定義?
機器學習已廣泛應用於數據挖掘、計算機視覺、自然語言處理、邏輯回歸等、生物特徵識別、搜索引擎。
機器學習演算法的分類以及這些分類之間的區別是什麼、戰略游戲和機器人等眾多領域:關聯演算法和 K – 均值演算法。
強化學習
定義:從給定的訓練數據集中學習出一個函數。
非監督式學習
定義:與監督學習相比,訓練集沒有人為標注的結果、隨機森林、K – 近鄰演算法、決策樹
D. 機器學習故事匯-決策樹演算法
機器學習故事匯-決策樹演算法
【咱們的目標】系列演算法講解旨在用最簡單易懂的故事情節幫助大家掌握晦澀無趣的機器學習,適合對數學很頭疼的同學們,小板凳走起!
決策樹模型是機器學習中最經典的演算法之一啦,用途之廣泛我就不多吹啦,其實很多機器學習演算法都是以樹模型為基礎的,比如隨機森林,Xgboost等一聽起來就是很牛逼的演算法(其實用起來也很牛逼)。
首先我們來看一下在上面的例子中我想根據人的年齡和性別(兩個特徵)對5個人(樣本數據)進行決策,看看他們喜不喜歡玩電腦游戲。首先根據年齡(根節點)進行了一次分支決策,又對左節點根據性別進行了一次分支決策,這樣所有的樣本都落到了最終的葉子節點,可以把每一個葉子節點當成我們最終的決策結果(比如Y代表喜歡玩游戲,N代表不喜歡玩游戲)。這樣我們就通過決策樹完成了非常簡單的分類任務!
再來看一下樹的組成,主要結構有根節點(數據來了之後首先進行判斷的特徵),非葉子節點(中間的一系列過程),葉子節點(最終的結果),這些都是我們要建立的模塊!
在決策中樹中,我們剛才的喜歡玩電腦游戲的任務看起來很簡單嘛,從上往下去走不就OK了嗎!但是難點在於我們該如何構造這棵決策樹(節點的選擇以及切分),這個看起來就有些難了,因為當我們手裡的數據特徵比較多的時候就該猶豫了,到底拿誰當成是根節點呢?
這個就是我們最主要的問題啦,節點究竟該怎麼選呢?不同的位置又有什麼影響?怎麼對特徵進行切分呢?一些到這,我突然想起來一個段子,咱們來樂呵樂呵!
武林外傳中這個段子夠我笑一年的,其實咱們在推導機器學習演算法的時候,也需要這么去想想,只有每一步都是有意義的我們才會選擇去使用它。回歸正題,我們選擇的根節點其實意味著它的重要程度是最大的,相當於大當家了,因為它會對數據進行第一次切分,我們需要把最重要的用在最關鍵的位置,在決策樹演算法中,為了使得演算法能夠高效的進行,那麼一開始就應當使用最有價值的特徵。
接下來咱們就得嘮嘮如何選擇大當家了,我們提出了一個概念叫做熵(不是我提出的。。。穿山甲說的),這里並不打算說的那麼復雜,一句話解釋一下,熵代表你經過一次分支之後分類的效果的好壞,如果一次分支決策後都屬於一個類別(理想情況下,也是我們的目標)這時候我們認為效果很好嘛,那熵值就很低。如果分支決策後效果很差,什麼類別都有,那麼熵值就會很高,公式已經給出,log函數推薦大家自己畫一下,然後看看概率[0,1]上的時候log函數值的大小(你會豁然開朗的)。
不確定性什麼時候最大呢?模稜兩可的的時候(就是你猶豫不決的時候)這個時候熵是最大的,因為什麼類別出現的可能性都有。那麼我們該怎麼選大當家呢?(根節點的特徵)當然是希望經過大當家決策後,熵值能夠下降(意味著類別更純凈了,不那麼混亂了)。在這里我們提出了一個詞叫做信息增益(就當是我提出的吧。。。),信息增益表示經過一次決策後整個分類後的數據的熵值下降的大小,我們希望下降越多越好,理想情況下最純凈的熵是等於零的。
一個栗子:准備一天一個哥們打球的時候,包括了4個特徵(都是環境因素)以及他最終有木有去打球的數據。
第一個問題:大當家該怎麼選?也就是我們的根節點用哪個特徵呢?
一共有4個特徵,看起來好像用誰都可以呀,這個時候就該比試比試了,看看誰的能力強(使得熵值能夠下降的最多)
在歷史數據中,首先我們可以算出來當前的熵值,計算公式同上等於0.940,大當家的競選我們逐一來分析,先看outlook這個特徵,上圖給出了基於天氣的劃分之後的熵值,計算方式依舊同上,比如outlook=sunny時,yes有2個,no有三個這個時候熵就直接將2/5和3/5帶入公式就好啦。最終算出來了3種情況下的熵值。
再繼續來看!outlook取不同情況的概率也是不一樣的,這個是可以計算出來的相當於先驗概率了,直接可以統計出來的,這個也需要考慮進來的。然後outlook競選大當家的分值就出來啦(就是信息增益)等於0.247。同樣的方法其餘3個特徵的信息增益照樣都可以計算出來,誰的信息增益多我們就認為誰是我們的大當家,這樣就完成了根節點的選擇,接下來二當家以此類推就可以了!
我們剛才給大家講解的是經典的ID3演算法,基於熵值來構造決策樹,現在已經有很多改進,比如信息增益率和CART樹。簡單來說一下信息增益率吧,我們再來考慮另外一個因素,如果把數據的樣本編號當成一個特徵,那麼這個特徵必然會使得所有數據完全分的開,因為一個樣本只對應於一個ID,這樣的熵值都是等於零的,所以為了解決這類特徵引入了信息增益率,不光要考慮信息增益還要考慮特徵自身的熵值。說白了就是用 信息增益/自身的熵值 來當做信息增益率。
我們剛才討論的例子中使用的是離散型的數據,那連續值的數據咋辦呢?通常我們都用二分法來逐一遍歷來找到最合適的切分點!
下面再來嘮一嘮決策樹中的剪枝任務,為啥要剪枝呢?樹不是好好的嗎,剪個毛線啊!這個就是機器學習中老生常談的一個問題了,過擬合的風險,說白了就是如果一個樹足夠龐大,那麼所有葉子節點可能只是一個數據點(無限制的切分下去),這樣會使得我們的模型泛化能力很差,在測試集上沒辦法表現出應有的水平,所以我們要限制決策樹的大小,不能讓枝葉太龐大了。
最常用的剪枝策略有兩種:
(1)預剪枝:邊建立決策樹邊開始剪枝的操作
(2)後剪枝:建立完之後根據一定的策略來修建
這些就是我們的決策樹演算法啦,其實還蠻好的理解的,從上到下基於一種選擇標准(熵,GINI系數)來找到最合適的當家的就可以啦!
E. 降本增效,企業該如何釋放數據價值
當今,數字化浪潮席捲全球,數字經濟正在成為全球可持續增長的引擎。據 IDC 預測,到 2023 年,數字經濟產值將佔到全球 GDP 的 62%,全球進入數字經濟時代。
在中國,數字經濟加速發展,以 2020 年為例,數字經濟是 GDP 增速的 3 倍多。為促進數字經濟更好更快發展,國家一方面提出 加快培育數據要素市場 ,激活數據要素潛能,聚焦數據價值釋放;另一方面,出台了 《數據安全法》和《個人信息保護法》 ,滿足數字經濟時代和 社會 發展的迫切需求,為數據安全保障和個人權益保護奠定基礎。
在 5G、物聯網、大數據、雲計算和 AI 等新技術的推動下,新應用、新場景紛紛涌現,企業發展也進入一個新階段。
我們看到, 數據呈現爆炸式增長,數據量越來越大 ,且以視頻、音頻、圖像等為代表的 多模態數據快速發展。 對企業來說,為更好地了解客戶需求,推動業務發展,對 實時數據分析的需求越來越強烈。 並且,企業不單單進行數據可視化,而是希望深入剖析手中數據,分析這些數據對業務的價值,讓數據賦能。
如何應對數據挑戰,滿足企業訴求? 一站式數據智能分析平台成為許多企業的破局之道。 比如海洋石油富島股份公司,它選擇利用星環 Sophon Base 建設工旅簡隱藝過程監測平台,實現公司尿素裝置生產過程的實時在線監控,為一線工藝人員提供生產和設備運行數據異常實時告警,並藉助人工智慧技術對告警數據進行智能化實時分析,第一時間為工藝人員提供有關工藝操作的優化建議。
除了海洋石油富島股份公司,越來越多的公司視星環 Sophon Base 為一站式數據智能分析平台的首選。
據悉,Sophon Base 提供 強大的多源異構數據接入能力, 針對不同來源、不同模態、不同數據體量的智能分析任務,支持統計分析和圖形化數據 探索 ,便於用戶高效、直觀了解數據集信息;在建模能力方面,支持用戶通過編程編碼或低代碼拖拉拽的交互方式,使咐御用平台內置的兩百多種分布式機器學習運算元快速搭建機器學習模型的訓練流程;支持推薦式建模,在建模的每一步過程中,提供運算元推薦,降低使用門檻,同時提升建模效率。
其次,它 提供統一的模型管理倉庫。 用戶可以集中統一管理模型文件、模型鏡像等類型的 AI 模型資產,通過 Sophon Base 模型運管平台,用戶能以低代碼的方式快速便捷的將 AI 模型部署為模型服務,實現 AI 模型的生產力轉化。
第三,Sophon Base 提供模型全流程監控預警。 模型服務在監控預警方面的能力,致力於幫助用戶更全面掌握機器學習模型服務的運行狀態,並通過自定義監控指標及時發現處理異常情況,規避因數據偏移等原因引起的風險。
同時,Sophon Base 還支持 可視化的模型應用構建。 通過簡單的拖拽操作和少量的參數配置,即可通過圖形交互方式、流程化快速構建能服務於業務系統的多模型復雜應用,釋放模型價值,大幅節省模型配置成本。在最新的版本中,Sophon Base 還推出了模型可解釋性分析模塊,讓用戶可以精細地分析特徵的重要性、特徵的可解釋性、特徵與結果之間的影響關系,從而幫助用戶精準地提升以數據為中的 AI(Data Centric-AI) 數據全生命周期能力,並針對性優化模型精度,幫助用戶快速定位、優化影響業務結果的重要因子,促進業務成功。
當然,Sophon Base 不僅自身非常強大,背後還有個更強悍的平台,即 Sophon。作為星環 科技 自主研發的一站式智能分析工具平台, Sohpon 可以實現從計算智能、感知智能到認知智能的數據全鏈路智能分析。
它具備六大特性:覆蓋數據分析建模全流程,提供數百種分布式機器學習演算法,擁有多模態數據集成、融合和知識推理能力;提供分析即服務的能力;提供邊緣計算能力和擁有隱私計算技術為核心的數據要素流通平台。
據悉,Sophon 涵蓋三大部分: 數據科學平台 Sophon Base、知識圖譜平台 Sophon KG 和邊緣拆廳計算平台 Sophon Edge。
在計算智能方面,除了上文介紹 Sophon Base,平台還提供了分布式聯邦學習平台 Sophon P²C, 其集隱私計算、加密網路通信等多種功能,為多方安全建模提供完整的解決方案。通過聯邦學習使多個參與方在不共享數據的基礎上實現 AI 協作,解決數據孤島問題,使跨企業、跨數據、跨領域的大數據 AI 生態建設成為可能。
比如,在安全合規要求下,某數字化營銷平台的痛點是出於用戶 360 畫像需要對支付機構和企業數據進行統計查詢和聯合行為及營銷數據分析。同時,為提升營銷模型效果,需擴充特徵維度,與支付機構進行聯合建模。應對舉措有二,一是數據可用不可見:該公司使用各方的本地數據交易門戶(星環產品名為 Datamall) 和 Sophon P²C 實現聯合分析,為老客運營、拉新、ROI 分析等業務,提升了數據安全防護和聯合分析能力;二是數據不動但模型動:基於 Sophon P²C 提供的隱私計算功能,提升了在客戶畫像、營銷預估、產品推薦、POI 分析、個性化聯邦等場景中,在隱私和數據安全保護要求下的業務處理能力。
在感知智能方面,隨著標准模型市場的日趨成熟,更高精度的模型訴求和多種場景的快速建模成為企業數智化轉型的第二戰場。許多企業的當務之急是找到一款能滿足「業務快速迭代」 和「新場景落地」的需求的端到端的模型生產落地應用平台。為此,星環 科技 邊緣計算平台 Sophon Edge 應運而生。
它有兩大重要特性:全流程特性和高效率特性。具體而言,全流程特性可提供數據到模型再到應用的全流程構建、發布能力;高效率特性則在數據到模型和應用流程之上的全流程引導式和低代碼式操作能力。
基於這兩大特性,Sophon Edge 可實現多業務系統的模型統一管理、動態運維與長穩迭代,助力客戶提高效率、資源共享、模型迭代。除此,它還提供厚實的技術底座,能在工業級邊緣計算、圖像、流媒體等領域一站式支撐豐富的上層應用。
在認知智能方面,知識圖譜平台 Sophon KG 正好能發揮「用武之地」。認知智能的底層技術支撐是知識圖譜和自然語言處理,從而幫助機器實現抽取、分析、理解、解釋和推理的能力。其中,知識圖譜用圖模型和圖資料庫來描述和存儲知識和建模萬物關系的語義網路,並展現實體間的復雜關系。基於知識圖譜能夠深入分析復雜的關聯信息和語義信息,並挖掘和推理潛在的聯結(靜態)、行為(動態)、事理(時 - 空 - 人 - 物 - 場)特徵和模式,進而輔助業務決策。
據了解,Sophon KG 可以覆蓋知識全生命周期,是一款集知識的建模、抽取、融合、存儲、計算、推理以及應用為一體的知識圖譜產品。平台支持低代碼圖譜構建、智能化知識抽取、多模態知識存儲與融合、多形式知識計算和推理以及多維度的圖譜分析。除了具備上述的鏈路完備性,平台還從業務場景出發,沉澱了廣泛適配多個行業和場景的知識圖譜藍圖和本體庫、圖模型、規則模型和演算法模型,可以幫助客戶快速解決相似場景下的業務問題。
例如,在多家股份制銀行的知識圖譜中台實踐中,星環 科技 基於 Sophon KG 及底層的分布式圖資料庫構建知識圖譜中台,實現了從知識獲取、圖譜構建與存儲、圖譜更新迭代、圖譜計算與分析的全流程,且可以保證系統的高可用和健壯性。基於知識圖譜中台,銀行梳理了交易、股東、任職、實控、賬戶持有等關系,構建了審計知識圖譜、交易反欺詐圖譜、關聯關系圖譜和小微事件等圖譜,用於風控、審計、信貸場景的異常模式洞察與挖掘,不僅大大提升了工作效率,也產生了巨大的業務價值。
Sophon Base、Sophon KG 和 Sophon Edge 構成的一站式智能分析工具平台 Sophon 可以很好地幫助企業釋放數據潛力,充分發揮數據價值。
為降低數據智能分析應用的使用門檻和部署安裝成本,讓更多企業、機構、開發愛好者、高校師生以及其他專業人員提供更為便捷、輕量化的數據智能分析及機器學習建模環境,星環 科技 推出 Sophon CE 社區版。它具備功能全、輕量化、易運維等特點,提供機器學習可視化建模能力,無縫銜接星環底層大數據平台,可輕松處理大規模數據的 探索 分析及機器學習建模分析應用。並且,用戶可免費獲取,零成本快速體驗可視化機器學習建模。
目前, Sophon CE 社區版已上線,歡迎更多用戶試用。 點擊閱讀原文,立即申請試用。
除了構建強大的一站式智能分析工具平台,星環 科技 也一直推動大數據和 AI 的產業發展及生態建設,比如 Sophon 曾作為 AIIA 杯人工智慧大學生應用創新大賽、新加坡大學生人工智慧創新大賽、廣西大學生人工智慧設計大賽等國內外人工智慧大賽的 AI 平台提供方,為近千隻隊伍的競技提供了穩定且高效的分布式數據科學平台。
Sophon 的出現,不僅是星環 科技 自主創新,滿足客戶需求的結果,而且代表了新一代數據智能分析平台的發展方向。那就是以客戶需求為本,不斷創新,融合雲計算、AI 等技術,提供更好的工具。正所謂,「工欲善其事,必先利其器」。 以強大工具賦能企業,釋放數據價值,才能在數據時代「如魚得水」。
F. 機器學習幾個重要概念
機器學習幾個重要概念
統計學習的演算法可以分為以下幾個類別:監督學習、非監督學習、半監督學習以及強化學習。
監督學習的輸入數據都有對應的類標簽或是一個輸出值,其任務是學習一個模型,使模型能夠對任意給定的輸入,對其相應的輸出做出一個好的預測。
非監督學習就是沒有對應的類標簽或是輸出值。學習中並沒有任何標准來告訴你,某個概念是否正確,需要學習器自身形成和評價概念。就是自動地從數據中挖掘出結構信息或是抽取出一些規則。近年來,非監督學習被認為是解決一些重要問題的突破口所在。因為科學的產生就是人類中無監督學習的最佳案例。
半監督學習就是介於監督學習和非監督學習之間。這在最近的研究領域也是被大家所熱烈探討的,因為對於現實數據來說,有標簽的數據總是少量的,往往都需要人工來進行標注。而無標簽數據是能夠大量獲得的。
增強學習強調如何基於環境而行動,以取得最大化的預期利益。其靈感來源於心理學中的行為主義理論,即有機體如何在環境給予的獎勵或懲罰的刺激下,逐步形成對刺激的預期,產生能獲得最大利益的習慣性行為。強化學習和標準的監督式學習之間的區別在於,它並不需要出現正確的輸入/輸出對,也不需要精確校正次優化的行為。(以上內容摘自維基網路)這在機器人、無人機領域中應用的還是非常廣泛的。
在線學習與離線學習
對於機器學習演算法的分類,站在不同的角度就能有不同的分類方法。在具體的應用中還有一種常用的分類方法是:在線學習與離線學習。
在線學習,是在獲取到新的數據後就能夠輸入到模型中進行學習。這需要學習演算法能夠在處於任何狀態時都能進行參數的更新。而且需要演算法對雜訊數據有很好的魯棒性。
離線學習就正好與在線學習相反,當數據有更新時,需要將其與原來的數據一起對模型的參數進行重新地訓練。這時,整個訓練的過程能夠被很好的控制,因為所有的數據都是已知的,能夠對數據進行細致的預處理過程。
生成模型與判別模型
這種分類方式是針對於監督學習來進行分類的。這個在我騰訊面試的時候還被問到過這個問題。
生成模型
生成方法由數據學習聯合概率分布P(X,Y)
,然後求出條件概率分布P(Y|X)
作為預測的模型,即生成模型:
模型表示了給定輸入X產生輸出Y的生成關系。典型的生成模型有:樸素貝葉斯方法和隱馬爾可夫模型。
生成模型能夠還原出聯合概率分布P(X,Y)
;生成模型的收斂速度快,當樣本容量增加的時候,學到的模型可以更快地收斂於真實模型;當存在隱變數時,仍可以使用生成學習方法,此時判別方法就不能用。
判別模型
判別方法由數據直接學習決策函數f(x)
或者條件概率分友卜中布P(Y|X)
作為預測的模型,即判別模型。典型的判別模型包括:k近鄰法、感知機、決策樹、logistic回歸模型、最大熵模型、支持向量機、提升方法和條件隨機場。
判別模型直接面對預測,往往學習的准確率越高。可以對數據進行各種程度上的抽好山象、定義特徵並使用特徵,因此可以簡化學習問題。
演算法的歸納偏好
機器學習演算法在學習過程中對某種類型假設的偏好稱為『歸納偏好』。這個『假設』包含了一個演算法方方面面的內容。
任何一個有效的機器學習演算法必有其歸納的偏好,否則它將被假設空間中看似在訓練集上『等效』的假設所迷惑,而無法產生確定的學習結果。例如在分類問題中,如果隨機抽選訓練集上等效的假設(可以認為所有的正反例並沒有區別),那麼它的分類結果其實是不確定的,這要根據它所選取的樣本來決定,這樣的學習顯然是沒有意義的。
歸納偏好對應了學習演算法本身所做出的關於『什麼樣的模型更好』的假設。在具弊睜體的問題中,這個假設是否成立,即演算法的歸納偏好是否與問題本身匹配,大多數時候直接決定了演算法能否取得好的性能。
『奧卡姆剃刀』就是一個常用的原則,『若有多個假設與觀察一致,則選擇最簡單的那個』。對於一些以簡潔為美的人來說是再正確不過了。在一些工程技術中有一些問題也確實是這樣,一個較為簡單的方法所取得的效果雖然不是最好,但是它的代價與其效果之比已然是最優。
對於一個線性回歸問題,如下圖所示:
根據『奧卡姆剃刀』原則,你肯定會選擇中間那條經過回歸處理之後的直線作為之後預測的標准。在一些場景下,這樣選擇自然是正確的。如果再給你更多的數據點,你發現這些點正好是在穿過所有紅色點的曲線之上,你還會選擇那條回歸的直線嗎?這就牽扯出一個非常有意思的定理,『沒有免費的午餐』。
這個定理所描述的是,對於任意兩個學習演算法A和B,它們在任意分布數據上的誤差其實是相等的。仔細想想的話確實是那麼回事。這個定理有一個重要的前提:所有問題出現的機會相同或是所有問題都是同等重要的。
這時候你肯定會有疑問,既然所有的學習演算法的期望性能都和隨機猜測差不多,那學習的過程豈不是並沒有什麼用。注意到一點,上面所說的相等是在所有數據的分布之下,但是我們所處理的問題的數據往往是某一特定分布的。
欠擬合與過擬合
當目標函數給定時,基於目標函數的模型訓練誤差和模型測試誤差就自然成為學習方法的評估標准。注意,學習方法具體採用的目標函數未必是評估時所使用的標准。關於評估標准這一問題會在之後的博客中提到。
假設學習到的模型是Y=f^(x)
,訓練誤差是模型關於訓練數據數據集的平均損失:
其中N是訓練樣本容量。
測試誤差是模型關於測試數據集的平均損失:
其中N』是測試樣本容量。
通常將學習方法對未知數據的預測能力稱為泛化能力。顯然,我們希望得到泛化誤差小的學習器。然而,事先我們並不知道新樣本是什麼樣的,實際能做的是努力使在訓練集上的誤差最小化。
如果一味追求提高對訓練數據的預測能力,所選模型的復雜度往往會比真模型要高。這種現象稱為過擬合。過擬合是指學習時選擇的模型包含參數過多,以致於出現這一模型對已知數據預測的很好,但對未知數據預測得很差的現象。與過擬合相對的是欠擬合,這是指對訓練樣本的一般性質尚未學好。
欠擬合比較容易克服,一般只需要增加訓練的次數。而過擬合是機器學習面臨的關鍵障礙,各類學習演算法都必然帶有一些針對過擬合的措施;然而必須認識到,過擬合是無法徹底避免的,我們所能做的只是緩解。這是因為,機器學習面臨的問題一般是NP難甚至是更難的,而有效的學習演算法必然是在多項式時間內完成的。若可以徹底避免過擬合,這就意味著我們構造性地證明了『NP = P』,那麼你就可以獲得圖靈獎了。只要相信『P != NP』,過擬合就無法避免。
關於過擬合與欠擬合圖形化的解釋,下面那張圖中有具體說明。
方差與偏差
偏差方差-分解試圖對學習演算法的期望泛化誤差進行分解。推導的過程這里就不寫了,直接給出公式。
這個式子表示的是泛化誤差可以分解為偏差、方差與雜訊之和。偏差度量了學習演算法的期望預測與真實結果的偏離程度,即刻畫了學習演算法本身的擬合能力。為什麼一個演算法會有偏差呢,下面這句話給出了答案:
Biases are introced by the generalizations made in the model including the configuration of the model and the selection of the algorithm to generate the model.
我個人的理解是,因為對於演算法的選擇乃至於調整參數方法的選擇導致了演算法是有偏差的。因為演算法的選擇中就蘊含著偏好。
方差度量了同樣大小的訓練集的變動所導致的學習性能的變化,即刻畫了數據擾動所造成的影響;雜訊則表達了在當前任務上任何學習演算法所能到達的期望泛化誤差的下界,即刻畫了問題本身的難度。
泛化能力是由學習演算法的能力、數據的充分性以及學習任務本身的難度所共同決定的。給定學習任務,為了取得好的泛化性能,則需使偏差較小,即能充分擬合數據,並且使方差較小,即使得數據擾動產生的影響小。
但偏差與方差是不能同時達到最優的,這稱為偏差方差窘境。
這個圖所表達的含義相信不用過多地解釋了吧。
G. 機器學習的常用方法有哪些
梯度下降是非常常用的優化演算法。作為機器學習的基礎知識,這是一個必須要掌握的演算法。藉助本文,讓我們來一起詳細了解一下這個演算法。
前言
本文的代碼可以到我的Github上獲取:
https://github.com/paulQuei/gradient_descent
本文的演算法示例通過Python語言實現,在實現中使用到了numpy和matplotlib。如果你不熟悉這兩個工具,請自行在網上搜索教程。
關於優化
大多數學習演算法都涉及某種形式的優化。優化指的是改變x以最小化或者最大化某個函數的任務。
我們通常以最小化指代大多數最優化問題。最大化可經由最小化來實現。
我們把要最小化或最大化的函數成為目標函數(objective function)或准則(criterion)。
我們通常使用一個上標*表示最小化或最大化函數的x值,記做這樣:
[x^* = arg; min; f(x)]
優化本身是一個非常大的話題。如果有興趣,可以通過《數值優化》和《運籌學》的書籍進行學習。
模型與假設函數
所有的模型都是錯誤的,但其中有些是有用的。– George Edward Pelham Box
模型是我們對要分析的數據的一種假設,它是為解決某個具體問題從老洞數據中學習到的,因此它是機器學習最核心的概念。
針對一個問題,通常有大量的模型可以選擇。
本文不會深入討論這方面的內容,關於各種模型請參閱機器學習的相關書籍。本文僅以最簡單的線性模型為基礎來討論梯度下降演算法。
這里我們先介紹一下在監督學習(supervised learning)中常見的三個符號:
m,描述訓練樣本的數量
x,描述輸入變數或特徵
y,描述輸出變數或者叫目標值
訓練集會包含很多的樣本,我們用 表示其中第i個樣本。
x是數據樣本的特徵,y是其目標值。例如,在預測房價的模型中,x是房子的各種信息,例如:面積,樓層,位置等等,y是房子的價格。在圖像識別的任務中,x是圖形的所有像素點數據,y是圖像中包含的目標對象。
我們是希望尋找一個函數,將x映射到y,這個函數要足夠的好,以至於能夠預測對應的y。由於歷史原因,這個函數叫做假設函數(hypothesis function)。
學習的過程如下圖所示。即:首先根據已有的數據(稱之為訓練集)訓練我們的演算法模型,然後根據模型的假設函數來進行新數據的預測。
線性模型(linear model)正如其名稱那樣:是希望通過一個直線的形式來描述模式。線性模型的假設函數如下所示:
[h_{ heta}(x) = heta_{0} + heta_{1} * x]
這個公式對於大家來說應該都是非常簡單的。如果把它繪制出來,其實就是一條直線。
下圖是一個具體的例子,即: 的圖形:
在實際的機器學習工程中碰含伍,你會擁有大量的數據。這些數據會來自於某個數據源。它們存儲在csv文件中,或者以其他的形式打包。
但是本文作為演示使用,我們通過一些簡單的代碼自動生成了需要的數據。為了便於計算,演示的數據量也很小。
import numpy as np
max_x = 10
data_size = 10
theta_0 = 5
theta_1 = 2
def get_data:
x = np.linspace(1, max_x, data_size)
noise = np.random.normal(0, 0.2, len(x))
y = theta_0 + theta_1 * x + noise
return x, y
這段代碼很簡單,我們生成了x范圍是 [1, 10] 整數的10條數據。對應的y是以線性模型的形式計算得到,其函數是:。現實中的數據常常受到各種因素的干擾,所以對於y我們故意加上了一些高斯雜訊。因此最終的y值為比原先會有輕微的偏離。
最後我們的數據如下所示:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
我們可以把這10條數據繪制出來這樣就有一個直觀的了解了,如下圖所示:
雖然演示用的數據是我們通過公式計算得到的。但在實際的工程中,模型的參數是需要我們通過數據學習到的。所以下文我們假設我們不知道這里線性模式的兩個參數是什麼,而是通過演算法的形式求得。
最後再跟已知的參數進行對比以驗證我們的演算法是否正確。
有了上面的數據,我們可以嘗試畫一條直線來描述我們的模型。
例如,像下面這樣畫一條水平的直線:
很顯然,這條水平線離數據太遠了,非常的不匹配。
那我們可以再畫一條斜線。
我們初次畫的斜線可能也不貼切,它可能像下面這樣:
最後我們通過不斷嘗試,找到了最終最合適的那條,如下所示:
梯度下降演算法的計算過程,就和這種本能式的試探是類似的,它就是不停的迭代,一步步的接近最終的結果。
代價函數
上面我們嘗試了幾次通過一條直線來擬合(fitting)已有的數據。
二維平面上的一條直線可以通過兩個參數唯一的確定,兩個參數的確定也即模型的確定。那如何描述模型與數據的擬合程度呢?答案就是代價函數。
代價函數(cost function)描述了學習到的模型與實際結果的偏差程度。以上面的三幅圖為例,最後一幅圖中的紅線相比第一條水平的綠線,其偏離程度(代價)應該是更小的。
很顯然,我們希望我們的假設函數與數據盡可能的貼近,也就是說:希望代價函數的結果盡可能的小。這就涉及到結果的優化,而梯度下降就是尋找最小值的方法之一。
對於每一個樣本,假設函數會依據計算出一個估算值,我們常常用來表示。即 。
很自然的,我們會想到,通過下面這個公式來描述我們的模型與實際值的偏差程度:
[(h_ heta(x^i) - y^i)^2 = (widehat{y}^{i} - y^i)^2 = ( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
請注意, 是實際數據的值, 是我們的模型的估算值。前者對應了上圖中的離散點的y坐標,後者對應了離散點在直線上投影點的y坐標。
每一條數據都會存在一個偏差值,而代價函數就是對所有樣本的偏差求平均值,其計算公式如下所示:
[L( heta) = frac {1}{m} sum_{i=1}^{m}(h_ heta(x^i) - y^i)^2 = frac {1}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
當損失函數的結果越小,則意味著通過我們的假設函數估算出的結果與真實值越接近。這也就是為什麼我們要最小化損失函數的原因。
藉助上面這個公式,我們可以寫一個函數來實現代價函數:
def cost_function(x, y, t0, t1):
cost_sum = 0
for i in range(len(x)):
cost_item = np.power(t0 + t1 * x[i] - y[i], 2)
cost_sum += cost_item
return cost_sum / len(x)
這個函數的代碼應該不用多做解釋,它就是根據上面的完成計算。
我們可以嘗試選取不同的 和 組合來計算代價函數的值,然後將結果繪制出來:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
theta_0 = 5
theta_1 = 2
def draw_cost(x, y):
fig = plt.figure(figsize=(10, 8))
ax = fig.gca(projection='3d')
scatter_count = 100
radius = 1
t0_range = np.linspace(theta_0 - radius, theta_0 + radius, scatter_count)
t1_range = np.linspace(theta_1 - radius, theta_1 + radius, scatter_count)
cost = np.zeros((len(t0_range), len(t1_range)))
for a in range(len(t0_range)):
for b in range(len(t1_range)):
cost[a][b] = cost_function(x, y, t0_range[a], t1_range[b])
t0, t1 = np.meshgrid(t0_range, t1_range)
ax.set_xlabel('theta_0')
ax.set_ylabel('theta_1')
ax.plot_surface(t0, t1, cost, cmap=cm.hsv)
在這段代碼中,我們對 和 各自指定了一個范圍進行100次的采樣,然後以不同的 組合對來計算代價函數的值。
如果我們將所有點的代價函數值繪制出來,其結果如下圖所示:
從這個圖形中我們可以看出,當 越接近 [5, 2]時其結果(偏差)越小。相反,離得越遠,結果越大。
直觀解釋
從上面這幅圖中我們可以看出,代價函數在不同的位置結果大小不同。
從三維的角度來看,這就和地面的高低起伏一樣。最高的地方就好像是山頂。
而我們的目標就是:從任意一點作為起點,能夠快速尋找到一條路徑並以此到達圖形最低點(代價值最小)的位置。
而梯度下降的演算法過程就和我們從山頂想要快速下山的做法是一樣的。
在生活中,我們很自然會想到沿著最陡峭的路往下行是下山速度最快的。如下面這幅圖所示:
針對這幅圖,細心的讀者可能很快就會有很多的疑問,例如:
對於一個函數,怎麼確定下行的方向?
每一步該往前走多遠?
有沒有可能停留在半山腰的平台上?
這些問題也就是本文接下來要討論的內容。
演算法描述
梯度下降演算法最開始的一點就是需要確定下降的方向,即:梯度。
我們常常用 來表示梯度。
對於一個二維空間的曲線來說,梯度就是其切線的方向。如下圖所示:
而對於更高維空間的函數來說,梯度由所有變數的偏導數決定。
其表達式如下所示:
[ abla f({ heta}) = ( frac{partial f({ heta})}{partial heta_1} , frac{partial f({ heta})}{partial heta_2} , ... , frac{partial f({ heta})}{partial heta_n} )]
在機器學習中,我們主要是用梯度下降演算法來最小化代價函數,記做:
[ heta ^* = arg min L( heta)]
其中,L是代價函數,是參數。
梯度下降演算法的主體邏輯很簡單,就是沿著梯度的方向一直下降,直到參數收斂為止。
記做:
[ heta ^{k + 1}_i = heta^{k}_i - lambda abla f( heta^{k})]
這里有幾點需要說明:
收斂是指函數的變化率很小。具體選擇多少合適需要根據具體的項目來確定。在演示項目中我們可以選擇0.01或者0.001這樣的值。不同的值將影響演算法的迭代次數,因為在梯度下降的最後,我們會越來越接近平坦的地方,這個時候函數的變化率也越來越小。如果選擇一個很小的值,將可能導致演算法迭代次數暴增。
公式中的 稱作步長,也稱作學習率(learning rate)。它決定了每一步往前走多遠,關於這個值我們會在下文中詳細講解。你可以暫時人為它是一個類似0.01或0.001的固定值。
在具體的項目,我們不會讓演算法無休止的運行下去,所以通常會設置一個迭代次數的最大上限。
線性回歸的梯度下降
有了上面的知識,我們可以回到線性模型代價函數的梯度下降演算法實現了。
首先,根據代價函數我們可以得到梯度向量如下:
[ abla f({ heta}) = (frac{partial L( heta)}{ partial heta_{0}}, frac{ partial L( heta)}{ partial heta_{1}}) = (frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) , frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i})]
接著,將每個偏導數帶入迭代的公式中,得到:
[ heta_{0} := heta_{0} - lambda frac{partial L( heta_{0})}{ partial heta_{0}} = heta_{0} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) heta_{1} := heta_{1} - lambda frac{partial L( heta_{1})}{ partial heta_{1}} = heta_{1} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i}]
由此就可以通過代碼實現我們的梯度下降演算法了,演算法邏輯並不復雜:
learning_rate = 0.01
def gradient_descent(x, y):
t0 = 10
t1 = 10
delta = 0.001
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
t0_ = t0 - 2 * learning_rate * sum1 / len(x)
t1_ = t1 - 2 * learning_rate * sum2 / len(x)
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
這段代碼說明如下:
我們隨機選擇了 都為10作為起點
設置最多迭代1000次
收斂的范圍設為0.001
學習步長設為0.01
如果我們將演算法迭代過程中求得的線性模式繪制出來,可以得到下面這幅動態圖:
最後演算法得到的結果如下:
Times: 657, gradient: [5.196562662718697, 1.952931052920264]
Times: 658, gradient: [5.195558390180733, 1.9530753071808193]
Times: 659, gradient: [5.194558335124868, 1.9532189556399233]
Times: 660, gradient: [5.193562479839619, 1.9533620008416623]
Gradient descent finish
從輸出中可以看出,演算法迭代了660次就收斂了。這時的結果[5.193562479839619, 1.9533620008416623],這已經比較接近目標值 [5, 2]了。如果需要更高的精度,可以將delta的值調的更小,當然,此時會需要更多的迭代次數。
高維擴展
雖然我們舉的例子是二維的,但是對於更高維的情況也是類似的。同樣是根據迭代的公式進行運算即可:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=1}^{m}(h_ heta(x^{k})-y^k)x_i^k]
這里的下標i表示第i個參數,上標k表示第k個數據。
梯度下降家族BGD
在上面的內容中我們看到,演算法的每一次迭代都需要把所有樣本進行遍歷處理。這種做法稱為之Batch Gradient Descent,簡稱BGD。作為演示示例只有10條數據,這是沒有問題的。
但在實際的項目中,數據集的數量可能是幾百萬幾千萬條,這時候每一步迭代的計算量就會非常的大了。
於是就有了下面兩個變種。
SGD
Stochastic Gradient Descent,簡稱SGD,這種演算法是每次從樣本集中僅僅選擇一個樣本來進行計算。很顯然,這樣做演算法在每一步的計算量一下就少了很多。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - lambda(h_ heta(x^k)-y^k)x_i^k]
當然,減少演算法計算量也是有代價的,那就是:演算法結果會強依賴於隨機取到的數據情況,這可能會導致演算法的最終結果不太令人滿意。
MBGD
以上兩種做法其實是兩個極端,一個是每次用到了所有數據,另一個是每次只用一個數據。
我們自然就會想到兩者取其中的方法:每次選擇一小部分數據進行迭代。這樣既避免了數據集過大導致每次迭代計算量過大的問題,也避免了單個數據對演算法的影響。
這種演算法稱之為Mini-batch Gradient Descent,簡稱MBGD。
其演算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=a}^{a + b}(h_ heta(x^k)-y^k)x_i^k]
當然,我們可以認為SGD是Mini-batch為1的特例。
針對上面提到的演算法變種,該如何選擇呢?
下面是Andrew Ng給出的建議:
如果樣本數量較小(例如小於等於2000),選擇BGD即可。
如果樣本數量很大,選擇 來進行MBGD,例如:64,128,256,512。
下表是 Optimization for Deep Learning 中對三種演算法的對比
方法准確性更新速度內存佔用在線學習BGD好慢高否SGD好(with annealing)快低是MBGD好中等中等是
演算法優化
式7是演算法的基本形式,在這個基礎上有很多人進行了更多的研究。接下來我們介紹幾種梯度下降演算法的優化方法。
Momentum
Momentum是動量的意思。這個演算法的思想就是藉助了動力學的模型:每次演算法的迭代會使用到上一次的速度作為依據。
演算法的公式如下:
[v^t = gamma v^{t - 1} + lambda abla f( heta) heta = heta - v_t]
對比式7可以看出,這個演算法的主要區別就是引入了,並且,每個時刻的受前一個時刻的影響。
從形式上看,動量演算法引入了變數 v 充當速度角色——它代表參數在參數空間移動的方向和速率。速度被設為負梯度的指數衰減平均。名稱動量來自物理類比,根據牛頓運動定律,負梯度是移動參數空間中粒子的力。動量在物理學上定義為質量乘以速度。在動量學習演算法中,我們假設是單位質量,因此速度向量 v 也可以看作是粒子的動量。
對於可以取值0,而是一個常量,設為0.9是一個比較好的選擇。
下圖是momentum演算法的效果對比:
對原來的演算法稍加修改就可以增加動量效果:
def gradient_descent_with_momentum(x, y):
t0 = 10
t1 = 10
delta = 0.001
v0 = 0
v1 = 0
gamma = 0.9
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
v0 = gamma * v0 + 2 * learning_rate * sum1 / len(x)
v1 = gamma * v1 + 2 * learning_rate * sum2 / len(x)
t0_ = t0 - v0
t1_ = t1 - v1
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
以下是該演算法的輸出:
Times: 125, gradient: [4.955453758569991, 2.000005017897775]
Times: 126, gradient: [4.955309381126545, 1.9956928964532015]
Times: 127, gradient: [4.9542964317327005, 1.9855674828684156]
Times: 128, gradient: [4.9536358220657, 1.9781180992510465]
Times: 129, gradient: [4.95412496254411, 1.9788858350530971]
Gradient descent finish
從結果可以看出,改進的演算法只用了129次迭代就收斂了。速度比原來660次快了很多。
同樣的,我們可以把演算法計算的過程做成動態圖:
對比原始的演算法過程可以看出,改進演算法最大的區別是:在尋找目標值時會在最終結果上下跳動,但是越往後跳動的幅度越小,這也就是動量所產生的效果。
Learning Rate 優化
至此,你可能還是好奇該如何設定學習率的值。
事實上,這個值的選取需要一定的經驗或者反復嘗試才能確定。
關鍵在於,這個值的選取不能過大也不能過小。
如果這個值過小,會導致每一次迭代的步長很小,其結果就是演算法需要迭代非常多的次數。
那麼,如果這個值過大會怎麼樣呢?其結果就是:演算法可能在結果的周圍來回震盪,卻落不到目標的點上。下面這幅圖描述了這個現象:
事實上,學習率的取值未必一定要是一個常數,關於這個值的設定有很多的研究。
下面是比較常見的一些改進演算法。
AdaGrad
AdaGrad是Adaptive Gradient的簡寫,該演算法會為每個參數設定不同的學習率。它使用歷史梯度的平方和作為基礎來進行計算。
其演算法公式如下:
[ heta_i = heta_i - frac{lambda}{sqrt{G_t + epsilon}} abla f( heta)]
對比式7,這里的改動就在於分號下面的根號。
根號中有兩個符號,第二個符號比較好理解,它就是為了避免除0而人為引入的一個很小的常數,例如可以設為:0.001。
第一個符號的表達式展開如下:
[G_t = sum_{i = 1}^{t} abla f( heta){i} abla f( heta){i}^{T}]
這個值其實是歷史中每次梯度的平方的累加和。
AdaGrad演算法能夠在訓練中自動的對learning rate進行調整,對於出現頻率較低參數採用較大的學習率;相反,對於出現頻率較高的參數採用較小的學習率。因此,Adagrad非常適合處理稀疏數據。
但該演算法的缺點是它可能導致學習率非常小以至於演算法收斂非常的慢。
關於這個演算法的直觀解釋可以看李宏毅教授的視頻課程:ML Lecture 3-1: Gradient Descent。
RMSProp
RMS是Root Mean Square的簡寫。RMSProp是AI教父Geoff Hinton提出的一種自適應學習率方法。AdaGrad會累加之前所有的梯度平方,而RMSProp僅僅是計算對應的平均值,因此可緩解Adagrad演算法學習率下降較快的問題。
該演算法的公式如下:
[E[ abla f( heta_{i})^2]^{t} = gamma E[ abla f( heta_{i})^2]^{t - 1} + (1-gamma)( abla f( heta_{i})^{t})^{2} heta_i = heta_i - frac{lambda}{sqrt{E[g^2]^{t+1} + epsilon}} abla f( heta_{i})]
類似的,是為了避免除0而引入。 是衰退參數,通常設為0.9。
這里的 是t時刻梯度平方的平均值。
Adam
Adam是Adaptive Moment Estimation的簡寫。它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。
Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定范圍,使得參數比較平穩。
該演算法公式如下:
[m^{t} = eta_{1} m^{t-1} + (1-eta_{1}) abla f( heta) v^{t} = eta_{2} v^{t-1} + (1-eta_{2}) abla f( heta)^2 widehat{m}^{t} = frac{m^{t}}{1 - eta^{t}_1} widehat{v}^{t} = frac{v^{t}}{1 - eta^{t}_2} heta = heta - frac{lambda}{sqrt{widehat{v}^{t}} + epsilon}widehat{m}^{t}]
,分別是對梯度的一階矩估計和二階矩估計。, 是對,的校正,這樣可以近似為對期望的無偏估計。
Adam演算法的提出者建議 默認值為0.9,默認值為0.999,默認值為 。
在實際應用中 ,Adam較為常用,它可以比較快地得到一個預估結果。
優化小結
這里我們列舉了幾種優化演算法。它們很難說哪種最好,不同的演算法適合於不同的場景。在實際的工程中,可能需要逐個嘗試一下才能確定選擇哪一個,這個過程也是目前現階段AI項目要經歷的工序之一。
實際上,該方面的研究遠不止於此,如果有興趣,可以繼續閱讀 《Sebastian Ruder: An overview of gradient descent optimization algorithms》 這篇論文或者 Optimization for Deep Learning 這個Slides進行更多的研究。
由於篇幅所限,這里不再繼續展開了。
演算法限制
梯度下降演算法存在一定的限制。首先,它要求函數必須是可微分的,對於不可微的函數,無法使用這種方法。
除此之外,在某些情況下,使用梯度下降演算法在接近極值點的時候可能收斂速度很慢,或者產生Z字形的震盪。這一點需要通過調整學習率來迴避。
另外,梯度下降還會遇到下面兩類問題。
局部最小值
局部最小值(Local Minima)指的是,我們找到的最小值僅僅是一個區域內的最小值,而並非全局的。由於演算法的起點是隨意取的,以下面這個圖形為例,我們很容易落到局部最小值的點裡面。
這就是好像你從上頂往下走,你第一次走到的平台未必是山腳,它有可能只是半山腰的一個平台的而已。
演算法的起點決定了演算法收斂的速度以及是否會落到局部最小值上。
壞消息是,目前似乎沒有特別好的方法來確定選取那個點作為起點是比較好的,這就有一點看運氣的成分了。多次嘗試不同的隨機點或許是一個比較好的方法,這也就是為什麼做演算法的優化這項工作是特別消耗時間的了。
但好消息是:
對於凸函數或者凹函數來說,不存在局部極值的問題。其局部極值一定是全局極值。
最近的一些研究表明,某些局部極值並沒有想像中的那麼糟糕,它們已經非常的接近全局極值所帶來的結果了。
鞍點
除了Local Minima,在梯度下降的過程中,還有可能遇到另外一種情況,即:鞍點(Saddle Point)。鞍點指的是我們找到點某個點確實是梯度為0,但它卻不是函數的極值,它的周圍既有比它小的值,也有比它大的值。這就好像馬鞍一樣。
如下圖所示:
多類隨機函數表現出以下性質:在低維空間中,局部極值很普遍。但在高維空間中,局部極值比較少見,而鞍點則很常見。
不過對於鞍點,可以通過數學方法Hessian矩陣來確定。關於這點,這里就不再展開了,有興趣的讀者可以以這里提供的幾個鏈接繼續探索。
參考資料與推薦讀物
Wikipeida: Gradient descent
Sebastian Ruder: An overview of gradient descent optimization algorithms
吳恩達:機器學習
吳恩達:深度學習
Peter Flach:機器學習
李宏毅 - ML Lecture 3-1: Gradient Descent
PDF: 李宏毅 - Gradient Descent
Intro to optimization in deep learning: Gradient Descent
Intro to optimization in deep learning: Momentum, RMSProp and Adam
Stochastic Gradient Descent – Mini-batch and more
劉建平Pinard - 梯度下降(Gradient Descent)小結
多元函數的偏導數、方向導數、梯度以及微分之間的關系思考
[Machine Learning] 梯度下降法的三種形式BGD、SGD以及MBGD
H. 什麼叫機器學習
機器學習(machine learning)
根據已知數據來不斷學習和積累經驗,然後總結出規律並嘗試預測未知數據的屬性,是一門綜合性非常強的多領域交叉學科,涉及線性代數、概率論、逼近論、凸分析和演算法復雜度理論等學科。目前機器學習已經有了十分廣泛的應用,例如數據挖掘、計算機視覺、自然語言處理、生物特徵識別、搜索引擎、醫學診斷、信用卡欺詐檢測、證券市場分析、DNA序列櫻侍測序、語音和手寫識別、推薦系統、戰略游戲和機器人運用等。
I. 深度學習和機器學習到底是什麼
簡單來說,機器學習是實現人工智慧的方法枯攔,深度學習是實現機器學習的技術。機器學習在實現人工智慧時中需要人工輔助(半自動),而深度學習使悉純該過程完全自動化
三者關系:
舉個例子:通過機器學習演算法來識別水果是橘子還是蘋果,需要人工輸入水果的特徵數據,生成一定的演算法模型,進而可以准確預測具有這些特徵的水果的類型,而深度睜敗咐學習則能自動的去發現特徵進而判斷。
J. 什麼是機器學習和深度學習是什麼關系
機器學習(Machine Learning,ML)是人工智慧的子領域,也是人工智慧的核心。它囊括了幾乎所有對世界影響最大的方法(包括深度學習)。機器學習理論主並伏要是設計和分析一些讓計算機可以自動學習的演算法。
深度學習(DeepLearning,DL)屬於機器學習的子類。它的靈感來源於人類大腦的工作方式,是利用深度神經網絕銷攜絡來解決特徵表達的一種學習過程。深度神經網路本身並非是一個全新的概念,可理解為包含多個隱含層的神經網路結構。為了提高深層神經網路的訓練效果,人們對神經元的連接方法以及激活函數等方面做出了調整。其目的在於建立、模擬人腦進行分析學習的神經網路,模仿人腦的機制來解釋數據,如文本、圖像、聲音。
1、應用場景
機器學習在指紋識別、特徵物體檢測等領域的應用基本達到了商業化的要求。
深度學習主要應用於文字識別、人臉技術、語義分析、智能監控等領域。目前在智能硬體、教育、醫療等行業也在快速布局。
2、所需數據量
機器學習能夠適應各種數據量,特別是數據量較小的場景。如果數據量迅速增加,那麼深度學習的效果將更加突出,這是因為深度學習演算法需要大量數據才能完美理解。
3、執行時間
執行時間是指訓練演算法所需要的時間量。一般來說,深度學習演算法需斗簡要大量時間進行訓練。這是因為該演算法包含有很多參數,因此訓練它們需要比平時更長的時間。相對而言,機器學習演算法的執行時間更少。
4、解決問題的方法
機器學習演算法遵循標准程序以解決問題。它將問題拆分成數個部分,對其進行分別解決,而後再將結果結合起來以獲得所需的答案。深度學習則以集中方式解決問題,而不必進行問題拆分。