像专家一样学会规则,你才能像艺术家一样打破规则。——巴勃罗·毕加索 人类大脑是复杂的学习机器,能通过记忆日常生活的种种事件(「云雀会飞」和「企鹅能飞」)形成规则,并归纳这些学习以应用到我们从未见过的事物上(「有翅膀的动物会飞」)。也许更强大的是,记忆能让我们使用例外(「企鹅不会飞」)来进一步精炼我们归纳的规则。当我们探索推进机器智能的方法时,我们是在问自己这样一个问题 —— 通过结合记忆(memorization)和归纳(generalization)的力量,我们能教计算机学会人类的学习方式吗? 这个问题很难回答,但通过将深度神经网络(用于归纳)与宽线性模型(用于记忆)联合进行训练,可以结合这两种力量让我们更进一步。在谷歌,我们称它宽度&深度学习(Wide & Deep Learning)。这对于带有稀疏输入的一般大规模回归和分类问题(带有大量可能特征值的类别特征)很有用,比如推荐系统、搜索和排名问题。
今天我们将我们的宽度&深度学习实现方法作为 TF.Learn API 的一部分进行了开源,这样你自己也能轻松地训练一个模型。请查阅 TensorFlow 教程中关于线性模型和宽度&深度学习的内容 ,以及查看我们的研究论文了解更多。 宽度&深度学习的工作方式 举个例子,某天你一觉醒来,有了一个叫做 FoodIO 的新应用的想法。这个应用的用户只需要大声说出他/她想要吃的食物(查询(query)) 。这个应用就能魔法般地预测出这个用户最喜欢吃的菜,之后菜就被送到用户门口(项目(item))。这里关键的指标就是消费率——如果一道菜被用户吃了,就得 1 分,否则就是0分(标签(label)) 你可以从一些简单的规则入手,比如返回匹配查询中大多数特征的项目,然后放出 FoodIO 的第一个版本。不幸的是,你发现因为匹配太模糊导致了消费率非常低(有人喊出「炸鸡」,最后却得到了「炸鸡饭」),所以你决定增加机器学习以理解数据。 宽度模型 在第二个版本中,你想记住哪些项目与每次查询的匹配效果最好。所以,你在 TensorFlow 上用一个跨产品特性转换的宽泛集合训练一个线性模型,以了解查询-项目对的共现(co-occurrence )与目标标签(一个项目是否被消费)的关联方式。这个模型预测每一个项目的消费概率 P(消费 | 查询,项目),然后 FoodIO 根据预测出的最高消费率发布出最受欢迎的项目。比如说,学习了特征 AND(query="fried chicken", item="chicken fried rice") (查询「炸鸡」,得到项目「炸鸡和华夫饼」)的模型效果非常好;尽管 AND(query="fried chicken", item="chicken fried rice")(查询「炸鸡」,得到「炸鸡饭」)的匹配度也很好但消费率不高。也就是说,FoodIO 2.0 可以很好地记忆用户的喜好,它开始对用户越来越有吸引力。
深度模型 之后你发现,很多用户都在说他们已经对应用中的推荐感到厌烦了。他们渴望发现类似但又不同的能让他们眼前一亮的新菜品。所以你又刷开了你的 TensorFlow 工具包,为 FoodIO 3.0 训练一个深度前馈神经网络 。通过深度模型,你学习了每一个查询和项目的低维密集表征(通常被称为嵌入向量(embedding vector))。通过这种方式,FoodIO 能通过在嵌入空间中匹配彼此相隔较近的项目和查询来进行归纳。例如,你发现那些想要「炸鸡」的人通常不介意也来个「汉堡」。
结合宽度和深度模型 但是,你发现深度神经网络有时会归纳出太多东西和推荐不相关的菜品。然后你会去发掘之前的历史数据,发现事实上数据中存在查询-项目关系的两种不同类型。 第一种类型的查询指向了准确的目标。对着应用喊出「脱脂无咖啡因冰拿铁」的人就是想要「脱脂无咖啡因冰拿铁」。因为即便「脱脂无咖啡因冰拿铁」与嵌入空间中的「全脂热拿铁」接近,但并不意味着后者就是一个可接受的选项。有数百万个嵌入的传递的规则可能造成的伤害比好处更多。另一方面,像「海鲜」和「意大利食品」这类更具探索性的查询可能需要更多归纳和发现不同的相关项目。意识到这些后,你顿悟出:为什么我一定要在宽度和深度模型中选择一个呢?为什么不是两个都选呢? 最后,你在 TensorFlow 上用宽度&深度学习开发了FoodIO 4.0 版本。在上面图表所示,像 query="fried chicken" (查询=「炸鸡」)和 item="chicken fried rice" (项目=「炸鸡饭」)这样的稀疏特征同时被用在宽度部分(左边)和深度部分(右边)模型中。在训练过程中,错误预测被反向传播到两边来训练模型参数。宽度模型部件中的交叉特征转换(cross-feature transformation)能够记忆所有稀疏的特定规则,而深度模型部件能够通过嵌入归纳出类似的项目。 更宽 更深 共同进步 我们很高兴和大家分享 TensorFlow API 和宽度&深度学习的实现方法,你可以利用它们来尝试你的各种想法,和大家分享你的发现。可以在 GitHub 上查询代码,以及查阅 TensorFlow 教程中关于线性模型和宽度&深度学习的部分。 源码地址: 教程地址: 本文选自:Google Research Blog,作者:Heng-Tze Cheng,机器之心编译; |