0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么要用無監(jiān)督學習?無監(jiān)督深度學習范例研究

jmiy_worldofai ? 來源:未知 ? 作者:李倩 ? 2018-09-27 18:48 ? 次閱讀

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

雖然無監(jiān)督學習是一項十分復雜的挑戰(zhàn),但是它有許多優(yōu)點。它有潛力解決以前無法解決的問題,在機器學習和深度學習領(lǐng)域得到了大量的注意力。

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

注意——閱讀這篇文章需要讀者具有一定深度學習基礎,并且了解機器學習的概念。

為什么要用無監(jiān)督學習?

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

算法受到監(jiān)督信息的偏見的約束。沒錯,算法是自己學會的如何完成這項任務。但是,算法在解決問題時無法去考慮其他可能出現(xiàn)的情況。

由于學習在監(jiān)督下進行,為算法創(chuàng)建標簽需要花費巨大的人力。手動創(chuàng)建的標簽越少,算法可以用于訓練的數(shù)據(jù)就越少。

為了以一種智能的方式來解決這一問題,我們可以采用非監(jiān)督學習算法。非監(jiān)督學習直接從數(shù)據(jù)本身得到數(shù)據(jù)的性質(zhì),然后總結(jié)數(shù)據(jù)或?qū)?shù)據(jù)分組,讓我們可以使用這些性質(zhì)來進行數(shù)據(jù)驅(qū)動的決策。

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

無監(jiān)督深度學習范例研究

在這篇文章中,我們將介紹一個基于非結(jié)構(gòu)化數(shù)據(jù)的無監(jiān)督學習的范例研究。深度學習技術(shù)通常在處理非結(jié)構(gòu)化數(shù)據(jù)時能力最強。因此,我們以深度學習在圖像處理領(lǐng)域的應用為例,來理解這個概念。

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

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

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

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

首先,我發(fā)現(xiàn)我的照片庫中有三分之一都是網(wǎng)絡趣圖(感謝WhatsApp的可愛的朋友們)。

我個人也會收集一些在Reddit上看到的有趣的回答或分享。

至少有200張照片,是我在著名的DataHack Summit會議上,和隨后去喀拉拉的旅行

中拍攝的,也有一些是同事分享給我的。

也有一些照片記錄了會議期間的白板討論內(nèi)容。

還有一些截圖記錄了代碼錯誤,需要內(nèi)部團隊討論。使用后必須清除它們。

我還發(fā)現(xiàn)了一些“個人隱私”圖像,如自拍、合影和幾個特殊場景。它們數(shù)量不多,但它們是我珍貴的財產(chǎn)。

最后,有無數(shù)張“早上好”、“生日快樂”和“幸福的排燈節(jié)”的海報,我想方設法把它們從照片庫中刪除。但是不管我怎么刪除它們,它們還是會出現(xiàn)!

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

方法一:基于時間分類

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

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

方法二:基于位置分類

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

這種方法的缺點在于它的想法過于簡單。我們?nèi)绾味x一張搞笑圖片,或者一張卡通圖的位置?而它們在我的照片庫中占有相當大的份額。所以這種方法也不夠巧妙。

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

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

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

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

照片里有文字材料嗎?如果有的話,我們能識別出它是什么嗎?

照片中有什么不同的物體?它們的結(jié)合能確定照片的美感嗎?

照片里有人嗎?我們能認出他們嗎?

網(wǎng)絡上有相似的圖像可以幫助我們識別圖像的內(nèi)容嗎?

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

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

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

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

我們可以利用一個深度學習網(wǎng)絡結(jié)構(gòu)——自編碼器。

自動編碼器的思想是,訓練它從學習到的特征來重構(gòu)輸入。亮點在于,它用一個很小的特征表示來重構(gòu)輸入。

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

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

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

在MNIST數(shù)據(jù)集上進行無監(jiān)督深度學習的代碼詳解

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

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

我們會測試三種無監(jiān)督學習技術(shù),然后評價它們的表現(xiàn):

直接對圖像進行KMeans聚類

KMeans + 自編碼器

深度嵌入式聚類算法

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

