首页 文章 精选 留言 我的

精选列表

搜索[数仓建模],共10000篇文章
优秀的个人博客,低调大师

Nature | AlphaFold3接触建模实现精准DNA碱基编辑

DNA碱基编辑技术能够在不引入DNA双链断裂的情况下实现单碱基精确修饰,是当前基因治疗和遗传疾病研究的重要工具。然而,脱靶编辑始终限制着其进一步应用。传统提高编辑器特异性的策略主要依赖结构经验设计或定向进化,不仅研发周期长,而且往往面临编辑活性与编辑精度难以兼顾的问题。研究人员提出了一种基于AlphaFold3的新型人工智能框架——ContactSeek,通过分析AlphaFold3预测得到的蛋白质—DNA—RNA复合物接触概率(Contact Probability,CP),寻找决定脱靶识别的关键接触区域及关键氨基酸,从而指导高精度碱基编辑器设计。研究首先建立了全新的dI-profiling测序方法,对腺嘌呤碱基编辑器(ABE)的全基因组脱靶位点进行系统检测,再将这些真实脱靶序列输入AlphaFold3进行预测。结果发现,相较于传统三维结构预测,接触概率能够更加敏感地反映靶点与脱靶之间微小但重要的相互作用差异。基于这一特点,ContactSeek成功筛选出多个决定编辑特异性的关键残基,并构建出兼具高活性和极低脱靶效应的新型ABE和CBE编辑器,展示了人工智能辅助精准基因编辑的新范式。

优秀的个人博客,低调大师

ERD Online 4.0.4 发布,元数据在线建模(免费、私有部署)

❝ fix(erd): 修改表名、模块名自定义提示 fix(erd): 支持自定义表名显示格式 fix(erd): 升级ant到5.0.1版本 fix(erd): 修复PDMan导入类型列为空 fix(erd): 增加类型列宽度,避免类型显示不全 fix(erd): 修复表设计报undefine异常 fix(erd): 修复版本比对,出现杂乱sql fix(erd): 修复表字段使用了数据库关键字导致不能执行 fix(erd): 修复同步数据源,获取的sql脚本不正确 fix(erd): 修复数据库逆向解析的模块,修改结构导致表清空 fix(erd): 修复无法重建基线bug,修复初始化基线sql脚本不一致问题 fix(erd): 修复模板编辑页光标会随着输入消失 fix(erd): 修改默认字段为小写 fix(erd): 增加本地启动环境变量 ❞ 变化一览 表名显示支持自定义,可以显示英文+中文 修复模板渲染bug 修复版本变更信息不准确 版本列表 版本比对 交流渠道 官方论坛:https://www.zerocode.net.cn/ ERD Online文档:https://portal.zerocode.net.cn/ ERD Online体验:https://erd.zerocode.net.cn/ 低代码LOCO体验:https://loco.zerocode.net.cn/

优秀的个人博客,低调大师

每日一博 | 使用 ML 和 DNN 建模的技巧总结

