谷歌云计算技术基础架构,谷歌卷积神经网络
谷歌開源了TensorFlow,世界就要馬上被改變了嗎
Google開源了其第二代深度學(xué)習(xí)技術(shù)TensorFlow——被使用在Google搜索、圖像識(shí)別以及郵箱的深度學(xué)習(xí)框架。這在相關(guān)媒體圈、工程師圈、人工智能公司、人工智能研究團(tuán)隊(duì)里有了一些討論。
比較有趣的是,微軟亞洲研究院立刻向媒體發(fā)郵件表示,我們發(fā)布了開源分布式機(jī)器學(xué)習(xí)工具包(DMTK)。對(duì)于大眾來說,這件事讓人“困惑”。
從“深度學(xué)習(xí)”到“分布式系統(tǒng)”,太多概念大眾一知半解,現(xiàn)今給出的資料又讓人難以理解。而對(duì)于“Google開源TensorFlow”這一事件,各個(gè)公司、團(tuán)隊(duì)、學(xué)術(shù)權(quán)威也是眾說紛紜。
因此,出門問問為大家“破霧”,并講一講這次開源意味著什么。什么是深度學(xué)習(xí)?深度學(xué)習(xí)系統(tǒng)是什么?深度學(xué)習(xí)理論于2006年被提出,它通過模擬“人腦的神經(jīng)網(wǎng)絡(luò)”來解釋圖像、聲音和文本等數(shù)據(jù)。
但是目前的計(jì)算機(jī)還達(dá)不到模擬人腦數(shù)量龐大的神經(jīng)元(千億級(jí)),因此便有了用到成千上萬大型計(jì)算機(jī)(計(jì)算平臺(tái)集群)來吸收數(shù)據(jù)對(duì)其進(jìn)行自動(dòng)分類的“分布式深度學(xué)習(xí)系統(tǒng)”。
TensorFlow的起源和此次開源事件Google將自家研發(fā)的深度學(xué)習(xí)系統(tǒng)命名為“DistBelief”,它使得Google能夠同時(shí)處理成千上萬臺(tái)大型計(jì)算機(jī)的數(shù)據(jù),構(gòu)建更大型的神經(jīng)網(wǎng)絡(luò)和大規(guī)模訓(xùn)練。
Google的搜索、圖像識(shí)別及郵箱等均采用了該技術(shù)。一般情況下,深度學(xué)習(xí)系統(tǒng)都需要先設(shè)定好feature(特征),再學(xué)習(xí)如何分辨。
但GoogleDistBelief神奇的地方在于,“GoogleBrain”開發(fā)團(tuán)隊(duì)“XLab”曾用它在未事先獲取“貓的特征描述”信息的情況下,從大量YouTube視頻中區(qū)分出了哪些是貓的視頻。
這意味著深度學(xué)習(xí)系統(tǒng)“DistBelief”自行總結(jié)出了貓的feature(特征)!雖然這個(gè)案例的識(shí)別范圍、識(shí)別率有待提高(81.7%),但作為人工智能最經(jīng)典案例之一,為人工智能翻開了新的篇章。
而“貓”的事件,也讓曾經(jīng)的GoogleBrain開發(fā)團(tuán)隊(duì)“XLab”的核心人員、現(xiàn)在被李彥宏挖到百度的吳恩達(dá)得到了“GoogleBrain”之父的美譽(yù)。
不過,時(shí)代總是進(jìn)步,而“DistBelief”有缺陷。Google稱,雖然DistBelief非常成功,但它僅僅以神經(jīng)網(wǎng)絡(luò)為目的、十分局限,而且很難進(jìn)行配置。
另外,DistBelief牢牢綁定在Google的內(nèi)部基礎(chǔ)設(shè)施上,幾乎不可能將代碼與外界共享。因此,本文的主角,Google的第二代深度學(xué)習(xí)系統(tǒng)“TensorFlow”橫空出世了。
Google表示,TensorFlow在設(shè)計(jì)上尤其針對(duì)克服DistBelief的短板,靈活、更通用、易使用、更快,而且完全開源。
TensorFlow可以被架設(shè)在智能手機(jī)這樣小的設(shè)備上,甚至僅一塊電路板上,更靈活;TensorFlow可以被使用在很多計(jì)算平臺(tái),無論是智能手機(jī)還是大型計(jì)算機(jī)、單個(gè)CPU/GPU計(jì)算機(jī)還是成百上千GPU卡組成的分布式系統(tǒng),ARM的還是X86的構(gòu)架,更通用;TensorFlow支持多種編程語言,提供了很多深度學(xué)習(xí)模型庫,易使用;在很多指標(biāo)上,TensorFlow要比DistBelief要快一倍,更快。
但是,學(xué)術(shù)界和工程界的一些朋友并不喜歡這個(gè)“剛剛闖入”開源界的“小伙子”,判了它“意義不大”的死刑。
“TensorFlow”之所以“開源”卻不討好,是因?yàn)門ensorFlow不是第一個(gè)被開源的深度學(xué)習(xí)系統(tǒng),并且目前只開源了“單機(jī)版”,而非能夠識(shí)別貓的“分布式版本”。
除了并非第一以及只開源了單機(jī)版代碼這兩點(diǎn)外,Google開源TensorFlow這件事最被人詬病的地方在于,在“用事實(shí)”、“用數(shù)據(jù)”說話的學(xué)術(shù)界、工程界,Google并未用“數(shù)據(jù)對(duì)比”證明TensorFlow的“靈活、更通用、易使用”。
對(duì)于TensorFlow,出門問問的看法是,TensorFlow對(duì)學(xué)術(shù)界意義不大,但是對(duì)工程界意義挺大。
TensorFlow對(duì)工程界有意義:其它開源工具雖然眾多但對(duì)工程界很難有效使用Google這次開源的TensorFlow是一種人工智能(更具體的說是深度學(xué)習(xí))編程語言或計(jì)算框架,學(xué)術(shù)界從來都不缺少類似的開源工具,尤其是“單機(jī)版工具包”有很多。
但是學(xué)術(shù)界的工具往往更多專注在核心算法上,在系統(tǒng)和工程方面比較欠缺,工業(yè)界很難直接有效的使用,而Google的TensorFlow在架構(gòu)設(shè)計(jì),跨平臺(tái)可移植性,算法可擴(kuò)展性等等偏工程方面會(huì)做的比較好。
所以,TensorFlow對(duì)學(xué)術(shù)界的幫助比較小,但對(duì)工業(yè)界的幫助有很大潛在可能性。
比如語音識(shí)別、自然語言理解、計(jì)算機(jī)視覺、廣告等等都可以應(yīng)用這種深度學(xué)習(xí)算法,Google也因?yàn)樯疃葘W(xué)習(xí)系統(tǒng)的應(yīng)用使得Google語音識(shí)別水平提高25%。
有意義歸有意義,意義的大小是另一回事了。在這個(gè)信息交流頻繁的時(shí)代,沒有公司能隨便制造一個(gè)具有超大意義的事件或者跨時(shí)代的黑科技產(chǎn)品。
對(duì)于工程界,TensorFlow有意義但又不是神乎其神的東西,尤其是Google目前開源的“單機(jī)版”的TensorFlow意義要小一些。
因?yàn)樵诠こ探缋?#xff0c;若要完成一整件事,如識(shí)別語音,TensorFlow這種通用深度學(xué)習(xí)框架的存在更多是錦上添花,而非決定根本。
比如說在一個(gè)可以應(yīng)用的語音識(shí)別系統(tǒng)里,除了深度學(xué)習(xí)算法外,還有很多工作是專業(yè)領(lǐng)域相關(guān)的算法以及海量數(shù)據(jù)收集和工程系統(tǒng)架構(gòu)的搭建。其實(shí),對(duì)于中國來說,TensorFlow還有一個(gè)意義。
在人工智能大潮下許多人和公司想入局,但大都沒有能力理解并開發(fā)一個(gè)與國際同步的深度學(xué)習(xí)系統(tǒng),而TensorFlow的存在會(huì)大大降低深度學(xué)習(xí)在各個(gè)行業(yè)中的應(yīng)用難度。
至于弄懂TensorFlow要花費(fèi)大量時(shí)間的問題,就像很多公司用Linux或者h(yuǎn)adoop(一種分布式系統(tǒng)基礎(chǔ)架構(gòu))但很少有公司弄懂了所有源代碼一樣,可以把TensorFlow當(dāng)成一個(gè)黑盒,先快速用起來,之后再根據(jù)數(shù)據(jù)和專業(yè)領(lǐng)域知識(shí)來調(diào)整。
總的來說,如果Google按照其所說的那樣,在未來完全開源TensorFlow——包括其“分布式版本”,那么TensorFlow對(duì)工程界的影響會(huì)更明顯些——尤其對(duì)中國創(chuàng)業(yè)公司來說。
谷歌人工智能寫作項(xiàng)目:小發(fā)貓
如何選擇深度學(xué)習(xí)框架 TensorFlow/Torch/Mxnet/Theano
深度學(xué)習(xí)目前的應(yīng)用領(lǐng)域很多,主要是計(jì)算機(jī)視覺和自然語言處理,以及各種預(yù)測(cè)等常見的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。
對(duì)于計(jì)算機(jī)視覺,可以做圖像分類、目標(biāo)檢測(cè)、視頻中的目標(biāo)檢測(cè)等,對(duì)于自然語言處理,可以做語音識(shí)別、語音合成、對(duì)話系統(tǒng)、機(jī)器翻譯、文章摘要、情感分析等。
對(duì)于剛?cè)胄猩疃葘W(xué)習(xí),想從事人工智能工業(yè)應(yīng)用和研發(fā)的小白來說,選擇一個(gè)適合自己的深度學(xué)習(xí)框架顯得尤為重要。
那么在選擇深度學(xué)習(xí)框架的時(shí)候,要注意哪些內(nèi)容呢?通常我們?cè)谶x擇框架時(shí)要考慮易用性、性能、社區(qū)、平臺(tái)支持等問題。
初學(xué)者應(yīng)該考慮容易上手的框架,偏工業(yè)應(yīng)用的開發(fā)者可以考慮使用穩(wěn)定性高、性能好的框架,偏研究性的開發(fā)者,一般選擇易用而且有領(lǐng)先的模型基線的框架。
目前這個(gè)階段,TensorFlow因?yàn)楸晨抗雀韫具@座靠山,再加上擁有龐大的開發(fā)者群體,而且采用了稱為“可執(zhí)行的偽代碼”的Python語言,成為最受歡迎的主流框架之一。
一些外圍的第三方庫(如Keras、TFLearn)也基于它實(shí)現(xiàn)了很多成果,Keras還得到TensorFlow官方的支持。
TensorFlow支持的上層語言也在逐漸擴(kuò)大,對(duì)于不同工程背景的人轉(zhuǎn)入的門檻正在降低。
因此,對(duì)于剛?cè)胄猩疃葘W(xué)習(xí)的小白,TensorFlow是一個(gè)非常好的選擇,掌握TensorFlow對(duì)以后的求職發(fā)展很有幫助。
為了讓大家更快地掌握深度學(xué)習(xí)技術(shù),成為人工智能領(lǐng)域高端人才,中公教育聯(lián)合中科院自動(dòng)化研究所專家,強(qiáng)力推出人工智能《深度學(xué)習(xí)》,讓大家學(xué)有所成、真正掌握機(jī)器學(xué)習(xí)模型以及算法背后的原理。
哪一個(gè)神經(jīng)網(wǎng)絡(luò)框架的運(yùn)算速度最快
谷歌翻譯這幾個(gè)月的進(jìn)化速度似乎突然加快了?
。
先上論文鏈接Google'sNeuralMachineTranslationSystem:BridgingtheGapbetweenHumanandMachineTranslation:首先以往翻譯系統(tǒng)有如下缺點(diǎn):基于短語翻譯,長(zhǎng)語句翻譯效果不好系統(tǒng)訓(xùn)練和翻譯推理計(jì)算成本較高難以應(yīng)對(duì)罕見詞以上是顯著的缺點(diǎn),而這些使得翻譯系統(tǒng)在實(shí)際應(yīng)用中的準(zhǔn)確度和速度。
下圖為翻譯系統(tǒng)的核心算法框架圖:Google'sNeuralMachineTranslationSystem由帶有8個(gè)encoder和8個(gè)decoder的深度LSTM網(wǎng)絡(luò)組成,同時(shí)加入了attention機(jī)制和殘差連接(residualconnections)。
為了提升并行性從而降低訓(xùn)練時(shí)間,我們的注意機(jī)制將decoder的底層連接到了encoder的頂層。為了加速最終的翻譯速度,我們?cè)谕评碛?jì)算過程中使用了低精度運(yùn)算。
為了改善對(duì)罕見詞的處理,我們將詞分成常見子詞(sub-word)單元(詞的組件)的一個(gè)有限集合,該集合既是輸入也是輸出。
這種方法能提供字符(character)-delimitedmodels的靈活性和詞(word)-delimitedmodels的有效性之間的平衡、能自然地處理罕見詞的翻譯、并能最終提升系統(tǒng)的整體準(zhǔn)確度。
我們的波束搜索技術(shù)(beamsearchtechnique)使用了一個(gè)長(zhǎng)度規(guī)范化(length-normalization)過程,并使用了一個(gè)覆蓋度懲罰(coveragepenalty),其可以激勵(lì)很可能能覆蓋源句子中所有的詞的輸出句子的生成。
在WMT'14英語-法語和英語-德語基準(zhǔn)上,GNMT實(shí)現(xiàn)了可與當(dāng)前最佳結(jié)果媲美的結(jié)果。
通過在一個(gè)單獨(dú)的簡(jiǎn)單句子集合的人類對(duì)比評(píng)估中,它相比于谷歌已經(jīng)投入生產(chǎn)的基于短語的系統(tǒng)的翻譯誤差平均降低了60%。
以上是論文的abstract翻譯,隨著深度學(xué)習(xí)在nlp領(lǐng)域的應(yīng)用,加上一些新的算法的提出:如batchnormalization,各種LSTM變種,attention機(jī)制等,使得實(shí)際應(yīng)用性能提升。
不過google還是大廠,總是搞些大新聞。
如何用PyTorch實(shí)現(xiàn)遞歸神經(jīng)網(wǎng)絡(luò)
從Siri到谷歌翻譯,深度神經(jīng)網(wǎng)絡(luò)已經(jīng)在機(jī)器理解自然語言方面取得了巨大突破。
這些模型大多數(shù)將語言視為單調(diào)的單詞或字符序列,并使用一種稱為循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrentneuralnetwork/RNN)的模型來處理該序列。
但是許多語言學(xué)家認(rèn)為語言最好被理解為具有樹形結(jié)構(gòu)的層次化詞組,一種被稱為遞歸神經(jīng)網(wǎng)絡(luò)(recursiveneuralnetwork)的深度學(xué)習(xí)模型考慮到了這種結(jié)構(gòu),這方面已經(jīng)有大量的研究。
雖然這些模型非常難以實(shí)現(xiàn)且效率很低,但是一個(gè)全新的深度學(xué)習(xí)框架PyTorch能使它們和其它復(fù)雜的自然語言處理模型變得更加容易。
雖然遞歸神經(jīng)網(wǎng)絡(luò)很好地顯示了PyTorch的靈活性,但它也廣泛支持其它的各種深度學(xué)習(xí)框架,特別的是,它能夠?qū)τ?jì)算機(jī)視覺(computervision)計(jì)算提供強(qiáng)大的支撐。
PyTorch是FacebookAIResearch和其它幾個(gè)實(shí)驗(yàn)室的開發(fā)人員的成果,該框架結(jié)合了Torch7高效靈活的GPU加速后端庫與直觀的Python前端,它的特點(diǎn)是快速成形、代碼可讀和支持最廣泛的深度學(xué)習(xí)模型。
開始SPINN鏈接中的文章()詳細(xì)介紹了一個(gè)遞歸神經(jīng)網(wǎng)絡(luò)的PyTorch實(shí)現(xiàn),它具有一個(gè)循環(huán)跟蹤器(recurrenttracker)和TreeLSTM節(jié)點(diǎn),也稱為SPINN——SPINN是深度學(xué)習(xí)模型用于自然語言處理的一個(gè)例子,它很難通過許多流行的框架構(gòu)建。
這里的模型實(shí)現(xiàn)部分運(yùn)用了批處理(batch),所以它可以利用GPU加速,使得運(yùn)行速度明顯快于不使用批處理的版本。
SPINN的意思是堆棧增強(qiáng)的解析器-解釋器神經(jīng)網(wǎng)絡(luò)(Stack-augmentedParser-InterpreterNeuralNetwork),由Bowman等人于2016年作為解決自然語言推理任務(wù)的一種方法引入,該論文中使用了斯坦福大學(xué)的SNLI數(shù)據(jù)集。
該任務(wù)是將語句對(duì)分為三類:假設(shè)語句1是一幅看不見的圖像的準(zhǔn)確標(biāo)題,那么語句2(a)肯定(b)可能還是(c)絕對(duì)不是一個(gè)準(zhǔn)確的標(biāo)題?
(這些類分別被稱為蘊(yùn)含(entailment)、中立(neutral)和矛盾(contradiction))。
例如,假設(shè)一句話是「兩只狗正跑過一片場(chǎng)地」,蘊(yùn)含可能會(huì)使這個(gè)語句對(duì)變成「戶外的動(dòng)物」,中立可能會(huì)使這個(gè)語句對(duì)變成「一些小狗正在跑并試圖抓住一根棍子」,矛盾能會(huì)使這個(gè)語句對(duì)變成「寵物正坐在沙發(fā)上」。
特別地,研究SPINN的初始目標(biāo)是在確定語句的關(guān)系之前將每個(gè)句子編碼(encoding)成固定長(zhǎng)度的向量表示(也有其它方式,例如注意模型(attentionmodel)中將每個(gè)句子的每個(gè)部分用一種柔焦(softfocus)的方法相互比較)。
數(shù)據(jù)集是用句法解析樹(syntacticparsetree)方法由機(jī)器生成的,句法解析樹將每個(gè)句子中的單詞分組成具有獨(dú)立意義的短語和子句,每個(gè)短語由兩個(gè)詞或子短語組成。
許多語言學(xué)家認(rèn)為,人類通過如上面所說的樹的分層方式來組合詞意并理解語言,所以用相同的方式嘗試構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)是值得的。
下面的例子是數(shù)據(jù)集中的一個(gè)句子,其解析樹由嵌套括號(hào)表示:((Thechurch)((has(cracks(in(theceiling)))).))這個(gè)句子進(jìn)行編碼的一種方式是使用含有解析樹的神經(jīng)網(wǎng)絡(luò)構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)層Reduce,這個(gè)神經(jīng)網(wǎng)絡(luò)層能夠組合詞語對(duì)(用詞嵌入(wordembedding)表示,如GloVe)、和/或短語,然后遞歸地應(yīng)用此層(函數(shù)),將最后一個(gè)Reduce產(chǎn)生的結(jié)果作為句子的編碼:X=Reduce(“the”,“ceiling”)Y=Reduce(“in”,X)...etc.但是,如果我希望網(wǎng)絡(luò)以更類似人類的方式工作,從左到右閱讀并保留句子的語境,同時(shí)仍然使用解析樹組合短語?
或者,如果我想訓(xùn)練一個(gè)網(wǎng)絡(luò)來構(gòu)建自己的解析樹,讓解析樹根據(jù)它看到的單詞讀取句子?
這是一個(gè)同樣的但方式略有不同的解析樹的寫法:Thechurch)hascracksintheceiling)))).))或者用第3種方式表示,如下:WORDS:Thechurchhascracksintheceiling.PARSES:SSRSSSSSRRRRSRR我所做的只是刪除開括號(hào),然后用「S」標(biāo)記「shift」,并用「R」替換閉括號(hào)用于「reduce」。
但是現(xiàn)在可以從左到右讀取信息作為一組指令來操作一個(gè)堆棧(stack)和一個(gè)類似堆棧的緩沖區(qū)(buffer),能得到與上述遞歸方法完全相同的結(jié)果:1.將單詞放入緩沖區(qū)。
2.從緩沖區(qū)的前部彈出「The」,將其推送(push)到堆棧上層,緊接著是「church」。3.彈出前2個(gè)堆棧值,應(yīng)用于Reduce,然后將結(jié)果推送回堆棧。
4.從緩沖區(qū)彈出「has」,然后推送到堆棧,然后是「cracks」,然后是「in」,然后是「the」,然后是「ceiling」。
5.重復(fù)四次:彈出2個(gè)堆棧值,應(yīng)用于Reduce,然后推送結(jié)果。6.從緩沖區(qū)彈出「.」,然后推送到堆棧上層。7.重復(fù)兩次:彈出2個(gè)堆棧值,應(yīng)用于Reduce,然后推送結(jié)果。
8.彈出剩余的堆棧值,并將其作為句子編碼返回。我還想保留句子的語境,以便在對(duì)句子的后半部分應(yīng)用Reduce層時(shí)考慮系統(tǒng)已經(jīng)讀取的句子部分的信息。
所以我將用一個(gè)三參數(shù)函數(shù)替換雙參數(shù)的Reduce函數(shù),該函數(shù)的輸入值為一個(gè)左子句、一個(gè)右子句和當(dāng)前句的上下文狀態(tài)。該狀態(tài)由神經(jīng)網(wǎng)絡(luò)的第二層(稱為循環(huán)跟蹤器(Tracker)的單元)創(chuàng)建。
Tracker在給定當(dāng)前句子上下文狀態(tài)、緩沖區(qū)中的頂部條目b和堆棧中前兩個(gè)條目s1\s2時(shí),在堆棧操作的每個(gè)步驟(即,讀取每個(gè)單詞或閉括號(hào))后生成一個(gè)新狀態(tài):context[t+1]=Tracker(context[t],b,s1,s2)容易設(shè)想用你最喜歡的編程語言來編寫代碼做這些事情。
對(duì)于要處理的每個(gè)句子,它將從緩沖區(qū)加載下一個(gè)單詞,運(yùn)行跟蹤器,檢查是否將單詞推送入堆?;驁?zhí)行Reduce函數(shù),執(zhí)行該操作;然后重復(fù),直到對(duì)整個(gè)句子完成處理。
通過對(duì)單個(gè)句子的應(yīng)用,該過程構(gòu)成了一個(gè)大而復(fù)雜的深度神經(jīng)網(wǎng)絡(luò),通過堆棧操作的方式一遍又一遍地應(yīng)用它的兩個(gè)可訓(xùn)練層。
但是,如果你熟悉TensorFlow或Theano等傳統(tǒng)的深度學(xué)習(xí)框架,就知道它們很難實(shí)現(xiàn)這樣的動(dòng)態(tài)過程。你值得花點(diǎn)時(shí)間回顧一下,探索為什么PyTorch能有所不同。
圖論圖1:一個(gè)函數(shù)的圖結(jié)構(gòu)表示深度神經(jīng)網(wǎng)絡(luò)本質(zhì)上是有大量參數(shù)的復(fù)雜函數(shù)。深度學(xué)習(xí)的目的是通過計(jì)算以損失函數(shù)(loss)度量的偏導(dǎo)數(shù)(梯度)來優(yōu)化這些參數(shù)。
如果函數(shù)表示為計(jì)算圖結(jié)構(gòu)(圖1),則向后遍歷該圖可實(shí)現(xiàn)這些梯度的計(jì)算,而無需冗余工作。
每個(gè)現(xiàn)代深度學(xué)習(xí)框架都是基于此反向傳播(backpropagation)的概念,因此每個(gè)框架都需要一個(gè)表示計(jì)算圖的方式。
在許多流行的框架中,包括TensorFlow、Theano和Keras以及Torch7的nngraph庫,計(jì)算圖是一個(gè)提前構(gòu)建的靜態(tài)對(duì)象。
該圖是用像數(shù)學(xué)表達(dá)式的代碼定義的,但其變量實(shí)際上是尚未保存任何數(shù)值的占位符(placeholder)。圖中的占位符變量被編譯進(jìn)函數(shù),然后可以在訓(xùn)練集的批處理上重復(fù)運(yùn)行該函數(shù)來產(chǎn)生輸出和梯度值。
這種靜態(tài)計(jì)算圖(staticcomputationgraph)方法對(duì)于固定結(jié)構(gòu)的卷積神經(jīng)網(wǎng)絡(luò)效果很好。但是在許多其它應(yīng)用中,有用的做法是令神經(jīng)網(wǎng)絡(luò)的圖結(jié)構(gòu)根據(jù)數(shù)據(jù)而有所不同。
在自然語言處理中,研究人員通常希望通過每個(gè)時(shí)間步驟中輸入的單詞來展開(確定)循環(huán)神經(jīng)網(wǎng)絡(luò)。
上述SPINN模型中的堆棧操作很大程度上依賴于控制流程(如for和if語句)來定義特定句子的計(jì)算圖結(jié)構(gòu)。在更復(fù)雜的情況下,你可能需要構(gòu)建結(jié)構(gòu)依賴于模型自身的子網(wǎng)絡(luò)輸出的模型。
這些想法中的一些(雖然不是全部)可以被生搬硬套到靜態(tài)圖系統(tǒng)中,但幾乎總是以降低透明度和增加代碼的困惑度為代價(jià)。
該框架必須在其計(jì)算圖中添加特殊的節(jié)點(diǎn),這些節(jié)點(diǎn)代表如循環(huán)和條件的編程原語(programmingprimitive),而用戶必須學(xué)習(xí)和使用這些節(jié)點(diǎn),而不僅僅是編程代碼語言中的for和if語句。
這是因?yàn)槌绦騿T使用的任何控制流程語句將僅運(yùn)行一次,當(dāng)構(gòu)建圖時(shí)程序員需要硬編碼(hardcoding)單個(gè)計(jì)算路徑。
例如,通過詞向量(從初始狀態(tài)h0開始)運(yùn)行循環(huán)神經(jīng)網(wǎng)絡(luò)單元(rnn_unit)需要TensorFlow中的特殊控制流節(jié)點(diǎn)tf.while_loop。
需要一個(gè)額外的特殊節(jié)點(diǎn)來獲取運(yùn)行時(shí)的詞長(zhǎng)度,因?yàn)樵谶\(yùn)行代碼時(shí)它只是一個(gè)占位符。
#TensorFlow#(thiscoderunsonce,duringmodelinitialization)#“words”isnotareallist(it’saplaceholdervariable)so#Ican’tuse“l(fā)en”cond=lambdai,h:i
在這樣的框架(也稱為運(yùn)行時(shí)定義(define-by-run))中,計(jì)算圖在運(yùn)行時(shí)被建立和重建,使用相同的代碼為前向通過(forwardpass)執(zhí)行計(jì)算,同時(shí)也為反向傳播(backpropagation)建立所需的數(shù)據(jù)結(jié)構(gòu)。
這種方法能產(chǎn)生更直接的代碼,因?yàn)榭刂屏鞒痰木帉懣梢允褂脴?biāo)準(zhǔn)的for和if。
它還使調(diào)試更容易,因?yàn)檫\(yùn)行時(shí)斷點(diǎn)(run-timebreakpoint)或堆棧跟蹤(stacktrace)將追蹤到實(shí)際編寫的代碼,而不是執(zhí)行引擎中的編譯函數(shù)。
可以在動(dòng)態(tài)框架中使用簡(jiǎn)單的Python的for循環(huán)來實(shí)現(xiàn)有相同變量長(zhǎng)度的循環(huán)神經(jīng)網(wǎng)絡(luò)。
#PyTorch(alsoworksinChainer)#(thiscoderunsoneveryforwardpassofthemodel)#“words”isaPythonlistwithactualvaluesinith=h0forwordinwords:h=rnn_unit(word,h)PyTorch是第一個(gè)define-by-run的深度學(xué)習(xí)框架,它與靜態(tài)圖框架(如TensorFlow)的功能和性能相匹配,使其能很好地適合從標(biāo)準(zhǔn)卷積神經(jīng)網(wǎng)絡(luò)(convolutionalnetwork)到最瘋狂的強(qiáng)化學(xué)習(xí)(reinforcementlearning)等思想。
所以讓我們來看看SPINN的實(shí)現(xiàn)。代碼在開始構(gòu)建網(wǎng)絡(luò)之前,我需要設(shè)置一個(gè)數(shù)據(jù)加載器(dataloader)。
通過深度學(xué)習(xí),模型可以通過數(shù)據(jù)樣本的批處理進(jìn)行操作,通過并行化(parallelism)加快訓(xùn)練,并在每一步都有一個(gè)更平滑的梯度變化。
我想在這里可以做到這一點(diǎn)(稍后我將解釋上述堆棧操作過程如何進(jìn)行批處理)。以下Python代碼使用內(nèi)置于PyTorch的文本庫的系統(tǒng)來加載數(shù)據(jù),它可以通過連接相似長(zhǎng)度的數(shù)據(jù)樣本自動(dòng)生成批處理。
運(yùn)行此代碼之后,train_iter、dev_iter和test_itercontain循環(huán)遍歷訓(xùn)練集、驗(yàn)證集和測(cè)試集分塊SNLI的批處理。
fromtorchtextimportdata,datasetsTEXT=.ParsedTextField(lower=True)TRANSITIONS=.ShiftReduceField()LABELS=data.Field(sequential=False)train,dev,test=.splits(TEXT,TRANSITIONS,LABELS,wv_type='glove.42B')TEXT.build_vocab(train,dev,test)train_iter,dev_iter,test_iter=data.BucketIterator.splits((train,dev,test),batch_size=64)你可以在中找到設(shè)置訓(xùn)練循環(huán)和準(zhǔn)確性(accuracy)測(cè)量的其余代碼。
讓我們繼續(xù)。
如上所述,SPINN編碼器包含參數(shù)化的Reduce層和可選的循環(huán)跟蹤器來跟蹤句子上下文,以便在每次網(wǎng)絡(luò)讀取單詞或應(yīng)用Reduce時(shí)更新隱藏狀態(tài);以下代碼代表的是,創(chuàng)建一個(gè)SPINN只是意味著創(chuàng)建這兩個(gè)子模塊(我們將很快看到它們的代碼),并將它們放在一個(gè)容器中以供稍后使用。
importtorchfromtorchimportnn#subclasstheModuleclassfromPyTorch’sneuralnetworkpackageclassSPINN(nn.Module):def__init__(self,config):super(SPINN,self).__init__()self.config=configself.reduce=Reduce(config.d_hidden,config.d_tracker)ifconfig.d_trackerisnotNone:self.tracker=Tracker(config.d_hidden,config.d_tracker)當(dāng)創(chuàng)建模型時(shí),SPINN.__init__被調(diào)用了一次;它分配和初始化參數(shù),但不執(zhí)行任何神經(jīng)網(wǎng)絡(luò)操作或構(gòu)建任何類型的計(jì)算圖。
在每個(gè)新的批處理數(shù)據(jù)上運(yùn)行的代碼由SPINN.forward方法定義,它是用戶實(shí)現(xiàn)的方法中用于定義模型向前過程的標(biāo)準(zhǔn)PyTorch名稱。
上面描述的是堆棧操作算法的一個(gè)有效實(shí)現(xiàn),即在一般Python中,在一批緩沖區(qū)和堆棧上運(yùn)行,每一個(gè)例子都對(duì)應(yīng)一個(gè)緩沖區(qū)和堆棧。
我使用轉(zhuǎn)移矩陣(transition)包含的「shift」和「reduce」操作集合進(jìn)行迭代,運(yùn)行Tracker(如果存在),并遍歷批處理中的每個(gè)樣本來應(yīng)用「shift」操作(如果請(qǐng)求),或?qū)⑵涮砑拥叫枰竢educe」操作的樣本列表中。
然后在該列表中的所有樣本上運(yùn)行Reduce層,并將結(jié)果推送回到它們各自的堆棧。
defforward(self,buffers,transitions):#Theinputcomesinasasingletensorofwordembeddings;#Ineedittobealistofstacks,oneforeachexamplein#thebatch,thatwecanpopfromindependently.Thewordsin#eachexamplehavealreadybeenreversed,sothattheycan#bereadfromlefttorightbypoppingfromtheendofeach#list;theyhavealsobeenprefixedwithanullvalue.buffers=[list(torch.split(b.squeeze(1),1,0))forbintorch.split(buffers,1,1)]#wealsoneedtwonullvaluesatthebottomofeachstack,#sowecancopyfromthenullsintheinput;thesenulls#areallneededsothatthetrackercanrunevenifthe#bufferorstackisemptystacks=[[buf[0],buf[0]]forbufinbuffers]ifhasattr(self,'tracker'):self.tracker.reset_state()fortrans_batchintransitions:ifhasattr(self,'tracker'):#IdescribedtheTrackerearlierastaking4#arguments(context_t,b,s1,s2),buthereI#providethestackcontentsasasingleargument#whilestoringthecontextinsidetheTracker#objectitself.tracker_states,_=self.tracker(buffers,stacks)else:tracker_states=itertools.repeat(None)lefts,rights,trackings=[],[],[]batch=zip(trans_batch,buffers,stacks,tracker_states)fortransition,buf,stack,trackinginbatch:iftransition==SHIFT:stack.append(())eliftransition==REDUCE:rights.append(())lefts.append(())trackings.append(tracking)ifrights:reduced=iter(self.reduce(lefts,rights,trackings))fortransition,stackinzip(trans_batch,stacks):iftransition==REDUCE:stack.append(next(reduced))return[()forstackinstacks]在調(diào)用self.tracker或self.reduce時(shí)分別運(yùn)行Tracker或Reduce子模塊的向前方法,該方法需要在樣本列表上應(yīng)用前向操作。
在主函數(shù)的向前方法中,在不同的樣本上進(jìn)行獨(dú)立的操作是有意義的,即為批處理中每個(gè)樣本提供分離的緩沖區(qū)和堆棧,因?yàn)樗惺芤嬗谂幚韴?zhí)行的重度使用數(shù)學(xué)和需要GPU加速的操作都在Tracker和Reduce中進(jìn)行。
為了更干凈地編寫這些函數(shù),我將使用一些helper(稍后將定義)將這些樣本列表轉(zhuǎn)化成批處理張量(tensor),反之亦然。
我希望Reduce模塊自動(dòng)批處理其參數(shù)以加速計(jì)算,然后解批處理(unbatch)它們,以便可以單獨(dú)推送和彈出。
用于將每對(duì)左、右子短語表達(dá)組合成父短語(parentphrase)的實(shí)際組合函數(shù)是TreeLSTM,它是普通循環(huán)神經(jīng)網(wǎng)絡(luò)單元LSTM的變型。
該組合函數(shù)要求每個(gè)子短語的狀態(tài)實(shí)際上由兩個(gè)張量組成,一個(gè)隱藏狀態(tài)h和一個(gè)存儲(chǔ)單元(memorycell)狀態(tài)c,而函數(shù)是使用在子短語的隱藏狀態(tài)操作的兩個(gè)線性層(nn.Linear)和將線性層的結(jié)果與子短語的存儲(chǔ)單元狀態(tài)相結(jié)合的非線性組合函數(shù)tree_lstm。
在SPINN中,這種方式通過添加在Tracker的隱藏狀態(tài)下運(yùn)行的第3個(gè)線性層進(jìn)行擴(kuò)展。圖2:TreeLSTM組合函數(shù)增加了第3個(gè)輸入(x,在這種情況下為Tracker狀態(tài))。
在下面所示的PyTorch實(shí)現(xiàn)中,5組的三種線性變換(由藍(lán)色、黑色和紅色箭頭的三元組表示)組合為三個(gè)nn.Linear模塊,而tree_lstm函數(shù)執(zhí)行位于框內(nèi)的所有計(jì)算。
圖來自Chenetal.(2016)。
谷歌開源了TensorFlow,世界就要馬上被改變了嗎
Google開源了其第二代深度學(xué)習(xí)技術(shù)TensorFlow——被使用在Google搜索、圖像識(shí)別以及郵箱的深度學(xué)習(xí)框架。這在相關(guān)媒體圈、工程師圈、人工智能公司、人工智能研究團(tuán)隊(duì)里有了一些討論。
比較有趣的是,微軟亞洲研究院立刻向媒體發(fā)郵件表示,我們發(fā)布了開源分布式機(jī)器學(xué)習(xí)工具包(DMTK)。對(duì)于大眾來說,這件事讓人“困惑”。
從“深度學(xué)習(xí)”到“分布式系統(tǒng)”,太多概念大眾一知半解,現(xiàn)今給出的資料又讓人難以理解。而對(duì)于“Google開源TensorFlow”這一事件,各個(gè)公司、團(tuán)隊(duì)、學(xué)術(shù)權(quán)威也是眾說紛紜。
因此,出門問問為大家“破霧”,并講一講這次開源意味著什么。什么是深度學(xué)習(xí)?深度學(xué)習(xí)系統(tǒng)是什么?深度學(xué)習(xí)理論于2006年被提出,它通過模擬“人腦的神經(jīng)網(wǎng)絡(luò)”來解釋圖像、聲音和文本等數(shù)據(jù)。
但是目前的計(jì)算機(jī)還達(dá)不到模擬人腦數(shù)量龐大的神經(jīng)元(千億級(jí)),因此便有了用到成千上萬大型計(jì)算機(jī)(計(jì)算平臺(tái)集群)來吸收數(shù)據(jù)對(duì)其進(jìn)行自動(dòng)分類的“分布式深度學(xué)習(xí)系統(tǒng)”。
TensorFlow的起源和此次開源事件Google將自家研發(fā)的深度學(xué)習(xí)系統(tǒng)命名為“DistBelief”,它使得Google能夠同時(shí)處理成千上萬臺(tái)大型計(jì)算機(jī)的數(shù)據(jù),構(gòu)建更大型的神經(jīng)網(wǎng)絡(luò)和大規(guī)模訓(xùn)練。
Google的搜索、圖像識(shí)別及郵箱等均采用了該技術(shù)。一般情況下,深度學(xué)習(xí)系統(tǒng)都需要先設(shè)定好feature(特征),再學(xué)習(xí)如何分辨。
但GoogleDistBelief神奇的地方在于,“GoogleBrain”開發(fā)團(tuán)隊(duì)“XLab”曾用它在未事先獲取“貓的特征描述”信息的情況下,從大量YouTube視頻中區(qū)分出了哪些是貓的視頻。
這意味著深度學(xué)習(xí)系統(tǒng)“DistBelief”自行總結(jié)出了貓的feature(特征)!雖然這個(gè)案例的識(shí)別范圍、識(shí)別率有待提高(81.7%),但作為人工智能最經(jīng)典案例之一,為人工智能翻開了新的篇章。
而“貓”的事件,也讓曾經(jīng)的GoogleBrain開發(fā)團(tuán)隊(duì)“XLab”的核心人員、現(xiàn)在被李彥宏挖到百度的吳恩達(dá)得到了“GoogleBrain”之父的美譽(yù)。
不過,時(shí)代總是進(jìn)步,而“DistBelief”有缺陷。Google稱,雖然DistBelief非常成功,但它僅僅以神經(jīng)網(wǎng)絡(luò)為目的、十分局限,而且很難進(jìn)行配置。
另外,DistBelief牢牢綁定在Google的內(nèi)部基礎(chǔ)設(shè)施上,幾乎不可能將代碼與外界共享。因此,本文的主角,Google的第二代深度學(xué)習(xí)系統(tǒng)“TensorFlow”橫空出世了。
Google表示,TensorFlow在設(shè)計(jì)上尤其針對(duì)克服DistBelief的短板,靈活、更通用、易使用、更快,而且完全開源。
TensorFlow可以被架設(shè)在智能手機(jī)這樣小的設(shè)備上,甚至僅一塊電路板上,更靈活;TensorFlow可以被使用在很多計(jì)算平臺(tái),無論是智能手機(jī)還是大型計(jì)算機(jī)、單個(gè)CPU/GPU計(jì)算機(jī)還是成百上千GPU卡組成的分布式系統(tǒng),ARM的還是X86的構(gòu)架,更通用;TensorFlow支持多種編程語言,提供了很多深度學(xué)習(xí)模型庫,易使用;在很多指標(biāo)上,TensorFlow要比DistBelief要快一倍,更快。
但是,學(xué)術(shù)界和工程界的一些朋友并不喜歡這個(gè)“剛剛闖入”開源界的“小伙子”,判了它“意義不大”的死刑。
“TensorFlow”之所以“開源”卻不討好,是因?yàn)門ensorFlow不是第一個(gè)被開源的深度學(xué)習(xí)系統(tǒng),并且目前只開源了“單機(jī)版”,而非能夠識(shí)別貓的“分布式版本”。
除了并非第一以及只開源了單機(jī)版代碼這兩點(diǎn)外,Google開源TensorFlow這件事最被人詬病的地方在于,在“用事實(shí)”、“用數(shù)據(jù)”說話的學(xué)術(shù)界、工程界,Google并未用“數(shù)據(jù)對(duì)比”證明TensorFlow的“靈活、更通用、易使用”。
對(duì)于TensorFlow,出門問問的看法是,TensorFlow對(duì)學(xué)術(shù)界意義不大,但是對(duì)工程界意義挺大。
TensorFlow對(duì)工程界有意義:其它開源工具雖然眾多但對(duì)工程界很難有效使用Google這次開源的TensorFlow是一種人工智能(更具體的說是深度學(xué)習(xí))編程語言或計(jì)算框架,學(xué)術(shù)界從來都不缺少類似的開源工具,尤其是“單機(jī)版工具包”有很多。
但是學(xué)術(shù)界的工具往往更多專注在核心算法上,在系統(tǒng)和工程方面比較欠缺,工業(yè)界很難直接有效的使用,而Google的TensorFlow在架構(gòu)設(shè)計(jì),跨平臺(tái)可移植性,算法可擴(kuò)展性等等偏工程方面會(huì)做的比較好。
所以,TensorFlow對(duì)學(xué)術(shù)界的幫助比較小,但對(duì)工業(yè)界的幫助有很大潛在可能性。
比如語音識(shí)別、自然語言理解、計(jì)算機(jī)視覺、廣告等等都可以應(yīng)用這種深度學(xué)習(xí)算法,Google也因?yàn)樯疃葘W(xué)習(xí)系統(tǒng)的應(yīng)用使得Google語音識(shí)別水平提高25%。
有意義歸有意義,意義的大小是另一回事了。在這個(gè)信息交流頻繁的時(shí)代,沒有公司能隨便制造一個(gè)具有超大意義的事件或者跨時(shí)代的黑科技產(chǎn)品。
對(duì)于工程界,TensorFlow有意義但又不是神乎其神的東西,尤其是Google目前開源的“單機(jī)版”的TensorFlow意義要小一些。
因?yàn)樵诠こ探缋?#xff0c;若要完成一整件事,如識(shí)別語音,TensorFlow這種通用深度學(xué)習(xí)框架的存在更多是錦上添花,而非決定根本。
比如說在一個(gè)可以應(yīng)用的語音識(shí)別系統(tǒng)里,除了深度學(xué)習(xí)算法外,還有很多工作是專業(yè)領(lǐng)域相關(guān)的算法以及海量數(shù)據(jù)收集和工程系統(tǒng)架構(gòu)的搭建。其實(shí),對(duì)于中國來說,TensorFlow還有一個(gè)意義。
在人工智能大潮下許多人和公司想入局,但大都沒有能力理解并開發(fā)一個(gè)與國際同步的深度學(xué)習(xí)系統(tǒng),而TensorFlow的存在會(huì)大大降低深度學(xué)習(xí)在各個(gè)行業(yè)中的應(yīng)用難度。
至于弄懂TensorFlow要花費(fèi)大量時(shí)間的問題,就像很多公司用Linux或者h(yuǎn)adoop(一種分布式系統(tǒng)基礎(chǔ)架構(gòu))但很少有公司弄懂了所有源代碼一樣,可以把TensorFlow當(dāng)成一個(gè)黑盒,先快速用起來,之后再根據(jù)數(shù)據(jù)和專業(yè)領(lǐng)域知識(shí)來調(diào)整。
總的來說,如果Google按照其所說的那樣,在未來完全開源TensorFlow——包括其“分布式版本”,那么TensorFlow對(duì)工程界的影響會(huì)更明顯些——尤其對(duì)中國創(chuàng)業(yè)公司來說。
可以輸出擬合函數(shù)的神經(jīng)網(wǎng)絡(luò)框架
。
sigmoid函數(shù)的值域就在(0,1)內(nèi),所以你的輸出結(jié)果肯定在0到1之間;至于能否擬合是zhi要看情況的;如果原來可以擬合,那么更換輸出函數(shù)也可以,不過效果是否好就不敢保證了,雖然signoid做了一個(gè)同胚變換,但樣本畢竟不是真的在一個(gè)連續(xù)函數(shù)上,有時(shí)候誤差會(huì)導(dǎo)致變換時(shí)效果變差。
大腦的智慧就是一種非線性現(xiàn)象。人工神經(jīng)元處于激活或抑制二種不同的狀態(tài),這種行為在數(shù)學(xué)上表現(xiàn)為一種非線性關(guān)系。具有閾值的神經(jīng)元構(gòu)成的網(wǎng)絡(luò)具有更好的性能,可以提高容錯(cuò)性和存儲(chǔ)容量。
擴(kuò)展資料:(1)非線性:非線性關(guān)系是自然界的普遍特性。大腦的智慧就是一種非線性現(xiàn)象。人工神經(jīng)元處于激活或抑制二種不同的狀態(tài),這種行為在數(shù)學(xué)上表現(xiàn)為一種非線性關(guān)系。
具有閾值的神經(jīng)元構(gòu)成的網(wǎng)絡(luò)具有更好的性能,可以提高容錯(cuò)性和存儲(chǔ)容量。(2)非局限性:一個(gè)神經(jīng)網(wǎng)絡(luò)通常由多個(gè)神經(jīng)元廣泛連接而成。
一個(gè)系統(tǒng)的整體行為不僅取決于單個(gè)神經(jīng)元的特征,而且可能主要由單元之間的相互作用、相互連接所決定。通過單元之間的大量連接模擬大腦的非局限性。聯(lián)想記憶是非局限性的典型例子。
參考資料來源:百度百科-人工神經(jīng)網(wǎng)絡(luò)。
總結(jié)
以上是生活随笔為你收集整理的谷歌云计算技术基础架构,谷歌卷积神经网络的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的奇怪符号 -> 与 ...
- 下一篇: [人工智能-深度学习-72]:卷积神经网