AWS 上的数据仓库实现
使用 AWS S3、AWS 胶水、DBT 和 AWS 红移的实现
亚历克斯·库利科夫在 Unsplash 上的照片
在过去的帖子中,我一直在谈论数据仓库,它们的基本架构,以及一些可以帮助您构建数据仓库的基本原则。今天,我想向您展示基于几个月前进行的案例研究在 AWS** 上实现数据仓库。**
这个实现使用 AWS S3 作为数据湖(DL)。AWS 粘合为数据目录。以及 AWS 红移和红移谱作为数据仓库(DW)。
注意:如果你不熟悉我在这里使用的一些术语和概念,这篇文章可能会令人困惑。关于这些术语和概念的更多信息,我建议你看一看其他涉及这些主题的帖子。
数据仓库主要概念介绍
towardsdatascience.com](/what-is-a-data-warehouse-basic-architecture-ea2cd12c9bb0) [## 构建数据仓库:基本架构原则
一种简化数据仓库的方法
towardsdatascience.com](/building-a-data-warehouse-basic-architectural-principles-66bd7059ffd0) [## 构建数据仓库管道:基本概念和路线图
提高数据管道可操作性和性能的五个过程
towardsdatascience.com](/building-a-data-warehouse-pipeline-basic-concepts-roadmap-d14032890ab6)
体系结构
该实施中遵循的架构基于 ELT 流程。首先,从数据源中提取数据,然后加载到数据湖中,最后在数据仓库中进行转换。
一个数据仓库体系结构的抽象——作者举例说明
这篇文章中提到的实现是基于几个月前的一个案例研究——更多信息请查看这篇文章。架构看起来是这样的:
自动气象站中的数据仓库架构——作者举例说明
它使用 AWS S3 作为 DL。AWS 粘合为数据目录。而 AWS 的红移和红移谱作为 DW。
此外,它使用 Apache Spark 进行数据提取,使用 Airflow 作为编排器,使用 Metabase 作为 BI 工具。但是,特别是对于这个职位,范围仅限于DL 和 DW 的实施。
数据湖
这个案例研究的第一部分是数据湖。
数据湖是存储来自多个来源的数据的存储库。它允许处理结构化和非结构化数据。
在这个案例研究中,数据湖被用作允许集中所有不同数据源的临时区域。
来自这些来源的数据以其原始格式存储。在将数据加载到数据湖之前,不涉及任何转换过程。所以,可以认为是一个不可改变的集结地。
数据湖架构
数据湖架构可能会根据您的需求而有所不同。在这个案例研究中,使用了一个简单的架构。它由两个区域组成:T4 原始区域和沙盒区域。
如果您正在处理具有复杂格式的数据,例如,,某个创意开发人员决定编写的一些复杂嵌套的 JSON,您可能需要在将数据加载到数据仓库之前对其进行处理。因此,您可能需要实现另一个数据湖区域。这就是 Ben Sharma 在他的书中所说的数据湖精炼区。
但是,现在,我会保持简单。
- 原始区是以原始格式存储数据的地方。然后,通过在 DBT 上运行一些转换过程,将其加载到数据仓库中
- 沙盒区是数据分析师、数据工程师或数据科学家可以做一些疯狂实验的地方
在原始区域中,数据根据其来源和加载日期进行分区,例如,2020 年 9 月 15 日加载的名为“source”的源中的文件存储在/source/2020/09/15 中。
您可以在下图中找到数据湖的建议体系结构的图形表示。
数据湖体系结构——作者制作的插图
这是它在 AWS S3 的实现方式。
数据湖—0 级—作者制作的插图
数据湖—1 级—作者制作的插图
数据湖—2 级—作者制作的插图
数据湖—级别 3 —作者制作的插图
最后,在最后一层,使用 parquet 文件存储数据。我使用了一个开源数据集来举例说明这个案例研究。
数据湖—级别 4 —作者制作的插图
数据目录
现在我们已经将数据存储在数据湖中,我们需要能够使用 SQL 查询数据。因此,我们可以使用 DBT 执行一些数据转换。
我们将使用 AWS Glue 数据目录数据库和爬虫来允许我们在 DL 之上运行 SQL 查询。
第一步是在 AWS Glue 中创建一个数据库。
AWS 胶水数据目录中的数据库—作者制作的插图
然后,可以使用 AWS Glue 爬虫填充数据库。更多信息请看这个帖子。
创建并运行爬虫后的最终结果可能如下所示。
AWS 胶水目录中的一个表格—第一部分—作者制作的插图
AWS 胶水目录中的表格—第二部分—作者制作的插图
现在,我们可以开始工作了。有了数据目录中映射的表,现在我们可以使用 AWS 红移光谱从 DW 中访问它们。因此,我们最终可以在数据仓库中具体化数据。
数据仓库
如前所述,DW 是使用 AWS 红移、红移光谱和 DBT 构建的。
AWS 红移是 AWS 提供的数据仓库服务。红移光谱 是一项服务,可以在红移集群内部使用,直接从亚马逊 S3 上的文件中查询数据。并且, DBT 是一个允许您使用 SQL 在数据仓库内部执行转换的工具。
DW 的关键组件之一是红移光谱,因为它允许您将粘合数据目录与红移联系起来。因此,您可以使用 DBT 查询红移星团中的 DL 数据。这很重要,因为 DBT 不会移动数据。它只是转换数据仓库中的数据。
将红移光谱与之前在 AWS 粘合目录中映射的数据连接起来的方法是通过在外部模式中创建外部表。更多信息见本。
这样做之后,外部模式应该如下所示:
而且,如果您使用的是我在本案例研究中使用的相同的数据集,您的元数据应该是这样的:
在 DBeaver 中可视化的源表—作者制作的插图
数据实体化
在用红移光谱映射数据之后,我们可以继续进行 AWS 红移中的数据具体化。
这种具体化允许您将数据放入红移表中。一个关键的区别是,当您查询红移表中的数据时,您不需要为查询付费,因为您已经为红移集群付费了。而如果你查询外部表中的数据,即红移光谱,你将按查询中处理的数据收费。更多信息见本。
另一个关键区别是 AWS 红移在处理海量数据时表现优于红移频谱。更多信息见本。
因此,如果我们想对前面给出的表进行一些转换,我们可以编写一个 DBT 模型,并用红移来具体化数据。
这是本案例研究的一个简单的 DBT 模型:
DBT 模型——作者创作的插图
这就是这个模型在红移表中的样子。
红移表——作者制作的插图
结论
在本文中,我们为 AWS 中的数据湖和数据仓库实现了一个简单的架构。
此外,我们还讨论了这样做所必需的一些关键步骤。一些要点如下:
- 该架构遵循 ELT 方法。因此,在将数据加载到数据湖之前,不涉及任何转换过程
- 数据湖被用作不可变的暂存区,用于将数据直接加载到数据仓库中
- 数据湖由两个区域组成:原始区域和沙盒区域。如果您需要在加载到数据仓库之前处理数据,您应该为数据湖设置另一个区域:精化区域
- 数据湖中的分区应该根据您的用例来定义
- AWS 红移光谱是一项服务,可以在红移集群中直接从亚马逊 S3 上的文件中查询数据。这是对 AWS 红移的额外服务
- AWS 红移光谱允许你连接胶水数据目录与红移
- 转换逻辑使用 DBT 模型
- DBT 不移动数据。它只是转换数据仓库中的数据
我希望这些信息对你有用。
感谢阅读到最后。
下期帖子再见!
如果您想随时更新我的作品, 请加入我的 简讯 !偶尔,我会和我的读者分享一些东西。如果你加入我会很感激的:)
我已经写了几篇关于它的文章。这就是如何阅读它们!
ajhenaor.medium.com](https://ajhenaor.medium.com/interested-in-data-warehousing-424b49ec97e4)
数据集是一种世界观
关于主观数据,为什么数据集应该过期,以及数据破坏。
这是 2019 年 9 月在国会图书馆发表的一次演讲的略微扩展版本。
数据集是一种世界观
我叫汉娜·戴维斯,是一名研究艺术家、生殖音乐家和从事机器学习的数据科学家。我的大部分工作都是围绕情感数据、算法组合和数据集创建的想法。
我的一个更大的项目是一个叫做 TransProse 的算法,它通过编程将书籍翻译成音乐。它的工作原理是找到潜在的情感内容,并利用这些内容创作出具有相同情感基调的音乐作品。
http://musicfromtext.com/
为了做到这一点,我使用了几种资源,包括本质上是一个带有各种情绪标签的单词数据集。
在深入研究这个数据集之前,我花了很长时间研究它,当我这样做的时候,我发现了这个:
“分娩”这个词被认为是完全不带感情色彩的。
我对此很感兴趣。这是怎么发生的?给这个贴标签的人是谁?我可以想到一个场景来检查任何一种情绪,但不能选择任何一种情绪。
我没有得到那些答案,但我确实了解到每个单词只被三个人标记过。这在数据集创建中很常见,因为标注很快就变得昂贵——甚至每个词三个人就可以变成数千美元。
但是因为一个机器学习模型从它的输入数据中学习它的世界的边界,只有三个人告知任何使用该数据集的模型将如何解释“分娩”是否是情绪化的。
这引出了一个贯穿我所有作品的观点:数据集就是世界观。它包含了搜集和收集数据的人的世界观,无论他们是研究人员、艺术家还是公司。它包含了贴标签者的世界观,无论他们是手动地、不知不觉地给数据贴标签,还是通过像 Mechanical Turk 这样的第三方服务贴标签,这本身就带有人口统计学偏见。它包括组织者创造的固有分类法的世界观,在许多情况下,组织者是其动机与高质量生活直接不相容的公司。
数据集应该过期
除了创建者的特定偏见,数据集还编码了创建时的一般文化价值观。过时的社会世界观是某些迪士尼电影被锁在地下室的原因——因为我们的社会已经改变和发展,这些电影中的思想(即种族主义和厌恶女性的思想)不再合适。
数据集不会发生这种过期。以 2008 年创建的 Wild 数据集中标记的人脸为例。这是第一批不受约束的面部识别数据集之一,由从互联网上搜集的 13,000 张主要是名人的图像组成。但是由于时间的原因,只有 3 个人占了这个数据的 7%,这意味着是可概括的:乔治·布什,科林·鲍威尔和托尼·布莱尔。
这种历史偏见存在于各种题材中。巨大而令人惊叹的数据集 ImageNet 于 2009 年创建,至今仍在使用,它改变了整个机器学习领域。如果您在原始数据集中搜索“手机”,它会返回一系列翻盖手机,因为这是在智能手机普及之前。
机器学习数据集被视为客观的。它们被机器学习算法和创造者视为基础真理。数据集的制作困难、耗时且昂贵,因此数据集一旦创建,通常会使用很长时间。但是,当我们作为一个社会向前发展时,没有理由坚持过去的价值观;同样,也没有理由让未来社会受制于我们当前的状况。我们的 **数据集可以也应该有截止日期。**考虑特朗普政府将收集的数据类型及其标注方式;我们有什么理由希望这能告诉我们的未来吗?
“人工智能做到了”
这些问题中有许多是更广泛的分类和分类学中的问题。但这对于机器学习来说更重要也更可怕,原因有两个:首先,机器学习数据集影响现实世界中投入生产的模型——通常很快,没有任何检查——并对我们的日常生活产生重大而直接的影响。它们影响着一切,从我们的搜索结果到工作前景,再到信用评分,这些都是无形的,没有责任,没有上诉程序,也没有补救选项。
第二:机器学习研究人员、记者、政府、企业和其他相关方一直将人工智能作为一个黑匣子,完全无法解释,最重要的是,对自己负责。这使得所有这些偏见和世界观的问题都可以被认为是“只是人工智能”对于那些利用机器学习进行伤害的人来说,这是一个非常方便的叙述。
主观数据
为了解决这些问题,我提倡的一个想法是“主观数据”这意味着接受数据集有世界观这一事实,并明确该世界观包含什么。这也意味着有机会做得更好——创造我们自己的理想或实验性的世界观,并超越我们被迫继承的世界观。我们可以用数据和标签创建一个数据集,来模拟一个理想的或更健康的社会,而不仅仅是反映它的现状。我们可以创建独特的和实验性的分类法和标签,并把有害的排除在外。我们可以让数据集积极支持那些为更美好的未来而战的人,而不是成为战斗途中的另一个障碍。
这已经发生在机器学习艺术领域(见下文),但我相信它也与其他领域相关;我相信我们在数据集上的影响力比我们想象的要大。我们应该考虑如何尽可能地包含细微差别——例如,通过腾出空间来包含每一条输入数据,而不是截断它以适应几个类别。我们应该优先考虑那些让我们远离单一世界观的实践。我们不应该让人们独特的生活环境被算法平均值所评判,从而导致现实世界的后果。我们应该考虑是谁的世界观在强加给我们。
数据破坏
我想以一个可能会让我们所有关心数据和归档的人感到不安的提示来结束这篇文章,但在这个时代,思考这个问题是很重要的:故意破坏数据的想法。你们中的许多人已经知道这个故事了,但是雷内·卡米利是一个早期的例子;第二次世界大战期间,他是一名秘密的法国抵抗战士,在法国维希的纳粹统治下管理国家统计局。他负责将纳粹人口普查数据转换成穿孔卡片,他决定删除第 11 列,即表示宗教的那一列。他拯救了许多人的生命,仅仅是因为他决定不收集关于他们的某些数据。
在当今时代,我们围绕数据做出决策的重要性是相似的。关于一个人的种族、性别、心理健康、移民身份和其他分类的数据很可能会被用于伤害,而现在还没有。对于那些与此相关的人来说,提前与你的团队(或你自己)讨论并决定你将在哪个点采取行动是很重要的,这样你就能够在那一刻到来时识别并采取行动。
在错误的手里,或者甚至在完全善意但欠考虑的手里,归类为暴力。如果没有对这个想法与您自己的机器学习工作的关系进行严格的思考,很容易通过收集和标记数据这样看似简单的事情意外地造成伤害。
许多例子中的几个!)使用和/或探索主观数据集的机器学习艺术项目:
笑屋,孙燕姿和汉娜·戴维斯
分类. 01 ,咪咪欧诺哈
女权主义数据集,卡罗琳·辛德斯
动物分类器,Shinseungback Kimyonghun
丝芙兰提及“哭泣”的评论数据集,康妮·叶
这就是问题、解决方案、过去和未来
Kaggle 上有 170 万篇 ArXiv 文章的数据集
所有科学家的伟大资源。
“arXiv 是一项免费分发服务,是 170 万篇学术文章的开放存取档案,涉及物理、数学、计算机科学、定量生物学、定量金融学、统计学、电气工程和系统科学以及经济学等领域”,正如其编辑所说。ArXiv 是知识的金矿。你挖掘得越多,你学到的有价值的信息就越多。这也使得跟踪科学趋势变得更加容易。
如果您对数据科学领域感兴趣,您可能已经阅读过关于 arXiv 的文章。如果你还没有这样做,你应该这样做。由于数据科学仍然是一个不断发展的领域,每天都有新的论文发表,带来新的增强。这使得像 arXiv 这样的平台更有价值。
arXiv 已经将其整个语料库作为一个数据集放在 Kaggle 上。该数据集包含 arXiv 上 170 万篇学术文章的相关特征,如文章标题、作者、类别、内容(包括摘要和全文)和引用。
这个数据集是进行机器学习和深度学习应用的惊人资源。可以完成的一些应用有:
- 自然语言处理(NLP)和理解(NLU)用例
- 利用文章内容进行深度学习的文本生成
- 预测分析,如文章的类别预测
- 不同科学领域的主题趋势分析
- 论文推荐引擎
深度学习模型需要大量数据。随着计算和处理的进步,模型可以吸收比以往更多的数据。如此庞大的科学文本数据集对于自然语言处理、NLU 和文本生成来说是非常有价值的原材料。我们甚至可以有一个模型来写一些主题的学术文章。OpenAI 的新文本生成器 GPT-3 让我们超越极限地思考。因此,我认为拥有一个深度学习模型来写科学并不太遥远。
arXiv 执行董事埃莉诺拉·普雷萨尼表示,“通过提供 Kaggle 上的数据集,我们超越了人类通过阅读所有这些文章所能学到的东西,我们以机器可读的格式向公众提供 arXiv 背后的数据和信息”。我完全同意她关于学习机会的观点。将所有这些文章作为一个数据集可以超越通过阅读来学习。通过数据分析和机器学习,可以从这个文章金矿中发现大量有价值的见解。例如,不同技术之间的一些不太明显的联系可以被点亮。
将整个 arXiv 文章转换成一个结构良好、组织有序的数据集有可能加速科学发现。科学是在自身的基础上成长和进步的。当我们能够专注于改进轮子时,就没有必要重新发明轮子。通过分析这个 arXiv 数据集,我们可以获得科学发展的简明摘要,并阐明我们未来需要关注的问题。
这个数据集有太多的工作要做。我强烈建议你至少看一看。你不必创建一个机器学习产品,但它也将是练习数据分析和处理技能的有用资源。
感谢您的阅读。如果您有任何反馈,请告诉我。
参考文献
- 【https://www.kaggle.com/Cornell-University/arxiv? select = arxiv-metadata-OAI-snapshot . JSON
- https://blogs . Cornell . edu/arxiv/2020/08/05/levelling-machine-learning-to-fuel-new-discoveries-with-the-arxiv-dataset/
用格拉克描述的一天
Graphbits:一堆关于图形的 5 分钟文章
Grakn 模式
先说超图!长话短说,超图可以有同时连接两个以上节点的边。所以一定有超图模型的数据库对吧?是的,有,而且是Grakn……这就是这篇文章(以及其他一些文章)将要讨论的内容。
Grakn
Grakn 被称为“智能数据库”,它允许您通过扩展实体关系方法(主要用于 SQL 数据库)来为不同领域建模知识库。由自动推理引擎驱动,它能够在大型数据集上执行逻辑推理。Grakn 有自己的声明式查询语言 Graql,同时也有自己的可视化工具Grakn 工作库。(稍后将详细介绍)
说得够多了…让我们言归正传。
Grakn 模式
在将任何数据加载到数据库之前,应该创建一个模式。
可以将模式视为数据库的蓝图,它为您提供了一个关于如何构建数据的清晰思路。
请注意!模式设计是创建数据库的第一步,也是最关键的一步。几乎所有其他操作都取决于模式的定义方式。
让我们用一个例子创建一个简单的模式。
考虑这个场景
Whatsville 市在新年前夕举办了一场 Gina Goodvoice 的音乐会,该市期待着来自邻近城市的游客激增。鲍比是其中之一。想要探索这个城市,博比决定提前到达。那天早上,他从 WhoTown 乘火车到达 Whatsville,和他的朋友 Tim 在附近的一家咖啡馆共进早餐。然后他决定去参观城市博物馆,并顺便买了一本书。午餐,他从食品车买了一个三明治,在湖边坐了一会儿。傍晚时分,他前往将举行音乐会的城市体育场。他在音乐会上玩得很开心,听着 Gina Goodvoice 的曲子。音乐会一直持续到深夜,之后,博比乘最后一班火车回家。
为什么我跑题这么多?原因很简单。
想象一下鲍比的世界。或者说,鲍比的一天。他遇到了一些人;他去过的地方;他买的东西等等。只是一整天发生的一系列事件。现在,我们要在同一天在格拉克做这个模型。
要创建模式,首先需要确定实体、属性、关系和角色。以下是对它们的简要描述
- 实体独立存在。它们是实际存在的东西。
- 关系通常代表实体之间某种形式的联系。
- 实体或关系的特征可以使用属性指定。
- 最后,在任何关系中,实体(或属性)总是扮演某种角色
迷茫?在我们的例子中,让我们来识别每一个。
可以称为实体的东西有哪些?一个简单的方法是识别人、地点和事物(如果有动物的话,还有动物)
所以我们有博比、蒂姆、吉娜·古德沃斯、Whatsville、WhoTown、博比乘坐的火车、他吃早餐的咖啡馆、举行音乐会的体育场、他买的三明治等等。那里!我们有基本的实体:人、地点和事物。
这些实体的特征是什么?所以一个人可以有一个名字和一个年龄,比如。一个城市(或任何地方)可以有一个名字,一个母国家/州,一个纬度,一个经度等等来标识它。同样,一个事物也可以有一个名称和其他某些特征。这些都可以成为你的属性。
接下来,如果你仔细想想,是什么把所有这些实体联系在一起?一个一个事件。
Gina Goodvoice 的演唱会是一个联系 Bobby,Tim,Gina 的活动,在新年前夕在体育场举行。那是一个事件,是你的图式中连接一个人、一个地方和一件事物的关系。
此外,一个人在事件中扮演参与者的角色,地点扮演事件地点的角色。在那里,我们为关系中的实体分配角色。
一直到代码
好了,是时候开始敲打了。我们将创建之前为 Grakn 定义的模式。
但是首先!安装:
确保您已经安装了 Grakn 服务器和工作库。如果没有,那就在这里绕道再回来。
创建模式
该模式可以在带有“.”的文件中定义。 gql 扩展。
模式定义总是以关键字“ define ”开始。
接下来,我们定义实体。所以我们有一个人、地点和事物作为我们的实体。此外,我们可以定义实体的属性和角色。
比如一个人有一个属性名,在一个事件中扮演参与者的角色。
- 关键字**“sub”用于指定一个实体、关系或属性**。
- 实体或关系的属性使用“**has”**关键字定义。
- 使用关键字**“plays”定义角色**。
定义实体
接下来,我们需要定义模式中提到的所有属性。定义每个属性时,必须指定属性的数据类型。这可以使用“数据类型”关键字来完成。
定义属性
最后,说到人际关系。关系定义类似于实体定义。关系可以有属性,甚至可以扮演角色。
定义中使用了关键字“ relates ”来指定关系连接哪些角色。一个关系可以连接属性、实体甚至关系!
例如,事件关系与角色“ eventParticipant ”和“ eventLocation ”相关,这两个角色分别由实体 person 和 Location 扮演。
(注意,关系可以连接角色,而不是实体)
定义关系
既然我们已经定义了模式。我们需要把它载入 Grakn。
将模式加载到 Grakn 中
前往您的终端并启动 Grakn 服务器:
grakn server start
现在使用以下命令加载模式:
grakn console -k grakn_example -f schema.gql
这里的 -k 自变量代表“键槽”。请将密钥空间视为数据库的名称。而这里的 -f 则是模式文件的文件路径。
最终检查
如果您得到如下输出
Successful commit: schema.gql
那么这意味着您的模式已经加载。现在您可以前往 Grakn Workbase 并查看您的模式。它看起来应该有点像这样:
Grakn 模式:(黄色箭头将告诉您每个形状的含义)
解读模式图的简单方法
搞定了。下一步是将数据加载到数据库中。这本身就值得一整篇文章。所以我只能说敬请期待!祝阅读愉快!
链接到以前的博客:
Graphbits:一堆 5 分钟的文章:都是关于图形的
towardsdatascience.com](/the-graph-epiphany-4050e96ddcf6) [## 图形模型
Graphbits:一堆关于图形的 5 分钟文章
towardsdatascience.com](/the-graph-models-656a0005aa21)
大数据工程师的一天
为巴黎的一家广告技术巨头工作
*事实:*我处理大约 200 PB 的数据
根据 Gizmodo :
1 PB 相当于 2000 万个四屉文件柜,里面装满了文本或大约 13 年的高清电视视频。
50 PB 是人类有史以来所有语言的全部书面作品
这是我们的数据中心的样子。来自 Pexels 的曼纽尔·盖辛格的照片
我在早上 7 点醒来
我给自己冲了第一杯咖啡。滚动浏览科技新闻,我启用了电子邮件通知。你不应该在开始工作前打开电子邮件,但是我们的数据随时可能发生任何事情,我们必须随时了解情况。
我大约在早上 8:30 到达办公室
还没有人在这里,因为我是空地上最早的鸟儿之一。安顿下来后,我看了看我们的数据监控工具:资源消耗图、存储条形图、异常警报。如果数据有问题,我必须检查一下。一些数据可能会丢失或具有不寻常的值。有时数据交易崩溃,我们最终没有数据。万一发生那些不好的事情,我需要第二杯咖啡。
斯蒂芬·道森在 Unsplash 拍摄的照片
接下来,我检查我们的数据调度器。我们每天摄入数百万亿字节。我们不能手工处理从一个管道到另一个管道的所有数据。我们需要数据调度程序,通过它我们可以执行查询,在数据库之间复制数据,最重要的是,为这些命令设置一个计时器。调度器是数据管道的重要组成部分,数据量超过了人工处理的能力。我们所有的数据调度程序都是内部的,因为我们工程师喜欢手工制作。
AN EXAMPLE INSTRUCTION FOR A SCHEDULER[**1\. Create table if not exists**](#)
- Schema:
+ Column 1: name + data type
+ Column 2: name + data type
- Storage format: text
- Table name: Table A[**2\. SQL query**](#)
INSERT INTO Table A
SELECT Column 1, Column 2
FROM Table B
WHERE $CONDITIONS[**3\. Frequency = Daily**](#)
我每天早上 10:30 和队友开每日例会。我们互相告诉对方前一天我们做了什么,那天我们要做什么,以及是否有什么阻碍了我们。我们尽量说得简洁,以节省每个人的时间,因为我们讨厌冗长的会议。我发现这些紧凑的聚会很有帮助,因为它保持了每个团队成员之间最少的互动。
我通过做一些代码审查回到我的日常任务中。你的编程在融入生产之前需要经过同行的评判。他们可以批准、拒绝或调整你的一些工作。我意识到,不亲自和某人交谈,很难评估他们的代码。我通常选择来到他们的办公桌前,确保我们达成共识。你不想成为一个 【批准荡妇】——一个总是不审核队友工作就批准他们工作的工程师。用你希望自己的代码被评估的方式来评估他们的代码。
凯文·Ku 在 Unsplash 上拍摄的照片
中午,我的团队在公司食堂一起吃午饭。我们聊生活、工作、技术问题。每个人都可以开诚布公地讨论任何事情。我们的午休时间不长,很快我们就聚在厨房里喝另一杯咖啡——这是我的第三杯咖啡。
大约下午 2 点左右我又开始了我的软件开发工作。我们数据工程师仍然使用与数据相关的软件。我读取 SQL 查询,在 Hadoop 生态系统中运行测试,验证修改是否不会给存储带来太大压力,最后提交更改。开发可能会因为各种原因而停滞不前:代码无法编译,生产和测试环境不匹配,查询中的拼写错误。我重新倒了一杯咖啡。我数不清了。
下午晚些时候,我通常会接到执行产品发布的要求。我们希望更新表格,刷新查询,或者启动一个全新的管道。在一家专注于工程的公司工作,我很高兴看到我们自动化了每一个软件程序。我只需要按下一些按钮,让脚本处理整个事情。如果一切顺利,我们将有一个新版本的数据系统开始运行。
下午 6 点,该收工了。我确保数据调度程序仍按预期运行,监控仪表板中没有警告,没有人抱怨数据丢失或不正确。我们与世界各地的员工合作,所以我不会对半夜收到错误信息感到惊讶。现在,一切似乎都很好,所以我拿起我的电脑和我的同事说再见。
关闭所有与工作相关的通知后,我通过阅读非技术书籍来享受一天的最后一刻,从而结束大数据工程师典型的一天。
旧金山数据科学家的一天
数据科学家通常在工作中会做些什么?
我在办公桌前的一张有点尴尬的照片
有抱负的数据科学家经常问我两个问题:
- 数据科学家实际上是做什么的?
- 对于数据科学家来说,典型的一天是怎样的?
这些都不是特别容易回答的问题,因为我遇到的每个数据科学家都是不同的。他们喜欢的工作方式反映了这些差异。
此前,我在一家硅谷医疗保健初创公司担任了两年的数据科学家。在这篇文章中,我将特别关注那段经历,让你了解在旧金山做一名数据科学家是什么感觉。那段时间,我是一名医疗保健数据科学家。该公司正在处理一个大型健康保险索赔数据集(数十亿行数据),以帮助人们做出更明智的医疗保健决策。数据科学团队正在创建数据集,用于我们网站上面向用户的产品。
我希望有抱负的数据科学家会发现这个故事很有用,可以让他们更好地了解数据科学家的实际工作。在整个故事中,我还将强调许多我认为对于在初创公司成为一名成功的数据科学家很重要的技能。
典型的一天是怎样的?
作为一名数据科学家,有些日子很突出:
- 开始一个新项目
- 推出数据产品
- 参加会议
- 截止日期紧迫的一天
- 新的数据科学团队成员开始工作的那一天
然而,在这两者之间有许多日子遵循着相似的模式,至少对我来说是这样。
这些日子里,我正在进行一个项目,或者可能是几个项目,我需要继续工作。通常,全天会召开会议,与项目负责人和数据科学团队的其他成员进行交流。
我制作了一张我每天时间表的信息图
早上 7:00 开始我的一天
我是一个早起的人,所以我通常在 7 点左右起床。我会冲个澡,穿好衣服,在早上 7:30 左右离开家。
当我住在旧金山时,我在米申湾巨人体育场附近有一套公寓。我真的很喜欢那个地方,因为它就在水边。它比旧金山的市区干净得多,闻起来也不像尿。办公室在金融区,离轮渡大楼不远。所以大多数时候我喜欢走路去上班。
上午 8:30 一天的第一项任务
当我到达办公室时,通常是早上 8:30 左右。通常有几个其他人已经在那里了,但我几乎总是数据科学团队的第一个人。我的大多数队友都不是早起者,但是我在早上更有效率。
公司允许我们有灵活的工作时间,只要我们参加任何需要我们参加的会议。我的许多同事会在上午 10 点左右进入办公室,然后加班完成工作。我喜欢我们被信任以最适合我们的方式完成任务。
当我打开电脑时,我通常会做的第一件事是检查我整夜运行的代码。我们有一个机器集群,可以用于我们共享的数据科学工作。我们中的许多人会等到晚上才运行计算密集型工作。这样我们就不会让更多的实验性代码在白天运行缓慢。
同时进行两三个项目是我的惯例。这样我就可以进行多任务处理,而不会在等待代码运行时陷入困境。我们必须等待分析完成的时间从几分钟到几天不等,但最常见的是几个小时。如果我改为线性工作,我将不得不花费大量时间闲荡拇指和等待。
https://imgs.xkcd.com/comics/compiling.png
如果我的通宵工作产生了结果,我通常会观察它,看看它是否合理。之后,我会去给自己泡一杯茶,从办公室里的健康零食中抓一些早餐。我从来不喝咖啡,这让我的许多同事很反感😆
一般来说,到那个时候,其他团队的一些人应该已经到了,我经常喜欢在他们喝咖啡的时候和他们聊他们的项目。这种非正式的交流对于了解其他团队的进展和他们正在积极进行的项目非常有帮助。
然后,我会把早餐和茶放在办公桌上,同时检查是否有新的空闲时间或电子邮件需要我立即开始工作或回复。如果没有什么紧急的事情,我会打开一天的工作准备开始。
每日站立
当我完成所有的晨间仪式时,通常是起立的时候了。站立会议是敏捷框架的一部分。对我们来说,他们包括简短的日常会议,数据科学团队会站成一圈,告诉小组我们前一天在做什么,我们当天计划做什么,以及我们是否有任何障碍。
有时,我们的站立会议将与其他工程团队结合在一起,特别是当我们一起工作来完成一个项目时。例如,当我们将要发布一个新的数据产品,它将成为网站上的一个功能时,我们需要与产品工程和数据工程团队密切协调,以使其顺利进行,没有延迟。
早上的工作
在站立会议之后,我通常会有一段时间可以投入到我当时正在做的事情中。我发现,如果我不在一天中划出大量的时间,人们会一直和我安排会议。这不利于我完成工作,因为我有时发现我需要相当多的时间来让我的头脑进入正确的流程,以便在特别具有挑战性的任务上取得进展。
在那段时间,我也经常戴上我的降噪耳机。耳机可以向你周围的人传递一个信息,那就是你正在集中注意力,不想被打扰。这可能看起来有点粗鲁,但我发现这很有帮助,因为人们知道什么时候可以打断你,什么时候你不希望他们打断你。即使它更多的是一个潜意识的信息。我们工作的办公室是开放式的,每个团队都有很多桌子,所以如果不小心的话,很容易被谈话分散注意力。
因为我是一个早起的人,我会一直计划在这段时间里处理最具挑战性的工作。我总觉得我在午饭前就完成了大部分工作,之后我的效率就大大降低了。所以我想充分利用我的大脑处于最佳工作状态的时间。
在此期间,我主要是写代码。我花了大量时间将数据转换成运行更复杂分析所需的格式。实际上,构建模型并对它们进行查询占用了我的一些时间,但是到目前为止,我工作中最耗时的部分是准备好数据。
幸运的是,我们有优秀的数据工程师,他们为我们的数据提供了高效的 ETL 管道。他们负责维护管道。然而,我们拥有的数据集包含数十亿行,因此找到我们需要的子集并对其进行操作以便运行算法仍然是一项耗时的工作。
因此,当人们说数据科学家的大部分时间都花在数据清理上时,我发现这是真的。尽管由于我们的数据工程师的巨大努力,我们的数据集已经相对干净,但总是有一些特定的方面需要修改。例如,我经常需要将多个诊断列合并成一个,然后为每个唯一值创建一个新的二进制变量。
在我们的办公室,我们有曲柄办公桌,让我们可以坐着或站着。一般来说,我会在早上精力最充沛、腿还不累的时候努力站起来。我发现这种练习对我的背部和颈部非常有益。符合人体工程学的工作站对于长时间使用电脑的人来说非常重要。如果你在工作时照顾好自己的身体,你可以有更长的数据科学家生涯。
午饭时间
一天中我最喜欢的时间之一总是午餐时间。我们有可爱的餐饮,全公司都会分享。我们会坐在长桌旁一起吃饭。我曾经有过的一些最好、最有趣的对话都是在午餐时间进行的。
我的许多同事来自技术和软件工程之外的不同背景。我发现听到他们在工作之外做些什么以及他们在过去的职业生涯中做了些什么非常有趣。我的一些同事甚至在业余时间创办了一本科技杂志。与如此有趣的人一起工作是一次有益的经历。
我们会在午餐时间谈论各种话题。我记得有一次关于未被发现的人的特别有趣的对话。我们都非常专注于这次谈话,以至于我们决定放一部关于它的纪录片,让全公司的人在我们的会议大屏幕上观看。
午餐时间是让我的大脑从思考工作中休息一下的好时机。当我不积极思考问题的时候,我经常会有很好的想法来解决问题。因此,我真的很高兴我们没有在办公桌前吃饭,并在午餐时间继续工作。
每周一次,我们会在午餐时间听取公司人员或特邀演讲者的报告。人们会展示他们一直在做的事情,或者他们提出的与我们正在做的工作相关的想法。我认为这是一次很好的实践,因为它让我接触到了其他团队正在使用的不同技术和技巧,否则我永远也不会知道。
当我们必须在会议上展示我们的作品时,这也是一个很好的练习。我认为首先在友好的观众面前测试演示总是一个好主意。
会议,会议和更多的会议
我会尽量把大部分会议安排在午饭后。这样我一天中就有了第二大块时间来做我的项目。
我们试图将会议减少到最低限度,但会议蠕变是一个真实的事情。然而,有时他们有必要让每个人都在同一页上,特别是当一个项目跨几个团队运行时。会议的数量有时确实开始增加。我会召开的会议类型包括:
- 与我的主管进行一对一会谈(每周一次)
- 与首席执行官一对一会谈(大约每季度一次)
- 项目启动会议(在项目开始时召开一次)
- 项目进度会议(根据项目需要,通常每周一次)
- 项目后评审(在项目结束时)
- 医疗审查会议(每个项目一次)
- 统计评审会议(每个项目一次)
- 数据科学团队会议(每周)
在这些会议中,我经常需要向不同的利益相关者交流我的分析方法或结果。我认为这对于任何数据科学家来说都是一项非常重要的技能。宣传你的项目,同时承认局限性并准确传达你的发现是很难做好的。然而,这可能是项目成功或失败的区别。
只要有可能,我会边走边谈。我发现走出办公室,在新鲜的空气中让我的血液循环起来是令人振奋的。我还认为,当人们不害怕被偷听时,他们可以更加开放。
我们很幸运,在我们位于金融区的办公地点附近,有许多可爱的地方可以步行。附近有一个公园,有时我们会去那里,在阳光下举行会议。或者再远一点是轮渡大楼,那里经常有市场和街头艺人。能够欣赏旧金山美丽的风景和声音真是太好了。
采访未来的数据科学家
在我的一天中,我经常会有面试潜在数据科学团队雇员的任务。我对何时安排面试没有多少发言权,因为面试必须与多个其他团队成员协调。
我喜欢采访。对我来说非常重要的一点是,在数据科学团队中,我们每个人都有发言权。即使我们没有雇用候选人,我通常会发现面试是一个非常积极的经历。我喜欢认识新的人,听他们讲述他们过去做过的项目。
只要有可能,我会向候选人提供反馈。我知道当我面试我的第一个数据科学职位时,我发现这是非常宝贵的。
参加面试小组非常有趣。我在公司工作期间,我们根据资历聘用了全方位的数据科学家。我们雇佣了非常早期的职业数据分析师,还雇佣了数据科学团队的新负责人。在雇佣我未来的老板时,我当然非常关注。我非常幸运地接触到了很多将数据科学作为职业的不同思考方式。
下午的工作
和早上一样,我会尽我所能在下午获得一大块不受打扰的时间。整个下午,我经常在办公室四处走动,在沙发上工作,或者在会议室工作,甚至在午餐区工作。
我有时发现,如果我不在座位上,我会少被打扰。风景的改变有时也会给我新的灵感来解决我正在处理的任何问题。
一天快结束的时候
接近下班时间时,我常常对我的工作感到非常沮丧,尤其是如果那天工作给我带来麻烦的话。有时我会在离开前和同事聊天,听取汇报,减压。这是我工作过程中的一个重要部分。这是一种非正式的获得反馈的方式,也许是一种用不同的方式看待问题的建议,这是我可能没有想到的。
对我来说,数据科学一直是一个非常协作的过程,尽管大多数实际工作都是你一个人完成的。尽管我们通常会为不同的团队成员准备不同的项目,但我总觉得整个数据科学团队都对我们完成的每个项目做出了贡献。即使只是充当一个传声筒或提供建设性的批评。
下午 5:30 左右,我会结束一天的工作,下班后可能会和朋友去喝一杯。我通常是当天最先离开的人之一,因为我也是最先到达的人之一。我从不担心比别人早离开,因为我们总是被鼓励要平衡工作和生活。
为一家真正重视员工的初创公司工作,而不是把他们嚼碎再吐出来,这种感觉真好。我听说过许多其他科技公司以这种方式利用员工的可怕故事,我非常感激那不是我的经历。
结论
我希望您已经发现了这个故事的信息,它让您对数据科学工作中可能涉及的不同类型的事情有了更好的了解。正如我所说的,我的经验绝不是普遍的,但它可以让您深入了解数据科学家除了进行数据分析和设计数据项目之外的一些职责。
除了数据,我的另一个爱好是绘画。你可以在 www.katemarielewis.com 找到我的野生动物艺术
我用来自学数据科学的 4 个工具没有花一美元
towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3) [## 在开始任何数据科学项目之前,你应该问自己的 7 个问题
如何成为一名负责任的数据大师
towardsdatascience.com](/7-questions-you-should-ask-yourself-before-starting-any-data-science-project-51c29093c641)
营销分析实习生的一天
实习/营销分析
营销分析的日常观察
“营销分析的日常工作到底是什么样的?”。作为达拉斯-沃斯堡地区一家公司的营销自动化和分析实习生,我的暑期实习已经过半。我有很多同事问我这到底是什么样的,因为他们中的许多人取消了实习或转向了在线形式。
我在这次实习中获得的技能令人惊叹!然而,我事先做了很多研究,老实说,我没有找到太多关于日常运营中营销分析的信息。我喜欢和我的同龄人谈论我的经历,然而,我想把我的经历放在一个平台上,让更多对它感兴趣的人可以亲眼看到,并展示从我一天的开始到结束是什么样子的。所以,让我们准备好醒来吧!
免责声明:我不是全职营销分析专家,我只是简单地转述我的所见所闻。这并不意味着教你所有营销分析中使用的技巧和工具,因为我还在学习。如需了解此信息,请查看 走向数据科学 。如果你对营销分析实习生或初级职位感兴趣,请继续阅读!
早上 6:15:起床,准备好
我通常会在工作日之前的早上 6:15 左右醒来。这给了我大约一个小时的时间来阅读其他优秀作家的中型文章,并给了我一些小的、可管理的学习内容!除了我们都做的基本的早晨例行公事之外,我还泡了一杯咖啡,因为这是一个需要你在一天的大部分时间里进行批判性思考的角色,我保证你会在某个时候累的!喝了些咖啡后,我换好衣服,收拾好行李,去上班了!
上午 7:45:通过大门和清晨活动
我走进门,找到我的办公桌,准备开始一天的工作!这是我在一天开始时做的几件事:
- 查看来自不同利益相关者和团队成员的电子邮件
- 查看我当天的日历,留意即将到来的会议和电话
- 检查我的团队研究项目的调查结果
- 花些时间向终身市场分析师学习
在新冠肺炎,电子邮件和视频通话现在是主要的沟通方式,即使是在办公室里。我们被要求戴上口罩,保持社交距离,但如果可能的话,我们也会尽最大努力坚持使用电子邮件和视频通话。在这个夏天,实习生们会有两个主要的项目,一个是团队项目,你可以针对高管团队给你的问题提出一个解决方案,另一个是你自己做一个项目,然后提交给你的部门,在我的案例中,这个部门就是市场部。我也总是试着花一些时间和市场分析师在一起,看他解决问题,以及他是如何解决问题的。
上午 9:00:Python 和分析实践
在我为一天做好准备后,我通常会花一些时间练习我的 Python 和分析技能,将它们应用到营销分析师给我的数据集。这不是针对客户或利益相关者的,而是巩固我那天早上从营销分析师那里学到的东西的一种方式。我可能会使用 sklearn 构建一个线性回归模型,尝试使用 Pandas 提高我的数据清理效率,或者使用 matplotlib 创建快速可视化。我注意到的是,你如何完成工作并不重要。在我的左边屏幕打开 Stack Overflow,在我的右边打开 Jupyter 笔记本,这是完全可以接受的。我发现分析师总是在做许多不同的项目,知道如何在你的代码中变得高效是你在实习或初级职位中需要改进的技能。
上午 10:00:实习生活动
通常在上午,所有的实习生将通过一个 Zoom 电话会议,或者一个允许社交距离的非常大的会议室见面,并听取公司内部不同的发言者。这些演讲者通常是副总裁或高级副总裁,他们将讲述自己的经历,提供建议,并留出提问时间。对于一个入门级的职位,一天的下一部分通常会在这个时候开始!
上午 11 点:项目工作
午饭前我要做的最后一件事是开始做我的项目。这是我珍惜的时间,因为我发现分析师有很多会议和其他业务要参加,当你坐下来分析你喜欢的项目时,这是一天中非常平静的一部分!今天这段时间,我开始使用 CRISP-DM 方法为我的部门演示整理项目计划。我研究了我的项目如何对组织有价值,我将如何与营销分析师合作从我们的自动化工具中提取数据,以及确保我按时完成项目的时间表。
中午 12:30:午餐!
我们赶上吃午饭了!我在这篇文章中包括了这一部分,因为午餐是一天中唯一可以休息的时间。作为一名营销分析实习生节奏非常快,因为我们在学习、倾听,同时也在做自己的项目。午餐也是在轻松的环境中与其他实习生见面的好时机。这个项目中的许多实习生变得很亲密,因为我们真的在午餐时间建立了关系!
下午 1:30:与实习生项目团队接触
当我吃完午饭回来时,有时我会做项目,但大多数时候,我会和我的实习生项目组的一个或多个成员接触。今天,我们完成了准备好调查数据供我分析的最后步骤。我们还讨论了我们希望如何展示我们的数据,我们一眼就发现了哪些有趣的东西,以及我们如何交流我们发现的数据。
下午 2:30:其他项目工作
我要做的下一件事是花更多的时间在我的个人项目上。在这个阶段,我花更多的时间在项目的后期,而不是早期。我尽量把上午的时间花在计划和执行前期任务上,比如提取和清理数据,把下午的时间花在后期任务上,比如分析和记录我的工作。我这样做是因为我个人在早上有更多的精力,可以在更长的时间里做更高层次的思考任务,比如计划和清洁,而不是在下午。作为一名实习生,我还将帮助完成营销自动化团队需要完成的任何其他浮动任务。这可能是任何事情,从拉基本报告,修复电子邮件活动,或采取一些工作,从营销分析师,让他们可以喘口气。
下午 3:30:营销自动化会议
营销自动化通常会在傍晚开会,所以这是我们召开战略或分析会议的时候。今天,我们开会讨论了活跃率非常低的用户,以及我们如何进一步吸引他们,让他们与我们的内容互动。我们通常会让营销自动化经理、营销分析师、营销策略师和我一起讨论解决问题的方法。
下午 4:30:一天任务结束
在一天工作结束时,我通常会检查最后一分钟的电子邮件,检查我的同事,并为第二天制定一个计划。作为一名营销分析实习生,或者实际上任何一名分析师,一个重要的细节是,你几乎不会有和前一天一样的一天。在我实习的公司,整个 60 人的部门只有一名营销分析师。他从事从内容分析、电子邮件性能、社交媒体参与或新产品战略的所有工作。在一天结束时花些时间来计划下一天是至关重要的!
下午 6:00:下班后任务
下班回来后,我通常会花一些额外的时间来提高自己的个人分析技能。这时,我将尝试学习不同语言和工具的新部分,例如学习新的 Python 包或 SQL 函数,阅读其他媒体作者的新建模工具,或者学习新的数学理论以帮助更好地理解我所做的工作。
晚上 7 点:自由活动时间!
在我完成我的个人工作后,我会在晚上的剩余时间放松或参加休闲活动。与普遍的看法相反,做一名营销分析师需要的创造力和分析能力一样多。让你的大脑休息一下对保持创造力流动很重要!
如果这有帮助,请让我知道!我真的很喜欢写关于数据的文章,我很想再写一篇文章,谈谈我从技术角度学到的一些关键知识,如果你想进入入门级营销分析职位或实习,你应该知道什么,如何抓住实习机会,等等!大家注意安全,祝你们有美好的一天!
若要联系我或接收更多内容,请在 Twitter 上关注我@BMNAnalytics!
一位决策科学家给新冠肺炎的十大禁忌
在疫情期间,照顾好你的大脑,聪明对待数据,做出更明智的决定
如果你最喜欢的新零食是新冠肺炎更新,这里有一些提示可以帮助你在大量错误信息中保持漂浮。(你在期待洗手的提示吗?这是一份非常不同的清单。)
提高你对新冠肺炎错误信息的抵抗力。
无论你是在分析病毒数据,制定战略决策,还是只是在社交媒体上大吃大喝,这都是为你准备的;我写的每一篇链接文章都是为了取悦初学者和专家。你可以把它想象成一次与这些天特别相关的主题之旅。
作者简介: By day,Cassie Kozyrkovleads决策智能 at Google。晚上,她写关于数据科学的博客供你娱乐。
不要
- 不要混淆数据和客观事实。【更多】
- 别忘了你的大脑看到的都是假图案。【更多】
- 不要成为确认偏见的受害者。【更多】
- 不要忽视结论背后的假设。【更多】
- 不要指望人工智能能神奇地拯救世界。【更多】
- 不要把分析性的“见解”看得太重。【更多】
- 不要假设每个人衡量事物的方式都一样。【更多】
- 不要拿苹果和橘子比较。【更多】
- 不要盲目相信数据模型和预测。【更多】
- 不要忽视领域知识的重要性。【更多】
磁盘操作系统
- 对于重要的决策,一定要遵循一个结构化的流程。【更多
- 一定要考虑你的默认行为。【更多】
- 在查看数据之前,一定要设定决策标准。【更多】
- 一定要检查你是否理解统计学的基本逻辑。【更多
- 一定要仔细选择你的人口。【更多】
- 一定要思考这些数据是从哪里来的。【更多】
- 在解释不是你自己收集的数据时一定要小心。【更多】
- 一定要坚持数据拆分。【更多】
- 一定要让自己了解偏见。【更多】
- 一定要原谅自己觉得暧昧有压力。【更多】
如果您发现此信息有帮助,请与其他人分享。
现在是完全不同的东西…
感谢阅读!如果你在这里玩得开心,并且对人工智能感兴趣,这里有一个初学者友好的介绍供你娱乐:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在推特、 YouTube 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?用这个表格联系。
俄罗斯推特巨魔深度剖析
俄罗斯虚假信息背后的历史是一个密集和不断发展的主题。世界上最好的研究似乎还没有触及主流,这使得这成为一个绝佳的机会,看看我是否可以使用一些开源工具来展示新的分析证据。
可供研究人员使用的首个数据集有很长的历史。来自克莱姆森大学的研究人员达伦·林威尔和 T2 的帕特里克·沃伦发布了一个数据集,其中包含来自爱尔兰共和军的 2848 个虚假账户网络的 2973371 条推文。这些年来,达伦和帕特里克在这个主题上增加了非凡的深度,以帮助监控和解决在社交媒体平台上的外国恶意影响。
“本质上,如果整个民主世界的安全机构和政治行为者要在未来发现并阻止此类行动,关键是我们要了解此类战略性社交媒体活动的模式,并在它出现时开发出抵制它的工具。”
—达伦·林威尔、帕特里克·沃伦、布兰登·博特赖特和威尔·格兰特
大数据集由克莱姆森的研究人员发布,并通过 GitHub 上的 FiveThirtyEight 开源。您可以在 git 存储库上阅读更多关于数据集背后的历史和模式信息。
开源仓库
在这篇博客文章中,我将向您展示如何使用 Apache Pinot 和 Superset 来分析由 FiveThirtyEight 开源的互联网研究机构(IRA)发布的 300 万条推文。
为了启动并运行我在这篇博文中讨论的示例项目,请访问我的开源存储库,获取引导程序配方。
https://github.com/kbastani/russian-troll-analysis
分析数据集
要对数百万条推文进行高效的实时探索性分析,需要一个专门为此设计的快速数据存储。Apache Pinot 提供了后端查询功能,使我能够进行这项研究。更进一步,我需要一个工具在 Pinot 上创建图表和仪表板,Apache Superset 在这方面扮演了一个完美的角色。
我的分析始于一些基于我之前对这个主题的研究的基本假设。首先,我想从现有的观点后退一步,即巨魔利用策略来影响预期的选举结果。这种假设是臭名昭著的,可能导致了 2016 年后新闻媒体和国会议员政治化的复杂调查。
所以,我对自己说,如果利用社交媒体干预选举在技术上是不可能的呢?
探索数据
将原始数据加载到 Apache Pinot 后,第一步是验证最初由 FiveThirtyEight 于 2018 年提供的分析。他们展示的第一个图表是一个简单的活动视图,试图显示 2016 年可能的选举干扰。
为了验证我有相同的数据集,我使用 Pinot 和 Superset 生成了一个 SQL 查询和可视化。
2015 年至 2018 年俄罗斯巨魔推文活动
在验证了我的查询与克莱姆森研究人员的图表匹配之后,我进一步了解了数据集中的其他特征。
图片由达伦·林威尔和帕特里克·沃伦 |来自 FiveThirtyEight
上图显示了克莱姆森研究人员为分类虚假爱尔兰共和军账户的意图和行为所做的大量工作。对我来说,这种数据观点打破了选举干预的假设。Twitter 是一个复杂的行动和反应的动态系统,它发生得如此之快,以至于很难让这个系统达到任何预期的结果。
我决定开发一个图表,更容易地讲述数据集中不同类型 Twitter 账户的行为。
按标签账户类别分类的俄罗斯 Troll Twitter 活动
我想出的图表平滑了“五个三十八”可视化中显示的活动。这里我们看到,2015 年以来有尖峰活动,可能与选举干预无关。我需要看到的是每一个尖峰的叙述。我认为,看看主流新闻媒体中的特定话题或主题是否解释了这些飙升,可能会有所帮助。
俄罗斯巨魔与福克斯新闻频道有关的推特活动
上面的图表显示了与福克斯新闻频道相关的所有提及。这个查询显示了一些有趣的峰值活动,所以我决定查看 2015 年 6 月 10 日福克斯新闻频道的头条。
https://web . archive . org/web/20150610010931/http://www . fox news . com/
这个结果让我震惊的是,它与 2020 年 5 月乔治·弗洛伊德(George Floyd)悲惨去世后的叙述惊人地相似。为了了解这个关于 Twitter 数据集的特别标题是否有什么意义,我决定将福克斯新闻频道与其他新闻媒体进行比较。
https://web . archive . org/web/20150610080013/http://www . CNN . com/
上面是 CNN 网站截图,几个小时前福克斯新闻频道报道了他们的标题。这两个网站在新闻报道上的最大区别是,福克斯新闻频道在爱尔兰共和军的推文中使用了叙述性术语,而 CNN 没有。虽然这只是一个数据点,但我需要了解叙事是否推动了新闻周期,反之亦然。哪个先出现,新闻报道是如何随着时间的推移而变化的?
下面的图表显示了警察和种族不公正作为一个叙事开始的起源事件。我用来过滤结果的查询是基于相关性的搜索,使用的是福克斯新闻频道网站 6 月 10 日头条中的关键词。Apache Pinot 有一个基于 Apache Lucene 的全文索引实现,它允许我返回与我的查询相关的结果。
使用 FoxNews.com 标题的基于文本的搜索:“一个德克萨斯白人警察拍摄了摔跤…
在这里,我们看到了 2015 年 6 月 10 日围绕种族不公正和警察的叙事有一个明确的起源事件。故事从右翼巨魔控制的尖峰活动开始。在这些蓝色的尖峰之间,我们有左侧巨魔的持续活动。最后的尖峰,再次被右巨魔所控制。
与白人至上和警察有关的 Twitter 巨魔活动
在对数据进行平滑处理后,我能够看到图表中最大的峰值是 2017 年 8 月的整个月。我使用 Wayback 机器检查了那个月的新闻标题,并将这些叙述与 2015 年 6 月的正确巨魔叙述进行了比较。
https://web . archive . org/web/20170813011501/http://www . fox news . com/
新闻媒体的叙述现在与两年前的意识形态内容完全一致。一贯的主题?恐怖、恐惧、愤怒和愤慨。
https://web . archive . org/web/20170813011501/http://www . CNN . com/
在这一点上,我的收获是,爱尔兰共和军数据集中的有毒意识形态和短语在最近的新闻媒体标题中变得普遍。为了理解意识形态和叙事是如何演变的,我决定使用来自开源的命名实体识别来丰富原始数据集斯坦福 CoreNLP 库。
命名实体识别
要进一步理解爱尔兰共和军推文的语义内容和叙述,需要基于时间序列的自然语言处理。理想情况下,我想避免将时间序列图表的内容与单个 tweet 相关联,而是与所有 tweet 中包含的文本实体相关联。
Stanford NLP 项目提供了一个基于 JDK 的库,用于执行命名实体识别(NER) 。我过去在 tweets 上使用过这个库,它运行得相当好。
上面的图表显示了包含特定类别的命名实体的推文数量。
下一个图表显示了属于每个类别的不同实体名称的数量。对于这个图表,我已经过滤掉了handle
和url
,它们与理解假账背后的不同叙述无关。
既然我们已经对实体和类别的分布有了相当好的理解,我们可以开始看看每个类别包含什么。具体来说,我们想看看对不同虚假账户的叙述进行分类的命名实体。
人
该图表包含了个人实体的虚假账户类别的推文数量。
组织
该图表包含了组织实体的虚假账户类别的推文数量。
刑事指控
这张图表包含了因刑事指控而被分类的虚假账户的推文数量。
死亡原因
这张图表包含了死亡原因的虚假账户类别的推文数量。
多方面的
这个图表包含了各种实体的虚假账户的推文数量。
标题
该图表包含了代表不同头衔的实体的虚假账户类别的推文数量。
意识形态
这张图表包含了意识形态类虚假账户的推文数量。
意识形态时间序列
这个图表是一个时间序列,显示了推文中提到的意识形态的平滑分布。
右翼巨魔意识形态
下一张图表显示了正确的巨魔账户所使用的意识形态。
左翼巨魔意识形态
这张图表显示了左巨魔账户的意识形态。
得出结论
爱尔兰共和军有没有可能成功干涉了美国的选举?要回答这个问题,我觉得有必要了解一下选举干预是什么意思。
什么是选举干预?
选举干预是一个模糊的政治术语,政客使用时几乎没有法律效力。然而,外国恶意影响是一个描述民族国家资助的用来影响选民舆论的活动的术语。当外国试图影响公众舆论,以及选举的选民时,这是一个国家安全问题。
现在, 国内选举干涉 呢?
国内选举干预是一个完全虚构的术语,大致翻译为“为政治候选人竞选”只要政客们遵守竞选财务法,不参与任何形式的选举舞弊,他们就可以自由地干预选举,而无需承担国内的法律责任。我能找到的唯一例外是社交媒体上的政治言论对国家安全或公共安全构成威胁。
爱尔兰共和军在推特上的活动是否干预了美国选举?
当然,但不是因为大多数人认为的原因。在广泛分析这些推文后,我很清楚选举干预不是重点。相反,这三百万条推文的目的是放大恐怖、愤怒、恐惧,并在公共广场上制造不和。这些推文造成的损害是任何人都无法断定他们的最终目标是什么。仅仅通读这些推文就会向读者反映他们在练习前持有的任何偏见或结论。
社交媒体真正的危险是混乱的迷雾,让人相信没有人说真话。事实上,我认为可能没有简单的真相,或者对于那些知道真相的人来说,没有简单的解释。
政党成员之间确实存在美德信号,但这并不新鲜。Twitter 可能会放大这种效应,一些政治家可能会发现自己通过发出个人叙事信号而具有不成比例的影响力。政治家们应该明白,在激烈的政治竞选中,发出分裂的美德信号是有代价的。
Twitter 对信任其订阅源的用户有着过多的控制。毕竟,我们是群居动物。Twitter 给了我们空间,让我们更好地理解如何认同我们的群体,比如迷因和美德信号。美德信号往往会获得更多的喜欢、转发和追随者。
一个群体的行为会以这样或那样的方式影响每个人,在 Twitter 上,没有人能免受恶意影响。美德信号是保持群体内部界限的关键,这一观点似乎滋生了不良影响。通过引入在意识形态上与 Twitter 用户的内部群体对立的虚假外部群体,该群体的影响者屈服于更极端形式的美德,向他们的追随者发出信号。这是我认为 2015 年多米诺骨牌开始倒下的地方。
解决问题
那么,我们如何通过美德信号阻止恶意影响者传播有毒或极端的意识形态叙事呢?我认为如果不对数字美德信号背后的心理学进行更多的研究,我们就做不到。恶意的影响者只需要找到一种方法进入群体中善意成员的饲料中。转发和点赞都容易受到这种影响,只需要一个你信任的人就能在整个群体中传播恶意影响。
至于解决办法?
我认为在 Twitter 上解决这个问题需要减少转发量的放大,重新思考推荐算法。话题应该集中在美德信号的非政治来源,而不是建立在恐惧、愤怒或愤慨上的。这不是一个容易解决的问题,我希望随着 Twitter 的发展,看到更多的数据和研究。
最后的想法
我希望这篇文章有趣,对读者有帮助。如果您有任何反馈、意见、更正或建议,请随时在这里或通过 Twitter 联系我。我鼓励那些足够勇敢的人去探索我整理的开源项目,它将允许你复制我的发现,并对数据进行你自己的分析。
这对我来说是一个充满激情的话题,我希望对你也是如此。我不遗余力地让设置您自己的分析环境变得尽可能容易。
为了启动并运行我在这篇博文中讨论的示例项目,请访问我的开源存储库,获取引导程序配方。
https://github.com/kbastani/russian-troll-analysis
特别感谢
特别感谢 Apache Pinot 社区的人们对本文的反馈。此外,感谢 Darren Linvill 和 Patrick Warren、以及其他致力于让决策者了解外国对社交媒体的恶意影响的人。
深入探究区块链
你需要知道的关于这项成长中的技术的一切
你信任我吗?😈
我们整个社会都建立在信任之上。你相信你的老板会付你钱。你相信政府会保证你的安全。你相信你的银行不会偷你的钱然后逃跑。我们盲目地信任如此多的机构和人,却毫不犹豫。
但是如果发生了什么呢?你的老板不给你发工资。政府垮台了。你的银行把你所有的钱投入股市,股市崩盘,导致你失去所有的积蓄(咳咳…2008 年股市崩盘)。这些可怕的事情似乎不可能发生。但事实是,信任是支撑这些系统的唯一东西。信任让你变得脆弱,易受伤害,但你依赖这些系统。你必须信任政府、银行和机构,因为别无选择。嗯,在**区块链出现之前,一直没有替代方案,区块链旨在创建一个不依赖信任的系统。**所以你不必相信你的银行会卷走你的钱。你不必相信你的政府会垮台。
你可能会问自己,‘区块链似乎很神奇!它是如何工作的?这真的很神奇,但是要深入了解区块链是如何运作的,以及如何被用来扰乱当前的系统,你首先必须了解当前的机构是如何运作的。
集权的问题🌐
假设你想给你在世界另一端的朋友寄钱。你不会给他们寄支票或现金。那会花太长时间。相反,你可以通过 Paypal 或银行的电子转账系统汇款。快速且易于访问…对吗?不对。您的银行需要确认从该账户中流出的钱是您的,并且您授权了支付。然后,他们需要确认你把钱汇给了一个可靠的来源,这可能需要你事先授权。但是在你知道之前,你的朋友刚刚收到了 100 美元,而你支付了额外的 10 美元手续费。
银行或机构促进转账的想法就是集中化的想法。所有的东西都经过它们,然后从两边出来。他们看到了一切,没有人可以访问你的文件。在很大程度上,这个系统是有效的,我们作为一个社会非常依赖它。但是,有几个问题出现了。
漏洞——由于所有东西都隐藏在一个“安全”的数据库中,这使得每个人的信息都很容易受到攻击。只需一次数据库泄露,你所有的信用卡信息就会被泄露。我们一次又一次地看到大公司突然遭到黑客攻击。这发生在易贝、Adobe、Canva 和其他著名的大公司身上。
费用和财务激励——和其他公司一样,促进转账的机构也想赚钱。他们通常通过在服务中增加手续费来做到这一点。你没有真正的选择,因为你可能会依赖这些机构。
权力不稳定——如果只有少数公司促进我们社会需要的所有转移,那么**就给了那些公司很大的权力。**他们可以改变系统,产生难以形容的影响。现在你的银行改变系统的可能性非常小。事实上,他们有能力做到这一点,这是非常可怕的。他们可以利用自己的地位,这一点以前已经做到了。
实施缓慢——如果公司服务的某一部分对一部分人产生了负面影响,那么解决这个问题最多需要几个月的时间**。**这是因为大公司内部漫长的官僚程序。重大的改变需要很长的时间,这真的伤害了那些需要立即改变的人。
所有,我是说所有这些问题都是用区块链的想法解决的。你可能已经猜到了,区块链运行在中央集权制度的对立面。区块链是分散的,拥有许多对人们非常有利的属性。区块链是这样工作的。
区块链的基础:转移的新观点💻
区块链是一个分散的点对点传输系统。没有人控制区块链,但它无限期地运行着。一件事怎么去中心化?这意味着每个人都帮助运行区块链。技术上来说,你创造了区块链。区块链运行在一个单一的概念上,在一个区块中,这些区块被链接在一起,因此区块链。
块+链:
块在其中存储一条信息或数据。这些可能是交易、信息或任何东西。该块与散列相关联,散列是由特殊加密函数创建的唯一字符串。每个散列都是唯一的,有点像块的 id。每个块还包含前一个块的散列,这就是被链接在一起的想法的来源。每个块引用最后一个散列,依此类推。
如何创建块:
在将块添加到当前区块链之前,需要对其进行验证。交易需要被核实,以确保一切都检查出来。通常的做法是通过工作证明。人们需要通过解决一个非常难的数学问题来验证该块是合法的,通常是用计算机来完成。但是谁会愿意放弃他们宝贵的计算机能力去创造一个新的街区呢?这种激励通常是区块链会用少量的钱奖励验证该块的用户。这就是比特币和以太坊的工作方式,验证这些区块的人被称为矿工。他们被称为矿工,因为他们通过他们的计算机能力挖掘这些钱。大多数人第一次听说区块链和这个概念是通过采矿的概念,但这可能会产生误导。我将在文章的后面更多地讨论挖掘。
公共总账:
任何人都可以访问区块链,任何人都可以查看任何特定的街区。这种透明性使得区块链与正常的中央集权体制如此不同。在集中式系统中,只有公司或机构有权访问分类账。通过公开账本,每个人都可以监控链条的健康状况,看看是否有人试图做什么见不得人的事。
哈希依赖:
理解散列依赖于块的内容是很重要的。内容的微小变化都会极大地改变散列。由于这种依赖性以及每个人都有权查看区块链的事实,这使得系统不可攻击。这是因为如果有人为了自己的利益改变块的内容,它将改变散列,并且它前面的块将不会匹配相同的散列。这样,区块链可以很容易地识别变化。
块可以容纳什么数据?
这个想法是任何东西都可以嵌入到这些块中。最大的例子是货币转移,其中一个块保存显示用户之间货币转移的信息。但更酷的应用包括不动产证明、某些物品的证明,甚至是药品。
通过协议自行运行:
一旦区块链启动,它将永远自行运行。它不需要任何人看管。如果有足够多的矿工和事务,它将继续工作。这是因为它由一个协议运行,本质上存在于每个人的计算机上。除非互联网本身消亡,否则区块链也会消亡。
这些是每个区块链的基本属性。但是随着技术的发展,新的属性将会出现…
✔️区块链的额外(但有用)特性
如果区块链的最低要求都能满足,那么任何额外的东西都可以添加进去。许多区块链大公司创造了很酷的功能,让更多的人使用他们的区块链。区块链的一些值得注意的额外属性包括:
智能合约:
智能合约可能是区块链最受欢迎的功能之一,它允许人们之间进行几乎任何交易。它本质上就像一个真实的合同,但由协议强制执行,一旦创建,就不可逆转。它概述了协议验证和促进双方贸易的要求。例如,如果我想创建一个智能合同,为我向雇主提供的每一小时的工作支付报酬,我的雇主和我可以创建一个智能合同,并使用传感器来跟踪我的工作时间。我每做一个小时,协议就会自动从他的账户里取出 X 美元,放到我的账户里。智能合约可以做很多事情,这也是它们如此酷的原因。
分叉:
区块链并不完全安全。有时候,黑客会在区块链上获取你的账户信息,然后偷走你所有的东西。这种情况时有发生,但通常是账户所有人的错。通常只是很小的一笔钱,但如果黑客窃取了数百万美元,那就太可怕了。谢天谢地,有办法找回钱。分叉区块链意味着返回到某个时间点的某个块,并从该块重新开始所有操作。就像什么都没发生过一样。但是分叉只有在区块链上 51%(或者大多数)的用户想要分叉的时候才会发生。这使得区块链的权力掌握在集体手中,使其成为一个更加民主化的体系。
物价稳定:
一些有货币的区块链正在试验价格稳定系统,这实质上意味着他们的硬币的价值是不变的。公司通过创建一个协议来匹配流通中的硬币数量,并将其保存在一个私人银行账户中。任何时候硬币增值,他们可以立即添加更多的硬币,反之亦然。美元硬币是以美元为基础的,通常价值为 1 美元。这使得加密货币更加可靠和易于使用。
不同程度的权力下放:
许多公司正在创建区块链,它们的分权程度较低,而集权程度更高。例如,他们可能拥有除公共分类账之外的所有基本区块链属性,使其更像一个中央系统。有时,一个更加集权的区块链可能会更好,这取决于区块链的用途。
区块链的类型:
有三种类型的区块链,都有其独特的优势和劣势。3 种类型的区块链是:公共,私人和财团。他们都以不同的方式工作,但或多或少仍然是分散的。
还有很多,但这些是最著名的一些。
区块链的应用📝
区块链的应用是无穷无尽的。它几乎可以用于任何事情。以下是我想到的一些最酷的区块链应用。
加密货币
我不能写一篇关于区块链的文章而不提到加密货币。第一个区块链是基于一种加密货币,也是其中最著名的区块链,比特币。加密货币是一种可以通过点对点区块链交易的货币。它使用了区块链的所有基本原理,理论上是最容易创建的区块链。有超过数千种加密货币。
太阳能币
SolarCoin 是一种能源交易区块链与货币。人们可以根据商定的价格,用他们拥有的能量换取别人的太阳能硬币。它使用智能合约来促进贸易。
物品确认
所有权证明也是区块链被使用的另一种令人兴奋的方式。人们可以拥有验证某个项目的 id。它可以代表一件珠宝,甚至是一所房子的契约。这些 id 可以在人与人之间交易,随后是物品本身。
Wifi 共享
像 HotSpot 和 Helium 这样的公司正在创建区块链,在那里人们可以通过付费来共享 wifi。费率通常较低,并且在适用时使用智能合同。
区块链的挑战(及解决方案)
即使区块链技术可以用于一些非常酷的应用,仍然有各种各样的事情阻止区块链成为最佳选择。
速度
在促进用户之间的交易方面,区块链的速度是出了名的慢。比特币转账的平均时间为每笔交易 10 分钟左右。考虑到中央银行做同样的事情所花费的时间,这个速度慢得令人难以置信。
这个问题的解决方案是在用户之间创建一个照明网络。如果两个用户一致认为他们都是可信任的,他们可以在他们之间创建一个直接的链接,而不需要区块链来验证。比特币已经开始实现类似这样的东西了。
内存问题
存储有关交易的所有信息会占用大量数据和空间。如果每个人都需要区块链的副本,那么使用该协议就不可行。
解决方案是在 X 年后自动删除链条中最老的部分。这样,链条就可以一直有一个固定的长度,并且会无限地运行下去。
非法使用
由于许多区块链是匿名的,许多人使用加密货币和区块链作为转移非法物品资金的一种方式。黑暗网络专门使用区块链进行交易
解决这个问题的方法是创建不匿名的区块链。这些将被视为私人链,并会导致更大的透明度。
电力使用效率低下
当每个人在挖掘时都试图解决一个加密哈希函数时,有时多个用户会试图解决同一个函数,导致电力的低效使用。
这个问题的解决方案是为挖掘创建一个新的协议。有人提出了股权证明协议,人们出价硬币(但实际上不会输掉)来开采某个区块。
关键要点
- 区块链是一个分散的系统,而大多数机构是集中的
- 区块链由包含数据并链接在一起的块组成
- 哈希函数用于加密数据块
- 区块链可用于在两方或多方之间转移项目
- 区块链面临着许多挑战,但也有新的创新解决方案使这项技术更加可行。
Hough 变换在车道检测中的应用
来源(此处)
从零到英雄指南在 OpenCV 中构建车道线检测算法
车道线检测是自动驾驶汽车必不可少的组件之一。有许多方法可以做到这一点。在这里,我们将看看使用**霍夫变换的最简单的方法。**好吧,让我们开始吧!
准备
所以在我们开始之前,我们需要一个地方来写我们的代码。我推荐的 IDE(环境)是 Jupyter 笔记本。它有一个漂亮的,简约的界面,但同时又非常强大。此外,Jupyter 笔记本非常适合可视化数据。以下是下载链接:
[## 安装- Anaconda 文档
在安装 Anaconda 个人版之前,请阅读下面列出的系统要求。如果你不想要…
docs.anaconda.com](https://docs.anaconda.com/anaconda/install/)
现在您已经安装了 Anaconda 并且 Jupyter 正在工作,让我们获取一些数据吧!可以从我的 Github repo 下载算法的测试图片、视频和源代码。现在我们准备好构建算法了。
本文分为三个部分:
- 第 1 部分:高斯模糊+精明的边缘检测
- 第 2 部分:霍夫变换
- 第 3 部分:优化+显示线条
第 1 部分和第 3 部分侧重于编码,第 2 部分更侧重于理论。好吧,让我们开始第一部分。
第 1 部分:高斯模糊+ Canny 边缘检测
我们需要做的第一件事是导入所需的库。
import numpy as np
import cv2
import matplotlib.pyplot as plt
这里我们导入了 3 个库:
- 第 1 行 : Numpy 用于进行数学计算。我们要用它来创建和操作数组
- 第二行: OpenCV 是一个库,用来让任何人都可以做计算机视觉(也称为简化初学者)。
- 第 3 行: Matplotlib 用于可视化图像。
接下来,让我们加载一张图片来测试我们的算法
image_path = r"D:\users\new owner\Desktop\TKS\Article Lane Detection\udacity\solidWhiteCurve.jpg"
image1 = cv2.imread(image_path)
plt.imshow(image1)
这里,我们在第 4 行将图像加载到笔记本中,然后我们将在第 5 行和第 6 行读取图像并将其可视化。
现在是处理图像的时候了。我们将特别做三件事:
def grey(image):
return cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)def gauss(image):
return cv2.GaussianBlur(image, (5, 5), 0)def canny(image):
edges = cv2.Canny(image,50,150)
return edges
在最后一个代码块中,我们定义了 3 个函数:
灰度图像:这有助于增加颜色的对比度,更容易识别像素强度的变化。
**高斯滤波器:**高斯滤波器的目的是减少图像中的噪声。我们这样做是因为 Canny 中的梯度对噪声非常敏感,所以我们希望尽可能消除噪声。 cv2。GaussianBlur 函数有三个参数:
- img 参数定义了我们将要归一化(减少噪声)的图像。
- 参数 ksize 定义了我们将要对图像进行卷积(传递)的内核的尺寸。这种核卷积就是降噪的方式。该函数使用一个名为高斯内核的内核,用于标准化图像。
- 西格玛参数定义沿 x 轴的标准偏差。标准差衡量图像中像素的分布。我们希望像素分布一致,因此标准偏差为 0。
Canny :这是我们检测图像边缘的地方。它的作用是计算图像中某一部分的像素强度变化(亮度变化)。幸运的是,OpenCV 使这变得非常简单。
cv2。Canny 函数有 3 个参数,(img,threshold-1,threshold-2)。
- img 参数定义了我们将要检测边缘的图像。
- threshold-1 参数过滤低于该数字的所有渐变(它们不被视为边缘)。
- threshold-2 参数决定了一个边沿的有效值。
- 如果连接到高于阈值-2 的另一个梯度,则两个阈值之间的任何梯度都将被考虑。
多么精明的形象啊
既然我们已经定义了图像中的所有边缘,我们需要隔离与车道线对应的边缘。这就是我们要做的
def region(image):
height, width = image.shape
triangle = np.array([
[(100, height), (475, 325), (width, height)]
])
mask = np.zeros_like(image)
mask = cv2.fillPoly(mask, triangle, 255)
mask = cv2.bitwise_and(image, mask)
return mask
该功能将隔离图像中车道线所在的特定硬编码区域。它接受一个参数,Canny 图像,并输出隔离区域。
在**第 1 行,我们将使用 numpy.shape 函数提取图像尺寸。在第 2–4 行,**我们将定义一个三角形的尺寸,这是我们想要隔离的区域。
在**第 5 行和第 6 行,**我们将创建一个黑色平面,然后我们将定义一个白色三角形,其尺寸与我们在第 2 行中定义的尺寸相同。
在第 7 行中,我们将执行逐位运算,这允许我们隔离与车道线对应的边。让我们更深入地了解一下操作。
对按位 And 运算的深入解释
在我们的图像中,有两个像素的强度:黑色和白色。黑色像素的值为 0 ,白色像素的值为 255 。在 8 位二进制中,0 转换为 00000000,255 转换为 1111111。对于按位 and 运算,我们将使用像素的二进制值。
现在,奇迹发生了。我们将在 img1 和 img2 上完全相同的位置乘以两个像素(我们将 img1 定义为具有边缘检测的平面,img2 定义为我们创建的遮罩)。
左:Img1。右图:Img2(实际上,它是白色的,但为了给你看,我把它做成黄色的)
例如,img1 上(0,0)处的像素将与 img2 中点(0,0)处的像素相乘(图像上每隔一个位置的每隔一个像素也是如此)。
如果 img1 中的(0,0)像素是白色的(意味着它是一条边),而 img2 中的(0,0)像素是黑色的(意味着该点不是我们的车道线所在的隔离部分的一部分),则操作看起来像 11111111* 0000000,这等于 000000(一个黑色像素)。
我们将对图像上的每个像素重复这一操作,从而只输出蒙版中的边缘。
仅输出隔离区域中的边缘。其他的都被忽略了
现在我们已经定义了我们想要的边,让我们定义将这些边变成线的函数。
lines = cv2.HoughLinesP(isolated, rho=2, theta=np.pi/180, threshold=100, np.array([]), minLineLength=40, maxLineGap=5)
所以这一行发生了很多事情。这一行代码是整个算法的核心。它被称为霍夫变换,将孤立区域中的白色像素簇转化为实际线条的部分。
- 参数 1 : 孤立梯度
- 参数 2 和 3:定义面元大小,2 是ρ的值,np.pi/180 是θ的值
- 参数 4 : 每个箱被认为是一条线所需的最小交叉点(在我们的例子中,是 100 个交叉点)
- 参数 5:占位符数组
- 参数 6:最小线路长度
- 参数 7:最大线间隙
现在如果这些看起来像是胡言乱语,下一部分将深入算法背后的具体细节。所以你可以在读完第二部分后回到这一部分,希望这样会更有意义。
第 2 部分:霍夫线变换
快速注意一下,这部分只是理论。如果您想跳过这一部分,可以继续阅读第 3 部分,但是我鼓励您通读一遍。霍夫变换下的数学真的很壮观。不管怎样,这就是了!
我们来谈谈霍夫变换。在笛卡尔平面(x 和 y 轴)中,直线由公式 *y=mx+b,*定义,其中 x 和 y 对应于该直线上的一个特定点,而 m 和 b 对应于斜率和 y 截距。
笛卡尔坐标空间中的直线(来源
在笛卡尔平面中绘制的常规直线有两个参数( m 和 b ,意味着直线由这些值定义**。**此外,需要注意的是,笛卡尔平面中的线是作为它们的 x 和 y 值的函数绘制的,这意味着我们显示的线是关于有多少(x,y)对组成这条特定的线(有无限数量的 x,y 对组成任何线,因此线延伸到无穷大)。
然而,可以将线绘制成 m 和 b 值的函数。这是在一个叫做霍夫空间的平面上完成的。为了理解霍夫变换算法,我们需要理解霍夫空间是如何工作的。
霍夫空间的解释
在我们的用例中,我们可以将霍夫空间总结为两行
- 笛卡尔平面上的点变成霍夫空间中的线
- 笛卡尔平面中的线变成霍夫空间中的点
但是,为什么呢?
想想线的概念。一条线基本上是一组无限长的点,一个接一个地有序排列。由于在笛卡尔平面上,我们绘制了作为 x 和 y 的函数的线,线显示为无限长,因为有无限数量的(x,y)对组成这条线。
现在,在霍夫空间中,我们绘制直线作为它们的 m 和 b 值的函数。并且由于每条线在每条笛卡尔线中只有一个 m 和 b 值,所以这条线将被表示为一个点。
例如方程 y=2x+1 表示笛卡尔平面上的一条直线。它的 m 和 b 值分别为‘2’和‘1’,这是这个方程唯一可能的 m 和 b 值。另一方面,这个等式可能有许多值用于使这个等式实现的 x 和 y (左侧=右侧)。
所以如果我要用它的 m 和 b 值来画这个方程,我只会用点(2,1)。如果我用它的 x 和 y 值来画这个方程,我将有无限多的选项,因为有无限多的(x,y)对。
把 θ 想成 b,把 r 想成 m,我会在文章的后面解释 θ 和 r 的相关性(来源)。
那么,为什么霍夫空间中的线被表示为笛卡尔平面中的点呢(如果你从前面的解释中很好地理解了这个理论,我挑战你在不阅读解释的情况下找出这个问题。).
现在让我们考虑笛卡尔平面上的一个点。笛卡尔平面上的点只有一个可能的(x,y)对可以表示它,因此它是一个点并且不是无限长的。
关于一个点同样成立的是,有无限多条可能的线可以通过这个点。换句话说,这个点可以满足的方程(形式为 y=mx + b)有无穷多个(LS=RS)。
目前,在笛卡尔平面中,我们正在绘制这个点相对于它的 x 和 y 的值。但是在霍夫空间中,我们相对于它的 m 和 b 值来绘制这个点,由于有无限多条线穿过这个点,霍夫空间中的结果将是一条无限长的线。
比如,我们来取点(3,4)。可能通过该点的一些线是:y= -4x+16,y= -8/3x + 12 和 y= -4/3x + 8(有无限多条线,但为了简单起见,我使用 3)。
我之前提到的三行。它们都穿过点(3,4)
如果您将在霍夫空间([-4,16],[-8/3,12],[-4/3,8])中绘制这些线中的每一条线,那么在笛卡尔空间中表示每一条线的点将在霍夫空间中形成一条线(这是与点(3,4)相对应的线)。
每个点代表之前显示的线条(匹配颜色)。注意这些点是如何形成一条线的。
很整洁,是吧?如果我们在笛卡尔平面上再放一个点呢?这在霍夫空间中会是什么结果呢?嗯,通过使用霍夫空间,我们实际上可以找到笛卡尔平面上这两点的最佳拟合线。
我们可以通过在霍夫空间中绘制与笛卡尔空间中的 2 个点相对应的线,并找到这 2 条线在霍夫空间中相交的点(也称为它们的 POI,交点)来做到这一点。
接下来,获取霍夫空间中两条线相交点的 m 和 b 坐标,并使用这些 m 和 b 值在笛卡尔平面中形成一条线。这条线将是最适合我们数据的线。
中间解释摘要
总结一下我们一直在谈论的事情,
- 笛卡尔平面中的线被表示为霍夫空间中的点
- 笛卡尔平面中的点被表示为霍夫空间中的线
- 您可以通过在霍夫空间中找到与两点对应的两条线的 POI 的 m 和 b 坐标,然后根据这些 m 和 b 值形成一条线,来找到笛卡尔空间中两点的最佳拟合线。
回到解释:)
虽然这些概念真的很酷,但它们为什么重要呢?还记得我之前提到的 Canny 边缘检测吗,它使用梯度来测量图像中的像素强度并输出边缘。
本质上,渐变只是图像上的点。所以我们能做的是找到每组点的最佳拟合线(图像左边的梯度簇和图像右边的梯度)。这些最适合的线就是我们的车道线。为了更好地理解这是如何工作的,让我们再深入研究一下!
所以我刚才解释了我们如何通过查看与霍夫空间中的点相对应的两条线的 POI 的 m 和 b 值来找到最佳拟合的线。然而,当我们的数据集增长时,并不总是有一条线完全符合我们的数据。
这就是为什么我们要使用垃圾桶来代替。当合并面元时,我们将把霍夫平面分成等间距的部分。每个部分称为一个容器。通过关注某个条块中 POI 的数量,我们可以确定一条与我们的数据具有良好相关性的线。
在此图像中,与最暗的蓝色条柱相对应的 m 和 b 值将是最佳拟合线
找到交集最多的容器后,您将使用与该容器对应的 m 和 b 值,并在笛卡尔空间中形成一条线。这条线将是最适合我们数据的线。
但是**撑得住!**不是这个。我们几乎忽略了一个巨大的错误!
在垂直线中,斜率是无穷大。我们无法在霍夫空间中表示无穷大。这将导致程序崩溃。所以我们不用 y=mx+b 来定义一条线的方程,而是用 P (rho)和θ (theta)来定义一条线。这也被称为极坐标系统。
在极坐标系中,直线用方程 P=xsinθ + ysinθ表示。在我们深入探讨之前,让我们定义一下这些变量的含义:
- P 代表从垂直于直线的原点的距离。
- θ表示从 x 轴正方向到直线的俯角。
- xcos θ表示在 x 方向的距离。
- ysin θ表示在 y 方向的距离。
极坐标含义的直观解释
通过使用极坐标系统,不会有任何误差,即使我们有一条垂直线。比如我们取点(6,4),代入方程 P=xcos θ +ysin θ。现在,让我们取一条穿过该点的垂直线,x=6,并将其代入直线的极坐标方程,P = 6 cos(90)+4 sin(90)。
- 对于垂直线来说,θ是 90 度,因为从正 x 轴到线本身的俯角是 90 度。θ的另一种表示方式是π/2(单位为弧度)。如果你想了解更多关于弧度的知识以及我们为什么使用它们,这里的是一个很好的视频,然而,没有必要知道弧度是什么。
- X 和 Y 取点(6,4)的值,因为这是我们在本例中使用的点。
现在让我们解出这个等式
P = 6cos(90) + 4sin(90)
P = 6(1) + 4(0)
P = 6
如你所见,我们最终没有出错。事实上,我们甚至不需要做这个计算,因为我们在开始之前就已经知道 P 是什么了。注意 P 如何等于 x 值。因为线是垂直的,所以唯一垂直于它的线是水平线。因为这条水平线是从原点开始的,这和说从原点在 x 轴上移动的距离是一样的。
我想要解释的东西的图像。
那么现在这已经解决了,我们准备好继续编码了吗?还没有。还记得以前当我们在笛卡尔平面上绘制点时,我们会在霍夫空间中以线结束吗?当我们使用极坐标时,我们会得到一条曲线,而不是直线。
正弦曲线是指曲线的类型,正弦曲线。(来源)
然而,概念是相同的。我们将找到具有最多交叉点的箱,并使用这些 m 和 b 值来确定最佳拟合线。
原来如此!我希望你喜欢深入研究霍夫变换背后的数学。现在,让我们回到编码上来!
第 3 部分:优化+显示线条
现在,这部分关于平均线的内容是为了优化算法。如果我们不平均线,他们显得非常起伏,因为 cv2。HoughLinesP 输出一串小线段,而不是一条大直线。
这是没有平均线。很不稳定,是吧。
为了平均这些线,我们将定义一个名为“平均”的函数。
def average(image, lines):
left = []
right = []
for line in lines:
print(line)
x1, y1, x2, y2 = line.reshape(4)
parameters = np.polyfit((x1, x2), (y1, y2), 1)
slope = parameters[0]
y_int = parameters[1]
if slope < 0:
left.append((slope, y_int))
else:
right.append((slope, y_int))
该功能对 cv2 中的线进行平均。HoughLinesP 功能。它将找到左边和右边线段的平均斜率和 y 截距,并输出两条实线(一条在左边,另一条在右边)。
在 cv2 的输出中。HoughLinesP 功能,每个线段有 2 个坐标:一个表示线的起点,另一个标记线的终点。使用这些坐标,我们将计算每条线段的斜率和 y 轴截距。
然后,我们将收集所有线段的斜率,并将每个线段分类到对应于左线或右线的列表中(负斜率=左线,正斜率=右线)。
- 第 4 行:循环遍历该行数组
- 第 5 行:从每个线段中提取 2 个点的(x,y)值
- 第 6–9 行:确定每条线段的斜率和 y 截距。
- 第 10–13 行:将负斜率添加到左侧线的列表中,将正斜率添加到右侧线的列表中。
注意:通常,正斜率=左线,负斜率=右线,但是在我们的例子中,图像的 y 轴是反转的,这就是斜率反转的原因(OpenCV 中的所有图像都有反转的 y 轴)。
接下来,我们必须从两个列表中取斜率和 y 截距的平均值。
right_avg = np.average(right, axis=0)
left_avg = np.average(left, axis=0)
left_line = make_points(image, left_avg)
right_line = make_points(image, right_avg)
return np.array([left_line, right_line])
注意:不要将这段代码放在 for 循环中。
- 第 1–2 行:取两个列表(左侧和右侧)中所有线段的平均值。
- 第 3–4 行:计算每条线的起点和终点。(我们将在下一节定义 make_points 函数)
- 第 5 行:输出每行的 2 个坐标
现在我们有了两个列表的平均斜率和 y 轴截距,让我们定义两个列表的起点和终点。
def make_points(image, average):
slope, y_int = average
y1 = image.shape[0]
y2 = int(y1 * (3/5))
x1 = int((y1 — y_int) // slope)
x2 = int((y2 — y_int) // slope)
return np.array([x1, y1, x2, y2])
这个函数有两个参数,一个是车道线的图像,一个是车道线的平均斜率和 y_int 的列表,并输出每条车道线的起点和终点。
- 第 1 行:定义函数
- 第 2 行:获得平均斜率和 y 截距
- 第 3–4 行:定义线条的高度(左右两边都一样)
- 第 5–6 行:通过重新排列一条线的方程,从 y=mx+b 到 x = (y-b) / m 计算 x 坐标
- 第 7 行:输出坐标集
更详细地说,在第 1 行,我们使用 y1 值作为图像的高度。这是因为在 OpenCV 中,y 轴是反的,所以 0 在顶部,图像的高度在原点(参考下图)。
同样,在第 2 行,我们将 y1 乘以 3/5。这是因为我们希望直线从原点( y1 )开始,在图像上方 2/5 处结束(因为 y 轴是 2/5,而不是从 0 向上 3/5,我们看到从最大高度向下 2/5)。
应用于左线的 make_points 函数的可视化示例
但是,该函数不显示线条,它只计算显示这些线条所需的点数。接下来,我们要创建一个函数,用这些点组成线条。
def display_lines(image, lines):
lines_image = np.zeros_like(image)
if lines is not None:
for line in lines:
x1, y1, x2, y2 = line
cv2.line(lines_image, (x1, y1), (x2, y2), (255, 0, 0), 10)
return lines_image
该函数接受两个参数:我们想要显示线条的图像和从平均值函数输出的车道线。
- 第 2 行:创建一个涂黑的图像,尺寸与原始图像相同
- 第 3 行:确保包含行点的列表不是空的
- 第 4–5 行:遍历列表,提取两对(x,y)坐标
- 第 6 行:创建线条并粘贴到涂黑的图像上
- 第 7 行:输出带有线条的黑色图像
你可能想知道,为什么我们不把这些线条附加到真实的图像上,而不是黑色的图像上。嗯,原始图像有点太亮了,所以如果我们将它变暗一点,以便更清楚地看到车道线就好了(是的,我知道,这没什么大不了的,但找到使算法更好的方法总是好的)
左:直接向图像添加行。右图:使用 cv2.addWeighted 函数
所以我们要做的就是调用 cv2.addWeighted 函数。
lanes = cv2.addWeighted(copy, 0.8, black_lines, 1, 1)
该函数为实际图像中的每个像素赋予 0.8 的权重,使它们略暗(每个像素乘以 0.8)。同样,我们将权重 1 赋予所有车道线的涂黑图像,因此其中的所有像素保持相同的强度,使其突出。
我们几乎走到了路的尽头。我们要做的就是调用这些函数,所以现在就开始吧:
copy = np.copy(image1)
grey = grey(copy)
gaus = gauss(grey)
edges = canny(gaus,50,150)
isolated = region(edges)lines = cv2.HoughLinesP(isolated, 2, np.pi/180, 100, np.array([]), minLineLength=40, maxLineGap=5)
averaged_lines = average(copy, lines)
black_lines = display_lines(copy, averaged_lines)
lanes = cv2.addWeighted(copy, 0.8, black_lines, 1, 1)
cv2.imshow("lanes", lanes)
cv2.waitKey(0)
在这里,我们简单地调用我们之前定义的所有函数,然后在第 12 行输出结果。 cv2.waitKey 函数用于告诉程序图像显示多长时间。我们将“0”传递给该函数,这意味着它将等待,直到按下一个键来关闭输出窗口。
下面是输出的样子
输出应该是什么样子
我们也可以将同样的算法应用于视频。
video = r”D:\users\new owner\Desktop\TKS\Article Lane Detection\test2_v2_Trim.mp4"
cap = cv2.VideoCapture(video)
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:#----THE PREVIOUS ALGORITHM----#
gaus = gauss(frame)
edges = cv2.Canny(gaus,50,150)
isolated = region(edges)
lines = cv2.HoughLinesP(isolated, 2, np.pi/180, 50, np.array([]), minLineLength=40, maxLineGap=5)
averaged_lines = average(frame, lines)
black_lines = display_lines(frame, averaged_lines)
lanes = cv2.ad1dWeighted(frame, 0.8, black_lines, 1, 1)
cv2.imshow(“frame”, lanes)
#----THE PREVIOUS ALGORITHM----#
if cv2.waitKey(10) & 0xFF == ord(‘q’):
break
else:
break
cap.release()
cv2.destroyAllWindows()
这段代码将我们为图像创建的算法应用到视频中。请记住,视频只是一堆图片,一个接一个地快速出现。
- 第 1–2 行:定义视频的路径
- 第 3–4 行:捕获视频(使用 cv2.videoCapture ),并遍历所有帧
- 第 5–6 行:读取框架,如果有框架,继续
- 第 10–18 行:复制前面算法中的代码,将所有使用 copy 的地方替换为 frame ,因为我们要确保我们操作的是视频的帧,而不是前面函数中的图像。
- 第 22–23 行:显示每一帧 10 秒,如果按下按钮“q ”,退出循环。
- 第 24–25 行:它是第 5–6 行 if 语句的延续,但是它所做的就是如果没有任何框架,就退出循环。
- 第 26–27 行:关闭视频
好吧,你刚刚建立了一个算法,可以检测车道线!我希望你喜欢构建这个算法,但不要就此打住,这只是进入计算机视觉世界的一个介绍项目。尽管如此,你可以向你的朋友炫耀你的产品:)
关键要点
- 使用高斯模糊移除图像中的所有噪点
- 使用 canny 边缘检测来隔离图像中的边缘
- 使用按位 And 函数隔离对应于车道线的边
- 使用霍夫变换将边缘变成线条
关键词
如果你很好奇,这里有与这个算法相关的关键术语,你可以更深入地研究。
- 高斯模糊
- 按位和二进制
- Canny 边缘检测
- 霍夫变换
- 梯度
- 极坐标
- OpenCV 车道线检测
要考虑的其他资源
后续步骤
那么在这之后去哪里呢?在计算机视觉的世界里,有许多东西需要探索。以下是一些选择:
- 研究更先进的探测线路的方法。提示:查看 Udacity 自动驾驶汽车纳米学位教学大纲。
- 调查不同的计算机视觉算法,这里有一个很棒的网站
- 看看 CNN 的,这里有我关于理论和代码的文章。
- 将其应用于 Arduino/RasperryPi 上的自动驾驶遥控汽车
- 还有更多…
这是一个总结!
感谢阅读我的文章,我真的希望你喜欢它,并从中获得一些价值。我是一名 16 岁的计算机视觉和自动驾驶汽车爱好者,喜欢构建各种机器学习和深度学习项目。如果你有任何问题,顾虑,对教程的要求,或者只是想打个招呼,你可以通过 Linkedin 或者 Email me 联系我。
对回归概念的深入探究
弗兰基·查马基在 Unsplash 上拍摄的照片
回归背后的数学
回归是机器学习中最重要的概念之一。在这篇博客中,我们将讨论不同类型的回归和基本概念。
回归类型的变化如图所示:
回归的详细表示
我们将详细讨论所有要点。
线性回归
回归任务处理从一组独立变量(即提供的特征)中预测因变量的值。比方说,我们想预测一辆汽车的价格。因此,它成为一个因变量,比如 Y,而发动机容量、最高速度、级别和公司等特征成为自变量,这有助于构建方程以获得价格。
现在,如果有一个特征,比如说 x。如果因变量 y 线性依赖于 x,那么它可以由 y=mx+c 给出,其中 m 是方程中该特征的系数,c 是截距或偏差。M 和 C 都是模型参数。
说红叉是点。X1 是特征值,Y1 是预测值,Y_pred 1 是实际目标值。这里我们可以看到 X1 的预测值和实际值是相同的。但是,对 X2 来说,它们是不同的。因此,我们的工作是给出一条最佳拟合线,准确地描绘出因变量和目标变量之间的关系。现在,首先随机初始化模型参数 M 和 C,比如 M1 和 C1,如图中第 1 行所示。很明显,这条线不太合适。然后我们移到由参数 M2 和 C2 给出的第 2 行。这条线提供了一个更好的拟合,并作为我们的回归。它不会总是给出精确的拟合,但它给出了可能的最佳拟合。
那么,问题就来了,我们如何从第一行到达第二行?答案在于成本函数和梯度下降的概念。为了获得最佳拟合线,我们在一组给定值上训练模型,该给定值由特征值和相应的目标值(Y 实际值)组成。因此,我们在目标方程 y=Mx+C 中拟合特征值,我们获得 Y _ 预测值。我们的目标是减少 Y _ 预测值和 Y _ 实际值之间的差异。
为此,我们使用一个损失函数或成本函数,称为均方误差(MSE)。它由因变量的实际值和预测值之差的平方给出。
MSE = 1/2m *(Y _ actual-Y _ pred)
如果我们观察这个函数,我们会看到它是一条抛物线,也就是说,这个函数本质上是凸的。这个凸函数就是梯度下降法中用来获得 M2 和 C2 值的原理。
梯度下降
这种方法是最小化损失函数和实现我们目标的关键,我们的目标是预测接近原始值。
在这张图中,我们看到了损失函数图。为了找到最小损失函数值,我们需要找到一个特定的全局最小值。因此,我们总是试图使用一个凸形的损失函数来得到一个合适的最小值。现在,我们看到预测结果取决于等式 Y=Mx +C 或 Y=Wx+C 中的权重/系数。图中 X 轴上的权重和 Y 轴上的相应损失值。最初,模型为特征分配随机权重。假设它初始化了权重=a,我们可以看到它产生了一个损失,这个损失远离最小点 L-min。
现在,我们可以看到,如果我们将权重更多地移向 x 轴的正方向,我们可以优化损失函数并实现最小值。但是,模型怎么知道呢?我们需要优化权重以最小化误差,因此,显然,我们需要检查误差如何随权重变化。为此,我们需要找到误差相对于重量的导数。这个导数叫做梯度。
渐变= dE/dw
其中 E 是误差,w 是重量。
让我们看看这是如何工作的。比方说,**如果损失随着重量的增加而增加,那么梯度将是正的,**那么我们基本上在 C 点,我们可以看到这个陈述是正确的。如果损失随着重量的增加而减少,那么梯度将为负。我们可以看到 A 点,对应着这样一种情况。现在,从 A 点我们需要向 x 轴的正方向移动,梯度是负的。从 C 点开始,我们需要向负 x 轴移动,但是梯度是正的。**因此,梯度的负值总是表示权重应该移动的方向,以便优化损失函数。**因此,梯度以这种方式指导模型是增加还是减少权重,以便优化损失函数。
模型找到了移动的方向,现在模型需要找到应该移动多少重量。这由称为的参数决定,学习率由α表示。我们看到的图表中,重量从 A 点移动到距离为 dx 的 B 点。
dx = alpha * | dE/dw |
因此,移动的距离是学习率参数α和误差变化幅度与该点权重变化的乘积。
现在,我们需要非常仔细地决定学习率。如果它很大,权值会有很大的变化,会超过最佳值。如果它非常低,它需要很小的步骤,需要很多步骤来优化。根据以下公式改变更新的权重。
w = w—alpha * | dE/dw |
其中 w 是之前的权重。
对于每个时期,模型根据梯度移动权重以找到最佳权重。
因此,使用该过程,我们获得了模型参数 M2 和 C2 的最终值,这给了我们实际的最佳拟合线。
回归的类型
- 单变量、双变量和多变量
我们在上面的例子中看到,我们将因变量表示为单个自变量的函数,因此我们使用 y=wx+c。这种类型的回归称为单变量,因为只有一个自变量。
如果方程中有两个自变量,则变成:
Y=w1x1+w2x2+c
这被称为双变量回归。
现在,如果有两个以上的独立变量,即因变量依赖于两个以上的特征,则相应地修改等式。
Y=w1x1+w2x2+w3x3+……………+wkxk+c
这叫做多元回归。
2.线性和多项式
到目前为止,我们已经看到了线性回归问题,即每个自变量的次数为 1。
现在,如果我们有一个如下所示的非线性曲线,我们就不能画了
非线性曲线
最佳拟合线,如果我们使用线性回归。在这种情况下,我们必须选择多项式回归。多项式回归将要素或独立变量提升到幂,并创建多项式方程而不是线性方程。它被给出为:
Y=w1x1 +w2x2 + w3x3 +w4x4⁴ +…………+wkxk^k +c
现在,这里的 w1,w2,w3 ……wk 是模型的参数,幂是模型的超参数。所以,多项式的次数也是一个超参数。
假设 y=ut+1/2gt 是一个给定的方程,u 和 1/2g 是模型系数或参数。
这被称为多项式回归。
里脊回归
让我们考虑一种情况:
现在,这里的红点表示训练集的点,蓝点表示测试集的点。我们可以看到,如果我们使用红点进行训练,我们将获得红线(1),作为回归直线,但是非常明显的是,线(1)将具有非常差的泛化能力,并且不会在测试数据上令人满意地执行。这种情况被认为具有导致过度拟合的高方差。这就是岭回归发挥作用的地方。它修改了成本函数并增加了正则项。如果我们仔细观察,我们会发现第(2)行是一个更好的概括,并且会执行得更好。线(1)对于以下等式具有非常高的权重和系数值:
Y=w1x1+w2x2+………………+wkxk。
这导致了过度拟合。岭回归背后的思想是惩罚权重或系数的平方和,以带来正则化效果。比方说,我们的等式是
Y_pred=w1x1+w2x2
损失函数变成:
损耗= 1/2m。(Y _ actual—Y _ pred)+λ/2m。(w1 + w2)
第二部分是正则化部分,其集中于惩罚权重或系数,并防止它们达到高值。由于该函数是我们的损失函数,梯度下降也导致对权重的检查,因为权重的增加反过来增加了损失函数。
λ参数是通过交叉验证决定的,它是衡量我们在多大程度上专注于调整我们的权重的指标。λ的值越大,正则化程度越大。因此,lambda 解决了一个权衡问题。
这种技术也用于神经网络的 L2 正则化。
套索回归
Lasso 回归也解决了线性回归中同样的过度拟合问题。区别在于损失函数的修改方式。套索回归惩罚的是权重之和的绝对值,而不是权重的平方。
如果我们的等式是
Y_pred=w1x1+w2x2
损失函数变成:
损耗= 1/2m。(Y _ actual—Y _ pred)+λ/2m。(|w1| + |w2|)
现在,如果权重值太小,它们几乎等于 0。如果 w2 等于 0,w2x2 变为 0,这表明特征 x2 对于 y 的预测不重要
因此,套索回归被用于特征选择机制。
相同的逻辑用于神经网络的 L1 正则化。
分类任务
任务的类型包括基于一组特征将实体分类到一些给定的类中。逻辑回归用于分类任务。
为什么不是线性回归?
线性回归通常基于构建最佳拟合线。让我们先看看如何使用线性回归进行分类。
如果我们观察上面的图像,“1”表示一个类,“0”表示另一个类。如果我们得到最佳拟合线和虚线边界(如图所示),我们就可以很容易地用它来分类。当投影到最佳拟合线上时,蓝点或 0 级总是小于 0.5,这是由虚线提供的判定边界值。相应地,1 级或红点给出大于 0.4 的值。
现在,让我们来看看问题。
让我们考虑下面的情况:
在这里,我们可以看到由于异常值而导致的最佳拟合线偏移,这可能会在分类中产生错误,从而导致不令人满意的结果。同样,一些点将给出小于 0 和大于 1 的 y 值。因此,使用线性回归,y 可以取从-无穷大到+无穷大的值,但是对于分类问题,y 的范围必须从 0 到 1。
以上几点是线性回归不能用于分类任务的原因。
逻辑回归
我们知道,
Y= w1x1+w2x2+w3x3………wkxk
用作线性回归的方程式。
现在,RHS -infinity 到+infinity 的值。因此,我们必须将 LHS 变换到从-无穷到+无穷的范围内。
为了实现这一点,我们使用 log(Y/1-Y)作为 LHS。
log(Y/1-Y)= w1x1+w2x2+w3x3………wkxk
= > y = 1/1+e^-(w1x 1+w2x 2+w3x 3………wkxk)
=> Y= 1/(1+e^-transpose(theta).x)
其中,转置(θ)。x=( w1x1+w2x2+w3x3………wkxk)
现在,
Y=1/(1+e^(-转置(θ)。x))
也称为 Sigmoid 函数,范围从 0 到 1。θ描述系数向量或矩阵的权重,x 是特征矩阵。
上图显示了 Sigmoid 函数。0.5 是函数的边界,不取小于 0 大于 1 的值。
现在,如果 sigmoid 函数由 Y 轴上的 h(x)给出,则是 g 的函数(transpose(theta)。X)在 X 轴上,那么,
h(x)=g(转置(θ)。x)
我们可以得出以下结论,
h(x)>0.5
=>g(转置(θ)。x)>0.5
= >转置(θ)。x>0
再说一遍,
h(x) <0.5
=> g(转置(θ)。x) <0.5
=>转置(theta)。x <0
So, if 转置(theta)。x,即 w1x1+w2x2+w3x3………wkxk > 0 如果 w1x1+w2x2+w3x3,则实体被分类为 1 类…wkxk < 0,实体归类为 0 类。
决策边界如下所示:
绿线表示决策边界,等式表示该线的等式。现在,从线性代数中,我们知道,如果我们选择一个点(a,b,c,d)并将其拟合到方程中,如果它在线上,结果将大于 0,如果它在线下,结果将小于 0。这个类比和我们上面看到的非常相似,class 1 if w1x1+w2x2+w3x3………wkxk > 0 和 class 0 if w1x1+w2x2+w3x3………wkxk < 0。
这就是逻辑回归的工作原理。
损失函数
在线性回归的情况下,我们使用 MSE 或均方差。MSE 由下式给出:
MSE =(Y _ actual-h(x))
h(x)= w1x1+w2x2+w3x3………wkxk
在这种情况下,MSE 是一个抛物线函数,并且是一个具有明显最小值的纯凸函数。但是在这种情况下,
h(x)= 1/(1+e^-(w1x 1+w2x 2+w3x 3………wkxk))
现在,成本函数的修改扭曲了它的凸性,并且现在有多个最小值。除此之外,如果我们使用 MSE,误差的大小将非常小,最大值(1–0)= 1,因为 Y 可以取的最大值是 1,最小值是 0,惩罚也是如此。
由于该区域,我们使用对数损失或二元交叉熵进行逻辑回归。
比如说,Y_pred=h(x),那么,成本(h(x),Y_actual)=
—Y _ actual = 1 时的 log(h(x))
-Y _ actual = 0 时的 log(1 — h(x))
将两者结合起来,该方程被构造为:
损失=—Y _ 实际。log(h(x))—(1—Y _ actual . log(1—h(x)))
如果 Y_actual=1,第一部分给出误差,否则第二部分给出误差。
上图显示了对数损失或二元交叉熵。如果实际标签为 0,而预测标签向 1 移动,则损失函数接近无穷大,反之亦然。所以,损失多了,罚款也多了。
逻辑回归的类型
有三种逻辑回归,
- 二项式回归
- 多项式回归
- 有序回归
定义在开头的图表中给出。我们将讨论二项式和多项式逻辑回归。
二项式回归是对两个类别进行分类,比如猫和狗。它的行为方式与上面讨论的方式相同。
多项式逻辑回归或多类分类
在这种情况下,存在多个类别,一个实体可以被分类为。例如,有四个类,猫、狗和狮子。图像可以被分类为这三类中的任何一类。这是多项式分类的一个例子。需要注意的一点是,这三个类是相互独立的。
为了解决这些问题,我们主要是将多项逻辑回归转换为二项式回归。
有两种方法:
- **简单方法:**该方法为 K 个单独的类中的每一个创建 K 个单独的逻辑回归模型。每个模型都有一个 sigmoid 输出节点,表示该特定类的输出。对于我们的模型,将有 3 个乙状结肠节点,第一个用于猫,第二个用于狗,等等。现在,第一个节点给出图像是猫 P_c 的概率,第二个节点给出图像是 P_d 的概率,类似地,我们得到狮子的 P_l。现在,比较分数以获得最终答案。如果 P_c 在所有 3 个中具有最大值,则图像被预测为猫。
- **同步方法:**该方法创建 K-1 个独立的逻辑回归。每一个概率都被认为是一组独立的事件,即节点不是决定一幅图像是猫还是狮子(0/1),而是决定这幅图像是猫还是狮子(A/B)。
现在,我们已经看到了逻辑回归:
log(Y/1-Y)= w1x1+w2x2+w3x3………wkxk
如果 Y = > 0.5 类 else 类所以,Y 可以说 P(A),1-Y 等价于 P©。这被称为**赔率。**因此,对于第一个模型:
log(P(A)/P©)= w1 _ 1x1 _ 1+w2 _ 1x 2 _ 1+w3 _ 1x 3 _ 1………wk_1xk_1+b_1
比如说,R1 = w1 _ 1x 1 _ 1+w2 _ 1x 2 _ 1+w3 _ 1x 3 _ 1………wk_1xk_1+b_1
P(A)/P©= exp(R _ 1)———1
再次对于第二个模型,
log(P(B)/P©)= w1 _ 2 x1 _ 2+w2 _ 2 x2 _ 2+w3 _ 2 x3 _ 2………wk_2xk_2 + b_2
比如说,R _ 2 = w1 _ 2 x1 _ 2+w2 _ 2 x2 _ 2+w3 _ 2 x3 _ 2………wk_2xk_2 + b_2
P(B)/P©= exp(R _ 2)———2
现在,根据上面的等式 1 和 2:
P(A)=P©*exp(R_1)
P(B)=P©*exp(R_2)
现在, P(A)+P(B) +P© =1
所以,P©* exp(R1)+P©* exp(R2)+P©= 1
p©= 1/(1+exp(R1)+exp(R2))
因此,我们可以将它们联系起来。
Softmax 回归
Softmax 回归由下式给出:
softmax 图层用作多类分类的最终图层或输出图层。该函数是一种指数方法。所有类别的概率之和等于 1。最大可能类作为输出给出。
结论
在本文中,我们已经讨论了与回归相关的所有概念。希望这有所帮助。
深入了解变压器架构—变压器模型的开发
自然语言处理转换器
自然语言处理转换器
自从自然语言处理(NLP)的世界被由瓦斯瓦尼等人 发表的开创性的“注意力是你所需要的”论文所改变以来,似乎已经过去了很长时间,但事实上那还不到 3 年。变压器架构的引入相对较晚,并且它们已经颠覆了语言任务,这表明了机器学习和人工智能的快速发展。现在是深入了解变压器架构内部工作原理的最佳时机,尤其是变压器模型在各种新应用中取得巨大进展,如预测化学反应和强化学习。
无论您是老手还是第一次关注 transformer 风格的架构,本文都应该为您提供一些帮助。首先,我们将深入探讨用于构建最初的 2017 Transformer 的基本概念。然后,我们将触及后续 transformer 模型中实现的一些开发。在适当的地方,我们将指出一些限制,以及从原始变压器继承思想的现代模型如何试图克服各种缺点或提高性能。
变形金刚是做什么的?
变压器是当前处理序列的最先进的模型类型。也许这些模型最突出的应用是在文本处理任务中,其中最突出的是机器翻译。事实上,变形金刚及其概念后代已经渗透到自然语言处理(NLP)的几乎每一个基准排行榜中,从问题回答到语法纠正。在许多方面,变压器架构正在经历发展的高潮,类似于我们在 2012 年 ImageNet 竞赛后看到的卷积神经网络,有好有坏。
变压器表示为一个黑匣子。整个序列(图中的 x)以前馈方式同时解析,产生变换的输出张量。在这个图中,输出序列比输入序列更简洁。对于实际的 NLP 任务,词序和句子长度可能会有很大的不同。
不同于 NLP 的先前最先进的架构,例如 RNNs 和lstm的许多变体,没有循环连接,因此没有先前状态的真实记忆。变形金刚通过同时感知整个序列来解决记忆缺失的问题。也许一个变形神经网络感知世界有点像电影中的外星人到来 。严格地说,未来元素通常在训练期间被掩盖,但除此之外,该模型可以在整个序列中自由学习长期语义依赖性。
变形金刚去掉了循环连接,同时解析整个序列,有点像 Arrival 中的七足动物。你可以使用 flxb 2(https://github.com/FlxB2/arrival_logograms)的开源 python2 库制作自己的 logograms。
作为仅前馈模式,变压器对硬件的要求略有不同。变形金刚实际上更适合在现代机器学习加速器上运行,因为与递归网络不同,它没有顺序处理:模型不必处理一串元素来开发有用的隐藏细胞状态。转换程序在训练期间可能需要大量内存,但是以降低的精度运行训练或推理有助于减轻内存需求。
迁移学习是在给定的基于文本的任务中达到最先进水平的一个重要捷径,坦白地说,对于大多数预算有限的实践者来说是必要的。培训一台大型现代变压器的能源和财务成本很容易使单个研究人员的年总能耗相形见绌,如果使用云计算,成本将高达数千美元。幸运的是,类似于计算机视觉的深度学习,专门任务所需的新技能可以转移到大型预训练的变形金刚上,例如从拥抱脸库下载。
变压器架构中的注意机制是什么?
变压器架构中的秘密酱料是纳入了某种注意力机制,2017 年的原版也不例外。为了避免混淆,我们将把瓦斯瓦尼等人演示的模型称为“变形金刚”或“普通变形金刚”,以区别于类似名称的继任者,如 Transformer-XL。我们将从关注机制开始,向外构建整个模型的高层次视图。
注意力是一种有选择地对输入数据中的不同元素进行加权的手段,这样它们将对下游层的隐藏状态产生调整后的影响。vanilla Transformer 通过将输入单词向量解析为键、查询和值向量来实现注意力。键和查询的点积提供了注意力权重,使用 softmax 函数对所有注意力权重进行压缩,使得总权重总和为 1。对应于每个元素的值向量在被馈送到后续层之前根据它们的注意力权重被求和。一下子理解这些可能有点复杂,所以让我们放大图片,一步一步地看一下。
词向量嵌入赋予语义
从构成句子的单词序列开始,序列中的每个元素(单词)首先被转换成称为单词向量的嵌入式表示。词向量嵌入是一种更微妙的表示,而不是像 Salakhutidinov 和 Hinton 在他们 2007 年的语义散列论文中使用的一次性编码词袋模型。
单词嵌入(有时也称为记号)是有用的,因为它们以神经网络可以理解的数字方式传递语义。习得的单词嵌入可以包含上下文和关系信息,例如,“dog”和“puppy”之间的语义关系大致相当于“cat”和“kitten”,因此我们可以像这样操作它们的单词嵌入:
点产品注意细节
香草变压器注意机制详解。
从上图的左上角开始,一个输入单词首先被一个嵌入函数标记化,用一个数字向量替换字符串“ALL ”,该向量将作为注意力层的输入。注意,唯一具有嵌入功能的层是第一编码器,每隔一层仅将前面的输出向量作为输入。关注层(图中的 W )根据输入计算三个向量,称为键、查询和值。键和查询的点积是一个标量,是给定位置的相对权重。
注意力机制并行应用于序列中的每个元素,因此每个其他元素也有一个注意力分数。这些注意力分数服从 softmax 函数,以确保总加权和为 1.0,然后乘以相应的值向量。所有元素的值,现在由它们的注意力分数加权,被加在一起。产生的矢量是构成输入序列的内部表示的矢量序列中的新值,该新值然后将被传递到前馈完全连接层。
到目前为止可能已经丢失的另一个重要细节是用于稳定 softmax 函数的缩放因子,即在将值输入到关注层使用的 softmax 函数之前,数字与关键向量中单元数量的平方根成反比。无论键和查询向量的大小如何,这对于让学习很好地工作是很重要的。在没有比例因子的情况下,当使用长键和查询向量时,点积将趋向于大值,将 softmax 函数的梯度推入相对平坦的区域,并且使得错误信息难以传播。
编码器层:6 种不同类型的普通变压器
如前所述,去除循环连接的一个有用的结果是,整个序列可以以前馈方式一次处理。当我们将上述自我关注层与密集前馈层结合时,我们得到一个编码器层。前馈层由两个线性层组成,其间有一个整流线性单元(ReLU)。也就是说,输入首先被线性层变换(矩阵乘法),然后结果值被限幅为总是 0 或更大,最后结果被馈送到第二线性层以产生前馈层输出。
Vanilla Transformer 使用了其中的六个编码器层(自我关注层+前馈层),然后是六个解码器层。Transformer 使用一种称为多头关注的自我关注的变体,因此事实上关注层将为每个序列元素计算 8 个不同的键、查询、值向量集。然后,这些将被连接成一个矩阵,并通过另一个矩阵乘法,产生适当大小的输出向量。
解码器层:6 种不同类型的香草变压器
解码器层拥有我们在编码器层中看到的许多功能,但增加了第二个关注层,即所谓的编码器-解码器关注层。与自我关注层不同,只有查询向量来自解码器层本身。键值向量取自编码器堆栈的输出。每个解码器层也包含一个自我关注层,就像我们在编码器中看到的那样,输入自我关注层的查询、键和值都是在解码器堆栈中生成的。
解码器层,不同于编码器层,增加了一个编码器-解码器注意子层。这六个组成了香草变压器的解码器。
现在我们有了编码器和解码器层的配方。要用这些组件构建转换器,我们只需制作两个堆栈,每个堆栈包含六个编码器层或六个解码器层。编码器堆栈的输出流入解码器堆栈,解码器堆栈中的每一层也可以访问编码器的输出。但是,要完全理解普通变压器是如何组装的,只剩下一些细节了。
全变压器概述。
最终部分:剩余连接、图层标准化和位置编码
像许多其他具有许多参数的极深度神经网络一样,当梯度没有像我们希望的那样从输入流向输出时,训练它们有时会很困难。在计算机视觉中,这导致了强大的 ResNet 风格的卷积神经网络。ResNets 是 residual networks 的缩写,它将最后一层的输入明确地添加到自己的输出中。通过这种方式,残差被保留在整个层堆栈中,梯度可以更容易地从输出处的损失函数一直流回输入。 DenseNet 架构旨在通过将输入张量和输出张量连接在一起,而不是相加,来解决相同的问题。在 vanilla Transformer 模型中,残差求和操作之后是层归一化,这是一种用于改进训练的方法,与批处理归一化不同,它对小批处理大小不敏感。
残差连接和图层归一化图。vanilla Transformer 的编码器和解码器层中的每个子层都采用了这种方案。
在 LSTMs 这样的递归体系结构中,模型可以在内部学习计数和测量序列距离。Vanilla Transformer 不使用递归连接,并同时感知整个序列,因此它如何了解哪个元素来自序列的哪个部分,尤其是当序列长度允许变化时?答案是基于衰减正弦函数的位置编码,它与序列元素嵌入连接。瓦斯瓦尼等人。还对学习的位置编码进行了实验,得到了几乎相同的结果,但推断使用正弦编码应该允许模型更好地概括训练期间看不到的序列长度。
变形金刚在深度学习中的影响和未来
2017 年推出的 vanilla Transformer 极大地破坏了基于序列的深度学习。通过完全去除循环连接,transformer 架构更适合在现代机器学习加速硬件上进行大规模并行计算。令人惊讶的是,vanilla Transformer 可以学习序列中的长期依赖性,事实上,vanilla Transformer 可以轻松学习关系的距离是有上限的。
Transformer-XL 是由戴等人于 2019 年推出的,旨在通过一种新的位置编码来解决这一问题,并且还引入了一种伪递归连接,其中键和值向量部分取决于先前的隐藏状态以及当前的隐藏状态。其他变压器变体包括仅解码器变压器(例如 OpenAI 的 GPT 和 GPT-2)、添加双向(即基于 BERT 的变压器)等。变压器是为序列设计的,在自然语言处理中有着最突出的应用,但变压器架构也适用于图像生成、强化学习(通过修改 Transformer-XL),以及化学。
有用的变压器架构资源
希望这篇文章已经帮助你建立了使用 NLP 和其他现代转换器架构的直觉。但是你不必为了尝试你自己的想法而成为一个英雄,从零开始建造和训练一个新的变形金刚。像 HuggingFace 这样的开源库提供了预先训练好的模型,你可以对这些模型进行微调以支持你的 NLP 项目。谷歌提供了一个笔记本,你可以用它来修改 tensor2tensor 库中的变形金刚模型。当然你也可以和变形金刚对话或者玩一个基于文本的地牢冒险游戏,由 OpenAI 的 GPT 2 作为地牢主人。根据你喜欢的抽象层次,上面的资源可能已经足够了,但是如果你不把代码放到概念中就不会开心,你可能会对哈佛 NLP 实验室的亚历山大·拉什和其他人的论文的代码注释版本感兴趣。
快乐变身!
R 中向量自回归的深入研究
让数据说话!让我们抛弃先验的期望。
什么是 VAR?
Christopher Sims 提出了向量自回归模型,这是一个多元线性时间序列模型,其中系统中的内生变量是所有内生变量滞后值的函数。这为传统的结构方程系统提供了一种简单而灵活的替代方案。VAR 可以对宏观经济数据进行信息建模,而不会强加非常强的限制或关系。本质上,这是一个宏观经济模型,没有太多的先验预期。
风险值的用途
var 非常有用,尤其是在宏观经济学领域。它被广泛用于模拟对实体经济的宏观经济冲击,并被大量用于政策模拟和预测。这是向量自回归的主旨和主要用途。首先,它是一个复杂的预测工具。我们将展示 var 如何比标准的单变量预测模型更好,特别是在确定长期趋势方面。大多数关于预测的实证研究表明,VAR 已经超越了传统的单变量预测模型和基于理论的结构方程模型。
除了预测,var 也是结构分析的有用工具。我们注意到 var 可以研究对冲击的反应。它可以精确定位传统单变量模型无法解决的波动来源。此外,var 有助于区分相互竞争的理论模型。
VAR 看起来怎么样
正如我们之前提到的,VAR 是一个多元线性时间序列模型,其中系统中的内生变量是所有内生变量的滞后值的函数。简单地说,VAR 本质上是一元自回归模型的推广。通常,我们将 VAR 记为 VAR(p ),其中 p 表示系统中自回归滞后的数量。考虑一个只有两个变量的 VAR 系统。
二元 VAR 系统
我们也可以把它写成矩阵形式
矩阵形式变量
VAR 的估计是一个由 OLS 方程得出的方程。我们基本上在每个方程上运行 OLS。我们发现估计是一致的,因为只有内生变量的滞后值在等式的右边。此外,估计也是有效的,因为所有的方程都有相同的回归量,这使得每个方程的变化最小化。这样做表明它本质上等价于一个广义最小二乘*。在这方面,无序列相关性的假设也成立。*
使用 Sims (1992)框架
我们现在将在一个实际的例子中应用在 VAR 中学到的许多概念。特别是,我们将使用 Sims (1992)利用菲律宾数据开发的框架。在这个模型中,我们将使用四个变量。这些是:
隔夜逆回购利率由菲律宾央行设定。从各方面来看,这是菲律宾央行控制的主要政策利率。
M1 货币供应量可从 BSP 网站获得
CPI 通货膨胀率由菲律宾统计局每月公布,根据拉斯佩里斯价格指数衡量价格的相对涨幅。
工业生产衡量工业部门所有商品的价值。
我们将首先估计一个反映关键经济反应的标准风险值。理论上和西姆斯都认为,对名义利率的冲击代表着货币政策冲击。对政策变量的冲击会同时影响所有其他变量。该变量受周期内所有其他变量的影响,并且排序在最后。最后,央行只观察具有滞后性的非政策变量。
预赛
我们从安装所需的包并使用 library()命令加载它们开始。对于这一部分,我们需要安装“VAR”包,该包将包含运行 VAR 和 SVAR 以及后续诊断测试和应用程序所需的大量命令。然后我们看到每个变量的图,并判断一些初始条件,如非平稳性。
如前所述,我们需要安装“vars”包。使用 install.packages("vars ")命令可以做到这一点。在此之后,我们将加载这个包以及我们的标准包和库套件,以便我们继续进行评估。
install.packages("vars")
library(vars)
library(mFilter)
library(tseries)
library(TSstudio)
library(forecast)
library(tidyverse)
安装和加载之后,是时候加载我们的数据集了。我们将使用 Sample_VAR.csv 文件,其中包含从 2003 年 1 月到 2020 年 2 月的所有变量的数据。该数据每月公布一次,可从 BSP 和 PSA 获得。我们使用 read_csv()命令读取数据集和 file.choose()命令打开一个对话框,供我们选择数据。在本例中,我们将数据集放在名为“mp”的对象下。如果你喜欢,随便你怎么命名。然后,我们使用 head()命令查看数据集的前几行,以检查它是否正确加载。文件和代码可以在这里找到:https://drive . Google . com/drive/u/0/folders/11 max h0 trxjuf 1y _ yh-AJXgxulHQwcBEn
mp <- read_csv(file.choose())
head(mp)
接下来,我们需要使用 ts()命令将数据集中的每个变量声明为一个时间序列。我们使用$符号从数据集中调用一个变量。所有变量都从 2003 年的同一天同一个月的 1 月 1 日开始。我们将频率设置为 12,因为我们要处理月度数据。
lnIP <- ts(mp$lnIP, start = c(2003,1,1), frequency = 12)
M1 <- ts(mp$M1, start = c(2003,1,1), frequency = 12)
CPI <- ts(mp$CPI, start = c(2003,1,1), frequency = 12)
RRP <- ts(mp$RRP, start = c(2003,1,1), frequency = 12)
我们也可以使用 autoplot()或 ts_plot()命令来可视化我们的系列。和以前一样,ts_plot()命令是一个更具交互性的版本,它使用 plot.ly 包作为基础。
ts_plot(lnIP)
ts_plot(M1)
ts_plot(CPI)
ts_plot(RRP)
时间序列图
同样,评估所研究的变量是否稳定也很重要。正如我们已经说过的,在我们的 VAR 中有稳定的变量是一个理想的情况,即使我们没有这些也能运行它。正如我们已经习惯的,让我们使用我们熟悉的测试。为简单起见,我们将使用 Phillips Perron,因此不需要指定滞后的数量。
pp.test(lnIP)
pp.test(M1)
pp.test(CPI)
pp.test(RRP)
在上面的估计中,我们发现所有的变量都是非平稳变量。请记住,拒绝零假设表明数据是稳定的。然而,我们仍然可以使用这些水平数据进行 VAR 估计。然而,你可以选择不同的数据,看看是否能提供更好的结果和预测。
正确估计
是时候正式评估我们的风险值了。我们首先需要将我们的 VAR 变量绑定在一起以创建系统。此后,我们将选择我们将使用的 VAR 后面的最佳滞后阶数。然后,我们将运行一个无限制的风险值估计,并看到结果。最后,我们将运行一些诊断,如自相关、稳定性和正态性测试。
第一步是建立 VAR 系统。这是通过 cbind()命令完成的,该命令实质上是对我们的时间序列进行分组。我们将按照我们认为合适的顺序来点这道菜。我们将把它存储在一个名为“v1”的对象中。然后,我们将使用 colnames()命令将变量重命名为下面的列表。
v1 <- cbind(RRP, lnM1, CPI, lnIP)
colnames(v1) <- cbind("RRP","M1","CPI", "lnIP")
在我们绑定变量并创建 VAR 系统后,我们将确定我们将使用的一些滞后顺序。为此,我们使用 VARselect()命令并使用我们刚刚创建的 v1 对象。我们将使用最大滞后阶数 15。该命令将根据 AIC、SBIC、HQIC 和 FPE 的多元迭代自动生成首选滞后阶数。
lagselect <- VARselect(v1, lag.max = 15, type = "const")
lagselect$selection
运行这些命令表明要使用的滞后阶数是 2。在西姆斯的研究中,他使用了 14 个滞后,这在美国数据中可能更为熟练,因为这些影响反映了更大的持久性。
我们现在将评估一个模型。我们使用 VAR()命令来估计 VAR。p 选项指的是使用的滞后数量。因为我们确定 2 lags 是最好的,所以我们把它设置为 2。我们让它成为一个典型的带有常数的无限制 VAR,我们将在系统中不指定任何外生变量。summary()命令列出了结果。
Model1 <- VAR(v1, p = 2, type = "const", season = NULL, exog = NULL) summary(Model1)
我们通常不解释 VAR 的系数,我们通常解释应用的结果。但是你会看到,我们在 VAR 中有每个滞后和每个方程的系数。每个等式代表 VAR 系统中的一个等式。
模型诊断
一个假设是残差应该尽可能地不自相关。这也是基于我们的假设,即残差是白噪声,因此与之前的周期不相关。为此,我们运行 serial.test()命令。我们将结果存储在对象 Serial1 中。
Serial1 <- serial.test(Model1, lags.pt = 5, type = "PT.asymptotic")Serial1
在这个测试中,我们看到残差没有显示自相关的迹象。然而,如果我们改变最大滞后阶数,有可能会出现自相关现象。因此,最好尝试多个滞后订单。
另一个要考虑的方面是异方差的存在。在时间序列中,我们称之为拱形效应,它本质上是时间序列中聚集的波动区域。这在一系列事件中很常见,比如当发布盈利电话时,股价可能会大幅上涨或下跌。在该区域或窗口中,可能会有过度的波动,从而改变残差的方差,远离我们的恒定方差假设。我们有模型来解释这些,这些模型是条件波动率模型,我们将在后面的章节中讨论。
Arch1 <- arch.test(Model1, lags.multi = 15, multivariate.only = TRUE)Arch1
同样,ARCH 检验的结果没有表明异方差的程度,因为我们没有拒绝零假设。因此,我们得出结论,在这个模型中没有拱效应。然而,像自相关测试一样,在后续的滞后阶数上记录滞后效应是可能的。
一个软的先决条件,但也是一个理想的条件是残差分布的正态性。为了测试残差的正态性,我们在 R 中使用 normality.test()命令,它引入了 Jarque-Bera 测试、峰度测试和偏斜度测试。
Norm1 <- normality.test(Model1, multivariate.only = TRUE)Norm1
基于所有三个结果,这一特定模型的残差似乎不是正态分布的。
稳定性测试是对结构断裂存在的一些测试。我们知道,如果我们不能测试结构突变,如果碰巧有一个,整个估计可能会被打乱。幸运的是,我们对此有一个简单的测试,它使用递归残差和的图。如果在图中的任何一点,总和超出红色临界界限,则可以看到该点的结构性断裂。
Stability1 <- stability(Model1, type = "OLS-CUSUM")plot(Stability1)
稳定性试验
根据测试结果,似乎没有明显的结构断裂。因此,我们的模型通过了这个特殊的测试
政策模拟
我们现在将转向常规 VAR 中的政策模拟。我们将做三个主要的,这是格兰杰因果关系,预测误差方差分解,以及脉冲响应函数。
我们将测试系统中每个变量与所有其他变量的总体格兰杰因果关系。我们说过,变量之间可能存在单向、双向或无因果关系。
GrangerRRP<- causality(Model1, cause = "RRP")
GrangerRRPGrangerM1 <- causality(Model1, cause = "M1")
GrangerM1GrangerCPI <- causality(Model1, cause = "CPI")
GrangerCPIGrangerlnIP <- causality(Model1, cause = "lnIP")
GrangerlnIP
所使用的命令适用于二元情况,但我们现在将在四元系统中使用它。你们中的一些人可能会尝试将 VARmodels 减少到两个变量,以查看更直接的解释。为了执行 Granger 因果关系测试,我们使用 causality()命令。根据研究结果,我们得出结论,CPI 格兰杰原因的其他变量,但没有看到相反的情况。也许粒度变量到变量的关系比变量到组的关系更有意义。
我们现在将转向脉冲响应函数。虽然我们可以获得比下面更多的脉冲响应函数,但我们将关注 RRP 中的冲击对系统中其他变量的影响
RRPirf <- irf(Model1, impulse = "RRP", response = "RRP", n.ahead = 20, boot = TRUE)
plot(RRPirf, ylab = "RRP", main = "RRP's shock to RRP")M1irf <- irf(Model1, impulse = "RRP", response = "M1", n.ahead = 20, boot = TRUE)
plot(M1irf, ylab = "M1", main = "RRP's shock to M1")CPIirf <- irf(Model1, impulse = "RRP", response = "CPI", n.ahead = 20, boot = TRUE)
plot(CPIirf, ylab = "CPI", main = "RRP's shock to CPI")lnIPirf <- irf(Model1, impulse = "RRP", response = "lnIP", n.ahead = 20, boot = TRUE)
plot(lnIPirf, ylab = "lnIP", main = "RRP's shock to lnIP")
脉冲响应函数
irf()命令生成 IRF,其中我们需要指定模型、脉冲序列和响应序列。我们还可以指定未来的周期数,以了解影响或冲击将如何随时间发展。然后,我们使用 plot()命令来绘制这个 IRF。IRF 的结果相当令人费解。请记住,RRP 中的这种增加不可能是 BSP 对其他变量所发生的事情的反应,因为它是首先订购的。如你所见,在(a)中,对 RRP 的冲击当然会增加 RRP,这将导致货币供应量(b)的轻微下降和产出(d)的下降。我们还发现,价格在短期内会上升,但之后会适度下降。克里斯托弗·西姆斯认为,这是一个令人困惑的结果。结果表明,上调存款准备金率后,价格会上涨。如果货币紧缩降低了总需求(lnIP ),从而降低了产出,那么它不可能与通胀联系在一起。他接着说,VAR 可能会被错误指定。例如,可能有一个 BSP 将达到的通胀领先指标,但它被错误地从 VAR 中忽略了。BSP 可以知道通胀压力即将到来,并通过提高利率来抵消通胀压力。
如果你回想一下基本的宏观经济学,像提高政策利率(利率)这样的紧缩性货币政策会导致产出下降。产出的下降通常会抑制通货膨胀,导致价格下降。然而,我们在这个模型中看到的是,在很大程度上,价格上涨了,这令人费解。据推测,在先前的估计中,政策利率的外生变动并不完全是外生的。换句话说,没有正确识别外部冲击。为了解决这个问题,西姆斯将商品价格加入其中。
我们现在把注意力转向预测误差方差分解。同样,我们可以追踪系统中冲击的发展来解释系统中所有变量的预测误差方差。为此,我们使用 fevd()命令。像 IRF 一样,我们也可以指定未来的周期数。在这种情况下,让我们只关注 RRP。
FEVD1 <- fevd(Model1, n.ahead = 10)
FEVD1
plot(FEVD1)
预测误差方差分解
我们可以在窗口(a)中清楚地看到,短期的 RRP(列 1)的预测误差是由于它本身。这是因为 RRP 在排序中被放在第一位,并且没有其他冲击同时影响 RRP。在更长的时间范围内,比如 10 个月,我们可以看到 CPI 现在约占 16%,货币供应量约占 2%。
使用 VAR 进行预测
正如我们已经说过的,我们也可以使用 VAR 进行预测。为此,我们使用 predict()命令并生成一个称为扇形图的东西,它通常用于以图形方式确定预测的置信度。我们将预测范围设定为未来 12 个月或全年预测。
forecast <- predict(Model1, n.ahead = 12, ci = 0.95)fanchart(forecast, names = "RRP", main = "Fanchart for RRP", xlab = "Horizon", ylab = "RRP")fanchart(forecast, names = "M1", main = "Fanchart for M1", xlab = "Horizon", ylab = "M1")fanchart(forecast, names = "CPI", main = "Fanchart for CPI", xlab = "Horizon", ylab = "CPI")fanchart(forecast, names = "lnIP", main = "Fanchart for lnIP", xlab = "Horizon", ylab = "lnIP")forecast
VAR 中的预测
该图显示,RRP 预计将略有下降,然后上升,M1 预计将下降,IP 也是如此。预计 CPI 将在最初几个月略有下降,然后温和反弹。请注意,这与 IRFs 不同,只是因为我们使用风险值作为预测工具,而不是政策工具。
结论
总之,我希望通过这个例子,你可以看到风险值方法的许多使用案例,以及为什么许多经济学家继续使用它的灵活性。除了纯粹的预测模型,它还有更多应用,如政策模拟、线性因果分析和预测误差分解。在 VAR 创立之前,经济学把一切都寄托在理论和实践上,认为经济变量必须遵循它们的规则。然而,在实践中,我们知道经济变量的行为方式可能与我们先入为主的观念不同。因此,预先设定预期可能会欺骗我们。
如果想要更实际的方法,可以考虑观看我在 YouTube 上上传的关于这个主题的视频。
参考
[1] Lütkepohl,H. 多重时间序列分析新入门。(2005).斯普林格科学&商业媒体。
[2]恩德斯,W. 应用计量经济学时间序列。约翰·威利的儿子们。
对抗错误信息的深度学习方法*
*标题由人工智能生成
作者:马丁·贝克、蕾切尔·米德、达拉西米·奥卢瓦尼伊、萨沙·奥佩拉、塞巴斯蒂安·奥索里奥、杰克森·罗斯、德罗夫·苏布拉曼尼安
假新闻的兴起迫使每个拥有社交媒体账户的人成为一名侦探,负责在分享之前确定一篇帖子是否真实。然而,假新闻仍然逃过我们的防线,在网上泛滥,由于真实用户的无知和粗心而被放大。正如 NBC 新闻的这篇文章所示,除了散布恐慌和错误信息,假新闻还有可能对公司和个人的声誉造成真正的损害。为了防止误传的直接和间接成本,需要更好的方法来检测假新闻。虽然一些假新闻是由真实的人写的,只是可信的虚构,但假新闻也可以通过深度学习模型大量生成,加剧了问题。到目前为止,计算机生成的文本很容易与真实的文字区分开来。然而,这个问题已经变得更加紧迫,因为这些自然语言生成模型的巨大改进意味着它们现在可以生成比以往任何时候都更可信的文本。
假新闻无处不在——问题是如何阻止它。
在过去的三年里,变形金刚席卷了自然语言处理任务。像长短期记忆架构这样的残余神经网络在几年前还是最先进的,但已经被 BERT(变形金刚的双向编码器表示)和 OpenAI 强大的新模型 GPT-2(生成式预训练变形金刚 2)等变形金刚超越。这些变形金刚现在以精确的分类和听起来像人类的文本生成引领着行业。作为一个例子,GPT-2 生成的样本如此逼真,以至于 OpenAI 最初拒绝发布完整的训练模型,理由是“担心该技术的恶意应用”
区分真假新闻很重要,但却是一个难以解决的问题,而且随着新模式的出现,这个问题变得更加困难。该项目旨在探索围绕假新闻的产生和检测的挑战性现实。
项目目标
- 通过比较来自长短期记忆(LSTM)残差神经网络和来自 OpenAI 的最新转换器(称为 GPT-2)的生成文本,创建自然语言生成模型改进的简要演示。
- 使用鉴别器来尝试准确地分类文本是由最先进的深度学习模型生成的还是由人类生成的。
项目概述
该项目分为两个主要部分,如上所述。第二部分——寻找、训练和使用鉴别器对生成的文本进行分类——预计将是一个重大挑战,因为计算机生成的文本已经变得非常难以与人类书写区分开来。
在这个过程的开始,研究和评估了许多模型。通常选择经过训练的模型版本,因为它们能够实现最先进的性能,而不需要几天的训练。LSTM 模型使用 Kaggle 数据集的子集进行了微调。用于微调的数据由来自纽约时报、布莱巴特、CNN、商业内幕、大西洋、福克斯新闻频道、谈话要点备忘录、Buzzfeed 新闻、国家评论、纽约邮报、卫报、NPR、路透社、Vox 和华盛顿邮报的文章组成。根据 Kaggle 上的文档,大多数文章来自 2016 年和 2017 年,少部分来自 2015 年及之前。OpenAI 在 GPT-2 的文档中写道,它应该在特定内容的任务上表现良好,如生成假新闻,无需微调或重新训练,因此使用了 GPT-2 的原始权重。
为了检测假新闻,GPT-2 模型被传递来自真实新闻文章的句子。从这个种子开始,模型生成了长达 500 多个标记的长文本。(记号可以认为是单词和标点符号。)结果,对于每一篇“真正的”文章,都有一个长格式的生成文本,它们共享一个共同的第一句话。每一个生成的文本和真实的文章都通过一个叫做 GLTR 的工具来比较它们的特征。最后,所有的文章被分成一个训练集或测试集,一个 BERT 二元分类器被训练来分类“假”文本。
第一部分:LSTM 与变形金刚
自从引入变形金刚以来,自然语言的生成已经有了很大的改进
模型选择和基本原理
该团队使用 LSTM(长短期记忆)架构和 transformer 架构探索了文本生成。在 2017 年推出变压器之前,LSTMs 一直被视为 NLP 任务的标准。这样可以进行比较,也可以检查该领域取得的进展。
LSTM(长短期记忆)是一种递归神经网络,它是一种试图对依赖于序列的行为进行建模的模型。这使得 LSTM 成为文本生成的可行候选。在 LSTM 架构中,有 LSTM 单元块来代替标准的神经网络层。这些单元由输入门、遗忘门和输出门组成。要深入了解 LSTM 的建筑(尤其是喀拉斯),可以在这里找到指南。
LSTM 模型最初是由德国计算机科学家于尔根·施密德胡伯和塞普·霍克瑞特尔于 1997 年提出的。他们的出版物描述了他们所做的研究,可以在这里阅读。自 1997 年以来,对 LSTM 进行了改进,例如增加了遗忘门以及在架构中从单元到门的连接。
该代码取自官方的 Keras 文档,最初用于从尼采的著作中生成文本。使用 LSTM 模型产生的一个问题是随机的,很难每次固定随机种子以获得 100%可重复的结果。因此,尽管 LSTM 模型的结果很有趣,但对于项目的目标来说,它并不是非常有用。
除了使用 LSTM 检查文本生成,该团队还使用 OpenAI 的转换器 GPT-2 生成了文本。自 2017 年 Vaswani 等人发表学术论文“注意力是你所需要的全部”以来,变压器架构通过使用一种称为注意力的技术,已经超越了以前模型的性能。米格尔·罗梅罗·卡尔沃在他写于 Medium 的文章中很好地解释了注意力是如何在转换器的编码器部分工作的,以及编码器和解码器是如何组合在一起形成一个转换器的。如果您已经熟悉这些架构,或者您对了解它们如何工作的更多技术方面不感兴趣,请继续阅读本文。你不需要应用这些概念来理解项目或其结果。
OpenAI 的 GPT-2 是代表从变形金刚模型生成最先进文本的明显选择。该架构是为文本生成而设计的,不像谷歌人工智能语言研究人员的另一个著名转换器 BERT。GPT 2 号也因其类似人类的性能产生了大量新闻。
GPT-2 模型是使用变压器解码器模块构建的,并且像传统语言模型一样,一次输出一个令牌。它使用字节对编码在其词汇表中创建标记。这意味着标记通常是单词的一部分。
GPT-2 是在一个 800 万网页的数据集上训练的,被认为是大约 40Gb 的互联网数据。根据 OpenAI 的说法,他们只使用由人类管理/过滤的页面——具体来说,他们使用来自 Reddit 的至少收到 3 个 karma 的出站链接。这给了模型一个自然书写的好主意。
这个语言模型有一个简单的目标:在给定某个文本中所有前面的单词的情况下,预测下一个单词。
GPT-2 至少有四个版本:
- “小型”模型:1.24 亿个参数,500MB 磁盘空间
- “中”:3.55 亿个参数,1.5GB 磁盘空间
- 【大】:7.74 亿个参数
- “超大”:15.58 亿个参数,称为“完整”或“真实模型”,可能占用超过 6.5 GBs 的空间
在所有这些模型可用的情况下,需要进行权衡:较大的模型往往整体表现更好,这意味着当使用较大的模型时,它们会创建更可信的文本,但需要更长的时间来微调和生成文本。为了利用所谓的类似人类的性能,同时仍然有一个足够轻的模型来运行许多文本生成,GPT-2 的“中等”版本被选择来代表模型的变压器类。
比较性能
LSTM 示例生成的文本(种子文本以粗体显示):
‘面对现实的本来面目,而不是本来的样子,或者如你所愿的样子’,说把 l 吃了,gadantural 就可以查斯而进入苏塞克斯和王子和萨门特的危局。最后一周的状态和比较和保护和病人的皇家剑桥的领导和帕特查尔斯和案件和地带第一次是从皇家和 raching 她是已知的和说的理由和条件根据免费的迪斯科舞厅,和接触的国家和一个和 retarry 报告君主和自我反省流浪的日子。以生为例,她说君主股自愿为天下之群而生。
给定文本,这种情况下的结果并不好。句子不连贯,有些词似乎没有意义。鉴于这是一个旧的 LSTM,一个基于 RNN 的生成器的新版本也被用来生成示例文本。这些改进的示范文本可以更好地比较 RNN 的性能。
RNN 示例生成的文本(种子文本以粗体显示):
**德克萨斯大学奥斯汀分校, tex。而且,一群记者从俄罗斯运动员的名单中,也同样,因为特朗普先生说,他将无法让开,但这在过去五年中并不罕见。华盛顿大学的一组研究人员在一份声明中说:“我们不会让我去学校,告诉我们他们在老房子外面的一个小镇上。“我们不会把你送到大学或学校。”我不想这么做,”特朗普组织的律师迈克尔说,他说,“我觉得我可以把他留在公寓里,这座城市的房子,美国总统说,政府已经“超过”证据。特朗普曾是叙利亚恐怖袭击的目标。这个国家大概有多少人口
这段文字虽然有点荒诞不经,不拘一格,但似乎更有条理,证明了基于 LSTM 的生成器可以很好地生成文本。相同的种子被传递给 GPT-2 生成器,以便更好地进行比较。
新 GPT 协议生成的文本样本(种子文本以粗体显示):
德克萨斯大学奥斯汀分校为想要帮助自己职业生涯的女性机器人学学生提供了一笔高达 6 万美元的奖学金。在该计划的在线部分,参与者将与该大学的一个研究团队合作,创建一个可以在物理空间导航的动画机器人。
普通大学生希望设计一个产品,实现一个想法,并有可能获得一份工作。提出“智能机器人实验室”概念的艺术家 Aritappa Chatterjee 说,这通常是不可能的,所以这种类型的项目创造了更多的就业机会。
奖学金提供给高中二年级、三年级或四年级的学生。
“学生们正在确定这些女性占主导地位的领域,所以我们…”
结果与预期相符:GPT-2 创造了可信的短文本,短文本越长,越偏离真实文本。虽然该模型能够保持一个连贯的结构,但仔细观察,其内容可能显得牵强。
该模型有一个“温度”设置,一个可以在 0 和 1 之间选择的超参数。温度越高,模型变得越“有创造性”,这意味着它不会添加最有可能的下一个单词,而是从更大的池中取样。因为使用了 0.7 的比较性能温度,这给出了看起来最一致的内容创建。
从例子中可以明显看出,GPT-2 在生成文本方面比基于 LSTM 的模型表现得更好。这里选择的例子可以被看作是“樱桃采摘”,但随机选择,通常代表了整体观察到的模式。
正在使用的文本生成的玩具示例
这篇文章的标题是由 arxiv.org 过去 6 个月的机器学习相关文章标题微调的 GPT-2 模型生成的。
生成标题
种子短语是本文的第一段:“假新闻的兴起迫使每个拥有社交媒体账户的人都成为一名侦探,负责在分享之前确定一篇帖子是否真实……”
完整的输出是:“调查社交媒体上的假新闻:首先打击错误信息的深度学习方法?”,粗体文本被保留为标题(!).
第二部分:假新闻检测
鉴别器
鉴别器是一种深度学习模型,它对不同生成过程产生的样本进行分类(鉴别)。鉴别器通常用于生成对抗神经网络(GANs ),它与生成模型一起工作,以迭代地改进生成过程,使其输出越来越接近“真实”的例子。一种类似的鉴别器被用来鉴别 GPT-2 产生的文本,但所用的过程并不包括对发生器和鉴别器的迭代训练。此外,人类很难识别生成的文本,因此对这种模型的潜在性能有很多怀疑。
从另一个角度来看这个问题,如果生成的文本和真实的文章共享相同的主题,那么生成的文本和真实的对应文本之间的相似性的度量可能有助于了解生成的文本的特征。基于“相似性”比较文本的第一种方法是一种称为 bertScore 的改进度量,它计算两个句子中单词的余弦相似性。
这种实现虽然表面上看起来很有前途,但并没有说明所使用的生成模型所展示的“创造性”。虽然相似性确实可以计算和进一步分析,但生成的文本在内容上与原始文本有很大差异。从一条关于新奖学金获得者的新闻中提取的种子句子可能会导致关于一个年轻而聪明的策划者的珠宝抢劫案的生成文本。在完全不同的上下文中评估相似性被证明对提供洞察力没有帮助,因为度量标准只是报告生成的文本与原始文章非常不同。
在评估这种相似性度量时,观察到生成的文本倾向于使用不太复杂的词汇,并且经常依赖于重复的短语。相比之下,最初的新闻文章更倾向于通过逻辑故事线流动,沿途经过不同的主题和想法。这一观察刺激了对诸如巨型语言模型测试室等工具的进一步研究,这些工具似乎也依赖于生成文本的复杂性和多样性。
这个 G iant L 语言模型TestRoom(GLTR)是由哈佛 NLP 和麻省理工学院-IBM 沃森人工智能实验室合作创建的。这个工具利用了一个模型,伯特或 GPT-2,它一个字一个字地查看这个词在句子中被选中的概率。在下面的图片中,绿色代表最有可能的前 10 个单词中的一个单词,黄色是前 100 个,红色是前 1000 个,紫色大于 1000 个。这意味着绿色单词是模型可能输出为下一个单词的单词,并且随着该单词变得不太可能被模型选择,它落入其他颜色箱中的一个。例如,下面的图片是一个人写的纽约时报文章的片段。这篇文章有几个可预测的词,但也包括许多生成模型不太可能选择的词。那是因为人类在书写时没有考虑到 最有可能是 的下一个单词;他们会考虑哪个词最适合文章的上下文以及他们想要表达的意思。
单词分布的差异显示在所示的四幅图像中。当使用带有 GPT-2 鉴别器的 GLTR 工具时,虚假文章(左上)比真实文章(右上)具有更高的高预测性单词分布。当对假文本(左下)和真文本(右下)使用 BERT 鉴别器时,发现了类似的模式。有了这两种鉴别器,在发电机和人类的词汇选择上就有了明显的区别。这支持了我们的直觉,即生成器只会基于单词的概率而不是基于上下文来构造文本。虽然这个项目没有开发一个数字度量来确定一个文本是否是计算机生成的,但是查看 GLTR 的输出可以提供一些见解。
针对上述限制,寻求第二种鉴别器。在研究假新闻鉴别器时,一些作者分享了他们使用 BERT 编码器结合某种分类器的成功经验。出于输出/输入兼容性的考虑,选择了 BERT 编码器和 BERT 二进制分类器的组合,并按照本例中的用 Python 实现了分类器。尽管原始 Medium 文章的作者对这种分类器寄予厚望,但该模型的计算成本很高(运行一个时期估计需要 15-21 小时),并且在该项目的实验运行中,无法以比简单猜测更好的速度对“真实”和生成的文本进行分类。有可能我们的实现过于简单,应该在传递到 BERT 编码器之前对输入进行额外的特性工程处理。或者,这种特征增强在 BERT 编码器和 BERT 二进制分类器之间可能是有用的。然而,为这个项目所做的工作没有提供任何有希望的迹象,表明这种额外的努力可能会产生预期的精度增益。
BERT 分类器的缺点表明了最先进的自然语言生成模型的优异性能。依靠复杂性和创造性的措施,结合整体一致性的措施的鉴别器是有潜力的。像 GPT-2 这样的模型可以骗过一个鉴别器,它只是简单地设置一个阈值,看看单词不在最有可能被选择的前 10 名或前 100 名中的频率。人们可以通过提高模型的温度来做到这一点,给它更多的自由来探索鉴别者可能认为“不太可能”的单词和概念。但是如果鉴别者也可以测量整篇文章的连贯性,那么它将更容易识别出这些文本是生成的,因为更多“创造性”的文本往往对阅读它们的人来说最没有意义。
未来工作的领域
- 创建一个侧重于复杂性/创造性的评分标准
- 创建一个使用此度量的虚假文本分类器
- 进一步考察“虚假”的特征
- 使用白盒对抗性攻击来观察哪些特征使文本更有可能是假的
结论
这个项目展示了自然语言生成模型在过去三四年中的进展:从 LSTMs 的不连贯到现在由 OpenAI 开发的听起来很流畅的 GPT-2 模型。撇开发展生成模型的这些进展不谈,人们可以看到这可能留给我们的危险境地。生成文本模型没有“真实”或“虚假”之分,因此听起来真实的生成模型几乎肯定会产生可信的“假新闻”展望未来,人工智能研究人员、学者和行业领袖将面临越来越不可能的任务,即找到识别生成文本的方法。