数据科学和软件工程

无论是否在从事data scientific的工作,数学和CS工程之间存在着需要沟通的部分。在学校时,或许更偏重于理论的推到和一个个独立算法碎片的学习。或者更本质地讲,偏重于算法的学习是imperative的语言范畴,而对于构建大型的模块来讲,这只是一个小的部分。甚至,就算是这么一个小的部分,你如何组织它的结构以形成复用性更高的模块,也是至关重要的。

例如perception这个模型,在理论上讲是极端容易的。基本上就是一堆线性变化:拿到一堆 { X n , y n } n = 1 N \{X_n, y_n\}_{n=1}^N {Xn,yn}n=1N 拟合出这堆 X n X_n Xn 的系数 w n w_n wn 。你的任务就是迭代出它们具体的值。

这几乎完全就是算法的翻译,但如果从软件工程的角度讲,这是根本不对的。因为对宏观模块来讲,我最后需要的是一个perception model,而不是model里的细节。我不关心这堆系数,所以你也不应该把这堆系数扔到model之外。

按照这样的思路,关于machine learning所构建的东西,应该只有model。这个model提供两个基本的接口,一个是训练,一个是求值。Done。而至于 w n w_n wn 这些东西,应该统统放在model对象内部,作为private变量。同理,对于deep learning,则需要更多的这种工程考虑。Keras给出了出色的工程设计,将layer单独提出来,以modularize为己任去重新梳理和组织整个deep learning的流程。

如此,对于学习machine learning就该有一个比较好的思路:你需要花费一部分boring的时间去弄明白这一个个的核心引擎算法到底做了些什么事情。在弄懂之前,你或许只能跟随教科书,去写一堆naive的REPL代码,来看一看他们的效果。

而一旦跨过这一步,你不应该停下来,你应该重新拾起软件工程对你的训练,重新来组织这些算法模块、甚至算法细节,以便让模块之间、甚至算法与算法之间有更好的复用性。一个典型的例子当然是在写最短路径算法时,你应该如何去抽象你的模型,以便让Dijkstra和K算法无缝相连。

我想,这是你需要花费功夫的地方,你需要解决两边的需求:

  • 一个是纯数学、算法上tough的理解
  • 另一个是工程结构上设计的精巧

两者不能偏废,你必须把它们结合起来,从而形成你自己强大的影响力。

事实上,即便是你阅读类似Thinking in Java,Java Concurrency in Practice等CS领域的经典书籍,你也不得不从两方面考虑问题。一边是理解、吃透书本上割裂的、没有宏观工程考略的细节,另一边是在掌握了细节后,如何对它进行重新布局,以让它在整个构架中发挥更合适、更巨大的影响力。

一些潜在的困难和问题:

1、学习模型本身就存在一定的困难,读懂理论部分已经耗费了不少精力。

2、进而它要求你实现这个模型。你又不得不耗费很多精力将数学的表述转换为代码。

3、再来,你会发现这样转换后的代码会带给你巨大的挫败感。稍微想要改动点什么,都会给你造成巨大的代价。

4、其实这就已经表明了,你上面通过数学语言所转换出来的代码,不满足软件工程的要求。你需要重新去组织代码结构,在你充分理解算法的基础上,对很多部分进行重新抽象,重新构建模的边界。

另一个值得考察的是,同样是考虑软件模块的复用性,data science和通常的信息流处理还有所不同。IT中值得反复使用的东西是基于数据结构、字符串等操作。

但在data science中,反复的操作则是:

  • 在公式中增加一个随机因子;
  • 一个模型需要被循环运行多次,并求得多次运行结果的平均值;
  • 能够对不同操作的数据做对比

表面上看,这些操作似乎都是最底层的细节操作,没什么可复用性。但这个是一个幻觉。事实上,同样是这些操作,但只要组织得到,同样可以被得到最大限度的复用。在data science存在着非传统意义上的engineering,你需要非常谨慎地留意如何去处理这部分的工程问题。

5、再来,是数据的问题。当你写完模型时,你会强烈地想要结束这个噩梦。你会非常急切地想拿实际数据来跑一跑,进而得出一个你无法判断正误的结论。这其实是极端有问题的。构建完模型后,你应该做的是构建规模较小的、可以通过手工计算进行验证的测试数据。对于一组你无法判断的数据,无论它规模有多大、设计多么精巧,都是没有意义的。你必须构建好这些可验证的数据,来看出端倪,进而给出更多更靠谱的证据来表明模型的正确性。但通常,自己在第四步时已经耗尽了所有精力,完全没有心思在这一步投入更多。

6、最后,其实是需要进行回顾总结的。你写出了模型的代码,也用相应的数据得出了结论,但这并不意味着你整体上做了一件正确的事情。很可能,整体回顾下来,你把这件事的需求、结论搞反了,又或是你会发现,模型的某一个地方有更好的抽象方式,你对某一部分的理解存在偏差。这些东西之所以难于看出来,就在于整个数据分析是极端复杂的,融合了模型理解的困难、软件工程构建的困难、数据准备和验证的困难。这每一项任务都不轻松,那么当然,在整体上你可能就会有所忽略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值