现在的位置: 首页 > 综合 > 正文

deep leaning toolbox学习使用1之NN

2014年04月05日 ⁄ 综合 ⁄ 共 1482字 ⁄ 字号 评论关闭

最近把hinton06年那篇经典文章又看了下,还是有不少不明白的,然后结合hinton的论文和UFLDL教程上来具体分析现在使用比较多的toolbox的实现过程,进而更好的理解deep leaning,今天主要总结一下最基础的NN(neural network),这个可以当做deep learning的整体框架,先从简单的入手吧。

1.数据预处理

使用的是mnist数据集,train 60000*784,test 10000*784

(1)x/255,归到(0,1】范围内

(2)对trainx进行标准化(zsore),即(x-均值)/标准差

Q:数据处理以后,很多维(784维)数据一样或者大部分一样,例如一列都是一样的值,不清楚原因?

(3)对testx进行归一化处理(normalize)

Q:和trainx效果一样,而且很多和trainx值一样,原因?

2.参数初始化

此处使用最简单的三层网络,784:100:10,只整体训练一遍,每次以batch块(100个数据)为单位训练,共训练600次,hidden层的激活函数使用tanh_opt,即正切函数

f(z)=(e^z-e^-z)/(e^z+e^-z),学习率为2(用于bp中的梯度下降),当然激活函数也可以使用sigmoid函数,f(z)=1/(1+e^-z),即逻辑回归

Q:在这里hidden层和最后一层作者使用的不同激活函数,原因?

(1)初始化层间的weights和weights mometum

需要注意的是需要增加一列作为bias,所以W1为100*785,W2为10*101

初始化w时使用rand函数来生成均一分布的随机数,但代码中增加了一些其他的数学运算,原理不清楚?

Q:mometum作用?

(2)定义层间激活率(用于sparity?)

P2=1*100,P3=1*10

3.训练阶段

首先对tranx做随机顺序处理(randperm),以batchsize为单位train,即每次100*784

(1)feedforward pass阶段

首先为x加入一列1,作为bias,所以每次bias都为1?

显然第一层激活量a1=x,a2=tanh_opt(a1*w1^'T),代码中具体函数使用的是f=1.71590*tanh(2/3A),是近似处理??

然后算各个输入加权和,可参考ufldl,以及各层各个神经元的激活值

里面涉及到dropout和稀疏惩罚的处理,暂不涉及,使用过程不清楚?

结束了前n-1层的ff之后,最后一层使用的是sigmoid函数,同时计算error和loss

(2)back propagation阶段

首先计算输出层的残差,并依次计算直到第2层的残差,公式可参考ufldl中,里面注意的是对于f(z)的导数使用已知的激活值来计算,对于不同的激活函数,其导数的公式也不同,对于sigmoid是f(z)=a(1-a),对于tanh_opt,作者用的貌似是个近似公式,这个推倒不清楚?

Q:为什么不适用一样的激活函数?

需要注意的是,在计算时,应该把之前加入的bias那列去掉,也就是去除首列,最后一层无需

所有计算后,即可得到更新权值所需要的偏导值

Q:应该同时更新W和b,但作者只更新了w,是不是也解释了开始的b都设为1?

权值更新公式参考ufldl

同时,作者更新w时,其公式与ufldl中有一点差别,原因?

(3)最后对整个trainx作为整体重新跑了一遍ff,作为一个对比吧

4.test阶段

这个简单,对testx跑一遍ff,得到输出层的激活值,根据激活值中最大的值所在列作为label与testy对比,即得到错误率

整个过程结束。

抱歉!评论已关闭.