SVD分解 一 自編碼器與人工智慧

2021-09-22 01:33:23 字數 3535 閱讀 8235

咋看上去,svd分解是比較傳統的資料探勘手段,自編碼器是深度學習中乙個比較「先進」的概念,應該沒啥交集才對。而本文則要說,如果不考慮啟用函式,那麼兩者將是等價的。進一步的思考就可以發現,不管是svd還是自編碼器,我們降維,並不是純粹地為了減少儲存量或者減少計算量,而是「智慧型」的初步體現。

等價性 #

假設有乙個m行n列的龐大矩陣mm×n,這可能使得計算甚至儲存上都成問題,於是考慮乙個分解,希望找到矩陣am×k和bk×n,使得

mm×n=am×k×bk×n

這裡的乘法是矩陣乘法。如圖

這樣本來有mn個元素,現在變成了右端的(m+n)k個元素,如果k足夠小,那麼就有(m+n)k那麼自編碼器又是怎麼回事呢?這裡我們先無視啟用函式,只看線性結構。自編碼器是希望訓練乙個f(x)=x的恒等函式,但是中間層節點做了壓縮。

自編碼器的網路結構

自編碼器的網路結構

數學公式看,就是希望找到矩陣cn×k和dk×n

mm×n=mm×n×cn×k×dk×n

這裡的等號也不是嚴格相當,而是最優意義下的,圖示如下:

自編碼器

自編碼器

這樣一來,如果讓

am×k=mm×n×cn×k,bk×n=dk×n

那麼兩者不就是等價了嗎?只要它們在同一種誤差函式(損失函式)下求最優得到的結果,那麼所得到的結果必然是等價的。

這樣子,我們就證明了,不帶啟用函式的三層自編碼器,其實跟傳統的svd分解是等價的。但雖然是等價的,但自編碼器還是乙個創新,因為它將矩陣分解變為乙個神經網路的壓縮編碼問題,更為清晰易懂,而且這樣我們可以分批訓練,不用像svd那樣要一次性把所有資料輸入分解(當然,可以模仿神經網路的分批訓練,來構思乙個「分批svd分解」演算法,不過也沒啥意義了。)

如圖,svd的物理意義,我們可以這樣看。對於第乙個分解的矩陣,我們可以看成是對行進行了聚類,即對文件進行了簡單的聚類;第二個分解的矩陣,我們可以看成是對列進行了聚類,即對每個詞語進行了聚類。而矩陣的乘法,就意味著文件類與詞語類的匹配。讀者可能會問為什麼詞語和文件要聚成相同數目的類?而不是不同數目的?事實上,更合理的寫法是

mm×n=am×k×pk×l×ql×n

這樣,就相當於說把文件聚為k類,詞語聚為l類,pk×l就是文件類與詞語類的匹配矩陣,然後將pk×l×ql×n設為bk×n就行了。

為什麼要構思這樣一種看似牽強的解釋?筆者的目的,是去解釋人工的模型中,體現出「智慧型」的原因是什麼。我們知道,人有記憶功能,但記憶到一定程度之後,往往不會滿足單純的記憶了,而是找出要記憶的東西的規律,通過規律來記憶。比如在語言中,我們會將詞語分為動詞和名詞,等等,然後我們發現「動詞+名詞」通常可以構成乙個短語等規律,我們不一定說得出這個模式,但不可否認我們大腦確實在進行著這樣的「找規律」、「分類」的過程,而這我覺得,如果用資料探勘的角度來的話,就是乙個壓縮和聚類的過程,也就是說,通過壓縮後進行重建,能夠挖掘資料的共性,即我們所說的規律,然後得到更泛化的結果。

這或許可以回答一些問題,比如基於深度學習的(不論是lstm還是cnn)的分詞模型,為什麼都對新詞有那麼好的識別能力?因為它裡邊包含了自編碼器這個結構,而這個結構跟svd等價,svd我們前面解釋了,含有了聚類這個物理意義(找規律),從而它更為泛化,效能更好。

衍生新詞 #

太抽象?聽不懂?不急,馬上來乙個例子。這個例子涉及到我們對詞語的理解。請看下面的**:

神魔獸11界11龍11靈11術01

假設這是乙個從科幻**中統計出來的結果,裡邊代表著「神獸」、「神界」、「神龍」、「神靈」、「魔獸」、「魔界」、「魔龍」、「魔靈」、「魔術」這些詞都在****現了,而且頻數為1,但沒有出現過「神術」這個詞。那麼我們是否會推理:「魔」跟「神」在用法上似乎有點相似,那麼「神術」是不是成立的詞?如何用數學表述這一點?

