炼数成金 门户 商业智能 人工智能 查看内容

AI 行业实践精选:食向量——运用机器智能提高烹饪技能

2017-2-4 13:12| 发布者: 炼数成金_小数| 查看: 11960| 评论: 0|原作者: Jaan Altosaar |来自: AI100

摘要: 机器智能改变了你我的生活,我们会用 Discover Weekly 播放列表听音乐,看 facebook 上面的新闻,和移动设备上的虚拟助手对话。但是,机器智能为什么还没有改变我们的饮食方式呢?我们能不能调整语言处理算法的要素 ...

tm 数据库 工具 模型 测试

人工智能将人类的思维转化为程序和算法,用计算机的、高速运行能力来提高效率,在一定程度上能替代人的部分功能。如今,随着人工智能的发展,出现了智能食谱。本篇文章的写作目的是构建一个食物推荐系统,探索全世界的烹饪方法。

我已经5天没有吃饭了,我想念食物也研究食物。我患上了严重的酮症,我的身体已经在消耗自身的能量:我现在就是食物。我想此时,也是挖掘食物模型的较佳时机。

机器智能改变了你我的生活,我们会用 Discover Weekly 播放列表听音乐,看  facebook 上面的新闻,和移动设备上的虚拟助手对话。但是,机器智能为什么还没有改变我们的饮食方式呢?我们能不能调整语言处理算法的要素,深入探究一下食物呢?如果告诉我你想吃什么,我能不能像 Spotify 推荐补充性的音乐一样为你推荐一些互补性的食物呢?

词向量是分析离散数据最有用的一种技术。比如,我们选出牛津词典中170,000个单词,用一个单词(如:food)代表一个向量:那么就会有169,999个0和一个1,而这个1就处在词汇表里该单词的位置上。例子中的“food”一词,也许恰巧处在第29,163位置上,靠近其他以 f 开头的单词,所以“food”的向量为:[0, 0, 0, ..., 0, 0, 1, 0, 0, ..., 0]。

但是,要达到比较单词的目的,还需要其他方面的工作。为了比较文档并对我们的数据有更加深入的了解,我们需要将每个单词进行合计,有超过170,000个的维度,这无疑会花费相当长的时间。那么,有没有更快捷的方法呢?

答案就是词向量。词向量会降低问题的维度,为我们提供了强大的语言表示方法。

我们可以构造出一个语言模型,为每个单词随机分配100个数字。为了训练这个模型,我们运用每个单词的100个随机数字去预测它们的上下文语境。其中,每个单词的“上下文语境”会包含其周围的单词。这样做的中心思想是:上下文语境意味着在相似语境下出现的词,其含义也会相似。我们会对模型不断地做出调整,使每个单词的数字能够更好地来预测上下文里的其他单词。刚开始,随机数字的预测效果并不好。但通过逐渐地调整,先前的100个随机性的数字将越来越有规律,最终将会完全摆脱最初的随机状态。这100个数字将会代表其所属单词的一部分含义:近义词会聚在一起,因为它们会在其他单词的上下文中出现;而意思不同的单词会离得很远(不在同一上下文中)。这样一来,我们采用词向量的方法把单词缩小至100个维度,相比先前的170,000个维度缩小了1000多倍,而且这种用向量来表示的方法也更加适用于语言。

要给食物建造模型的话,我们需要一些食谱。我们可以把食谱中某个要素的上下文定义为食谱中的剩余食物。这就展示了向量的灵活性:通过对上下文定义的小小改变,我们就可以把它运用于完全不同的数据之中。

食物相似性地图
对95,896份食谱进行了向量计算后,我们得到了每种食物100个维度的向量。因为人类无法看见高维度空间,所以我们用近似计算法来查看二维空间内的食物的相似性。

下面是食谱中2,087种原料的相似地图。把鼠标停悬在图上可以看到每个点所代表的食物:

https://jaan.io/files/food2vec_food_embeddings_tsne.html

这个地图可以说非常合理:来自亚洲的食材都汇聚在一起,来自欧洲和北美的食材也一样。

食谱向量地图
通过计算食材向量的平均数,我们可以得到食谱的向量。这里展示的是全球95,896种食谱的地图。将鼠标停悬于某一点就可以看见其对应的食谱,而点击右边的地理位置栏,可以展开或隐藏某些区域。

访问网站:
https://jaan.io/files/food2vec_recipe_embeddings_tsne.html 就可以看到食谱地图,放大后还能看到新的食谱。运用相似性来浏览100k 的食谱难道不是最快的方法吗?

接着有趣的模型就出现了。亚洲食谱都聚在一起,南欧的也是一样。而北欧和美洲的食物分布则比较分散,这或许是因为移民的缘故,也有可能是因为数据有些夸大。

食物相似工具

访问网站:
https://altosaar.github.io/food2vec/#food-similarity-tool 获得相似工具。我们通过观察向量中食物在高维度空间的距离远近来计算食物的相似性。
 
以下是靠的比较近的食物:

