可解釋性是深度學習中最具挑戰性的方面之一。理解一個神經網絡,它有成千上萬的神經元分佈在數千個隱藏層中。大多數深層神經網絡的互聯性和複雜性使其不適合於傳統的調試工具。
因此,數據科學家通常依賴可視化技術來幫助他們理解神經網絡是如何做出決定的,這成為一個持續的挑戰。為了推進這一領域的發展,OpenAI剛剛推出了Microscope和Lucid庫,使神經網絡中的神經元可以進行視化。
在需要犧牲其他方面(例如準確性)之前,可解釋性是深度神經網絡解決方案中的理想判斷屬性。 深度學習模型的可解釋性和準確性能力之間的矛盾,其實就是能夠完成複雜的知識任務與理解如何完成這些任務之間矛盾。
知識與可控性,效果與可衡量性,效率與簡單性……都可以通過在準確性和可解釋性之間進行權衡取捨來進行衡量。 許多深度學習技術本質上是複雜的,儘管它們在許多情況下都非常準確,但是它們卻難以解釋。 所有深度學習模型都具有一定程度的可解釋性,但是其細節取決於一些關鍵的構建塊。
可解釋性的構成要素
對於深度學習模型,可解釋性不是一個單一的概念,而是不同原則的組合。在最近的一篇論文中,谷歌的研究人員概述了他們所認為的解釋能力的一些基本組成部分。本文介紹了使模型具有可解釋性的三個基本特徵:
瞭解隱藏層的作用:深度學習模型中的大部分知識是在隱藏層中形成的。理解不同隱藏層在宏觀層面上的功能對於理解深度學習模型至關重要。
瞭解節點是如何被激活的:可解釋性的關鍵不在於理解網絡中單個神經元的功能,而在於理解在同一空間位置一起發射的一組相互連接的神經元組。通過一組相互連接的神經元來分割一個網絡,將提供一個更簡單的抽象層次來理解其功能。
理解概念是如何形成的:理解神經網絡如何形成單個概念,然後將這些概念組裝到最終輸出中,是可解釋性的另一個關鍵組成部分。
從自然科學中汲取靈感
目前大多數深度學習社區甚至沒有神經網絡的可解釋性的統一的和正確的定義。
在對有機體的結構沒有基本一致意見的時候,顯微鏡的發明使細胞的可視化成為可能,從而推動了細胞生物學的革命。
也許我們需要一個神經網絡顯微鏡(Microscope)。
OpenAI Microscope
OpenAI顯微鏡是一組常見的深層神經網絡的可視化集合,以便於它們的解釋。顯微鏡使我們更容易分析這些神經網絡內部形成的特徵以及神經元之間的聯繫
讓我們以著名的AlexNet神經網絡為例,它是ILSVRC 2012的獲獎作品。它解決了圖像分類問題,輸入是1000個不同類別(如貓、狗等)中的一個的圖像,輸出是1000個數字的矢量。
使用OpenAI顯微鏡,我們可以選擇一個樣本數據集,並可視化AlexNet的核心架構以及每一層圖像分類過程的狀態。
選擇特定層(例如:conv5_1)後,顯微鏡將顯示該層中不同隱藏單元的可視化效果。
選擇一個圖層後,顯微鏡將顯示相應的特徵以及與其形成相關的訓練數據集的元素。
通過顯微鏡導航可以幫助說明可視化是如何幫助提高特定深層神經網絡的可解釋性的。為了在最初的研究中進行擴展,OpenAI還開源了一個框架來重用一些現有的可視化模型。
The Lucid Library
Lucid庫是一個開源框架,用於改進對深層神經網絡的解釋。目前的版本包括所有Microscope中的視覺化內容。
使用Lucid非常簡單。框架可以作為一個簡單的Python包安裝。
<code># Install Lucid !pip install --quiet lucid==0.2.3 #!pip install --quiet --upgrade-strategy=only-if-needed git+https://github.com/tensorflow/lucid.git # %tensorflow_version only works on colab %tensorflow_version 1.x # Imports import numpy as np import tensorflow as tf assert tf.__version__.startswith('1') import lucid.modelzoo.vision_models as models from lucid.misc.io import show import lucid.optvis.objectives as objectives import lucid.optvis.param as param import lucid.optvis.render as render import lucid.optvis.transform as transform # Let's import a model from the Lucid modelzoo! model = models.InceptionV1( model.load_graphdef()/<code>
使用Lucid可視化神經元只是調用render-vis
<code>_ = render.render_vis(model, "mixed4a_pre_relu:476")/<code>
此外,Lucid可以產生不同類型的可視化,幫助解釋層和神經元:
目標:你希望模型可視化什麼?
參數化:如何描述圖像?
轉換:您希望您的可視化展示什麼樣的轉換?
下面的代碼可視化了一個具有特定目標的神經元。
<code># Install Lucid !pip install --quiet lucid==0.2.3 #!pip install --quiet --upgrade-strategy=only-if-needed git+https://github.com/tensorflow/lucid.git # %tensorflow_version only works on colab %tensorflow_version 1.x # Imports import numpy as np import tensorflow as tf assert tf.__version__.startswith('1') import lucid.modelzoo.vision_models as models from lucid.misc.io import show import lucid.optvis.objectives as objectives import lucid.optvis.param as param import lucid.optvis.render as render import lucid.optvis.transform as transform # Let's import a model from the Lucid modelzoo! model = models.InceptionV1( model.load_graphdef()/<code>
Microscope和Lucid庫都是模型可解釋性領域的主要改進。理解特徵和神經元之間的關係是我們理解深度學習模型的基礎,像Microscope和Lucid這樣的庫是朝著正確方向邁出的堅實一步。
作者 : Jesus Rodriguez
deephub翻譯組