g是乙個生成的網路,它接收乙個隨機的雜訊z,通過這個雜訊生成,記做g(z)。
d是乙個判別網路,判別一張是不是「真實的」。它的輸入引數是x,x代表一張,輸出d(x)代表x為真實的概率,如果為1,就代表100%是真實的,而輸出為0,就代表不可能是真實的。
在訓練過程中,生成網路g的目標就是盡量生成真實的去欺騙判別網路d。而d的目標就是盡量把g生成的和真實的分別開來。這樣,g和d構成了乙個動態的「博弈過程」。
最後博弈的結果是什麼?在最理想的狀態下,g可以生成足以「以假亂真」的g(z)。對於d來說,它難以判定g生成的究竟是不是真實的,因此d(g(z)) = 0.5。
這樣我們的目的就達成了:我們得到了乙個生成式的模型g,它可以用來生成。
以上只是大致說了一下gan的核心原理,如何用數學語言描述呢?這裡直接摘錄**裡的公式:
簡單分析一下這個公式:
整個式子由兩項構成。x表示真實,z表示輸入g網路的雜訊,而g(z)表示g網路生成的。
d(x)表示d網路判斷真實是否真實的概率(因為x就是真實的,所以對於d來說,這個值越接近1越好)。而d(g(z))是d網路判斷g生成的的是否真實的概率。
g的目的:上面提到過,d(g(z))是d網路判斷g生成的是否真實的概率,g應該希望自己生成的「越接近真實越好」。也就是說,g希望d(g(z))盡可能得大,這時v(d, g)會變小。因此我們看到式子的最前面的記號是min_g。
d的目的:d的能力越強,d(x)應該越大,d(g(x))應該越小。這時v(d,g)會變大。因此式子對於d來說是求最大(max_d)
那麼如何用隨機梯度下降法訓練d和g?**中也給出了演算法:
**這裡紅框圈出的部分是我們要額外注意的。**第一步我們訓練d,d是希望v(g, d)越大越好,所以是加上梯度(ascending)。第二步訓練g時,v(g, d)越小越好,所以是減去梯度(descending)。整個訓練過程交替進行。
dcgan的原理和gan是一樣的,這裡就不在贅述。它只是把上述的g和d換成了兩個卷積神經網路(cnn)。但不是直接換就可以了,dcgan對卷積神經網路的結構做了一些改變,以提高樣本的質量和收斂的速度,這些改變有:
取消所有pooling層。g網路中使用轉置卷積(transposed convolutional layer)進行上取樣,d網路中用加入stride的卷積代替pooling。
在d和g中均使用batch normalization
去掉fc層,使網路變為全卷積網路
g網路中使用relu作為啟用函式,最後一層使用tanh
d網路中使用leakyrelu作為啟用函式
dcgan中的g網路示意:
[1] gan學習:gan/dcgan原理、公式推導及實踐
[2] gan學習指南:從原理入門到製作生成demo
[3] 反卷積(transposed convolution)詳細推導
筆記 動手學深度學習
在求數值解的優化演算法中,小批量隨機梯度下降 mini batch stochastic gradient descent 在深度學習中被廣泛使用。它的演算法很簡單 先選取一組模型引數的初始值,如隨機選取 接下來對引數進行多次迭代,使每次迭代都可能降低損失函式的值。在每次迭代中,先隨機均勻取樣乙個由...
動手學深度學習
線性回歸的基本要素 模型 為了簡單起見,這裡我們假設 只取決於房屋狀況的兩個因素,即面積 平方公尺 和房齡 年 接下來我們希望探索 與這兩個因素的具體關係。線性回歸假設輸出與各個輸入之間是線性關係 price warea area wage age b price warea area wage a...
動手學深度學習學習筆記(2)
操作 算術操作 在pytorch中,同一種操作可能有很多種形式,下面用加法作為例子。加法形式一 y torch.rand 5,3 print x y 加法形式二 print torch.add x,y 還可指定輸出 result torch.empty 5,3 torch.add x,y,out r...