Learning to be Giant.

Kaffe: 从零开始写一个神经网络(零)

|

当我开始写这篇日志的时候无意间发现,距离我上一篇日志发布已经一整年了。那时的我还在暑期实习,趁工作间隙把我的博客重新整理了整理,开源了代码,如今也已经有一百多个star了。这一年发生了很多事情,我从CMU毕业了,成为了一名全职的机器学习工程师。深度学习这个领域也更加的火热。作为一个机器学习工程师,我想我有必要自己把深度学习最基础的问题搞懂。

Idea is cheap, show me your code

这是码农之间的一句名言。由于各种工具的普及,深度学习的门槛十分之低。然而我想,只有真正理解深度学习背后的基本理论才能够不会在纷繁复杂的各种模型当中迷失方向,而又有什么比自己实现一遍神经网络更能够提升自己的认识呢?机缘巧合,由于一些原因促使我真的自己把这一切写了一遍。在自己写这个小的神经网络的时候加深了我对很多概念的理解和认识。我相信这些心得体会,对于每一个希望能够了解深度学习的人来说都会有所帮助。从这篇开始,我计划用大概四篇日志的篇幅记录我一步步写这个小小的神经网络的过程,内容会涵盖深度学习的一些基本理论知识以及具体的实践方法,同时还会浅显地从软件工程的角度介绍我对我这个小小的framework的架构。在理论部分会介绍的内容包括:

  • Back Propagation的原理以及Neural Network当中常用Layer的求导
  • Scholastic Gradient Descent (SGD)的大致原原理和写法
  • Minibatch/Dropout/Momentum/Regularization等常用的训练技巧
  • Convolution和Pooling的工作原理、求导及写法
  • 常见的加速网络Inference和Training的小技巧

尽管这个项目规模很小,但我还是认真地对它进行了架构上的设计。架构上非常接近Caffe基于Layer的写法,因为这种抽象非常符合大家刚刚接触神经网络时候“层”的抽象。在设计架构的过程当中我惊奇的发现,我的很多很多设计选择与Caffe竟然惊人的一致。之前在做其他项目的时候多多少少接触过Caffe的代码,自己也写过一写Caffe的Layer,但是直到这次我自己动手写了一个小的神经网络,我才知道Caffe的很多之前认为奇怪的设计究竟是为什么。这也是写这个小项目的额外收获吧。

鉴于我也不是什么深度学习的专家大牛,难免会出纰漏。如果在文章或者代码中有什么错误的话,希望能不吝赐教。这个系列当中涉及的所有的代码都在:https://github.com/codinfox/kaffe。整个项目使用Python和Numpy。希望在这个系列的旅程之中,能一起掌握神经网络的基本方法。

那现在就开始我们的旅程吧。

Disclaimer: This is a personal weblog. The opinions expressed here represent my own and not those of any entity with which I have been, am now, or will be affiliated.

Comments