[关闭]
@cleardusk 2015-11-30T12:22:43.000000Z 字数 4334 阅读 1833

学习记录.2015.11.20

GjzCV


neural networks and deep learning online book

这周主要的大部分工作是看这本 NN and DL 的在线书,这周前四天主要看这个,目前看到第三章,书里有很多 details,也有不少拓展链接,虽是入门书,但能看出来作者对 NN 和 DL 相当的了解与理解(至少对正在入门的我而言)。我大概说一下看过的内容(有些不太记得)。第一章讲了两种神经元模型:Perceptrons,Sigmoid neurons; Perceptrons 在理论上还可以模拟任何的门电路,这样在理论上就可以执行任何运算,作者总结的这段话很有意思;升级版成了 Sigmoid neurons,多了个 Sigmoid 函数,第三章也讲了如何以及如何挑选 Sigmoid 函数;接着讲了神经网络的基本架构、讲并用 SGD 算法更新 w(weights) 和 b(biases),计算梯度用了 BP 算法,对 BP 的解释以及推导在第二章;BP 的推导并不难,直觉上难以掌握的,是变量与变量之间的关系,BP 中是 wa(activication),aC (优化函数),求偏导利用链式法则。核心部分如下。

network

ΔaljaljwljkΔwljk.(1)

Δal+1qal+1qaljΔalj.(2)

Δal+1qal+1qaljaljwljkΔwljk.(3)

ΔCCaLmaLmaL1naL1naL2pal+1qaljaljwljkΔwljk,(4)

当然,就算知道算法,实现起来也非容易。这个版本的 network 模型的 Python 源码我仔细的阅读研究了几遍,一点感想,虽然之前接触过 numpy ,但大多用来跟 matplotlib 结合画图等,接触了 numpy 的一些函数,感觉 numpy 在矩阵处理上还是很不错的,没有 matlab 那么直接用符号运算方便,但其实只要知道算法,知道矩阵有哪些操作(我知道的很少),用 matlab 和 python 或者 c++ 等用起来都差不多的;作者之所以用 Python,猜测有几点原因:库多,语法简单(就我接触的, Python 的 tricks 很多,需要大量的积累,相比之下,c 语言很纯粹),可读性强(个人认为这点 matlab 比不了)。研究源码后,有个简单的练习题:无隐藏层的网络,你能将最高准确率调到多少?我的做法是,调整 epoch, mini_batchsize, eta(η)值,每种情况跑三次取平均值,blabla,测试代码及 log 在这里。结论是 epochs 多一点,eta 少一点,batch_size 貌似没啥影响。就这么一个简单的网络,一次就要两三分钟,我是估算了时间,第二天醒来的时候才跑完的。

第三章就开始涉及如何提高准确率了。包括:如何选择更好的 cost function,比如 cross-entropy cost function,以及分析为什么这个 cost function 更好;overfitting 及 rugularization methods 以及哪个方法能让 network better;还有初始化 weights 更好的方法;最后涉及到如何选择参数、一些 neuron model、other techniques。
比如cross-entropy cost function:

C=1nx[ylna+(1y)ln(1a)],(5)

梯度:
Cwj=1nxxj(σ(z)y).(6)

Cb=1nx(σ(z)y).(7)

之前的 sigmoid 函数的梯度:
Cw=(ay)σ(z)x=aσ(z)r(8)

Cb=(ay)σ(z)=aσ(z)(9)

很明显,在计算值与目标值差距较大时,在 update wb 时,(6)(7)明细比(8)(9)占优势,调整的速度更快。

第三章还没看完,我也想直接看第六章的 deep learning 部分,有讲 ConvNet 等模型,但还是忍住了,先从基础点的看起。

此外,这本书全书都在用 MNIST 的数据库。

caffe

花了一个下午加晚上,读了 Google 的 protobuf 的 developer guide,以及 caffe.proto(Protobuf 格式的 message),并尝试思考,caffe 是如何利用 protobuf io 库对 network model 进行抽象的?我尝试将 protobuf 的一个个 Message 理解成结构体(或者类),但这个结构体可以借助 ptoroc 编译器,生成 C++ 类,拓展了比如 set, get 等功能。将 Message 当做可以嵌套的结构体,然后具有 set, get, writetofile, parsefromfile 等功能。

插一段,因为之前看了 Python 版本的简单的 network model 的实现,共享的数据即类成员,如网络的 size,weights, biases 等,方法有 feedward,backprog, update w and b, evaluate 等,就算 network 更复杂些(这里只是猜测,我还没接触几个 model),顶多包含算法的优化(SGD或者SGD的变种),用某种新的算法初始化 weights and biases,某种 fine-tune 的算法,其基本的 structure 以及 train(learning) 的过程是相似的,基于这种前提,可以认为,绝大多数 network model 都是可以通过类似 python 版本的那个 network model 实现的手段来实现的;或者说,也可以写一个更为通用的 framework,把 network model 相同的部分提取出来,不同的部分用参数界定,比如 sigmoid 函数的类型,可以用一个参数表示,使用不同的 sigmoid 函数就相当于另一个不同的 model 了;进一步,如果说 caffe 就是这种 framework,那么可以借助 caffe 干两件事,一是从 caffe 中窥探已被实现的 network model,这点在 caffe.proto 中可以看出一二,caffe.proto 57 个 Message,47 个是 Parameter 类型,有很多参数,这些参数有些是针对 data 的,有些是针对 model 的,这些参数的背后,可能映射不同的 model,用 caffe + model 背后的论文可能是一个学习了解不同 model 的方法;二是捣鼓自己的 model,借助 caffe,避免自己手动实现像数据读取、GPU 加速等很多底层及细节性的东西,但是 caffe 毕竟是个 framework,如果提出的 model 与这个 framework 不符,就麻烦了,当然,以自己现在的水平谈这些还早。

我跑了一下 LeNet 的 example,仍然是 MNIST 数据库,log 信息太长就不贴了,accuracy 第一次大概 99.2,第二次 99.0,我没改参数,一次要跑 20 分钟(cpu mode),盲目调参似乎没多大意义。

其它

买了块廉价硬盘,装了 Ubuntu14.04,折腾 cuda 的安装,显卡驱动终于给装上了,但用的时候电脑发热很严重(笔记本 N 卡驱动问题严重),快炸了,配置了 caffe,编译通过,make runtest 时,GPU 的 tests run ok,以后准备用 GPU 跑跑 model。不过 cuDNN 加速还没装。估计自己的显卡(现在算低端了)比 CPU 也快不了多少。

发现了这本书 Deep Learning,是我正在看的那本 online book 的作者推荐的,目前还在写中,只有 html 版本的,加载渲染比较慢,看 html 不能打标签,我用自己已知的 tricks,将所有的 html 合成一本 pdf。只要出新版本,我需要七分钟左右就能将所有的 html 合成一本 pdf,因为其中有一步必须手工(七分钟都花在这)完成,其余的都是脚本(bash, python)完成的。

以上都花了不少时间。

总结

Too many things to read, learn, practice and think.


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注