简单易懂的自动编码器(简单辅助官网)
作者:葉虎
編輯:田旭
引言
自動編碼器是一種無監(jiān)督的神經(jīng)網(wǎng)絡(luò)模型,它可以學(xué)習(xí)到輸入數(shù)據(jù)的隱含特征,這稱為編碼(coding),同時用學(xué)習(xí)到的新特征可以重構(gòu)出原始輸入數(shù)據(jù),稱之為解碼(decoding)。從直觀上來看,自動編碼器可以用于特征降維,類似主成分分析PCA,但是其相比PCA其性能更強(qiáng),這是由于神經(jīng)網(wǎng)絡(luò)模型可以提取更有效的新特征。除了進(jìn)行特征降維,自動編碼器學(xué)習(xí)到的新特征可以送入有監(jiān)督學(xué)習(xí)模型中,所以自動編碼器可以起到特征提取器的作用。作為無監(jiān)督學(xué)習(xí)模型,自動編碼器還可以用于生成與訓(xùn)練樣本不同的新數(shù)據(jù),這樣自動編碼器(變分自動編碼器,VariationalAutoencoders)就是生成式模型。
本文將會講述自動編碼器的基本原理以及常用的自動編碼器模型:堆棧自動編碼器(StackedAutoencoder)。后序的文章會講解自動編碼器其他模型:去噪自動編碼器(DenoisingAutoencoder),稀疏自動編碼器(SparseAutoencoder)以及變分自動編碼器。所有的模型都會使用Tensorflow進(jìn)行編程實(shí)現(xiàn)。
自動編碼器原理
自動編碼器的基本結(jié)構(gòu)如圖1所示,包括編碼和解碼兩個過程:
圖1自動編碼器的編碼與解碼
自動編碼器是將輸入進(jìn)行編碼,得到新的特征,并且希望原始的輸入能夠從新的特征重構(gòu)出來。編碼過程如下:
可以看到,和神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)一樣,其編碼就是線性組合之后加上非線性的激活函數(shù)。如果沒有非線性的包裝,那么自動編碼器就和普通的PCA沒有本質(zhì)區(qū)別了。利用新的特征,可以對輸入重構(gòu),即解碼過程:
我們希望重構(gòu)出的和盡可能一致,可以采用最小化負(fù)對數(shù)似然的損失函數(shù)來訓(xùn)練這個模型:
對于高斯分布的數(shù)據(jù),采用均方誤差就好,而對于伯努利分布可以采用交叉熵,這個是可以根據(jù)似然函數(shù)推導(dǎo)出來的。一般情況下,我們會對自動編碼器加上一些限制,常用的是使,這稱為綁定權(quán)重(tiedweights),本文所有的自動編碼器都加上這個限制。有時候,我們還會給自動編碼器加上更多的約束條件,去噪自動編碼器以及稀疏自動編碼器就屬于這種情況,因?yàn)榇蟛糠謺r候單純地重構(gòu)原始輸入并沒有什么意義,我們希望自動編碼器在近似重構(gòu)原始輸入的情況下能夠捕捉到原始輸入更有價值的信息。
堆棧自動編碼器
前面我們講了自動編碼器的原理,不過所展示的自動編碼器只是簡答的含有一層,其實(shí)可以采用更深層的架構(gòu),這就是堆棧自動編碼器或者深度自動編碼器,本質(zhì)上就是增加中間特征層數(shù)。這里我們以MNIST數(shù)據(jù)為例來說明自動編碼器,建立兩個隱含層的自動編碼器,如圖2所示:
圖2堆棧自動編碼器架構(gòu)
對于MNIST來說,其輸入是28*28=784維度的特征,這里使用了兩個隱含層其維度分別為300和150,可以看到是不斷降低特征的維度了。得到的最終編碼為150維度的特征,使用這個特征進(jìn)行反向重構(gòu)得到重建的特征,我們希望重建特征和原始特征盡量相同。由于MNIST是0,1量,可以采用交叉熵作為損失函數(shù),TF的代碼核心代碼如下:
(左右滑動,查看完整代碼)
n_inputs = 28*28
n_hidden1 = 300
n_hidden2 = 150
# 定義輸入占位符:不需要y
X = tf.placeholder(tf.float32, [None, n_inputs])
# 定義訓(xùn)練參數(shù)
initializer = tf.contrib.layers.variance_scaling_initializer()
W1 = tf.Variable(initializer([n_inputs, n_hidden1]), name="W1")
b1 = tf.Variable(tf.zeros([n_hidden1,]), name="b1")
W2 = tf.Variable(initializer([n_hidden1, n_hidden2]), name="W2")
b2 = tf.Variable(tf.zeros([n_hidden2,]), name="b2")
W3 = tf.transpose(W2, name="W3")
b3 = tf.Variable(tf.zeros([n_hidden1,]), name="b3")
W4 = tf.transpose(W1, name="W4")
b4 = tf.Variable(tf.zeros([n_inputs,]), name="b4")
# 構(gòu)建模型
h1 = tf.nn.sigmoid(tf.nn.xw_plus_b(X, W1, b1))
h2 = tf.nn.sigmoid(tf.nn.xw_plus_b(h1, W2, b2))
h3 = tf.nn.sigmoid(tf.nn.xw_plus_b(h2, W3, b3))
outputs = tf.nn.sigmoid(tf.nn.xw_plus_b(h3, W4, b4))
# 定義loss
loss = -tf.reduce_mean(tf.reduce_sum(X * tf.log(outputs) +
(1 - X) * tf.log(1 - outputs), axis=1))
train_op = tf.train.AdamOptimizer(1e-02).minimize(loss)
當(dāng)訓(xùn)練這個模型后,你可以將原始MNIST的數(shù)字手寫體與重構(gòu)出的手寫體做個比較,如圖3所示,上面是原始圖片,而下面是重構(gòu)圖片,基本上沒有差別了。盡管我們將維度從784降低到了150,得到的新特征還是抓取了原始特征的核心信息。
圖3原始圖片(上)與重構(gòu)圖片對比(下)
有一點(diǎn),上面的訓(xùn)練過程是一下子訓(xùn)練完成的,其實(shí)對于堆棧編碼器來說,有時候會采用逐層訓(xùn)練方式。直白點(diǎn)就是一層一層地訓(xùn)練:先訓(xùn)練X->h1的編碼,使h1->X的重構(gòu)誤差最小化;之后再訓(xùn)練h1->h2的編碼,使h2->h1的重構(gòu)誤差最小化。其實(shí)現(xiàn)代碼如下:
(左右滑動,查看完整代碼)
# 構(gòu)建模型
h1 = tf.nn.sigmoid(tf.nn.xw_plus_b(X, W1, b1))
h1_recon = tf.nn.sigmoid(tf.nn.xw_plus_b(h1, W4, b4))
h2 = tf.nn.sigmoid(tf.nn.xw_plus_b(h1, W2, b2))
h2_recon = tf.nn.sigmoid(tf.nn.xw_plus_b(h2, W3, b3))
outputs = tf.nn.sigmoid(tf.nn.xw_plus_b(h2_recon, W4, b4))
learning_rate = 1e-02
# X->h1
with tf.name_scope("layer1"):
layer1_loss = -tf.reduce_mean(tf.reduce_sum(X * tf.log(h1_recon) +
(1-X) * tf.log(1-h1_recon), axis=1))
layer1_train_op = tf.train.AdamOptimizer(learning_rate).minimize(layer1_loss,
var_list=[W1, b1, b4])
# h1->h2
with tf.name_scope("layer2"):
layer2_loss = -tf.reduce_mean(tf.reduce_sum(h1 * tf.log(h2_recon) +
(1 - h1) * tf.log(1 - h2_recon), axis=1))
layer2_train_op = tf.train.AdamOptimizer(learning_rate).minimize(layer2_loss,
var_list=[W2, b2, b3])
分層訓(xùn)練之后,最終得到如圖4所示的對比結(jié)果,結(jié)果還是不錯的。
圖4原始圖片(上)與重構(gòu)圖片對比(下)
小結(jié)
自動編碼器應(yīng)該是最通俗易懂的無監(jiān)督神經(jīng)網(wǎng)絡(luò)模型,這里我們介紹了其基本原理及堆棧自動編碼器。后序會介紹更多的自動編碼器模型。
參考文獻(xiàn)
1. Hands-On Machine Learning withScikit-Learn and TensorFlow, Aurélien Géron, 2017.
2. Deep Learning Tutorials:AutoEncoders, Denoising Autoencoders.
http://deeplearning.net/tutorial/dA.html#daa
3. Learning deep architectures for AI, Foundations and Trends inMachine Learning, Y. Bengio, 2009.
往
期
推
薦
1.全面直觀認(rèn)識深度神經(jīng)網(wǎng)絡(luò)
2.機(jī)器學(xué)習(xí)實(shí)戰(zhàn)——LBP特征提取
3.RNN入門與實(shí)踐
4.Logistic回歸實(shí)戰(zhàn)篇之預(yù)測病馬死亡率(三)
掃描個人微信號,
拉你進(jìn)機(jī)器學(xué)習(xí)大牛群。
福利滿滿,名額已不多…
80%的AI從業(yè)者已關(guān)注我們微信公眾號
總結(jié)
以上是生活随笔為你收集整理的简单易懂的自动编码器(简单辅助官网)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Spartacus catego
- 下一篇: 计算ip地址的有效范围是_ip地址如何计