標籤:style blog http io ar color os 使用 sp
今天介紹的呢是DL另一個非常重要的模型:SAE
把這個放在最後來說呢,主要是因為在UFLDL tutorial 裡已經介紹得比較詳細了,二來代碼非常簡單(在NN的基礎之上)
先放一張autoencoder的基本結構:
基本意思就是一個隱藏層的神經網路,輸入輸出都是x,屬於無監督學習
==========================================================================================
基本代碼
saesetup.m
[cpp] view plaincopyprint?
- function sae = saesetup(size)
- for u = 2 : numel(size)
- sae.ae{u-1} = nnsetup([size(u-1) size(u) size(u-1)]);
- end
- end
function sae = saesetup(size) for u = 2 : numel(size) sae.ae{u-1} = nnsetup([size(u-1) size(u) size(u-1)]); endend
saetrain.m
[cpp] view plaincopyprint?
- function sae = saetrain(sae, x, opts)
- for i = 1 : numel(sae.ae);
- disp([‘Training AE ‘ num2str(i) ‘/‘ num2str(numel(sae.ae))]);
- sae.ae{i} = nntrain(sae.ae{i}, x, x, opts);
- t = nnff(sae.ae{i}, x, x);
- x = t.a{2};
- %remove bias term
- x = x(:,2:end);
- end
- end
function sae = saetrain(sae, x, opts) for i = 1 : numel(sae.ae); disp([‘Training AE ‘ num2str(i) ‘/‘ num2str(numel(sae.ae))]); sae.ae{i} = nntrain(sae.ae{i}, x, x, opts); t = nnff(sae.ae{i}, x, x); x = t.a{2}; %remove bias term x = x(:,2:end); endend
其實就是每一層一個autoencoder,隱藏層的值作為下一層的輸入
各類變形
為了不致於本文內容太少。。。現在單獨把它的幾個變形提出來說說
sparse autoencoder:
這就是ufldl講的版本,toolbox中的代碼和ufldl中練習的部分基本一致:
在nnff.m中使用:nn.p{i} = 0.99 * nn.p{i} + 0.01 * mean(nn.a{i}, 1);計算
在nnbp.m中使用
pi = repmat(nn.p{i}, size(nn.a{i}, 1), 1);
sparsityError = [zeros(size(nn.a{i},1),1) nn.nonSparsityPenalty * (-nn.sparsityTarget ./ pi + (1 - nn.sparsityTarget) ./ (1 - pi))];
計算sparsityError即可
denoising autoencoder:
denoising其實就是在autoencoder的基礎上,給輸入的x加入雜訊,就相當於dropout用在輸入層
toolbox中的也實現非常簡單:
在nntrain.m中:
batch_x = batch_x.*(rand(size(batch_x))>nn.inputZeroMaskedFraction)
也就是隨即把大小為(nn.inputZeroMaskedFraction)的一部分x賦成0,denoising autoencoder的表現好像比sparse autoencoder要強一些
Contractive Auto-Encoders:
這個變形呢是《Contractive auto-encoders: Explicit invariance during feature extraction》提出的
這篇論文裡也總結了一下autoencoder,感覺很不錯
Contractive autoencoders的模型是:
其中:
hj是表示hidden layer的函數,用它對x求導
論文裡說:這個項是
encourages the mapping to the feature space to be contractive in the neighborhood of the training data
具體的實現呢是:
代碼呢參看:論文作者提供的:點擊開啟連結
主要是
jacobian(self,x):
_jacobi_loss():
_fit_reconstruction():
這幾個函數和autoencoder有出入,其實也比較簡單,就不細講了
總結: 總的來說,autoencoder感覺是DL中比較好理解的一部分,所以介紹內容不長可能你也發現了,Toolbox裡還有一個檔案夾叫CAE,不過這個CAE是Convolutional Auto-Encoders參考http://www.idsia.ch/~ciresan/data/icann2011.pdf,以後有時間再學習一下~
【轉帖】【面向代碼】學習 Deep Learning(四) Stacked Auto-Encoders(SAE)