(小編:少俠,手機看代碼看不全?用電腦復制代碼吧?。?/p>

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

git clone https://github.com/XifengGuo/DEC-keras cd DEC-keras

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

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

%pylab inlineimport osimport kerasimport metricsimport numpy as npimport pandas as pdimport keras.backend as Kfrom time import timefrom keras import callbacksfrom keras.models import Modelfrom keras.optimizers import SGDfrom keras.layers import Dense, Inputfrom keras.initializers import VarianceScalingfrom keras.engine.topology import Layer, InputSpecfrom scipy.misc import imreadfrom sklearn.cluster import KMeansfrom sklearn.metrics import accuracy_score, normalized_mutual_info_score

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

# To stop potential randomnessseed = 128rng = np.random.RandomState(seed)

現(xiàn)在設置數(shù)據(jù)的工作路徑,方便后續(xù)訪問。

root_dir = os.path.abspath('.')data_dir = os.path.join(root_dir, 'data', 'mnist')

讀入訓練和測試文件。

train = pd.read_csv(os.path.join(data_dir, 'train.csv'))test = pd.read_csv(os.path.join(data_dir, 'test.csv'))train.head()

在這個數(shù)據(jù)庫中,每個圖片都有類標,這在非監(jiān)督學習中并不常見,這里,我們用這些類標來評估無監(jiān)督學習模型的表現(xiàn)。

現(xiàn)在讓我們把數(shù)據(jù)顯示成一張圖片:

img_name = rng.choice(train.filename)filepath = os.path.join(data_dir, 'train', img_name)img = imread(filepath, flatten=True)pylab.imshow(img, cmap='gray')pylab.axis('off')pylab.show()

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

temp = []for img_name in train.filename: image_path = os.path.join(data_dir, 'train', img_name) img = imread(image_path, flatten=True) img = img.astype('float32') temp.append(img) train_x = np.stack(temp)train_x /= 255.0train_x = train_x.reshape(-1, 784).astype('float32')temp = []for img_name in test.filename: image_path = os.path.join(data_dir, 'test', img_name) img = imread(image_path, flatten=True) img = img.astype('float32') temp.append(img) test_x = np.stack(temp)test_x /= 255.0test_x = test_x.reshape(-1, 784).astype('float32')train_y = train.label.values

我們將訓練數(shù)據(jù)分成訓練集和測試集。

split_size = int(train_x.shape[0]*0.7)train_x, val_x = train_x[:split_size], train_x[split_size:]train_y, val_y = train_y[:split_size], train_y[split_size:]

K-Means

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

km = KMeans(n_jobs=-1, n_clusters=10, n_init=20)km.fit(train_x)KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300, n_clusters=10, n_init=20, n_jobs=-1, precompute_distances='auto', random_state=None, tol=0.0001, verbose=0)

現(xiàn)在我們已經(jīng)訓練了模型,下面看一下它在驗證集上的表現(xiàn)如何。

pred = km.predict(val_x)

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

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

NMI公式如下:

normalized_mutual_info_score(val_y, pred) 0.4978202013979692

K-Means + AutoEncoder

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

# this is our input placeholderinput_img = Input(shape=(784,))# "encoded" is the encoded representation of the inputencoded = Dense(500, activation='relu')(input_img)encoded = Dense(500, activation='relu')(encoded)encoded = Dense(2000, activation='relu')(encoded)encoded = Dense(10, activation='sigmoid')(encoded)# "decoded" is the lossy reconstruction of the inputdecoded = Dense(2000, activation='relu')(encoded)decoded = Dense(500, activation='relu')(decoded)decoded = Dense(500, activation='relu')(decoded)decoded = Dense(784)(decoded)# this model maps an input to its reconstructionautoencoder = Model(input_img, decoded)autoencoder.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 784) 0 _________________________________________________________________ dense_2 (Dense) (None, 500) 392500 _________________________________________________________________ dense_3 (Dense) (None, 500) 250500 _________________________________________________________________ dense_4 (Dense) (None, 2000) 1002000 _________________________________________________________________ dense_5 (Dense) (None, 10) 20010 _________________________________________________________________ dense_6 (Dense) (None, 2000) 22000 _________________________________________________________________ dense_7 (Dense) (None, 500) 1000500 _________________________________________________________________ dense_8 (Dense) (None, 500) 250500 _________________________________________________________________ dense_9 (Dense) (None, 784) 392784 =================================================================Total params: 3,330,794Trainable params: 3,330,794Non-trainable params: 0_________________________________________________________________# this model maps an input to its encoded representationencoder = Model(input_img, encoded)autoencoder.compile(optimizer='adam', loss='mse')