每个人都可以轻松地将数据放入任何模型机器学习或深度学习框架中。但是遵循最佳实践技巧可能有助于提升工作效率。以下是常见的一些方法。 本文内容 数据预处理 处理原始数据 使用张量 数据扩充 数据采样 模型训练 存储中间状态 虚拟周期 简化原则 定位问题 调试 定位问题 使用评价模型 数据转换 欠拟合 过拟合 生产 元数据关联 切换到推理模型 缩放成本 无状态模式 批处理 使用C++ 数据预处理(Data Preparation) 处理原始数据(Process Your Own Data) 因为消费者可能不知道开展数据处理和特征工程,所以数据分析师需要在模型内进行数据预处理。 以文本分类问题为例,使用BERT进行分类。数据分析师不能要求客户进行标记处理和特征整理。 以回归问题为例,时间是特征之一。在初始模型中,数据分析师只能使用星期几(如星期四)作为特征。经过几次迭代之后,星期几不再是一个好的特征因素,数据分析师只想使用日期(如31号)作为特征。而客户可能只提供了星期几的信息,而没有具体日期的信息,因此需要进行数据预处理。 以语音识别为例,消费者只能向数据分析师发送音频,而不能发送诸如Mel Cepstral Coefficient(MFCC)等经典特征数据。 因此,建议在代码中嵌入数据预处理,而不是要求客户机进行预处理。 使用张量(Use Tensor) 张量是一个N维数组,用于多维计算。它比使用Python字典或数组要快,深度学习框架(例如PyTorch或TensorFlow)的对象数据格式是tensor。 数据扩充(Data Augmentation) 缺少标记数据是从业者通常面临的挑战之一。迁移学习是克服这一问题的途径之一,计算机视觉从业者可以考虑使用ResNet,自然语言处理从业者可以考虑BERT。另一方面,可以生成合成数据以增加标记数据。albumentations和imgaug可以生成图像数据,而nlpaug可以生成文本数据。 如果你了解你的数据,你应该量身设计数据扩充方法。请记住,数据科学的黄金法则是garbage in garbage out。 数据采样(Sampling Same Data) 大多数情况下,我们希望随机抽取数据,以保持样本数据在训练集、测试集和验证集之间的概率分布是一致的。同时,也希望保持这种“随机”行为,使得我们可以在不同的时刻获得相同的训练集、测试集和验证集。 如果数据带有日期属性,则可以按日期拆分数据。 否则,可以更改随机种子,使其具有一致的随机行为。 import torchimport numpy as npimport randomseed = 1234random.seed(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed) 模型训练(Model Training) 存储中间状态(Saving Intermediate Checkpoint) 只是在训练完成后保存模型,通常具有以下几个缺点: 由于模型的复杂性、计算资源和训练数据的大小,整个模型训练过程可能需要几天或几周的时间。如果没有中间状态被存储,这将是非常危险的,因为机器可能会被意外关闭。 一般来说,较长训练能够获得更好的结果(例如,损失更少)。然而,可能会发生过度拟合。在大多数情况下,最后一个模型状态并不能提供最佳结果。我们大部分时间都需要使用中间状态的模型来进行生产。 使用检查-停止机制能够节省资金。注意到一个模型在几个周期内并没有改进,我们可以早点停止它以节省时间和资源。 理想情况下,我们可以连续性存储模型(例如,在每个epoch之后保存模型),但它需要大量的存储。事实上,我们建议只保留最好的模型(或最好的三个模型)和最后一个模型。 虚拟周期(Virtual Epoch) Epoch是模型训练中一个非常常见的参数。如果初始化不正确,可能会影响模型性能。 例如,如果我们有100万条记录,我们设置了5个epoch,那么总共有500万条的训练数据。三周后,我们又得到了50万条记录。如果我们使用相同的epoch进行模型训练,总训练数据将达到750万。问题是: 难以确定模型性能的改进是由于特定数据的数量增加还是总体数据的数量增加。 新的50万条数据使训练时间延长1小时甚至几天。它增加了机器故障的风险。 建议用虚拟epoch代替原始静态epoch。虚拟epoch可以根据训练数据的大小、期望epoch、批大小来计算得到。 通常的静态epoch如下: #originalnum_data = 1000 * 1000batch_size = 100num_step = 14 * 1000 * 1000num_checkpoint = 20steps_per_epoch = num_step//num_checkpoint#TensorFlow/ Kerasmodel.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch, batch_size=batch_size) 而虚拟epoch如下: num_data = 1000 * 1000num_total_data = 14 * 1000 * 1000batch_size = 100num_checkpoint = 20steps_per_epoch = num_total_data // (batch_size*num_checkpoint)#TensorFlow/ Kerasmodel.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch, batch_size=batch_size) 简化原则(Simple is Beauty) 从业者通常打算使用最先进的模型来构建初始模型。事实上,我们建议建立一个足够简单的模型作为基线模型。原因是: 我们总是需要一个基线模型来证明所提出的模型是正确的。 基线模型不需要在性能方面非常好,但它必须是可解释的。业务用户总是想知道预测结果的原因。 易于实施是非常重要的。客户不能等一年才能得到一个足够好的模型。我们需要建立一套模型,以便从投资者那里获得动力,在初始模型的基础上建立你的精彩模型。 以下是一些建议的不同领域的基线模型: 语音识别:可以使用经典特征,如mel frequency cepstral coefficient(MFCC)或 mel spectrogram features,而不是训练模型来获得向量表征(如增加嵌入层)。将这些特征传递给一个长短期记忆网络(LSTM)或卷积神经网络(CNN)和一个完全连接的层进行分类或预测。 计算机视觉:TODO。 自然语言处理:使用bag-of-words 或 classic word embeddings嵌入LSTM是一个很好的出发点,然后再转向其它模型,如BERT或XLNet。 调试(Debugging) 简化问题(Simplifying Problem) 有时,分类问题包括100万个数据和1000个类别。当模型性能低于理想值时,很难调试模型。糟糕的性能可能是由模型复杂性、数据质量或bug造成的。因此,建议简化问题,这样我们就可以保证它是无缺陷的。我们可以利用过度拟合问题来实现这一目标。 一开始,不需要对1000个类别进行分类,可以先对10个类别进行抽样,每个类别有100个数据,并训练模型。通过使用相同的训练数据集(或子集)作为评估数据集,能够过度拟合模型并获得良好的结果(例如,80甚至90+的精确度)。在这一基础上进行模型开发能够减少bug的出现。 使用评估模式(Using Eval Mode for Training) 如果评估模式的精度在前几个epoch中没有变化,通常可能是忘记在评估后重置为“训练”模式。 在Pytorch中,需要在训练和评估阶段转换训练模式以及评估模式。如果启用训练模式,批标准化、dropout或其他参数将受到影响。有时,数据分析师可能会在评估模式后忘记启用训练模式。 model = MyModel() # Default mode is training modefor e in range(epoch): # mode.train() # forget to enable train mode logits = model(x_train) loss = loss_func(logits, y_train) model.zero_grad() loss.backward() optimizer.step()mode.eval() # enable eval mode with torch.no_grad(): eval_preds = model(x_val) 数据转换(Data Shifting) 当训练数据集与评估/测试数据集存在显著差异时,需要进行数据转换。在计算机视觉任务中,可能大部分训练数据是白天的图片,而测试数据是夜间的图片。 如果发现训练损失/准确度和测试损失/准确度之间存在很大差异,可以从两个数据集中随机抽取一些样本进行检查。为了解决这个问题,可以考虑如下方法: 确保在训练、测试和预测数据集之间保持相似的数据分布。 如果可能,添加更多的训练数据。 通过利用相关库添加合成数据。考虑使用nlpaug(用于自然语言处理和声学任务)和imgaug(用于计算机视觉任务)。 欠拟合问题(Addressing Underfitting) 欠拟合是指训练误差大于期望误差。换言之,模型无法达到预期的性能。造成大误差的因素很多。要解决这个问题,可以从一个更简单的模型或者方法开始,看看它是否可以解决。 执行错误分析。通过LIME、SHAP或Anchor来解释你的模型,这样你就可以感觉到问题所在。 初始模型可能过于简单。增加模型的复杂性,例如增加长短期记忆(LSTM)层、卷积神经网络(CNN)层或完全连接(FC)层。 通过减少正则化层,稍微过拟合模型。Dropout和降低权重则可以防止过拟合。然后可以尝试移除这些正则化层,看看是否可以解决问题。 采用最先进的模型架构。考虑在自然语言处理(NLP)中使用转换器(如BERT或XLNet)。 引入合成数据。生成更多数据有助于提高模型性能,而无需任何人工操作。理论上,生成的数据应该共享同一个标签。它允许模型“看到”更多不同的数据,并最终提高鲁棒性。可以利用nlpaug和imgaug来执行数据扩充。 分配更好的超参数和优化器。可以考虑执行超参数调整,而不是使用默认/常规学习速率、epoch、batch size。考虑使用波束搜索、网格搜索或随机搜索来识别更好的超参数和优化器。这种方法相对简单,只需改变超参数,但可能需要较长的时间。 重新查看数据并引入额外的特征。 过拟合问题(Addressing Overfitting) 除了欠拟合,你还可能面临着过拟合的问题。过度拟合意味着你的模型太适合你的训练集,而对其他数据没有足够的适用性。换句话说,训练集准确性比验证集准确性要好。考虑以下解决方法: 执行错误分析。通过LIME、SHAP或Anchor来解释你的模型,这样你就可能发现问题所在。 增加更多的训练数据。 引入正则化层。Dropout(正则化层)和批处理标准化(normalization layer)通过删除一些输入和平滑输入来帮助减少过度拟合。 引入合成数据。生成更多数据有助于提高模型性能,而无需任何人工操作。 分配更好的超参数和优化器。 移除部分特征。 模型可能太过于复杂。可以减少模型复杂度。 生产(Production) 元数据联系(Meta Data Association) 在模型推出后,需要检查一些例外数据。一种方法是生成ID并将添加到数据库中。然而,它伴随着几个问题,也增加了故障排除的难度。以下是一些缺点: 影响系统的灵活性。从体系结构设计的角度来看,解耦是构建高柔性系统的途径之一。如果我们生成ID并将带有此ID的预测结果传递给客户,那么客户需要在其数据库中持久使用它。如果我们更改了格式或数据类型,需要通知所有使用者更新他们的数据库。 我们可能需要根据使用者的关键数据收集更多的元数据。额外的关键数据增加了连接的复杂性和存储消耗。 为了克服这个问题,预测结果应该直接与使用者的关键数据相关联。 转换为推理模型(Switch to Inference Mode) 使用Pytorch时,在将模型部署到生产环境中时,需要注意几个设置。前面提到了Pytorch中的eval,它使这些层(如Dropout、BatchNorm)在推理模式下工作,例如在推理阶段内不应用任何Dropout操作。它不仅能加快你的进程,而且能把所有的信息输入神经网络。 mode.eval() # enable eval modewith torch.no_grad(): eval_preds = model(x_val) 计算成本(Scalling Cost) 当尝试扩展API以处理更大的数据量时,有时可能会考虑使用GPU。的确,GPU虚拟机比CPU贵得多。然而,GPU带来了一些优势,例如计算时间更少,并且需要较少的VM来维持相同的服务级别。数据分析师应该试着评估一下GPU是否能节省一些钱。 无状态化(Stateless) 试着使你的API无状态化,这样你的API服务可以很容易地调整。无状态意味着不在API服务器(内存或本地存储)中保存任何中间结果。只需保持API服务器的简单性,并将结果返回给客户端,而无需在内存或本地存储中存储任何内容。 批处理(Batch Process) 预测一组数据通常比逐个预测更快。大多数现代机器学习或深度学习框架优化了预测性能(在速度方面)。你可能会注意到,切换到批处理模式预测对于效率有很大的改进。 使用C++ 虽然Python是机器学习领域中的主流语言,但与其他编程语言(如C++)相比,Python可能太慢了。如果希望低延迟的计算推理时间,可以考虑使用TorchScript。一般的方案是,你仍然可以在Python中训练你的模型,但是通过使用它生成C++兼容的模型。 作者:Edward Ma deephub翻译组:Oliver Lee 本文分享自微信公众号 - DeepHub IMBA(deephub-imba)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