奶酪和意大利粉靠得最近。
芝麻油和鸡蛋面靠得最近。
牛奶和肉豆蔻靠得最近。
橄榄油和帕尔玛奶酪靠得最近。

食物类比工具

访问网站:
https://altosaar.github.io/food2vec/#food-analogy-tool 获取食物类比工具。食物类比与单词类比一样,都通过向量来计算。对于“食物A之于食物B,就好比食物C之于食物D”这个类比的目的就是要得出一个合理的食物D。我们可以先把食物B从食物A减去,然后再加上食物C。比如,在向量空间里计算“(培根-鸡蛋)+橙汁”就会得到一个向量,而在我们的食物模型里离这个向量最近的是咖啡。

关于词向量最经典的一个例子就是:(国王-男人)+女人=女王。这是不是很直观?在自然语言里,国王之于男人就好比女王之于女人,但是食物的类比没有这么清晰。通过实践,我们也许可以训练我们的味觉检测器,设想一些假说用于食物测试。我还可以用食谱向量的平均值来表示烹饪向量。

以下这些比较有说服力:

鸡蛋之于培根,就好比橙汁之于咖啡。
面包对于奶油,就好比烤牛肉之于鼠尾草。
烟熏三文鱼之于莳萝,就好比羊肉之于芦笋。
南亚之于米饭,就好比南欧之于百里香。
米饭之于芝麻籽,就好比意大利粉之于甘椒。
烤牛肉之于绿灯笼椒,就好比猪肉香肠之于胡芦巴。

食谱推荐工具

访问网站:
https://altosaar.github.io/food2vec/#recipe-recommendation-tool 获取食谱推荐工具。我们可以用自己的食物模型作为烹饪推荐系统。通过食物的平均向量,我们可以找到有相近向量的食物。

比如,我是一个花生酱三明治的狂热爱好者,当我向系统中输入自己平时喜欢的白面包、黄油、花生酱和蜂蜜时,我得到的推荐推荐是:草莓。我从来没有尝试过草莓,但吃起来还是很不错!我也很开心能打破自己的食物规律。当我输入羊肉、茴香和番茄的时候,得出的推荐推荐是葡萄干——这也相当合理而且非常有趣呢。但是还有一些其他的推荐就比较奇怪了,所以祝你好运哦。
 
接下来:
找到正确的用户界面来探索这些模型。函数代码和推荐工具在github(https://github.com/altosaar/food2vec)上都可以找到。如果在移动设备上也能使用这些模型就太好了,还可以测试一下模型的其他推荐方式。
词向量不是较好的模型,多类回归应该还不错,我在报告中又加了一个运行演示代码(https://github.com/altosaar/food2vec/blob/master/src/food2vec.py)。这种情况比较罕见,是因为单词量(食材数量)很小,所以我们可以同时运用这两种模型,并进行比较。这样可以看到词向量中的非对比估计损失函数,同时提供一个更有意思的实验台。
放大数据:你有更大的食谱数据库吗,或者你知道怎么找到更大的食谱数据库吗?我很想找到这样的数据库,这能帮我完善数据,因为目前大部分食谱都来源于北美洲。
把食物类比和食谱类比都测试一下:这样会更直观。比如,“煎饼之于枫糖浆,就好比煎蛋之于奶酪”这样的话,比单独的食材类比更容易理解。
 
资源
《纽约时报》的文章 The Great AI Awakening 对向量的解释比我好。
https://www.nytimes.com/2016/12/14/magazine/the-great-ai-awakening.html
Wesley 有一篇类似的报告:diet2vec。
https://arxiv.org/abs/1612.00388
Sanjeev Arora 的调查很详细地解释了向量类比的特性。
http://www.offconvex.org/2016/02/14/word-embeddings-2/
t-SNE algorithm 用于观察高维度的向量。
https://www.oreilly.com/learning/an-illustrated-introduction-to-the-t-sne-algorithm
Nature Scientific Report 提供了数据。
http://www.nature.com/articles/srep00196
Dave 上课很棒,帮助我了解了向量。
http://www.cs.columbia.edu/~blei/seminar/2016_discrete_data/index.html
Maja 写的关于 exponentialfamily embeddings 的报告把词向量推广到了其他分类上,如果用在这些数据上也很棒(词向量在存在偏置梯度时也可理解为 Bernoulli 向量模型)。
https://arxiv.org/abs/1608.00778
还有其他关于食向量的研究,比如 Rob Hinds 的版本。
https://automateddeveloper.blogspot.com/2016/10/unsupervised-learning-in-Scala-using.html
 
本文作者 Jaan Altosaar 是普林斯顿大学的物理学博士,致力于贝叶斯推理和深度学习的交叉点研究,2016年,与 Google Brain 合作了 Eugene Brevdo,是一名机器学习爱好者。

欢迎加入本站公开兴趣群
商业智能与数据分析群
兴趣范围包括各种让数据产生价值的办法,实际应用案例分享与讨论,分析工具,ETL工具,数据仓库,数据挖掘工具,报表系统等全方位知识
QQ群:81035754

鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

 

GMT+8, 2018-6-20 17:32 , Processed in 0.366789 second(s), 25 queries .