DA就是“Denoising Autoencoders”的缩写。继续给yusugomori做注释,边注释边学习。看了一些DA的材料,基本上都在前面“转载”了。学习中间总有个疑问:DA和RBM到底啥区别?(别笑,我不是“学院派”的看Deep Learning理论,如果“顺次”看下来,可能不会有这个问题),现在了解的差不多了,详情见:【deep learning学习笔记】Autoencoder。之后,又有个疑问,DA具体的权重更新公式是怎么推导出来的?我知道是BP算法,不过具体公示的推导、偏导数的求解,没有看到哪个材料有具体的公式,所以姑且认为yusugomori的代码写的是正确的。
注释后的头文件:
// The Class of denoising auto-encoder class dA { public: int N; // the number of training samples int n_visible; // the number of visible nodes int n_hidden; // the number of hidden nodes double **W; // the weight connecting visible node and hidden node double *hbias; // the bias of hidden nodes double *vbias; // the bias of visible nodes public: // initialize the parameters dA ( int, // N int, // n_visible int , // n_hidden double**, // W double*, // hbias double* // vbias ); ~dA(); // make the input noised void get_corrupted_input ( int*, // the original input 0-1 vector -- input int*, // the resulted 0-1 vector gotten noised -- output double // the p probability of noise, binomial test -- input ); // encode process: calculate the probability output from hidden node // p(hi|v) = sigmod ( sum_j(vj * wij) + bi), it's same with RBM // but different from RBM, it dose not generate 0-1 state from Bernoulli distribution void get_hidden_values ( int*, // the input from visible nodes double* // the output of hidden nodes ); // decode process: calculate the probability output from visiable node // p(vi|h) = sigmod ( sum_j(hj * wij) + ci), it's same with RBM // but different from RBM, it dose not generate 0-1 state from Bernoulli distribution void get_reconstructed_input ( double*, // the input from hidden nodes double* // the output reconstructed of visible nodes ); // train the model by a single sample void train ( int*, // the input sample from visiable node double, // the learning rate double // corruption_level is the probability of noise ); // reconstruct the input sample void reconstruct ( int*, // the input sample -- input double* // the reconstructed value -- output ); };