現(xiàn)在訓練自編碼器模型:

train_history = autoencoder.fit(train_x,train_x, epochs=500, batch_size=2048, validation_data=(val_x, val_x)) Train on 34300 samples, validate on 14700 samples Epoch 1/50034300/34300 [==============================] - 2s 60us/step - loss: 0.0805 - val_loss: 0.0666...Epoch 494/50034300/34300 [==============================] - 0s 11us/step - loss: 0.0103 - val_loss: 0.0138Epoch 495/50034300/34300 [==============================] - 0s 10us/step - loss: 0.0103 - val_loss: 0.0138Epoch 496/50034300/34300 [==============================] - 0s 11us/step - loss: 0.0103 - val_loss: 0.0138Epoch 497/50034300/34300 [==============================] - 0s 11us/step - loss: 0.0103 - val_loss: 0.0139Epoch 498/50034300/34300 [==============================] - 0s 11us/step - loss: 0.0103 - val_loss: 0.0137Epoch 499/50034300/34300 [==============================] - 0s 11us/step - loss: 0.0103 - val_loss: 0.0139Epoch 500/50034300/34300 [==============================] - 0s 11us/step - loss: 0.0104 - val_loss: 0.0138pred_auto_train = encoder.predict(train_x)pred_auto = encoder.predict(val_x)km.fit(pred_auto_train)pred = km.predict(pred_auto)normalized_mutual_info_score(val_y, pred)0.7435578557037037

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

DEC

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

代碼鏈接:

http://www.infoq.com/cn/articles/trudging-into-unsupervised-deep-learning

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 機器學習
    +關(guān)注

    關(guān)注

    66

    文章

    8357

    瀏覽量

    132330
  • 深度學習
    +關(guān)注

    關(guān)注

    73

    文章

    5471

    瀏覽量

    120904

原文標題:深度學習的關(guān)鍵:無監(jiān)督深度學習簡介(附Python代碼)

