• [其他] 康奈尔Nature论文:一种使用反向传播训练的深度物理神经网络
    深度学习加速器旨在高效地执行深度学习,通常针对推理阶段,并且通常通过利用传统电子设备之外的物理基板。迄今为止的方法一直无法应用反向传播算法来原位训练非常规的新型硬件。反向传播的优势使其成为事实上的大规模神经网络训练方法,因此这一缺陷构成了主要障碍。康奈尔大学的研究人员介绍了一种混合原位-计算机算法,称为物理感知训练,它应用反向传播来训练可控的物理系统。该研究以「Deep physical neural networks trained with backpropagation」为题,于 2022 年 1 月 26 日发布在《Nature》。 深度学习模型已成为科学和工程领域的普遍工具。然而,它们的能源需求现在越来越限制它们的可扩展性。深度学习加速器旨在高效地执行深度学习,通常针对推理阶段,并且通常通过利用传统电子设备之外的物理基板。迄今为止的方法一直无法应用反向传播算法来原位训练非常规的新型硬件。反向传播的优势使其成为事实上的大规模神经网络训练方法,因此这一缺陷构成了主要障碍。 在这里,康奈尔大学的研究人员介绍了一种混合原位-计算机算法,称为物理感知训练,它应用反向传播来训练可控的物理系统。 正如深度学习通过由数学函数层构成的深度神经网络,来实现计算那样,该方法允许研究人员训练由可控物理系统层构成的深度物理神经网络,即使物理层与传统人工神经网络层缺乏任何数学同构。 为了证明该方法的普遍性,研究人员训练了基于光学、力学和电子学的各种物理神经网络,以实验性地执行音频和图像分类任务。物理感知训练将反向传播的可扩展性与原位算法可实现的缺陷和噪声的自动缓解相结合。 物理神经网络具有比传统电子处理器更快、更节能地执行机器学习的潜力,更广泛地说,可以赋予物理系统自动设计的物理功能,例如机器人材料和智能传感器。 该研究以「Deep physical neural networks trained with backpropagation」为题,于 2022 年 1 月 26 日发布在《Nature》。https://www.nature.com/articles/s41586-021-04223-6图示:PNN 简介。(来源:论文)
  • [其他] 时序对齐预测的监督表示学习与少样本序列分类
    论文题目:Temporal Alignment Prediction for Supervised Representation Learning and Few-Shot Sequence Classification作者:苏冰,文继荣;通讯作者:文继荣论文概述:序列距离通过时间对齐处理具有不同长度和局部方差的序列。大多数序列对齐方法通过在预定义的可行对齐约束下解决优化问题来推断最优对齐,这不仅耗时,而且使端到端序列学习变得难以处理。在本文中,我们提出了一种可学习的序列距离,称为时序对齐预测 (TAP)。TAP 采用轻量级卷积神经网络直接预测两个序列之间的最优对齐方式,因此只需要前向计算,推理过程中不涉及优化。TAP 可以应用于不同的基于距离的机器学习任务。对于有监督的序列表示学习,我们展示了用各种度量学习损失训练的 TAP 以更快的推理速度实现了具有竞争力的性能。对于小样本动作分类,我们将 TAP 作为基于度量学习的episode训练范式中的距离度量。这种简单的策略取得了与最先进的小样本动作识别方法接近的结果。https://openreview.net/forum?id=p3DKPQ7uaAi
  • [其他] 基于数据分布生成的可预测概念漂移适应
    基于数据分布生成的可预测概念漂移适应DDG-DA: Data Distribution Generation for Predictable Concept Drift Adaptation论文摘要:在时序数据中,由于环境的不稳定性,数据分布常常会随时间变化且不可预测。这种现象被称为概念漂移,它导致在历史数据上训练的模型在概念漂移后性能下降。为了应对这一问题,前人的工作会检测概念漂移是否发生,然后调整模型以适应最近的数据分布。在很多实际场景中,环境的变化是有规律可预测的,因此可以对概念漂移的未来趋势建模,而不仅让模型适应最近的数据分布。我们提出了一种新方法来预测数据分布未来的变化,然后利用预测的数据分布生成新的训练数据来学习模型以适应概念漂移,最终提升模型性能。我们在股价、电力负荷和日照辐照度三个真实场景预测任务和多个模型上进行了实验验证并得到了显著提升。代码已开源: https://github.com/microsoft/qlib/tree/main/examples/benchmarks_dynamic/DDG-DA论文开创性突破与核心贡献:我们是第一个通过建模数据分布变化来应对可预测概念漂移的方法,并在同类方法中取得了最佳性能。
  • [技术干货] 2022 年值得关注的 8 个人工智能趋势
    1. AI-on-5G2022 年,工业 AI 和 AI-on-5G 物联网应用将会成为主流。想象一下,当我们以元宇宙为目标的时候,我们对物理空间的升级方式同样令人印象深刻。AI-on-5G 组合计算基础设施为传感器、计算平台和人工智能应用的整合提供了一种高性能、安全的链接结构,无论是在现场、场所还是云端中。具体包括:汽车系统;智能空间;工业 4.0,如新的自动化和机器人系统。AI-on-5G 通常与无线环境中的超低延迟、保证服务质量以及提高安全性有关。人工智能和工业物联网解决方案的融合,以及边缘人工智能的发展,使得这一切成为可能,并更容易实现。2. 生成式人工智能生成式人工智能,或评估现有数据(如文本、音频或视觉文件)的算法,主要识别该数据的基本模式,然后复制该模式以生成类似的内容。这种算法正在逐步改进。随着模型的输入数据的变化和业务结果的变化,模型本身也需要调整。缺乏维护会导致人工智能算法最终丧失价值。具体来说,生成式人工智能包括多种技术: 生成对抗网络。生成对抗网络是两个神经网络:一个生成器和一个判别器,它们相互竞争,以找到两个网络之间的平衡。生成器网络负责生成与源数据相似的新数据或内容。判别器网络负责区分源数据和生成的数据,以便识别哪些数据更接近原始数据。Transformer。像 GPT-3、LaMDA 和 Wu-Dao 这样的 Transformer 模拟了认知注意力,并对输入数据部分的重要性进行差异测量。它们被训练来理解语言或图像,学习一些分类任务,并从大量数据集中生成文本或图像。变分自编码器。编码器将输入编码为压缩码,而解码器则从该码中重现初始信息。如果选择和训练正确,这种压缩表示将输入数据分布存储在一个更小的维度表示中。3. 增强的人类和人工智能混合劳动力的到来 虽然工作流管理是工作中的新常态,但未来的工作更多的是在增强的环境中与人工智能配对。所有重复性的工作都是可能实现的,并且将是自动化的。 无论你从事的是人力资源、行政、营销、销售还是工程领域,随着人工智能/机器学习工具的不断增加,你的工作效率也会提高。这也只是未来工作的一个常规部分。 例如,人工智能/机器学习技术在诸如法学和医药等知识领域中得到了广泛的应用,以浏览不断增加的数据量,并为特定任务找到正确的信息。因此,许多白领工作都有很大的提升空间,他们可能会创造出更有成效的工作,使他们能够做自己天生擅长的事情。 在每个行业中,都会涌现出人工智能驱动的智能工具,这些工具可以帮助该行业的个人高效工作。这通常被称为增强型劳动力或人类-人工智能混合工作。4. IT 中的云计算和边缘管理 虽然边缘计算正迅速成为许多企业的必备工具,但部署仍处于早期阶段。云计算和边缘原生业务流程将在 IT 领域占据更多的主导地位,并在商业世界中更加无处不在。 一些人认为人工智能管理将成为 IT 部门的责任。为了应对与可管理性、安全性和规模有关的边缘计算挑战,IT 部门将转向云原生技术。例如,作为容器化微服务的平台,Kubernetes 已经成为大规模管理边缘人工智能应用的主要工具。 那些在云端上使用 Kubernetes 的 IT 部门可以利用他们的经验来构建自己的边缘云原生管理方案。预期将会有更多的第三方和相关的服务被采用。5. 人工智能在网络安全中的应用 现代企业环境中的网络攻击面是巨大的,并且它还在继续快速增长。这意味着,分析和改善一个组织的网络安全态势需要的不仅仅是人类的干预。人工智能在各个领域都有很好的应用前景,而网络安全正是其中的一项重要内容。具体包括: 威胁检测;战斗机器人;端点保护;违约风险保护;服务停机保护。 在网络安全方面,人工智能的作用必须通过自动化来提高。有 69% 的机构相信,人工智能是处理网络攻击的必备条件,但是这一领域在 2022 到 2032 年期间都有升级的需求。6. 更大更好的语言模型 OpenMind 的 GPT-4 将能够做什么?北京智源人工智能研究院(Beijing Academy of Artificial Intelligence,BAAI)是否能跟上步伐?2022 年将回答很多问题,即更大、更好的语言模型将如何能够创造新的工作、新的应用程序和新的商业模式——新型技术创业公司将改变互联网,并在元宇宙中帮助我们组织内容。 更大的人工智能模型也许可以让人工智能完成一些事情,也可以让它学习一些新的可能性。人工智能和机器学习模型需要海量数据,这些模型将继续扩大,并利用更大的数据集来做出越来越准确的决策。 虽然 OpenAI 的大规模生成性预训练 Transformer(GPT)模型的持续发展成为时尚的头条新闻,但 DeepMind、微软研究院以及其他公司的做法也值得关注。围绕着高度进化的大型人工智能语言模型,已经出现了几十家新的初创公司。 2022 年,它将把我们引向何处? 一些分析家认为或透露,GPT-4 可能包含大约 100 万亿个参数,使其比 GPT-3 大 500 倍。我们可以推测,这一发展朝着离创造能够发展语言并进行与人类无异的对话的机器又近了一步。7. 人工智能在元宇宙中的应用 人工智能在元宇宙和虚拟现实中更多的沉浸式工作和社交场景中可能会有哪些应用,并与消费者脑机接口的演变有关?手机最终将如何被颠覆? 元宇宙是一个术语,是指一个环境,更具体地说是一个数字环境,多个用户可以一起工作和游戏。如果我们今天在有愚蠢算法和推荐引擎的平台上游戏,那么明天的人工智能确实会帮助我们在虚拟世界中导航和监控我们未来的工作、社交和约会生活? 新类型的应用程序、更智能的数字代理、深度造假人类(实际上是机器人),所有这些都在互联网的未来等待着我们,似乎是元宇宙产品。8. 人工智能的民主化和可达性——低代码/无代码人工智能 人工智能是否会真正实现民主化?在一个更加自动化的世界里,亿万富翁创造的财富会不会分配给我们其他人?在这个意义上,拯救地球的不是加密技术,而是低代码/无代码人工智能。 在未来,人们无需昂贵的工程师团队,也无需非常专业的技能,就可以开始新的业务。尽管今天对人工智能工程师的需求很高,但是我们可以设想一个完全不同的世界。一个人工智能可以自己编码的世界。人工智能最终将能够修改自己的代码,在 2022 年,我相信我们会在这个方向上取得突破性进展。 今天,组织面临的主要挑战之一是缺乏能够研发出所需要的工具和算法的有经验的人工智能工程师。随着无代码或低代码解决方案的出现,这一挑战可以通过提供简单而直观的界面来解决,这些界面可以用来创建人工智能上的复杂系统。 随着我们加快人工智能在商业中的应用,并升级人工智能流程,随着程序员与人工智能-人类系统的合作,我们通过软件工程来制造产品的方法将会发生根本性的变化,并更容易被所有人接受,从而以更分散的方式分配其部分价值。
  • [其他] 计算机视觉有哪些商业用途​(1)
    01.计算机视觉概论什么是计算机视觉?为什么值得我们花时间去了解?它是怎么工作的?什么样的应用程序有商业价值?今天我们就一起来看看这个问题吧。什么是计算机视觉?计算机视觉指使用计算机自动执行人类视觉系统可以完成的任务。与人眼从外部环境接收光刺激类似,计算机使用数码相机接受这一信息,输入信息在大脑中进行处理,计算机则是使用某一种算法来处理获得的图像。人眼与计算机的眼睛目前的技术已经解决了获取图像不准确的问题,而且在过去的十年中也已经解决了数字图像中的标注工作。在2012年版的ILSVRC(ImageNet大型视觉识别挑战赛)中,来自世界各地的挑战研究小组在1000对象类在其ImageNet数据集中的超过一万张图片进行分类,深度学习在图像分类中也首次获得了第一名。AlexNet [2]深度学习方法(第一作者Alex Krizhevsky)由多伦多大学SuperVision团队提出。他们利用了卷积神经网络(CNN)架构获得亚军!相比之下,Andrej Karpathy训练的图像分类器,获得了5.1%的错误率。2014年的最佳方法GoogLeNet [3],而且Karpathy本人指如果不好好训练的话图像分类器表现要差得多。显然,并非所有人都对大型模式识别有耐心和训练:这是否意味着计算机现在能够像人类一样“看见”?答案当然不是。2015年,研究人员发现,许多先进的计算机视觉模型都容易受到恶意设计的高频模式的攻击,这些模式被称为“对抗性攻击”[4],从而诱骗模型修改其预测而我们却发现不了。.向“熊猫”添加高频“线虫”噪声会诱使网络预测“长臂猿”这是另一个对抗性攻击如何欺骗计算机视觉算法的幽默示例。麻省理工学院的研究人员开发了一种特殊的图案,将它们放在专门设计的玩具乌龟上,以欺骗网络以预测“步枪”。
  • [技术干货] 超越现有指标57.3%,邢波教授、胡志挺教授团队提出统一NLG评价框架
    长期以来,评价机器生成的文本比较困难。近日,CMU邢波(Eric Xing)教授和UCSD胡志挺(Zhiting Hu)教授的团队提出用一种运算符,统一各类生成任务的评价方式,为未来各种新任务、新要求提供了更加统一的指导。实验表明,基于统一框架设计的评价指标,在多个任务上超过了现有指标与人工评分的相似度,现在通过PyPI和GitHub可以直接调用。自然语言生成(NLG)包括机器翻译、摘要生成、机器对话等自然语言处理 (NLP)任务。这些任务虽然都要求生成通顺的文本,但是最终的表达目标往往有很大的区别。比如说,翻译任务需要完整、精确地表达原文的含义;摘要生成需要简洁、准确地体现原文最重要的信息;对话系统则需要与用户进行生动、有用的对答。过去几年间,研究人员在这些任务的建模方面,取得了很大的进步。然而,评价语言生成的结果,却依旧比较困难。人工评价最准确,但是非常昂贵耗时。自动评价则反过来,规模化比较容易,但在如何评价方面比较模糊。传统上的评价方法是比较模型生成的文本与人写的参考文本,但近年的研究表明,随着模型的进步,这样的方法已经越来越难以区分文本的好坏。事实上,在AAAI 2021会议上的DSTC9对话系统比赛中,人工评分已经不再考虑参考文本,而是依靠评分员综合对话历史、知识情景和模型回答,作出评判。同时,实际应用中的部署,也要求对生成模型作出多维度的评价,而这些是传统的单一指标做不到的。比如,2021年百度主办的「千言:面向事实一致性的生成评测比赛」中,除了传统的信息选择指标外,还考察了事实性指标,并为之设计了独立的评价流程。之前提到的DSTC9比赛的各个分赛也分别考察了3-8个不同的维度指标。为了解决如上所述的新需求,相关工作提出了各种各样的评价方法和新指标,但是这些方法往往是针对具体的任务和目标而设计。对于日新月异的各类任务,要评价什么?如何评价?目前还缺乏系统的指导。在这个方向上,CMU(卡耐基梅隆大学)、Petuum Inc.、MBZUAI(穆罕默德·本·扎耶德人工智能大学)和UCSD(加州大学圣迭戈分校)的研究团队提出了一个自然语言生成评价的理论框架,为未来各种新任务和新要求,设计评估流程时,都提供了更加统一的指导。首先,研究人员根据信息从输入到输出的变化方式,把语言生成任务分为三大类,每类任务对输出提出不同的评价需求。通过给新任务归类,就可以对「评价什么」有所启发。其次,他们用一种称为「信息对齐」的运算符统一了所有任务类别的评价方式,从信息对齐的角度出发设计评价指标,可以解决大量的「如何评价」问题。论文中基于信息对齐,统一设计了一系列评价指标,在评价多种任务(摘要生成、风格转换和知识对话)中与人类评分的相似度最高超过现有指标57.30%。论文中设计的评价指标已经上传到Python库,用pip install就可以直接安装。研究人员在GitHub上也公开了代码,并提供了数种训练好的信息对齐模型,欢迎各位同学在研究中调用。论文链接:https://arxiv.org/pdf/2109.06379.pdf代码和API链接:https://github.com/tanyuqian/ctc-gen-evalPython 安装:pip install ctc_score评价什么:语言生成任务的分类根据任务输入(X)和输出(Y)文本中,信息量的关系,研究者认为可以把语言生成任务分为三大类:压缩、转换和创建,分别对应输入大于、等于和小于输出。每一类任务的目标都有区别,也对输出文本提出了各自的要求。我们可以通过对新任务对分类,对「评价什么」有所启发。压缩类任务(Compression)目标:把输入信息中重要的部分,呈现在输出中举例:摘要生成(Summarization)、图像描述(Image Captioning)、结构文本生成(Data-to-Text)和问题生成(Question Generation)评价重点:1)输出信息要完全来自输入;2)输出信息应该是输入中的重要信息转换类任务(Transduction)目标:把输入信息中的某一方面转换,其他保持不变举例:机器翻译(Translation)、文本复述(Paraphrasing)、文本风格迁移(Style Transfer)和文本简化(Language Simplification)评价重点:输出要尽量完整地保留输入的信息创建类任务(Creation)目标:基于输入和外部信息,输出新的信息举例:机器对话(Dialog)、建议生成(Advice Generation)、故事生成(Story Generation)和诗歌生成(Poetry Generation)评价重点:1)输出要充分回应输入;2)输出要正确地使用外部信息这里可以看到,评估的重点取决于任务中输入输出的信息量变化,因此,如果能够测量输入输出信息重合度,就可以评估所有类别的生成任务。如何评价:信息对齐为了测量如上所述的重合度,研究者引入了「信息对齐」这个运算符,这样就统一了所有生成任务的评价方式。信息对齐是说,对于文字A和任何数据B,可以对于A的每个词都算出一个置信度,这个词的信息有没有在B中反映出来。具体的数学形式为如下所示的向量:在实际中,这个数据B不一定要是文字,也可以是任何模态的数据,只要有一个模型(Alignment Model)能算出这个对齐的置信度。A、B、模型和对齐向量的关系如下图所示:下面,研究者展示了如何统一地用信息对齐这个算符,来定义各种语言生成任务的评价指标。用信息对齐统一设计评价指标压缩类任务对于压缩类任务,研究者以摘要生成作为一个例子:转换类任务对于转换类任务,研究者以文本风格迁移为例:创建类任务对于创建类任务,研究者以知识对话为例:现在已经用信息对齐运算符定义了这么多评估指标,下一步来看这个运算符是怎样实现的。信息对齐的三种实现方法研究者把信息对齐当作一个预测问题建模,提出了三种基于预训练模型(Pretrained Language Models)的实现方法,普遍采用自监督学习。模型准确度可以通过与人工标注比较来评价。词向量召回(Embedding Matching)判别模型(Discriminative Model)回归模型(Aggregated Regression)实验结果实验结果表明,研究者的统一设计的评价指标,与人工评分的相似度,超过之前的针对任务特别设计的指标,最高超过现有指标57.30%。另外,研究者发现,对齐模型预测准确度越好,他们的指标就越接近人的评价。超过现有指标最多57.30%对齐模型准确度与人工评分相似度有直接关系研究者的对齐模型普遍使用自监督学习,但使用人工标注训练可以有效提升准确度和以此实现的评价指标。与人工评分的相似度如下图所示:这说明了:只要能够改善对齐预测模型,就能改善一大批评价指标。我们可以把对齐预测作为一个单独的任务,这个任务的进步直接提升评价语言生成的准确度。这项工作开启了可组合(Composable)的文本评价流程。像软件工程一样,研究者表示可以把这个系统分为若干模块,这些模块可以独立地改进、规模化、和诊断,未来期待有更多的探索。
  • [技术干货] GPT-3胡言乱语怎么办?OpenAI:我们重新调教了一下,新版本更「听话」
    虽然 1.3B 的 InstructGPT 在参数量上还不及 GPT-3 的百分之一,但它的表现可比 GPT-3 讨人喜欢多了。给定一些示例作为输入,GPT-3 等大型语言模型可以根据这些「提示(prompt)」去完成一系列自然语言处理任务。然而,它们有时会表现出一些出人意料的行为,如编造事实、生成有偏见或有害的文本,或者根本不遵循用户的指示。比如在下面这个例子中,用户给出的指示是:「用几句话向一个 6 岁的孩子解释一下登月」,GPT-3 的的输出显然是不着边际。 这是因为,GPT-3 被训练成基于互联网文本的大数据集预测下一个单词,而不是安全地执行用户想要它执行的语言任务。换句话说,这些模型的输出与用户的意图并不一致。对于在数百个应用中部署和使用的语言模型来说,避免这些意想不到的行为尤其重要。 通过训练语言模型按照用户的意图行动,OpenAI 在调整语言模型方面取得了新进展。这里的「意图」既有明确的(如遵循指令),也有隐含的(如尊重事实、不带有偏见或恶意等),他们希望改进后的模型是有用的(帮助用户解决他们的问题)、诚实的(不编造信息或误导用户)、无害的(不对人或环境造成身体、心理或社会伤害)。 为了达成这一目标,他们使用了利用人类反馈的强化学习方法(RLHF)对 GPT-3 进行微调,使其遵循广泛的书面指令。这项技术利用人类的偏好作为奖励信号来微调 GPT-3。这一过程让 GPT-3 的行为与特定人群(主要是 OpenAI 的标注者和研究人员)的既定偏好保持一致,而不是更广泛的「人类价值」概念。他们将得到的模型称为 InstructGPT。 在面对同一指令(用几句话向一个 6 岁的孩子解释一下登月)时,InstructGPT 给出了如下的输出结果: 研究者主要通过让标注者对测试集上的模型输出质量进行评分来评估模型,测试集包含来自「held-out」标注者的 prompt,还在一系列公共的 NLP 数据集上进行了自动评估。他们训练了三种尺寸的模型(1.3B、6B 和 175B 参数),所有的模型都使用 GPT-3 架构。其主要发现如下: 1、标注者明显更喜欢 InstructGPT 的输出,而不是 GPT-3。在测试集中,来自 1.3B InstructGPT 模型的输出优于来自 175B GPT-3 的输出,尽管前者的参数量还不到后者的 1/100。 2、与 GPT-3 相比,InstructGPT 输出的真实性有所提高。 3、与 GPT-3 相比,InstructGPT 输出的有害性略有改善,但偏见程度并没有。 4、可以通过修改 RLHF 微调过程来最小化模型在公共 NLP 数据集上的性能倒退。 5、模型可以泛化至「held-out」标注者的偏好,这部分标注者没有参与任何训练数据的生产。 6、公共的 NLP 数据集并不能反映 InstructGPT 语言模型的实际效果。 7、InstructGPT 模型显示出了泛化至 RLHF 微调分布之外的指令的潜力。 8、InstructGPT 仍然会犯一些简单的错误。 所以总的来看,通过人类的反馈进行微调是一个很有前途的方向,可以使语言模型与人类的意图保持一致,但在提高它们的安全性和可靠性方面还有很多工作要做。 方法 为了训练 InstructGPT 模型,研究者采用了人类反馈强化学习方法 ,即使用人类偏好作为奖励信号来微调模型。这一点很重要,因为要解决的安全和一致性问题是复杂的、主观的,并且不能完全被简单的自动度量捕获。 研究者首先用提交到 OpenAI API 的提示(prompt)做了一个人工编写的演示数据集,然后利用这个数据集来训练监督学习基线。接下来,他们又在一个更大的 API 提示集上收集两个模型输出之间的人工标注的对比数据集。然后,他们在这个数据集上训练了一个奖励模型(RM)来预测标注者更偏好的输出。最后,他们使用该 RM 作为奖励函数,并使用 PPO 算法微调他们的 GPT-3 策略以最大化该奖励。 这个过程可以这么理解:它「解锁」了 GPT-3 已经拥有的能力,但仅仅通过 prompt 工程很难激发出这些能力。这是因为,相对于在预训练中学到的能力,训练程序教授模型新能力的水准是有限的,因为它使用的计算量和数据相对于模型预训练只有不到 2%。 这种方法的一个局限性是,它会引入一种叫做「一致性税(alignment tax)」的东西,即如果仅仅让模型与用户任务达成一致,可能会使其在另外一些学术 NLP 任务上的表现更差。这是不可取的,因为如果文章中提到的一致性技术使模型在人们关注的任务上变得表现更糟,那么它们在实践中就不太可能被采用。 研究者发现了一个简单的算法调整方式,能够最大限度上减少这种「一致性税」: 在 RL 微调期间,研究者混合了一小部分用于训练 GPT-3 的原始数据,并使用正常的对数似然最大化在这些数据上进行训练。这大致保持了模型在安全性和人类偏好方面的表现,同时降低了模型在学术 NLP 任务上的性能损失,在有些情况下甚至超过了 GPT-3 基线。 结果 研究者首先通过让标注者将 InstructGPT 的输出与 GPT-3 的输出进行比较,来评估 InstructGPT 遵循用户指令的效果。结果发现,InstructGPT 模型显然更受欢迎。当向 GPT-3 的提示中添加前置信息以使其进入「指令遵循模式」时,这种情况仍然存在:对提交到 API 上 InstructGPT 模型的各种型号 (X 轴) 的模型输出按 1-7 比例 (Y 轴) 进行质量评级。在只有少量提示和没有提示以及模型微调与监督式学习的情况下,labeler 给出的 InstructGPT 输出得分远高于 GPT-3 的输出得分。对于提交到 API 上的 GPT-3 模型的提示,可以找到类似的结果。 为了衡量模型的安全性,研究者使用了一套公开可用数据集上的现有指标。与 GPT-3 相比,InstructGPT 产生的模仿性谎言更少 (TruthfulQA) ,而且毒性更小(RealToxicityPrompts)。研究者还对 API 提示分布进行了人工评估,发现 InstructGPT 编造事实(hallucinates) 的频率较低,并生成了更恰当的输出。评估 InstructGPT 的结果。图中是不同规模模型的结果组合。Toxicity、Hallucination 两个指标上,分数越低越好;TruthfulQA、Appropriateness 两个指标上,分数越高越好。 最后,研究者发现在用户分布中,InstructGPT 的输出优于 FLAN 和 T0 的输出。这表明,用于训练 FLAN 和 T0 的数据大多数是学术性 NLP 任务的,并不能完全代表部署语言模型在实践中的使用情况。 在更广泛的群体中的泛化效果 OpenAI 采取的流程使得该模型表现与标注者的偏好保持一致,标注者直接生成用于训练模型的数据,研究者则通过书面指示、具体例子的直接反馈以及非正式对话为标注者提供指导。此外,模型还受到用户和 API 策略中隐含的偏好的影响。研究者选择了那些在筛选测试中表现良好的标注者,他们在识别和回应敏感的提示方面表现出色。然而,这些对数据产生影响的不同来源并不能保证模型与任何更广泛群体的偏好保持一致。 研究者借助了两个实验来探究这个问题。首先,使用没有提供任何训练数据的 held-out 标注者来评估 GPT-3 和 InstructGPT,并发现这些标注者更喜欢 InstructGPT 模型的输出,其比率与训练数据标注者大致相同。然后,研究者使用来自一部分标注者的数据训练奖励模型,发现它们能很好地预测不同标注者子集的偏好。这表明该模型并没有过拟合训练数据标注者的偏好。然而,研究者还需要做更多的工作来研究这些模型在更广泛的用户群体中的表现,以及在人们对相同输入产生不同预期时模型会如何表现。 局限性 尽管已经取得了重大进展,但当前的 InstructGPT 模型还远远算不上与用户意图完全一致或对用户来说完全安全:它们仍然会产生有害、有偏见的输出,或者编造事实,并在没有明确警示的情况下产生色情、暴力内容。但是,机器学习系统的安全性不仅取决于底层模型的行为,还取决于这些模型的部署方式。OpenAI 表示,为了支持 OpenAI API 的安全性,他们将继续在应用程序上线之前对其进行审查,并提供内容过滤器来检测不安全的输出,监控其滥用情况。 训练模型遵循用户指示还有一个副作用:如果用户指示它们产生不安全的输出,它们可能更容易被误用。因此,研究者要教模型拒绝某些指令。如何可靠地做到这一点将是一个重要的开放性研究问题。 此外,在许多情况下,与标注者的平均偏好保持一致是不可取的。例如,当生成一定程度上影响了少数群体的文本时,该群体的偏好应该得到更多的权重。目前,InstructGPT 接受的是用英语进行指导的训练,因此,它更偏向于讲英语的人的文化价值观。研究者也在逐渐了解标注者偏好之间的差异和分歧,这样就可以根据更具体的人群的价值观来设置模型。一般来说,根据特定人类的价值观调整模型输出会面临社会影响方面的抉择,最终必须建立负责任的、包容性的处理程序来做出这些决定。 上述研究结果表明,这些技术在改善通用 AI 系统与人类意图的一致性方面是非常有效的。然而,这仅仅是个开始。研究者们还将继续推进这些技术,以改进当前和未来的模型,使之朝着对人类更安全、更有用的方向发展。
  • [其他] 浅谈无监督对比学习
    无监督学习领域迎来了巨大发展,源头是对比学习(contrastive learning)[6, 7] 在海量无标注训练样本下的成功应用。假设是一张没有标注的训练样本图像的特征向量,为图像的一个正样本(positive sample)特征,这个正样本往往是对 I 施以某种变换得到的(如 flipping、cropping 操作等), 为一个负样本(negative sample)特征,训练集中其它非 I 的图像均被视为负样本。之后通过对比学习损失函数,如下面的 InfoNCE loss [8] ,进行无监督训练:目标是将正样本从大量负样本中识别出来。无监督训练得到的图像特征表现出了极强的泛化能力,能够为下游任务提供极佳的网络初始化权重,或仅经过少量有标签样本的微调(finetuning),即可获得接近全监督训练性能的图像分类模型。 无监督对比学习的成功也带来了启发,对比学习属于度量学习(metric learning),本质是利用了数据集的整体信息,学习了一个具有极强表达能力的图像表征空间。在图像语义分割的全监督训练条件下,训练图像的每个像素的标签已经给出,我们可以将正样本视为同属于相同语义类别的像素,将负样本视为不属于同一语义类别的像素,而不论它们是否来源于同一个训练图像。之后即可以利用度量学习或对比学习,对传统的交叉熵损失加以改进,进而挖掘所有训练图像中、像素与像素之间的全局语义关系,进而获得一个高度结构化的分割特征空间。由此研究者提出了一个基于像素对比学习的、全监督的、语义分割训练范式,像素对比学习(pixel-wise contrastive learning),强调利用训练数据集的全局上下文信息,从整体的角度对习得的特征空间进行显式约束,使其在全局结构上具备良好的性质(intra-class compactness 和 inter-class dispersion)。
  • [其他] 机器学习分类与回归
    1.机器学习的主要任务:一是将实例数据划分到合适的分类中,即分类问题。 而是是回归, 它主要用于预测数值型数据,典型的回归例子:数据拟合曲线。2.监督学习和无监督学习:分类和回归属于监督学习,之所以称之为监督学习,是因为这类算法必须直到预测什么,即目标变量的分类信息。对于无监督学习,此时数据没有类别信息,也不会给定目标值。在无监督学习中,将数据集合分成由类似的对象组成的多个类的过程被成为聚类;将寻找描述数据统计值的过程称之为密度估计。此外,无监督学习还可以减少数据特征的维度,以便我们可以使用二维或者三维图形更加直观地展示数据信息。3.线性回归和非线性回归  线性回归需要一个线性模型。一个线性的模型意味着模型的每一项要么是一个常数,要么是一个常数和一个预测变量的乘积。一个线性等式等于每一项相加的和。等式:Response = constant + parameter * predictor + ... + parameter * predictor  <=>  Y = b o + b1X1 + b2X2 + ... + bkXk在统计学中,如果一个回归方程是线性的,那么它的参数必须是线性的。但是可以转换预测变量加上平方,来使得模型产生曲线,比如 Y = b o + b1X1 + b2X12这时模型仍然是线性的,虽然预测变量带有平方。当然加上log或者反函数也可以。
  • [其他] AI for Science
    AI for Science人工智能成为科学家的新生产工具,催生科研新范式实验科学和理论科学是数百年来科学界的两大基础范式,而人工智能正在催生新的科研范式。机器学习能够处理多维、多模态的海量数据,解决复杂场景下的科学难题,带领科学探索抵达过去无法触及的新领域。人工智能不仅将加速科研流程,还将帮助发现新的科学规律。预计未来三年,人工智能将在应用科学中得到普遍应用,在部分基础科学中开始成为科学家的生产工具。机器学习帮助数学家发现两大猜想,以及采用机器学习、多尺度建模和高性能计算相结合的方式解决超大规模量子随机电路实时模拟问题,让人们看到了人工智能应用于科学研究,在处理数据、设计新型实验以及创建更高效的计算模型方面的巨大潜力。正在兴起的 AI for Science 有望促进数据驱动和理论推演两大科研范式的深度融合。预计未来几年,AI 将进一步与数学、物理、化学、材料、工程学等不同领域深度结合,在基础科学的进步中发挥更大作用。大小模型协同进化大模型参数竞赛进入冷静期,大小模型将在云边端协同进化超大规模预训练模型是从弱人工智能向通用人工智能的突破性探索,解决了传统深度学习的应用碎片化难题,但性能与能耗提升不成比例的效率问题限制了参数规模继续扩张。人工智能研究将从大模型参数竞赛走向大小模型的协同进化,大模型向边、端的小模型输出模型能力,小模型负责实际的推理与执行,同时小模型再向大模型反馈算法与执行成效,让大模型的能力持续强化,形成有机循环的智能体系。
  • [其他] 下载或读取文件报错,提示超时、无剩余空间
    问题现象训练过程中拷贝数据/代码/模型时出现如下报错。原因分析出现该问题的可能原因如下。:磁盘空间不足分布式作业时,有些节点的docker base size配置未生效,容器内“/”根目录空间未达到50G,只有默认的10GB,导致作业训练失败。实际存储空间足够,却依旧报错“No Space left on device”。同一目录下创建较多文件时,为了加快文件检索速度,内核会创建一个索引表,短时间内创建较多文件时,会导致索引表达到上限,进而报错。原因分析出现该问题的可能原因如下。:磁盘空间不足分布式作业时,有些节点的docker base size配置未生效,容器内“/”根目录空间未达到50G,只有默认的10GB,导致作业训练失败。实际存储空间足够,却依旧报错“No Space left on device”。同一目录下创建较多文件时,为了加快文件检索速度,内核会创建一个索引表,短时间内创建较多文件时,会导致索引表达到上限,进而报错。1. 分目录处理,减少单个目录文件量。 2. 减慢创建文件的速度。 3. 关闭 ext4 文件系统的 dir_index 属性,具体可参考: https://access.redhat.com/solutions/29894,(可能会影响文件检索性能)。 4. 使用 xfs 文件系统(xfs 不在欧拉交付范围,可以使用,但是欧拉不保证商用质量)。
  • [技术干货] 超参数调优河伯、组合优化器CompBO,华为诺亚开源贝叶斯优化库
    贝叶斯优化可以说是一种黑盒优化算法,该算法用于求解表达式未知函数的极值问题。因其具有极强的样本有效性,近年来被广泛使用,研究者只需较少地迭代次数,即可得到一个较好的结果,因此可用于机器学习模型算法调参。 近日,华为诺亚开源了一个新的关于贝叶斯优化的库,该库可用于低维和高维领域的贝叶斯优化,主要包含: 河伯(Heteroscedastic Evolutionary Bayesian Optimization,HEBO):异方差演化贝叶斯优化,可用于超参数调优,华为诺亚凭借该算法赢得 NeurIPS BBO 竞赛冠军;T-LBO:一种将深度度量学习与潜在空间贝叶斯优化相结合以实现高维优化的算法,该算法可以减少 97% 的数据需求;CompBO:使用组合优化器进行贝叶斯优化。项目地址:https://github.com/huawei-noah/HEBO河伯算法是华为诺亚方舟决策与推理(DMnR)实验室开发的贝叶斯优化库。该算法击败了 NVIDIA、IBM、Jetbrain 等,以 93.519 得分赢得了 AI 国际顶会 NeurIPS 2020 的黑盒优化竞赛冠军。 HEBO 是与前 5 名竞争对手之间差异最大的算法,以非常大的优势获胜。下面是比赛结果的截图:完整榜单:https://bbochallenge.com/leaderboard/T-LBO 算法该算法出自论文《High-Dimensional Bayesian Optimisation with Variational Autoencoders and Deep Metric Learning》,全篇 42 页,研究者来自华为诺亚方舟实验室。 论文地址:https://arxiv.org/pdf/2106.03609.pdf 研究者提出了一种基于深度度量学习的方法,以使用变分自编码器(VAE)在高维结构化空间中执行贝叶斯优化。通过扩展监督深度度量学习的想法,他们解决了高维 VAE 贝叶斯优化中长期存在的一个问题,即如何将判别式隐空间作为归纳偏置来执行。重要的是,研究者仅使用以往工作的 1% 的标记数据就实现了这种归纳偏置,显示出了所提方法面向样本的高效性。 在实验中,研究者展示了在真实世界高维黑盒优化问题(包括属性引导的分子生成)上的 SOTA 结果。他们希望,本文展示的结果可以作为实现高效高维贝叶斯优化的指导原则。 利用组合优化器做贝叶斯优化(CompBO)这是一篇发表在机器学习研究杂志 JMLR 2021 上的论文,标题为《Are We Forgetting about Compositional Optimisers in Bayesian Optimisation?》,全篇共 78 页。研究者来自华为英国研发中心。 论文地址:https://www.jmlr.org/papers/volume22/20-1422/20-1422.pdf项目地址 https://github.com/huawei-noah/noah-research/tree/CompBO/BO/HEBO/CompBO贝叶斯优化为全局优化提供了一种面向样本高效的方法。在这个框架内,采集函数(acquisition function)的最大化是决定性能的关键因素。但是,由于采集函数往往是非凸的,因此不容易优化,导致其最大化变得复杂。 华为的这篇论文对最大化采集函数的方法进行了全面的实证研究。此外,通过为流行的采集函数推导出全新但数学上等效的组合形式,研究者将采集函数的最大化任务重新定义为组合优化问题,从而能够从领域大量文献中获益。他们特别强调了 3,958 个单独实验中采集函数最大化组合方法的实证优势,这些实验包括组合优化任务和贝叶斯任务。 鉴于采集函数最大化方法的通用性,研究者认为采用组合优化器有可能在当前贝叶斯优化应用的所有领域内实现性能提升。
  • [技术干货] NeurIPS 2021 | 华为诺亚Oral论文:基于频域的二值神经网络训练方法
    常规符号函数的梯度几乎处处为零,不能用于反向传播。为此,来自华为诺亚方舟实验室等机构的研究者提出一种在频域中估计原始符号函数梯度的新方法。二值神经网络(BNN)将原始全精度权重和激活用符号函数表征成 1-bit。但是由于常规符号函数的梯度几乎处处为零,不能用于反向传播,因此一些研究已经提出尝试使用近似梯度来减轻优化难度。然而,这些近似破坏了实际梯度的主要方向。 基于此,在一篇 NeurIPS 2021 论文中,来自华为诺亚方舟实验室等机构的研究者提出使用傅里叶级数的组合来估计频域中符号函数的梯度以训练 BNN,即频域逼近 (FDA)。所提方法不影响占整体能量大部分的原始符号函数的低频信息,并且将高频系数使用噪声拟合模块 (noise adaptation module) 进行估计以避免大量的计算开销。 论文地址:https://arxiv.org/pdf/2103.00841.pdf 在几个基准数据集和神经架构上的实验表明,使用该方法学习的二值网络实现了 SOTA 准确率。 数日前,在机器之心 2021 NeurIPS MeetUp China 上,论文一作许奕星为参会者解读了该论文。 方法 该研究提出的 FDA 方法,通过利用傅里叶级数 (FS) 来估计频域中的原始符号函数,FS 估计是使用无穷项时符号函数的无损表征。在实际应用中,能量相对较低的高频系数会被忽略,以避免巨大的计算开销,并将符号函数表征为固定数量的不同周期正弦函数的组合。与现有的逼近方法相比,该研究所提出的频域逼近方法不影响原始符号函数的低频域信息,即占用符号函数能量最多的部分。因此,原始符号函数相应梯度的主要方向能够被更准确地保持。 在论文中,该研究对所提方法做了详细的理论表述。 论文中用 f(·)和 f’(·)来表示原始函数及其对应的梯度函数。由于符号函数的梯度是一个无法反向传播的脉冲函数,需要应用进化算法(evolutionary algorithm)等零阶算法来达到最优解,但这是非常低效的。因此该研究提出找到一个代理函数,通过一阶优化算法(如 SGD)依靠实验求解,而理论上具有与符号函数相同的最优解。 已有研究证明,任何周期为 T 的周期信号都可以分解为傅里叶级数的组合: 然后该研究进一步证明了随着 n 的增加,估计值和 s(t)之间的均方误差会逐渐减小,并在 n → ∞ 时收敛到 0。 为了进一步补偿细微的逼近误差,该研究在训练阶段添加了一个噪声适应模块来细化梯度。 实验及结果 为了展示 FDA-BNN 优越的性能,该研究在 CIFAR-10 数据集上进行了评估实验,实验结果如下表所示。 消融实验 为了验证所提方法中每个组件的有效性、噪声适应模块和超参数的影响,该研究进行了一系列的消融实验。 首先,该研究使用 ResNet-20 架构在 CIFAR-10 上实验验证正弦模块和噪声适应模块的效果,结果如下表所示。 从上表的结果看,使用正弦模块可使训练过程受益,将准确率从 84.44% 提高到 85.83%。将正弦模块和噪声自适应模块组合在一起时得到了最佳性能,即 86.20% 的准确率。 为了进一步验证噪声适应模块的用途,研究者将该模块添加到其他梯度逼近方法中,例如 DSQ 和 BNN+,结果如下表所示。 然后该研究评估了不同 η(·) 对噪声适应模块的影响。结果如下表所示,使用 shortcut 时性能更好,并且 shortcut function η(x) = α sin(x) 在实验过程中表现最好。 在 ImageNet 上的实验 该研究进一步在大规模数据集 ImageNet ILSVRC 2012 上进行了实验,使用 ResNet-18 和 AlexNet 进行实验,结果如下表所示。 对于 ResNet-18,FDA-BNN 实现了 60.2% 的 top-1 准确率和 82.3% 的 top-5 的准确率,比基线方法(Bireal-Net + PReLU)高出 1.2% 和 1.0%,并超过所有其他方法。 当以 ReActNet 作为基线方法,并使用该研究所提方法计算符号函数的梯度, FDA-BNN 达到了 66.0% 的 top-1 准确率,86.4% 的 top-5 准确率,比基线方法分别高出 0.5% 和 0.3%。 对于 AlexNet,该研究使用 Dorefa-Net 中的量化方法作为基线方法,FDA-BNN 实现了 46.2% 的 top-1 准确率和 69.7% 的 top-5 准确率,并优于其他 SOTA 方法。
  • [其他] 混合模型简介
    混合模型(hybrid model)是几种不同模型组合而成的一种模型。它允许一个项目能沿着最有效的路径发展。也可定义为由固定效应和随机效应(随机误差除外)两部分组成的统计分析模型。如由几个高斯分布混合起来的模型叫高斯混合模型,几个线性模型混合在一起的模型叫线性混合模型。一般的,被模拟的系统几乎不可能按照一种模式一步一步地进行,会受到很多外界因素的干扰。而混合模型能够适应不同的系统和不同情况的需要而提出一种灵活多样的动态方法。混合模型分为分析、综合、运行和废弃四个阶段,各阶段的重叠为设计员提出了模型选择。    混合模型是一个统计模型,包含fixed effects和random effects两种效应的混合。    在统计学中,混合模型是代表一个大群体中存在子群体的概率模型,不要求被观察的数据集认同个人观察属于哪个子群体. 一般,混合模型符合代表大群体观察结果的概率分布的混合分布. 然而,当有关问题的混合分布关系到大群体到其子群体的起源性质时,混合模型常被用来做统计推断,关于小群体的性质,而没有子群体的认同信息。有些方法实现混合模型的步骤涉及到做子群体认同归属的假设到个人观察结果(或者子群体的权重), 在这种情况下这些步骤可以看着是一类非监督学习或者聚类过程. 并不是所有的推断过程都会涉及这些步骤。混合模型不应该与组合数据的模型混淆, 比如说 数据的一部分的和被约束到一个常数上。固定效应模型    应用前提是假定全部研究结果的方向与效应大小基本相同,即各独立研究的结果趋于一致,一致性检验差异无显著性。因此,固定效应模型用于各独立研究间无差异,或差异较小的研究。固定效应模型指实验结果只想比较每一自变量项之特定类目或类别的差异及其与其他自变项之特定类目或类别间交互效果,而不想依此推论到同一自变项未包含在内的其他类目或类别的实验设计。随机效应模型    随机效应模型是经典的线性模型的一种推广,就是把原来固定的回归系数看作是随机变量,一般都是假设来自正态分布。如果模型里一部分系数是随机的,另外一些是固定的,一般就叫做混合模型。随机效应有压缩的功能,而且可以使模型的自由度df变小。这个简单的结果对高维数据分析的发展起到了至关重要的作用。事实上,随机效应模型就是一个带惩罚项penalty的一个线性模型,引入正态随机效应就等价于增加一个二次惩罚。著名的岭回归ridge regression就是一个二次惩罚,它的提出解决了当设计矩阵不满秩时最小二乘估计LSE无法计算的问题,并提高了预测能力 [3]  。因此,引入随机效应或者二次惩罚就可以处理当参数个数p大于观测个数n的情形,这是在分析高维数据时必须面对的问题。当然,二次惩罚还有一些特点,如:计算简便,能选择相关的predictor,对前面的几个主成分压缩程度较小等。    混合模型的特点是:无论对任何个体和界面,回归系数α和β都相同。如果模型是正确假定的,解释变量与误差项不相关,即cov(X(i,t),ε(i,t))=0,那么无论是N趋于无穷还是T趋于无穷,模型参数的混合最小二乘估计量pooled OLS都是一致估计量。
  • [交流吐槽] 多元线性回归模型选股应用(α策略)
    内容介绍本文重点在于如何利用python收集各类型因子并进行预处理最终用于构建量化选股模型。工具介绍本代码所需要调用的包如下图所示:import pandas as pdimport tushare as tspro = ts.pro_api()import numpy as npimport timeimport mathimport statsmodels.api as smfrom sklearn import preprocessingfrom sklearn.decomposition import PCAimport os这里需要用到的是python中的pandas和statsmodels模块,分别用于数据处理和做多元回归。另外,还需要获取股票和指数的各项数据,这里所用到的是tushare,tushare拥有丰富的数据内容,如股票、基金等行情数据,公司财务理等基本面数据。通过tushare平台赚取一定的积分可以免费获取平台提供的数据。(个人ID:419382)数据获取本段代码展示了如何通过tushare获取相关数据并清洗成为所需因子,共展示了估值因子,成长因子,财务质量因子,杠杆因子,动量反转因子,波动率因子以及beta的构建。其中beta因子是取个股与指数收益率线性回归的回归系数。def get_all_factors(codes_list,date,start,end,one_m_start,beta_start,beta_end):    #获取估值因子    evaluate_factors = pd.DataFrame()    for i in range(len(codes_list)):    #获取给定交易日的指标        df1 = pro.daily_basic(ts_code=codes_list[i],trade_date=date,fields="ts_code,trade_date,pe_ttm,pb,ps_ttm,dv_ttm")        evaluate_factors = evaluate_factors.append(df1)        time.sleep(0.4)        print("第%d支股票估值因子获取成功"%i)    #根据指标计算因子    evaluate_factors["EP"] = 1/evaluate_factors["pe_ttm"]     evaluate_factors["BP"] = 1/evaluate_factors["pb"]    evaluate_factors["SP"] = 1/evaluate_factors["ps_ttm"]    evaluate_factors["DP"] = evaluate_factors["dv_ttm"]    evaluate_factors = evaluate_factors[["ts_code","trade_date","EP","BP","SP","DP"]]        #获取成长因子    growth_factors = pd.DataFrame()    for i in range(len(codes_list)):    #获取给定日期最近的财报        df1 = pro.income(ts_code=codes_list[i],end_date=date,                          fields="ts_code,end_date,revenue,n_income")        df1 = df1.drop_duplicates(subset=["end_date"])    #根据财报计算因子        df1["end_date"] = df1["end_date"].astype("int64")        df1 = df1.iloc[[0,4],:]        revenue = df1["revenue"].tolist()        n_income = df1["n_income"].tolist()        sales_G = revenue[0]/revenue[1] - 1        profit_G = n_income[0]/n_income[1] - 1        df2 = pro.fina_indicator(ts_code=codes_list[i],end_date=date)        df2 = df2.drop_duplicates(subset=["end_date"])        df2["end_date"] = df2["end_date"].astype("int64")        df2 = df2.iloc[[0,4],:]        roe = df2["roe"].tolist()        ROE_G = roe[0]/roe[1] - 1        df3 = pd.DataFrame({"ts_code":codes_list[i],"sales_G":sales_G,"profit_G":profit_G,"ROE_G":ROE_G},index=[20201231])        growth_factors = growth_factors.append(df3)        time.sleep(1.2)        print("第%d支股票成长因子获取成功"%i)    all_factors = evaluate_factors.merge(growth_factors)        #获取财务质量因子    quality_factors = pd.DataFrame()    for i in range(len(codes_list)):    #获取给定日期最近的财报        df1 = pro.fina_indicator(ts_code=codes_list[i],end_date=date)        df1["end_date"] = df1["end_date"].astype("int64")        df1 = df1.iloc[0,:]        df1 = df1[["ts_code","roe","assets_turn"]]        quality_factors = quality_factors.append(df1)        time.sleep(1)        print("第%d支股票财务质量获取成功"%i)    all_factors = all_factors.merge(quality_factors)    #获取杠杆因子    leverage_factors = pd.DataFrame()    for i in range(len(codes_list)):        df1 = pro.fina_indicator(ts_code=codes_list[i],end_date=date)        df1["end_date"] = df1["end_date"].astype("int64")        df1 = df1.iloc[0,:]        df1 = df1[["ts_code","debt_to_assets"]]        leverage_factors = leverage_factors.append(df1)        time.sleep(0.8)        print("第%d支股票杠杆因子获取成功"%i)    all_facotrs = all_factors.merge(leverage_factors)            #获取市值因子    capital_factors = pd.DataFrame()    for i in range(len(codes_list)):        df1 = pro.daily_basic(ts_code=codes_list[i],trade_date=date,fields="ts_code,total_mv")        df1["total_mv"] = df1["total_mv"].apply(lambda x:math.log(x))        capital_factors = capital_factors.append(df1)        time.sleep(0.5)        print("第%d支股票市值因子获取成功"%i)    all_factors = all_facotrs.merge(capital_factors)            #获取动量反转因子    return_factors = pd.DataFrame()    for i in range(len(codes_list)):        df1 = ts.pro_bar(ts_code=codes_list[i], freq='M', adj='hfq')        df1["trade_date"] = df1["trade_date"].astype("int64")        close = df1["close"].tolist()        return_1m = df1["pct_chg"].tolist()[0]        return_3m = close[0]/close[3] - 1        df2 = ts.pro_bar(ts_code=codes_list[i], adj='hfq')        df2["trade_date"] = df2["trade_date"].astype("int64")        df3 = pro.daily_basic(ts_code=codes_list[i],start_date=start,end_date=end,fields="ts_code,trade_date,turnover_rate")        df3["trade_date"] = df3["trade_date"].astype("int64")        df2 = df2[df2["trade_date"]>=start]        w_return_3m = (df2["pct_chg"]*df3["turnover_rate"]).sum()/len(df2)        df_1m_return = df2[df2["trade_date"]>=one_m_start]        df_1m_turnover = df3[df3["trade_date"]>=one_m_start]        w_return_1m = (df_1m_return["pct_chg"]*df_1m_turnover["turnover_rate"]).sum()/len(df_1m_return)                df4 = pd.DataFrame({"ts_code":codes_list[i],                            "return_1m":return_1m,"return_3m":return_3m,"w_return_1m":w_return_1m,"w_return_3m":w_return_3m},index=[0])        return_factors = return_factors.append(df4)        print("第%d支股票动量反转因子获取成功"%i)    all_factors = all_factors.merge(return_factors)                    #获取波动率因子    vol_factors = pd.DataFrame()    for i in range(len(codes_list)):        df1 = ts.pro_bar(ts_code=codes_list[i], adj='hfq')        df1["trade_date"] = df1["trade_date"].astype("int64")        df2 = df1[df1["trade_date"]>=start]        std_1m = df2["pct_chg"].std()        df3 = df1[df1["trade_date"]>=one_m_start]        std_3m = df3["pct_chg"].std()        df4 = pd.DataFrame({"ts_code":codes_list[i],"std_1m":std_1m,"std_3m":std_3m},index=[0])        vol_factors = vol_factors.append(df4)        print("第%d支股票波动率因子获取成功"%i)    all_factors = all_factors.merge(vol_factors)    #获取beta    beta_factors = pd.DataFrame()    rf = 1.03**(1/360) - 1    hs300 = pro.index_daily(ts_code="399300.SZ",start_date=beta_start,end_date=beta_end)    hs300["rm"] = hs300["pct_chg"]/100 - rf    for i in range(len(codes_list)):        df1 = pro.daily(ts_code=codes_list[i],start_date=beta_start,end_date=beta_end)        df1["rp"] = df1["pct_chg"]/100 - rf        df_model = pd.merge(hs300[["trade_date","rm"]],df1[["trade_date","rp"]],on="trade_date")        df_model.index = pd.to_datetime(df1.trade_date)        df_model.sort_index(inplace=True)        model = sm.OLS(df_model["rp"],sm.add_constant(df_model["rm"]))        result = model.fit()        beta = result.params["rm"]        df2 = pd.DataFrame({"ts_code":codes_list[i],"beta":beta},index=[0])        beta_factors = beta_factors.append(df2)        print("第%d支股票beta因子获取成功"%i)    all_factors = all_factors.merge(beta_factors)    #获取换手率因子    turn_factors = pd.DataFrame()    for i in range(len(codes_list)):        df1 = pro.daily_basic(ts_code=codes_list[i],start_date=start,end_date=end,fields="ts_code,trade_date,turnover_rate")        df1["trade_date"] = df1["trade_date"].astype("int64")        turn_3m = df1["turnover_rate"].sum().mean()        df2 = df1[df1["trade_date"]>=one_m_start]        turn_1m = df2["turnover_rate"].sum().mean()        df3 = pd.DataFrame({"ts_code":codes_list[i],"turn_1m":turn_1m,"turn_3m":turn_3m},index=[0])        turn_factors = turn_factors.append(df3)        print("第%d支股票换手率因子获取成功"%i)        time.sleep(0.3)    all_factors = all_factors.merge(turn_factors)        return all_factors    数据预处理本段的数据预处理显示获取个股所属行业,这一部分需要先在网上下载一份上司公司所属中信一级行业的表格(即代码中的“ industry.xlsx ”)。之后再用merge函数合并进数据表中。之后可以利用所属行业进行行业市值中性化处理,其他预处理步骤包括中位数去极值,缺失值处理,标准化和PCA。这里的PCA主要是为了去除多重共线性的影响,不在于筛选因子。#获取标签def get_tag(data,date):    stocks = data["ts_code"].tolist()    rm = pro.index_monthly(ts_code="399300.SZ",trade_date=date).pct_chg.tolist()    return_list=[]    for i in range(len(stocks)):        r = pro.monthly(ts_code=stocks[i], trade_date=date).pct_chg.tolist()        return_list.append(r[0]-rm[0])        print("第%d支股票超额收益计算完成"%i)        time.sleep(0.5)    data["ex_return"] = return_list    return data#获取行业def get_industry(data):    df1 = pd.read_excel(r"industry.xlsx",dtype="object")    df1 = df1.rename(columns={"code":"ts_code"})    ts_codes = data["ts_code"].tolist()    data["ts_code"] = data["ts_code"].apply(lambda x:x[0:6])    data = data.merge(df1,on="ts_code")    data["ts_code"] = ts_codes    return data#数据预处理#中位数去极值def MAD(data,n):    indexes = data.columns.values.tolist()    indexes = indexes[2:len(indexes)-1]    for i in range(len(indexes)):        Dm = data[indexes[i]].quantile(0.5)        Dm1 = ((data[indexes[i]] - Dm).abs()).quantile(0.5)        max_range = Dm + n*Dm1        min_range = Dm - n*Dm1        data[indexes[i]] = np.clip(data[indexes[i]],min_range,max_range)    return data#缺失值处理def Miss_data(data):    indexes = data.columns.values.tolist()    indexes = indexes[2:len(indexes)-1]    for i in range(len(indexes)):        data[indexes[i]] = data.groupby("industry")[indexes[i]].transform(lambda x:x.fillna(x.mean()))    return data#市值行业中性化def Indifference(data):    data2 = data.drop_duplicates(subset=["industry"])    list1 = data2["industry"].tolist()    list2 = data["industry"].tolist()    industry_matrix = pd.DataFrame(columns=list1)    industry_names = industry_matrix.columns.values.tolist()    for each in range(len(industry_names)):        for i in range(len(list2)):            if list2[i] == list1[each]:                list2[i] = 1            else:                list2[i] = 0        industry_matrix[list1[each]] = list2        list2 = data["industry"].tolist()    indexes = data.columns.values.tolist()    indexes = indexes[2:len(indexes)-1]    for i in range(len(indexes)):        model = sm.OLS(data[indexes[i]],sm.add_constant(industry_matrix))        result = model.fit()        data[indexes[i]] = result.resid    return data#标准化def Standardize(data):    indexes = data.columns.values.tolist()    indexes = indexes[2:len(indexes)-1]    data[indexes] = preprocessing.scale(data[indexes])    return data        #主成分分析def PCA_data(data):    indexes = data.columns.values.tolist()    indexes = indexes[2:len(indexes)-1]    pca = PCA(n_components=20)    new_data = pca.fit_transform(data[indexes])    new_data = pd.DataFrame(new_data)    data[indexes] = new_data    return data模型构建到这里之后用于回归模型的数据集就已经构建完成了,利用传统机器学习的步骤,将数据集分为训练集和测试集,训练集为T-2期至T-12期的数据,测试集为T-1期的数据,本模型最终目的是利用T-1期的数据预测T期个股的超额收益率。
总条数:5192 到第
上滑加载中