课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
深度学习在人工智能编程开发域有着重要的作用。今天我们就通过案例分析来了解一下,深度学习在技术落地方面都有哪些实战操作方法。希望通过对本文的阅读,大家对于人工智能编程技术有更全面的认识。
简单的神经网络(Simple NN)
Andrej Karpathy (特斯拉人工智能和自动驾驶视觉总监)在神经网络模型架构设计方面有个建议:不要做英雄主义者。受英雄主义的影响,你就会自己设计非常复杂的模型架构,然后耗费大量的时间和精力来优化模型,效果不好不了了之。
Airbnb 上线的一个版本的神经网络结构非常简单,是一个包含 32 个全连接 ReLU 激活函数的隐层。简单的神经网络使用跟 GBDT 模型一样的特征,线上效果证明跟 GBDT 模型差不多。其中,训练的目标函数都是小化 L2 回归损失,损失函数中房屋预定的列表被指定为 1,没有预定的列表被指定为 0。
实验证实,NN 网络的 pipeline 可以应用于真实的生产环境,服务线上流量。神经网络的具体 pipeline 在后续的特征工程和系统工程版块展开介绍。
Lambdarank NN
简单的神经网络给了我们一个新的尝试,但还远不够。下面我们做的另外一个尝试是将 Lambdarank 和神经网络结合,其中 NDCG 作为离线搜索排名的主要衡量指标,Lambdarank 提供了一种可以直接优化神经网络 NDCG 的方法。在简单神经网络的回归公式中,这里涉及到两个关键的改进:1、使用{booked listing, not-booked listing}作为训练样本,训练过程中,小化预定列表和非预定列表得分之间的交叉熵损失。2、 调整两个列表的位置,生成新的 pair 对,在 pairwise loss 上赋予不同的权重。
特征工程
在特征工程中,常见的处理技巧有计算比率、在滑动窗口上计算平均等,这些都是多年积累的经验。但是,尚不清楚这些特征对于模型是不是好的,也不能根据新的信息做出及时的调整。使用神经网络建模的一个大好处是它可以根据原始数据,在隐含层自己组合特征。为了发挥神经网络的优势,我们发现给神经网络输入原始的数据还远不够,需要在特征工程方面做些基础的转换。传统的机器学习特征工程主要是做计算方面的处理,而神经网络这部分工作在隐含层可以自己完成。在神经网络特征工程中,我们更多的精力是确保输入的特征遵循某些特性。
特征归一化
开始我们尝试使用 GBDT 的特征,直接输入到神经网络中,结果发现效果非常差。在训练过程中,会发生 loss 饱和的现象,无论如何调整步长都没有效果。跟踪问题发现是特征没有做归一化导致的。
对于决策树来说,特征的数值大小并不是很重要,只要表征有序就可以。而神经网络对数值型特征的大小特别敏感,如果输入特征的数值超过通常特征值的范围,在做反向传播计算的时候,就会引起大的梯度改变。由于梯度消失,会导致像 ReLU 这样的激活函数处于永久关闭状态。为了避免这个现象的发生,我们要保证所有特征的值域在一个小的范围内变化。通常的做法是让特征的分布值域在{-1,1},中心点映射到 0。下面介绍两种常用的转换技巧:1、如果特征的分布符合正态分布,做 (feature_val- 均值)/ 方差变换;2、如果特征的分布符合幂律分布,做 log((1+feature_val)/(1+median)) 变换。
系统工程
我们目前的 pipeline 是:一个访客的搜索查询通过 Java(TM)服务端返回检索结果和分数。Thrift(TM)序列化来存储查询日志,Spark(TM)来处理训练数据,TensorFlow(TM)训练模型,各个工具都是使用 Scala 和 Java(TM)来编写,训练好的模型上传到 Java(TM)服务端给访客提供搜索服务。
Protobufs and Datasets 开始使用训练 GBDT 的 CSV 格式,输入给 TensorFlow 模型的 feed_dict,后来发现我们的 GPU 利用率只有 25%,大部分的训练时间花费在解析 CSV 数据和拷贝数据到 feed_dict。后来我们做出调整,使用 Protobufs 格式的数据集来训练,速度提升了 17 倍,GPU 利用率提升到 90%。
重构静态特征(Refactoring static features)我们业务中有一些特征变化不大,比如位置、房间卧室的数量等,为了减少每次重复读取磁盘消耗时间,我们将它们组合起来为其创建一个索引,通过 list 的 id 来检索。
节选:infoq
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。