本文转载自公众号“读书芯”(ID:AI_Discovery)。仔细想想,这种情况是灾难性的:必须在失败的软件构建中检查2.5GB的日志条目(即300万行)才能找到在第100万行发生的错误或回归,这对于手动执行来说太难了它手动!幸运的是,有一个巧妙的技巧可以拯救你-执行diff命令,将行与最近成功的软件构建进行比较,并预计错误会在日志中生成异常行。标准的md5diff命令速度很快,但它会显示行之间的字符级差异,因此它仍会生成至少数十万个候选行供浏览。在机器学习中使用K近邻聚类的模糊差异算法(logreduce所做的)产生大约40,000个候选行,但需要一个小时才能完成。然而,我们的解决方案是在20分钟的计算时间内生成20,000个候选行——而且由于开源,它只需要大约100行Python代码就可以完成。该应用程序结合了神经嵌入(在单词和句子中编码语义信息)和局部敏感散列(有效地将大致邻近的项目分配到同一内存,而将距离较远的项目分配到不同的存储)。将嵌入式系统与LSH(LocalitySensitiveHashing,局部敏感散列)结合起来是个好主意,而且这个想法还没诞生十年!我们迫不及待地在CPU上使用Tensorflow2.2进行迁移学习,同时使用scikit-learnNearestNeighbor进行K-最近邻算法。在实践中,有一些复杂的近似最近邻实现对实现基于模型的最近邻解决方案更有帮助。什么是嵌入式系统?为什么需要它们?构建k-hot词袋模型是一个典型的起点,通常用于非结构化或半结构化文本的去重、搜索和相似性问题。这种词袋编码see看起来很像一本包含单个单词及其计数的字典。我们以“loginerror,checklog”这句话为例:{"log":2,"in":1,"error":1,"check":1}这种编码也可以用向量表示,其中索引对应一个词,值是计数。让我们以“loginerror,checklog”为例来说明它是如何用向量来表示的,其中第一个条目被保存为“log”字数,第二个条目被保存为“in”字数,依此类推:[2,1,1,1,0,0,0,0,0,…]请注意,此向量由许多零组成。零值条目表示字典中存在但未出现在该句子中的所有其他词。可能的向量条目总数,或者向量的维数,就是你的语言词典的容量,通常高达几百万或更多,通过一些巧妙的技巧可以减少到几十万。现在查看“问题验证”的字典和向量表示,前五个向量条目对应的词根本没有出现在新句子中。{"problem":1,"authenticating":1}[0,0,0,0,1,1,0,0,0,…]这两个句子在语义上是相似的,也就是说,它们的意思本质上是相同,但在词汇上不同,它们不会出现在同一个词中。在模糊判别设置中,可能是句子过于相似而无法高亮显示,但是K近邻算法中的md5和k-hot文档编码不支持该特性。降维使用线性代数或人工神经网络将语义上相似的词、句子和日志行相邻放置在一个新的向量空间中,用“嵌入”表示。在示例中,“登录错误,检查日志”可能有一个五维嵌入向量:[0.1,0.3,-0.5,-0.7,0.2]“身份验证问题”可能是:[0.1,0.35,-0.5,-0.7,0.2]与它们的k-hot词袋向量不同,这些嵌入通过距离度量(例如余弦相似度)彼此接近,密集的低维表示对于短文档(例如构造线或系统日志。在实践中,您需要用100个信息丰富的嵌入维度而不是5个来替换数千个或更多的字典维度。最先进的降维方法包括单词共现矩阵(GloVe)的奇异值分解和专门的神经网络(word2vec、BERT、ELMo)。什么是聚类?让我们回到构建日志应用程序。我们开玩笑说Netflix是一个日志生产服务,它有时会流式传输视频。在异常监控、日志处理、流处理等领域,每秒处理数十万个请求。如果我们想在遥测和日志空间中应用机器学习,NLP解决方案必须进行扩展。图片来源:unsplash这就是为什么我们专注于扩展文本重复数据删除、语义相似性搜索和文本异常值检测等事情——如果您需要实时解决业务问题,这是唯一的方法。diff命令解决方案包括将每一行嵌入一个低维向量(可选地“微调”或同时更新嵌入模型),将其分配给一个集群,并将不同集群中的行标识为“不同”。LocalitySensitiveHashing是一种概率算法,允许恒定时间集群分配和近恒定时间最近邻搜索。LSH的工作原理是将向量表示映射到标量,或者更准确地说,映射到标量的集合。标准哈希算法的目标是避免任意两个不相同的输入之间发生碰撞,而LSH的目标是在输入距离较远时避免碰撞,并在输入不同但彼此接近时促进碰撞向量空间。“loginerror,checklog”的嵌入向量可以映射到二进制数01(01表示簇)。“问题验证”的嵌入向量很有可能映射到相同的二进制数01。这就是LSH如何实现模糊匹配、反问题和模糊判别。LSH很早就应用于高维词袋模型向量空间。使用LSH将字符放在同一个存储中,但方向相反。将LSH和神经嵌入应用于构建日志的文本异常值检测,它将允许工程师查看日志行的一小部分,以识别和修复关键业务软件中的潜在错误,它还将允许我们获取几乎所有日志行的实时语义聚类。现在,将语义LSH的这一优势应用到Netflix的每个构建中。语义部分允许我们根据含义对看似不同的项目进行分组,并在离群值报告中对其进行注释。成熟的开源迁移学习数据产品和SDK使我们能够通过LSH以极少的代码行解决语义最近邻搜索问题。我们对迁移学习和微调可以为应用程序带来的优势特性感到惊喜,并且机器学习在帮助人们提高工作效率方面还有很多工作要做。
