传统机器学习算法在实际业务中的使用场景( 二 )

  • 调入仓B
  • 约束1:对任意一个货品,从A仓调出量小于A仓库存-A仓自身需求量,即,其中表示货品从A仓的调出至B仓的量 。表示货品在A仓的库存,在仓库A覆盖范围内的预计售卖量表示货品
  • 约束2:对任意一个货品,调入B仓的量小于B仓覆盖范围内的预计售卖量-B仓已有的在仓库存,即,字符含义同上 。
  • 约束3:一次调拨的量,要小于A仓到B仓的干线运输能力,即

    传统机器学习算法在实际业务中的使用场景

    文章插图
    ,其中是一个常量,表示最大的干线运输能力
  • 目标函数: 其中是个常量,表示货品通过跨区发货到消费者手中的发货成本,是个常量,表示货品从A仓调拨到B仓的调拨成本,表示提前将货品从A仓调拨到B仓,避免跨区发货而节省的成本 。因此,我们要「最小化货物从仓库到消费者手中的物流成本」,即,最大化节省的金额 。
  • 宗上所述,模型定义如下:
    传统机器学习算法在实际业务中的使用场景

    文章插图
    到这里,整个建模过程就结束了 。实际上我们忽略了很多细节,但是并不影响我们理解这个调拨模型 。至于模型怎么求得每一个调拨量以保证最大化收益,就要对这个模型进行求解了 。
    ?模型求解:怎么才能算出目标函数最优时的参数解
    • 明确求解目标
    既然要求解,我们就要明确到底要求解什么?即,在上面定义的数学模型中要明确哪些是常量哪些是变量 。
    很明显,我们需要求解的变量是,即每个货品需要从A仓调拨多少件到B仓 。这里为了方便解释,我们就假设一共就两个货品,相应的我们需要求解的变量就 。
    • 求解算法

    传统机器学习算法在实际业务中的使用场景

    文章插图
    根据约束条件看,解空间就在坐标轴圈定的阴影范围内 。实际上,最简单的求解方法就是暴力枚举所有可能的结果,然后求出函数值最大时对应的参数即可 。
    当然了,现实的问题中求解的参数量一定是远远大于2个的,因此参数求解的时间复杂度呈指数级上升,以当前的算力,可能直到生命的尽头可能都得不到答案 。生命是宝贵的,对于这种问题,有没有快速的解法呢?有,这里我们就要引出一个算法概念——启发式搜索算法,这是一种算法理念的统称,具体的实现有很多种,比如模拟退火算法、遗传算法、蚁群算法等 。宗旨就是在有限的时间内,得到一个近似的最优解 。
    这里以遗传算法为例,我们来学习它的求解过程:
    遗传算法(G.NETic Algorithm)遵循『适者生存』、『优胜劣汰』的原则,是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法 。遗传算法模拟一个人工种群的进化过程,通过选择(Selection)、交叉(Crossover)以及变异(Mutation)等机制,在每次迭代中都保留一组候选个体,重复此过程,种群经过若干代进化后,理想情况下其适应度达到近似最优的状态 。算法具体逻辑可参考:https://zhuanlan.zhihu.com/p/460368294这类算法不仅很有效,而且是可理解可证明的 。记得多年前,第一次接触到这种算法类型的时候,深深地感受到了前人的智慧 。
    在实际应用中,我们可以使用一些现成的算法求解器,例如cplex 。至此,通过问题定义、建模、求解 。调拨模型中,从A仓到底要调拨多少量到B仓才能节省更多的成本的问题就解决了 。
    传统机器学习算法在实际业务中的使用场景

    文章插图
    展望
    面对一个需要优化的业务问题,传统的思路是从问题定义、建模再到求解 。而深度学习模型的思路是:
    1. 向量化:无论什么类型的数据,文字、图片、视频、声音,首先是将数据向量化,比如文字可以使用word2vec转换成一串01向量 。
    2. 将训练数据的目标结果也向量化:一般来说输入的数据和目标结果是同一种数据类型,也可以不一样 。
    3. 选定目标函数:一般来说目标函数针对不同的任务类型有其固定的目标函数 。比如常见的RMSE、Cross-Entropy、Categorical-Cross-Entropy等等 。
    4. 训练模型:将模型输出的结果向量与目标结果向量代入目标函数,计算loss 。同时计算梯度值,调整模型参数 。直到在训练集上的loss足够小或者每次迭代的loss不再变低为止,训练结束 。
    可以理解为,无论什么问题只要将数据向量化,就可以通过深度学习模型求解 。其中建模的过程可以省略,模型求解也是固定的范式 。然后问题就解决了,我对这种神经网络模型也大为震撼 。


    推荐阅读