美团大脑:知识图谱的建模方法及其应用

作为人工智能时代最重要的知识表示方式之一,知识图谱能够打破不同场景下的数据隔离,为搜索、推荐、问答、解释与决策等应用提供基础支撑。美团大脑围绕吃喝玩乐等多种场景,构建了生活娱乐领域超大规模的知识图谱,为用户和商家建立起全方位的链接。我们美团希望能够通过对应用场景下的用户偏好和商家定位进行更为深度的理解,进而为大众提供更好的智能化服务,帮大家吃得更好,生活更好。 近日,美团 AI 平台部 NLP 中心负责人、大众点评搜索智能中心负责人王仲远博士受邀在 AI 科技大本营做了一期线上分享,为大家讲解了美团大脑的设计思路、构建过程、目前面临的挑战,以及在美团点评中的具体应用与实践,其内容整理如下: 知识图谱的重要性 近年来,人工智能正在快速地改变人们的生活,可以看到各家科技公司都纷纷推出人工智能产品或者系统,比如说在 2016 年,谷歌推出的 AlphaGo ,一问世便横扫整个围棋界,完胜了人类冠军。又比如亚马逊推出的 Amazon Go 无人超市,用户只需下载一个 App,走进这家超市,就可以直接拿走商品,无需排队结账便可离开,这是人工智能时代的“新零售”体验。又比如微软推出的 Skype Translator,它能够帮助使用不同语言的人群进行实时的、无障碍的交流。再比如说苹果推出的 Siri 智能助理,它让每一个用苹果手机的用户都能够非常便捷地完成各项任务。所有这些人工智能产品的出现都依赖于背后各个领域技术突飞猛进的进展,包括机器学习、计算机视觉、语音识别、自然语言处理等等。 作为全球领先的生活服务电子商务平台,美团点评在人工智能领域也在积极地进行布局。今年 2 月份,AI 平台部 NLP 中心正式成立,我们的愿景是用人工智能帮大家吃得更好,生活更好。语言是人类智慧的结晶,而自然语言处理是人工智能中最为困难的问题之一,其核心是让机器能像人类一样理解和使用语言。 我们希望在不久的将来,当用户发表一条评价的时候,能够让机器阅读这条评价,充分理解用户的喜怒哀乐。当用户进入大众点评的一个商家页面时,面对成千上万条用户评论,我们希望机器能够代替用户快速地阅读这些评论,总结商家的情况,供用户进行参考。未来,当用户有任何餐饮、娱乐方面的决策需求的时候,美团点评能够提供人工智能助理服务,帮助用户快速的进行决策。 所有这一切,都依赖于人工智能背后两大技术驱动力:深度学习和知识图谱。我们可以将这两个技术进行一个简单的比较: 我们将深度学习归纳为隐性的模型,它通常是面向某一个具体任务,比如说下围棋、识别猫、人脸识别、语音识别等等。通常而言,在很多任务上它能够取得非常优秀的结果,同时它也有非常多的局限性,比如说它需要海量的训练数据,以及非常强大的计算能力,难以进行任务上的迁移,而且可解释性比较差。 另一方面,知识图谱是人工智能的另外一大技术驱动力,它能够广泛地适用于不同的任务。相比深度学习,知识图谱中的知识可以沉淀,可解释性非常强,类似于人类的思考。 我们可以通过上面的例子,来观察深度学习技术和人类是如何识别猫的,以及它们的过程有哪些区别。 2012 年,Google X 实验室宣布使用深度学习技术,让机器成功识别了图片中的猫。它们使用了 1000 台服务器,16000 个处理器,连接成一个 10 亿节点的人工智能大脑。这个系统阅读了 1000 万张从 YouTube 上抽取的图片,最终成功识别出这个图片中有没有猫。 我们再来看看人类是如何做的。对于一个 3 岁的小朋友,我们只需要给他看几张猫的图片,他就能够很快识别出不同图片中的猫,而这背后其实就是大脑对于这些知识的推理。 2011 年,Science 上有一篇非常出名的论文叫《How to Grow a Mind》。这篇论文的作者来自于 MIT、CMU、UC Berkeley、Stanford 等美国名校的教授。在这篇论文里,最重要的一个结论就是:如果我们的思维能够跳出给定的数据,那么必须有 Another Source Of Information 来 Make Up The Difference。 这里的知识语言是什么?对于人类来讲,其实就是我们从小到大接受的学校教育,报纸上、电视上看到的信息,通过社交媒体,通过与其他人交流,不断积累起来的知识。 近年来,不管是学术界还是工业界都纷纷构建自家的知识图谱,有面向全领域的知识图谱,也有面向垂直领域的知识图谱。其实早在文艺复兴时期,培根就提出了“知识就是力量”,在当今人工智能时代,各大科技公司更是纷纷提出:知识图谱就是人工智能的基础。 全球的互联网公司都在积极布局知识图谱。早在 2010 年微软就开始构建知识图谱,包括 Satori 和 Probase。2012 年,Google 正式发布了 Google Knowledge Graph,现在规模已经达到 700 亿左右。目前微软和 Google 拥有全世界最大的通用知识图谱,Facebook 拥有全世界最大的社交知识图谱,而阿里巴巴和亚马逊则分别构建了商品知识图谱。 如果按照人类理解问题和回答问题这一过程来进行区分,我们可以将知识图谱分成两类。我们来看这样一个例子,如果用户看到这样一个问题,“Who was the U.S. President when the Angels won the World Series?”相信所有的用户都能够理解这个问题,也就是当 Angels 队赢了 World Series 的时候,谁是美国的总统? 这是一个问题理解的过程,它所需要的知识通常我们称之为 Common Sense Knowledge(常识性知识)。另外一方面,很多网友可能回答不出这个问题,因为它需要另外一个百科全书式的知识。 因此,我们将知识图谱分成两大类,一类叫 Common Sense Knowledge Graph(常识知识图谱),另外一类叫 Encyclopedia Knowledge Graph(百科全书知识图谱)。这两类知识图谱有很明显的区别。针对 Common Sense Knowledge Graph,通常而言,我们会挖掘这些词之间的 Linguistic Knowledge;对于 Encyclopedia Knowledge Graph,我们通常会在乎它的 Entities 和这些 Entities 之间的 Facts。 对于 Common Sense Knowledge Graph,一般而言我们比较在乎的 Relation 包括 isA Relation、isPropertyOf Relation。对于 Encyclopedia Knowledge Graph,通常我们会预定义一些谓词,比如说 DayOfbirth、LocatedIn、SpouseOf 等等。 对于 Common Sense Knowledge Graph 通常带有一定的概率,但是 Encyclopedia Knowledge Graph 通常就是“非黑即白”,那么构建这种知识图谱时,我们在乎的就是 Precision(准确率)。 Common Sense Knowledge Graph 比较有代表性的工作包括 WordNet、KnowItAll、NELL 以及 Microsoft Concept Graph。而 Encyclopedia Knowledge Graph 则有 Freepase、Yago、Google Knowledge Graph 以及正在构建中的“美团大脑”。 这里跟大家介绍两个代表性工作:1)Common Sense Knowledge Graph:Probase;2)Encyclopedia Knowledge Graph:美团大脑。 常识性知识图谱(Common Sense Knowledge Graph) Microsoft Concept Graph 于 2016 年 11 月正式发布,但是它早在 2010 年就已经开始进行研究,是一个非常大的图谱。在这个图谱里面有上百万个 Nodes(节点),这些 Nodes 有Concepts(概念),比如说 Spanish Artists(西班牙艺术家);有 Entities(实体),比如说 Picasso(毕加索);有 Attributes(属性),比如 Birthday(生日);有 Verbs(动词),有 Adjectives(形容词),比如说 Eat、Sweet。也有很多很多的边,最重要的边,是这种 isA 边,比如说 Picasso,还有 isPropertyOf 边。对于其他的 Relation,我们会统称为 Co-occurance。 这是我们在微软亚洲研究院期间对 Common Sense Knowledge Graph 的 Research Roadmap(研究路线图)。当我们构建出 Common Sense Knowledge Graph 之后,重要的是在上面构建各种各样的模型。我们提出了一些模型叫 Conceptualization(概念化模型),它能够支持 Term Similarity、Short Text Similarity 以及 Head-Modifier Detection,最终支持各种应用,比如 NER、文本标注、Ads、Query Recommendation、Text Understanding 等等。 到底什么是 Short Text Understanding?常识怎么用在 Text Understanding 中?下面我们可以看一些具体的例子: 当大家看到上面中间的文本时,相信所有人都能够认出这应该是一个日期,但是大家没办法知道这个日期代表什么含义。但如果我们再多给一些上下文信息,比如 Picasso、Spanish等等,大家对这个日期就会有一些常识性的推理。我们会猜测这个日期很可能是 Picasso 的出生日期,或者是去世日期,这就是常识。 比如说当我们给定 China 和 India 这两个 Entity 的时候,我们的大脑就会做出一些常识性的推理,我们会认为这两个 Entity 在描述 Country。如果再多给一个 Entity:Brazil,这时候我们通常会想到 Emerging Market。如果再加上 Russia,大家可能就会想到“金砖四国”或者“金砖五国”。所有这一切就是常识性的推理。 再比如,当我们看到 Engineer 和 Apple 的时候,我们会对 Apple 做一些推理,认为它就是一个 IT Company,但是如果再多给一些上下文信息,在这个句子里面由于 eating 的出现,我相信大家的大脑也会一样地做出常识推理,认为这个 Apple 不再是代表 Company,而是代表 Fruit。 所以,这就是我们提出来的 Conceptualization Model,它是一个 Explicit Representation。我们希望它能够将 Text,尤其是 Short Text,映射到 Millions Concepts,这样的 Representation 能够比较容易让用户进行理解,同时能够应用到不同场景当中。 在这一页 PPT 中,我们展示了 Conceptualization 的结果。当输入是 Pear 和 Apple 的时候,那么我们会将这个 Apple 映射到 Fruit。但是如果是 iPad Apple 的时候,我们会将它映射到 Company,同时大家注意这并不是唯一的结果,我们实际上是会被映射到一个 Concept Vector。这个 Concept Vector 有多大?它是百万级维度的 Vector,同时也是一个非常 Sparse 的一个 Vector。 通过这样的一个 Conceptualization Model,我们能够解决什么样的文本理解问题?我们可以看这样一个例子。比如说给定一个非常短的一个文本 Python,它只是一个 Single Instance,那么我们会希望将它映射到至少两大类的 Concept 上,一种可能是 Programming Language,另外一种是 Snake。当它有一些 Context,比如说 Python Tutorial 的时候,那么这个时候 Python 指的应该是 Programming Language,如果当它有其他的 Adjective、Verb,比如有 Dangerous 时,这时候我们就会将 Python 理解为 Snake。 同时如果在一个文本里面包含了多个的 Entity,比如说 DNN Tool、Python,那么我们希望能够检测出在这个文本里面哪一个是比较重要的 Entity,哪一个是用来做限制的 Entity。 下面我们将简单地介绍一下,具体应该怎么去做。当我们在 Google 里搜一个 Single Instance 的时候,通常在右侧会出现这个 Knowledge Panel。对于 Microsoft 这样一个 Instance,我们可以看到这个红色框所框出来的 Concept,Microsoft 指向的是 Technology Company,这背后是怎么实现的? 我们可以看到,Microsoft 实际上会指向非常非常多的 Concept,比如说 Company,Software Company,Technology Leader 等等。我们将它映射到哪一个 Concept 上最合适? 如果将它映射到 Company 这个 Concept 上,很显然它是对的,但是我们却没办法将 Microsoft 和 KFC、BMW 这样其他类型的产品区分开来。另外一方面,如果我们将 Microsoft 映射到 Largest Desktop OS Vendor 上,那么这是一个非常 Specific 的 Concept,这样也不太好,为什么?因为这个 Concept 太 Specific,太 Detail,它可能只包含了 Microsoft 这样一个 Entity,那么它就失去了 Concept 的这种抽象能力。 所以我们希望将 Microsoft 映射到一个既不是特别 General(抽象),又不是一个特别 Specific(具体)的 Concept 上。在语言学上,我们将这种映射称之为 Basic-level,我们将整个映射过程命名为 Basic-level Conceptualization。 我们提出了一种计算 Basic-level Conceptualization 的方法,其实它非常简单而且非常有效。就是将两种的 Typicality 做了一些融合,同时我们也证明了它们跟 PMI 和 Commute Time 之间的一些关联。并且在一个大规模的数据集上,我们通过 Precision 和 NDCG 对它们进行了评价。最后证明,我们所提出来的 Scoring 方法,它在 NDCG 和 Precision 上都能达到比较好的结果。最重要的是,它在理论上是能够对 Basic-Level 进行很好的解释。 下面我们来看一下,当 Instance 有了一些 Context 之后,我们应该怎么去进行处理。我们通过一个例子,来简单地解释一下这背后最主要的思想。 比如说 iPad、Apple,其中 iPad 基本上是没有歧异的,它会映射到 Device、Product。但是对于 Apple 而言,它可能会映射到至少两类的 Concept 上,比如说 Fruit、Company。那么我们怎么用 iPad 对 Apple 做消歧呢? 方法其实也挺直观的。我们会通过大量的统计去发现像 iPad 这样的 Entity,通常会跟 Company、Product 共同出现。比如说 iPad 有可能会跟三星共同出现,有可能会跟 Google 共同出现,那么我们就发现它会经常跟 Brand、Company、Product共同出现。于是我们就利用新挖掘出来的 Knowledge 对 Apple 做消歧,这就是背后最主要的思想。 除了刚才这样一个 General Context 以外,在很多时候这些 Text 可能还会包含很多一些特殊的类型,比如说 Verb、Adjective。具体而言,我们希望在看到 Watch Harry Potter 时,能够知道 Harry Potter 是 Movie,当我们看到 Read Harry Potter 时,能够知道 Harry Potter 是 Book。同样的,Harry Potter 还有可能是一个角色名称,或者是一个游戏名称。 那么我们来看一看应该怎样去解决这样一件事情。当我们看到 Watch Harry Potter 时,我们首先要知道,Harry Potter 有可能是一本 Book,也有可能是一部 Movie。我们可以算出一个先验概率,这通常要通过大规模的统计。同时我们要知道,Watch 它有可能是一个名词,同时它也有可能是一个动词,并且我们还需要去挖掘,当 Watch 作为动词的时候,它和 Movie 有非常紧密的关联。 所以我们本质上是要去做一些概率上的推理,不仅要将条件概率做非常细粒度的分解,最后还要做概率计算。 通过概率计算的方法,我们实际上就可以构建出一个非常大的离线知识图谱,那么我们在这个上面,就可以有很多的 Term,以及它们所属的一些 Type,以及不同 Term 之间的一些关联。 当我们用这样一个非常大的离线知识图谱来做 Text Understanding 的时候,我们可以首先将这个 Text 进行分割处理,在分割之后,我们实际上是可以从这个非常大的离线知识图谱中截取出它的一个子图。最后我们使用了 Random Walk With Restart 的模型,来对这样一个在线的 Subgraph 进行分类。 我们再来看一下,如果一个文本里包含了 Multiple Entities,要怎样处理?我们需要做知识挖掘,怎么做?首先我们可以得到非常多的 Query Log,然后我们也可以去预定一些 Pattern,通过这种 Pattern 的定义,可以抽取出非常多 Entity 之间 Head 和 Modifier 这样的 Relation,那么在接下来我们可以将这些 Entity 映射到 Concept 上,之后得到一个 Pattern。 在这个过程之中,我们要将 Entity 映射到 Concept 上,那么这就是前面所提到的 Conceptualization。我们希望之后的映射不能太 General,避免 Concept Pattern 冲突。 但是它也不能太 Specific,因为如果太 Specific,可能就会缺少表达能力。最坏的情况,它有可能就会退化到 Entity Level,而 Entity 至少都是百万的规模,那么整个 Concept Patterns 就有可能变成百万乘以百万的级别,显然是不可用的。 所以我们就用到了前面介绍的 Basic-Level Conceptualization 的方法,将它映射到一个既不是特别 General,也不是特别 Specific 的 Concept 上。 大家可以看一下我们能够挖掘出来的一些 Top 的 Concept Patterns,比如说 Game 和 Platform,就是一个 Concept 和一个 Pattern。它有什么用?举一个具体的例子,当用户在搜 Angry Birds、iOS 的时候,我们就可以知道用户想找的是 Angry Birds 这款游戏,而 iOS 是用来限制这款游戏的一个 Platform。苹果公司每年都会推出新版本的 iOS,那么我们挖掘出这样的 Concept Pattern 之后,不管苹果出到 iOS 15或者 iOS 16,那么我们只需要将它们映射到 Platform,那么我们的 Concept Patterns 就仍然有效,这样可以很容易地进行知识扩展。 所以 Common Sense Knowledge Mining 以及 Conceptualization Modeling,可以用在很多的应用上,它可以用来算 Short Text Similarity,可以用来做 Classification、Clustering,也可以用来做广告的 Semantic Match、Q/A System、Chatbot 等等。 美团大脑——百科全书式知识图谱(Encyclopedia Knowledge Graph) 在介绍完 Common Sense Knowledge Graph 之后,给大家介绍一下 Encyclopedia Knowledge Graph。这是美团的知识图谱项目——美团大脑。 美团大脑是什么?美团大脑是我们正在构建中的一个全球最大的餐饮娱乐知识图谱。我们希望能够充分地挖掘关联美团点评各个业务场景里的公开数据,比如说我们有累计 40 亿的用户评价,超过 10 万条个性化标签,遍布全球的 3000 多万商户以及超过 1.4 亿的店菜,我们还定义了 20 级细粒度的情感分析。 我们希望能够充分挖掘出这些元素之间的关联,构建出一个知识的“大脑”,用它来提供更加智能的生活服务。 我们简单地介绍一下美团大脑是如何进行构建的。我们会使用 Language Model(统计语言模型)、Topic Model(主题生成模型) 以及 Deep Learning Model(深度学习模型) 等各种模型,希望能够做到商家标签的挖掘,菜品标签的挖掘和情感分析的挖掘等等。 为了挖掘商户标签,首先我们要让机器去阅读评论。我们使用了无监督和有监督的深度学习模型。 无监督模型我们主要用了LDA,它的特点是成本比较低,无需标注的数据。当然,它准确性会比较不可控,同时对挖掘出来的标签我们还需要进行人工的筛选。至于有监督的深度学习模型,那么我们用了 LSTM,它的特点是需要比较大量的标注数据。 通过这两种模型挖掘出来的标签,我们会再加上知识图谱里面的一些推理,最终构建出商户的标签。 如果这个商户有很多的评价,都是围绕着宝宝椅、带娃吃饭、儿童套餐等话题,那么我们就可以得出很多关于这个商户的标签。比如说我们可以知道它是一个亲子餐厅,它的环境比较别致,服务也比较热情。 下面介绍一下我们如何对菜品进行标签的挖掘?我们使用了 Bi-LSTM 以及 CRF 模型。比如说从这个评论里面我们就可以抽取出这样的 Entity,再通过与其他的一些菜谱网站做一些关联,我们就可以得到它的食材、烹饪方法、口味等信息,这样我们就为每一个店菜挖掘出了非常丰富的口味标签、食材标签等各种各样的标签。 下面再简单介绍一下,我们如何进行评论数据的情感挖掘。我们用的是 CNN+LSTM 的模型,对于每一个用户的评价我们都能够分析出他的一些情感的倾向。同时我们也正在做细粒度的情感分析,我们希望能够通过用户短短的评价,分析出他在不同的维度,比如说交通、环境、卫生、菜品、口味等方面的不同的情感分析的结果。值得一提的是,这种细粒度的情感分析结果,目前在全世界范围内都没有很好的解决办法,但是美团大脑已经迈出了非常重要的一步。 下面介绍一下我们的知识图谱是如何进行落地的。目前业界知识图谱已经有非常多的成熟应用,比如搜索、推荐、问答机器人、智能助理,包括在穿戴设备、反欺诈、临床决策上都有非常好的应用。同时业界也有很多的探索,包括智能商业模式、智能市场洞察、智能会员体系等等。 如何用知识图谱来改进我们的搜索?如果大家现在打开大众点评,搜索某一个菜品时,比如说麻辣小龙虾,其实我们的机器是已经帮大家提前阅读了所有的评价,然后分析出提供这道菜品的商家,我们还会根据用户评论的情感分析结果来改进这些搜索排序。 此外,我们也将它用在商圈的个性化推荐。当大家打开大众点评时,如果你现在位于某一个商场或者商圈,那么大家很快就能够看到这个商场或者商圈的页面入口。当用户进入这个商场和商户页面时,通过知识图谱,我们就能够提供“千人千面”的个性化排序和个性化推荐。 在这背后其实使用了一个“水波”的深度学习模型,关于这个深度学习模型更详细的介绍,大家可以参见我们在 CIKM 上的一篇论文。 所有的这一切,其实还有很多的技术突破等待我们去解决。比如整个美团大脑的知识图谱在百亿的量级,这也是世界上最大的餐饮娱乐知识图谱,为了支撑这个知识图谱,我们需要去研究千亿级别的图存储和计算引擎技术。我们也正在搭建一个超大规模的 GPU 集群,来支持海量数据的深度学习算法。未来,当所有的这些技术都成熟之后,我们还希望能够为所有用户提供“智慧餐厅”和“智能助理”的体验。 文章转载自 AI 科技大本营(rgznai100),部分内容有修正。 作者简介 仲远,博士,美团点评高级研究员、高级总监,美团 AI 平台部 NLP 中心负责人、大众点评搜索智能中心负责人。加入美团点评前,担任美国 Facebook 公司 Research Scientist,负责 Facebook 产品级 NLP Service。在 Facebook 之前,担任微软亚洲研究院的主管研究员,负责微软研究院知识图谱项目和对话机器人项目。多年来专注于自然语言处理、知识图谱及其在文本理解方面的研究,在国际顶级学术会议如 VLDB、ICDE、IJCAI、CIKM 等发表论文30余篇,获得 ICDE 2015 最佳论文奖,并是 ACL 2016 Tutorial “Understanding Short Texts”的主讲人,出版学术专著3部,获得美国专利5项。在 NLP 和 KG 研究领域及实际产品系统中均有丰富经验,研究领域包括:自然语言处理、知识图谱、深度学习、数据挖掘等。 招聘信息 美团点评 NLP 团队招聘各类算法人才,Base 北京上海均可。NLP 中心使命是打造世界一流的自然语言处理核心技术和服务能力,依托 NLP(自然语言处理)、Deep Learning(深度学习)、Knowledge Graph(知识图谱)等技术,处理美团点评海量文本数据,打通餐饮、旅行、休闲娱乐等各个场景数据,构建美团点评知识图谱,搭建通用 NLP Service,为美团点评各项业务提供智能的文本语义理解服务。我们的团队既注重AI技术的落地,也开展中长期的NLP及知识图谱基础研究。目前项目及业务包括美团点评知识图谱、智能客服、语音语义搜索、文章评论语义理解、美团点评智能助理等。真正助力于“帮大家吃得更好,生活更好”企业使命的实现,优化用户的生活体验,改善和提升消费者的生活品质。欢迎各位朋友推荐或自荐至 hr.ai@meituan.com。 算法岗:NLP算法工程师/专家/研究员 、知识图谱算法工程师/专家/研究员 工程岗:C++/Java研发专家/工程师 、AI平台研发工程师/专家 产品岗:AI产品经理/专家(NLP、数据方向)

