深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

作者 | Faizan Shaikh

譯者 | 馬卓奇

AI 前線導讀:在這篇文章中,我們用一個直觀的案例研究概述了無監督深度學習的概念。並且詳解了在 MNIST 數據集上進行無監督學習的代碼,包括 K-Means、自編碼器以及 DEC 算法。

更多幹貨內容請關注微信公眾號“AI 前線”,(ID:ai-front)

介紹

作為數據科學家,我們平時的工作是使用各種機器學習算法從數據中提取可操作的信息。其中大多數是有監督學習問題,因為你已經知道目標函數是什麼。給出的數據有很多細節能幫助你實現最終目標。

雖然無監督學習是一項十分複雜的挑戰,但是它有許多優點。它有潛力解決以前無法解決的問題,在機器學習和深度學習領域得到了大量的注意力。

這篇文章的目的是直觀地介紹一下無監督學習,以及它在現實生活中的應用。

注意——閱讀這篇文章需要讀者具有一定深度學習基礎,並且瞭解機器學習的概念。如果還沒有掌握基礎知識,可以閱讀以下參考文獻:

  • 數據課程實驗:https://trainings.analyticsvidhya.com/courses/course-v1:AnalyticsVidhya+EWD01+2018_EWD_T1/about
  • 深度學習基礎——以人工神經網絡為起點:https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-networks/

下面就讓我們進入正題吧!

為什麼要用無監督學習?

機器學習項目中的典型方法是以有監督的方式設計的。我們告訴算法該做什麼和不該做什麼。這是一個解決問題的通用結構,但是它從兩個方面限制了算法的潛力:

  • 算法受到監督信息的偏見的約束。沒錯,算法是自己學會的如何完成這項任務。但是,算法在解決問題時無法去考慮其他可能出現的情況。
  • 由於學習在監督下進行,為算法創建標籤需要花費巨大的人力。手動創建的標籤越少,算法可以用於訓練的數據就越少。

為了以一種智能的方式來解決這一問題,我們可以採用非監督學習算法。非監督學習直接從數據本身得到數據的性質,然後總結數據或對數據分組,讓我們可以使用這些性質來進行數據驅動的決策。

讓我們用一個例子來更好地理解這個概念。比如說,銀行想要對客戶進行分組,以便他們能向客戶推薦合適的產品。他們可以通過數據驅動的方式來完成這件事——首先通過客戶的年齡對客戶進行細分,然後從這些分組中得到客戶的特性。這將有助於銀行向客戶提供更好的產品推薦,從而提高客戶滿意度。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

無監督深度學習範例研究

在這篇文章中,我們將介紹一個基於非結構化數據的無監督學習的範例研究。深度學習技術通常在處理非結構化數據時能力最強。因此,我們以深度學習在圖像處理領域的應用為例,來理解這個概念。

定義問題——如何整理照片庫

現在,我的手機裡有 2000 張照片。如果我是一個自拍狂,照片的數量很可能是這個數字的 10 倍。挑選這些照片是一場噩夢,因為基本上每三張照片中就有一張對我來說是無用的。我相信大多數人都有同樣的問題。

理想情況下,我想要的是一個能夠整理照片的應用程序,可以讓我隨時瀏覽大部分照片。這樣我也可以知道我目前有多少類照片。

為了更清楚地瞭解這個問題,我嘗試自己對照片進行分類。以下是我總結的情況:

  • 首先,我發現我的照片庫中有三分之一都是 網絡趣圖(感謝 WhatsApp 的可愛的朋友們)。
深度學習的關鍵:無監督深度學習簡介(附Python代碼)

  • 我個人也會收集一些在 Reddit 上看到的有趣的回答或分享。
深度學習的關鍵:無監督深度學習簡介(附Python代碼)

  • 至少有 200 張照片,是我在著名的 DataHack Summit 會議上,和隨後去喀拉拉的旅行中拍攝的,也有一些是同事分享給我的。
深度學習的關鍵:無監督深度學習簡介(附Python代碼)

  • 也有一些照片記錄了會議期間的白板討論內容。
