@atry
2017-11-16T09:52:26.000000Z
字数 1837
阅读 1469
神经网络与函数式编程
有一家银行,是我们的客户。银行有一项电话营销业务,他们的呼叫中心每个月会拨出很多通电话向用户推销他们的某产品,其中只有很小一部分用户最终同意办理业务。
银行很希望找到一个办法,提高办理业务的成功率。
于是,我们用机器学习技术,帮银行建立了一个精准营销的模型,可以根据用户资料,预测用户有多大几率会办理业务。我们的程序会从所有用户中列出最优质的潜在用户,让坐席员去拨打电话。
银行的呼叫中心每个月会拨打超过一千万通电话,模型从每个月这些拨出记录中不断地学习、优化,持续提升预测能力。
过去,客户人工来选出目标用户, 业务办理的成功率只有8%。现在,我们的模型推荐潜在用户,成功率是46%,比原本的5倍还要多。
银行项目之后,我们试着把机器学习复用到更广泛的业务领域中。我们开发了一个产品:CEO的水晶球。
CEO的水晶球可以对任意二维表数据进行预测。除了类似呼叫中心的精准营销以外,还可以进行趋势预测、异常检测、相关商品推荐,用于零售、金融、医疗、互联网在内的各行各业。
水晶球可以自动建模,不需要数据科学家参与。只要 5 秒钟,就可以从你现有的Excel、数据库或是数据湖中的数据来创造出一枚水晶球,马上就能预测新的数据。
随着数据量的增长,水晶球会自动预测得越来越准。
水晶球的底层,是我们自己开发的深度学习框架:DeepLearning.scala。
其他深度学习框架,比如TensorFlow、Caffe、Torch、Theano,目标是让数据科学家解决机器学习中,某个限定问题域的特定问题。一名大学的科学家可能使用Theano设计一个神经网络对特定的数据集(比如1000张自然风光的图片)进行图像识别,科学家建立的神经网络可以回答每张图片上有什么东西。他的工作就是优化网络结构和各种参数,试图把准确率从95%提高到95.1%。
DeepLearning.scala和等其他主流深度学习框架一样,也支持自动求导、支持符号计算、支持GPU计算,数据科学家也能使用DeepLearning.scala进行类似的研究。然而,除了针对传统机器学习的学术问题以外,DeepLearning.scala还有一些独有的特性,针对的使用场景和目标用户截然不同。
除了刚才说的数学运算以外,DeepLearning.scala还支持if/else、switch/case这样的控制语句,而且所有的这些控制语句都有学习能力。DeepLearning也支持用户自定义数据结构、比如struct和List,而且这些数据结构也有学习能力。归根到底,DeepLearning.scala是一门具有学习能力的编程语言。
DeepLearning.scala的目标用户是普通工程师,他们仍然可以像过去一样写程序,唯一区别是,用DeepLearning.scala写的程序有学习功能,会自己修改自己的参数,因为用DeepLearning.scala写的程序本身就是结构极其复杂的神经网络。
这种把程序本身当做神经网络的方式,叫做Differentiable Programming。DeepLearning.scala是世界上第一个JVM这样的主流平台上的Differentiable Programming框架。
利用DeepLearning.scala提供的Differentiable Programming,你可以把非常复杂的业务知识放在神经网络之内,用机器学习直接处理业务逻辑,而不只是解决限定问题域的一个专有问题。
假以时日,将来每个程序员写的每一段代码都可以方便的内置学习能力,就像调用函数一样简单。
现在,DeepLearning.scala已经开源。
试试吧,因为我们真的很想知道你会用DeepLearning.scala来创造些什么!
在More than Machine Learning系列的下一篇文章,我将介绍DeepLearning.scala的类型系统。有了类型系统,用DeepLearning.scala创建每个子神经网络都有静态检查的输入输出类型,有自己的API签名。程序员可以像调用函数一样组合多个子神经网络。因此,DeepLearning.scala的复用性远远超过TensorFlow等其他深度学习框架,更适合多人协作的复杂业务项目。