一,问题背景 # 随着深度学习的广泛应用,在搜索引擎/推荐系统/机器视觉等业务系统中,越来越多的深度学习模型部署到线上服务。
机器学习模型在离线训练时,一般要将输入的数据做特征工程预处理,再输入模型在 TensorFlow PyTorch 等框架上做训练。
1.常见的特征工程逻辑 # 常见的特征工程逻辑有:
分箱/分桶 离散化 log/exp 对数/幂等 math numpy 常见数学运算 特征缩放/归一化/截断 交叉特征生成 分词匹配程度计算 字符串分隔匹配判断tong 缺省值填充等 数据平滑 onehot 编码,hash 编码等 这些特征工程代码,当然一般使用深度学习最主要的语言 python 实现。
二,业务痛点 # 离线训练完成,模型上线部署后,同样要用 C++ 重新实现 这些 python 的特征工程逻辑代码。
我们发现,“用 C++ 重新实现” 这个步骤,给实际业务带来了大量的问题:
繁琐,费时费力,极容易出现 python 和 C++ 代码不一致 不一致会直接影响模型在线上的效果,导致大盘业务指标不如预期,产生各种 bad case 不一致难以发现,无法测试,无法监控,经常要靠用户投诉反馈,甚至大盘数据异常才能发现
近日需要给服务器做备份,在网上找到了一个现成的金山快盘的api:https://github.com/deren/python-kuaipan (感谢!)
试了一下,遂决定备份到金山快盘上。
简单几行 python 代码实现一个 http 代理
一个基于约束传播的,玩具级微型计算语言的设计和简单实现。
这个程序就是做来玩和练习的,代码是玩具级别的,用的python,基本可以正常工作了。
一,应用背景 # 先介绍应用背景:
在流体机械设计中,通常根据性能参数进行设计,算出其它变量,但问题是,在设计过程中,需要进行变量的手工调整,例如圆整,修正到某一范围,校核等等。
其计算模式举例如下:
1.定义变量,如输入压力Pin=0.98,输入温度Tin=27,输入流量Qvin=400,kv2,φ2r,b2,D2,u2,qin等等。。。
2.根据某些物理公式,算出几个新的量,如转速 n=33.9*sqrt(kv2*φ2r*b2/D2*(u2^3)/qin)
3.把n从8296.93圆整为整数8300,
4.重新计算b2/D2=0.06455,校核可知0.02<0.06455<0.065,符合要求
5.根据n计算出其它新的变量,修正,校核。。。
。。。
二,用约束传播系统建模 # 观察可以发现,这种计算模式,和《计算机程序的构造与解释》中提到的约束传播系统很像,如果把一个变量看作一个对象,那么,当它位于一个公式的左侧,例如n,也就意味着,右侧变量例如kv2更新时,应该给它发送一个消息,让它重新计算自己的值,当n更新后,如果它发现有别的变量依赖于自己,它应该发消息通知它们更新自己的值。
还可以看出,这种依赖关系形成了一个图,例如应该有一条从kv2到n的边,把n称为kv2的订阅者。
所以这种计算模式可以用约束传播系统建模,但是此处和书里的约束传播系统有差异:此处的约束传播系统是有向图,而书里是无向图,设计成有向图主要是为了简单,无向图的消息发送顺序是难以控制的,而且构造的时候公式中的每个变量都要持有其它对象的引用,太麻烦,有向图只需要在公式左侧的那个变量哪里保存公式右侧的每个变量的引用。
形成有向图后,每个变量的状态设为invaild,这种状态下,不会向它的会订阅者发送更新消息,收到获取值的消息时报错。
有向图中,还有一些源点,是最初给定值的变量。
当某个变量被赋值时,它把自己设为新值,同时向它的订阅者发送更新消息。订阅者计算自己的新值,如果和旧值相同,就沉默;否则,更新自己,通知订阅者更新。
so,想象一下,在你的面前,虚空之中漂浮着一张有向图, 由kv2—>n这样的一条条边练成,当一个点被赋予值,从这点荡出一圈圈涟漪,传到它的下一级,再从更新过的点荡出新的波纹,传开,传开。。。直到所有的点都收敛,水面恢复宁静。