深度學習的關鍵:無監督深度學習簡介(附Python代碼)

  • 還有一些截圖記錄了代碼錯誤,需要內部團隊討論。使用後必須清除它們。
深度學習的關鍵:無監督深度學習簡介(附Python代碼)

  • 我還發現了一些“個人隱私”圖像,如自拍、合影和幾個特殊場景。它們數量不多,但它們是我珍貴的財產。
深度學習的關鍵:無監督深度學習簡介(附Python代碼)

  • 最後,有無數張“早上好”、“生日快樂”和“幸福的排燈節”的海報,我想方設法把它們從照片庫中刪除。但是不管我怎麼刪除它們,它們還是會出現!
深度學習的關鍵:無監督深度學習簡介(附Python代碼)

在下面的章節中,我們將討論一些我想出的解決這個問題的方法。

方法一:基於時間分類

最簡單的方法是按照時間來整理照片。每一天都可以有不同的文件夾。大多數照片瀏覽應用程序均使用這種方法(如谷歌照片應用程序)。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

這樣做的好處是,當天發生的所有事件都會被存儲在一起。這種方法的缺點是它太普通了。每一天,我都可能拍攝郊遊的照片,同時把有意思的回答截圖下來,等等。它們會混在一起,這完全沒有達到我的目的。

方法二:基於位置分類

一個相對較好的方法是根據拍攝地點整理照片。例如,每次照相,我們都可以記錄照片拍攝的地方。然後,我們可以根據這些位置——無論是國家、城市還是地區,按照我們想要的區域粒度來製作文件夾。這種方法也被許多照片應用程序所使用。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

這種方法的缺點在於它的想法過於簡單。我們如何定義一張搞笑圖片,或者一張卡通圖的位置?而它們在我的照片庫中佔有相當大的份額。所以這種方法也不夠巧妙。

方法三:提取照片的語義信息,並用它來定義我的照片庫

到目前為止,我們所看到的方法大多依賴於和照片同時獲得的元數據。整理照片的一種更好的方法是從圖像本身中提取語義信息並智能地使用這些信息。

讓我們把這個想法分成幾個部分。假設我們有多樣性類似(如上所述)的照片。我們的算法應該捕捉哪些趨勢?

1、拍攝的是 自然場景 圖像還是 人工生成 的圖像?

2、照片裡有 文字材料 嗎?如果有的話,我們能識別出它是什麼嗎?

3、照片中有什麼 不同的物體?它們的結合能確定照片的美感嗎?

4、照片裡 有人嗎?我們能認出他們嗎?

5、網絡上有

相似的圖像 可以幫助我們識別圖像的內容嗎?

因此,我們的算法應該能理想地捕捉這個信息,而不需要明顯的標記,並用它來整理、分類我們的照片。理想情況下,最終的應用程序界面應該是這樣的:

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

這種方法就是以“無監督的方式”來解決問題。我們沒有直接定義我們想要的結果。相反,我們訓練一個算法為我們找到這些結果。我們的算法以智能的方式對數據進行了總結,然後在這些推論的基礎上嘗試解決這個問題。很酷,對吧?

現在你可能想知道,我們該如何利用深度學習來處理無監督的學習問題?

正如我們在上面的案例研究中看到的,通過從圖像中提取語義信息,我們可以更好地瞭解圖像的相似性。因此,我們的問題可以表述為:我們該如何降低圖像的維度,使我們可以從這些編碼表示重建圖像。

我們可以利用一個深度學習網絡結構——自編碼器

自動編碼器的思想是,訓練它從學習到的特徵來重構輸入。亮點在於,它用一個很小的特徵表示來重構輸入。

例如,一個設置編碼維度為 10 的自動編碼器,在貓的圖像上訓練,每一張圖像大小為 100×100。所以輸入維數是 10000,而自動編碼器需要用一個大小為 10 的矢量表示輸入所有信息(如下圖所示)。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

