• [技术干货] 监督学习 & 无监督学习
    定义监督学习和无监督学习是机器学习的两种主要方法。监督学习:这种方法需要带有标签的训练数据,通常由人工标注或专家知识提供。训练数据由输入物件(通常是向量)和预期输出组成,例如分类标签或连续值。在监督学习中,模型通过学习输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出,例如分类。无监督学习:无监督学习不需要标签,因此可以利用更丰富的未标记数据。在无监督学习中,训练数据只包含输入样本,没有相应的标签或预期输出。无监督学习的目标是从数据中推断出隐藏的结构、关系或规律,例如聚类、降维和关联规则挖掘等。区别监督学习监督学习的优点在于其精准性。由于监督学习利用了带有标签的训练数据,通过训练模型来预测输出结果,因此可以获得相对准确的预测结果。此外,在某些特定领域,如医学图像处理或金融市场预测等,监督学习可以利用专家知识或历史数据进行训练,从而获得更准确的预测结果。然而,监督学习的缺点在于其数据获取和标注的成本较高。在很多应用场景中,获取带有标签的数据需要大量的人力物力投入,特别是在数据量庞大或标注数据要求较高的场景中,监督学习的成本会更高。无监督学习无监督学习的优点在于其利用未标记的数据进行训练,从而避免了监督学习中的数据获取和标注成本。无监督学习通过对数据进行挖掘和分析,发现数据中的内在结构和规律,从而进行聚类、降维和关联规则挖掘等任务。在某些特定领域,如社交网络分析或市场调研中,无监督学习可以充分利用未标记的数据,获取更丰富的信息和洞察。然而,无监督学习的缺点在于其结果的解释性相对较弱。由于无监督学习没有利用带有标签的数据进行训练,因此其结果的解释性通常不如监督学习强。此外,在某些应用场景中,无监督学习可能需要更多的计算资源和时间来进行模型训练和优化。准确率监督学习和无监督学习各有其准确率优势。监督学习的准确率相对较高。这是因为监督学习利用了带有标签的训练数据进行训练,可以通过比较实际输出和预期输出之间的误差来优化模型。此外,监督学习通常采用诸如回归、分类、聚类等算法,这些算法经过优化和调整,可以获得相对准确的预测结果。然而,监督学习的准确率也取决于多种因素,如数据的质量和数量、模型的复杂度和训练的充分性等。如果训练数据不充分或存在噪声,或者模型过于复杂,那么监督学习的准确率可能会下降。无监督学习的准确率通常比监督学习低。这是因为无监督学习没有利用带有标签的数据进行训练,而是通过挖掘和分析未标记的数据来发现数据中的内在结构和规律。无监督学习通常采用诸如聚类、降维等算法,这些算法的目的是从数据中提取有用的信息和洞见,而不是直接预测结果。然而,无监督学习也有其独特的优势。例如,在某些情况下,无监督学习可以利用未标记的数据进行训练,从而避免监督学习中数据获取和标注的成本。此外,无监督学习可以发现数据中的隐藏结构和模式,从而提供对数据更深入的理解和洞见。因此,无法简单地判断哪种学习的准确率更高,而是需要根据具体的应用场景和需求来选择合适的学习方法。在某些场景中,如预测股票价格或疾病诊断等需要相对准确的结果时,监督学习可能更合适。而在另一些场景中,如社交网络分析或市场调研中,无监督学习可以提供更丰富的信息和洞见。成本由于监督学习需要人工获取标注,因此成本肯定是大大高于无监督学习
  • [公告] 华为云实时智能风控RTD简介
    1 背景1.1 风控概念互联网诞生以来,互联互通的信息浪潮,压缩了传输的空间和时间,打破了以往阻绝流动的藩篱,人们的生活得到了极大的便利。尤其是在移动互联网的背景下,没有绝对的隐私,没有绝对的安全,风险无所不在。风控技术是保证机构和个人利益重要手段。风控(Risk Control)是指在金融、营销、互联网等领域中,通过识别、评估和管理风险,采取相应的措施来控制和降低风险的过程。 1.2 传统风控技术挑战随着黑灰色产业链产业化,精准化,移动化,技术化,风控技术面临巨大挑战。传统风控系统数据维度单一,多维度多场景难以协同,很难应对团伙欺诈等新变化。事中缺乏对复杂、高并发场景的实时计算能力,既要实现笔笔风控检测又要保障用户体验的双目标难以满足。另外欺诈模式隐蔽化,场景化,社工化演变,经验规则无法应对多变场景,自动化水平低。 1.3 实时智能风控的价值实时智能风控是一种利用人工智能(AI)技术对风险识别和管理的方法。它通过自研算法模型对大数据分析、机器学习等技术进行融合,提供实时、准确和全面的风险识别和管理,以保护组织免受潜在的威胁和损失。它可以应用于不同领域,如金融服务、电子商务、保险、网络安全等。2 华为云实时智能风控RTD关键能力2.1 变量和规则计算变量和规则是RTD系统核心概念。变量是规则的输入,在规则执行前会进行一系列的计算。根据变量的特征可以分为事件变量,批次变量,实时查询变量,模型变量和窗口变量等。变量和规则具有以下特点:丰富的变量来源,覆盖业务场景广泛。支持黑白名单,满足特殊业务诉求。规则可分组加权计算。支持第三方请求变量,扩展决策流。 2.2 复杂规则实现复杂规则特点:需要保存历史数据,大窗口计算,数据间有相互作用。举例: 几天内多笔转账金额上下浮动10%。 几天内多笔转帐金额连续递增。传统规则引擎做法: 类似drools规则引擎 + mysql或oracle等。缺点: 需要java代码+SQL,开发成本高。 复杂规则SQL交互多,性能很差;一般都是秒级或者分钟级响应。流处理技术做法: 通过流处理计算统计值,加CEP判断,这种一般适合于依赖历史数据少的,基于当前数据的特征或者黑白名单或者有前后顺序的数据处理。缺点: 大窗口计算性能差,甚至无法计算。 不同的计算逻辑无法共享数据,占用内存资源多。 需借助多流Join对多事件源协同处理。最好的实现方法: 超高性能的内存计算DB引擎 + 支持事务的PLSQL实现规则。 2.3 多维度协同决策维度是业务管理颗粒度,比如说卡人维度、卡片维度、商户维度等,不同的维度可以定义各自的变量和规则。实时智能风控RTD支持多多维度协同计算,决策准确性更高。 多事件源:多事件源共享内存计算引擎,实现数据共享,比如先识别登录才能转账 多维度:父子维度多维度同时决策,比如一个帐户在过去3天转帐超过5次,设备使用都是安卓,这次转账使用了非安卓手机,且IP地址不一样。 近数据源计算:规则在数据节点执行,近数据计算,实时性高,性能达到极致。 2.4 灰度发布灰度发布(Gray Deployment)是一种软件发布策略,它允许在生产环境中逐步将新版本的软件部署给一部分用户或服务器,以便在全面推广之前进行测试和评估。降低风险:灰度发布可以帮助降低发布新版本时的风险。通过逐步将新版本部署给一小部分用户或服务器,可以在全面推广之前及时发现和解决潜在的问题和错误。这样可以避免出现全面发布后对所有用户造成的严重故障或影响。提供实时反馈:通过将新版本的软件部署给一小部分用户或服务器,可以获得实时的用户反馈。这些反馈可以帮助开发团队及时了解新版本的性能、稳定性和用户体验,并根据反馈进行必要的调整和改进。控制发布节奏:灰度发布允许控制发布的节奏和速度。可以根据实际情况逐步增加新版本的部署比例,确保系统的稳定性和可用性。如果在灰度发布的过程中发现了问题,可以暂停或回滚发布,以避免对所有用户造成不良影响。 2.5 冠军挑战者冠军挑战者(Champion-Challenger)是一种在业务或技术领域中常用的策略,它通过同时运行并比较不同的解决方案或策略,以确定最佳的方案。创新和改进:冠军挑战者方案鼓励创新和改进。通过同时尝试多个解决方案或策略,可以发现新的想法和方法,提高业务或技术的效率和效果。挑战者方案可以激发竞争和创造力,推动组织不断进步和发展。降低风险:冠军挑战者方案可以降低决策的风险。通过同时运行多个方案,可以在实践中评估它们的表现和结果。这样可以避免过度依赖单一方案而导致的潜在风险和失败。如果挑战者方案表现更好,可以及时调整冠军方案,减少潜在的损失。数据驱动决策:冠军挑战者方案基于数据和实证结果进行决策。通过同时运行多个方案并收集相关数据,可以进行客观的比较和评估。这样可以基于实际数据做出决策,而不是仅凭主观判断或假设。 2.6 规则和模型融合机器学习在风控场景使用越来越广泛,它可以帮助机构和组织更好地识别、评估和管理各种风险。欺诈检测:机器学习可以用于欺诈检测,通过分析大量的交易数据和用户行为模式,识别潜在的欺诈行为。基于历史数据和模式识别算法,机器学习模型可以自动识别异常交易、盗刷和欺诈活动,帮助机构及时采取措施防止和减少损失。信用评估:机器学习可以用于信用评估,通过分析借款人的个人信息、历史借贷记录和其他相关数据,预测其违约风险。机器学习模型可以根据大量的历史数据和特征,建立预测模型来评估借款人的信用状况,并帮助机构做出更准确的信用决策。信用卡反欺诈:机器学习可以用于信用卡反欺诈,通过分析持卡人的消费模式、地理位置和其他行为特征,识别潜在的信用卡欺诈行为。机器学习模型可以实时监测交易,并根据模式识别和异常检测算法,自动识别可疑交易和欺诈行为。 3 华为云实时智能风控RTD的优势实时智能风控RTD是一个企业级分布式实时决策引擎平台,具备满足大数据量、高并发、低时延,自定义规则,水平扩展的特性,是数据到商业决策的“最后一公里”,为企业提供风控、营销等高价值的精准决策。系统的高可扩展性,能够方便融合机器学习等外部模型作为变量输入,提高决策的精确性。 高性能:实时智能风控RTD是分布式决策引擎,采用自研超高性能内存计算引擎支持近数据计算NDP。处理时延百毫秒级。处理能力可横向扩展。处理达到5000TPS。高可靠:支持Rest、异步消息接入,即可以通过不同的协议接入RTD平台。高性能的多协议接入部件,隐藏内部网络拓扑细节。业务处理单元采用分布式架构、规则执行引擎主备架构、支持分库分表。易用性:使用传统的SQL语言,容易理解,学习,编写。支持SQL/PLSQL规则定义。支持应用实时监控。满足事中和事后两种场景。自主性:支持用户自定义事件渠道、自定义维度、自定义事件源。多样数据源灵活接入。业务人员可自定义规则、自助秒级上下线规则。支持机器学习评分模式。创新性:多技术融合:规则引擎、流处理、AI、内存库、近数据计算。变量+ 规则 + AI 模型融合。规则集管理。灰度发布、冠军挑战者。4 实时智能风控RTD在金融领域的应用实时智能风控RTD在某金融机构深度使用,取得非常好的成效:风险案件下降率83%,防堵损失数亿元。12个控制渠道,覆盖95%的业务场景,侦测覆盖率提升10%。30毫秒神速响应,加速银行智能反欺诈,用户体验好。转账免动码下降85%,登录免动码下降95%,节约短信费用数千万元。金额BP值达到千分之一,行业领先。 5 展望总结随着时代技术,互联网产品形态的不断发展,风控需要持续不断的学习和对抗。移动支付占比超过70%,网络伪冒趋势不断上升。欺诈手段呈现专业化,产业化,隐蔽化,场景化,风险不断增大。未来,实时智能风控RTD将更加的注重人工智能大模型的融合和算法创新,提高风险预测的准确性和实时性。
  • [问题求助] ApolloScape Scene Parsing数据集应该如何使用?
    ApolloScape Scene Parsing数据集应该如何使用?
  • [其他] 浅谈机器学习之应用场景
    机器学习应用广泛,无论是在军事领域还是民用领域,都有机器学习算法施展的机会,主要包括以下几个方面。数据分析与挖掘“数据挖掘”和"数据分析”通常被相提并论,并在许多场合被认为是可以相互替代的术语。关于数据挖掘,已有多种文字不同但含义接近的定义,例如“识别出巨量数据中有效的.新颖的、潜在有用的最终可理解的模式的非平凡过程”,无论是数据分析还是数据挖掘,都是帮助人们收集、分析数据,使之成为信息,并做出判断,因此可以将这两项合称为数据分析与挖掘。数据分析与挖掘技术是机器学习算法和数据存取技术的结合,利用机器学习提供的统计分析、知识发现等手段分析海量数据,同时利用数据存取机制实现数据的高效读写。机器学习在数据分析与挖掘领域中拥有无可取代的地位,2012年Hadoop进军机器学习领域就是一个很好的例子。模式识别模式识别起源于工程领域,而机器学习起源于计算机科学,这两个不同学科的结合带来了模式识别领域的调整和发展。模式识别研究主要集中在两个方面。(1)研究生物体(包括人)是如何感知对象的,属于认识科学的范畴。(2)在给定的任务下,如何用计算机实现模式识别的理论和方法,这些是机器学习的长项,也是机器学习研究的内容之一。模式识别的应用领域广泛,包括计算机视觉、医学图像分析、光学文字识别、自然语言处理、语音识别、手写识别、生物特征识别、文件分类、搜索引擎等,而这些领域也正是机器学习大展身手的舞台,因此模式识别与机器学习的关系越来越密切。在生物信息学上的应用随着基因组和其他测序项目的不断发展,生物信息学研究的重点正逐步从积累数据转移到如何解释这些数据。在未来,生物学的新发现将极大地依赖于在多个维度和不同尺度下对多样化的数据进行组合和关联的分析能力,而不再仅仅依赖于对传统领域的继续关注。序列数据将与结构和功能数据基因表达数据、生化反应通路数据表现型和临床数据等一系列数据相互集成。如此大量的数据,在生物信息的存储、获取、处理、浏览及可视化等方面,都对理论算法和软件的发展提出了迫切的需求。另外,由于基因组数据本身的复杂性也对理论算法和软件的发展提出了迫切的需求。而机器学习方法例如神经网络、遗传算法、决策树和支持向量机等正适合于处理这种数据量大、含有噪声并且缺乏统一理论的领域。具体应用(1)虚拟助手。Siri,Alexa,Google Now都是虚拟助手。顾名思义,当使用语音发出指令后,它们会协助查找信息。对于回答,虚拟助手会查找信息,回忆语音指令人员的相关查询,或向其他资源(如电话应用程序)发送命令以收集信息。人们甚至可以指导助手执行某些任务,例如“设置7点的闹钟”等。(2)交通预测。生活中人们经常使用GPS导航服务。当使用GPS导航服务时,人们当前的位置和速度被保存在中央服务器上来进行流量管理。之后使用这些数据用于构建当前流量的映射。通过机器学习可以解决配备GPS的汽车数量较少的问题,在这种情况下的机器学习有助于根据估计找到拥挤的区域。(3)过滤垃圾邮件和恶意软件。电子邮件客户端使用了许多垃圾邮件过滤方法。为了确保这些垃圾邮件过滤器能够不断更新,它们使用了机器学习技术。多层感知器和决策树归纳等是由机器学习提供支持的一些垃圾邮件过滤技术。每天检测到超过325000个恶意软件,每个代码与之前版本的90%~98%相似。由机器学习驱动的系统安全程序理解编码模式。因此,他们可以轻松检测到2%~10%变异的新恶意软件,并提供针对它们的保护。(3)快速揭示细胞内部结构。借由高功率显微镜和机器学习,美国科学家研发出一种新算法,可在整个细胞的超高分辨率图像中自动识别大约30种不同类型的细胞器和其他结构。相关论文发表在最新一期的《自然》杂志上。(4)2022年,中国科学家利用机器学习的方法,快速得到相接双星的参数和误差。
  • 华为atlas openeuler操作系统制卡失败
    制卡失败,失败原因为qemu is broken or the version of qemu is not compatible我已经按照华为官方文档的要求安装了相应的依赖软件,为什么还会出现qemu broken的错误
  • 浅谈强化学习
    强化学习(Reinforcement Learning, RL),是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题 。强化学习是智能体(Agent)以“试错”的方式进行学习,通过与环境进行交互获得的奖赏指导行为,目标是使智能体获得最大的奖赏,强化学习不同于连接主义学习中的监督学习,主要表现在强化信号上,强化学习中由环境提供的强化信号是对产生动作的好坏作一种评价(通常为标量信号),而不是告诉强化学习系统RLS(reinforcement learning system)如何去产生正确的动作。由于外部环境提供的信息很少,RLS必须靠自身的经历进行学习。通过这种方式,RLS在行动-评价的环境中获得知识,改进行动方案以适应环境。强化学习的常见模型是标准的马尔可夫决策过程(Markov Decision Process)。按给定条件,强化学习可分为基于模式的强化学习(model-based RL)和无模式强化学习(model-free RL),以及主动强化学习(active RL)和被动强化学习(passive RL)。强化学习的变体包括逆向强化学习、阶层强化学习和部分可观测系统的强化学习。求解强化学习问题所使用的算法可分为策略搜索算法和值函数(value function)算法两类。深度学习可以在强化学习中得到使用,形成深度强化学习 。强化学习理论受到行为主义心理学启发,侧重在线学习并试图在探索-利用(exploration-exploitation)间保持平衡。不同于监督学习和非监督学习,强化学习不要求预先给定任何数据,而是通过接收环境对动作的奖励(反馈)获得学习信息并更新模型参数。强化学习问题在信息论、博弈论、自动控制等领域有得到讨论,被用于解释有限理性条件下的平衡态、设计推荐系统和机器人交互系统 。一些复杂的强化学习算法在一定程度上具备解决复杂问题的通用智能,可以在围棋和电子游戏中达到人类水平。
  • [其他] 浅谈机器学习算法—高斯混合模型 (GMM)
    机器学习算法:高斯混合模型 (GMM) 。它们用于根据概率分布将数据分类为不同的类别。高斯混合模型可用于许多不同的领域,包括金融、营销等等!这里要对高斯混合模型进行介绍以及真实世界的示例、它们的作用以及何时应该使用GMM。        高斯混合模型 (GMM) 是一个概率概念,用于对真实世界的数据集进行建模。GMM是高斯分布的泛化,可用于表示可聚类为多个高斯分布的任何数据集。        高斯混合模型是一种概率模型,它假设所有数据点都是从具有未知参数的高斯分布的混合中生成的。        高斯混合模型可用于聚类,这是将一组数据点分组为聚类的任务。GMM 可用于在数据集中可能没有明确定义的集群中查找集群。此外,GMM 可用于估计新数据点属于每个集群的概率。高斯混合模型对异常值也相对稳健,这意味着即使有一些数据点不能完全适合任何集群,它们仍然可以产生准确的结果。这使得 GMM 成为一种灵活而强大的数据聚类工具。它可以被理解为一个概率模型,其中为每个组假设高斯分布,并且它们具有定义其参数的均值和协方差。        GMM 由两部分组成——均值向量 (μ) 和协方差矩阵 (Σ)。高斯分布被定义为呈钟形曲线的连续概率分布。高斯分布的另一个名称是正态分布。这是高斯混合模型的图片:它可以被理解为一个概率模型,其中为每个组假设高斯分布,并且它们具有定义其参数的均值和协方差。GMM 由两部分组成——均值向量 (μ) 和协方差矩阵 (Σ)。高斯分布被定义为呈钟形曲线的连续概率分布。高斯分布的另一个名称是正态分布。高斯混合模型的图片:        GMM 有许多应用,例如密度估计、聚类和图像分割。对于密度估计,GMM 可用于估计一组数据点的概率密度函数。对于聚类,GMM 可用于将来自相同高斯分布的数据点组合在一起。对于图像分割,GMM 可用于将图像划分为不同的区域。        高斯混合模型可用于各种用例,包括识别客户群、检测欺诈活动和聚类图像。在这些示例中的每一个中,高斯混合模型都能够识别数据中可能不会立即明显的聚类。因此,高斯混合模型是一种强大的数据分析工具,应该考虑用于任何聚类任务。        在高斯混合模型中,期望最大化方法是估计高斯混合模型(GMM)参数的有力工具。期望称为E,最大化称为M。期望用于找到用于表示高斯混合模型的每个分量的高斯参数。最大化被称为 M 并且它涉及确定是否可以添加新数据点,可以从下面链接进一步了解期望最大化。
  • [技术干货] 如何全面掌握图机器学习?最新《图学习》全面综述
    图学习旨在学习现实世界中常见的复杂节点关系和图的拓扑结构,如社交网络、学术网络和电子商务网络等。这些关系使得图数据与传统的表格数据不同,其中节点依赖于非欧氏空间,包含了丰富的信息。图学习从图论发展到图数据挖掘,现在被赋予表示学习的能力,使其在各种场景中取得了出色的性能,甚至包括文本、图像、化学和生物。由于在现实世界中的广泛应用前景,图学习已经成为机器学习中一个热门且有前景的领域。近年来,已有成千上万的研究成果被提出用于解决图学习中的各种问题,引起了学术界越来越多的关注,因此对已有的有价值的研究成果进行综述变得至关重要。尽管一些研究人员已经注意到这种现象,并完成了关于图学习的令人印象深刻的调研。然而,由于图学习的快速扩展,它们未能以更合乎逻辑的方式将相关目标、方法和应用联系起来,并涵盖当前丰富的场景和具有挑战性的问题。1. 引言图学习旨在对图进行建模,图是一种广泛存在于真实场景中的非欧氏数据,与以往机器学习中的数据结构有很大不同,如社交网络[1]、[2]、[3],学术网络[4]、[5]、[6],电子商务网络[7]、[8]、[9],企业知识图谱[10]、[11]、[12]等。挖掘图中节点间复杂连接关系和拓扑结构中蕴含的丰富信息,对于图上的许多任务和应用具有重要意义。此外,传统应用也可以转换为图数据(如计算机视觉[13]、[14]、[15]、语言模型[16]、[17]、[18]、物理[19]、[20]和化学[21]、[22])。重点假设不同实体之间存在许多未直接观察到的潜在联系。这使得图学习不仅是一种处理自然图结构的方法,而且是一种思考各种问题的方式。由于图学习具有广阔的应用前景,因此在国内外引起了广泛的关注。尽管之前关于图的理论工作帮助人们理解图上的各种字符,并提供了基本的分析框架。这些工作通常集中在较小的模拟图上,这限制了它们在真实场景中的应用,特别是当图上存在复杂的关系和结构时。尽管在这一领域已经有了一些显著而详细的调查。目前还缺乏一个综合的、将相关的目标、方法和应用联系起来,形成一个有机的、逻辑的综述。此外,每年在顶级会议上都有数百篇关于图学习的研究,并且数量还在高速增长。由于其发展迅速,缺乏涵盖最新趋势和挑战的全面调研。图2按时间顺序展示了有影响力的图学习方法。这些方法主要分为3类(图挖掘方法、图表示方法和深度图学习方法)。在图学习早期,大多数方法集中于图的字符[1]或利用图的结构信息在小图[25]、[26]上完成一些下游任务。图表示学习目前占据主流地位,可归纳为图嵌入方法和图神经网络方法两大类。这两类方法都旨在学习节点、边或图的语义表示。前者直接优化嵌入,可以减少图结构信息的损失;后者利用深度神经网络,在图上建模信息传递过程。如图3所示,在本综述中,我们从图学习目标的角度提供了一个直观的分类法。根据图的元素(即节点、边和图结构)对以前对图的工作进行排序。基于这种逻辑,综述了图上的相关方法和任务。展示了图学习在现实世界中的各种应用上的出色性能。最后,提出了图学习的发展趋势和挑战,以期进一步推动该领域的研究。本综述的主要贡献总结如下。提供了一个新的分类法,以调查以前关于数据、模型和任务的研究。总结了当前图学习在现实世界中的应用。提出了图学习的当前趋势和挑战。本文的其余部分组织如下。第2节从数据、模型和任务3个角度,基于节点、边和图结构对已有工作进行了直观的分类。第3节展示了用于图学习的主要方法和当前的研究趋势。第四部分总结了该方法在实际中的应用。第5节提出了当今图学习面临的挑战。2 方法在本节中,我们将当前的模型分为两大类(即传统模型和图神经网络)。传统模型可以进一步分为3类(即矩阵分解模型、基于随机游走的模型和基于自编码器的模型)。首先回顾了传统模型,其中一些仍然活跃或与GNN相结合,并给出了当前模型的许多启示。在大多数场景下,与传统模型相比,GNN表现出更高的表达能力和出色的性能。本文将GNN归纳为两个方面。3 应用介绍当前图学习在现实世界中的主要应用,包括传统的机器学习场景,如推荐系统、自然语言处理、计算机视觉和金融科技,以及科学场景中的新兴应用,如化学、生物、物理和数学。最后,总结了图学习中流行的数据集。
  • [技术干货] 使用DQN算法玩“2048”游戏
    实验目标通过本案例的学习和课后作业的练习:了解DQN算法的基本概念了解如何基于DQN训练一个小游戏了解强化学习训练推理游戏的整体流程你也可以将本案例相关的 ipynb 学习笔记分享到 AI Gallery Notebook 版块获得成长值,分享方法请查看此文档。案例内容介绍《2048》是一款单人在线和移动端游戏,由19岁的意大利人Gabriele Cirulli于2014年3月开发。游戏任务是在一个网格上滑动小方块来进行组合,直到形成一个带有有数字2048的方块。该游戏可以上下左右移动方块。如果两个带有相同数字的方块在移动中碰撞,则它们会合并为一个方块,且所带数字变为两者之和。每次移动时,会有一个值为2或者4的新方块出现,所出现的数字都是2的幂。当值为2048的方块出现时,游戏即胜利,该游戏因此得名。(源自维基百科) DQN是强化学习的经典算法之一,最早由DeepMind于2013年发表的论文“Playing Atari with Deep Reinforcement Learning”中提出,属于value based的model free方法,在多种游戏环境中表现稳定且良好。 在本案例中,我们将展示如何基于simple dqn算法,训练一个2048的小游戏。整体流程:安装基础依赖->创建2048环境->构建DQN算法->训练->推理->可视化效果DQN算法的基本结构Deep Q-learning(DQN)是Q-learing和神经网络的结合,利用经验回放来进行强化学习的训练,结构如下:神经网络部分神经网络用来逼近值函数,一般采用全连接层表达特征输入,采用卷积层表达图像输入。其损失函数表达为γ经验折扣率,γ取0,表示只考虑当下,γ取1,表示只考虑未来。经验回放经验回放是指:模型与环境交互得到的(s,a,r,s')会存入一个replay buffer,然后每次从中随机采样出一批样本进行学习。采用该策略的优点如下:减少样本之间的相关性,以近似符合独立同分布的假设;同时增大样本的利用率。探索策略一般采用贪婪探索策略,即agent以ε的概率进行随机探索,其他时间则采取模型计算得到的动作。DQN的整体结构可以简单的表示为:​DQN论文Nature DQN论文Nature DQN在DQN的基础上,采用两个结构一样的网络,一个当前Q网络用来选择动作,更新模型参数,另一个目标Q网络用于计算目标Q值。这样可以减少目标Q值和当前的Q值相关性。2048游戏环境简介2048环境来源于GitHub开源项目,继承于gym基本环境类。玩家可以上下左右移动方块,如果方块数字相同,则合并且所带数字变成两者之和。当值为2048的方块出现时,则获得胜利。结束标志只要出现非法移动,即移动的方向的数字无法合并,则该局结束。相比较于传统的可试验多次更加严格,难度提高。奖励函数奖励值为当前方块和累加最大合成数字最大能合成4096注意事项本案例运行环境为 Pytorch-1.0.0,支持 GPU和CPU 运行,请查看《ModelAtrs JupyterLab 硬件规格使用指南》了解切换硬件规格的方法;如果您是第一次使用 JupyterLab,请查看《ModelAtrs JupyterLab使用指导》了解使用方法;如果您在使用 JupyterLab 过程中碰到报错,请参考《ModelAtrs JupyterLab常见问题解决办法》尝试解决问题。实验步骤1. 程序初始化第1步:安装基础依赖!pip install gym第2步:导入相关的库import sysimport timeimport loggingimport argparseimport itertoolsfrom six import StringIOfrom random import sample, randintimport gymfrom gym import spacesfrom gym.utils import seedingimport numpy as npimport torchimport torch.nn as nnfrom PIL import Image, ImageDraw, ImageFontfrom IPython import displayimport matplotlibimport matplotlib.pyplot as plt2. 训练参数初始化¶本案例设置的 epochs = 3000,可以达到较好的训练效果,GPU下训练耗时约10分钟。CPU下训练较慢,建议调小 epochs 的值,如50,以便快速跑通代码。parser = argparse.ArgumentParser()parser.add_argument("--learning_rate", type=float, default=0.001) # 学习率parser.add_argument("--gamma", type=float, default=0.99) # 经验折扣率parser.add_argument("--epochs", type=int, default=50) # 迭代多少局数parser.add_argument("--buffer_size", type=int, default=10000) # replaybuffer大小parser.add_argument("--batch_size", type=int, default=128) # batchsize大小parser.add_argument("--pre_train_model", type=str, default=None) # 是否加载预训练模型parser.add_argument("--use_nature_dqn", type=bool, default=True) # 是否采用nature dqnparser.add_argument("--target_update_freq", type=int, default=250) # 如果采用nature dqn,target模型更新频率parser.add_argument("--epsilon", type=float, default=0.9) # 探索epsilon取值args, _ = parser.parse_known_args()3. 创建环境2048游戏环境继承于gym.Env,主要几个部分:init函数 定义动作空间、状态空间和游戏基本设置step函数 与环境交互,获取动作并执行,返回状态、奖励、是否结束和补充信息reset函数 一局结束后,重置环境render函数 绘图,可视化环境def pairwise(iterable): "s -> (s0,s1), (s1,s2), (s2, s3), ..." a, b = itertools.tee(iterable) next(b, None) return zip(a, b)class IllegalMove(Exception): passdef stack(flat, layers=16): """Convert an [4, 4] representation into [4, 4, layers] with one layers for each value.""" # representation is what each layer represents representation = 2 ** (np.arange(layers, dtype=int) + 1) # layered is the flat board repeated layers times layered = np.repeat(flat[:, :, np.newaxis], layers, axis=-1) # Now set the values in the board to 1 or zero depending whether they match representation. # Representation is broadcast across a number of axes layered = np.where(layered == representation, 1, 0) return layeredclass Game2048Env(gym.Env): metadata = {'render.modes': ['ansi', 'human', 'rgb_array']} def __init__(self): # Definitions for game. Board must be square. self.size = 4 self.w = self.size self.h = self.size self.squares = self.size * self.size # Maintain own idea of game score, separate from rewards self.score = 0 # Members for gym implementation self.action_space = spaces.Discrete(4) # Suppose that the maximum tile is as if you have powers of 2 across the board. layers = self.squares self.observation_space = spaces.Box(0, 1, (self.w, self.h, layers), dtype=np.int) self.set_illegal_move_reward(-100) self.set_max_tile(None) # Size of square for rendering self.grid_size = 70 # Initialise seed self.seed() # Reset ready for a game self.reset() def seed(self, seed=None): self.np_random, seed = seeding.np_random(seed) return [seed] def set_illegal_move_reward(self, reward): """Define the reward/penalty for performing an illegal move. Also need to update the reward range for this.""" # Guess that the maximum reward is also 2**squares though you'll probably never get that. # (assume that illegal move reward is the lowest value that can be returned self.illegal_move_reward = reward self.reward_range = (self.illegal_move_reward, float(2 ** self.squares)) def set_max_tile(self, max_tile): """Define the maximum tile that will end the game (e.g. 2048). None means no limit. This does not affect the state returned.""" assert max_tile is None or isinstance(max_tile, int) self.max_tile = max_tile # Implement gym interface def step(self, action): """Perform one step of the game. This involves moving and adding a new tile.""" logging.debug("Action {}".format(action)) score = 0 done = None info = { 'illegal_move': False, } try: score = float(self.move(action)) self.score += score assert score <= 2 ** (self.w * self.h) self.add_tile() done = self.isend() reward = float(score) except IllegalMove: logging.debug("Illegal move") info['illegal_move'] = True done = True reward = self.illegal_move_reward # print("Am I done? {}".format(done)) info['highest'] = self.highest() # Return observation (board state), reward, done and info dict return stack(self.Matrix), reward, done, info def reset(self): self.Matrix = np.zeros((self.h, self.w), np.int) self.score = 0 logging.debug("Adding tiles") self.add_tile() self.add_tile() return stack(self.Matrix) def render(self, mode='human'): if mode == 'rgb_array': black = (0, 0, 0) grey = (200, 200, 200) white = (255, 255, 255) tile_colour_map = { 2: (255, 255, 255), 4: (255, 248, 220), 8: (255, 222, 173), 16: (244, 164, 96), 32: (205, 92, 92), 64: (240, 255, 255), 128: (240, 255, 240), 256: (193, 255, 193), 512: (154, 255, 154), 1024: (84, 139, 84), 2048: (139, 69, 19), 4096: (178, 34, 34), } grid_size = self.grid_size # Render with Pillow pil_board = Image.new("RGB", (grid_size * 4, grid_size * 4)) draw = ImageDraw.Draw(pil_board) draw.rectangle([0, 0, 4 * grid_size, 4 * grid_size], grey) fnt = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 30) for y in range(4): for x in range(4): o = self.get(y, x) if o: draw.rectangle([x * grid_size, y * grid_size, (x + 1) * grid_size, (y + 1) * grid_size], tile_colour_map[o]) (text_x_size, text_y_size) = draw.textsize(str(o), font=fnt) draw.text((x * grid_size + (grid_size - text_x_size) // 2, y * grid_size + (grid_size - text_y_size) // 2), str(o), font=fnt, fill=black) assert text_x_size < grid_size assert text_y_size < grid_size return np.asarray(pil_board) outfile = StringIO() if mode == 'ansi' else sys.stdout s = 'Score: {}\n'.format(self.score) s += 'Highest: {}\n'.format(self.highest()) npa = np.array(self.Matrix) grid = npa.reshape((self.size, self.size)) s += "{}\n".format(grid) outfile.write(s) return outfile # Implement 2048 game def add_tile(self): """Add a tile, probably a 2 but maybe a 4""" possible_tiles = np.array([2, 4]) tile_probabilities = np.array([0.9, 0.1]) val = self.np_random.choice(possible_tiles, 1, p=tile_probabilities)[0] empties = self.empties() assert empties.shape[0] empty_idx = self.np_random.choice(empties.shape[0]) empty = empties[empty_idx] logging.debug("Adding %s at %s", val, (empty[0], empty[1])) self.set(empty[0], empty[1], val) def get(self, x, y): """Return the value of one square.""" return self.Matrix[x, y] def set(self, x, y, val): """Set the value of one square.""" self.Matrix[x, y] = val def empties(self): """Return a 2d numpy array with the location of empty squares.""" return np.argwhere(self.Matrix == 0) def highest(self): """Report the highest tile on the board.""" return np.max(self.Matrix) def move(self, direction, trial=False): """Perform one move of the game. Shift things to one side then, combine. directions 0, 1, 2, 3 are up, right, down, left. Returns the score that [would have] got.""" if not trial: if direction == 0: logging.debug("Up") elif direction == 1: logging.debug("Right") elif direction == 2: logging.debug("Down") elif direction == 3: logging.debug("Left") changed = False move_score = 0 dir_div_two = int(direction / 2) dir_mod_two = int(direction % 2) shift_direction = dir_mod_two ^ dir_div_two # 0 for towards up left, 1 for towards bottom right # Construct a range for extracting row/column into a list rx = list(range(self.w)) ry = list(range(self.h)) if dir_mod_two == 0: # Up or down, split into columns for y in range(self.h): old = [self.get(x, y) for x in rx] (new, ms) = self.shift(old, shift_direction) move_score += ms if old != new: changed = True if not trial: for x in rx: self.set(x, y, new[x]) else: # Left or right, split into rows for x in range(self.w): old = [self.get(x, y) for y in ry] (new, ms) = self.shift(old, shift_direction) move_score += ms if old != new: changed = True if not trial: for y in ry: self.set(x, y, new[y]) if changed != True: raise IllegalMove return move_score def combine(self, shifted_row): """Combine same tiles when moving to one side. This function always shifts towards the left. Also count the score of combined tiles.""" move_score = 0 combined_row = [0] * self.size skip = False output_index = 0 for p in pairwise(shifted_row): if skip: skip = False continue combined_row[output_index] = p[0] if p[0] == p[1]: combined_row[output_index] += p[1] move_score += p[0] + p[1] # Skip the next thing in the list. skip = True output_index += 1 if shifted_row and not skip: combined_row[output_index] = shifted_row[-1] return (combined_row, move_score) def shift(self, row, direction): """Shift one row left (direction == 0) or right (direction == 1), combining if required.""" length = len(row) assert length == self.size assert direction == 0 or direction == 1 # Shift all non-zero digits up shifted_row = [i for i in row if i != 0] # Reverse list to handle shifting to the right if direction: shifted_row.reverse() (combined_row, move_score) = self.combine(shifted_row) # Reverse list to handle shifting to the right if direction: combined_row.reverse() assert len(combined_row) == self.size return (combined_row, move_score) def isend(self): """Has the game ended. Game ends if there is a tile equal to the limit or there are no legal moves. If there are empty spaces then there must be legal moves.""" if self.max_tile is not None and self.highest() == self.max_tile: return True for direction in range(4): try: self.move(direction, trial=True) # Not the end if we can do any move return False except IllegalMove: pass return True def get_board(self): """Retrieve the whole board, useful for testing.""" return self.Matrix def set_board(self, new_board): """Retrieve the whole board, useful for testing.""" self.Matrix = new_board4. 定义DQN算法DQN算法分了两部分构造,拟合函数部分-神经网络算法逻辑本身Replay Buffer部分神经网络结构包含三层卷积网络和一层全连接网络,输出维度为动作空间维度。 神经网络部分可自由设计,以训练出更好的效果。class Net(nn.Module): #obs是状态空间输入,available_actions_count为动作输出维度 def __init__(self, obs, available_actions_count): super(Net, self).__init__() self.conv1 = nn.Conv2d(obs, 128, kernel_size=2, stride=1) self.conv2 = nn.Conv2d(128, 64, kernel_size=2, stride=1) self.conv3 = nn.Conv2d(64, 16, kernel_size=2, stride=1) self.fc1 = nn.Linear(16, available_actions_count) self.relu = nn.ReLU(inplace=True) def forward(self, x): x = x.permute(0, 3, 1, 2) x = self.relu(self.conv1(x)) x = self.relu(self.conv2(x)) x = self.relu(self.conv3(x)) x = self.fc1(x.view(x.shape[0], -1)) return xDQN核心逻辑部分class DQN: def __init__(self, args, obs_dim, action_dim): # 是否加载预训练模型 if args.pre_train_model: print("Loading model from: ", args.pre_train_model) self.behaviour_model = torch.load(args.pre_train_model).to(device) # 如果采用Nature DQN,则需要额外定义target_network self.target_model = torch.load(args.pre_train_model).to(device) else: self.behaviour_model = Net(obs_dim, action_dim).to(device) self.target_model = Net(obs_dim, action_dim).to(device) self.optimizer = torch.optim.Adam(self.behaviour_model.parameters(), args.learning_rate) self.criterion = nn.MSELoss() # 动作维度 self.action_dim = action_dim # 统计学习步数 self.learn_step_counter = 0 self.args = args def learn(self, buffer): # 当replaybuffer中存储的数据大于batchsize时,从中随机采样一个batch的数据学习 if buffer.size >= self.args.batch_size: # 更新target_model的参数 if self.learn_step_counter % args.target_update_freq == 0: self.target_model.load_state_dict(self.behaviour_model.state_dict()) self.learn_step_counter += 1 # 从replaybuffer中随机采样一个五元组(当前观测值,动作,下一个观测值,是否一局结束,奖励值) s1, a, s2, done, r = buffer.get_sample(self.args.batch_size) s1 = torch.FloatTensor(s1).to(device) s2 = torch.FloatTensor(s2).to(device) r = torch.FloatTensor(r).to(device) a = torch.LongTensor(a).to(device) if args.use_nature_dqn: q = self.target_model(s2).detach() else: q = self.behaviour_model(s2) # 每个动作的q值=r+gamma*(1-0或1)*q_max target_q = r + torch.FloatTensor(args.gamma * (1 - done)).to(device) * q.max(1)[0] target_q = target_q.view(args.batch_size, 1) eval_q = self.behaviour_model(s1).gather(1, torch.reshape(a, shape=(a.size()[0], -1))) # 计算损失函数 loss = self.criterion(eval_q, target_q) self.optimizer.zero_grad() loss.backward() self.optimizer.step() def get_action(self, state, explore=True): # 判断是否探索,如果探索,则采用贪婪探索策略决定行为 if explore: if np.random.uniform() >= args.epsilon: action = randint(0, self.action_dim - 1) else: # Choose the best action according to the network. q = self.behaviour_model(torch.FloatTensor(state).to(device)) m, index = torch.max(q, 1) action = index.data.cpu().numpy()[0] else: q = self.behaviour_model(torch.FloatTensor(state).to(device)) m, index = torch.max(q, 1) action = index.data.cpu().numpy()[0] return actionreplay buffer数据存储部分class ReplayBuffer: def __init__(self, buffer_size, obs_space): self.s1 = np.zeros(obs_space, dtype=np.float32) self.s2 = np.zeros(obs_space, dtype=np.float32) self.a = np.zeros(buffer_size, dtype=np.int32) self.r = np.zeros(buffer_size, dtype=np.float32) self.done = np.zeros(buffer_size, dtype=np.float32) # replaybuffer大小 self.buffer_size = buffer_size self.size = 0 self.pos = 0 # 不断将数据存储入buffer def add_transition(self, s1, action, s2, done, reward): self.s1[self.pos] = s1 self.a[self.pos] = action if not done: self.s2[self.pos] = s2 self.done[self.pos] = done self.r[self.pos] = reward self.pos = (self.pos + 1) % self.buffer_size self.size = min(self.size + 1, self.buffer_size) # 随机采样一个batchsize def get_sample(self, sample_size): i = sample(range(0, self.size), sample_size) return self.s1[i], self.a[i], self.s2[i], self.done[i], self.r[i]5. 训练模型初始化环境和算法# 初始化环境env = Game2048Env()device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 初始化dqndqn = DQN(args, obs_dim=env.observation_space.shape[2], action_dim=env.action_space.n)# 初始化replay buffermemory = ReplayBuffer(buffer_size=args.buffer_size, obs_space=(args.buffer_size, env.observation_space.shape[0], env.observation_space.shape[1], env.observation_space.shape[2]))开始训练print('\ntraining...')begin_t = time.time()max_reward = 0for i_episode in range(args.epochs): # 每局开始,重置环境 s = env.reset() # 累计奖励值 ep_r = 0 while True: # 计算动作 a = dqn.get_action(np.expand_dims(s, axis=0)) # 执行动作 s_, r, done, info = env.step(a) # 存储信息 memory.add_transition(s, a, s_, done, r) ep_r += r # 学习优化过程 dqn.learn(memory) if done: print('Ep: ', i_episode, '| Ep_r: ', round(ep_r, 2)) if ep_r > max_reward: max_reward = ep_r print("current_max_reward {}".format(max_reward)) # 保存模型 torch.save(dqn.behaviour_model, "2048.pt") break s = s_print("finish! time cost is {}s".format(time.time() - begin_t))6. 使用模型推理游戏¶#加载模型model = torch.load("2048.pt").to(device)model.eval()s = env.reset()img = plt.imshow(env.render(mode='rgb_array'))while True: plt.axis("off") img.set_data(env.render(mode='rgb_array')) display.display(plt.gcf()) display.clear_output(wait=True) s = torch.FloatTensor(np.expand_dims(s, axis=0)).to(device) a = torch.argmax(model(s), dim=1).cpu().numpy()[0] # take action s_, r, done, info = env.step(a) time.sleep(0.1) if done: break s = s_env.close()plt.close()7. 作业请你调整步骤2中的训练参数,重新训练一个模型,使它在游戏中获得更好的表现。
  • [技术干货] 基于PCA的人脸识别
    PCA(主成分分析)PCA(Principal Component Analysis,主成分分析)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。PCA已在人脸识别和图像压缩等领域得到了广泛应用。PCA相关的数学概念•标准差公式为为标准差 在概率统计中最常使用作为统计分布程度上的测量。标准差定义是总体各单位标准值与其平均数离差平方的算术平均数的平方根。它反映组内个体间的离散程度。•标准差在Matlab中的计算如下:•定义一个3*3的矩阵如下•std(a)求矩阵标准差,std(a,0,1)求矩阵列的标准差。Std(a,0,2)求矩阵行的标准差,如果是求整个矩阵的标准差使用std2(a)函数•方差公式为方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。•方差在Matlab中的使用方法如下•V=var(X,flag,dim)•参数解释如下:•X为矩阵或者向量;•flag为权值,当flag等于0时:前置因子是1/(n-1),当flag等于0时:前置因子是1/(n),默认是0;•dim为维数,当dim=1时,表示计算列,当dim=2时,表示计算行,下图为计算行和列的方差的结果。•Matlab中没有直接计算矩阵方差的函数,可以先求得标准差再平方得到•协方差计算公式为协方差在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。•协方差矩阵:在统计学与概率论中,协方差矩阵的每个元素是各个向量元素之间的协方差,是从标量随机变量到高维度随机向量的自然推广。•举个例子,我们将为一个假想的三维数据集建立协方差矩阵,实用3个维度,协方差矩阵将有3行3列如下所示:先初始化两个矩阵a,b•其中,对角线的值是两个向量的方差,斜对角线的是两个向量之间的协方差PCA算法的步骤•设有m条n维数据。•1)将原始数据按列组成n行m列矩阵X•2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值•3)求出协方差矩阵•4)求出协方差矩阵的特征值及对应的特征向量•5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P•6)Y=PX即为降维到k维后的数据•使用PCA的方法将二维数组降到一维•初始化矩阵a,如下图•数组a的每行都已经是零均值,求协方差矩阵如下•再求其特征值和特征向量,如下图即特征值为特征向量为我们所求的P矩阵为•最后我们用P的第一行乘以数据矩阵,就得到了降维后的表示:Y即为最终结果人脸识别的实现•1. 准备一个训练集的人脸图像。本实验选取剑桥大学ORL人脸数据库。一共40个不同的人,每人10张人脸图像,随机选取7张用作训练(取平均后作为一张脸),图像分辨率为112*92.•2. 将原始图像的每一行的像素串联在一起,产生一个具有112*92个元素的列向量,每个图像被视为一个向量。然后,使所有的训练集的图像(一共40张)存储在一个单一的矩阵T中,矩阵的每一列是一个图像。•3. 减去均值向量. 均值向量a要首先计算,并且T中的每一个图像都要减掉均值向量。•4. 计算协方差矩阵S的特征值和特征向量。每一个特征向量的维数与原始图像的一致,因此可以被看作是一个图像。因此这些向量被称作特征脸。•5. 选择主成分。一般选择最大的k个特征值,保留对应的特征向量。6. 对每个训练图像的向量,投影到特征空间后得到一组坐标。对测试图像,也作同样的投影运算,得到坐标,与训练图像的坐标进行二范数最小匹配原始图像灰度图像在计算机中的存储形式为a*b*3的矩阵特征脸及生成特征脸的主要代码得到结果(横坐标为特征维数,纵坐标为准确率)
  • [技术干货] 机器学习真能产生智能决策吗?-转载
     历经三年时间,我们在2022年完成了图灵奖获得者、加州大学洛杉矶分校计算机科学教授,美国国家科学院院士,被誉为“贝叶斯网络之父”的朱迪亚·珀尔大作《因果论:模型、推理和推断》。  这本书原版的第1版写于2000年,开创了因果分析和推断的新思想和新方法,一出版就得到广泛的好评,促进了数据科学、人工智能、机器学习、因果分析等领域新的革命,在学术界产生了很大的影响。  后来又于2009年修订出了第2版,内容上结合当时因果研究的新发展,做了较大的改动。目前我们翻译的这本书英文原版是在2009年出版的,到目前已经有十多年了。  该书中文版的出版有利于广大中国学者、学生和各领域的实践人员了解和掌握因果模型、推理和推断相关的内容。特别是在当前统计学和机器学习流行的时代,如何实现从“数据拟合”到“数据理解”的转变?如何在下一个十年里,从“所有知识都来自数据本身”这一目前占据主流的假设到一个全新的机器学习范式?是否会引发“第二次人工智能革命”?  正如图灵奖授予珀尔时评价他的工作为“人工智能领域的基础性贡献,他提出概率和因果性推理演算法,彻底改变了人工智能最初基于规则和逻辑的方向。” 我们期待这种范式能够为机器学习带来新的技术方向和前进动力,并且最终能够在实际应用中发挥作用。  正如珀尔所说“数据拟合目前牢牢地统治着当前的统计学和机器学习领域,是当今大多数机器学习研究者的主要研究范式,尤其是那些从事连接主义、深度学习和神经网络技术的研究者。” 这种以“数据拟合”为核心的范式在计算机视觉、语音识别和自动驾驶等应用领域取得了令人瞩目的成功。但是,许多数据科学领域的研究人员也已经意识到,从当前实践效果来看,机器学习无法产生智能决策所需的那种理解能力。这些问题包括:稳健性、可迁移性、可解释性等。下面我们来看看例子。   数据统计靠谱吗?  近年来自媒体上的很多人都会觉得自己是统计学家。因为“数据拟合”“所有知识都来自数据本身”为许多重大决策提供了数据统计依据。但是,在进行分析时,我们需要谨慎分析。毕竟,事情可能并不总是乍看之下!一个与我们生活息息相关的案例。10年前,某城市市中心的房价是8000元/平米,共销售了1000万平;高新区是4000元/平米,共销售了100万平;整体来看,该市的平均房价为7636元/平米。现在,市中心10000元/平米,但由于市中心的土地供应少了,只销售了200万平;高新区是6000元/平米,但由于新开发的土地变多了,销售了2000万平;整体来看,现在该市的平均房价为6363元/平米。因此,分区来看房价分别都涨了,但从整体上看,会有产生疑惑:为什么现在的房价反而跌了呢?   图1 房价趋势按照不同区域划分后与总体结论相悖  我们知道这种现象叫作辛普森悖论。这些案例清楚地表明当我们没有给予足够的观察变量时,我们是如何从统计数据中得到了完全错误的模型和结论。就这次新冠大流行而言,我们通常会获得全国范围的统计数据。如果我们按地区或市县进行分组,我们可能会得出截然不同的结论。在全国范围内,我们可以观察到新冠病例数量在下降,尽管某些地区的病例数量会有所增加(这可能预示着下一波浪潮的开始)。如果存在差异很大的群体,例如人口差异很大的地区,则也可能会发生这种情况。在国家数据中,人口密度较低地区的病例激增可能与人口稠密地区的病例下降相形见绌。  类似的基于“数据拟合”的统计问题比比皆是。比如下面两个有趣的例子。  如果我们每年收集尼古拉斯·凯奇每年出演的电影数量和美国溺死人数的数据,我们会发现这两个变量高度相关,数据拟合程度奇高。   图2 尼古拉斯·凯奇每年出演的电影数与美国溺死的人数  如果我们收集每个国家人均牛奶销售量和获得诺贝尔奖人数的数据,我们会发现这两个变量高度相关。   图3 人均牛奶消费量与诺贝尔奖人数  从我们人类的常识认知来说,这些都是伪相关,甚至是悖论。但从数学和概率论的角度来看,表现出伪相关或者悖论的案例无论从数据上还是计算上都是没有问题的。如果有一些因果基础的人都知道,发生这种情况是因为数据中隐藏着所谓的潜伏变量,即未被观察到的混杂因子。   图4 独立变量导致了两个变量之间伪相关  珀尔在《因果论》中给出了解决的范式,详细分析和推导了以上问题,强调了因果与统计之间有着本质的区别,虽然因果分析与推断仍然是建立在统计学的语境上。珀尔提出了干预操作(算子)的基本计算模式,包括后门原则和具体的计算公式,这是当前对于因果关系最为数学化的描述。“因果以及相关的概念(例如随机化、混杂、干预等)不是统计概念”,这是贯穿珀尔因果分析思想的一条基本原理,珀尔称之为第一原理[2]。  那么,目前基于数据驱动的机器学习方法,特别是那些严重依赖于统计学方法的算法,学习到的模型极大可能也会出现半真半假、误导性或者反转性的结果。这是因为这些模型往往是基于观察数据的分布情况进行学习,而非数据生成的机制。   机器学习亟需解决的三个问题  稳健性:随着深度学习方法的流行,计算机视觉、自然语言处理和语音识别等研究大量利用了最先进的深层神经网络结构。但仍然长期存在这样一个事实问题,即在现实世界中,我们采集到数据的分布通常很少是完整的,与实际世界中的分布可能不一致。在计算机视觉应用中,训练集与测试集数据分布可能受到来自诸如像素差、压缩质量,或来自于摄像机位移、旋转或角度等的影响。这些变量其实就是因果概念中的“干预”问题。由此,人们提出了简单的算法来模拟干预,以专门测试分类和识别模型的泛化能力,如空间偏移、模糊、亮度或对比度的变化、背景控制和旋转,以及在多种环境中采集的图像等。到目前为止,尽管我们利用数据增强、预训练、自监督学习等方法在稳健性上取得了一定的进展,但对于如何解决这些问题还没有明确的共识。有人认为这些修正可能是不够的,在独立同分布假设之外进行泛化不仅需要学习变量之间的统计关联,还需要学习潜在的因果模型,以明确数据生成的机制,并允许通过干预概念模拟分布变化。   可迁移性:婴儿对物体的理解基于跟踪随时间变化表现一致的物体,这样的方法可以让婴儿快速学习新的任务,因为他们对物体的知识和直观理解可以重复使用。类似地,能够高效地解决现实世界中的任务需要在新的场景中重用学习到的知识技能。研究已经证明,学习了环境知识的机器学习系统效率更高,通用性更好。如果我们将现实世界模型化,许多模块在不同的任务和环境中表现出相似的行为。因此,面对新环境或新任务,人类或者机器可能只需要调整其内部表示中的几个模块。当学习因果模型时,由于大多数知识(即模块)可以在无须进一步训练的情况下重复使用,从而只需要较少的样本以适应新环境或新任务。  可解释性:可解释性是一个微妙的概念,不能仅仅使用布尔逻辑或统计概率的语言完全描述,它需要额外的干预概念,甚至是反事实的概念。因果关系中的可操纵性定义关注的是这样一个事实,即条件概率(“看到人们打开雨伞表明正在下雨”)无法可靠地预测主动干预的结果(“收起雨伞并不能阻止下雨”)。因果关系被视为推理链的组成部分,它可以为与观察到的分布相去甚远的情况提供预测,甚至可以为纯粹假设的场景提供结论。从这个意义上说,发现因果关系意味着获得可靠的知识,这些知识不受观察到的数据分布和训练任务的限制,从而为可解释的学习提供明确的说明。   因果学习建模的三个层次  具体地说,基于统计模型的机器学习模型只能对相关关系进行建模,而相关关系往往会随着数据分布的变化而变化;而因果模型基于因果关系建模,则抓住了数据生成的本质,反映了数据生成机制的关系,这样的关系更加稳健,具有分布外泛化的能力。比如,在决策理论中,因果关系和统计之间的区别更加清楚。决策理论中有两类问题,一类是已知当前环境,拟采取干预,预测结果。另一类是已知当前环境和结果,反推原因。前者称为求果问题,后者称为溯因问题[3]。  在独立同分布条件下的预测能力  统计模型只是对观察到的现实世界的粗浅描述,因为它们只关注相关关系。对于样本和标签,我们可以通过估计来回答这样的问题:“这张特定的照片中有一只狗的概率是多少?”“已知一些症状,心力衰竭的概率是多少?”。这样的问题是可以通过观察足够多的由所生成的独立同分布数据来回答的。尽管机器学习算法可以把这些事做得很好,但是准确的预测结果对于我们的决策是不够,而因果学习为其提供了一种有益的补充。就前面的例子来说,尼古拉斯·凯奇出演电影的频率和美国溺亡率正相关,我们的确可以训练一个统计学习模型通过尼古拉斯·凯奇出演电影的频率来预测美国溺亡率,但显然这两者并没有什么直接的因果关系。统计模型只有在独立同分布的情况下才是准确的,如果我们做任何的干预来改变数据分布,就会导致统计学习模型出错。  在分布偏移/干预下的预测能力  我们进一步讨论干预问题,它更具挑战性,因为干预(操作)会使我们跳出统计学习中独立同分布的假设。继续用尼古拉斯·凯奇的例子,“今年增加邀请尼古拉斯·凯奇出演电影的数量会增加美国的溺亡率吗?”就是一个干预问题。显然,人为的干预会使得数据分布发生变化,统计学习赖以生存的条件就会被打破,所以它会失效。另一方面,如果我们可以在存在干预的情况下学习一个预测模型,那么这有可能让我们得到一个在现实环境中对分布变化更加稳健的模型。实际上,这里所谓的干预并不是什么新鲜事,很多事情本身就是随时间变化的,例如人的兴趣偏好,或者模型的训练集与测试集本身在分布上就存在不匹配的现象。我们前面已经提到,神经网络的稳健性已经获得了越来越多的关注,成为一个与因果推断紧密连接的研究话题。在分布偏移的情况下预测不能只局限于在测试集上取得高准确率,如果我们希望在实际应用中使用机器学习算法,那么我们必须相信在环境条件改变的情况下,模型的预测结果也是准确的。实际应用中的分布偏移类别可能多种多样,一个模型仅仅在某些测试集上取得好效果,不能代表我们可以在任何情况下都能够信任这个模型,这些测试集可能只是恰好符合这些测试集样本的分布。为了让我们可以在尽可能多的情况下信任预测模型,就必须采用具有回答干预问题能力的模型,至少仅仅使用统计学习模型是不行的。  回答反事实问题的能力  反事实问题涉及推理事情为什么会发生,想象实施不同行为所带来的后果,并由此可以决定采取何种行为来达到期望的结果。回答反事实问题比干预更加困难,但也是对于AI非常关键的挑战。如果一个干预问题是“如果我们现在让一个病人有规律地进行锻炼,那么他心力衰竭的概率会如何变化?”,对应的反事实问题就是“如果这个已经发生心力衰竭的病人一年前就开始锻炼,那他还会得心力衰竭吗?”显然回答这样的反事实问题对于强化学习是很重要的,它们可以通过反思自己的决策,制定反事实假说,再通过实践验证,就像我们的科学研究一样。   因果学习应用  最后,我们来看看如何在各个领域上应用因果学习。2021年诺贝尔经济学奖授予了约书亚·安格里斯特(Joshua D.Angrist)和吉多·因本斯(Guido W.Imbens),表彰“他们对因果关系分析的方法论”贡献。他们研究了因果推断在实证劳动经济学中的应用。诺贝尔经济学奖评选委员认为“自然实验(随机试验或者对照试验)有助于回答重要问题”,但如何“使用观测数据回答因果关系”更具有挑战性。经济学中的重要问题是因果关系问题。如移民如何影响当地人的劳动力市场前景?读研究生能够影响收入增加吗?最低工资对技术工人的就业前景有何影响?这些问题很难回答,因为我们缺乏正确的反事实解释方法。  自从20世纪70年代以来,统计学家就发明了一套计算“反事实”的框架,以揭示两个变量之间的因果效应。经济学家又在此基础上进一步发展了断点回归、双重差分、倾向得分等方法,并且大量地应用在各种经济政策问题的因果性研究上。从6世纪的宗教文本到2021年的因果机器学习,包括因果自然语言处理,我们可以使用机器学习、统计学和计量经济学来模拟因果效应。经济和其他社会科学的分析主要围绕因果效应的估计,即一个特征变量对于结果变量的干预效应。实际上,在大多数情况下,我们感兴趣的事情是所谓的干预效应。干预效应是指干预或者治疗对结果变量的因果影响。比如在经济学中,分析最多的干预效应之一是对企业进行补贴对企业收入的因果影响。为此,鲁宾(Rubin)提出了潜在结果框架(potential outcome framework)。  尽管经济学家和其他社会科学家对因果效应的精确估计能力强于预测能力,但他们对机器学习方法的预测优势也十分感兴趣。例如,精确的样本预测能力或处理大量特征的能力。但正如我们所见到的,经典机器学习模型并非旨在估计因果效应,使用机器学习中现成的预测方法会导致对因果效应的估计存在偏差。那么,我们必须改进现有的机器学习技术,以利用机器学习的优势来持续有效地估计因果效应,这就促使了因果机器学习的诞生!  目前,根据要估计的因果效应类型,因果机器学习可以大致分为两个研究方向。一个重要的方向是改进机器学习方法以用于无偏且一致的平均干预效应估计。该研究领域的模型试图回答以下问题:客户对营销活动的平均反应是什么?价格变化对销售额的平均影响是多少?此外,因果机器学习研究的另一条发展路线是侧重于改进机器学习方法以揭示干预效应的特异性,即识别具有大于或小于平均干预效应的个体亚群。这类模型旨在回答以下问题:哪些客户对营销活动的反应最大?价格变化对销售额的影响如何随着顾客年龄的变化而变化?  除了这些活生生的例子,我们还可以感觉到因果机器学习引起数据科学家兴趣的一个更深刻的原因是模型的泛化能力。具备描述数据之间因果关系的机器学习模型可泛化到新的环境中,但这仍然是目前机器学习的最大挑战之一。  珀尔更深层次地分析这些问题,认为如果机器不会因果推理,我们将永远无法获得达到真正人类水平的人工智能,因为因果关系是我们人类处理和理解周围复杂世界的关键机制。珀尔在《因果论》中文版的序中写到“在下一个十年里,这个框架将与现有的机器学习系统相结合,从而可能引发‘第二次因果革命’。我希望这本书也能使中国读者积极参与到这一场即将到来的革命之中。”  参考文献:  [1] 珀尔. 因果论:模型、推理和推断(原书第2版)[M]. 刘礼,等译. 北京:机械工业出版社,2022.  [2] 刘礼,吴飞,李廉. 因果关系学习的思维取向和概念分析[J]. 中国大学教学,2021(10):35-42.  [3] WANG A G, LIU L, YANG J Y, LI L, Causality Fields in Nonlinear Causal Effect Analysis [J]. Frontiers of Information Technology & Electronic Engineering, 2022,23(8):1277-1286.  推荐阅读:  《因果论:模型、推理和推断(原书第2版)》   作者:[美] 朱迪亚·珀尔(Judea Pearl)  译者:刘礼 杨矫云 廖军 李廉  图灵奖获得者、贝叶斯网络奠基人、美国国家科学院院士、结构因果图的创始人朱迪亚·珀尔因果论代表作  第二次因果革命即将到来?因果推断会是下一个AI热潮吗?本书全面阐述了现代因果关系分析,展示了因果关系如何从一个模糊的概念发展成为一套数学理论,并广泛用于统计学、人工智能、经济学、哲学、认知科学、卫生科学和社会学等领域。本书第1版曾获2001年拉卡托斯奖,作者朱迪亚·珀尔是2011年图灵奖得主。本书的出版将有利于中国的广大学者、学生和各领域研究人员了解和掌握因果模型、推理和推断相关的内容,在相关领域做出优异的成果。 ———————————————— 版权声明:本文为CSDN博主「AI科技大本营」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/127116130 
  • [互动交流] Hello_RPA双击编辑后怎么返回
    Hello_RPA双击编辑后怎么返回
  • [互动交流] studio关闭后出现报错页面
    关闭studio后出现报错页面,但不影响使用,询问出现这个页面有没有什么影响
  • [问题求助] bearpi-hm-micro可以做外接摄像头模块吗
    请问各位大佬,bearpi-hm-micro可以做外接摄像头模块吗?可以后面搞深度学习吗?
  • [其他] 浅谈机器学习必学10 大算法
    1 线性回归线性回归(Linear Regression)可能是最流行的机器学习算法。线性回归就是要找一条直线,并且让这条直线尽可能地拟合散点图中的数据点。它试图通过将直线方程与该数据拟合来表示自变量(x 值)和数值结果(y 值)。然后就可以用这条线来预测未来的值!这种算法最常用的技术是最小二乘法(Least of squares)。这个方法计算出最佳拟合线,以使得与直线上每个数据点的垂直距离最小。总距离是所有数据点的垂直距离(绿线)的平方和。其思想是通过最小化这个平方误差或距离来拟合模型。例如,简单线性回归,它有一个自变量(x 轴)和一个因变量(y 轴)。2 逻辑回归逻辑回归(Logistic regression)与线性回归类似,但它是用于输出为二进制的情况(即,当结果只能有两个可能的值)。对最终输出的预测是一个非线性的 S 型函数,称为 logistic function, g()。这个逻辑函数将中间结果值映射到结果变量 Y,其值范围从 0 到 1。然后,这些值可以解释为 Y 出现的概率。S 型逻辑函数的性质使得逻辑回归更适合用于分类任务。逻辑回归曲线图,显示了通过考试的概率与学习时间的关系。3 决策树决策树(Decision Trees)可用于回归和分类任务。在这一算法中,训练模型通过学习树表示(Tree representation)的决策规则来学习预测目标变量的值。树是由具有相应属性的节点组成的。在每个节点上,我们根据可用的特征询问有关数据的问题。左右分支代表可能的答案。最终节点(即叶节点)对应于一个预测值。每个特征的重要性是通过自顶向下方法确定的。节点越高,其属性就越重要。决定是否在餐厅等候的决策树示例。4 朴素贝叶斯朴素贝叶斯(Naive Bayes)是基于贝叶斯定理。它测量每个类的概率,每个类的条件概率给出 x 的值。这个算法用于分类问题,得到一个二进制“是 / 非”的结果。看看下面的方程式。朴素贝叶斯分类器是一种流行的统计技术,可用于过滤垃圾邮件!5 支持向量机(SVM)支持向量机(Support Vector Machine,SVM)是一种用于分类问题的监督算法。支持向量机试图在数据点之间绘制两条线,它们之间的边距最大。为此,我们将数据项绘制为 n 维空间中的点,其中,n 是输入特征的数量。在此基础上,支持向量机找到一个最优边界,称为超平面(Hyperplane),它通过类标签将可能的输出进行最佳分离。超平面与最近的类点之间的距离称为边距。最优超平面具有最大的边界,可以对点进行分类,从而使最近的数据点与这两个类之间的距离最大化。例如,H1 没有将这两个类分开。但 H2 有,不过只有很小的边距。而 H3 以最大的边距将它们分开了。6 K- 最近邻算法(KNN)K- 最近邻算法(K-Nearest Neighbors,KNN)非常简单。KNN 通过在整个训练集中搜索 K 个最相似的实例,即 K 个邻居,并为所有这些 K 个实例分配一个公共输出变量,来对对象进行分类。K 的选择很关键:较小的值可能会得到大量的噪声和不准确的结果,而较大的值是不可行的。它最常用于分类,但也适用于回归问题。用于评估实例之间相似性的距离可以是欧几里得距离(Euclidean distance)、曼哈顿距离(Manhattan distance)或明氏距离(Minkowski distance)。欧几里得距离是两点之间的普通直线距离。它实际上是点坐标之差平方和的平方根。7 K- 均值K- 均值(K-means)是通过对数据集进行分类来聚类的。例如,这个算法可用于根据购买历史将用户分组。它在数据集中找到 K 个聚类。K- 均值用于无监督学习,因此,我们只需使用训练数据 X,以及我们想要识别的聚类数量 K。该算法根据每个数据点的特征,将每个数据点迭代地分配给 K 个组中的一个组。它为每个 K- 聚类(称为质心)选择 K 个点。基于相似度,将新的数据点添加到具有最近质心的聚类中。这个过程一直持续到质心停止变化为止。8 随机森林随机森林(Random Forest)是一种非常流行的集成机器学习算法。这个算法的基本思想是,许多人的意见要比个人的意见更准确。在随机森林中,我们使用决策树集成(参见决策树)。为了对新对象进行分类,我们从每个决策树中进行投票,并结合结果,然后根据多数投票做出最终决定。在训练过程中,每个决策树都是基于训练集的引导样本来构建的。在分类过程中,输入实例的决定是根据多数投票做出的。9 降维由于我们今天能够捕获的数据量之大,机器学习问题变得更加复杂。这就意味着训练极其缓慢,而且很难找到一个好的解决方案。这一问题,通常被称为“维数灾难”(Curse of dimensionality)。降维(Dimensionality reduction)试图在不丢失最重要信息的情况下,通过将特定的特征组合成更高层次的特征来解决这个问题。主成分分析(Principal Component Analysis,PCA)是最流行的降维技术。主成分分析通过将数据集压缩到低维线或超平面 / 子空间来降低数据集的维数。这尽可能地保留了原始数据的显著特征。可以通过将所有数据点近似到一条直线来实现降维的示例。10 人工神经网络(ANN)人工神经网络(Artificial Neural Networks,ANN)可以处理大型复杂的机器学习任务。神经网络本质上是一组带有权值的边和节点组成的相互连接的层,称为神经元。在输入层和输出层之间,我们可以插入多个隐藏层。人工神经网络使用了两个隐藏层。除此之外,还需要处理深度学习。人工神经网络的工作原理与大脑的结构类似。一组神经元被赋予一个随机权重,以确定神经元如何处理输入数据。通过对输入数据训练神经网络来学习输入和输出之间的关系。在训练阶段,系统可以访问正确的答案。如果网络不能准确识别输入,系统就会调整权重。经过充分的训练后,它将始终如一地识别出正确的模式。每个圆形节点表示一个人工神经元,箭头表示从一个人工神经元的输出到另一个人工神经元的输入的连接。
总条数:5192 到第
上滑加载中