本文为 AI 研习社编译的技术博客,原标题 Learn TensorFlow, the Word2Vec model, and the TSNE algorithm using rock bands。
翻译 | 林子、余杭、Emily1 校对 | 老赵 整理 | 令双
艺术家低维嵌入的K-聚类
学习“TensorFlow方式”来构建神经网络似乎是开始机器学习的一大障碍。在本教程中,我们将一步一步地介绍使用Kaggle的Pitchfork数据构建Band s2vec模型时涉及的所有关键步骤。
有关完整代码,请查看GitHub页面:
https://github.com/patricoferris/machinelearning/blob/master/word2vec/Pitchfork.ipynb
神经网络消耗数字并产生数字。他们非常擅长。但是给他们一些文本,他们会发脾气,什么也不做。如果神经网络的任务是压缩数字并产生有意义的输出,那么我们的工作就是确保我们所输入的任何东西都是有意义的。这种寻求有意义的信息促成了Word2Vec模型。
使用词的一种方法是形成一个one-hot编码向量。创建一个长(在词汇表中的不同单词的数量)的零值列表,并且每个单词指向这个列表的唯一索引。如果我们看到这个单词,就让这个索引成为列表中的一项。
虽然这种方法是有效的,但它需要很大的空间,完全没有意义。“好的”和“优秀”类似于“鸭子”和“黑洞”。如果只有一种方式来矢量化单词,以便我们保持这种上下文相似性…
很开心,这儿有办法!
通过使用神经网络,我们可以生成单词的‘嵌入’。而这些向量表示的是从我们网络中的连接权重中提取的每个唯一的单词。
但问题仍然存在:我们如何确保它们有意义? 答案是输入成对的单词作为目标单词和上下文单词。不断重复这个过程,同时也输入一些不好的例子,神经网络就会开始学习到哪些单词会一起出现以及这些单词是如何形成一个图形的。这就如同一个由上下文关联词语组成的社交网络。“好”可以关联到“有帮助的”,还可以再关联到“关心的”。而我们的任务就是把这些数据输入到神经网络中。
最常见的方法之一是Skipgram模型,基于在文本数据集上移动窗口来生成这些目标上下文配对。但是,如果我们的数据不是句子,但我们仍然具有语境意义呢?在本教程中,我们的单词是艺术家姓名,我们的上下文是流派和平均评论分数。如果艺术家a和b同属一个流派并且具有相似的平均评论分数,我们希望他们有所关联。让我们开始吧。
Pitchfork 是一个美国音乐杂志网站。该网站主要有摇滚、独立和新音乐。他们的网站上删除了已经一些发给Kaggle的数据。这些信息包含与每个艺术家相关的评论、流派和日期等。
让我们创建一个艺术家类,并用字典来存储我们想要的所有有用的信息。
现在,我们想建立符合目标上下文的流派与平均分数一一对应的关系。要做到这一点,我们将创建两个字典:一个是不同的独特的类型,另一个是分数(离散到整数)。
我们将把所有的艺术家添加到这些词典中的相应类型和平均分数中,以便以后在生成艺术家成对时使用。
在进入TensorFlow代码之前的最后一步:生成批处理!批处理就像我们的神经网络将用于每个时期的数据样本。一个时期是一个扫描横跨神经网络在训练阶段。我们要生成两个numpy数组。其中包含以下代码:
这里有无数的TensorFlow教程和知识来源。这些优秀文章(https://medium.freecodecamp.org/search?q=tensorflow)中的任何一个都会帮助你。这些文档是很好的参考资料。下面的代码主要基于word2vec教程,来自于TensorFlow。希望我可以揭秘其中的一些,我把它归结为一些要点。
第一步是理解“图形”含义。这对于TensorBoard可视化和在神经网络内创建数据流的心理图像是非常有用的。
花些时间阅读下面的代码和注释。在将数据送到神经网络之前,我们必须初始化我们要使用的所有部分。占位符是输入我们所给的“feed_dict”。这些变量是我们最终会调整的图表的可变部分。我们的模型中最重要的部分是损失函数。这是我们如何很好的做评估,以及我们如何可以提高的宝库。
噪声对比估计(NCE)是一种损失函数。通常我们会使用交叉熵和softmax,但是在自然语言处理中,我们所有的类都是一个个单一独立的词。
计算方面,这是糟糕的。NCE将问题的框架从类的概率改变到目标上下文匹配是否正确(二进制分类)。它做了一个真正的配对,然后样本得到坏的配对,常数
| num_sampled
控制这个常数。我们的神经网络学习区分这些好的和坏的配对。最终,它可以学习上下文!你可以阅读更多关于NCE和它是如何工作的。
现在一切都设置好了,我们只需要按下绿色的“go”按钮并稍微旋转一下拇指。
使用TSNE进行可视化
好吧,我们还没完成。 我们现在为艺术家提供了上下文丰富的64维向量,但可能维度太多,反而无法真正想象它的实用性。
幸运的是,我们可以将这些信息压缩成两个维度,同时保留64个维度所具有的所有属性! 这是T分布式随机邻居嵌入,简称TSNE。这个视频很好地解释了TSNE背后的主要思想,但我将尝试给出一个广泛的概述。
TSNE是一种降维的方法,它保留了更高维度的相似性(如欧氏距离)。为此,这个方法首先要构建使用正态分布计算的点对点相似度矩阵。分布的中心是第一个点,第二个点的相似度是分布在远离分布中心的点之间的距离处的值。现在我们有两个点对点相似矩阵。然后,该算法缓慢移动较低维度的点,试图使其看起来像保留相似性的较高维度的矩阵。再重复一遍。 值得庆幸的是,Sci-kit Learn有一个功能可以为我们做数字运算。
对所有的艺术家数据通过低维嵌入绘图。
这些嵌入令人惊讶的地方在于支持数学运算,经典例子是:
King — Man + Woman = Queen
或与它相近,再举另一个例子。
取Coil(英国实验音乐团体)的低维嵌入,包含以下流派的乐队,
[‘electronic’, ‘experimental', ‘rock’]
平均分数是
7.9
现在减去Elder Ones,一个包含以下流派乐队的低维嵌入,
['electronic']
平均分数是
7.8
使用此嵌入差异,找到最接近的乐队并打印其名称和流派。
Artist: black lips, Mean Score: 7.48, Genres: ['rock', 'rock', 'rock', 'rock', 'rock']
Artist: crookers, Mean Score: 5.5, Genres: ['electronic']
Artist: guided by voices, Mean Score: 7.23043478261, Genres: ['rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock']
方法有效! 摇滚乐队和电子乐队的分数非常近。 下面是前300个带标签的乐队绘制的图。 希望这个项目能给你启发性。 一起动手建造,探索和玩耍。
三百个艺术家带标签的绘制图
原文链接:
https://medium.freecodecamp.org/learn-tensorflow-the-word2vec-model-and-the-tsne-algorithm-using-rock-bands-97c99b5dcb3a
点击文末【阅读原文】即可观看更多精彩内容:
介绍一个灵活可重复的强化学习研究的新框架
现代博弈论和多代理式强化学习系统
从 MAX 网站中获取模型,一秒开始你的深度学习应用
实例+代码,你还怕不会构建深度学习的代码搜索库吗
斯坦福CS231n李飞飞计算机视觉经典课程(中英双语字幕+作业讲解+实战分享)
等你来译:
安卓 Smart Links 技术背后的机器学习模型
2018年25家值得关注的机器学习初创企业
剖析深度学习框架