一個自動編碼器從邏輯上可以分為兩個部分:編碼器和解碼器。編碼器的任務是將輸入轉化成一個低維表示,而解碼器的任務是從低維表示重構輸入。

這是對自編碼器的高度概括,下一篇文章中我們將仔細解讀自編碼器的算法。

雖然這一領域的研究正在蓬勃發展,但目前最先進的方法也無法輕鬆解決工業層面的問題,我們的算法想真正“投入工業使用”還需幾年時間。

在 MNIST 數據集上進行無監督深度學習的代碼詳解

現在我們已經基本瞭解瞭如何使用深度學習解決無監督學習問題,下面我們要把學到的知識運用在現實生活的問題中。這裡,我們以 MNIST 數據集為例,MNIST 數據集一直是深度學習測試的必選數據集。在解讀代碼之前,讓我們先了解一下問題的定義。

原始問題是確定圖像中的數字。數據庫會給出圖像所含數字的標籤。在我們的案例研究中,我們將嘗試找出數據庫中相似的圖片,並將它們聚成一類。我們將通過標籤來評估每個類別的純度。你可以在 AV 的 DataHack 平臺下載數據——“識別數字”實踐問題。

我們會測試三種無監督學習技術,然後評價它們的表現:

  1. 直接對圖像進行 KMeans 聚類
  2. KMeans + 自編碼器
  3. 深度嵌入式聚類算法

在開始實驗之前,確保你已經在系統中安裝了 Keras。(可參考官方安裝指南。)我們將用 TensorFlow 作為後臺,所以你要確保配置文件中有這一項。如果沒有,按照這裡給出的步驟進行操作。

我們需要用到 Xifeng Guo 實現的 DEC 算法開源代碼。在命令行輸入如下命令:

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

你可以打開一個 Jupyter Notebook,跟著下面的代碼一起操作。

首先我們需要導入所有必需的模塊。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

下面我們將種子的值設為一個受限隨機數。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

現在設置數據的工作路徑,方便後續訪問。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

讀入訓練和測試文件。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

在這個數據庫中,每個圖片都有類標,這在非監督學習中並不常見,這裡,我們用這些類標來評估無監督學習模型的表現。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

隨後我們讀入所有圖片,將它們存儲成一個 numpy 矩陣,創建訓練和測試文件。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

我們將訓練數據分成訓練集和測試集。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

K-Means

我們首先直接對圖像使用 K-Means 聚類,將其聚成 10 類。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

現在我們已經訓練了模型,下面看一下它在驗證集上的表現如何。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

我們將使用歸一化互信息(NMI)分數來評估我們的模型。

互信息是聚類結果和人工分類之間依賴程度的對稱性度量。它基於聚類純度 PI 的概念,通過將 Ci 與 M 中的所有手動分類進行比較,衡量單個聚類 Ci 的質量,即 Ci 與 Mj 中相同目標的最大數量。因為 NMI 是歸一化的,所以我們可以使用它來比較聚類個數不同的聚類結果。

NMI 公式如下:

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

K-Means + AutoEncoder

現在,我們不直接使用 K-Means,我們首先用自編碼器降低數據維度,提取有用信息,再將這些信息傳遞給 K-Means 算法。

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

現在訓練自編碼器模型:

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

從結果可以看到,將自編碼器與 K-Means 結合起來,算法效果比僅使用 K-Means 的效果要好。

DEC

最後,我們看一下 DEC 算法的實現。DEC 算法將聚類和自編碼器放在一起訓練以取得更好的效果。(論文:Junyuan Xie, Ross Girshick, and Ali Farhadi. Unsupervised deep embedding for clustering analysis. ICML 2016.)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

深度學習的關鍵:無監督深度學習簡介(附Python代碼)

DEC 算法與上述兩種方法相比,效果最好。研究人員發現,進一步訓練 DEC 模型可以達到更高的性能(NMI 高達 87)。

查看英文原文:

https://www.analyticsvidhya.com/blog/2018/05/essentials-of-deep-learning-trudging-into-unsupervised-deep-learning/


分享到:


相關文章: