五. Tensorflow圖的可視化
? ? ? ? ?深度學(xué)習(xí)模型通常使用錯綜復(fù)雜的神經(jīng)網(wǎng)絡(luò)丰滑。比如但绕,文獻(xiàn)【19】描述的谷歌Inception模型就是一個有36000個獨立單元的卷積神經(jīng)網(wǎng)絡(luò)。而文獻(xiàn)【8】描述的某種長短時記憶模型(LSTM)用到了15000個節(jié)點王悍。為了使用和調(diào)優(yōu)如此復(fù)雜的網(wǎng)絡(luò)柒莉,必須依賴強有力的可視化工具纲熏。Tensorboard是Tensorflow的可視化儀表盤。本章節(jié)將講述Tensorboard的功能棚辽。
A. Tensorboard的特性
Tensorboard的核心特性就是構(gòu)建明細(xì)易懂計算圖的可視化界面技竟。如下圖例子可以看到Tensorboard是如何展示計算圖的。
? ? ? ? name scope(命名空間)是Tensorflow里面一個重要可視化分類方法屈藐。它可以把同屬于一個命名空間的算子榔组,關(guān)系,輸入和輸出顯示在同一個方框圖內(nèi)联逻。下圖展示了搓扯,從上圖擴展一個layer1命名空間的詳細(xì)算法細(xì)節(jié)。
? ? ? ? ?另外包归,Tensorboard允許用戶追蹤單個變量在訓(xùn)練過程中的變化情況锨推。你可以附加兩類總結(jié)算子到計算圖上去生成報告(scalar summaries和histogram summaries)。Scalar summaries顯示的是張量伸縮的進(jìn)度圖公壤,也就是在某次訓(xùn)練迭代的采樣數(shù)據(jù)换可。這樣你可以看到訓(xùn)練的精確度和損失變化情況。Histogram summaries節(jié)點允許用戶去追蹤數(shù)值分布情況厦幅,比如神經(jīng)網(wǎng)絡(luò)的權(quán)重或者softmax估值分布沾鳄。下圖展示了這兩種報告。
我們注意到Tensorboard采用了網(wǎng)頁交互形式确憨。一旦你的計算圖被加載進(jìn)來译荞,你就可以觀察模型,監(jiān)控算子運行休弃。具體的Tensorboard在線演示可以在這里找到:https://www.tensorflow.org/tensorboard/index.html
B. Tensorboard的實操
為了把Tensorboard整合到你的Tensorflow代碼吞歼,你需要至少做三步。第一玫芦,你需要使用命名空間來規(guī)劃你的節(jié)點浆熔。第二,你需要給你的算子增加某種類型的報告桥帆。最后第三部医增,你需要調(diào)用SummaryWriter去把Summaries得到的張量寫到文件中去。與其分別去寫每一個summaries老虫,還不如調(diào)用tf.merge_all_summaries()整合所有的summaries叶骨,然后一次性寫入文件。下面展示了Tensorboard的樣例代碼祈匙。
with tf.name_scope(’Variables’):
x = tf.constant(1.0)
y = tf.constant(2.0)
tf.scalar_summary(’z’, x + y)
merged = tf.merge_all_summaries()
writer = tf.train.SummaryWriter(’/tmp/log’, graph)
with tf.Session(graph=graph):forstepinrange(1000):
writer.add_summary(
merged.eval(), global_step=step)
六. 比較其它深度學(xué)習(xí)框架
除了Tensorflow忽刽,我們還能找到其它一些深度學(xué)習(xí)框架。人氣比較高的有Theano夺欲,Torch和Caffe跪帝。在這一章,我們會探索這些框架和Tensorflow的異同點些阅,進(jìn)行一系列定性和定量的分析伞剑。
A. 定性分析
下面我們分別比較上述三種深度學(xué)習(xí)框架和Tensorflow的差異。下圖則是匯總了這個比較市埋。
? ? ? ? 1)Theano:在我們需要討論的三種Tensorflow的替代框架中黎泣,Theano是最像Tensorflow的。如同Tensorflow一樣缤谎,Theano的編程模型也是聲明式而不是命令式的基于計算圖抒倚。而且,Theano也使用符號差異化坷澡。然后Theano有一個比較長時間的圖編譯時間托呕,因為它需要把Python代碼轉(zhuǎn)化為C++/CUDA代碼【5】。一方面频敛,這是因為Theano采用了很多高級圖優(yōu)化的算法【5】镣陕,而Tensorflow僅僅是做了子圖消減優(yōu)化。對比Tensorboard姻政, Theano的可視化工具可以用可憐來形容呆抑。它除了輸出一些可讀的文字來表示圖或靜態(tài)圖像,它還需要一個插件來生成類似交互式網(wǎng)頁可視化汁展,剩下來的東西鹊碍,Theano就是泛善可陳了。
? ? ? ? 2)Torch:Torch和Tensorflow根本不同的地方是Torch是C/CUDAde后端實現(xiàn)食绿,加上Lua的前端編程接口侈咕。Lua確實是相當(dāng)快的腳本語言,可以快速構(gòu)建原型系統(tǒng)器紧,但是相對于Python耀销,它算是非主流。雖然Lua 具備各種性能和功能上的優(yōu)勢铲汪,但是對于工業(yè)界而言熊尉,對比Tensorflow的Python API而言罐柳,就顯得曲高和寡了。除了編程語言的考量狰住,Torch的編程模型也和Tensorflow不同张吉。它采用命令式編程,也不聲明計算圖催植。這就要求程序員還要仔細(xì)安排算子執(zhí)行的順序肮蛹。這也暗示了Torch在前向和反向傳播計算梯度的時候,是用符號到數(shù)值而不是符號到符號差異化來優(yōu)化创南。
? ? ? ? 3)Caffe:Caffe和Tensorflow有著天壤之別伦忠。Caffe的模型創(chuàng)建擁有MATLAB和Python編程接口,主要使用谷歌的協(xié)議緩沖語言稿辙,這樣帶來和Python截然不同的編程體驗昆码。另外,在Caffe里面的基本構(gòu)建單元是神經(jīng)網(wǎng)絡(luò)的層邓深,而不是Tensorflow里面的算子未桥。這樣Tensorflow算是更為底層的框架。和Torch相似芥备,Caffe也不是專注于構(gòu)建計算圖冬耿,或者符號。所以計算導(dǎo)數(shù)是通過符號到數(shù)值的方法萌壳。Caffe特別適合于開發(fā)卷積神經(jīng)網(wǎng)絡(luò)亦镶,用于圖像識別任務(wù)。但是袱瓮,它就沒有Tensorflow那樣在神經(jīng)網(wǎng)絡(luò)領(lǐng)域具備普適性缤骨。比如Caffe在架構(gòu)上不支持循環(huán)架構(gòu),而這時RNN尺借,LSTM這樣神經(jīng)網(wǎng)絡(luò)的基本構(gòu)造绊起。另外,Caffe也不支持分布式系統(tǒng)燎斩。
B. 定量分析
? ? ? ? 接下來虱歪,我們會對這幾種框架做定量分析來,同時給出深度學(xué)習(xí)框架評估的整體發(fā)展趨勢栅表。
? ? ? ? 文獻(xiàn)【20】的研究是由博世研發(fā)中心在2016年3月進(jìn)行的笋鄙,他們對比了Tensorflow,Torch怪瓶,Theano和Caffe這幾種不同的神經(jīng)網(wǎng)絡(luò)架構(gòu)萧落。他們在Intel Xeon E5-1650 v2 CPU @ 3.50 GHz and an NVIDIA GeForce GTX Titan X/PCIe/SSE2 GPU這樣配置的機器上安裝Ubuntu14.04,然后跑LeNet CNN模型【21】來看不同的框架的性能如何。他們特別留意神經(jīng)網(wǎng)絡(luò)的前向傳播速度找岖,因為他們相信這和框架部署策略有關(guān)陨倡;還有反向傳播速度,這是和訓(xùn)練模型性能相關(guān)宣增。我們摘要了他們結(jié)論如下表玫膀,這個結(jié)果是在兩種情況下得到的矛缨,(a)是一個CPU跑12個線程爹脾,(b)是GPU。從結(jié)果來看箕昭,有趣的是Tensorflow無論是在CPU還是在GPU都跑不過Torch灵妨。最有意思的是Tensorflow在跑GPU的時候成績掉的很厲害,是倒數(shù)第一落竹。文獻(xiàn)【20】的作者注意到這可能是由于測試Tensorflow使用的是NVIDIA的cuDNNv2泌霍,而其他庫用的是v3. 他們在文中強調(diào),這么做是因為Tensorflow的官方文檔建議這么配置cuDNN的版本述召。
? ? ? ? 我們能夠拿到的第二個測試來源是文獻(xiàn)【22】卷積神經(jīng)網(wǎng)絡(luò)評測平臺的結(jié)果朱转,你可以在github上找到他們。它是由Facebook的一個AI研究工程師Soumith Chintala維護(hù)的积暖。我們參考的結(jié)果是2016年五月25日提交的藤为。Chintala提交了圍繞卷積神經(jīng)網(wǎng)絡(luò)的許多框架的實現(xiàn),當(dāng)然包括Tensorflow夺刑,Torch和Caffe缅疟。Theano沒有參加評測,所以我們這里看不到它的有關(guān)數(shù)據(jù)遍愿。該作者聲稱的硬件配置是6-core Intel Core i7-5930K CPU @ 3.50GHz配有an NVIDIA Titan X graphics chip存淫,跑的是Ubuntu14.04。該評測也分別給出了正向傳播和反向傳播的速度如下表:
? ? ? ? 不出意料沼填,Tensorflow是僅次于Torch的框架桅咆。最后我們來看一下文獻(xiàn)【5】的評測,這是由Theano開發(fā)團(tuán)隊在2016年5月9日提交的報告坞笙。除了CNN模型之外岩饼,他們還測試了之前我們提到的AlexNet架構(gòu),測試還包括了在Penn Treebank【24】上跑LSTM的結(jié)果羞海。他們的評測針對小模型(200個節(jié)點的單隱藏層忌愚,每個序列長20),統(tǒng)計每秒處理多少單詞却邓;針對大模型(兩個650個節(jié)點的隱藏層硕糊,序列長為50)。在文獻(xiàn)【5】還提到一個中等模型的測試,這里我們不做討論简十,評測結(jié)果如下圖所示:
? ? ? ? 這個結(jié)果是在硬件配置NVIDIA Digits DevBox with 4 Titan X GPUs and an Intel Core i7-5930K CPU的機器上跑出來的檬某。,而且他們給所有框架使用的都是cuDNN v4螟蝙。Caffe的運行結(jié)果沒有在列恢恼。在他們的評測結(jié)果里,Tensorflow在小模型表現(xiàn)最好胰默,大模型稍差场斑。這個表格來源于文獻(xiàn)【5】。
當(dāng)Tensorflow剛剛發(fā)布的時候牵署,表現(xiàn)奇差漏隐,整個深度學(xué)習(xí)社區(qū)都表示失望。隨后奴迅,不斷推出的新版本青责,不斷改進(jìn)和增強功能,給深度學(xué)習(xí)帶來了驚人的進(jìn)步取具。這也反映在我們的一系列挑選工作中脖隶。最早的三次評測【20】表明,Tensorflow完全不能和Torch暇检,Theano和Caffe相提并論产阱。但是僅僅兩個月后,【22】的結(jié)果已經(jīng)顯示Tensorflow追趕上來占哟,到了最后的評測【5】的時候心墅,Tensorflow已經(jīng)處在領(lǐng)先的地位了。我們預(yù)測Tensorflow的性能還會繼續(xù)改進(jìn)榨乎,前途無量怎燥。特別是在分布式處理的場景下,目前和可以預(yù)見的將來蜜暑,Tensorflow都將是領(lǐng)先地位铐姚。
七. Tensorflow的實際應(yīng)用
? ? ? ? Tensorflow發(fā)布才短短六個月,學(xué)術(shù)界和工業(yè)界還沒有能夠完全擁抱Tensorflow肛捍,一些現(xiàn)有應(yīng)用的移植還需要時間隐绵,新的研究還需時日。但是一點毋庸置疑拙毫,谷歌已經(jīng)積極應(yīng)用和推廣Tensorflow在各種任務(wù)中【19】【25】【26】【27】【28】依许。我們將選擇性的看一看這些應(yīng)用是怎么使用Tensorflow的。
A. 學(xué)術(shù)界
? ? ? ? 首先提到Tensorflow的是2016年二月的文獻(xiàn)【29】缀蹄,來自谷歌大腦組的Szegedy峭跳,Ioffe和Vanhoucke發(fā)表的文章膘婶。他們用Tensorflow改進(jìn)了Inception模型【19】,主要用于圖像識別蛀醉。作者給出了ImageNet測試集最高5檔3.08%偏差的好成績悬襟。
? ? ? ? 在文獻(xiàn)【25】,Ramsunder等人對于藥品發(fā)現(xiàn)的多任務(wù)網(wǎng)絡(luò)的討論使用了Tensorflow拯刁,這是斯坦福大學(xué)和谷歌之間的聯(lián)合研究工作脊岳。這篇文章描述了使用Tensorflow構(gòu)建深層神經(jīng)網(wǎng)絡(luò)做虛擬掃描來選擇潛在的候選藥物。這是為了幫助醫(yī)藥公司和科研社區(qū)尋找為治療疾病的新藥垛玻。
? ? ? ? August和Ni應(yīng)用Tensorflow創(chuàng)建了遞歸神經(jīng)網(wǎng)絡(luò)優(yōu)化動態(tài)解耦割捅,一種在量子內(nèi)存抑制誤差的技術(shù)∝舶【30】作者旨在維持量子糾纏態(tài)棺牧,這是構(gòu)建通用量子計算機的關(guān)鍵需求巫糙。
最后朗儒,文獻(xiàn)【31】研究了自然語言處理的sequence-to-sequence模型,作者使用Tensorflow参淹,采用滑動窗口技術(shù)去做字符級別的英語到拉脫維亞語在音頻和視頻內(nèi)容的翻譯醉锄。作者用這個方法去分類電視節(jié)目,廣播節(jié)目浙值,并且聚類單個的故事恳不。
B. 工業(yè)界
? ? ? ? 除了谷歌之外,工業(yè)界還很少有人使用Tensorflow开呐,至少公開的情況來看是這個樣子烟勋。所以我們來看看谷歌的Tensorflow應(yīng)用情況。
? ? ? ? 最近筐付,谷歌在調(diào)整它的核心業(yè)務(wù)算法PageRank【32】系統(tǒng)RankBrain【33】卵惦,使用的技術(shù)就是Tensorflow。RankBrain使用大規(guī)模分布式深度神經(jīng)網(wǎng)絡(luò)來做搜索排序瓦戚。根據(jù)文獻(xiàn)【33】沮尿,超過15%發(fā)給www.google.com的查詢是全新查詢。RankBrain系統(tǒng)可以通過相似性比對來給出未知查詢建議较解。
? ? ? ? 另一個應(yīng)用是谷歌的智能郵件回復(fù)系統(tǒng)【27】畜疾。谷歌已經(jīng)整合了智能回復(fù)功能在其郵件系統(tǒng)的Inbox里面。系統(tǒng)使用遞歸神經(jīng)網(wǎng)絡(luò)和特定LSTM模塊進(jìn)行序列到序列的學(xué)習(xí)和自然語言理解印衔。一個編碼器映射一個語料庫到一個“思維向量”啡捶,而解碼器則在語法和語義上合成正確的回復(fù),然后以建議的形式呈現(xiàn)給用戶奸焙。
? ? ? ? 在文獻(xiàn)【26】瞎暑,谷歌在使用卷積神經(jīng)網(wǎng)絡(luò)做圖像識別和自動文本翻譯徒溪。作為谷歌手機的內(nèi)置功能,對于用戶來說的外文可以被算法識別金顿,然后翻譯成用戶識別語言臊泌,并且呈現(xiàn)在原文所在圖像上。這種方法可以用來翻譯圖片里的街道名揍拆。文獻(xiàn)【26】特別強調(diào)如果部署這種算法在低端手機設(shè)備和慢速網(wǎng)絡(luò)上渠概。因此,神經(jīng)網(wǎng)絡(luò)訓(xùn)練小模型嫂拴,然后應(yīng)用于資源首先的場景也在發(fā)展播揪。
? ? ? ? 最后,我們已經(jīng)注意到谷歌旗下的DeppMind筒狠,著名的AI研究機構(gòu)已經(jīng)把他們的研究平臺從Torch7轉(zhuǎn)移到Tensorflow了猪狈。【28】有消息稱【17】辩恼,DeepMind使用Tensorflow雇庙,在谷歌新發(fā)布的張量處理單元(TPU)上訓(xùn)練他們的AlphaGo模型。該文獻(xiàn)作者就是谷歌DeepMind的雇員灶伊,揭示了為什么Tensorflow對于DeepMind有好處的四個理由:
? ? ? ? 1)Tensorflow的大規(guī)模應(yīng)用是構(gòu)建在谷歌云平臺上疆前,可以很容易提供充足的計算力。
? ? ? ? 2)Tensorflow支持TPU這樣的硬件擴展聘萨。
? ? ? ? 3)Tensorflow的主要編程接口是Python竹椒,這是谷歌的核心編程語言,要比Lua能夠得到更好的支持米辐。
? ? ? ? 4)Tensorflow是能夠很好支持多GPU的框架胸完。
八. 總結(jié)
? ? ? ? 我們已經(jīng)從各個方面完整的討論了Tensorflow,這種基于計算圖的開源深度學(xué)習(xí)庫的各種特性翘贮,包括能夠快速計算梯度赊窥,它固有的支持分布式計算的特性,強有力可視化工具择膝。它能夠在很細(xì)顆粒度構(gòu)建神經(jīng)網(wǎng)絡(luò)誓琼,允許高度定制模型,同時也支持一些快速原型搭建的封裝庫肴捉,比如TFLearn腹侣。相比Torch,Theano之類的框架齿穗,Tensorflow增加了新特征和改進(jìn)了現(xiàn)有特性傲隶。它在性能方面的表現(xiàn),開始不盡人意窃页,但是隨著時間的推移跺株,不斷的隨著新庫的發(fā)布在改進(jìn)复濒。
? ? ? ? 我們注意到對于Tensorflow的分布式運行性能的評測目前開展的很少。我們認(rèn)為這是很重要的一環(huán)乒省,也是學(xué)術(shù)界需要深入研究的一點巧颈。
? ? ? ? Tensorflow已經(jīng)在開源社區(qū)取得了相當(dāng)?shù)娜藲夂蛷娪辛Φ牡谌街С帧9雀枰呀?jīng)做出了明智的決定袖扛。我們相信砸泛,Tensorflow不僅僅對于它的所有者有利,也會惠及更為廣大的科研社區(qū)蛆封;它會打開通往更快更大規(guī)模的人工智能之門唇礁。
附錄-1
#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" A one-hidden-layer-MLP MNIST-classifier. """
from__future__importabsolute_importfrom__future__importdivisionfrom__future__importprint_function
# Import the training data (MNIST)
fromtensorflow.examples.tutorials.mnistimportinput_data
importtensorflow as tf
# Possibly download and extract the MNIST data set.
# Retrieve the labels as one-hot-encoded vectors.mnist = input_data.read_data_sets("/tmp/mnist",
one_hot=True)
# Create a new graph
graph = tf.Graph()
# Set our graph as the one to add nodes to
with graph.as_default():
# Placeholder for input examples (None =
variable dimension)
examples = tf.placeholder(shape=[None, 784],
dtype=tf.float32)
# Placeholder for labels
labels = tf.placeholder(shape=[None, 10],
dtype=tf.float32)
weights =
tf.Variable(tf.truncated_normal(shape=[784,
10], stddev=0.1))
bias = tf.Variable(tf.constant(0.1, shape=[10]))
# Apply an affine transformation to the input
features
logits = tf.matmul(examples, weights) + bias
estimates = tf.nn.softmax(logits)
# Compute the cross-entropy
cross_entropy = -tf.reduce_sum(labels*tf.log(estimates),
reduction_indices=[1])
loss = tf.reduce_mean(cross_entropy)
# Create a gradient-descent optimizer that
minimizes the loss.
# We choose a learning rate of 0.01
optimizer =
tf.train.GradientDescentOptimizer(0.5).minimize(loss)
# Find the indices where the predictions were
correct
correct_predictions = tf.equal(
tf.argmax(estimates, dimension=1),
tf.argmax(labels, dimension=1))
accuracy =
tf.reduce_mean(tf.cast(correct_predictions,
tf.float32))
with tf.Session(graph=graph) as session:
tf.initialize_all_variables().run()forstepinrange(1001):
# And finally the loss
example_batch, label_batch =
mnist.train.next_batch(100)
feed_dict = {examples: example_batch, labels:
label_batch}
ifstep % 100 == 0:
_, loss_value, accuracy_value =
session.run(
[optimizer, loss, accuracy],
feed_dict=feed_dict
)print("Loss at time {0}: {1}".format(step,
loss_value))print("Accuracy at time {0}:
{1}".format(step, accuracy_value))
optimizer.run(feed_dict)
參考文獻(xiàn)