使用TensorFlow实现宽深学习

16-06-30 banq
              

人类是一个复杂的学习机器,可以通过记忆日常事件归纳形成规则,

比如麻雀会飞和鸽子会飞,归纳这些学习来的信息就可以应用到我们以前没有看到的事物,比如带有翅膀的动物会飞。而且能够更强大,记忆也允许我们使用意外来提炼通用规则,比如企鹅不会飞。

如今我们正在进入增强的机器智能时代,我们询问自己问题:我们能教会计算机像人这样学习吗?通过结合记忆和归纳的强大力量?

这不是很容易回答,但是将一个宽泛的线性模型(等同于记忆)

训练在一个深度神经网络中(等同于归纳),从而结合双方优势,正在步步接近我们的目标,在谷歌,我们称之为宽且深学习(Wide & Deep Learning),这对于通用大规模带有稀疏输入(带有大量可能特征值的分类特征)的回归和分类问题是有用的。比如推荐系统 搜索和排名问题。

具体教程见:Wide & Deep Learning

让我们看看宽深学习是如何工作的?

比方说,有一天你醒来时,有了一个新应用Foodio的主意,这个应用app的用户需要大声说出他渴望的是什么样的食物(根据食物名称进行匹配查询),这个应用app神奇地预测用户最喜欢的菜,并将菜送到用户的门口(条目),您的关键指标是消费率:如果一个菜被用户吃了,那么分数是1,否则是0。(标签)

开始有一些简单规则,用户查询食物名时,能够像返回匹配食物名称中大多数字符的食物。你发布了FoodIO第一个版本,不幸的是你发现消费率非常低,因为这种匹配方式太粗糙,并没有什么用,比如人们喊出“炸鸡”,你却匹配查询得到“鸡炒米饭”,这样你决定使用机器学习来学习更多数据。

在第二个版本中,你想记住那些每次查询中最好的食物,这样你在TensorFlow中训练一个线性模型,使用的是一个宽泛的跨产品

特征,根据目标标签(也就是这个食物是否被真正购买消费了),你试图截获和目标标签相关的共同的各种食物,这个模型会预测消费的可能性,对于每个食物,FoodIO会传递预测消费率最高的食物,比如模型学习特征AND(query="炸鸡", item="鸡肉和鸡蛋饼") 会取胜,而AND(query="炸鸡", item="鸡炒米饭") 却实际不会有人要,尽管查询时从字符匹配上看最吻合(英文fried chicken和chicken fried rice两个名词最相似)。

也就是说,你的FoodIO 2.0版本会在记忆用户喜欢什么食物上做得很好了。

下面再看看深度模型:

后来你会发现很多用户反映他们已经厌倦了推荐,他们急于发现相似但不同可以让人惊喜的菜肴,这时,你又开始刷你的Tensorflow工具包再训练一个深度feed-forward前馈神经网络,从而开始升级到FoodIO 3.0。使用你的深度模型,你通过对美国次查询和食物让其学习低维密集的特征数据,通常称为嵌入向量,这样,FoodIO能够通过匹配食物给那些彼此接近的查询,比如你发现人们查询要求‘炸鸡’时经常介意是否有汉堡包。

好了,现在是结合宽泛和深入的模型了。

你发现深度神经网络有时会归纳太多并推荐不相干的菜肴,你翻开历史流量数据,会发现实际上在查询条目query-item关系上实际上有清晰的两个类型。

第一个查询类型是非常目标化的,人们喊出非常具体的条目如“脱脂牛奶的无咖啡因的拿铁咖啡加冰”,只是因为在嵌入空间中,它非常接近于“热拿铁咖啡全脂牛奶”,但是并不代表后者就是用户能够接受的。有数百万这样规则弊大于利。

另外,类似“海鲜”或“意大利食品”查询更具有探索性,也许会打开更多归纳,发现相关一系列菜肴,有了这些以后,你会顿悟,为什么我们选择宽泛或者深度模型,而不是深度且宽泛的模型呢?

最后,你使用宽且深学习模型开发了FoodIO 4.0,稀疏特征像query="炸鸡fried chicken" and item="鸡炒米饭chicken fried rice"既可以用在宽度也可以用在深度两边模型中,在这样训练中,预测错误会被反馈到两边来训练两边的参数,在宽度模型中跨特征转换能够记忆那些稀疏具体的规则,而深度模型组件能够通过嵌入embeddings归纳相似的食物条目。

Research Blog: Wide & Deep Learning: Better Togeth