优秀的个人博客,低调大师

Java并发编程实战系列5之基础构建模块

1 同步容器类 同步容器类包括Vector和HashTable,二者是早期JDK一部分,此外还包括在JDK 1.2中添加的一些功能相似的类,这些的同步封装器类是由Collections.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将他们的状态封装起来,并对每个共有方法进行同步,使得每次只有一个线程能访问容器的状态。 1.1 同步容器类的问题 同步容器类都是线程安全的,但在某些情况可能需额外客户端加锁来保护复合操作。 容器上常见的复合操作包括: 迭代(反复访问元素,直到遍历完容器中所有元素) 跳转(根据指定顺序找到当前元素的下一个元素)以及条件运算 在同步容器类中,这些复合操作在没有客户端加锁的情况下,仍是线程安全的, 但当其他线程并发的修改容器时,他们可能会表现出意料之外的行为。 2 并发容器 Java5提供了多种并发容器来改进同步容器的性能。 同步容器将所有对容器状态的访问都串行化,以实现他们的线程安全性。 这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低。 并发容器是针对多个线程并发访问设计的。在Java 5中增加了 ConcurrentHashMap,用来替代同步且基于散列的Map,增加了对一些常见符合操作的支持,例如“若没有则添加”、替换以及有条件删除等。 CopyOnWriteArrayList,用于在遍历操作为主要操作的情况下代替同步的List。 copyOnWriteArrayList 和 copyOnWriteSet 一开始都共享同一个内容,当想要修改内容时,才会真正的把内容 copy 出去,形成一个新的内容后再改 比如:当我们往一个容器添加元素时,不直接往当前容器添加,而是先将容器进行 copy,复制出一个新容器,再往新容器里加元素。添加完之后,再将原容器引用指向新容器。 好处:对 copyOnWrite 容器进行并发读时,不需要加锁,因为当前容器不会增加新元素,读写分离 copyOnWriteArrayList#add要加锁,否则多线程时会 copy N 个副本 copyOnWrite 适合于 读多写少场景,但只能保证数据最终一致性,不保证实时一致性 若你希望写入马上被读到,不要用 copyOnWrite 容器 通过并发容器来代替同步容器,可以极大地提供伸缩性并降低风险。 2.1 CocurrentHashMap 同步容器在执行每个操作期间都持有一个锁。在一些操作中,例如HashMashMap.get或List.contains,可能包含大量的工作:当遍历散列桶或链表来查找某个特定的对象时,必须在许多元素上调用equals。在基于散列的容器中,如果hashCode不能很均匀的分布散列值,那么容器中的元素就不会均匀的分布在整个容器中。某些情况下,某个糟糕的散列函数还会把一个散列表变成线性链表。当遍历很长的链表并且在某些或者全部元素上调用equals方法时,会花费很长时间,而其他线程在这段时间内都不能访问容器。 ConcurrentHashMap使用一种粒度更细的称为分段锁的机制来实现更大程度的共享. 在这种机制中,任意数量的读取线程可以并发的访问Map,执行读操作的线程和执行写操作的线程可以并发的访问Map,并且一定数量的写线程可以并发的修改Map. ConcurrentHashMap与其他并发容器一起增强了同步容器:迭代器不会抛出ConcurrentModificationException,因此迭代过程无需加锁. 其迭代器具有"弱一致性",而并非"及时失败".可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以(但不保证)在迭代器被构造后将修改操作反映给容器. 只有当需要加锁Map以进行独占访问时,才应该放弃使用ConcurrentHashMap. 2.2 额外的原子Map操作 由于ConcurrentHashMap不能被加锁来执行独占访问,因此 无法使用客户端加锁来创建新的原子操作. 一些常见的复合操作,eg."若没有则添加","若相等则移除"等,都已经实现为原子操作并且在ConcurrentMap接口中声明,如下面代码所示. public interface ConcurrentMap<K, V> extends Map<K, V> { //仅当K没有相应的映射值时才插入 V putIfAbsent(K key, V value); //仅当K被映射到V时才移除 boolean remove(Object key, Object value); //仅当K被映射到oldValue时才替换为newValue boolean replace(K key, V oldValue, V newValue); //仅当K被映射到某个值时才被替换为newValue V replace(K key, V value); }