讓人意外的是,做法之一正是svd!也就是說,我們應該要對第一字的用法做一些聚類(可能是形容詞、動詞、名詞?),對第二字的用法做一些聚類(可能是形容詞、動詞、名詞?),然後考慮類與類之間的搭配。當然,我們不用真的告訴計算機要聚類為名詞還是動詞,計算機不需要用人類的方式去理解語言,我們只需要告訴計算機去聚類,而svd正是有聚類這個含義,於是,只要做svd就行了。具體實驗如下:

將結巴分詞的詞表中所有頻數不小於100的二字詞選出來,然後以第一字為行,第二字為列,頻數為值(沒有這個詞就預設記為0),得到乙個矩陣。對這個矩陣做svd分解,得到兩個矩陣,然後把這兩個矩陣乘起來(復原),把復原後的矩陣當作新的頻數,然後對比原始矩陣,看看多出了哪些頻數較高的詞語。

結果,我得到了一些輸入詞表中沒有的詞語,比如(下面只是小部分)

龍腦 10.271244

龍腳 12.496673

龍臘 16.860170

龍腿 12.172765

龍蓮 11.362767

龍蔗 67.800909

龍薯 30.580730

七講 11.439969

七評 12.362163

七課 11.587767

七郎 12.789438

七隱 10.479609

七頁 15.499356

七項 18.802959

怨怒 29.831461

怨噁 15.875075

怨苦 24.979326

怪兔 10.246062

怪奇 12.768122

怪孩 14.391967

怪形 14.856068

這些詞語中,有不少是不靠譜的,事實上不靠譜的比靠譜的多得多。但這不重要,因為我們如果對自然語言進行處理的話,不靠譜的並不是真實環境**現的句子。這就得到了很神奇的結果:我們通過svd分解,原始的目的可能是壓縮、降維,但復原後反而衍生出了更豐富、詞彙量更多的結果。這似乎就是聚類、找規律的結果。這不同基於統計的新詞發現,這些新詞在語料中並不存在,是通過已有的詞語的構造規律衍生出來的,是乙個真正推理的過程,即「智慧型」。誇張地說,svd帶來了初步的人工智慧(當然,不是唯一的方法)。

啟用函式 #

啟用函式是什麼鬼?筆者在上面的實驗中,也發現了啟用函式的乙個實在的物理意義。我們對矩陣做svd分解,然後復原,復原後會有一些元素是負數的,而我們這個矩陣的含義是頻數,頻數不能是負數,因此我們把負數扔掉(截斷),記為0。

咦?這不就是函式max(x,0)的操作嗎?這不是我們使用得最廣的relu啟用函式嗎?原來,啟用函式在這裡的物理意義,不過是對無關緊要元素的一種捨棄(截斷),這種操作,我們在很久之前的統計就已經用到了(扔掉負數、扔掉小統計結果等)。

當然,在神經網路中,啟用函式有更深刻的意義,但在淺層的網路(矩陣分解)中,它給我們的直觀感受,就是截斷罷了。

小結 #

本文主要是以svd為中心,**了svd本身的物理意義(聚類)、svd分解與自編碼器的聯絡、svd分解與智慧型的千絲萬縷的關係以及乙個相關實驗。這些內容大多數是思想性的、理解性的,即加深我們對模型和人工智慧的理解,是我們在運用模型中更有「底氣」一些,而不是純粹的套模型。

FreeSWITCH與人工智慧一些基本概念

ai是artificial intelligence的縮寫,也就是我們所說的人工智慧。freeswitch很早的版本就有asr和tts介面。是的,freeswitch本身其實並不做asr和tts。asr的全稱是automatic speech recognition,即自動語音識別。tts的全稱是t...

開源人工智慧使用卷積網格自動編碼器生成3D面部

開源人工智慧使用卷積網格自動編碼器生成3d面部介紹 人臉在形狀上變化很大,因為它受到諸如年齡,性別,種族等許多因素的影響,並且隨著表情而顯著變形。現有技術的3d人臉表示主要使用線性變換 40,28,41 或更高階張量概括 45,12,14 這些3d人臉模型有多種應用,包括人臉識別 39 生成和動畫人...

VAE變分自編碼器的一點理解

introduction to variational autoencoders vae第二篇 vae variation inference變分推理 清爽介紹 結合 講解vae gan比較透徹的一篇文章 引介 semi supervised vae for text classification ...