摘要:稀疏編碼是對網(wǎng)絡(luò)的隱藏層的輸出有了約束,即隱藏層神經(jīng)元輸出的平均值應(yīng)盡量為。也就是說,大部分的隱藏層神經(jīng)元都處于非狀態(tài)。為了滿足這一條件,隱藏層神經(jīng)元的活躍度必須接近于。
作者:chen_h
微信號 & QQ:862251340
微信公眾號:coderpai
簡書地址:https://www.jianshu.com/p/5f3...
自編碼器 Autoencoder
稀疏自編碼器 Sparse Autoencoder
降噪自編碼器 Denoising Autoencoder
堆疊自編碼器 Stacked Autoencoder
稀疏自編碼器可以看做是自編碼器的一個變種,它的作用是給隱藏神經(jīng)元加入稀疏性限制,那么自編碼神經(jīng)網(wǎng)絡(luò)即使在隱藏神經(jīng)元數(shù)量較多的情況下任然可以返現(xiàn)輸入數(shù)據(jù)中一些有趣的結(jié)構(gòu)。
稀疏性可以被簡單地解釋為:如果當神經(jīng)元的輸出接近于1的時候我們認為它被激活,而輸出接近于0的時候認為它被抑制,那么使得神經(jīng)元大部分的時間都是被抑制的限制則被稱作稀疏性限制。這里我們假設(shè)的神經(jīng)元的激活函數(shù)是 sigmoid 函數(shù)。如果你使用 tanh 作為激活函數(shù)的話,當神經(jīng)元輸出為-1的時候,我們認為神經(jīng)元是被抑制的。
稀疏自編碼器網(wǎng)絡(luò)結(jié)果還是和自編碼器一樣,如下:
稀疏自編碼器與自編碼器的不同點在于損失函數(shù)的設(shè)計上面。稀疏編碼是對網(wǎng)絡(luò)的隱藏層的輸出有了約束,即隱藏層神經(jīng)元輸出的平均值應(yīng)盡量為0。也就是說,大部分的隱藏層神經(jīng)元都處于非 activite 狀態(tài)。因此,此時的 sparse autoencoder 損失函數(shù)表達式為:
最后的一項表示KL散度,其具體表達式如下:
隱藏層神經(jīng)元 j 的平均活躍度計算如下:
其中,p 是稀疏性參數(shù),通常是一個接近于0的很小的值(比如 p = 0.05)。換句話說,我們想要讓隱藏層神經(jīng)元 j 的平均活躍度接近 0.05 。為了滿足這一條件,隱藏層神經(jīng)元的活躍度必須接近于 0 。為了實現(xiàn)這一限制,所以我們才設(shè)計了上面的KL散度。
如果我們假設(shè)平均激活度 p = 0.2,那么我們就能得到下圖的關(guān)系:
從圖中,可以看出,當值一旦偏離期望激活度 p 時,這種誤差便會急劇增大,從而作為稱發(fā)現(xiàn)個添加到目標函數(shù),可以指導(dǎo)整個網(wǎng)絡(luò)學(xué)習出稀疏的特征表示。
實驗代碼如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np N_INPUT = 4 N_HIDDEN = 100 N_OUTPUT = N_INPUT BETA = tf.constant(3.0) LAMBDA = tf.constant(.0001) EPSILON = .00001 RHO = .1 def diff(input_data, output_data): ans = tf.reduce_sum(tf.pow(tf.sub(output_data, input_data), 2)) return ans def main(_): weights = { "hidden": tf.Variable(tf.random_normal([N_INPUT, N_HIDDEN]), name = "w_hidden"), "out": tf.Variable(tf.random_normal([N_HIDDEN, N_OUTPUT]), name = "w_out") } biases = { "hidden": tf.Variable(tf.random_normal([N_HIDDEN]), name = "b_hidden"), "out": tf.Variable(tf.random_normal([N_OUTPUT]), name = "b_out") } def KLD(p, q): invrho = tf.sub(tf.constant(1.), p) invrhohat = tf.sub(tf.constant(1.), q) addrho = tf.add(tf.mul(p, tf.log(tf.div(p, q))), tf.mul(invrho, tf.log(tf.div(invrho, invrhohat)))) return tf.reduce_sum(addrho) with tf.name_scope("input"): # input placeholders x = tf.placeholder("float", [None, N_INPUT], name = "x_input") #hidden = tf.placeholder("float", [None, N_HIDDEN], name = "hidden_activation") with tf.name_scope("hidden_layer"): # from input layer to hidden layer hiddenlayer = tf.sigmoid(tf.add(tf.matmul(x, weights["hidden"]), biases["hidden"])) with tf.name_scope("output_layer"): # from hidden layer to output layer out = tf.nn.softmax(tf.add(tf.matmul(hiddenlayer, weights["out"]), biases["out"])) with tf.name_scope("loss"): # loss items cost_J = tf.reduce_sum(tf.pow(tf.sub(out, x), 2)) with tf.name_scope("cost_sparse"): # KL Divergence items rho_hat = tf.div(tf.reduce_sum(hiddenlayer), N_HIDDEN) cost_sparse = tf.mul(BETA, KLD(RHO, rho_hat)) with tf.name_scope("cost_reg"): # Regular items cost_reg = tf.mul(LAMBDA, tf.add(tf.nn.l2_loss(weights["hidden"]), tf.nn.l2_loss(weights["out"]))) with tf.name_scope("cost"): # cost function cost = tf.add(tf.add(cost_J, cost_reg), cost_sparse) optimizer = tf.train.AdamOptimizer().minimize(cost) with tf.Session() as sess: init = tf.initialize_all_variables() sess.run(init) input_data = np.array([[0,0,0,1],[0,0,1,0],[0,1,0,0],[1,0,0,0]], float) for i in xrange(10000): sess.run(optimizer, feed_dict = {x: input_data}) if i % 100 == 0: tmp = sess.run(out, feed_dict = {x: input_data}) print i, sess.run(diff(tmp, input_data)) tmp = sess.run(out, feed_dict = {x: input_data}) print tmp if __name__ == "__main__": tf.app.run()
Reference:
Stanford Lecture
UFLDL
SAE code
作者:chen_h
微信號 & QQ:862251340
簡書地址:https://www.jianshu.com/p/5f3...
CoderPai 是一個專注于算法實戰(zhàn)的平臺,從基礎(chǔ)的算法到人工智能算法都有設(shè)計。如果你對算法實戰(zhàn)感興趣,請快快關(guān)注我們吧。加入AI實戰(zhàn)微信群,AI實戰(zhàn)QQ群,ACM算法微信群,ACM算法QQ群。長按或者掃描如下二維碼,關(guān)注 “CoderPai” 微信號(coderpai)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/41169.html
摘要:實驗基礎(chǔ)其實實現(xiàn)該功能的主要步驟還是需要計算出網(wǎng)絡(luò)的損失函數(shù)以及其偏導(dǎo)數(shù),具體的公式可以參考前面的博文八。生成均勻分布的偽隨機數(shù)。 前言: 現(xiàn)在來進入sparse autoencoder的一個實例練習,參考Ng的網(wǎng)頁教程:Exercise:Sparse Autoencoder。 這個例子所要實現(xiàn)的內(nèi)容大概如下:從給定的很多張自然圖片中截取出大小為8*8的小patches圖片共10000張...
摘要:如果你對算法實戰(zhàn)感興趣,請快快關(guān)注我們吧。加入實戰(zhàn)微信群,實戰(zhàn)群,算法微信群,算法群。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/b5c... 介紹一些人工智能技術(shù)的術(shù)語,如果你還有術(shù)語補充,請訪問 Github English Terminology 中文術(shù)語 neur...
摘要:等訓(xùn)練結(jié)束后,輸出層就可以去掉了,因為我們只關(guān)心的是從到的變換。需要注意的是,整個網(wǎng)絡(luò)的訓(xùn)練不是一蹴而就的,而是逐層進行的。加入實戰(zhàn)微信群,實戰(zhàn)群,算法微信群,算法群。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/51d... 自編碼器 Autoencoder 稀疏自編碼器 Spa...
摘要:簡單來說是一個壓縮編碼器,也就是對的一坨東西通過變換,輸出和一樣的東西。例如是一個雞,也是一個雞,是一個鴨,也是一個鴨。學(xué)術(shù)一點說就是找到一個函數(shù)能夠使得,叫做。加入實戰(zhàn)微信群,實戰(zhàn)群,算法微信群,算法群。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/fd3... 自編碼器 Auto...
摘要:降噪自編碼器認為,設(shè)計一個能夠恢復(fù)原始信號的自編碼器未必是最好的,而能夠?qū)Ρ晃廴酒茐牡脑紨?shù)據(jù)進行編碼解碼,然后還能恢復(fù)真正的原始數(shù)據(jù),這樣的特征才是好的。該恢復(fù)信號盡可能的逼近未被污染的原數(shù)據(jù)。此時,監(jiān)督訓(xùn)練的誤差函數(shù)就從原來的變成了。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/f7...
閱讀 1624·2023-04-26 01:36
閱讀 2793·2021-10-08 10:05
閱讀 2837·2021-08-05 09:57
閱讀 1591·2019-08-30 15:52
閱讀 1253·2019-08-30 14:12
閱讀 1378·2019-08-30 11:17
閱讀 3186·2019-08-29 13:07
閱讀 2506·2019-08-29 12:35