中文名 | 稀疏自編碼器 | 外文名 | Sparse Autoencoder |
---|---|---|---|
領(lǐng)????域 | 深度學(xué)習(xí) |
在自動編碼器AutoEncoder的基礎(chǔ)上加上L1的正則限制(L1主要是約束每一層中的節(jié)點(diǎn)中大部分都要為0,只有少數(shù)不為0,這就是Sparse名字的來源),我們就可以得到Sparse AutoEncoder法。
如圖三,其實(shí)就是限制每次得到的表達(dá)code盡量稀疏。因為稀疏的表達(dá)往往比其他的表達(dá)要有效(人腦好像也是這樣的,某個輸入只是刺激某些神經(jīng)元,其他的大部分的神經(jīng)元是受到抑制的)
對于沒有帶類別標(biāo)簽的數(shù)據(jù),由于為其增加類別標(biāo)記是一個非常麻煩的過程,因此我們希望機(jī)器能夠自己學(xué)習(xí)到樣本中的一些重要特征。通過對隱藏層施加一些限制,能夠使得它在惡劣的環(huán)境下學(xué)習(xí)到能最好表達(dá)樣本的特征,并能有效地對樣本進(jìn)行降維。這種限制可以是對隱藏層稀疏性的限制。
??如果給定一個神經(jīng)網(wǎng)絡(luò),我們假設(shè)其輸出與輸入是相同的,然后訓(xùn)練調(diào)整其參數(shù),得到每一層中的權(quán)重。自然地,我們就得到了輸入的幾種不同表示(每一層代表一種表示),這些表示就是特征。自動編碼器就是一種盡可能復(fù)現(xiàn)輸入信號的神經(jīng)網(wǎng)絡(luò)。為了實(shí)現(xiàn)這種復(fù)現(xiàn),自動編碼器就必須捕捉可以代表輸入數(shù)據(jù)的最重要的因素,就像PCA那樣,找到可以代表原信息的主要成分。
??當(dāng)然,我們還可以繼續(xù)加上一些約束條件得到新的Deep Learning方法,如:如果在AutoEncoder的基礎(chǔ)上加上L1的Regularity限制(L1主要是約束隱含層中的節(jié)點(diǎn)中大部分都要為0,只有少數(shù)不為0,這就是Sparse名字的來源),我們就可以得到Sparse AutoEncoder法。
??之所以要將隱含層稀疏化,是由于,如果隱藏神經(jīng)元的數(shù)量較大(可能比輸入像素的個數(shù)還要多),不稀疏化我們無法得到輸入的壓縮表示。具體來說,如果我們給隱藏神經(jīng)元加入稀疏性限制,那么自編碼神經(jīng)網(wǎng)絡(luò)即使在隱藏神經(jīng)元數(shù)量較多的情況下仍然可以發(fā)現(xiàn)輸入數(shù)據(jù)中一些有趣的結(jié)構(gòu)。
自編碼器最初提出是基于降維的思想,但是當(dāng)隱層節(jié)點(diǎn)比輸入節(jié)點(diǎn)多時,自編碼器就會失去自動學(xué)習(xí)樣本特征的能力,此時就需要對隱層節(jié)點(diǎn)進(jìn)行一定的約束,與降噪自編碼器的出發(fā)點(diǎn)一樣,高維而稀疏的表達(dá)是好的,因此提出對隱層節(jié)點(diǎn)進(jìn)行一些稀疏性的限值。稀疏自編碼器就是在傳統(tǒng)自編碼器的基礎(chǔ)上通過增加一些稀疏性約束得到的。這個稀疏性是針對自編碼器的隱層神經(jīng)元而言的,通過對隱層神經(jīng)元的大部分輸出進(jìn)行抑制使網(wǎng)絡(luò)達(dá)到一個稀疏的效果。
分辨率1000P/R,開路輸出。
PG是脈沖發(fā)生器(Pulse Generator)的縮寫PG的功能的是產(chǎn)生脈沖信號,信號主要含兩方面信息1,檢測轉(zhuǎn)子的磁極位置,并根據(jù)該位置通入電流2,檢測機(jī)械的位置和速度
每臺編碼器的規(guī)格指標(biāo)中,都有標(biāo)明 分辨率是多少。 單位是 線/圈; 假設(shè)是 1024線/圈,那么就意味著 編碼器每轉(zhuǎn)一圈,就將送出1024個A相和1024個B相的脈沖。 這時就看你的脈...
假設(shè)我們只有一個沒有帶類別標(biāo)簽的訓(xùn)練樣本集合
自編碼神經(jīng)網(wǎng)絡(luò)嘗試學(xué)習(xí)一個
我們剛才的論述是基于隱藏神經(jīng)元數(shù)量較小的假設(shè)。但是即使隱藏神經(jīng)元的數(shù)量較大(可能比輸入像素的個數(shù)還要多),我們?nèi)匀煌ㄟ^給自編碼神經(jīng)網(wǎng)絡(luò)施加一些其他的限制條件來發(fā)現(xiàn)輸入數(shù)據(jù)中的結(jié)構(gòu)。具體來說,如果我們給隱藏神經(jīng)元加入稀疏性限制,那么自編碼神經(jīng)網(wǎng)絡(luò)即使在隱藏神經(jīng)元數(shù)量較多的情況下仍然可以發(fā)現(xiàn)輸入數(shù)據(jù)中一些有趣的結(jié)構(gòu)。
稀疏性可以被簡單地解釋如下。如果當(dāng)神經(jīng)元的輸出接近于1的時候我們認(rèn)為它被激活,而輸出接近于0的時候認(rèn)為它被抑制,那么使得神經(jīng)元大部分的時間都是被抑制的限制則被稱作稀疏性限制。這里我們假設(shè)的神經(jīng)元的激活函數(shù)是sigmoid函數(shù)。如果你使用tanh作為激活函數(shù)的話,當(dāng)神經(jīng)元輸出為-1的時候,我們認(rèn)為神經(jīng)元是被抑制的。
注意到
進(jìn)一步,讓
表示隱藏神經(jīng)元
其中,
為了實(shí)現(xiàn)這一限制,我們將會在我們的優(yōu)化目標(biāo)函數(shù)中加入一個額外的懲罰因子,而這一懲罰因子將懲罰那些
這里,
其中
這一懲罰因子有如下性質(zhì),當(dāng)
我們可以看出,相對熵在
我們的總體代價函數(shù)可以表示為
其中
為了對相對熵進(jìn)行導(dǎo)數(shù)計算,我們可以使用一個易于實(shí)現(xiàn)的技巧,這只需要在你的程序中稍作改動即可。具體來說,前面在后向傳播算法中計算第二層(
我們將其換成
就可以了。
有一個需要注意的地方就是我們需要知道
證明上面算法能達(dá)到梯度下降效果的完整推導(dǎo)過程不再本教程的范圍之內(nèi)。不過如果你想要使用經(jīng)過以上修改的后向傳播來實(shí)現(xiàn)自編碼神經(jīng)網(wǎng)絡(luò),那么你就會對目標(biāo)函數(shù)
稀疏性可以被簡單地解釋如下。如果當(dāng)神經(jīng)元的輸出接近于1的時候我們認(rèn)為它被激活,而輸出接近于0的時候認(rèn)為它被抑制,那么使得神經(jīng)元大部分的時間都是被抑制的限制則被稱作稀疏性限制。這里我們假設(shè)的神經(jīng)元的激活函數(shù)是sigmoid函數(shù)。如果你使用tanh作為激活函數(shù)的話,當(dāng)神經(jīng)元輸出為-1的時候,我們認(rèn)為神經(jīng)元是被抑制的。
input_nodes=8*8//輸入節(jié)點(diǎn)數(shù) hidden_size=100//隱藏節(jié)點(diǎn)數(shù) output_nodes=8*8//輸出節(jié)點(diǎn)數(shù)
從mat文件中讀取圖像塊,隨機(jī)生成10000個8*8的圖像塊。
defsampleImage(): mat=scipy.io.loadmat('F:/ml/code/IMAGES.mat') pic=mat['IMAGES'] shape=pic.shape patchsize=8 numpatches=1000 patches=[] i=np.random.randint(0,shape[0]-patchsize,numpatches) j=np.random.randint(0,shape[1]-patchsize,numpatches) k=np.random.randint(0,shape[2],numpatches) forlinrange(numpatches): temp=pic[i[l]:(i[l] patchsize),j[l]:(j[l] patchsize),k[l]] temp=temp.reshape(patchsize*patchsize) patches.append(temp) returnpatches
defxvaier_init(input_size,output_size): low=-np.sqrt(6.0/(input_nodes output_nodes)) high=-low returntf.random_uniform((input_size,output_size),low,high,dtype=tf.float32)
代價函數(shù)由三部分組成,均方差項,權(quán)重衰減項,以及稀疏因子項。
defcomputecost(w,b,x,w1,b1): p=0.1 beta=3 lamda=0.00001 hidden_output=tf.sigmoid(tf.matmul(x,w) b) pj=tf.reduce_mean(hidden_output,0) sparse_cost=tf.reduce_sum(p*tf.log(p/pj) (1-p)*tf.log((1-p)/(1-pj))) output=tf.sigmoid(tf.matmul(hidden_output,w1) b1) regular=lamda*(tf.reduce_sum(w*w) tf.reduce_sum(w1*w1))/2 cross_entropy=tf.reduce_mean(tf.pow(output-x,2))/2 sparse_cost*beta regular# regular sparse_cost*beta returncross_entropy,hidden_output,output
為了使隱藏單元得到最大激勵(隱藏單元需要什么樣的特征輸入),將這些特征輸入顯示出來。
defshow_image(w): sum=np.sqrt(np.sum(w**2,0)) changedw=w/sum a,b=changedw.shape c=np.sqrt(a*b) d=int(np.sqrt(a)) e=int(c/d) buf=1 newimage=-np.ones((buf (d buf)*e,buf (d buf)*e)) k=0 foriinrange(e): forjinrange(e): maxvalue=np.amax(changedw[:,k]) if(maxvalue<0): maxvalue=-maxvalue newimage[(buf i*(d buf)):(buf i*(d buf) d),(buf j*(d buf)):(buf j*(d buf) d)]= np.reshape(changedw[:,k],(d,d))/maxvalue k =1 plt.figure("beauty") plt.imshow(newimage) plt.axis('off') plt.show()
通過AdamOptimizer下降誤差,調(diào)節(jié)參數(shù)。
defmain(): w=tf.Variable(xvaier_init(input_nodes,hidden_size)) b=tf.Variable(tf.truncated_normal([hidden_size],0.1)) x=tf.placeholder(tf.float32,shape=[None,input_nodes]) w1=tf.Variable(tf.truncated_normal([hidden_size,input_nodes],-0.1,0.1)) b1=tf.Variable(tf.truncated_normal([output_nodes],0.1)) cost,hidden_output,output=computecost(w,b,x,w1,b1) train_step=tf.train.AdamOptimizer().minimize(cost) train_x=sampleImage() sess=tf.Session() sess.run(tf.global_variables_initializer()) foriinrange(100000): _,hidden_output_,output_,cost_,w_=sess.run([train_step,hidden_output,output,cost,w], feed_dict={x:train_x}) ifi00==0: print(hidden_output_) print(output_) print(cost_) np.save("weights1.npy",w_) show_image(w_)2100433B
文| Aaqilb Saeed 譯| 翟向洋
包括完整代碼和數(shù)據(jù)集的 ipython 筆記本可以從閱讀原文鏈接內(nèi)獲得。
在本教程中,我們會把去噪自編碼應(yīng)用在購物籃(market basket)數(shù)據(jù)的協(xié)同濾波上。學(xué)習(xí)模型將根據(jù)用戶購物籃中的商品來推薦相近的商品。
本教程使用的是 groceries 數(shù)據(jù)集,它包括 9835 次交易(即在購物籃中被一起購買的商品條目)。我們將數(shù)據(jù)進(jìn)行訓(xùn)練、測試和驗證。圖 1 描述了原始數(shù)據(jù)集,我們需要處理并將其轉(zhuǎn)換為對輸入模型可用的格式。為此,每一次交易都將被表示為一個二進(jìn)制向量,其中 1 表示某個商品在購物籃,否則為 0 。讓我們首先讀取該數(shù)據(jù)集并定義幾個輔助函數(shù),找出單一的商品條目,將他們轉(zhuǎn)換成 One-hot encoded(一位有效編碼的)形式,并從二進(jìn)制向量轉(zhuǎn)換為商品條目。此外,圖 2 提供了 10 項在數(shù)據(jù)集中最頻繁出現(xiàn)的商品條目。
圖一: 購物籃數(shù)據(jù)
圖二:數(shù)據(jù)集中出現(xiàn)最多的貨品
自編碼器模型試著(learn)重建它自己的輸入。當(dāng)這樣做的時候,它學(xué)習(xí)(learn)數(shù)據(jù)的突出表示。因此,它也用來實(shí)現(xiàn)降維的目的。該模型由兩個組件組成:一個編碼器和一個解碼器。編碼器映射輸入-->,解碼器從降維重新產(chǎn)生輸入,即映射-->。輸入中的噪聲被引入(例如通過Dropout)到訓(xùn)練集,避免了學(xué)習(xí)一個恒等函數(shù),由此得名為自編碼降噪。在我們的例子中,在模型訓(xùn)練期間,一些缺少某些物品的嘈雜或損壞的購物籃數(shù)據(jù)將被用作輸入。在測試期間,一位有效編碼的購物籃的商品條目將被饋入模型以獲得商品條目預(yù)測。然后從輸出,我們必須選擇概率比一些閾值更大的商品條目(此例,如果p>=0.1,則為1,否則為0),以轉(zhuǎn)換回一位有效編碼向量。最后,在二進(jìn)制向量中帶有1的商品條目將被推薦給用戶。
現(xiàn)在讓我們定義一個4層自編碼降噪模型(例如,4層編碼器和4層解碼器)。軟標(biāo)記激活函數(shù)(the soft sign activation function)用在前三層的編碼器和解碼器,而sigmoid用在第四層。二進(jìn)制交叉熵被用作使用隨機(jī)梯度下降法的變體(通常稱為Adam)來最小化的損失函數(shù)。模型架構(gòu)如圖2所示,可以看出輸入維數(shù)為169(即數(shù)據(jù)集中單一商品條目的數(shù)量)。同樣,神經(jīng)元的數(shù)量在第一、第二、第三和第四層分別是128、64、32和16。在輸入層以0.6的概率引入流失(dropout)(即隨機(jī)流失40%的輸入)。此外,編碼器的權(quán)重使用頻率為0.00001的則正則化。
圖三:降噪模型的結(jié)構(gòu)
這里是所有的代碼:我們需要定義我們的模型。以下提供的代碼會訓(xùn)練/評估自編碼器并計算ROC、AUC的分?jǐn)?shù)。
以下是該模型提供的一些關(guān)于測試集的推薦結(jié)果:
購物車中的商品條目:火腿、草藥、洋蔥、起泡酒
推薦的商品條目:瓶裝水,其他蔬菜,面包(卷),根蔬菜,購物袋,蘇打水,熱帶水果,全脂牛奶,酸奶
購物車中的商品條目:餐巾,香腸,白葡萄酒
推薦的商品條目:其他蔬菜,面包(卷),蘇打水,全脂牛奶,酸奶
購物車中的商品條目:磨砂清潔劑,糖果,雞肉,清潔劑,根蔬菜,香腸,熱帶水果,全脂牛奶,酸奶
推薦的商品條目:牛肉,瓶裝啤酒,瓶裝水,棕色面包,黃油,罐裝啤酒,柑橘類水果,咖啡,凝乳,國產(chǎn)雞蛋,法蘭克福香腸,水果/蔬菜汁,人造黃油,報紙,其他蔬菜,糕點(diǎn),水果,豬肉,卷餅/饅頭,根蔬菜,香腸,購物袋,蘇打水,熱帶水果,鞭打/酸奶油,酸奶
-END-
譯者 | 翟向洋
北京理工大學(xué)研究生一枚,吃瓜群眾,熱愛學(xué)習(xí)。
后臺回復(fù) “志愿者”
了解如何加入我們
譯碼器是組合邏輯電路的一個重要的器件,其可以分為:變量譯碼和顯示譯碼兩類。
變量譯碼:一般是一種較少輸入變?yōu)檩^多輸出的器件,一般分為2n譯碼和8421BCD碼譯碼兩類。
顯示譯碼:主要解決二進(jìn)制數(shù)顯示成對應(yīng)的十、或十六進(jìn)制數(shù)的轉(zhuǎn)換功能,一般其可分為驅(qū)動LED和驅(qū)動LCD兩類。
譯碼是編碼的逆過程,在編碼時,每一種二進(jìn)制代碼,都賦予了特定的含義,即都表示了一個確定的信號或者對象。把代碼狀態(tài)的特定含義"翻譯"出來的過程叫做譯碼,實(shí)現(xiàn)譯碼操作的電路稱為譯碼器?;蛘哒f,譯碼器是可以將輸入二進(jìn)制代碼的狀態(tài)翻譯成輸出信號,以表示其原來含義的電路。
根據(jù)需要,輸出信號可以是脈沖,也可以是高電平或者低電平。
譯碼器的種類很多,但它們的工作原理和分析設(shè)計方法大同小異,其中二進(jìn)制譯碼器、二-十進(jìn)制譯碼器和顯示譯碼器是三種最典型,使用十分廣泛的譯碼電路。
二進(jìn)制碼譯碼器,也稱最小項譯碼器,N中取一譯碼器,最小項譯碼器一般是將二進(jìn)制碼譯為十進(jìn)制碼;
代碼轉(zhuǎn)換譯碼器,是從一種編碼轉(zhuǎn)換為另一種編碼;
顯示譯碼器,一般是將一種編碼譯成十進(jìn)制碼或特定的編碼,并通過顯示器件將譯碼器的狀態(tài)顯示出來。