概述
????????ChatGPT,英文全稱為Chat Generative Pre-trained Transformer,是OpenAI研發(fā)的聊天機(jī)器人程序。ChatGPT是人工智能技術(shù)驅(qū)動的自然語言處理工具,它能夠通過理解和學(xué)習(xí)人類的語言來進(jìn)行對話,還能根據(jù)聊天的上下文進(jìn)行互動,真正像人類一樣來聊天交流。除此之外,還能進(jìn)行撰寫郵件、腳本、文案、翻譯、代碼,寫論文、寫詩、繪畫等任務(wù)。
????????ChatGPT是人工智能深度學(xué)習(xí)的技術(shù)產(chǎn)物。對于軟件工程師,了解下深度學(xué)習(xí)的發(fā)展歷程、基本概念和基本原理等知識,還是很有必要的。
發(fā)展歷程
????????深度學(xué)習(xí)的發(fā)展歷程可以歸納為三個(gè)階段,如下圖所示。
????????第一階段的成果1:M-P模型
????????1943年,心理學(xué)家麥卡洛克和數(shù)學(xué)邏輯學(xué)家皮茲提出了M-P模型。M-P模型是模仿神經(jīng)元的結(jié)構(gòu)和工作原理,構(gòu)成的一個(gè)基于神經(jīng)網(wǎng)絡(luò)的數(shù)學(xué)模型,本質(zhì)上是一種“模擬人類大腦”的神經(jīng)元模型。M-P模型作為人工神經(jīng)網(wǎng)絡(luò)的起源,開創(chuàng)了人工神經(jīng)網(wǎng)絡(luò)的新時(shí)代,也奠定了神經(jīng)網(wǎng)絡(luò)模型的基礎(chǔ)。
????????第一階段的成果2:感知機(jī)模型
????????1958年,美國科學(xué)家羅森布拉特發(fā)現(xiàn)了一種類似于人類學(xué)習(xí)過程的學(xué)習(xí)算法——感知機(jī)學(xué)習(xí)。他正式提出了由兩層神經(jīng)元組成的神經(jīng)網(wǎng)絡(luò),稱之為“感知器”。感知器本質(zhì)上是一種線性模型,可以對輸入的訓(xùn)練集數(shù)據(jù)進(jìn)行二分類,且能夠在訓(xùn)練集中自動更新權(quán)值。感知器的提出吸引了大量科學(xué)家對人工神經(jīng)網(wǎng)絡(luò)研究的興趣,對神經(jīng)網(wǎng)絡(luò)的發(fā)展具有里程碑式的意義。
????????第一階段的局限性
????????1969年,美國數(shù)學(xué)家及人工智能先驅(qū)明斯基在其著作中證明了感知器本質(zhì)上是一種線性模型,只能處理線性分類問題,連最簡單的XOR(亦或)問題都無法正確分類。這等于直接宣判了感知器的死刑,神經(jīng)網(wǎng)絡(luò)的研究也陷入了將近20年的停滯。
?????????第二階段的成果1:BP算法、非線性分類
????????1986年,深度學(xué)習(xí)的大牛辛頓發(fā)明了適用于多層感知器(MLP)的反向傳播(BP)算法,并采用Sigmoid進(jìn)行非線性映射,有效解決了非線性分類問題。同時(shí),BP算法也解決了明斯基指出的雙層網(wǎng)絡(luò)難以訓(xùn)練的問題,使一層以上的神經(jīng)網(wǎng)絡(luò)進(jìn)入了實(shí)用階段,開啟了第二輪神經(jīng)網(wǎng)絡(luò)的研究熱潮。
?????????第二階段的成果2:萬能逼近定理
????????1989年,美國應(yīng)用數(shù)學(xué)家喬治-塞班克證明了MLP的萬能逼近定理,即對于任何閉區(qū)間內(nèi)的一個(gè)連續(xù)函數(shù),都可以用含有一個(gè)隱含層的BP網(wǎng)絡(luò)來逼近。后來,奧地利數(shù)學(xué)家科特-霍尼克進(jìn)一步完善了該理論,證明了神經(jīng)網(wǎng)絡(luò)的擬合能力是接近無限強(qiáng)的,任意復(fù)雜的分類決策邊界都可以被逼近。至此,神經(jīng)網(wǎng)絡(luò)的研究又進(jìn)入了一個(gè)新的高潮。
?????????第二階段的成果3:卷積神經(jīng)網(wǎng)絡(luò)
????????1989年,大神楊樂昆(現(xiàn)任紐約大學(xué)教授、Facebook副總裁兼人工智能首席科學(xué)家)提出了后來名滿天下,第一個(gè)真正意義上的深度學(xué)習(xí)網(wǎng)絡(luò),也是目前深度學(xué)習(xí)中應(yīng)用最廣的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)——卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)LeNet,并將其用于數(shù)字識別,且取得了較好的成績,不過當(dāng)時(shí)并沒有引起足夠的注意。
?????????第二階段的局限性
????????1991年,BP算法被指出存在梯度消失問題,即在誤差梯度后向傳遞的過程中,后層梯度以乘性方式疊加到前層,由于Sigmoid函數(shù)的飽和特性,后層梯度本來就小,誤差梯度傳到前層時(shí)幾乎為0,因此無法對前層進(jìn)行有效的學(xué)習(xí)。參數(shù)過多,以及參數(shù)的調(diào)優(yōu),也是當(dāng)時(shí)神經(jīng)網(wǎng)絡(luò)被詬病的問題。
?????????第三階段的成果:AlexNet
????????2012年,辛頓課題組為了證明深度學(xué)習(xí)的潛力,首次參加ImageNet圖像識別比賽,其通過構(gòu)建的CNN網(wǎng)絡(luò)AlexNet一舉奪得冠軍,且碾壓第二名(SVM方法)的分類性能。也正是由于該比賽,CNN吸引到了眾多研究者的注意。
?????????第三階段:快速發(fā)展
????????從2012年之后,深度學(xué)習(xí)的熱度呈現(xiàn)指數(shù)級上升,到2016年時(shí),深度學(xué)習(xí)已經(jīng)成為了谷歌上最熱門的搜索詞。同時(shí),短短幾年時(shí)間,深度學(xué)習(xí)推廣到了機(jī)器學(xué)習(xí)的各個(gè)領(lǐng)域,包括:圖像識別、語音識別、音頻處理、自然語言處理、機(jī)器人、生物信息處理、搜索引擎、網(wǎng)絡(luò)廣告投放和金融等。
基本概念
????????提到深度學(xué)習(xí),就不得不提機(jī)器學(xué)習(xí)和人工智能。很多人容易把這三個(gè)概念弄混,我們可以參考下面的圖來理解這三者的區(qū)別和聯(lián)系。
?????????人工智能(Artificial Intelligence),英文縮寫為AI。它是研究、開發(fā)用于模擬、延伸和擴(kuò)展人的智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門新的技術(shù)科學(xué)。
????????機(jī)器學(xué)習(xí)(Machine Learning),是指用某些算法指導(dǎo)計(jì)算機(jī)利用已知數(shù)據(jù)得出適當(dāng)?shù)哪P?,并利用此模型對新的情境給出判斷的過程。
????????深度學(xué)習(xí)(Deep Learning),其概念源于人工神經(jīng)網(wǎng)絡(luò)的研究,它通過組合低層特征形成更加抽象的高層表示屬性類別或特征,以發(fā)現(xiàn)數(shù)據(jù)的分布式特征表示。
????????在深度學(xué)習(xí)中,經(jīng)常會提到卷積的概念。那么,卷積到底是什么呢?實(shí)際上,卷積是通過兩個(gè)函數(shù)f和g生成第三個(gè)函數(shù)的一種數(shù)學(xué)算子,表征函數(shù)f與g經(jīng)過翻轉(zhuǎn)和平移的重疊部分的面積。可參考下圖進(jìn)行理解。
?????????弄清楚了卷積,我們再來看看卷積神經(jīng)網(wǎng)絡(luò)(CNN)。一個(gè)標(biāo)準(zhǔn)的卷積神經(jīng)網(wǎng)絡(luò),主要包括:輸入層(Input Layer)、卷積層(Convolutional Layer)、池化層(Pooling Layer)、激活層(Activation Layer)、全連接層(Fully Connected Layer)、損失層(Loss Layer)。
?????????下面,我們介紹深度學(xué)習(xí)中一些常用的層。
????????卷積層(Convolutional Layer)
????????卷積層由若干卷積單元組成,每個(gè)卷積單元的參數(shù)都是通過反向傳播算法最佳化得到的。卷積運(yùn)算的目的是提取輸入的不同特征,第一層卷積層可能只能提取一些低級的特征,比如:邊緣、線條和角等層級,更多層的網(wǎng)路能從低級特征中迭代提取更復(fù)雜的特征。
?????????池化層(Pooling Layer)
????????池化實(shí)際上是一種形式的降采樣。有多種不同形式的非線性池化函數(shù),而其中“最大池化(Max pooling)”是最為常見的。它是將輸入的圖像劃分為若干個(gè)矩形區(qū)域,對每個(gè)子區(qū)域輸出最大值。直覺上,這種機(jī)制能夠有效的原因在于,在發(fā)現(xiàn)一個(gè)特征之后,它的精確位置遠(yuǎn)不及它和其他特征的相對位置的關(guān)系重要。池化層會不斷地減小數(shù)據(jù)的空間大小,因此參數(shù)的數(shù)量和計(jì)算量也會下降,這在一定程度上也控制了過擬合。
?????????激活層(Activation Layer)
????????激活層模擬人的神經(jīng)系統(tǒng),只對部分神經(jīng)元的輸入做出反應(yīng)。激活層主要采用非線性激活函數(shù),如果采用線性函數(shù),那么多層神經(jīng)網(wǎng)絡(luò)也只有線性映射能力,輸出都是輸入的線性組合,無法模擬現(xiàn)實(shí)世界中各種復(fù)雜的非線性情況。
????????非線性激活函數(shù)最常用的有sigmoid、tanh和relu。目前主要使用relu函數(shù),因?yàn)閟igmoid和tanh在x趨于無窮的兩側(cè),都會出現(xiàn)導(dǎo)數(shù)為0的現(xiàn)象,從而造成梯度消失,無法更新網(wǎng)絡(luò)狀態(tài)。
?????????全連接層(Fully Connected Layer)
????????全連接層的每一個(gè)結(jié)點(diǎn)都與上一層的所有結(jié)點(diǎn)相連,用來把前邊提取到的特征綜合起來。由于其全相連的特性,一般全連接層的參數(shù)也是最多的,計(jì)算量和占用內(nèi)存也是最多的。例如:在VGG16中,第一個(gè)全連接層FC1有4096個(gè)節(jié)點(diǎn),上一層POOL2是7*7*512 = 25088個(gè)節(jié)點(diǎn),則需要4096*25088 = 102760448個(gè)權(quán)值,需要耗很大的內(nèi)存。
?????????損失層(Loss Layer)
????????損失層設(shè)置了一個(gè)損失函數(shù)(也叫目標(biāo)函數(shù))用來比較網(wǎng)絡(luò)的輸出和目標(biāo)值,通過最小化損失來驅(qū)動網(wǎng)絡(luò)的訓(xùn)練。網(wǎng)絡(luò)損失通過前向傳播計(jì)算,網(wǎng)絡(luò)權(quán)重參數(shù)相對于損失函數(shù)的梯度通過反向傳播計(jì)算。
????????損失函數(shù)是在前向傳播計(jì)算中得到的,同時(shí)也是反向傳播的起點(diǎn)。損失函數(shù)基本都是由真實(shí)值和預(yù)測值兩部分組成。正確的損失函數(shù),可以起到讓預(yù)測值一直逼近真實(shí)值的效果,當(dāng)預(yù)測值和真實(shí)值相等時(shí),loss值最小。
經(jīng)典模型
????????2012年深度學(xué)習(xí)爆火之后,相繼出現(xiàn)了很多經(jīng)典的網(wǎng)絡(luò)模型,這些模型對深度學(xué)習(xí)的迅速發(fā)展起到了非常重要的作用。
????????經(jīng)典模型之AlexNet
????????在2012年ILSVRC(ImageNet Large-Scale Visual Recognition Challenge)贏得了分類識別第一名的好成績(TOP 5錯誤率為15.4%)。AlexNet由5層卷積層、最大池化層、dropout層和3層全連接層組成,用于對1000個(gè)類別圖像進(jìn)行分類。
????????1、在ImageNet數(shù)據(jù)集上訓(xùn)練網(wǎng)絡(luò),其中數(shù)據(jù)集超過22000個(gè)類,總共有大于1500萬張注釋的圖像。
????????2、使用ReLU非線性激活函數(shù),并利用dropout方法解決過擬合問題。
????????3、在兩臺GTX 580 GPU上訓(xùn)練了五至六天。
?????????經(jīng)典模型之VGGNet
????????2014年,牛津大學(xué)學(xué)者創(chuàng)建了一個(gè)新的卷積神經(jīng)網(wǎng)絡(luò)模型,19層卷積層,卷積核尺寸為3×3 (TOP 5錯誤率為7.3%) 。
????????1、AlexNet模型中卷積核尺寸11×11,VGG Net的卷積核為3×3。兩個(gè)3×3的conv層相當(dāng)于一個(gè)5×5的有效感受野,這樣就可以用較小的卷積核尺寸模擬更大尺寸的卷積核,好處是可以減少卷積核參數(shù)的數(shù)量。
????????2、三個(gè)3×3的conv層擁有7×7的有效感受野。
????????3、在4個(gè)Nvidia Titan Black GPU上訓(xùn)練兩到三周。
?????????經(jīng)典模型之GoogleNet
????????GoogleNet是一個(gè)具有22個(gè)conv層的CNN網(wǎng)絡(luò),在ILSVRC 2014中以6.7%的TOP5錯誤率登頂冠軍。
????????1、在整個(gè)架構(gòu)中使用了Inception模塊,總共超過100層。
????????2、沒有使用全連接層,使用的是average polling。
????????3、參數(shù)是AlexNet的1/12,原因包括:一是除去了全連接層;二是1×1卷積核降維的效果。
????????4、利用一些高端的GPU進(jìn)行了大概一周的訓(xùn)練。
?????????經(jīng)典模型之ResNet
????????2015年,微軟亞洲研究院創(chuàng)造了一種令人難以置信的152層的深度學(xué)習(xí)模型ResNet,其在ILSVRC 2015的錯誤率僅僅為3.6%,已經(jīng)高于人類肉眼識別的錯誤率。
????????1、微軟亞洲研究院的研究小組曾經(jīng)嘗試過1202層的網(wǎng)絡(luò)結(jié)構(gòu),但是測試精度很低,可能是由于過擬合的原因?qū)е碌摹?/p>
????????2、在8臺GPU機(jī)器上訓(xùn)練了2到3周。
框架簡介
????????深度學(xué)習(xí)的框架非常之多,每個(gè)框架的特性和側(cè)重點(diǎn)不同。這里,我們僅選擇幾個(gè)有代表性的框架進(jìn)行介紹。
?????????Caffe/Caffe2
????????Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個(gè)清晰、高效的深度學(xué)習(xí)框架,核心語言是C++,它支持命令行、Python和MATLAB接口,既可以在CPU上運(yùn)行,也可以在GPU上運(yùn)行。Caffe的作者是賈揚(yáng)清。
????????Caffe憑借其易用性、簡潔明了的源碼、出眾的性能和快速的原型設(shè)計(jì)獲取了眾多用戶,曾經(jīng)占據(jù)深度學(xué)習(xí)領(lǐng)域的半壁江山。但是在深度學(xué)習(xí)新時(shí)代到來之時(shí),Caffe已經(jīng)表現(xiàn)出明顯的力不從心,諸多問題逐漸顯現(xiàn)(包括靈活性缺失、擴(kuò)展難、依賴眾多環(huán)境難以配置、應(yīng)用局限等)。盡管現(xiàn)在在GitHub上還能找到許多基于Caffe的項(xiàng)目,但是新的項(xiàng)目已經(jīng)越來越少。
????????Caffe2繼承了Caffe的優(yōu)點(diǎn),在速度上令人印象深刻。Facebook 人工智能實(shí)驗(yàn)室與應(yīng)用機(jī)器學(xué)習(xí)團(tuán)隊(duì)合作,利用Caffe2大幅加速機(jī)器視覺任務(wù)的模型訓(xùn)練過程,僅需1小時(shí)就訓(xùn)練完ImageNet這樣超大規(guī)模的數(shù)據(jù)集。然而盡管已經(jīng)發(fā)布半年多,開發(fā)一年多,Caffe2仍然是一個(gè)不太成熟的框架,官網(wǎng)至今沒提供完整的文檔,安裝也比較麻煩,編譯過程時(shí)常出現(xiàn)異常,在GitHub上也很少找到相應(yīng)的代碼。
?????????TensorFlow
????????TensorFlow主要用于進(jìn)行機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)研究,但它是一個(gè)非常基礎(chǔ)的系統(tǒng),因此也可以應(yīng)用于眾多領(lǐng)域。由于Google在深度學(xué)習(xí)領(lǐng)域的巨大影響力和強(qiáng)大的推廣能力,TensorFlow一經(jīng)推出就獲得了極大的關(guān)注,并迅速成為如今用戶最多的深度學(xué)習(xí)框架。
????????TensorFlow編程接口支持Python和C++。隨著1.0版本的公布,Java、Go、R和Haskell API的alpha版本也被支持。此外,TensorFlow還可在Google Cloud和AWS中運(yùn)行。TensorFlow還支持 Windows 7、Windows 10和Windows Server 2016。
????????作為當(dāng)前最流行的深度學(xué)習(xí)框架,TensorFlow獲得了極大的成功,但對它的批評也不絕于耳,總結(jié)起來主要有以下四點(diǎn):1、過于復(fù)雜的系統(tǒng)設(shè)計(jì);2、頻繁變動的接口;3、接口設(shè)計(jì)過于晦澀難懂;4、文檔混亂脫節(jié)。
?????????MXNet
????????MXNet是一個(gè)深度學(xué)習(xí)庫,支持C++、Python、R、Scala、Julia、MATLAB及JavaScript等語言;支持命令和符號編程;可以運(yùn)行在CPU、GPU、集群、服務(wù)器、臺式機(jī)或者移動設(shè)備上。
????????MXNet以其超強(qiáng)的分布式支持,明顯的內(nèi)存、顯存優(yōu)化為人所稱道。同樣的模型,MXNet往往占用更小的內(nèi)存和顯存,并且在分布式環(huán)境下,MXNet展現(xiàn)出了明顯優(yōu)于其他框架的擴(kuò)展性能。
????????由于MXNet最初由一群學(xué)生開發(fā),缺乏商業(yè)應(yīng)用,極大地限制了MXNet的使用。2016年11月,MXNet被AWS正式選擇為其云計(jì)算的官方深度學(xué)習(xí)平臺。2017年1月,MXNet項(xiàng)目進(jìn)入Apache基金會,成為Apache的孵化器項(xiàng)目。
????????盡管MXNet擁有最多的接口,也獲得了不少人的支持,但其始終處于一種不溫不火的狀態(tài),這在很大程度上歸結(jié)于推廣不給力及接口文檔不夠完善。MXNet長期處于快速迭代的過程,其文檔卻長時(shí)間未更新,導(dǎo)致新手用戶難以掌握MXNet,老用戶常常需要查閱源碼才能真正理解MXNet接口的用法。
????????
?????????PyTorch
????????Torch是一個(gè)有大量機(jī)器學(xué)習(xí)算法支持的科學(xué)計(jì)算框架,其誕生已有十年之久,但是真正起勢得益于Facebook開源了大量Torch的深度學(xué)習(xí)模塊和擴(kuò)展。Torch的特點(diǎn)在于特別靈活,但是另一個(gè)特殊之處是采用了編程語言Lua,在深度學(xué)習(xí)大部分以Python為編程語言的大環(huán)境之下,一個(gè)以Lua為編程語言的框架有著更多的劣勢,這一項(xiàng)小眾的語言增加了學(xué)習(xí)使用Torch這個(gè)框架的成本。
????????PyTorch的前身便是Torch,其底層和Torch框架一樣,但是使用Python重新寫了很多內(nèi)容,不僅更加靈活,支持動態(tài)圖,而且提供了Python接口。它是由Torch7團(tuán)隊(duì)開發(fā),是一個(gè)以Python優(yōu)先的深度學(xué)習(xí)框架,不僅能夠?qū)崿F(xiàn)強(qiáng)大的GPU加速,同時(shí)還支持動態(tài)神經(jīng)網(wǎng)絡(luò),這是很多主流深度學(xué)習(xí)框架比如Tensorflow等都不支持的。
基本原理
????????神經(jīng)網(wǎng)絡(luò)由其權(quán)重來參數(shù)化
????????神經(jīng)網(wǎng)絡(luò)中每層對輸入數(shù)據(jù)所做的具體操作保存在該層的權(quán)重(weight)中,其本質(zhì)是一串?dāng)?shù)字。用術(shù)語來說,每層實(shí)現(xiàn)的變換由其權(quán)重來參數(shù)化。權(quán)重有時(shí)也被稱為該層的參數(shù)(parameter)。在這種語境下,學(xué)習(xí)的意思是為神經(jīng)網(wǎng)絡(luò)的所有層找到一組權(quán)重值,使得該網(wǎng)絡(luò)能夠?qū)⒚總€(gè)示例輸入與其目標(biāo)正確地一一對應(yīng)。但重點(diǎn)來了:一個(gè)深度神經(jīng)網(wǎng)絡(luò)可能包含數(shù)千萬個(gè)參數(shù)。找到所有參數(shù)的正確取值可能是一項(xiàng)非常艱巨的任務(wù),特別是考慮到修改某個(gè)參數(shù)值將會影響其他所有參數(shù)的行為。
?????????損失函數(shù)用來衡量網(wǎng)絡(luò)輸出結(jié)果的質(zhì)量
????????想要控制一件事物,首先需要能夠觀察它。想要控制神經(jīng)網(wǎng)絡(luò)的輸出,就需要能夠衡量該輸出與預(yù)期值之間的距離。這是神經(jīng)網(wǎng)絡(luò)損失函數(shù)(loss function)的任務(wù)。損失函數(shù)的輸入是網(wǎng)絡(luò)預(yù)測值與真實(shí)目標(biāo)值(即你希望網(wǎng)絡(luò)輸出的結(jié)果),然后計(jì)算一個(gè)距離值,衡量該網(wǎng)絡(luò)在這個(gè)示例上的效果好壞。
?????????將損失值作為反饋信號來調(diào)節(jié)權(quán)重
????????深度學(xué)習(xí)的基本技巧是利用這個(gè)距離值作為反饋信號來對權(quán)重值進(jìn)行微調(diào),以降低當(dāng)前示例對應(yīng)的損失值。這種調(diào)節(jié)由優(yōu)化器(optimizer)來完成,它實(shí)現(xiàn)了所謂的反向傳播(back propagation)算法,這是深度學(xué)習(xí)的核心算法。
?????????整個(gè)學(xué)習(xí)過程
????????一開始對神經(jīng)網(wǎng)絡(luò)的權(quán)重隨機(jī)賦值,因此網(wǎng)絡(luò)只是實(shí)現(xiàn)了一系列隨機(jī)變換。其輸出結(jié)果自然也和理想值相去甚遠(yuǎn),相應(yīng)地,損失值也很高。但隨著網(wǎng)絡(luò)處理的示例越來越多,權(quán)重值也在向正確的方向逐步微調(diào),損失值也逐漸降低,這就是訓(xùn)練循環(huán)(training loop)。將這種循環(huán)重復(fù)足夠多的次數(shù),得到的權(quán)重值可以使損失函數(shù)最小。具有最小損失的網(wǎng)絡(luò),其輸出值與目標(biāo)值盡可能地接近,這就是訓(xùn)練好的網(wǎng)絡(luò),其輸出我們稱之為模型。
?????????前向傳播
????????輸入信號與權(quán)重矩陣進(jìn)行運(yùn)算,得到每一層的輸出,最終到達(dá)輸出層。
?????????反向傳播(BP算法)
????????BP算法(即誤差反向傳播算法)是適合于多層神經(jīng)網(wǎng)絡(luò)的一種學(xué)習(xí)算法,它建立在梯度下降法的基礎(chǔ)上。
????????當(dāng)前向傳播完成后,會逐層求出損失函數(shù)對各神經(jīng)元權(quán)值的偏導(dǎo)數(shù)(鏈?zhǔn)椒▌t),構(gòu)成損失函數(shù)對權(quán)值向量的梯量,作為修改權(quán)值的依據(jù),網(wǎng)絡(luò)的學(xué)習(xí)在權(quán)值修改過程中完成。誤差達(dá)到所期望值時(shí),網(wǎng)絡(luò)學(xué)習(xí)結(jié)束。
?????????梯度下降法的場景假設(shè)
????????一個(gè)人被困在山上,需要從山上下來。但此時(shí)山上的濃霧很大,導(dǎo)致可視度很低。因此,下山的路徑就無法確定,他必須利用自己周圍的信息去找到下山的路徑。這個(gè)時(shí)候,他就可以利用梯度下降算法來幫助自己下山。具體來說就是,以他當(dāng)前的所處的位置為基準(zhǔn),尋找這個(gè)位置最陡峭的地方,然后朝著山的高度下降的地方走。然后每走一段距離,都反復(fù)采用同一個(gè)方法,最后就能成功的抵達(dá)山谷。
????????我們同時(shí)可以假設(shè)這座山最陡峭的地方是無法通過肉眼立馬觀察出來的,而是需要一個(gè)復(fù)雜的工具來測量。所以,此人每走一段距離,都需要一段時(shí)間來測量所在位置最陡峭的方向,這是比較耗時(shí)的。那么為了在太陽下山之前到達(dá)山谷,就要盡可能的減少測量方向的次數(shù)。這是一個(gè)兩難的選擇,如果測量的頻繁,可以保證下山的方向是絕對正確的,但又非常耗時(shí),如果測量的過少,又有偏離軌道的風(fēng)險(xiǎn)。所以需要找到一個(gè)合適的測量方向的頻率,來確保下山的方向不錯誤,同時(shí)又不至于耗時(shí)太多!
?????????梯度下降法
????????梯度下降的基本過程就和下山的場景很類似。
????????首先,我們有一個(gè)可微分的損失函數(shù),這個(gè)函數(shù)就代表著一座山。我們的目標(biāo)就是找到這個(gè)函數(shù)的最小值,也就是山谷。根據(jù)之前的場景假設(shè),最快的下山的方式就是找到當(dāng)前位置最陡峭的方向,然后沿著此方向向下走,對應(yīng)到函數(shù)中,就是找到給定點(diǎn)的梯度,然后朝著梯度相反的方向,就能讓函數(shù)值下降的最快!
????????所以,我們重復(fù)利用這個(gè)方法,反復(fù)求取梯度,最后就能到達(dá)局部的最小值,這就類似于我們下山的過程。而求取梯度就確定了最陡峭的方向,也就是場景中測量方向的手段。
????????上面提到,需要找給定點(diǎn)的梯度,那么,梯度是什么?
?????????微分
????????看待微分的意義,可以有不同的角度,最常用的兩種是:
????????1、函數(shù)圖像中,某點(diǎn)的切線的斜率。
????????2、函數(shù)的變化率。
?????????梯度
????????梯度實(shí)際上就是多變量微分的一般化。
????????我們可以看到,梯度就是分別對每個(gè)變量進(jìn)行微分,然后用逗號分割開,梯度是用<>括起來,說明梯度其實(shí)是一個(gè)向量。
????????梯度是微積分中一個(gè)很重要的概念,梯度的意義:
????????1、在單變量的函數(shù)中,梯度其實(shí)就是函數(shù)的微分,代表著函數(shù)在某個(gè)給定點(diǎn)的切線的斜率。
????????2、在多變量函數(shù)中,梯度是一個(gè)向量,向量有方向,梯度的方向就指出了函數(shù)在給定點(diǎn)的上升最快的方向。
?????????梯度下降法的數(shù)學(xué)公式
????????J是關(guān)于Θ的一個(gè)函數(shù),我們當(dāng)前所處的位置為Θ0點(diǎn),要從這個(gè)點(diǎn)走到J的最小值點(diǎn),也就是山谷。首先我們先確定前進(jìn)的方向,也就是梯度的反向,然后走一段距離的步長,也就是α,走完這個(gè)段步長,就到達(dá)了Θ1這個(gè)點(diǎn)!
????????α在梯度下降算法中被稱作為學(xué)習(xí)率或者步長,意味著我們可以通過α來控制每一步走的距離,以保證不要步子跨的太大扯著蛋(其實(shí)就是不要走太快,錯過了最低點(diǎn))。同時(shí)也要保證不要走的太慢,導(dǎo)致太陽下山了,還沒有走到山谷。
?????????α學(xué)習(xí)率
????????α的選擇在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的話,可能導(dǎo)致遲遲走不到最低點(diǎn),太大的話,會導(dǎo)致錯過最低點(diǎn)!
?????????假設(shè)有一個(gè)下面的損失函數(shù)、起始點(diǎn)以及學(xué)習(xí)率。現(xiàn)在要通過梯度下降法計(jì)算這個(gè)函數(shù)的最小值。我們通過觀察就能發(fā)現(xiàn)最小值其實(shí)就是(0,0)點(diǎn)。但是接下來,我們會從梯度下降算法開始一步步計(jì)算到這個(gè)最小值!
文章來源:http://www.zghlxwxcb.cn/news/detail-512703.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-512703.html
到了這里,關(guān)于軟件工程師,入門下深度學(xué)習(xí)吧的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!