gan怎麼輸入一維資料 一文看懂GAN的原理

2021-10-14 10:07:03 字數 4493 閱讀 4892

生成對抗網路(generative adversarial network,gan)自從2023年由ian goodfellow提出以來,一直受到了廣泛的關注和研究,在短短幾年時間內獲得了快速的發展,並在許多應用場景中取得了顯著的成果

以計算機視覺(computer vision,cv)領域中的人臉生成(face generation)這一任務為例,gan生成的人臉在解析度、真實性、多樣性等方面都實現了極大的提公升,從goodfellow在2023年所發的推文中便可見一斑

根據以上的定義,gan顯然屬於生成模型,因為我們希望通過gan生成一些以假亂真的合成資料。進一步而言,生成模型可以分為無條件(unconditional)和有條件(conditional)兩類,其中前者的生成結果完全隨機,後者的生成結果則是可控的,例如生成男性或女性的人臉、撰寫符合某個話題的新聞報道

在正式討論gan的原理之前,我們先介紹一些關於模型優化的基本知識。如果你不是小白,則完全可以跳過這一部分

模型(model)就好比一台機器,通常用於完成某一項任務,有輸入(input)也有輸出(output),例如在貓狗二分類這一任務中,輸入為各種各樣的貓狗,輸出為貓或狗這兩個選擇之一

模型會包含一些可調引數(trainable parameters),這些引數的取值都是可變的,就好比一台電壓力鍋,可以設定不同的壓力和時長。對於同樣的食材,當壓力和時長設定得不一樣時,煮出來的結果也會不一樣。類似的,對於同樣的輸入,當模型的引數取不同的值時,得到的輸出也將不同

一般而言,我們會通過某種初始化方法(initializer)為模型的每個引數設定乙個初始值,例如隨機初始化。回到貓狗二分類的問題上來,初始化之後的模型,肯定是無法對於每張輸入,都輸出正確的分類的結果

為了讓模型學會貓狗分類的能力,我們會準備一些標註資料(labeled data),例如1萬張貓狗,以及每張所對應的標註(label),比如用0代表貓、用1代表狗,然後通過這些標註資料來訓練(train)模型。這種每個樣本都提供了正確答案(ground truth)的訓練模式,稱為有監督學習(supervised learning)

具體如何訓練呢?我們可以每次拿4張,輸入模型並得到相應的輸出,這些輸出結果中有對的也有錯的,我們希望它們盡可能地接近正確答案。可以使用某種損失函式(loss function)來衡量兩者之間的差距,例如二分類問題中最常用的二元交叉熵(binary cross entropy),損失函式越小,則表明模型的輸出越接近正確答案

於是我們對模型說,你看啊,還差那麼多,趕緊把引數調一下!具體怎麼調呢?唯一的原則就是,每個引數調整之後,都應當使當前的損失函式往減小的方向變化,這一點在數學上可以通過求導來實現。如此一來,我們便完成了一次模型優化(optimization),也稱為一次迭代(iteration),我們的模型變得更聰明了,對於同樣的輸入,輸出結果將更接近正確答案

上面我們是每次拿4張來訓練,如果每次只用一張,那麼優點是迭代一次的時間將縮短,但缺點是訓練可能不穩定,畢竟在做決定時,我們一般會同時聽取多方意見。另乙個極端是,每次都用全部來訓練,這樣得到的引數調整方案會更加靠譜,但迭代一次所需的時間也會大大增加

因此,通常我們會每次拿一批(batch)資料來訓練,一批資料中所包含的數量稱為批大小(batch size)。在不同的優化任務中,批大小如何設定依賴於經驗,但一般會設定為2的冪,例如2、4、8、16、32、64等。假設一共有1萬張,批大小設為16,那麼經過10000/16=625次迭代後,所有的資料都過了一遍,我們稱訓練了一輪(epoch)

可想而知,隨著訓練的進行,我們的模型將變得越來越聰明,那麼應當如何評估模型的效能呢?一種常用的做法是將標註資料劃分為訓練集(train set)和測試集(test set),僅用訓練集來優化模型,然後在測試集上評估模型,就好比一共有100套卷子,80套用來練習,20套用來考試。評估的時候會用到一些評估指標(evaluation metric),例如分類問題中常用的正確率(accuracy)、準確率(precision)和召回率(recall)等

還有乙個待解決的問題,便是何時停止訓練,我們可以只訓練20輪,當然也可以訓練100輪。一般而言,如果訓練輪數過少,則模型可能學得不夠,即還有優化的空間;如果訓練輪數過多,則模型可能學得過頭了,具體表現為在訓練集上效能很好,但在測試集上效能很差。至於如何找到那個恰到好處的點,則需要了解欠擬合、過擬合、模型複雜度、正則化等內容,這裡就不再展開介紹了

是由乙個個畫素點組成的,一張高度為h、寬度為w的,共包括h*w個畫素點。如果是rgb彩色圖,則每個畫素點包括三個顏色通道,即紅(red)、綠(green)、藍(blue),每個顏色通道的取值都是0~255之間的整數,這樣一來,就一共有256*256*256=16,777,216種不同的畫素值,也就是所謂的「顏色」

