摘要:稀疏編碼是對(duì)網(wǎng)絡(luò)的隱藏層的輸出有了約束,即隱藏層神經(jīng)元輸出的平均值應(yīng)盡量為。也就是說(shuō),大部分的隱藏層神經(jīng)元都處于非狀態(tài)。為了滿(mǎn)足這一條件,隱藏層神經(jīng)元的活躍度必須接近于。
作者:chen_h
微信號(hào) & QQ:862251340
微信公眾號(hào):coderpai
簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/5f3...
自編碼器 Autoencoder
稀疏自編碼器 Sparse Autoencoder
降噪自編碼器 Denoising Autoencoder
堆疊自編碼器 Stacked Autoencoder
稀疏自編碼器可以看做是自編碼器的一個(gè)變種,它的作用是給隱藏神經(jīng)元加入稀疏性限制,那么自編碼神經(jīng)網(wǎng)絡(luò)即使在隱藏神經(jīng)元數(shù)量較多的情況下任然可以返現(xiàn)輸入數(shù)據(jù)中一些有趣的結(jié)構(gòu)。
稀疏性可以被簡(jiǎn)單地解釋為:如果當(dāng)神經(jīng)元的輸出接近于1的時(shí)候我們認(rèn)為它被激活,而輸出接近于0的時(shí)候認(rèn)為它被抑制,那么使得神經(jīng)元大部分的時(shí)間都是被抑制的限制則被稱(chēng)作稀疏性限制。這里我們假設(shè)的神經(jīng)元的激活函數(shù)是 sigmoid 函數(shù)。如果你使用 tanh 作為激活函數(shù)的話(huà),當(dāng)神經(jīng)元輸出為-1的時(shí)候,我們認(rèn)為神經(jīng)元是被抑制的。
稀疏自編碼器網(wǎng)絡(luò)結(jié)果還是和自編碼器一樣,如下:
稀疏自編碼器與自編碼器的不同點(diǎn)在于損失函數(shù)的設(shè)計(jì)上面。稀疏編碼是對(duì)網(wǎng)絡(luò)的隱藏層的輸出有了約束,即隱藏層神經(jīng)元輸出的平均值應(yīng)盡量為0。也就是說(shuō),大部分的隱藏層神經(jīng)元都處于非 activite 狀態(tài)。因此,此時(shí)的 sparse autoencoder 損失函數(shù)表達(dá)式為:
最后的一項(xiàng)表示KL散度,其具體表達(dá)式如下:
隱藏層神經(jīng)元 j 的平均活躍度計(jì)算如下:
其中,p 是稀疏性參數(shù),通常是一個(gè)接近于0的很小的值(比如 p = 0.05)。換句話(huà)說(shuō),我們想要讓隱藏層神經(jīng)元 j 的平均活躍度接近 0.05 。為了滿(mǎn)足這一條件,隱藏層神經(jīng)元的活躍度必須接近于 0 。為了實(shí)現(xiàn)這一限制,所以我們才設(shè)計(jì)了上面的KL散度。
如果我們假設(shè)平均激活度 p = 0.2,那么我們就能得到下圖的關(guān)系:
從圖中,可以看出,當(dāng)值一旦偏離期望激活度 p 時(shí),這種誤差便會(huì)急劇增大,從而作為稱(chēng)發(fā)現(xiàn)個(gè)添加到目標(biāo)函數(shù),可以指導(dǎo)整個(gè)網(wǎng)絡(luò)學(xué)習(xí)出稀疏的特征表示。
實(shí)驗(yàn)代碼如下:
#!/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
微信號(hào) & QQ:862251340
簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/5f3...
CoderPai 是一個(gè)專(zhuān)注于算法實(shí)戰(zhàn)的平臺(tái),從基礎(chǔ)的算法到人工智能算法都有設(shè)計(jì)。如果你對(duì)算法實(shí)戰(zhàn)感興趣,請(qǐng)快快關(guān)注我們吧。加入AI實(shí)戰(zhàn)微信群,AI實(shí)戰(zhàn)QQ群,ACM算法微信群,ACM算法QQ群。長(zhǎng)按或者掃描如下二維碼,關(guān)注 “CoderPai” 微信號(hào)(coderpai)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41169.html
摘要:實(shí)驗(yàn)基礎(chǔ)其實(shí)實(shí)現(xiàn)該功能的主要步驟還是需要計(jì)算出網(wǎng)絡(luò)的損失函數(shù)以及其偏導(dǎo)數(shù),具體的公式可以參考前面的博文八。生成均勻分布的偽隨機(jī)數(shù)。 前言: 現(xiàn)在來(lái)進(jìn)入sparse autoencoder的一個(gè)實(shí)例練習(xí),參考Ng的網(wǎng)頁(yè)教程:Exercise:Sparse Autoencoder。 這個(gè)例子所要實(shí)現(xiàn)的內(nèi)容大概如下:從給定的很多張自然圖片中截取出大小為8*8的小patches圖片共10000張...
摘要:如果你對(duì)算法實(shí)戰(zhàn)感興趣,請(qǐng)快快關(guān)注我們吧。加入實(shí)戰(zhàn)微信群,實(shí)戰(zhàn)群,算法微信群,算法群。 作者:chen_h微信號(hào) & QQ:862251340微信公眾號(hào):coderpai簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/b5c... 介紹一些人工智能技術(shù)的術(shù)語(yǔ),如果你還有術(shù)語(yǔ)補(bǔ)充,請(qǐng)?jiān)L問(wèn) Github English Terminology 中文術(shù)語(yǔ) neur...
摘要:等訓(xùn)練結(jié)束后,輸出層就可以去掉了,因?yàn)槲覀冎魂P(guān)心的是從到的變換。需要注意的是,整個(gè)網(wǎng)絡(luò)的訓(xùn)練不是一蹴而就的,而是逐層進(jìn)行的。加入實(shí)戰(zhàn)微信群,實(shí)戰(zhàn)群,算法微信群,算法群。 作者:chen_h微信號(hào) & QQ:862251340微信公眾號(hào):coderpai簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/51d... 自編碼器 Autoencoder 稀疏自編碼器 Spa...
摘要:簡(jiǎn)單來(lái)說(shuō)是一個(gè)壓縮編碼器,也就是對(duì)的一坨東西通過(guò)變換,輸出和一樣的東西。例如是一個(gè)雞,也是一個(gè)雞,是一個(gè)鴨,也是一個(gè)鴨。學(xué)術(shù)一點(diǎn)說(shuō)就是找到一個(gè)函數(shù)能夠使得,叫做。加入實(shí)戰(zhàn)微信群,實(shí)戰(zhàn)群,算法微信群,算法群。 作者:chen_h微信號(hào) & QQ:862251340微信公眾號(hào):coderpai簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/fd3... 自編碼器 Auto...
摘要:降噪自編碼器認(rèn)為,設(shè)計(jì)一個(gè)能夠恢復(fù)原始信號(hào)的自編碼器未必是最好的,而能夠?qū)Ρ晃廴酒茐牡脑紨?shù)據(jù)進(jìn)行編碼解碼,然后還能恢復(fù)真正的原始數(shù)據(jù),這樣的特征才是好的。該恢復(fù)信號(hào)盡可能的逼近未被污染的原數(shù)據(jù)。此時(shí),監(jiān)督訓(xùn)練的誤差函數(shù)就從原來(lái)的變成了。 作者:chen_h微信號(hào) & QQ:862251340微信公眾號(hào):coderpai簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/f7...
閱讀 1553·2023-04-26 01:36
閱讀 2719·2021-10-08 10:05
閱讀 2775·2021-08-05 09:57
閱讀 1538·2019-08-30 15:52
閱讀 1193·2019-08-30 14:12
閱讀 1311·2019-08-30 11:17
閱讀 3097·2019-08-29 13:07
閱讀 2415·2019-08-29 12:35