优秀的个人博客,低调大师

LeetCode 1:两数之和 Two Sum

题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解题思路: 暴力穷举:外循环遍历每个元素 x,内循环查找是否存在一个值与 target - x 相等的目标元素,返回相等的目标元素和 x 的索引。时间复杂度 O (n^2),效率太低,pass。 哈希表:哈希映射(map、dict),key 保存该元素,value 保存该元素索引。 两次遍历法:第一次遍历把所有元素及其索引保存到哈希映射,第二次遍历查找 target - x 相等的目标元素 一次遍历法:假如 y = target - x,则 x = target -y,所以一次遍历 在存入哈希映射的同时查找是否存在一个值与 target - x 相等的目标元素。 例:nums = [2, 11, 7, 15], target = 9, hashmap = { } 遍历: i = 0: target - x = 9 - 2 = 7, 7 不存在于 hashmap 中,则 x(2) 加入 hashmap, hashmap = {2 : 0} i = 1: target - x = 9 - 11 = -2, -2 不存在于 hashmap 中,则 x(-2) 加入 hashmap, hashmap = {2 : 0, 11 : 1} i = 2: target - x = 9 - 7 = 2, 2 存在于 hashmap 中,则返回列表 [2, 0] 代码: 两次遍历(Java): class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) {//一次遍历转换成键值对,key为元素值,value为索引值 map.put(nums[i], i); } for (int i = 0; i < nums.length; i++) {//二次遍历查找符合条件的元素 int res = target - nums[i]; if (map.containsKey(res) && map.get(res) != i) {//查找到的目标元素不能为其本身 return new int[]{i, map.get(res)}; } } return null; } } 一次遍历 (Java): class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int res = target - nums[i]; if (map.containsKey(res)) {//因为自身元素还未加入到 hashmap,无需 map.get(res) != i 条件判断 return new int[]{i, map.get(res)}; } map.put(nums[i], i);//未找到目标元素则将其加入 hashmap } return null; } } 一次遍历 (Python): class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: dic = {} for i, num in enumerate(nums): #枚举 nums 数组 if num in dic: return [dic[num], i] else: dic[target-num] = i 利用 Python 数组自带 index 方法解题: class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i, num in enumerate(nums): if target-num in nums and nums.index(target-num) != i: return [i, nums.index(target-num)] list.index(): 描述: index () 函数用于从列表中找出某个值第一个匹配项的索引位置。 语法: index () 方法语法: list.index(x, start, end) 参数: x-- 查找的对象。 start-- 可选,查找的起始位置。 end-- 可选,查找的结束位置。 返回: 该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。 欢迎关注微.信.公.众号: 爱写Bug

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册