一圖抵千言:帶你瞭解最直觀的神經網絡架構可視化

一張好的圖抵得上一千個等式。

clipboard.png

神經網絡是複雜、多維、非線性的數組運算。如何在避免過於複雜或重複的狀況下呈現深度學習模型架構的重要特徵呢?又該以何種方式清晰直觀、啓發性地呈現它們呢?(好看也是加分項!)不管研究仍是教學項目對此都沒有固定標準。本文咱們就來了解一下可視化整個神經網絡架構和特定模塊的工具和技巧。html

基線git

AlexNet 是突破性的架構,它使卷積網絡(CNN)成爲處理大型圖像分類任務的主要機器學習算法。介紹 AlexNet 的論文呈現了一張很好的圖,可是好像還缺點什麼……github

clipboard.png

AlexNet 架構圖示。(圖源:《ImageNet Classification with Deep Convolutional Neural Networks》 http://www. cs.toronto.edu/~fritz/a bsps/imagenet.pdf )算法

不需費力也能看出這張圖的上半部分被意外裁掉了,而這張圖會貫穿後續全部的幻燈片、參考文獻等。在我看來,這說明在深度學習的研究中,可視化並不受重視(固然也有一些例外,好比線上期刊 Distill)。數組

有人會辯解:開發新算法和調參是真正的科學/工程,但視覺呈現則屬於藝術領域,且毫無價值。我徹底不一樣意這種觀點!瀏覽器

固然,對於運行程序的計算機而言,代碼沒有縮進或者變量命名比較模糊可能無傷大雅。但對人類則否則。學術論文不是一種發現方式,而是交流方式。網絡

以另外一個複雜的理論——量子場論爲例。若是你想要呈現電子-正電子的湮沒過程,就要建立一個 μ 子-反 μ 子對,下圖是費曼圖(一階項):架構

clipboard.png

圖源: https://www. hep.phy.cam.ac.uk/~thom son/partIIIparticles/handouts/Handout_4_2011.pdfapp

這很可愛對吧?但這張圖沒有什麼藝術性可言。它只是散射振幅的圖形表示,這張圖中的每條線都是一個傳播子,每個頂點都表示點和點的交互。這張圖能夠直接變成下式:框架

clipboard.png

我可能更偏向於「使事情更簡單」,就像我在 JavaScript 中處理複雜張量運算同樣,並且提早可視化結果是一件很酷的事情。在量子力學和深度學習中,咱們均可以用張量結構作大量線性代數的運算。事實上,甚至有人用 Pytorch 實現愛因斯坦求和約定。

解釋神經網絡的層

在瞭解網絡架構以前,咱們先來關注一下網絡的基本構建模塊——層。例如,能夠用下式描述長短時間記憶模型(LSTM)單元:

clipboard.png

固然,若是你對矩陣乘法熟悉的話,能夠很容易地解出這些等式。但解出這些等式是一回事,理解它們就是另外一回事了。我第一次看到 LSTM 的公式時就能夠解出來,但我不知道它們是什麼意思。

我所說的「理解」不是指精神上的啓蒙,而是創建一個咱們可以使用的心理模型(用於解釋、簡化、修改和預測 what-if 情景等)。通常而言,圖表會比口頭說明更清晰:

clipboard.png

圖源: http:// colah.github.io/posts/2 015-08-Understanding-LSTMs/

《理解 LSTM 網絡》是一篇關於 LSTM 的好文章,這篇文章一步步解釋了 LSTM 的原理。這篇文章使我靈光一現,將一組看似隨機的乘法集合轉換爲寫做(閱讀)數據的合理方法。

下圖是一個更清晰的 LSTM 圖:

clipboard.png

圖源: https:// eli.thegreenplace.net/2 018/minimal-character-based-lstm-implementation/

我認爲:一張好的圖抵得上一千個公式。

這幾乎適用於任何模塊。咱們能夠將概念可視化,如 dropout:

clipboard.png

圖源:論文《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》( http://www. cs.toronto.edu/~rsalakh u/papers/srivastava14a.pdf )

圖示可用於解釋由更小的模塊(例如幾個後面的卷積)組成的複合模塊。看一下這個 Inception 模塊的圖:

clipboard.png

圖源:論文《Rethinking the Inception Architecture for Computer Vision》( https:// arxiv.org/abs/1512.0056 7 )

每一個可視化的圖像都是不一樣的——不只是風格不一樣,它強調的重點和抽象的內容也不一樣。那麼哪些是重要的呢?層數、層與層之間的鏈接、卷積核大小仍是激活函數?這都要視狀況而定。抽象意味着「獨立思考事物聯繫和屬性的過程」。難點在於肯定哪些要重點強調,以及哪些能夠簡要歸納。

例如,在批歸一化(Batch Normalization)的圖中,重點是逆推過程:

clipboard.png

圖源: https:// kratzert.github.io/2016 /02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html

數據可視化與數據藝術

你可能以爲我是想讓深度學習的文章看起來更具吸引力。但是讓圖表更好看也沒什麼壞處啊。當我在進行數據探索時,我通常會用好看的配色方案,以使讀者得到更好的閱讀體驗。個人主要觀點是將可視化圖像轉變爲更高效的溝通手段。

因此,更好看就意味更好嗎?不必定。Lisa Charlotte Rost 的文章《The Line between Data Vis and Data Art》就頗有見地地解釋了兩者之間的區別。

clipboard.png

圖源: https:// lisacharlotterost.github.io /2015/12/19/Meaning-and-Beauty-in-Data-Vis/

如下圖爲例:

clipboard.png

圖源: https://www. graphcore.ai/posts/what -does-machine-learning-look-like

很美吧。對我來講,它看起來就像是有生命的——像是一個帶有細胞器的細胞。可是咱們能從中推斷出什麼嗎?你猜獲得它其實就是 AlexNet 嗎?

舉另外一個例子,這是一個更注重美學而非其
clipboard.png
解釋價值的多層感知器動圖圖示:

圖源: http:// chumo.github.io/Sinapsi s/

要明確的是:只要咱們不混淆藝術價值和教育價值,則數據藝術自身就有價值。若是你喜歡個人觀點,那麼我鼓勵你用像火花或五光十色的大腦這樣的 3D 動畫可視化真正的卷積網絡。

有時候這種取捨也沒那麼明確。像下面這張圖,它體現的是數據的可視化仍是數據的藝術?

clipboard.png

圖源:論文《Going Deeper with Convolutions》( https:// arxiv.org/abs/1409.4842 Christian )

我猜你確定會說:「這顯然是數據可視化」。就本例而言,咱們的意見出現了分歧。雖然這張圖的配色方案很好,並且類似結構的重複看起來很愉快,但要根據這張圖實現這個網絡仍是有難度的。固然,你能獲得這個網絡架構的重點——即層的數量以及模塊的結構,可是要想重現該網絡只有這些還不夠(至少在沒有放大鏡的狀況下是沒法實現這個網絡的)。

爲了讓圖像變得清楚,出版物通常會爲數據藝術留有必定的空間。例如,在一個用於檢測皮膚狀態的網絡中,咱們能夠看到 Inception v3 特徵提取層的圖。很明顯,做者只是使用該模型並用圖表示了出來,而沒有解釋其內部工做原理:

clipboard.png

圖源: https:// cs.stanford.edu/people/ esteva/nature/

爲了研究激活所選通道的視覺模式,你要如何對下面的兩幅圖進行分類?

clipboard.png

圖源: https:// distill.pub/2017/featur e-visualization/appendix/

我會把下方的圖做爲數據可視化的很好示例。迷幻的圖像不意味着就是數據藝術。這個例子的重點在於網絡架構抽象化以及相關數據的呈現(激活給定通道的輸入圖像)。

解釋性架構圖

咱們看了一些層圖示的例子,以及與神經網絡架構相關的數據藝術。

下面就來了解一下神經網絡架構的(數據)可視化。下圖是 VGG16 的架構,VGG 16 是用於圖像分類的標準網絡。

clipboard.png

圖源: https:// blog.heuritech.com/2016 /02/29/a-brief-report-of-the-heuritech-deep-learning-meetup-5/

咱們能夠看到每一步的張量大小以及操做(用顏色標記)。它不是抽象的——盒子大小與張量形狀相關。但厚度和通道數量並不成比例。

還有相似的方式是顯示每一個通道的值,如 DeepFace 工做示例圖:

clipboard.png

圖源: https:// research.fb.com/publica tions/deepface-closing-the-gap-to-human-level-performance-in-face-verification/

這樣的圖不只限於計算機視覺。下面是一個將文本轉換爲顏色的例子:

clipboard.png

圖源: https:// heartbeat.fritz.ai/how- to-train-a-keras-model-to-generate-colors-3bc79e54971b

若是目的是呈現網絡架構同時說明內部工做原理的話,這樣的圖就顯得很是有用了。在教程中它們彷佛尤爲有用,例如 http:// karpathy.github.io/2015 /05/21/rnn-effectiveness/ 。

抽象的架構圖

但對大型模型而言,解釋性的圖可能太過複雜或太過具體,以致於它們沒法在一個圖內呈現全部可能的層。因此就要用抽象圖。通常而言,節點表示運算,箭頭表示張量流。比較 VGG-19 和 ResNet-34:

clipboard.png

圖源:論文《Deep Residual Learning for Image Recognition》( https:// arxiv.org/abs/1512.0338 5 )

咱們能夠看出,上圖存在一些冗餘,由於有一些重複使用的單元。因爲圖像可能很長,最好是找到其模式並對其進行合併。這樣的層級結構使理解概念以及從視覺角度呈現它們變得更加簡單(除非咱們只想建立 GoogLeNet 的數據藝術圖)。

舉個例子,咱們看一下 Inception-ResNet-v1 的圖:

clipboard.png

圖源:論文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》( https:// arxiv.org/abs/1602.0726 1 )

我喜歡這個圖的構成——咱們能夠看到發生了什麼以及重複使用了哪些模塊。

另外一個讓我對概念更加明晰的圖是用於圖像分割的 U-Net 的圖:

clipboard.png

圖源: https:// lmb.informatik.uni-freiburg.de /people/ronneber/u-net/

注意,這裏的節點表示張量,箭頭表示操做。我發現這張圖很是清楚——咱們能夠看到張量的形狀、卷積操做以及池化操做。由於原始的 U-Net 架構不是很複雜,所以咱們能夠不看它的層級結構。

當咱們想用更復雜的構造塊建立清晰的圖的話會稍微複雜一點。若是要重現網絡,咱們須要瞭解網絡的細節:

通道的數量;

每一個最大池化中的卷積;

最大池化的數量;

批歸一化或 dropout;

激活函數(是否是用 ReLu 函數?是在 BN 以前仍是以後?)

下面就是一個很好的抽象圖示例:

clipboard.png

圖源: https:// deepsense.ai/deep-learn ing-for-satellite-imagery-via-image-segmentation/ )

這張圖在配色方面還能夠作得更好,不過我喜歡它簡潔的形式。圖中還清晰地說明了通道數量,將每個複雜的層清晰地分解爲其構造塊,保留了全部的細節(注意 3 級層級結構)。

還有一個表示神經網絡模塊層次的有趣方法:

clipboard.png

圖源: http:// deepscene.cs.uni-freiburg.de /

神經網絡架構可視化的自動化工具

你能夠手動繪製網絡。像 Chris Olah 那樣用 Inkscape、若是你喜歡 LaTeX 的話能夠用 TikZ,也能夠用其餘工具。你也能夠自動生成圖像。

我但願你能意識到你已經在用視覺表示——代碼(文本就是一種視覺表示!)——來與計算機進行交互。對某些項目而言,代碼就足夠了,尤爲是若是你用的是簡潔的框架(如 Keras 或 PyTorch)。對更復雜的架構來講,圖會增長一些解釋性的價值。

TensorBoard:

TensorBoard 能夠說是最經常使用的網絡可視化工具。下圖所示是一個 TensorFlow 網絡圖:

clipboard.png

這張圖是否提供了可讀性較高的神經網絡的概述?

我認爲沒有。

雖然這張圖呈現了計算結構,但仍是有些囉嗦(好比將偏置項做爲單獨的操做添加進去)。此外,它掩蓋了網絡最重要的部分:操做中的核心參數(如卷積核的大小)以及張量的大小。儘管有這麼多的不足,我仍是推薦你們閱讀完整的論文:

Visualizing Dataflow Graphs of Deep Learning Models in TensorFlow( http:// idl.cs.washington.edu/f iles/2018-TensorFlowGraph-VAST.pdf )

這篇文章提供了一些有關從下而上建立網絡圖所遇到的挑戰的看法。雖然咱們可使用全部 TensorFlow 的操做,包括輔助操做(例如初始化工具以及日誌工具),但作出一張通用的、可讀的圖依舊是個挑戰。若是讀者重視的東西咱們卻不重視,那就無法作出將 TensorFlow 計算圖轉變爲有用的(好比發佈就緒)圖的通用工具。

Keras

Keras 是一個高級深度學習框架,所以它具備生成美觀的可視化圖的巨大潛力。(注:若是你想使用用於 Jupyter Notebook 的交互訓練圖,我寫了一個:livelossplot( https:// github.com/stared/livel ossplot )。)然而在我看來,Keras 的默承認視化選項(使用 GraphViz)並不是一流:

clipboard.png

圖源: https:// keras.io/visualization/

我認爲它不只隱藏了重要的細節,還提供了冗餘的數據(重複的張量大小)。從美學上講,我也不喜歡它。

我試着寫了另外一個(pip install keras_sequential_ascii)用於訓練:

clipboard.png

圖源: https:// github.com/stared/keras -sequential-ascii (2017)

這個結構適用於小型序列網絡架構。我發現它對訓練和「Starting deep learning hands-on: image classification on CIFAR-10」這樣的課程頗有用。但對更高級的項目則毫無用武之地(有人建議我用這篇 git 日誌中的分支可視化工具( https:// stackoverflow.com/quest ions/1057564/pretty-git-branch-graph s))。顯而易見,我不是惟一一個試着用 ASCII 美化神經網絡可視化圖的人:

clipboard.png

圖源: https:// github.com/brianlow/ker as_diagram

我認爲最美觀的圖是我在 Keras.js 中找到的:

clipboard.png

圖源: https:// transcranial.github.io/ keras-js/#/squeezenet-v1.1

該項目沒有處於積極開發狀態,但它支持 TensorFlow.js。因爲它是開源且模塊化的(用了 Vue.js 框架),它能夠做爲建立獨立的可視化項目的起點。在理想狀況下,用 Jupyter Notebook 或單獨的瀏覽器窗口工做,就像用 displaCy 分解句子同樣。

總結

咱們看了許多神經網絡可視化的例子,這些例子都在如下方面作了取捨:

數據可視化 vs 數據藝術(有用性和美觀性)

清晰 vs 模糊

淺層 vs 層級

靜態(在出版物中效果很好)vs 交互(提供了更多信息)

特定 vs 通用(它是否適用於普遍的神經網絡族?)

數據流方向(從上到下、從下到上仍是從左到右?)

相關文章
相關標籤/搜索