• <sub id="pqc61"><p id="pqc61"></p></sub><sub id="pqc61"></sub>
    在线精品视频一区二区,亚洲中文字幕无码一久久区,正在播放肥臀熟妇在线视频,国内精品视频一区二区三区八戒 ,国产毛片三区二区一区,国产精品一区中文字幕,丰满少妇被猛烈进出69影院,国产成人无码
    您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
    此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
    人工智能開發(fā)者 正文
    發(fā)私信給AI研習(xí)社
    發(fā)送

    1

    以靜制動的TensorFlow Fold

    本文作者: AI研習(xí)社 2017-02-18 19:04
    導(dǎo)語:近日各種深度學(xué)習(xí)框架們交鋒的戰(zhàn)場就是動態(tài)計(jì)算圖,誰能在這場戰(zhàn)爭中取得優(yōu)勢,誰就把握住了未來用戶的流向。

    隨著深度學(xué)習(xí)的發(fā)展,深度學(xué)習(xí)框架之間競爭也日益激烈,新老框架紛紛各顯神通,想要在廣大DeepLearner的服務(wù)器上占據(jù)一席之地。近日它們交鋒的戰(zhàn)場就是動態(tài)計(jì)算圖,誰能在這場戰(zhàn)爭中取得優(yōu)勢,誰就把握住了未來用戶的流向。作為一名DeepLearner,如果能選中最適合的框架,就能在學(xué)習(xí)、研究和生產(chǎn)中提高自己的效率,步步領(lǐng)先。但要是上錯了船,文檔、性能、靈活性四處漏水,跳船之后還得游一段時間,這段時間可能都夠別人開到新大陸了。所以說了解框架發(fā)展,掌握最新形式,可謂是每個不甘人后的DeepLearner的必修課。

    近期各大框架發(fā)展的趨勢主要有兩個,一個是增加對動態(tài)圖計(jì)算的支持,另一個是在主編程語言上適應(yīng)廣大用戶的需求。最近比較火熱的動態(tài)計(jì)算圖相關(guān)的框架主要有DyNet、PyTorch和TensorFlow Fold,就是圍繞著這其中一個點(diǎn)或兩個點(diǎn)進(jìn)行的。

    目前在這場競爭中,TensorFlow Fold以其先進(jìn)的Dynamic Batching算法走在了其他框架的前面。為了方便大家了解TensorFlow Fold的特性,本文將會為大家厘清有關(guān)動態(tài)圖計(jì)算的一些概念,對比介紹DyNet、PyTorch和TensorFlow等框架的特性,重點(diǎn)講解TensorFlow Fold的核心算法和接口。

    本文分為五個部分:

    一、當(dāng)我們說動態(tài)計(jì)算圖的時候,我們指的是什么?

    二、框架競爭的焦點(diǎn):編程語言與動態(tài)計(jì)算圖

    三、以靜制動:巧妙的Dynamic Batching算法

    四、TensorFlow Fold:封裝在靜態(tài)框架上的動態(tài)接口

    五、總結(jié)

    | 當(dāng)我們說動態(tài)計(jì)算圖的時候,我們指的是什么?

    首先,我們要搞清楚深度學(xué)習(xí)框架所謂的“動態(tài)”和“靜態(tài)”究竟是按照什么標(biāo)準(zhǔn)劃分的。為了大家的直觀理解,我這里要引入一個系列比喻,房地產(chǎn)商(框架使用者)通過電子郵件(編程語言代碼)請建筑公司(深度學(xué)習(xí)框架)幫忙建造房子(計(jì)算圖) 。

    在靜態(tài)框架使用的是靜態(tài)聲明(static declaration)策略,計(jì)算圖的聲明和執(zhí)行是分開的,換成比喻的說法就是:建筑設(shè)計(jì)師畫建筑設(shè)計(jì)圖(聲明)和施工隊(duì)建造房子(執(zhí)行)是分開進(jìn)行的。畫設(shè)計(jì)圖的時候施工隊(duì)的建筑工人、材料和機(jī)器都還沒動,這也就是我們說的靜態(tài)。這個整個聲明和執(zhí)行的過程中涉及到兩個圖,這里我們分別給它們一個名字,聲明階段構(gòu)建的圖叫虛擬計(jì)算圖,在這個過程中框架需要將用戶的代碼轉(zhuǎn)化為可以一份詳細(xì)的計(jì)算圖,這份計(jì)算圖一般會包含計(jì)算執(zhí)行順序和內(nèi)存空間分配的策略,這些策略的制定一般是這個過程最消耗時間的部分;執(zhí)行階段構(gòu)建的圖叫實(shí)體計(jì)算圖,這個過程包括為參數(shù)和中間結(jié)果實(shí)際分配內(nèi)存空間,并按照當(dāng)前需求進(jìn)行計(jì)算等,數(shù)據(jù)就在這張實(shí)體計(jì)算圖中計(jì)算和傳遞。不過這里要注意一點(diǎn)的是,虛擬計(jì)算圖中的部件并不需要在每一次執(zhí)行中都轉(zhuǎn)化為實(shí)體計(jì)算圖。像建筑設(shè)計(jì)圖上畫了三層別墅的規(guī)劃,但建筑隊(duì)可以在按客戶的要求只建下面的兩層。另外一張?jiān)O(shè)計(jì)圖可以用多少次也沒有規(guī)定死,所以說靜態(tài)只是相對于下面的動態(tài)框架而言,并不是說靜態(tài)框架就只能按部就班。常見的靜態(tài)框架有TensorFlow、MXNet、Theano等。

    而動態(tài)框架則不同,使用的是動態(tài)聲明(dynamic declaration)策略,聲明和執(zhí)行一起進(jìn)行的。比喻一下就是設(shè)計(jì)師和施工隊(duì)是一起工作的,設(shè)計(jì)師看郵件的第一句如“要有一個二十平方米的臥室”,馬上畫出這個臥室的設(shè)計(jì)圖交給施工隊(duì)建造,然后再去看第二句。這樣虛擬計(jì)算圖和實(shí)體計(jì)算圖的構(gòu)建就是同步進(jìn)行的了。因?yàn)榭梢詫?shí)時的計(jì)劃,動態(tài)框架可以根據(jù)實(shí)時需求構(gòu)建對應(yīng)的計(jì)算圖,在靈活性上,動態(tài)框架會更勝一籌。Torch、DyNet、Chainer等就是動態(tài)框架。

    靈活很好,但也不是沒有代價的。不然的話現(xiàn)在流行的框架中,就不會是靜態(tài)框架占比更高了。靜態(tài)框架將聲明和執(zhí)行分開有什么好處呢?最大的好處就是在執(zhí)行前就知道了所有的需要進(jìn)行操作,所以可以對圖中各節(jié)點(diǎn)計(jì)算順序和內(nèi)存分配進(jìn)行合理的規(guī)劃,這樣就可以就較快的執(zhí)行所需的計(jì)算。就像房地產(chǎn)商郵件里說,“建一個棟大樓,樓頂建個花園,大樓旁邊建一個游泳館”,但這個順序并不是最優(yōu)的,設(shè)計(jì)師畫完圖之后,發(fā)現(xiàn)大樓的選址旁邊要預(yù)留游泳館的空間,游泳館和大樓可以同時開工,并不用等到大樓的樓頂花園建完,就在圖上把這些信息標(biāo)注了出來,施工隊(duì)就可以更高效地施工。這樣一來,靜態(tài)框架的執(zhí)行效率相對來說就更高一些。這一點(diǎn)是動態(tài)框架的劣勢,因?yàn)樗看我?guī)劃、分配內(nèi)存、執(zhí)行的時候,都只能看到局部的需求,所以并不能做出全局最優(yōu)的規(guī)劃和內(nèi)存分配。

    另外的好處是對于建筑公司的管理層(框架開發(fā)者),因?yàn)橐粡堅(jiān)O(shè)計(jì)圖可以被反復(fù)施工,所以設(shè)計(jì)師畫圖的快慢影響就小地多了,對于一個要建幾年的工程設(shè)計(jì)師畫圖的時間是三天還是五天影響不大,靜態(tài)建筑公司不用花費(fèi)太多資源去培訓(xùn)設(shè)計(jì)師的畫圖速度(縮短構(gòu)建虛擬計(jì)算圖的時間,主要是規(guī)劃計(jì)算順序和分配內(nèi)存空間的時間)。而動態(tài)建筑公司就不同了,因?yàn)槊拷ㄒ惶追孔踊蛞慌欧孔泳鸵匦庐嬕槐樵O(shè)計(jì)圖,對于一個幾周的子項(xiàng)目來說,花三天畫圖還是五天就影響比較大了。所以動態(tài)框架對虛擬計(jì)算圖的構(gòu)建速度有較高的要求。當(dāng)然因?yàn)閯討B(tài)框架每步構(gòu)建和計(jì)算只是虛擬計(jì)算圖的一個局部,需要策略不會太復(fù)雜,所以制定策略也快得多。

    在過去的大部分的深度學(xué)習(xí)項(xiàng)目中,不管使用的是靜態(tài)框架還是動態(tài)框架,我們實(shí)際上都只用到了構(gòu)建靜態(tài)實(shí)際計(jì)算圖的能力。為什么這樣說呢?因?yàn)樵谝话阍趯?shù)據(jù)投入模型進(jìn)行訓(xùn)練或預(yù)測之前,往往會有一個預(yù)處理的步奏。在預(yù)處理的時候,我們會將圖片縮放裁剪,將句子拼接截?cái)啵顾麄冏優(yōu)橥瑯拥男螤畲笮。缓髮⒓梢粋€個批次(min-batch),等待批次訓(xùn)練或預(yù)測。這些不同的輸入到模型中其實(shí)運(yùn)行的是同一個計(jì)算圖。換成房地產(chǎn)的說法,就是說用戶的需求雖然略有區(qū)別,但經(jīng)過房地產(chǎn)商的努力,他們都同意要同一款房子。不管是房地產(chǎn)商選的是靜態(tài)建筑公司還是動態(tài)建筑公司,建造的房子都是統(tǒng)一的小區(qū)樣式。

    這樣作的好處是可以充分利用GPU和多核CPU的并行計(jì)算能力。這種能力可以怎么理解呢?建筑施工隊(duì)里面有很多的砌墻工人,100個人取砌一堵1米的墻并不會比10個人快上10倍(能實(shí)際工作的可能還是只有10個人),而讓他們同時砌十堵1米的墻,可能所花的時間可能和砌一堵墻幾乎一樣快。如果有很多可以通過這樣并行來加速的工作,那整個工程所需要的時間也就可以大大縮短。GPU能夠幾十倍上百倍地提高計(jì)算速度是現(xiàn)代深度學(xué)習(xí)發(fā)展的一個關(guān)鍵,畢竟現(xiàn)在的深度模型很大程度上還是很依賴調(diào)參,需要快速地迭代。能否利用這種加速能力常常就是一次訓(xùn)練幾個小時還是幾周的區(qū)別,也是決定一個項(xiàng)目能不能做的關(guān)鍵。

    然而,并不是所有項(xiàng)目的數(shù)據(jù)都可以預(yù)處理成相同的形狀和尺寸。例如自然語言處理中的語法解析樹,源代碼中的抽象語法樹,以及網(wǎng)頁中的DOM樹等,形狀的不同本身就是非常重要的特征,不可剝離。這些數(shù)據(jù)就像充滿個性的藝術(shù)家,每個人對房子該是什么樣的都有自己的想法,買房的主要目的就是想彰顯個性,你想讓他們買一樣的房子,對不起,做不到。

    這樣一來,對于每一個樣例,我們都需要一個新的計(jì)算圖,這種問題我們需要使用構(gòu)建動態(tài)計(jì)算圖的能力才能夠解決。這種問題我們可以叫它多結(jié)構(gòu)輸入問題,因?yàn)檫@個問題中計(jì)算圖的動態(tài)需求是輸入帶來的。不同框架這個問題的求解能力可以分為三個程度:第一層,無法計(jì)算,對于所有樣本都要求同樣的結(jié)構(gòu),在TensorFlow Fold出來之前所有正常使用的靜態(tài)框架處于這個層次。第二層,能計(jì)算但不夠高效,不同批次的樣本之間可以有不同的結(jié)構(gòu),但同一個批次樣本都是同一個結(jié)構(gòu),因?yàn)闊o法利用GPU和多核CPU的并行計(jì)算能力,不能高效計(jì)算,目前所有的動態(tài)框架屬于這個層次。第三層,能高效計(jì)算,能夠在同一個批次里包含不同結(jié)構(gòu)的樣本,這個層次的多結(jié)構(gòu)輸入問題有些論壇上也叫Dynamic Batching問題, TensorFlow Fold的核心算法Dynamic Batching算法剛好同名,TensorFlow Fold和以后實(shí)現(xiàn)Dynamic Batching算法的框架處于這個層次。

    多結(jié)構(gòu)輸入問題早已存在,可用的模型諸如遞歸神經(jīng)網(wǎng)絡(luò)(Recursive Neural Networks)也提出許久,但因?yàn)闆]有辦法高效實(shí)現(xiàn),研究和使用者寥寥無幾。因此,當(dāng)我們說各大框架的動態(tài)計(jì)算圖的時候,我們關(guān)心的不僅僅是他們誰更容易做到,更重要的是能不能高效地做到。動態(tài)計(jì)算圖問題之一的多結(jié)構(gòu)輸入問題的高效計(jì)算問題一旦解決,就會大大促進(jìn)樹狀網(wǎng)絡(luò)甚至更復(fù)雜模型和數(shù)據(jù)集的發(fā)展。

    但多結(jié)構(gòu)輸入問題并不是唯一的動態(tài)圖計(jì)算問題,這里給大家舉另外一個例子,即計(jì)算圖的結(jié)構(gòu)要依賴于自身的計(jì)算結(jié)果的情況,類比就是后面房子怎么建要看前面建得怎么樣,這種問題更加復(fù)雜,所有的動態(tài)框架都可以輕松解決,而靜態(tài)框架目前是做不到,不過目前還沒發(fā)現(xiàn)有具體問題需要這樣操作,我們這里不作仔細(xì)討論。

    | 框架競爭的焦點(diǎn):編程語言與動態(tài)計(jì)算圖

    在動態(tài)計(jì)算圖爭鋒下面,還隱含著另外一重較量,編程語言的支持。上文我們將代碼比作電子郵件,那編程語言就是像英語、中文這樣的語言。當(dāng)前深度學(xué)習(xí)界最受歡迎的語言莫過于Python了,此外C++也因?yàn)槠浔旧淼母咝г诠I(yè)界頗得青睞。現(xiàn)在大多主流框架都支持這兩種語言,他們是就像機(jī)器學(xué)習(xí)界的中英文。不過Torch是一個例外,它使用的是比較小眾的Lua,這實(shí)際上是它最大一塊短板,因?yàn)槭褂肔ua做一些數(shù)據(jù)處理并不方便,使用者經(jīng)常要使用Python之類的語言進(jìn)行數(shù)據(jù)清洗等操作,然后在轉(zhuǎn)化為Lua可以讀取的形式。這一點(diǎn)使得無數(shù)使用者在不同語言的切換中紛紛投向TensorFlow、MXNet的懷抱。即使去年年中Facebook推出TorchNet這個Torch升級版也沒有挽回太多的人氣,因?yàn)門orchNet用的也是Lua。

    在DyNet出現(xiàn)前,Python和C++上還沒有一個比較高效的動態(tài)計(jì)算框架(如Chainer效率并不高)。這個由多所大學(xué)和公司的二十多位研究者共同發(fā)布新框架,一下子就找準(zhǔn)了自己的定位,即在深度學(xué)習(xí)框架中語言最好(Python/C++)且動態(tài)計(jì)算最強(qiáng)。他們通過對動態(tài)聲明的圖構(gòu)建流程的優(yōu)化,大大提高了構(gòu)建虛擬計(jì)算圖的速度,也就是說他們的建筑設(shè)計(jì)師畫圖和規(guī)劃做得飛起。該框架在LSTM和BiLSTM等部分測試中超過了Chainer、Theano和TensorFlow,并且在當(dāng)時Theano和TensorFlow難以實(shí)現(xiàn)的樹狀模型TreeLSTM的測試中也遠(yuǎn)遠(yuǎn)打敗了Chainer,所以DyNet一出來吸引住了不少使用者。

    然而好景不長,Torch不愧是有Facebook支持的公司,很快就推出了據(jù)說內(nèi)部使用已久的PyTorch,將Torch移植到了Python,補(bǔ)足了自己最后一塊短板。這下子就厲害了,不僅挽留住了人氣,借助Python的力量甚至有機(jī)會從TensorFlow這位老大手里奪下一塊蛋糕。

    但是不管是DyNet還是PyTorch,沒有解決多結(jié)構(gòu)輸入問題的高效計(jì)算。它們雖然對不同的批次(mini-batch)可以給出不同的計(jì)算圖。但同一個批次內(nèi)部的樣本的形狀還是要求一致,并沒有一個成熟的解決方案來應(yīng)對這種情況。就是說他們每建一棟樓或一批樓的可以重新設(shè)計(jì),但同時開工的同一批樓的樣式一定是一樣的。

    面對新老對手的挑戰(zhàn),TensorFlow作為深度學(xué)習(xí)框架界的霸主也不能無動于衷,終于給出了自己關(guān)于動態(tài)計(jì)算圖高效計(jì)算的答案——TensorFlow Fold,也就是我們今天要講的主角。這主角出場瞬時就hold住了場面,在Reddit上就有人立馬評論“... pip uninstall pytorch!”。從上一部分我們知道,TensorFlow其實(shí)是一個靜態(tài)框架,天生在解決動態(tài)計(jì)算圖問題上處于劣勢。你說它一個靜態(tài)的框架,怎么就解決了動態(tài)計(jì)算圖的問題呢?(其實(shí)只是解決了多結(jié)構(gòu)輸入的問題)這中間究竟有什么奧秘,讓筆者為大家娓娓道來。

    | 以靜制動:巧妙的Dynamic Batching算法

    TensorFlow Fold解決問題的核心技術(shù)叫Dynamic Batching,這個技術(shù)能夠構(gòu)建一個能夠模擬任意形狀和大小的動態(tài)計(jì)算圖的靜態(tài)圖,原本不同樣本的動態(tài)計(jì)算圖都會被重寫成能夠被這個計(jì)算圖高效計(jì)算的形式。這樣就巧妙地解決了動態(tài)計(jì)算圖的高效計(jì)算問題。打比喻就是,建筑公司請了一位計(jì)算機(jī)科學(xué)家寫了一個自動化辦公軟件,每當(dāng)房地產(chǎn)商提出一個個性社區(qū)問題的時候,這個軟件就會把一張通用的設(shè)計(jì)圖告訴設(shè)計(jì)師去設(shè)計(jì);然后對于每一批樓的需求這個軟件都會生成對應(yīng)的施工指南,只要按照這個指南的指示,施工就可以通過多次建造通用設(shè)計(jì)圖中的一部分來完成這批樓的建造;在施工指南中軟件已經(jīng)合并每次建造時重復(fù)的工作,這樣施工隊(duì)可以并行施工,高效地完成工程。

    更妙的是,這個技術(shù)并不僅在TensorFlow上能夠使用,對于其他深度學(xué)習(xí)框架完全能夠適用。可以預(yù)見的是,如果短期內(nèi)沒有更好的解決方案,這個技術(shù)很可能會被其他框架的開發(fā)者移植到他們自己的框架上,變成MXNet Fold,PyTorch Fold等。

    那為什么用靜態(tài)計(jì)算圖模擬動態(tài)計(jì)算圖是可能的?因?yàn)殡m然動態(tài)計(jì)算圖的形狀和大小千變?nèi)f化,但對于一個模型來說它們的基本組件卻可以簡單劃分為兩種:Tensor(張量)和Operation(操作)。

    Tensor,可以看做各種各樣的數(shù)據(jù)塊,主要包括輸入的樣本和計(jì)算結(jié)果,Tensor的類型可以按照shape(形狀)和data type(數(shù)據(jù)類型)劃分,具有相同shape和data type的Tensor可以被劃分為一類,就像相同大小和材質(zhì)的磚頭;這里的shape并不包括batch size,它就像磚頭的個數(shù),一疊不管是十塊還是五塊,只要磚頭的大小材質(zhì)一樣,我們認(rèn)為是同一個類。

    Operation,并不是是指加減乘除這樣最底層的操作,而是指一塊小的計(jì)算子圖,一塊計(jì)算子圖接受某種確定類型的Tensor作為輸入,并輸出某種確定類型的Tensor。這塊計(jì)算子圖在動態(tài)構(gòu)建圖的過程中并不會被拆開,而是作為一個整體被適用,比如RNN的Cell或其他用戶自己定義的一些固定的操作組合。

    對于某一個模型如樹狀RNN來說,但它只會有限種Operation和Tensor類型,當(dāng)我們將這些Operation和Tensor類型放到一起,我們就有了一個通用子圖,這時候只需要一些控制部件控制這個每次子圖執(zhí)行的部分(上文有提到每次執(zhí)行的實(shí)體計(jì)算圖可以只是虛擬計(jì)算圖的一部分)以及組合方式,我們就可以模擬對應(yīng)模型所有可能的計(jì)算圖。達(dá)成這種控制只需TensorFlow的三個部件:tf.gather、tf.concat和tf.while_loop。

    說完通用子圖的組成,我們再說說Dynamic Batching怎么將不同結(jié)構(gòu)的計(jì)算圖重寫成可以用通用子圖計(jì)算的形式。Dynamic Batching是一個貪婪(greedy)的算法,它接受一個有向無環(huán)計(jì)算圖作為輸入:

    • 給圖中的每一個節(jié)點(diǎn)(操作)標(biāo)注一個深度,所有沒有任何依賴的節(jié)點(diǎn)標(biāo)注為深度0,依賴的節(jié)點(diǎn)深度最大為d的節(jié)點(diǎn)的深度標(biāo)注為d+1;

    • 在圖中插入pass-through(直通)的操作,使得第d+1層只依賴于第d層;

    • 將同一深度涉及相同操作的節(jié)點(diǎn)合并到一起,方便并行計(jì)算;

    • 將同一深度的計(jì)算結(jié)果按Tensor類型(包括Tensor的形狀和數(shù)值類型)有序拼接在一起;

    • 將輸入原始計(jì)算圖中的每條邊標(biāo)記上(深度,數(shù)據(jù)類型,序號),對應(yīng)它們可以獲取上一層計(jì)算結(jié)果的位置。

    對于一批不同結(jié)構(gòu)的計(jì)算圖,我們可以把它們看做不連通的大圖同樣處理。上面算法的第三步會將這批圖中同一深度的相同操作進(jìn)行合并,方便并行計(jì)算。說完圖的構(gòu)建,我們再說說怎么執(zhí)行:算法在每次迭代中執(zhí)行一個深度的計(jì)算,使用tf.while_loop從深度0一直執(zhí)行到最大深度。在每一個深度中,tf.gather根據(jù)上面第五步的標(biāo)記為各個Operation獲取當(dāng)前深度各條輸入邊的Tensor,如果某個Operation沒有獲取到任何Tensor,說明當(dāng)前深度這個Operation不需要執(zhí)行計(jì)算。Operation執(zhí)行完后tf.concat將相同Tensor類型的計(jì)算結(jié)果拼接在一起,提供給下一個深度的計(jì)算。

    以靜制動的TensorFlow Fold

    上面這一幅圖來著官方論文,左邊是Dynamic Batching為二叉TreeRNN構(gòu)建的通用計(jì)算圖。右邊是一顆簡單的語法解析樹。通用計(jì)算圖中有兩種Tensor,代表單詞的編碼整數(shù)、詞向量/hidden向量的128維向量。Operation也只有兩個一個詞向量查表操作(embed lookup)和一個RNN的Cell。圖中g(shù)ather和concat之間的直連表示直通(pass-through)操作。右邊的語法解析樹可以分為三層計(jì)算被執(zhí)行:第一層,將1、3、5通過詞向量查表操作,輸出3個128維的詞向量;第二層,1和3對應(yīng)的詞向量通過RNN Cell輸出一個128維的隱含層向量,5對應(yīng)的詞向量直通輸出;第三層,上一層計(jì)算的隱含層向量和5對應(yīng)的詞向量通過RNN Cell,輸出一個128維的隱含層向量。計(jì)算完畢。

    那這個算法的效果怎么樣呢?它在TreeLSTM的實(shí)驗(yàn)中,8核英特爾CPU的可以加速20多倍,而英偉達(dá)GTX-1080上可以加速100倍左右。這個加速比是采用Dynamic Batching算法批處理中平均每個樣本執(zhí)行的平均時間和單個樣本不作批處理的執(zhí)行時間之比。這里不包含構(gòu)建虛擬圖所需要的時間。

    | TensorFlow Fold:封裝在靜態(tài)框架上的動態(tài)接口

    上面的Dynamic Batching的算法很繁瑣,但不用當(dāng)心,這個過程是由框架自動完成的,作為框架的使用者,我們只要知道怎么調(diào)用官方給出來的接口就可以了。新推出的TensorFlow Fold就是一個TensorFlow的封裝,設(shè)計(jì)參考了函數(shù)式編程的一些思想,目的就是方便用戶快速地構(gòu)建動態(tài)計(jì)算圖。下面我們來簡單地瀏覽一下,要進(jìn)一步了解可以去看官方的教學(xué)文檔。

    TensorFlow Fold提供了一些函數(shù)專門用來處理序列(x1,...,xn):

    • Map(f):計(jì)算[f(x1) ,...,f(xn)]將函數(shù)f應(yīng)用到每一個序列的元素,比如將句子中的每一個詞轉(zhuǎn)化為詞向量;

    • Fold(g, z):計(jì)算g(...,g(z, x1), x2), ...,xn ),比如說展開一個RNN(循環(huán)神經(jīng)網(wǎng)絡(luò));

    • Reduce ():計(jì)算g(Reduce(g)[x,...,xn/2],Reduce(g)[xn/2 ,...,xn],將函數(shù)g應(yīng)用到一顆平衡二叉樹上,比如對序列中的元素作max或sum-pooling。

    由于TensorFlow原本的基本單元Tensor不適合用于構(gòu)建動態(tài)圖,所以Fold引入新的基本組件Block。Block有明確的一個輸入類型和一個輸出類型,包括:

    1. Input:來著編程語言如Python中元素,比如字典等;

    2. Tensor:擁有數(shù)據(jù)類型和形狀的TensorFlow基本模塊;

    3. Tuple (t1 ,...,t):括號中的每一個t表示對應(yīng)位置的類型;

    4. Sequence ():一個不定長的擁有類型為t的元素的序列;

    5. Void:單元類型。這些基本類型可以相互嵌套,比如一個Block的輸入類型可以是Input類型的Tuple。

    用來創(chuàng)建Block的基本函數(shù)有:

    1. Scalar:將Python標(biāo)量轉(zhuǎn)化為Tensor;

    2. Tensor:將Numpy數(shù)組轉(zhuǎn)化為Tensor;

    3. Function ():創(chuàng)建一個Operation;

    4. InputTransform ():用于預(yù)處理Python類型。

    用來組合Block的基本函數(shù)有:

    1. b1>>b2,流水線(pipeline):將b的輸出作為b的輸入;

    2. Record({l1b1,..., lnbn}): 接受一個Python字典為輸入,對字典中key值為l的value應(yīng)用;

    3. OneOf (b1,...,bn):根據(jù)輸入條件應(yīng)用b1,...bn中的一個;

    4. Optional (b):OneOf的特例,如果輸入不為None,應(yīng)用b;

    5. AllOf (b1,...,bn):輸入應(yīng)用中的每一個。

    用來組合Block的高級函數(shù)有:

    1. Composition():流水線的升級版,流水線只能處理串行的流程,Composition()創(chuàng)建一個Scope對象,在這個Scope的縮進(jìn)范圍內(nèi),采用b.reads(b1,...,bn )來讀取多個數(shù)據(jù)流,可以用于構(gòu)建多分支結(jié)構(gòu);

    2. ForwardDeclaration():用來創(chuàng)建遞歸結(jié)構(gòu),這個函數(shù)可以先定義一個預(yù)先占位的表達(dá)式expr,等這個表達(dá)式定義完再用expr.resolve_to(expr_def),將表達(dá)式遞歸地代入,這是用來創(chuàng)建樹結(jié)構(gòu)計(jì)算圖必不可少的工具。

    | 總結(jié)

    在動態(tài)圖計(jì)算領(lǐng)域TensorFlow Fold目前領(lǐng)先一步,卻也不是高枕無憂,只要MXNet, PyTorch等競爭對手抓緊把Dynamic Batching算法實(shí)現(xiàn)出來,或進(jìn)一步想出更好的解決方案,就能很快趕上。而且TensorFlow Fold目前只支持TensorFlow 1.0版本,但只有盡快支持所有版本,才能讓更多的用戶使用上。另外工具的發(fā)展也會帶動學(xué)科的進(jìn)步,隨著動態(tài)計(jì)算圖的實(shí)現(xiàn)難度的下降和計(jì)算效率的提高,研究者們會越來越多地進(jìn)入這個領(lǐng)域,可以預(yù)期的是接下來一段時間肯定會有更多復(fù)雜結(jié)構(gòu)的模型和數(shù)據(jù)集涌現(xiàn)出來。未來將會如何,諸君盡請期待。

    雷鋒網(wǎng)按:本文原作者劉思聰,首發(fā)于知乎專欄AI帶路黨

    雷鋒網(wǎng)

    相關(guān)文章:

    TensorFlow 全網(wǎng)最全學(xué)習(xí)資料匯總之TensorFlow的技術(shù)應(yīng)用【4】

    Tensorflow 全網(wǎng)最全學(xué)習(xí)資料匯總之框架平臺的綜合對比【3】

    Tensorflow 全網(wǎng)最全學(xué)習(xí)資料匯總之Tensorflow 的入門與安裝【2】

    Tensorflow 全網(wǎng)最全學(xué)習(xí)資料匯總之Tensorflow的迭代更新【1】

    以靜制動的TensorFlow Fold

    分享:
    相關(guān)文章

    編輯

    聚焦數(shù)據(jù)科學(xué),連接 AI 開發(fā)者。更多精彩內(nèi)容,請?jiān)L問:yanxishe.com
    當(dāng)月熱門文章
    最新文章
    請?zhí)顚懮暾埲速Y料
    姓名
    電話
    郵箱
    微信號
    作品鏈接
    個人簡介
    為了您的賬戶安全,請驗(yàn)證郵箱
    您的郵箱還未驗(yàn)證,完成可獲20積分喲!
    請驗(yàn)證您的郵箱
    立即驗(yàn)證
    完善賬號信息
    您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
    立即設(shè)置 以后再說
    主站蜘蛛池模板: 国产内射性高湖| 亚洲色大成网站www久久九九| 天天天日日日夜夜夜夜摸| 国内少妇偷人精品免费| 无码中文字幕天天AV天天爽| 精品久久久久久无码专区不卡| 中文字幕无码人妻丝袜| 欧美在线看片a免费观看| 一本色道久久综合亚洲精品按摩| 久久噜噜噜久久亚洲va久| 日本无码欧美一区精品久久| 无套内内射视频网站| 永久免费无码网站在线观看| 无码伊人久久大杳蕉中文无码| 深夜福利18| 城口县| 白嫩少妇无套内谢视频| 久久精品国产大片免费观看| www亚洲无码| 日韩人妻无码精品一专区二区三区| 最近中文国语字幕在线播放| 亚洲视频a| 久久波多野结衣av| 亚洲人成影院在线播放高清| 日韩国产精品中文字幕| cosplay女黄网站| 国产精品久久久久久白浆色欲| 午夜国产不卡在线观看视频| 国模雨珍浓密毛大尺度150p| 亚洲熟妇中文字幕五十中出| 色婷婷久久综合中文久久一本`| 亚洲日韩在线中文字幕| 亚洲深深色噜噜狠狠网站| 影音先锋少妇| 影音先锋最新色资源站| 久久综合国产| 美女黄18以下禁止观看| 亚洲人成电影网站色| 95sao国产在线观看免费| jk白丝喷浆| 国产精品美腿一区在线看|