文章出處:【微信號:worldofai,微信公眾號:worldofai】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    深非監(jiān)督學習-Hierarchical clustering 層次聚類python的實現(xiàn)

    深度學習基礎-17】非監(jiān)督學習-Hierarchical clustering 層次聚類-python實現(xiàn)
    發(fā)表于 04-28 10:07

    采用監(jiān)督學習的方法,用深度摘要網(wǎng)絡總結(jié)視頻

    中科院和英國倫敦大學瑪麗女王學院的研究人員就生成視頻摘要提出了一種新方法,采用監(jiān)督學習的方法,用深度摘要網(wǎng)絡(Deep Summarization Network,DSN)總結(jié)視頻。
    的頭像 發(fā)表于 01-15 10:49 ?7086次閱讀
    采用<b class='flag-5'>無</b><b class='flag-5'>監(jiān)督學習</b>的方法,用<b class='flag-5'>深度</b>摘要網(wǎng)絡總結(jié)視頻

    基于半監(jiān)督學習框架的識別算法

    人體行為識別是計算機視覺研究的熱點問題,現(xiàn)有的行為識別方法都是基于監(jiān)督學習框架.為了取得較好的識別效果,通常需要大量的有標記樣本來建模.然而,獲取有標記樣本是一個費時又費力的工作.為了解決這個
    發(fā)表于 01-21 10:41 ?1次下載

    利用機器學習來捕捉內(nèi)部漏洞的工具運用監(jiān)督學習方法可發(fā)現(xiàn)入侵者

    Darktrace新網(wǎng)絡安全公司與劍橋大學的數(shù)學家合作,開發(fā)了一種利用機器學習來捕捉內(nèi)部漏洞的工具。它運用監(jiān)督學習方法,查看大量未標記的數(shù)據(jù),并找到不遵循典型模式的碎片。這些原始數(shù)據(jù)匯集到60多種不同的
    發(fā)表于 11-22 16:01 ?1223次閱讀

    你想要的機器學習課程筆記在這:主要討論監(jiān)督學習監(jiān)督學習

    with experience E(一個程序從經(jīng)驗E中學習解決任務T進行某一任務量度P,通過P測量在T的表現(xiàn)而提高經(jīng)驗E(另一種定義:機器學習是用數(shù)據(jù)或以往的經(jīng)驗,以此優(yōu)化計算機程序的性能標準。) 不同類型的機器學習算法:主要
    發(fā)表于 12-03 17:12 ?536次閱讀

    如何用Python進行監(jiān)督學習

    監(jiān)督學習是一種用于在數(shù)據(jù)中查找模式的機器學習技術(shù)。監(jiān)督算法給出的數(shù)據(jù)不帶標記,只給出輸入變量(X),沒有相應的輸出變量。在
    的頭像 發(fā)表于 01-21 17:23 ?4198次閱讀

    監(jiān)督機器學習如何保護金融

    監(jiān)督機器學習是近年才發(fā)展起來的反欺詐手法。目前國內(nèi)反欺詐金融服務主要是應用黑白名單、有監(jiān)督學習監(jiān)督
    發(fā)表于 05-01 22:11 ?997次閱讀

    機器學習算法中有監(jiān)督監(jiān)督學習的區(qū)別

    監(jiān)督學習的好處之一是,它不需要監(jiān)督學習必須經(jīng)歷的費力的數(shù)據(jù)標記過程。但是,要權(quán)衡的是,評估其性能的有效性也非常困難。相反,通過將監(jiān)督學習算法的輸出與測試數(shù)據(jù)的實際標簽進行比較,可以很
    的頭像 發(fā)表于 07-07 10:18 ?5685次閱讀

    最基礎的半監(jiān)督學習

    標記數(shù)據(jù)訓練的監(jiān)督學習技術(shù)得到更好的結(jié)果。這是半監(jiān)督學習系列文章的第1部分,對這個機器學習的重要子領(lǐng)域進行了簡要的介紹。 區(qū)分半監(jiān)督學習,監(jiān)督學習
    的頭像 發(fā)表于 11-02 16:08 ?2601次閱讀

    監(jiān)督學習最基礎的3個概念

    導讀 今天給大家介紹半監(jiān)督學習中的3個最基礎的概念:一致性正則化,熵最小化和偽標簽,并介紹了兩個經(jīng)典的半監(jiān)督學習方法。 沒看一的點這里哈:半監(jiān)督學習入門基礎(一) 半監(jiān)督學習 (SSL
    的頭像 發(fā)表于 11-02 16:14 ?2914次閱讀
    半<b class='flag-5'>監(jiān)督學習</b>最基礎的3個概念

    為什么半監(jiān)督學習是機器學習的未來?

    為什么半監(jiān)督學習是機器學習的未來。 監(jiān)督學習是人工智能領(lǐng)域的第一種學習類型。從它的概念開始,無數(shù)的算法,從簡單的邏輯回歸到大規(guī)模的神經(jīng)網(wǎng)絡,都已經(jīng)被
    的頭像 發(fā)表于 11-27 10:42 ?3860次閱讀

    監(jiān)督學習:比監(jiān)督學習做的更好

    監(jiān)督學習是人工智能領(lǐng)域的第一種學習類型。從它的概念開始,無數(shù)的算法,從簡單的邏輯回歸到大規(guī)模的神經(jīng)網(wǎng)絡,都已經(jīng)被研究用來提高精...
    的頭像 發(fā)表于 12-08 23:32 ?1378次閱讀

    機器學習中的監(jiān)督學習應用在哪些領(lǐng)域

    監(jiān)督學習|機器學習| 集成學習|進化計算| 非監(jiān)督學習| 半監(jiān)督學習| 自監(jiān)督學習|?
    發(fā)表于 01-20 10:52 ?4899次閱讀
    機器<b class='flag-5'>學習</b>中的<b class='flag-5'>無</b><b class='flag-5'>監(jiān)督學習</b>應用在哪些領(lǐng)域

    深度學習中的監(jiān)督學習方法綜述

    應用中往往難以實現(xiàn)。因此,監(jiān)督學習深度學習中扮演著越來越重要的角色。本文旨在綜述深度學習中的
    的頭像 發(fā)表于 07-09 10:50 ?414次閱讀

    神經(jīng)網(wǎng)絡如何用監(jiān)督算法訓練

    神經(jīng)網(wǎng)絡作為深度學習的重要組成部分,其訓練方式多樣,其中監(jiān)督學習是一種重要的訓練策略。監(jiān)督學習
    的頭像 發(fā)表于 07-09 18:06 ?683次閱讀