gan在cv界所取得的進展和成果遠遠多於自然語言處理(natural language processing,nlp),乙個主要原因就是的表示是「連續」的,即當畫素值發生微小變化時,視覺上並不會察覺出明顯的區別。相比之下,nlp任務中一般會將字或詞作為最基礎的語義單元,而字和詞的表示是「離散」的,即我們很難統一規定,當乙個字或詞發生微小變化時,對應的語義是哪乙個其他的字或詞。字或詞的這種「離散跳變性」,無疑加大了gan訓練時的困難和不穩定性,從而導致gan在nlp領域中的發展和應用相對較少

在上面的貓狗二分類例子中,模型需要實現從到01二分類結果之間的對映,一般情況下只需要乙個模組(module)即可。相比之下,gan包括兩個模組,生成器(generator,g)和判別器(discriminator,d)

g的任務是隨機生成以假亂真的合成資料。為了滿足隨機性,通常我們會使用多個隨機數作為g的輸入,例如100個從標準正態分佈(random normal distribution)中隨機取樣得到的隨機數,記作隨機噪音(random noise)z,輸出則是和真實相同解析度的

d的任務是區分真假,即判斷一張到底是真實,還是g合成的虛假。因此,d的輸入是,輸出是乙個分數d(·),分值越高表示輸入越真實。理想情況下,d應當對於所有真實都輸出高分,對於所有虛假都輸出低分,如此一來,便可以完美實現判別真假的目標

回到我們之前介紹的模型優化上來,在具體實現上,g和d都可以通過神經網路(neural network)來實現,並且都包含大量的可調引數。在經過初始化之後,g不具備任何的生成能力,輸出的虛假和真實相去甚遠;d也不具備任何的判別能力,對於真實或虛假所輸出的分數沒有太大區別

現在開始模型的優化~在每次迭代中,我們隨機選擇一批真實x,並隨機生成一批z,然後將z輸入g得到一批虛假x'=g(z)。d的損失函式包括兩方面:第一是x對應的分數d(x)應當比較高,例如和1盡可能接近;第二是x'對應的分數d(x')應當比較低,例如和0盡可能接近。按照損失函式減小的方向,調整d的每乙個引數,便完成了d的一次優化。在經過優化之後,d對於真實或虛假所輸出的分數,就更加有區分度了

至於g,其目標是讓d誤以為x'是真實,因此g的損失函式可以是d(x')和1之間的差距,這個差距越小,表明在d看來x'越真實。按照損失函式減小的方向,調整g的每乙個引數,便完成了g的一次優化。在經過優化之後,g合成的虛假,在d的判別下,就變得更加真實了。值得一提的是,在整個優化過程中,g並沒有接觸到真實x,它也不在乎真實x長什麼樣,只要合成的虛假x'在d看來像真的就行

重複以上步驟,隨著優化的進行,d的判別能力越來越強,g的生成能力也越來越強,兩者互相博弈、共同進步。在理想的情況下,g最終可以生成和真實難以區別的虛假,如此一來,為了合成一些不存在的,我們只需要隨機生成很多z,輸入g即可得到對應的合成結果。

以上就是gan的基本原理,最後再貼一下goodfellow**裡所使用的損失函式

在具體實現上,如果對深度學習(deep learning)中常用的層(layer)和運算元(operator)比較熟悉,那麼應該可以很輕鬆地想到如何實現g和d,只要使得g將隨機向量對映為,而d將對映為數值即可。例如,在goodfellow的**中,一種方法是通過全連線層(fully-connected layer,也稱為dense)來實現g和d,另一種方法則是用二維卷積層(conv2d)實現g,以及二維逆卷積層(deconv2d)實現d

**展示了在mnist、tfd、cifar-10三個資料集上的實驗結果,其中最右一列表示和倒數第二列中的虛假樣本,最為接近的真實樣本。雖然這些結果在今天看起來不怎麼樣,但是在**發表的2023年,能夠實現這樣的合成效果,已經足以引起相當大的轟動了

時間走到2023年底,無監督(unsupervised)人臉生成的天花板(state-of-the-art,sota)已經由stylegan2再次重新整理,出品自nvidia,是在他們前期工作stylegan基礎之上的又一次完善和公升級。生成解析度提公升至1,024*1,024,合**臉的真實性、清晰度、多樣性也獲得了極大提公升,不禁讓人直呼鵝妹子嚶,也許這就是gan的魅力所在吧

一文看懂kylin

kylin到底解決了什麼關鍵問題 要徹底的解決掉資料查詢時間隨著資料量的增長而成線性增長的規律 kylin適合哪類資料的處理 通常查詢資料,一般是統計結果,如果是統計結果,必然會按照維度來進行聚合,kylin的工作原理是多維立方體分析,適合需要從多個維度來觀察資料的查詢。維度,看資料的角度,比如地區...

一文看懂xml

先簡單介紹下html xml xpath 1.html 超文字語言,用來展示資料。2.xml 可擴充套件標記語言,用來傳輸資料。僅僅是純文字,標籤可自定義。3.xpath 專門在xml中查詢資訊的語言。xml 文件必須包含根元素。該元素是所有其他元素的父元素。xml 文件中的元素形成了一棵文件樹。這...

一文看懂條件編譯

條件編譯概述 就是在滿足一定的條件時才對源 進行編譯。條件編譯一般有3種形式 形式一 a ifdef 識別符號 識別符號定義時,執行程式段1,否則執行程式段2 程式段1 else 程式段2 endif b ifdef 識別符號 程式段1 endif 例如 define k 1 ifdef k pri...