PowerBI RS:在触发模式下设置数据刷新
使用 Power BI 报告服务器数据库可以做许多在 Power BI 服务中不能做的事情,其中之一就是在报告数据集上设置触发数据刷新。
什么是触发模式下的数据刷新?
顾名思义,它将触发您的 PBI 报表的数据集来刷新事件。例如,当报表引用的数据源发生更改(添加、更改或删除)时,触发条件将被激活,以允许 PBI 报表立即刷新数据,并使 PBI 报表数据保持最新。典型的应用过程如下:
作者图片
为什么使用触发模式来刷新您的报告数据?
在 PBIRS 中,PBI 报表有两种主要的数据刷新类型:计划刷新和 DirectQuery。DirectQuery 使用户在每次使用报表时都能持续获得最新的数据,但缺点是当报表查询逻辑复杂时,可能会严重影响报表的性能。此外,计算引擎不支持某些 DAX 函数(如时间智能函数)。在计划刷新模式下,理论上,您的报告性能不会受到刷新行为的影响,您可以使用任何支持 PowerBI 的 DAX 函数,这很好,但是,您不能保证用户在使用报告时会获得最新的数据。
所以,这就成了一个很尴尬的事实。假设你需要开发一个报表,这个报表需要使用 DAX 时间智能函数(而不是 SQL),你必须保证用户在使用它的时候能及时看到最新的数据。那么,如何为数据集选择刷新模式呢?也许你会设置你的报表每一分钟刷新一次,但是如果你的报表数据比较多,不仅会增加数据刷新失败的概率还会给服务器造成一定的负担。因此,触发模式下的数据刷新成为了最佳解决方案。它结合了 DirectQuery 和计划刷新的优点。只有当数据发生变化时,才会执行数据刷新。这不仅可以确保用户在使用报表时可以看到最新的数据,还可以在不影响报表性能的情况下减轻服务器的负担。这就是为什么您应该在触发器模式下刷新报告数据。
如何实现?
首先,作为示例,我在数据库中创建一个表。如下图,我创建了一个新表,插入了三行数据——中国古代战国时期(公元前 475-221)的三大名将:白起、廉颇、王建,简单的像这样:
CREATE TABLE [TriggerRefreshTest]
(
[No_] int,
[Name] nvarchar(10),
[Country] nvarchar(20)
)Insert Into [TriggerRefreshTest]
values(1, 'BaiQi', 'The Kingdom of Qin'),(2, 'LianPo', 'The Kingdom of Zhao'),(3, 'WangJian', 'The Kingdom of Qin')
将数据导入 Power BI Desktop 并按如下方式发布:
作者图片
我们现在要达到的效果是,当我在数据库中插入一行新的数据——(李牧,赵国),然后立即触发一个数据刷新事件,使报表数据保持最新。在 SSMS,创建一个新的触发事件,如下所示:
作者图片
然后我们需要用 SQL 写一个触发脚本。对于没有学过 SQL 的读者来说还是可以的。可以直接使用下面的代码。我已经简化并优化了脚本。您只需要用您的报告信息替换下面的代码(我已经做了注释):
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOIF OBJECT_ID
(
N'trigger_data_refresh'
) is not nullDROP TRIGGER trigger_data_refresh;GOCREATE TRIGGER trigger_data_refresh
ON [TriggerRefreshTest] --Replace with your table name hereAFTER INSERT
AS
SET NOCOUNT ON;DECLARE @REPORT_NAME NVARCHAR
(
50
),
@REPORT_ID VARCHAR
(
100
),
@SUBSCRIPTION_ID VARCHAR
(
100
)
SET @REPORT_NAME = 'WarringStates' --Replace with your PBI report name.
SET @REPORT_ID =
(
SELECT TOP 1 [ItemID]
FROM [ReportServer].[dbo].[Catalog]
WHERE [Name] = @REPORT_NAME
)
SET @SUBSCRIPTION_ID =
(
SELECT TOP 1 SubscriptionID
FROM [ReportServer].[dbo].[ReportSchedule]
WHERE [ReportID] = @REPORT_ID
)BEGIN
WAITFOR DELAY '0:0:3'
exec [ReportServer].dbo.AddEvent
@EventType='DataModelRefresh',
@EventData=@SUBSCRIPTION_ID
ENDGO
最后,运行代码,这样我们的触发器刷新就设置好了。让我们在表中插入一个新行—[triggerefreshtest]:
Insert Into [TriggerRefreshTest]
values (4, 'LiMu', 'The Kingdom of Zhao')
现在,我们的触发机制已经检测到数据更改,因此数据刷新事件已被激活。返回 Power BI RS 的报告页面,点击“刷新”刷新缓存,可以看到,刚刚插入的数据立即显示在报告中!
作者图片
考虑
如果数据源表由多个用户维护,那么他们可能会同时修改数据,这可能会导致问题(比如表锁定)。我认为解决方案之一是强制最小刷新间隔。这可以通过修改存储过程来实现。
结束~
(本文中文首发于 2019 年 12 月D-BI)
具有强化学习的游戏级设计
“PCGRL”论文概述,介绍了一种通过训练 RL 代理程序生成游戏关卡的新方法。
程序性内容生成(或 PCG) 是一种使用计算机算法在游戏中生成大量内容的方法,如巨大的开放世界环境、游戏关卡和许多其他用于创建游戏的资产。
PCGRL 全文
今天,我想和大家分享一篇名为*PCGRL:通过强化学习的程序化内容生成的论文,它展示了我们如何使用自学习 AI 算法来程序化生成 2D 游戏环境。通常,我们熟悉使用称为强化学习的人工智能技术来训练人工智能代理玩游戏,但本文训练人工智能代理来设计游戏的级别。根据作者的说法,这是 RL 第一次用于 PCG 的任务。*
当前框架版本:0.4.0 通过强化学习生成程序内容的 OpenAI GYM 环境…
github.com](https://github.com/amidos2006/gym-pcgrl)
推箱子游戏环境
让我们看看论文的中心思想。考虑一个简单的游戏环境,比如游戏中的推箱子。
推箱子游戏关卡。
我们可以把这个地图或者游戏级别看作是代表游戏状态的 2D 整数数组。这种状态由可以编辑游戏环境的强化学习代理来观察。通过采取行动,如添加或删除游戏的某些元素(如固体盒,板条箱,球员,目标等。),它可以编辑这个环境给我们一个新的状态。
PCGRL 框架
现在,为了确保这个代理生成的环境是高质量的,我们需要某种反馈机制。在本文中,这种机制是通过使用手工制作的奖励计算器比较这个特定游戏的先前状态和更新状态来构建的。通过为游戏规则增加适当的奖励,我们可以训练 RL 代理生成特定类型的地图或关卡。这个框架的最大优点是,在训练完成后,我们可以通过点击一个按钮来生成几乎无限的独特游戏关卡,而不必手动设计任何东西。
RL 代理遍历和编辑游戏环境的三种方法。
本文还比较了 RL 代理可以用来遍历和编辑环境的不同方法。如果你想了解这些方法之间性能比较的更多细节,这里是研究结果的全文。
[ 来源通过训练有素的 RL 代理测试不同游戏的关卡设计。
一般研究方向
虽然本文实验中使用的游戏是简单的 2D 游戏,但这一研究方向令我兴奋,因为我们可以在这项工作的基础上创建大型开放世界 3D 游戏环境。
这有可能改变在线多人游戏体验。想象一下,如果在每个多人开放世界游戏的开始,我们可以每次都生成一个新的独特的战术地图。这意味着我们不需要等待游戏开发商每隔几个月或几年发布新地图,但我们可以在 AI 游戏中这样做,这真的很酷!**
感谢您的阅读。如果你喜欢这篇文章,你可以关注我在媒体、 GitHub 上的更多作品,或者订阅我的 YouTube 频道。
手机游戏。r 和“ggplot2 ”,看看亚马逊用户评论能告诉我们什么是最值得购买的智能手机
亚马逊用户的智能手机评论和一些可视化效果,看看人们最喜欢哪些品牌。
玛丽安·克罗恩在 Unsplash 上的照片
由于 web 服务的巨大增长和我们在过去十年中看到的数据爆炸,互联网上的大量评论数据令人震惊。像 IMDB 和 Yelp 这样的网站已经创建了完整的生态系统,对产品、电影、餐馆和个人进行比较和评论。大多数基于互联网的零售公司,如亚马逊或易趣,也已将评论纳入其采购平台,以创建一个以客户为中心的最佳产品层级。
数以千计甚至数百万计的评论散布在 Twitter 和脸书等社交媒体平台上,但也存在于零售网站和评论网站上。这些网站上有大量公开可用的数据,并且有巨大的空间来深入研究这些原始和非结构化的数据,以获得有可能为商业、市场研究和创新带来利润的见解。大多数评论也与评级相关联。一篇评论通常看起来像一个简短的段落,有一个标题,描述被评论的主题,然后是一个评级,通常是五分或十分。
网上有很多智能手机的原始消费者数据。与指派专家评论者来决定最好的手机相反,成千上万关于同一款手机的客户评论可以作为更平衡的最终用户意见挖掘的试金石。
数据
本项目使用的数据集可从 KaggleT5 这里 获得。
合并后的完整数据集包含 82,815 个条目,分为以下几列:
品牌:产品品牌:具有 10 个类别的分类变量
标题:产品标题:被评论产品的名称
url:产品 url:购买产品的 URL 链接
图像:产品图像 URL:产品图像的 URL 链接
评级:产品平均价格。评级:用户评论对产品的平均评级 Url:产品评论页面 URL:产品评论页面的 URL 总评论数:产品总评论数:产品价格总评论数:产品价格:产品的潜在价格范围
姓名:审核人姓名
评级:审核人评级(等级 1 至 5)
日期:审核日期:进行审核的日期
已验证:有效客户:客户是否为已验证的亚马逊客户标题:审核标题:审核的标题
正文:评论内容:评论的主要内容
有用的投票:有用的反馈:评论得到了多少反馈。
清洁和争论
初始清洗过程的第一步是移除被认为不需要的色谱柱。图片、网址、姓名、评论者网址、正文和有用的投票已被删除。标题栏(已经合并)和用户评分栏也被删除。
在检查了“价格”变量后,完成了初始清洁过程的下一步,由于 NA 的数量很大,并且许多行都有一个价格数字范围,因此决定不将该变量包括在研究中。
最初争论过程的第一步是获取两个数据集并执行“左连接”以创建一个合并的数据集。这是使用“ASIN”ID 作为合并的键来完成的。
下一步是将每个评论的标题与评论的实际内容结合起来,创建一个包含标题和评论正文的超级专栏。
观想主题
该项目涵盖了许多品牌的手机和一个解决方案的配色方案,将尊重所有手机的品牌完整性,同时表达了品牌的多样性。我们决定用一系列类似彩虹的颜色作为三个观想的主题,以保持它们之间的一致,并突出观想者对信息的中立性。
视觉呈现从微观到宏观。第一种视觉化聚焦于评论的总体概述;关于手机,最常见的词汇和情感是什么?
下一个可视化更深入一步,关注用户对特定品牌的感受。我想向用户展示市场上最受欢迎的品牌是什么。
一介词云
需要进行一些额外的清理,以使一些东西值得注意,所以一些常见的英语“停用词”(无助于理解情感的词,如连词和代词)和标点符号被从集合中删除,因为它们在这种情况下对分析情感没有用处。
创建前十个单词的术语文档矩阵,以评估哪些单词在集合中出现得最频繁。从 TDM 中可以清楚地看到,由于一些关于手机的显而易见的词频繁出现,需要将更多的词添加到停用词列表中。例如,单词“电话”是最流行的(不奇怪,考虑到它们是电话评论)
作者图片
前一万篇评论的样本(由于大量数据的内存错误,不可能包含所有评论)。然后,需要将这些列转换成文本文件,以便对它们进行适当的操作。下一步是将文档中所有不必要的字符变成空白。
从这里开始,所有的文本都被转换成小写,以使内容标准化,并在这种形式下看起来更具视觉吸引力。
见识
当人们评论手机时,什么想法和观点最流行?。这是亚马逊手机评论的总体视图,也是数据集内容的总体视图。
“随机顺序”参数被设置为 false,因此可以很容易地理解哪些词在评论中出现频率最高。单词的最大数量被设置为 200,以便不使图表过载,单词只需要出现一次就可能被包括在内。
选择了“Dark2”配色方案,限定为八种颜色。这符合一开始设定的彩虹配色方案,也最大限度地减少了试图理解一个有太多颜色的图表的心理负担。
这种可视化与评论内容的总体视图相关,旨在回答关于电话的总体情绪和语言使用的问题。
更深入的观察…
作者图片
这种可视化的第一个清理元素是标准化“标题”变量的名称,因为由于不可见的字符,功能正在减少。
扯皮:
对于这一个,有必要找到具有最佳评级的品牌,因此创建了一个新变量,它将为每个品牌保存一行,与此相关联的值将是所有品牌评论的平均值的组合。
使用“重新排序”功能从最低到最高显示评级也很重要,以明确显示等级中的最佳品牌。
见识
viz 试图回答亚马逊评论中关于顶级品牌的问题。用户评论认为哪些品牌是最好的。
绘制了所有品牌及其相应平均评级的条形图,并加入了彩虹配色方案。
嗯,有意思………
在这里可以找到一些很酷的发现和见解,通过进一步研究数据集,还会有更多的发现。
在完成这个项目时,我想到的一件事是关于数据科学中的公平和代表性。由于探索的性质,如果我创造了自己的手机品牌;【我-艾伦】,给自己一个五星评价,那么我将拥有亚马逊上评价最高的手机,并将位于我自己的条形图顶部。
这个项目的所有 R 代码都可以在我的 Github 页面上的 这里 找到。😃
博弈论 101
单人决策问题
博弈论无处不在。它如此普遍,以至于我们常常意识不到它的存在。经济学、市场营销、政治学、游戏设计和人工智能的学生每天都在使用博弈论版本。在每一门学科中,主要目标是理解人们在面对特定情况或决定时的反应。一个细心的观察者会在任何政治选举或营销活动中看到这一幕。
虽然博弈论只是描绘了现实的图景,但它是一个非常有用的工具,而且效果惊人地好。博弈论利用一个框架来处理理性决策者之间的冲突和妥协。传统上,一个理性的决策是在遵守一组给定的约束条件的同时最大化一个人的收益。
和任何学科一样,博弈论有自己的词汇和结构。本文将通过最基本的决策问题——单人决策来介绍其术语和原则。
玩家
在单人决策中,只有一个参与人。玩家在博弈论中是指任何有能力做出决定的实体。博弈论的一部分是对玩家的行为做出假设。我们的结果和我们的假设一样好。因此,博弈论的一个重要部分要求我们挑战我们的假设。但是今天的课,我们会保持简单。
我们每天都面临着多种选择。国会议员决定如何投票表决一个特定的法案。一个产品经理决定在发布日期之前删除一个特性。甚至关于穿哪件衬衫的琐碎决定也是每天都会发生的事情。我们面临的每个决定都有三个部分。
行动、结果和偏好
- 行动是我们可以选择的所有选项。
- 结果是行动的结果。
- 偏好是对可能结果的排序,从最理想到最不理想。
让我们用之前提到的选择当天衬衫的小决定。你有两件衬衫,红色的没有图案,另一件是蓝色的有图案。
我们将集合动作表示为 A = { r , b },其中 r 代表选择你的红色衬衫, b 代表选择你的蓝色衬衫。
现在让我们定义一组结果。在这种情况下, X = { x , y }其中 x 穿着红色衬衫, y 穿着蓝色衬衫。
举这样一个简单的例子,行动和结果之间的差别是微妙的。行动是选择一件特定的衬衫,结果实际上是穿着一件特定的衬衫。但是你还是会明白的。
结果和行动并不总是如此一致。例如,一项行动可能是减少开支。结果将是大量裁员。虽然结果仍然是所选择的行动的结果,但它们彼此非常不同。
此外,可能的动作列表并不总是像我们的两件衬衫的例子那样分散。也许你有 5000 万美元的可用预算,但你并不需要花掉它。你的行动范围可能是 A = [ 0 , 0, 0, 5000 万]。请注意,方括号表示 0 到 5000 万美元的区间,而不是表示离散行动的{}。
现在,我们来介绍一下偏好。想象你最喜欢的颜色是红色,因此,你更喜欢穿红色的衬衫。在博弈论中,我们用符号 x ≿ y 来表示这种偏好。这个符号结构读作“ x 至少和 y 一样好。”这只是博弈论表达你更喜欢你的红色球衣的公式化方式。
当然,“ x 至少和 y 一样好”这种偏好是很弱的。我们就是这么称呼它的。排名很弱。还有另外两种形式的排名,也是借鉴传统经济学和决策理论。一个是表示严格偏好的≻,“ x 严格优于 y ,”和~表示无所谓,“ x 和 y 一样好。”
在我们继续之前,让我们先介绍一下对玩家的要求。玩家不允许在任何两个结果之间犹豫不决。这叫做完备性公理。如果出现结果 x 和 y ,玩家必须选择 x ≿ y 或 y ≿ x 。
除了完整性公理之外,我们还强加了另一个叫做的规则,即传递性公理。它陈述了对于任何三个结果,如果 x ≿ y 和 y ≿ z ,那么 x ≿ z 。在真实的话语和具体的想法中,这意味着如果我们有第三件带有圆点的紫色衬衫,我们更喜欢红色衬衫而不是蓝色衬衫,我们也更喜欢蓝色衬衫而不是紫色衬衫,那么我们一定更喜欢红色衬衫而不是紫色衬衫。
总而言之,完备性公理保证了任何两个结果可以相互排序;比起蓝色的衬衫,我更喜欢红色的。传递性公理确保了这些排序之间不会有矛盾。如果没有这两条规则,我们可能会以一个不确定的场景结束。博弈论禁止使用优柔寡断的玩家。既完全又可传递的偏好关系称为理性偏好关系。
请记住,如果我们的模型中包含不止一个参与者,即使每个参与者都是理性的,也有可能以非理性群体告终。但是我们的单人决策问题不会遇到这种情况。
支付函数
在大多数情况下,偏好和结果一起形成了一个支付函数。通常,在商业中,支付函数返回一个美元值。但是唯一的要求是一个顺序值,这样值越高,收益越好。
当处理一些足够简单的事情时,比如为一天选择一件衬衫,我们的偏好通常是支付函数的同义词。在这些情况下,我们基于偏好为每个结果分配一个支付函数值,这样如果 x ≿ y ,那么支付函数为 x 返回的值大于为 y 返回的值。
回到我们的三件衬衫的例子,我们记得偏好是红色 ≿ 蓝色和蓝色 ≿ 紫色,因此,红色 ≿ 紫色。我们给红色的分配 10 的收益值,给蓝色的分配 5 的收益值,给紫色的分配 1 的收益值。这些数字是任意的,除了红色的值必须大于蓝色的值,蓝色的值必须大于紫色的值。对于红色、蓝色和紫色,我们可以分别使用 2000、1000 和 1。规模无关紧要。
如果我们将玩家、期权和每个收益之间的关系看作一棵决策树,它将类似于下图。
理性选择范式
最后,我们得出了完整的概念。记住,我们需要一个理性的代理人作为参与者。这被称为理性选择范式。它认为决策者会理性地选择自己的最佳行动。为了保持这一点,我们假设玩家知道所有可能的行动,所有可能的结果,准确地说选择每个行动将如何在结果中表现出来,以及他对所有结果的偏好。
这个假设列表可能看起来势不可挡,甚至不现实,但是如果我们牺牲其中任何一个,我们就不能断言理性选择的想法。本文中的决策示例保持简单,处于入门水平。支付函数的值很容易确定,并且清楚地表明了行动的最佳选择。然而,一些支付函数是需要微积分的数学公式。在这些情况下,你可能需要画出收益函数的结果来选择最佳行动。
博弈论是许多学科不可或缺的一部分,如果应用得当,它能提供巨大的价值。对它的理解,即使是最基本的理解,也会对在当今更复杂的商业决策中做出合理的选择大有帮助。
博弈论在起作用:意大利的“温和”封锁
为什么罗马会沦陷…今年秋天
加布里埃拉·克莱尔·马里诺在 Unsplash:罗马论坛上的照片
介绍:意大利更温和的封锁方式
由于 COVID 疫苗只有几个月的时间了,抗体治疗和其他治疗方法也获得了使用许可,人类对该病毒的战争即将结束。因此,各国政府决心在最后的战场上最大限度地减少伤亡,并尽可能多地将我们带到 COVID 的另一边。
尽管各国将公共卫生置于经济问题之上,但他们希望在这样做的同时,不要让太多的企业倒闭,也不要让太多的工人失业。为了达到微妙的平衡,意大利政府制定了一项全国封锁政策,根据 Rt 值捕捉到的感染传播速度调整限制。该政策根据当地 Rt 值将意大利的 21 个地区用颜色编码为黄色、橙色和红色,因此据称与 2020 年 3 月驯服第一波感染的一刀切封锁相比,在更大程度上保护了经济。
意大利政府没有理会意大利医学委员会提出的在全国范围内推广三月式封锁的请求。封锁国家造成的经济损失也必须考虑在内——这是政府将医生的担忧置于一边的论点。从医生的角度来说,他们认为封锁和释放的政策——T2——以色列政府走上了一条明显成功的道路——可能在保护企业和就业方面做得更好。医生们指出,对于食品旅游业来说,即使是宵禁和地区流动限制这样的小限制也可能太多,无法带来利润。在高风险行业运营的公司利润率非常低,需要规模来维持经营。
对不同病毒遏制政策的成本效益评估并不是我在这篇文章中要触及的主要话题——如果感兴趣的话,查看一下经济学家 Favero、Ichino 和 Rustichini 的概要。相反,我想确定的是,意大利政府宣称的通过更温和的方式让人们留在国内的目标,是否在政策本身的力所能及的范围之内。作为剧透或者免责声明,我给出的答案是,很可能不会。然而,我的主要目标是展示基本博弈理论能走多远,以获得对政府政策潜在后果的洞察。
为红区设想的主要规定是从晚上 10 点开始宵禁,不准跨地区移动,公共交通以 50%的能力运行,除了去看医生、慢跑、购物和很少的其他活动外,不准移动。黄色和橙色区域的限制更温和,但是我将在我的玩具示例中使用红色区域。意大利人出门时必须准备好自我声明,以证明他们没有加入其他家庭,没有因为不必要的原因外出,或者更糟的是,没有跨越地区边界。未能出示自我声明或出示的声明未列出外出的有效理由的犯罪者将被处以 400€的罚款,如果在声明发布后三天内被清除,罚款将减至 280€。
然而,更重要的是,与三月创纪录的 110,000 英镑罚款相比,立法者似乎采取了更宽容的态度,拒绝派遣军队,更多地依靠公民的合作。我们面临的问题是,软锁定和中等规模、宽松的罚款相结合,是否可能达到政府的底线。我将推敲一些基本的博弈论来证明它很可能不会,这源于 COVID 作为一种传染性很强、但并不致命的疾病的本质——如果你还没有听过的话,我恳求你听听这个彼得·阿提亚的播客。
博弈论:一种非常生疏的方法
请考虑以下设置。卡罗莱纳和马可代表了意大利人口的特征,位于最重要的人口统计数据(年龄、收入、教育等)的中间。).Carolina 是女性,45 岁,税后收入€20,000 英镑/年,拥有高中文凭,总体健康。同样,马尔科——他是“他”——45 岁,健康,过着意大利中产阶级的生活。他们住在一起,见面时会顺便拜访。在周六下午,他们可以选择看网飞的节目或者出去散步。他们真的不应该离开,但他们知道找到一个理由打破自我认证并不难。Carolina 上次去购物时忘记拿牙膏了,Marco 真的很想吃杂货店里那些美味的蔬菜,加上他最近没怎么锻炼,所以警察为什么要干涉他对健康的追求呢?这不正是政府想要扶植的吗?
当这些想法在他们的脑海中不断翻找时,意大利的秋季让他们脱颖而出,并诱使他们在立法者面前一试身手。这些是卡罗莱娜和马可的选择参数:
- U 是散步的效用,归一化为 1(U= 1);
- 如果它们相遇,效用减少一半;
- 得到 COVID 的负效用是 10U;
- 无 COVID 国家的效用设为无穷大(∞);
- 被罚款的负效用是 3 U (近似值)。3 天的有偿工作);
- c̅ 是散步时得到 COVID 的概率,它严格小于1 并且非常接近 e 为 0(0<c̅≪1);
- c 是待在家里得到 COVID 的概率,比c̅【0<c<c̅≪1 略少*;*
- f 是被警察拦下发现没有有效自行申报时被罚款的概率,比 c̅ 和c(0<f<c<c̅≪1).少
图 1 描绘了每种反应组合的收益。马可和卡罗来娜在两个选项中选择一个:呆在家里(逗留和去散步(去)。此外,它们不能通信,必须彼此独立行动。
Carolina 选择的期望是 Marco 选择去散步,这将她的选择集减少到图 2 所示的条件集;出于同样的原因,Marco 的选择集减少到如图 3 所示。世界的合作状态(停留,停留)要求马可和卡罗琳娜协调行动;然而,他们怀有相互的期望,认为对方会叛变;因此,当各方作为效用最大化的代理人独立行动时,最大化社会效用的世界状态就丧失了。
图 1:收益矩阵
图 2:卡罗莱纳州的收益矩阵
图 3:马可的收益矩阵
现在让我们更仔细地看看个人的选择。卡罗莱纳州必须在停留和出发之间选择一个,条件是马可要走。如前所述,每一方都期望另一方背叛,因此只有条件集是可行的。
一旦选择留下,Carolina 将以概率 c (即–10c*)获得 COVID 的负效用。当选择去的时候,她会拿走去散步收益的一半(即 0.5),以概率 c̅ 得到柯维德的负效用(即–10c̅),以概率 f 得到罚款的负效用(即 3 f )。值得注意的是,呆在家里——通过家人、在当地杂货店等——获得 COVID 的概率。—大约等于散步时被感染的几率(即 c ≈ c̅ )。卡罗莱纳选择停留选项必须满足的条件是:*
U ( 待)>U(走)
或-10ct64】0.5-10c̅3f*。因为 c ≈ c̅ ,10 个 c 和 10 个 c̅ 条款相互抵消;求解 f 得到条件f1/6。这意味着,卡罗莱纳州选择留在的可能性必须至少高达 17%。这个数字是一个不切实际的高概率,甚至没有接近目前在意大利红区交易的 f。请注意,所需的概率越小,罚款越大(即,与罚款相关的负效用从 3U 增加到 4U,依此类推)。*
因此,在当前的政策体制下,提高罚款可能是让意大利人留在国内的唯一可行选择,但这与支持更温和封锁的理由背道而驰。因此,意大利的卡罗莱纳州最终挤满了意大利的街道,而不是平坦的曲线。
同样,马尔科预计卡罗莱娜会叛变,这将他的选择限制为(去,留)和(去,去)。他的决策反映了卡罗莱纳州,他也选择去。总的来说,( go , go )是一个纳什均衡,这意味着意大利的温和封锁未能温和地推动传染曲线下降。
宽松的政策和 COVID 的性质相结合,COVID 是一种高传染性、低致死率的病毒,主要来自渐近感染,似乎正在将意大利置于不可避免的硬性封锁的轨道上。这可能是弥合现在和疫苗推出之间的差距,避免普遍医疗保健失败的唯一途径。
博弈论:一种生疏的方法
为了清楚起见,我在上面的例子中用博弈论“欺骗”了一点。毕竟,本文的目的是提供一些博弈论的直觉来强调软锁定策略的一些潜在缺点。然而,我们可以通过使用行为社会科学对无 COVID 国家的效用进行参数化,从而得到更好的结果。一般来说,我们贴现未来效用,因为它本来就不如现在效用有价值;因为我们没有意识到未来效用的真正价值。虽然我们确实知道今天把多余的钱存起来并投资到股票市场会给我们带来一些重大的终身回报,但我们的大脑被某种形式的预感所欺骗,夸张地贴现了这些未来的收益。我没有用“夸张地”这个词来炫耀,而是引入了双曲线贴现。为了对一项 30 天后到期的投资进行建模,我们需要考虑货币的时间价值——也就是说,明天一美元的价值比今天少了δ*——以及我们现在的偏好——也就是说,我们只愿意对未来金额的估值乘以我们今天的估值。返回双曲线贴现效用函数:*
u(30)=β(1-δ)⁰*u*
将此与我们的主要讨论联系起来,我们可以模拟卡罗莱纳州和马尔科对意大利封锁政策的反应,这种反应受到时间贴现和当前偏差的影响。这让我们可以参数化他们承诺的从现在起 30 天内无 COVID 国家的效用。我将使用一些有意义的数字,但是最终目标是更好理解,而不是扩展我们的数学肌肉。因为卡罗来纳和马可非常关心他们的国家,100 U 是他们对一个月后无 COVID 国家的估价。他们以 10% ( δ =0.10)折现未来效用,并受到当前偏差的影响( β =0.2)。因此,与该选择相关的效用由下式给出:
u(30)= 0.2(0.9)⁰(100)≈0.85
请注意,当前偏差参数的值 0.2 远非不现实。想象一下,在一个现在没有 COVID 的国家和 30 天以后同样的情况之间,有一个选择。甚至那些否认 COVID 真实性的人也不会拒绝这笔交易。然而,有多少(中值)意大利人会购买第二种产品呢?无论是因为他们缺乏关于锁定政策有效性的信息,还是因为他们认为情况会比那更快好转,或者无论他们目前的偏见是什么,很可能会有 20%的人会接受这笔交易。
说到这里,让我们再次转向博弈论,看看图 4 中新的收益矩阵。我们这次不需要“作弊”来说明( go , go )是一个纳什均衡。让我们为卡罗琳娜做一下心算。当马可选择留时,她将在获得 1–10c̅*–3f≈1 和去或获得 0.85–10c̅≈0.85 和留之间做出选择。因为去获得更大的效用,Carolina 愿意调整她的自我认证,去去走走。类似地,当马尔科选择离开时,她将在留下来获得消极效用或离开并获得 0.5–10c̅–3f≈0.5 之间做出选择;因此,她会选择去。Marco 会照着做,不管 Carolina 选不选,他都会选择去,这样就使得( go , go )成为这个博弈唯一的纳什均衡。*
图 4:收益矩阵(双曲线贴现)
最重要的评论如下。与(停留、停留)均衡相关联的社会效用远大于与(进行、进行均衡相关联的私人效用最大化。不幸的是,当不协调的各方在市场上交易“公用事业”时,这种状态是无法实现的。
U ( 停留,停留)= 2(0.85–10c̅)≈1.7
u(go,go)= 2(0.5–10c̅–3f)≈1
总的来说,行为社会科学给了我们更多的视角,让我们了解以前被带走的东西。这绝不是博弈论的一次大跳水,而是展示了它的广泛应用。在我们的案例中,行为激励和信息缺乏的相互作用可能会致命地阻碍一项基于硬锁定和自由开放之间的妥协的政策。
结论
在这篇文章中,我应用了基本博弈论来揭示意大利 2020 年秋季停摆的潜在后果,这在很大程度上——“过度”可能是更好的词——取决于公民合作。由于 COVID 的性质,它是一种与埃博拉病毒甚至 SARS-CoV 非常不同的感染,其致死率低到不会让人们躲在家里,软封锁似乎相当无效,因为它的目标是平坦曲线和减轻对医疗保健系统的打击。
最有可能的是,意大利医学委员会建议的更短、更严格的封锁能够更好地实现这些目标,而不必牺牲更大的经济。这是因为在任何形式的封锁下,经济都无法以接近有效的方式运行。因此,今秋的几次理发和浓咖啡可能会使罗马沦陷。
AlphaGo 中的博弈论概念
DeepMind 利用了许多创新的人工智能方法,但如果没有博弈论的概念,它们可能不会如此有效地工作。
介绍
围棋可以说是世界上最古老的棋类游戏,起源于大约 4000 年前的东亚,是两个人玩的游戏。围棋通常是在一块由 19 条竖线和 19 条横线组成 361 个交叉点的方形木板上,用 181 颗黑棋和 180 颗白棋来下。每个玩家依次(黑棋先走)在任意两条线的交点上放置一颗石头,在此之后这颗石头不能被移动,使得这个游戏成为一个完全信息的连续游戏。目标是通过用他们自己的石头做的边界完全包围空点来征服领土,其中被包围的对手的石头被捕获并从棋盘上拿走。拥有最多点数(征服领域)的玩家赢得游戏(大英百科全书)。
DeepMind 是一个由科学家、工程师、机器学习专家等组成的团队,共同努力推动人工智能的发展。他们利用自己的技术实现广泛的公共利益和科学发现,并与他人合作应对重大挑战,确保安全和道德。他们的众多突破之一是 AlphaGo,它是第一个击败职业人类围棋选手的计算机程序,第一个击败围棋世界冠军的计算机程序,可以说是历史上最强的围棋选手(DeepMind,2017)。虽然 AlphaGo 的大部分成功可以归功于各种创新的人工智能方法,如深度学习和卷积神经网络,但允许这些模型工作的许多概念来自博弈论领域。在整篇论文中,我将实现 DeepMind 的科学家、工程师和机器学习专家用来构建 AlphaGo 的各种博弈论概念,alpha go 是近年来人工智能历史上最伟大的成就之一
扩展形式游戏
围棋是完全信息的序贯博弈。玩家按顺序移动,每个玩家在游戏结束时都有相同的信息。在显示和分析连续移动博弈时,我们以博弈树的形式显示和分析它,这通常被称为扩展形式博弈。一个广泛形式的游戏有许多关键方面,如玩家可能行动的顺序,他们在每个决策点的决策,每个玩家对另一个玩家的信息,以及每个节点结束时的收益(《策略的游戏》,2010)。以下是围棋游戏的新颖博弈树:
(来源: Livebook )
用于分析广泛形式博弈的一个常用策略是回退/逆向归纳,这是一个从问题(博弈树)的末端开始在时间上逆向推理以确定任何子博弈完美均衡的过程。在这些更新颖的广泛形式的游戏中,你可以使用回滚策略来确定任何均衡,但围棋游戏的问题是它有 250^150 可能的移动。如果人类可以使用逆向归纳法假设性地分析所有可能走法的博弈树,那么即使从宇宙开始以来的所有时间都不足以在围棋中进行完整的树搜索(DeepMind,2020)。DeepMind 的 AlphaGo 程序利用了一个深度强化学习卷积神经网络,该网络结合了蒙特卡罗树搜索。蒙特卡洛树搜索只预测每一步可能出现的可能序列的极小一部分,计算这些假设序列导致的输赢次数,并使用这些计数给每一步可能的移动打分(Melanie Mitchell,2019)。下图是一个假想的围棋博弈树:
(资料来源: Nikhil Cheerla ,2018 年)
效用最大化
原则上,当 AlphaGo 给自己的每一步棋打分时,我们实际上是在谈论最大化预期效用。利用深度强化神经网络和蒙特卡罗树搜索通过自我游戏进行学习,AlphaGo 可以独自玩数百万场游戏。在这些游戏中,程序会预测它可能采取的行动及其收益,以预测如果选择该行动的获胜概率。收益是代理人的效用,我们知道我们想要最大化我们的效用,而对手想要最小化我们的效用。因此,通过在可能的移动的树搜索中向前看(只是短暂地),什么决策将最大化代理的效用并同时增加获胜概率?
极大极小和阿尔法-贝塔剪枝
极大极小是博弈论中使用的一个决策规则,用来在假设你的对手最优/理性的情况下找到玩家的最优移动。两个玩家轮流成为最大化者和最小化者,在每个序列中,一个特定的移动可能会将对手置于最小化状态。当对手(最大化者)最小化你的效用时,最小最大算法是一个决策规则,用于最小化最坏情况下的潜在损失。但由于围棋的可能走法比宇宙中的原子更多,极大极小算法无法在完整的博弈树上成功完成其目标(Google AI,2016)。这就是修剪的用武之地。修剪是指你“剪掉”游戏树中“不”从第二个节点出现的分支。更简单地说,这是一种减少由极大极小算法在其搜索树中评估的节点数量的方法。还记得围棋的博弈树是如此之大,以至于从宇宙开始以来的所有时间都不足以进行完整的树搜索,因此极大极小算法不能成功地完成它的目标吗?阿尔法-贝塔剪枝法与蒙特卡洛树搜索相结合,可以扭转乾坤。回想一下,蒙特卡罗树搜索法只预测了每一步可能出现的序列中的极小一部分。通过并行运行 alpha-beta 剪枝算法,您可以获得一个高效的决策程序,该程序寻求效用最大化,并反过来增加获胜概率(或者至少我们希望如此)。
结论
DeepMind 的 AlphaGo 是近年来人工智能历史上最伟大的成就之一,这要归功于各种深度学习方法、计算机处理和计算机硬件的发展。随着人工智能、机器学习和强化学习等所有围绕 AlphaGo 的流行词汇的出现,一些对 AlphaGo 的成就做出贡献的博弈论概念经常被忽视。博弈论的概念和方法,如广泛形式的游戏,逆向归纳,效用最大化,极大极小和修剪,已经存在了几十年,看到它们在人工智能中的应用是令人振奋的。
参考文献
AlphaGo:目前为止的故事。(未注明)。检索于 2020 年 5 月 8 日,来自https://deep mind . com/research/case-studies/alpha go-the-story-迄今为止
第四章。用树搜索深度学习和围棋对弈。(未注明)。2020 年 5 月 8 日检索,来自https://live book . manning . com/book/deep-learning-and-the-game-of-go/chapter-4/39
新泽西州 cheer la(2018 年 1 月 1 日)。AlphaZero 解释道。2020 年 5 月 9 日检索,来自https://nikcheela . github . io/deep learning school/2018/01/01/alpha zero-Explained/
迪克西特,A. K .,斯凯斯,s .,,雷利,D. H. (2015)。战略游戏。纽约。:W. W .诺顿。
米切尔梅勒妮。(2020).人工智能:思考人类的指南。小号:皮卡多。
西尔弗博士和哈萨比斯博士(2016 年 1 月 27 日)。AlphaGo:用机器学习掌握围棋这个古老的游戏。2020 年 5 月 7 日检索,来自https://ai . Google blog . com/2016/01/alpha go-mastering-ancient-game-of-go . html
大英百科全书的编辑们。(2017 年 4 月 24 日)。走吧。2020 年 5 月 8 日从https://www.britannica.com/topic/go-game检索
游戏:数据集的金矿
如果算法可以被动学习,而不需要提供注释,会怎么样?—嗯,这正是游戏可以帮助我们的!
这篇文章讲述了我如何从一个项目中脱离出来,构建了一个东西或程序,而这个东西或程序是无人监督的(我猜同时也是有人监督的)。使用 GTA V mods,我为计算机视觉任务创建了一个数据集,由游戏中看到的对象组成。我还将展示一个小的物体检测器在现实世界中的表现。
TLDR,在游戏图像上训练的物体检测器,在真实世界的图像上概括得非常好。
本文分为以下几个部分:
- 机器学习导论
- 数据集对机器学习重要吗?
- 游戏和游戏玩家能帮助制作更好的数据集吗?
- 训练物体探测器
- 演示,显示对象检测的结果
我应该强调,这不是一个修改 GTAV 的教程,我不能解释和提供代码(也许以后,有一天当我有更多的时间)来使用 GTAV API 获取游戏世界信息。你可以在一个单独的类上玩物体检测器的小演示可以在这里找到。这个指南可以帮助你开始在侠盗猎车手 v 中进行改装,如果你想更深入地从游戏世界中提取信息,这个工具可以作为起点。
来源:https://img.youtube.com/vi/Usx-Cf8TlNI/0.jpg
机器学习导论
如果你有机器学习的先验知识,那么你可以跳过这一节。因为这篇文章不是关于学习机器学习,而是关于一个应用,所以我不能在这里深入讨论机器学习的概念。以下是一些很棒的文章,可以帮助你理解这个计算机科学领域:
如果我是 ELI5(像我五岁一样解释)机器学习是人工智能的一种形式,其中程序或算法被设计成能够自己学习。像人类一样,被称为神经元的小逻辑单元(下图中的圆圈)帮助算法从经验中学习(或从计算机、数据的角度来说)。算法中的参数会改变并学习数据集中的模式。
这个视频是学习机器学习的一个很好的起点。https://www.youtube.com/watch?v=aircAruvnKk&list = plzhqobowtqdnu 6 r 1 _ 67000 dx _ ZCJB-3pi
数据集对机器学习重要吗?
数据是任何学习形式的基本必需品。我们人类在经历或阅读/听到他们的经历后,学会了感知或理解行为的能力。数据集,不管有没有标记,都是所有机器学习任务的基础。
为了训练机器学习模型,需要大量数据。俗话说:“人越多越开心”,这句话再正确不过了。当前最先进的(SOTA)机器学习模型需要海量数据,例如,许多 NLP 任务的伯特、SOTA 都是在数十 GB 的数据上训练的。
Imagenet 一个标准的图像分类数据集大约有 144 千兆字节的压缩数据和> 300 千兆字节的未压缩数据。不用说,被标记的数据对于人工智能的进步是非常重要的。
在处理一个项目时,我遇到了一个问题,我使用的对象检测器无法识别图像帧中的所有对象。我试图对图片框中的所有对象进行索引,这将使图片搜索变得更加容易。但是所有的图像都被标记为人类,无法检测图像帧中的其他物体,搜索没有像我希望的那样工作。
这个问题的理想解决方案是收集这些对象的数据,并重新训练对象检测器来识别新的对象。这不仅无聊而且耗时。我可以使用 GANs ,这是一种机器学习算法,以其创建人工和类似的输入示例而闻名,在手动组织一些样本后创建更多样本,但这也很无聊,需要资源来训练 GANs 生成更多数据。
现在我唯一能做的就是使用互联网服务,比如 ScaleAI 和谷歌云平台,来创建一个数据集。但是这些服务对每张带注释的图片收费 0.05 美元。为 15 个类别创建一个 100 张图片的数据集意味着我将不得不为这个数据集花费 120 美元。仅仅为了一个简单的项目而花费这么多美元不是一个可行的选择。
游戏和游戏玩家能帮助制作更好的数据集吗?
在所有选项中,我开始希望如果有一个人造的世界,所有的物体都已经有了各自的标签。这样我就不必花时间搜索样本,然后小心翼翼地为它们生成注释。然后我意识到游戏世界是这种人工或虚拟世界的最好例子。当世界被创建时,游戏引擎拥有所有必要的信息,它知道哪些纹理位于哪里,并且知道所有其他物体的位置。看看游戏的当前状态,开发者正在挑战极限,创造与现实世界几乎没有区别的游戏环境。PS5 上的虚幻引擎 5 演示展示了下一代游戏机将夸耀的图形保真度。拥有一个与真实世界非常相似的虚拟世界,应该是测试和学习算法的一个很好的模拟。允许算法访问游戏世界的信息,让它了解角落和缝隙,这将是一件很棒的事情。
我想到的第一个游戏是神秘海域 4:盗贼末路。
F
一个令人惊叹的游戏,有一个很好的故事,它有所有的元素,我们想从测试环境。它拥有所有的自然地形类型:平原,高原,洞穴,海岸,它还拥有近乎照片般逼真的图形,这意味着物体探测器将学习更接近真实世界的特征和形状。但问题是,我在大学里没有 ps4,也没有办法以我喜欢的方式访问未知的资源。
游戏的另一个选择可以满足我的要求:
- 摄影现实主义
- 修改界面以允许访问游戏世界数据
《侠盗猎车手:v》的基地虽然已经有 7 年的历史了,但与大多数其他游戏相比,它更像真实世界。这个游戏有广泛的支持 mods 和作出改变/与游戏世界互动。这个游戏,在使用了一些 mods 之后,可以用它所有的灯光和倒影看起来非常惊人
GTA V 社区做出了一些令人愤慨的修改,其中默认的玩家模型被自定义模型所取代。这是一件非常非常棒的事情,我稍后会继续讨论。
摄影现实主义
大雄作为玩家模型,lol
我首先阅读了一些关于使用 Rage Engine(GTA 使用的引擎)的 API 的文章和指南。很少有好的例子或指南来帮助我实现我想要达到的目标。但幸运的是,有一个惊人的工具做了一些接近我试图实现的事情,它给出了用户当前图像帧中许多对象的位置。
使用地图工具打开用户界面
这个工具最棒的地方在于它的源代码可以在 Github 上找到。有了这个坚实的起点后,任务就归结为如何从游戏世界中访问对象信息,比如它的位置和类型。这是在长时间阅读代码、编译错误代码之后实现的。我可以从游戏屏幕上记录结果。我从简单的日志开始:
# the first log file that was created script running inside of GTA V
[{
"label": "car",
"location": [
[248.42533936651586, 173.41176470588235],
[442.5429864253394, 278.841628959276]
],
"group_id": "non-living"
},
{
"label": "trevor",
.....
"group_id": living"
},
{
"label": "cat",
.....
"group_id": living"
}]
有些事情很简单,比如获得命名对象的位置,比如使用哈希单独识别的字符。渐渐地,我学会了与 API 交互,以获取行人和附近行驶的汽车等物体的位置。我无法完全破解游戏世界来获得我想要的所有物体的位置信息,但这是一个很好的起点。最初的结果看起来很有希望,当检测到物体时,脚本会对游戏进行截图,并保存物体的位置。结果看起来像这样:
从游戏世界获得的图像坐标用于创建边界框。额外:我曾经用 CannyEdgeCropping 来使边界框更精确。
训练物体检测器
有了这些令人满意的结果,我继续创建更多的样本。我决定用 14 个物体:
- 类人:行人或人类、狗和猫(3)
- 有生命但不像人的东西:树(4)
- 非生物:汽车、卡车、自行车、火车、船、交通信号、广告牌(6)
在获得足够的数据来训练模型之后。我开始在我的大学服务器上训练一个 RetinaNet 模型,这是一个中等强大的机器,配有 Quadro P5000 和英特尔至强 G6132。选择 RetinaNet 没有特别的原因,我有使用它的经验。我从头开始训练网络,因为使用预先训练的权重会扼杀这个项目的想法,即使用游戏世界的知识并将其应用到现实世界中。
经过一小时又一小时的等待,我意识到看着缓慢的训练进度不会加快速度,决定今天到此为止,睡觉。在漫长的等待之后,训练结束了,表演时间到了。在由游戏图像组成的测试集上测试该模型。结果似乎是公平的:
结果似乎很好,但我不明白正确的汽车是如何检测出来的。绿色是汽车,红色是人。圆圈是坐标。
结果和预期的一样,现在是在真实对象上测试性能的时候了。我认为从结果来看,这个实验可以说是成功的:
我讨厌物体探测器没找到谢尔顿和拉杰什
模特再次表现良好
大多数物体都被很好地识别了,但是我注意到了一个错误:
我认为这是因为游戏中缺少猫和狗的不同玩家模型。该模型能够学习数据集中不同对象的形状,但由于猫和狗的样本种类有限,这些类的情况并不顺利。它不能学习让它区分狗和猫的特征。狗和猫的模型数量是有限的,修改和添加新的模型可以弥补这种情况。
演示
该模型在图像上表现良好,但不要相信我的话。我创造了一个 colab 笔记本,你可以在 5 分钟内训练你自己的模型从图像中识别人类。为了保持尽可能低的运行时间,笔记本只有来自游戏的 200 个人体样本的小数据集。这种低数量的样本足以显示这种模型的潜力。
测试集上的检测
物体的小贴图和它们的纹理位置,这些部分目前有点奇怪。仍然需要做一些数学方面的工作。
在启动并运行了对象检测之后,我想让语义分割工作起来,因为这是自动标注的真正潜力所在。利用游戏引擎的纹理知识来获得像素级分割。我还没想好怎么从 GTA V 用的游戏引擎 RAGE engine 获取基于纹理的信息,获取物体的位置是一回事,获取物体的位置和区域覆盖又是另一回事。后者是我目前的困境。
我相信这一点的潜力是巨大的,通过使用 mods,我们可以很容易地用那些我们想要建立探测器的东西来替换玩家模型。在这项技术中,我们可以替换一个简单的布娃娃的角色模型,该模型可以作为创建一个在各种环境中角色外观的大型数据库的基础。
示例:此处的玩家模型由海鸥模型替换而来。来源:维基百科
随着我的 GSoC 选择,我的时间减少了,开发环境也改变了。我希望将来能回到这个项目中来。我计划上传所有图片及其标签的 31GB 数据集,但目前这是不可能的,因为我大学的互联网服务慢得令人难以忍受。
我在这里的下一个博客将是我正在进行的另一个项目的开发日志,或者是 GSoC 博客的启动博客,我将在未来 3 个月内发布这些博客,以展示我在 CERN 的工作进展。
游戏新冠肺炎:让我们通过玩游戏打败病毒!
在一个封闭的世界里,无助感可能会压倒一切,但我们都可以在自己舒适的家中用电脑打败病毒
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
照片由克里斯蒂娜@ wocintechchat.com在 Unsplash 上拍摄
全世界都在担心冠状病毒的传播。我们被锁在家里,感到无能为力。计算机让我们与外界保持联系,并让我们保持理智(点击此处,了解在禁闭期间可以做的有趣的人工智能活动)。但是我们能做更多来帮助科学界吗?
答案是,可以!每个人都可以尽自己的一份力量来帮助医学研究人员找到疫苗,阻止病毒的传播。好消息是我们不需要成为生物医学科学家。你所要做的就是成为一名公民科学家(公众参与和合作科学研究以增加科学知识的实践)。
为此,普通人自愿分享和贡献数据监测和收集项目。在现实中,一个人不需要太多的参与!在冠状病毒的研究中,我们所要做的就是玩一个免费的游戏,这个游戏在 https://tinyurl.com/BeatCOVID-19 叫做 Foldit。
这个游戏的工作原理是给用户一个难题,他们必须解决它。潜在的想法相当简单。我们都知道我们的身体由各种细胞组成,这些细胞需要蛋白质来分解食物,发送信号和其他东西。这些蛋白质是由成排的元素(如碳、氧、硫等)组成的。)都像链子一样互相牵着。然而,链条不是在一条直线上,而是折叠起来,使其紧凑。如果不同的蛋白质具有匹配的形状,它们就会相互作用。把它想象成一把锁和一把钥匙相互作用。只有正确的钥匙才能打开特定的锁。
冠状病毒 Foldit 游戏显示了冠状病毒蛋白质的一部分,该部分通常与人类相互作用。玩家必须设计一种折叠蛋白质来匹配冠状病毒,并阻止这些相互作用。这项任务在现实生活中可能相当复杂,因为一个蛋白质可能由数百种元素组成。尽管如此,游戏把它表现为一个简单的拖拽任务。Foldit 试图通过利用人类的解谜直觉来预测蛋白质的结构,并让人们竞争折叠最佳蛋白质。
然后,华盛顿大学将测试最有希望的解决方案,作为新冠肺炎可能的现实世界疫苗。一些人对这种方法表示怀疑,但这种方法在 2011 年 Foldit 播放器帮助研究人员解码艾滋病病毒时确实有效。
找出哪种可能的结构是最好的被认为是生物学中最困难的问题之一。目前的方法花费大量的时间和金钱,即使对计算机来说也是如此。如果游戏不适合你,你仍然可以通过允许研究人员使用你的电脑来帮助他们。人们只需下载一个名为 Folding @ home(https://tinyurl.com/BeatCOVID-19Home)的小应用程序,并让它在后台运行,就可以做到这一点。然后,这个程序将把你的计算机连接到一个国际网络上,这个网络使用分布式程序来完成大量的计算任务。你仍然可以在任何时候关闭应用程序,但是如果计算机处于闲置状态,也可以让科学家使用它的能量。
一旦他们拥有了这种计算能力,科学家们就可以使用人工智能来创建算法来解决折叠问题。这些公司中最新的一家是谷歌的 DeepMind,它刚刚发布了一个名为“自由建模”的工具,以帮助科学家预测以前从未见过的蛋白质的蛋白质结构。他们希望减少预测蛋白质结构的时间,因为这种实验通常需要在实验室进行数月。通过这样做,他们希望阻止病毒的传播并拯救一些生命。
Saneej Kallingal 在 Unsplash 上拍摄的照片
在一个封闭的世界里,无助感可能会压倒一切。但是今天的机器可以创造奇迹。它们可以帮助我们直接或间接地为科学的进步做出贡献。这是我们的选择。最棒的是它不需要任何医学专业知识。所以,当我们都在家的时候,为什么我们不通过下载这些应用程序来积极地帮助对抗新冠肺炎呢?
这篇文章最初发表于 https://www.businesstoday.com.mt请在下面留下你的想法,如果你喜欢这篇文章,请随时关注我🐦推特,🔗 LinkedIn 或者😊脸书
阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。
甘 2020 年要读的论文
生成性对抗网络的阅读建议。
甘游戏
生成对抗网络(GANs)是近十年来提出的最具创新性的想法之一。其核心是,GANs 是一个从一组相似元素生成新元素的无监督模型。例如,在给定人脸图像集合的情况下产生原始人脸图片,或者从预先存在的旋律中创建新的曲调。
GANs 已经发现了图像、文本和声音生成的应用,是人工智能音乐、深度假货和内容感知图像编辑等技术的核心。除了纯粹的生成,GANs 还被用于将图像从一个领域转换到另一个领域,并作为一种风格转移的手段。再增加一个应用,它们适合作为半监督学习的智能数据增强技术。
在这篇文章中,我选择了 10 本 2020 年前最令人大开眼界的读本。特别是,我选择了五篇论文,它们扩展了在哪里和如何使用 GANs 的视野,以及五篇解决训练 GANs 的具体技术挑战的论文。
至于我以前关于阅读建议的文章,我提供了每篇文章的简要概述和一系列阅读它的理由,加上一些关于相同或相关主题的进一步阅读的想法。
我们走吧。
排名第一的 GAN (2014)
伊恩·古德菲勒等人《生成性对抗性网络》 神经信息处理系统的进展。2014.
2014 年,Ian Goodfellow 和他的朋友在一家酒吧讨论如何使用人工智能合成图像。典型的边喝啤酒边聊。当他的朋友们在讨论统计方法时,他主张使用两个神经网络来共同学习“如何绘画”和“判断绘画”。前者在后者的反馈上训练,后者训练从假图像中识别出真实图像,就是为了痛击前者。
最初,这个想法遭到了批评:训练一个网络是困难的,训练两个是疯狂的。尽管如此,带着醉意,古德菲勒回到家,连夜编写了代码。令他惊讶的是,它成功了。
甘游戏
理由#1: 好点子随时随地都能冒出来。携带一个 notes 应用程序。
理由 2: 和任何“经典论文”一样,阅读它会把我们带回到一个并非我们今天使用的所有东西都存在的时刻。2014 年流行哪些深度学习技术?哪些不是?
原因#3: Goodfellow 使用 MNIST 和 CIFAR-10 数据集演示了 GANs。更大规模的数据集(和分辨率)需要一些时间才能被驯服。如果他从 ImageNet 开始,他会把 GANs 作为一个坏主意扔掉。这篇论文提醒我们永远不要低估玩具数据集上提出的创新也是玩具。任何想法都有可能在两三篇论文之外取得突破。
**延伸阅读:**虽然 gan 是生成性任务中最成功和最容易使用的方法,但它们不是唯一的方法。两个相关的选择是变分自动编码器(VAEs) 和自回归模型。两者都值得一试,而且都有其优劣势。
第二名 StyleGAN (2019 年)
卡拉斯、泰罗、萨穆利·莱恩和蒂莫·艾拉。“基于风格的生成式对抗网络生成器架构。”IEEE 计算机视觉与模式识别会议论文集。2019.
五年后,GANs 现在能够生成在大规模语料库上训练的高分辨率可定制画像。虽然从 2014 年到 2019 年提出了许多新颖的想法,它们当然启发了作者的许多决定,但这一切都归结于架构、AdaIN、Wasserstein loss 和小说数据集: Flickr-Faces-HQ 数据集(FFHQ) 。
该论文的核心思想是在每一级上采样中输入不同的噪声矢量。这与大多数以前的工作形成了鲜明的对比,以前的工作只把噪音作为第一步。通过调整每个分辨率的噪声向量,作者可以通过篡改较低级别的噪声来控制“高级细节”,并通过篡改较低级别的噪声来控制“低级细节”。
对斯泰尔根建筑的直觉。在不同的阶段应用不同的噪声来控制“风格”,而中央“主要”噪声被用作“本质”。由克里斯托弗·坎贝尔在 Unsplash 上拍摄的肖像
原因#1: 虽然每年在深度学习方面做出的贡献数量巨大,但一些论文显示,只需要其中的一小部分就可以实现最先进的结果。这篇论文就是一个很好的例子。
理由#2: 本质上,这项工作的主要贡献是一种运用噪音的新颖方式。不涉及任何重要的新算法或数学公式。事实上,从第三页开始就是评估页。
原因#3: 另一方面,他们必须收集整个数据集,并在八个 Tesla V100 GPUs 上运行整整一周。在 AWS 上, p3.16xlarge 实例的这种用法大约是 4000 美元。技术上的贡献可能是巧妙的,但达到这一点的计算成本相当高。
**延伸阅读:**2019 年底,一篇后续论文出炉,修剪了模型的几个边缘。然而,更令人印象深刻的是其他作者使用 StyleGAN 作为工具独立开发的工作。我最喜欢的是 Image2StyleGAN 。作者的想法是训练一个网络来找到一张脸的相应噪声,然后使用 StyleGAN 将其生成。通过这种方式,网络可以用来设计预先存在的图像,就像它们是任何其他生成的图片一样。
排名第三的 Pix2Pix 和 CycleGAN (2017 年)
Isola,Phillip,et al .使用条件对抗网络的图像到图像翻译IEEE 计算机视觉与模式识别会议论文集。2017.
朱,严军,等.“使用循环一致的对立网络进行不成对的图像到图像的翻译”IEEE 计算机视觉国际会议论文集。2017.
最初的 GAN 公式是无人监督的:图像是凭空产生的。然而,许多作者设计了监督公式,其中一些先验知识给网络。这些被称为“有条件的”方法。其中,Pix2Pix 和 CycleGAN 架构最为人所知。
Pix2Pix 模型处理诸如将线条画转换成成品画的问题,允许用户通过改进/改变他们的草图来进行某种程度的艺术控制。反过来,CycleGAN 模型放松了对成对训练样本的需要。它最著名的用途是用马代替斑马,用苹果代替橙子。然而,将堡垒之夜变成 PUBG 无疑对年轻一代更有吸引力。
与传统的无条件方法不同,Pix2Pix 算法支持“艺术控制”。
原因#1: 随着 GANs 质量的提高,艺术控制变得更加令人兴奋。条件模型为 GANs 在实践中变得有用提供了途径。
**原因# 2:**pix 2 pix 背后的主要组件是 U-Net 架构,它最初是为生物医学图像分割而提出的。这凸显了深度学习的许多应用如何相互促进。你可能不是 GAN 研究人员,但一些 GAN 创新可能正是你现在需要的。
**原因 3:**cycle gan 的论文特别展示了一个有效的损失函数是如何在解决难题时创造奇迹的。至于第二点,通过不同的连接方式可以改进很多。
**延伸阅读:**如果你从来没有编码过 GAN,我强烈推荐你。它们是深度学习深度学习的绝佳练习:)。TensorFlow 2 文档中有三篇关于构建原始 GAN 、pix 2 pix 模型和cycle GAN的优秀文章。
#4 半监督学习(2016)
Salimans,Tim,et al. “训练 gans 的改进技术” 神经信息处理系统进展。2016.
虽然生成东西通常是焦点,但是 GANs 也可以作为辅助工具来改进其他任务。其中一个用途是半监督学习:当大量未标记的数据可用,但只给出一小组标记的例子时。换句话说,如何利用未标记的数据。
本文给出了用 GAN 训练分类器的基本公式。本质上,分类器被联合训练来对图像进行分类并检测假货,而生成器则努力生成不被视为假货的可分类照片。这样,未标记的数据可以用于训练生成器,生成器进而为分类器学习提供更多数据。
理由#1: 半监督学习是降低数据成本最有前途的想法之一。许多领域,比如医学成像,注释起来非常昂贵。在这种情况下,这种提法可能会省钱。这个想法是由图灵奖获得者 Yann LeCun 倡导的。
原因 2: 我们大多数人都熟悉数据扩充的概念,比如添加随机裁剪、缩放、旋转和镜像。在这方面,GANs 可以作为“美食数据补充”
原因#3: 虽然这项工作并没有直接关注它的哲学,但据说“如果你能创造出某种东西,你就知道它的一切”。这是生成学习被认为对高级智能至关重要的主要原因之一。本文是 GANs 如何帮助其他任务的一个例子。
原因#4: 除了关注半监督学习,本文还分享了一套改进和评估 GANs 的技巧。其中,他们提出了广泛使用的 Inception Score,这是评估 GANs 的主要指标之一。
**延伸阅读:**强烈推荐观看三位转折奖获得者的 AAAI 20 主题演讲。主题是 CNN 的未来、半监督学习和神经网络推理。我一直在我的大多数文章中推荐这个演讲,我怎么强调观看顶级主题演讲的重要性都不为过。阅读论文很重要,但听作者说些什么是另一半。
#5 动漫甘(2017)
金,,等.“基于生成对抗网络的动漫角色自动生成研究” arXiv 预印本 arXiv:1708.05509 (2017)。
这个列表中的第五个条目,非正式地说,是 AnimeGAN。所有以前提出的方法都处理自然图像。不过,GANs 在其他领域也可以大有用武之地,比如外服生成、精灵完成、漫画风格化、深度假货等等。虽然这篇论文并不特别有名,或者不如这份名单中的其他论文那样知名,但它很好地展示了除了面孔和汽车之外,还有许多探索的途径。
作为艺术控制手段的半监督学习。用 make.girls.moe 生成
理由#1: 甘并不局限于自然的形象和好看的人。生成方法可以用于各种各样的任务(远远超出图像领域)。
原因#2: 本文展示了标记数据集的使用,可以利用它来指导生成器选择特定的发型或眼睛颜色。公式几乎与半监督学习中的公式相同。然而,在这种情况下,我们并不关心训练好的分类器。
**延伸阅读:**GANs 虽然进化很快,但很多成果都停留在学术界。当模型作为交互工具公之于众时,这是件好事。很多东西只能现场学习,比如把算法逼到极致,或者玩弄不寻常的选择。下面是一些有趣的链接: Pix2Pix , AnimeGAN , StyleTransfer , SketchRNN , AutoDraw ,以及art breader。
到目前为止,所展示的作品已经阐述了什么是 GANs,以及如何应用它们来解决计算机视觉中的几个任务。另一方面,下面的工作集中在训练和实现 GANs 的技术方面,例如新的损失和正则化技术
第六名沃瑟斯坦损失(2017 年)
Arjovsky、Martin、Soumith Chintala 和 Léon Bottou。《瓦塞尔斯坦甘》 arXiv 预印本 arXiv:1701.07875 (2017)。
自首次亮相以来,gan 就以难以训练而闻名:大多数时候,生成器无法生成任何有用的东西,或者一遍又一遍地生成相同的东西(模式崩溃)。虽然多年来已经提出了许多“技巧”,但瓦瑟斯坦损失是第一个成为主流并通过时间考验的原则性方法之一。
总的想法是用一个批评家来取代 de discriminator,它判断图像的真假,而批评家只是为每张图像给出一个分数。与法官不同,批评家是无界的;它可以给出任何分数:一分、负三分、一百分等等。在训练过程中,评论家训练尽可能地将假货与真货区分开来,而生成器则训练尽量缩小这种差距。
非正式地说,这种方法的主要优点是它提出了一个不稳定的问题。批评家可以改变自己的观点,降低真实图像的分数,或者提高虚假图像的分数。这是一场猫捉老鼠的游戏。生成器总是在追逐 reals 的分数,reals 总是在逃跑。
沃瑟斯坦损失取代了批评家的鉴别器。
原因#1: 大多数论文都是以温和的介绍开头;这张纸从 0 到 100 真的很快。它的大胆值得一读(如果你热爱数学,这本书正适合你)
理由#2: 没有什么是完美的。虽然许多报纸试图掩盖它们的缺点,但其他报纸热衷于强调和承认它们。这应该得到称赞,因为它邀请其他人做出贡献。引用论文:
重量剪裁显然是一种很糟糕的实施 Lipschitz 约束的方式
**原因# 3:**2017 年后出版的许多著名的 gan 使用了 Wasserstein loss 和一些现在在第二个版本中没有使用的内容。这无疑是该领域的一篇里程碑式的论文,任何从事这方面工作的人都应该阅读。
**延伸阅读:**虽然这份文件或多或少已经成为训练 GANs 的首选文件,但它几乎不是唯一使用的文件。两个值得特别注意的是感知和总方差损失。前者使用冻结的 VGG 网络作为感知相似性的度量,而后者惩罚图像梯度,鼓励平滑。
#7 光谱标准(2018)
Miyato,Takeru,et al. “生成对抗网络的谱归一化” arXiv 预印本 arXiv:1802.05957 (2018)。
Wasserstein 损失以要求梯度为 1-Lipschitz 为代价显著改善了收敛。为了加强这一点,作者建议将权重削减到[-0.01,0.01]。后来,Miyato 等人引入了一种更优雅的方法:光谱归一化。
本文的主要思想是将权重矩阵的最大特征值约束为 1,这反过来保证了 Lipschitz 要求。为了保持较低的计算成本,作者还建议通过使用幂迭代来近似特征值计算,这是非常有效的。
原因#1: 正如上一篇文章中提到的,突出你的弱点会吸引其他作者来投稿。虽然本文的措辞并非如此,但它是对重量削减的直接回应。
原因 2: 正常化是一个比大多数人意识到的要大得多的话题。许多选择属性可以通过专门的规范和仔细的激活功能设计来执行,例如 SELU 激活功能。
原因#3: 这除了是一种范数,也是一种正则化,是神经网络中经常被忽略的话题。除了辍学之外,阅读关于这个问题的成功论文令人耳目一新。
**延伸阅读:**归一化技术的其他最新进展是组归一化和自适应实例归一化技术。前者解决了小批量批量标准的一些缺点,而后者是任意风格转换的关键突破之一。后者也用于#2,以将数据流调节到噪声向量。
#8 自我关注甘(2018)
张,韩,等.“自我注意生成性对抗网络” arXiv 预印本 arXiv:1805.08318 (2018)。
尽管文本和图像处理的整体创新大相径庭,但偶尔也会相互启发。来自自然语言处理社区的注意力是你所需要的全部论文提出了注意力机制,这是一种向 CNN 添加全局级推理的方法。
本文将这一概念引入到 GAN 领域,作为提高图像质量的一种手段。概括地说,自我注意机制计算“每个像素对其他像素的看法”因此,它允许网络在全局级别的关系上进行推理。这是通过取展平图像自身的外积来实现的。
自关注机制计算从每个像素到每个其他像素的分数。
原因#1: 注意力正在深度学习领域掀起风暴。在 2020 年,每个领域都有一个基于注意力的解决方案。甘也不例外。
原因#2: 获取展平图像的外积非常耗费时间和内存,这限制了这种技术在一些低分辨率层上的应用。这在两代 GPU 之前是不可能的。从现在开始的两代人,我们将会看到哪些耗电的方法?
**延伸阅读:**我强烈推荐阅读关于注意力机制的原创论文,因为现在它几乎无处不在。从某种意义上说,它向世界展示了全球层面的推理可以带来什么。然而,它是非常昂贵的。出于这个原因,许多团队正在研究更有效的方法来吸引注意力。一种这样的方法是重整器,高效变压器。如果你对我对这两篇论文的看法感到好奇,我已经在我的人工智能论文(2020 年阅读)的文章中涉及了它们。
#9 边界平衡氮化镓
贝特洛、大卫、托马斯·舒姆和卢克·梅斯。“开始:边界平衡生成对抗网络。” arXiv 预印本 arXiv:1703.10717 (2017)。
大多数 GAN 问题归因于发生器和鉴别器网络之间缺乏平衡。在这篇论文中,谷歌的研究人员提出了一种方法来加强两个参与者之间的平衡,并提出了一种收敛度量来评估发电机在各个时代的演变。此外,通过调整平衡,作者能够权衡图像质量的多样性。
理由#1: 提议相当激进:鉴别器是自动编码器,我们比较编码真假图像的损失。
原因#2: 很难判断 GAN 是否在改进,因为在达到某个质量水平后,人工检查是不可靠的。有一个简单的计算收敛指标是非常方便的。
理由#3: 除了均衡思想,其他都很标准。这显示了如何准确地建模一个问题可以创造奇迹。不需要花哨的图层、规范,也不需要昂贵的操作。
**延伸阅读:**同样, BigGAN 的论文表明,仅仅使用更大的模型和四到八倍的批量就可以极大地提高图像质量。类似地, ProGAN 论文显示,先用小分辨率进行训练,然后逐步加倍,可以帮助达到更高的分辨率,而无需改变模型。
#10 甘人生而平等吗?(2018)
Lucic,Mario 等人“甘人生来平等吗?大规模的研究。” 神经信息处理系统的进展。2018.
我把这一篇留到最后是有原因的:这是迄今为止对 GANs 最广泛的比较研究之一。之前的九个参赛作品都因其高质量的成果和技术突破而备受赞誉。然而,还存在许多其他配方。在本文中,你可以看看不太为人所知的想法,如最小二乘甘或德拉甘。
理由 1: 如果你从这么远的地方来,你很可能会喜欢上甘斯。有什么比一份调查报告更值得继续阅读呢?
原因#2: 本文有一个方便的表格,列出了七种不同配方的发生器和鉴频器损耗。如果实现 GANs 不是你的计划,这个表仍然是一个数学阅读练习。
原因#3: 作为一项比较研究,本文中有几段专门介绍了如何对 gan 进行定量比较,以及进行公平比较所面临的挑战。
**延伸阅读:**关于比较 GANs 这个话题,初始得分 (IS)和弗雷歇初始距离 (FID)是广泛使用的图像集之间相似性的度量。Sajjadi 等人提出了一种不太为人所知的方法,该方法分别采用了质量和多样性的精度和召回分数度量。理解如何比较甘和甘本身一样重要。
我希望这本书对你和我来说都是令人兴奋的。请让我知道你认为符合这个列表的其他文件。我将很高兴阅读和考虑他们的未来列表。😃
如果你喜欢这篇文章,并想继续下去。我还写了 2020 年要读的 AI 论文和 2020 年要读的另外十篇 AI 论文。它们总共涵盖了 50 多篇其他文章(包括链接和延伸阅读)
欢迎评论或联系我。如果你刚接触媒体,我强烈推荐订阅。对于数据和 IT 专业人士来说,中型文章是 StackOverflow 的完美搭档,对于新手来说更是如此。注册时请考虑使用我的会员链接。你也可以直接支持我请我喝杯咖啡😃
感谢阅读:)
GAN Pix2Pix 生成模型
使用 Pix2Pix 模型进行图像到图像的翻译
Pix2Pix
Pix2Pix GAN:简介
我们听到很多关于深度学习的语言翻译,其中神经网络学习从一种语言到另一种语言的映射。事实上,谷歌翻译用它来翻译 100 多种语言。但是,我们能对图像做类似的工作吗?当然,是的!如果有可能捕捉错综复杂的语言,那就一定有可能将一幅图像翻译成另一幅图像。的确,这显示了深度学习的力量。
Pix2Pix GAN 论文早在 2016 年就由菲利普·伊索拉、、、周廷辉、阿列克谢·阿夫罗斯发表。在这里找到论文。后来在 2018 年进行了修订。当它发表后,互联网用户尝试了一些创造性的东西。他们将 pix2pix GAN 系统用于各种不同的场景,如模仿一个人的动作,将一个人的视频逐帧翻译给另一个人。很酷,不是吗?使用 pix2pix,我们可以将任何图像映射到任何其他图像,就像对象的边缘映射到对象的图像一样。此外,我们将详细探讨它的架构和工作原理。现在,让我们开始吧!
来源:GitHub
Pix2Pix GAN 如何工作?
cGAN:概述
听说过生成逼真合成图像的 GANs(生成对抗网络)吗?类似地,Pix2pix 属于一种称为条件 GAN 或 cGAN 的类型。他们有一些条件设置,并在这种条件下学习图像到图像的映射。而基本 GAN 从随机分布向量生成图像,不应用任何条件。迷茫?试着得到这个。
比方说,我们有一个用 MS-COCO 数据集的图像训练的 GAN。在 GANs 中,用发生器网络产生的输出图像是随机的。也就是说,它可以生成数据集中任何对象的图像。但是,有了 cGAN,我们可以生成我们想要的图像。如果我们想让它生成一个人,它会生成一个人的图像。这是通过调节 GAN 实现的。
Pix2Pix GAN:概述
让我们再举一个图像到图像转换任务的例子,即“黑白到彩色图像”的转换。在 pix2pix cGAN 中,B&W 图像作为生成器模型的输入。并且,所生成的模型的输出和给定的输入(B&W 图像)图像对是所生成的对(伪对)。B&W 输入图像和目标输出(即输入 B&W 图像的真实颜色版本)形成真实对。
鉴别器将给定的图像对分类为真实图像对或生成图像对。Pix2Pix 中使用的那个与我们通常期望的分类器输出不同。它生成一个输出分类,对输入图像对中的多个面片进行分类(patchGAN)。我将详细解释它。在下面的描述中,连接被表示为⊕.
Pix2Pix GAN 架构
Pix2Pix GAN 有一个生成器和一个鉴别器,就像普通 GAN 一样。对于我们的黑白图像彩色化任务,输入 B&W 由生成器模型处理,它生成输入的彩色版本作为输出。在 Pix2Pix 中,生成器是一个 U-net 架构的卷积网络。
它接收输入图像(B&W,单通道),将其通过一系列卷积和上采样层。最后,它产生一个输出图像,其大小与输入相同,但有三个通道(彩色)。但是在训练之前,生成器只产生随机输出。
在生成器之后,合成图像与输入 B&W 图像连接。因此,颜色通道的数量将是四个(高 x 宽 x 4)。该级联张量作为输入馈入鉴别器网络。在 Pix2Pix 中,作者采用了一种不同类型的鉴别器网络(patchGAN 类型)。patchGAN 网络采用连接的输入图像,并产生大小为 NxN 的输出。
损失函数
鉴频器损耗
鉴别器损失函数衡量鉴别器预测的好坏。鉴别器损失越小,识别合成图像对就越准确。
GANs 中使用的普通二进制分类器只产生一个输出神经元来预测真假。但是,patchGAN 的 NxN 输出预测输入图像中的许多重叠面片。例如,在 Pix2Pix 中,输出大小为 30x30x1,可预测输入的每个 70×70 面片。我们将在另一篇文章中看到更多关于 patchGANs 的内容。30×30 输出馈入对数损耗函数,该函数将其与 30×30 零矩阵进行比较(因为它是生成的而不是真实的)。
合成图像对丢失
这就是所谓的发电损失。从数据集中计算 B&W 对及其相应的彩色图像的真实损失。这是真的一对。因此,“实际损失”是 NxN 输出的 sigmoid 交叉熵和一个 NxN 大小的矩阵。
鉴频器总损耗是上述两种损耗的总和。损失函数的梯度是相对于鉴别器网络计算的,并且被反向传播以最小化损失。当鉴别器损耗反向传播时,发电机网络的权重被冻结。唷!现在我们差不多完成了。
鉴别器的损失函数
发电机损耗
发生器损耗衡量合成图像的真实程度。通过最小化这个,生成器可以产生更真实的图像。
发电机损耗功能
这种损耗几乎与生成损耗相同,只是它是 NxN 鉴频器输出的 sigmoid 交叉熵和一个矩阵。当这种损耗反向传播时,鉴频器网络的参数被冻结。并且只调整生成器的权重。
为了提高生成图像的美观性,pix2pix 论文的作者添加了一个 L1 损失项。它计算目标图像和生成图像之间的 L1 距离。然后乘以参数“λ”,并添加到发电机损耗中。
训练 Pix2Pix 模型
为了训练模型将 B&W 图像转换为彩色图像,我们必须向网络提供输入和目标图像。因此,可以使用任何带有彩色图像的数据集,如 ImageNet。数据集可以通过将彩色图像转换成 B&W 来构成输入。并且彩色图像本身形成目标。因此,可以通过迭代数据集、将图像一个接一个地或成批地馈送到 pix2pix 模型来训练网络。
就这样…完成了!
那是给你的 pix2pix!希望你对 pix2pix GAN 是什么以及它是如何工作的有一个清晰的认识。
了解如何在自定义数据集上训练 cGAN 模型。
1。如何用 5 个简单的步骤训练一个人工智能 cGAN 模型
安钢:如何培养大脑
~gan 是类比机器,它得到 meta ~
TL;博士——如果你有两个神经网络,每个用于一个不同的任务,那么你有时可以找到一个 GAN,它将一个任务 转换为另一个任务*。类比!因此,找到GAN,它‘GAN’成对的 GAN,你就可以增长层次抽象。使用这些 gan 在观察到的数据分布之外做出预测——类比让你零射击新任务。*
我应该从一个具体的例子开始:
扔石头
假设你有一个已经训练好的观看视频的神经网络。它观察了几千个小时的人们拿着、扔着和扔着棒球。你的网络很擅长预测抛物线轨迹。但是,只见过棒球做那种事情。你给它看一个有人扔石头的单视频,神经网络就丢了。可恶。
但是,等等!如果你能训练出一只能拍下扔石头视频每一帧的狗,然后 把石头转换成棒球 ,那么你就又是金牌了!当然,获得更多摇滚视频可能更容易,但当你试图解决在线学习时,这个问题变得不可克服,特别是对于长尾事件,以及更具适应性、更安全的神经网络所必需的泛化能力。
这里的关键概念是:采用一个众所周知的任务(棒球轨迹),将其与 GAN 翻译器(摇滚到棒球)结合,从而通过类比做出合理准确的预测*。(实际上润色视频的每一帧,使摇滚看起来像棒球,可能太笨拙了。你只需要一个 GAN 来做任何让 rock-translator 网络具有预测性的事情;神经网络生成的训练机制的发展表明,在我们看来,最佳类比转换可能看起来。)*
可以把甘的类比推理能力看作是他自己的一块小石头。因为我们正在用这些东西建造一座大教堂…
甘的甘
假设你一直在用这些 gan 在数百个不同的任务之间形成类比。每一个任务对,你都要检查是否有一个紧凑而准确的‘GANalogy’通常情况下,除非你让你的神经网络变得庞大,以便它能记住所有的东西,否则你无法获得一个像样的 GAN。那些是在感觉层面上实际上不同于的任务。忽略那些;如果 GAN 看起来像他们中的一员,就不要费心全程训练它了。
然而,即使 GAN 模拟网络缩减到几百个神经元,仍有一些任务运行得很好。那些甘人是守护者。一旦你把所有你能理解的 GAN 都弄懂了,你就可以说:“对于这些两个GAN,有 GAN 翻译吗?”这些 GanGANs 会是像“(摇滚到棒球)作品像(雕塑到人)”和“(电场到磁场)作品像(矩阵到矩阵)”这样的东西。 真实、有用的比喻 。包括任务到 GAN 和低层到高层 GAN。每一个对!**
一层一层,向上到更大的抽象,找到工作的 gan。当然,它们中的许多都是多余的——例如,你可能有一个棒球到岩石的 GAN、棒球到苗条和苗条到岩石的 GAN……冗余让你 检查 你的工作,类似于专家神经网络模型的混合。更重要的是,如果几个不同的答案路径都给了相同的结果,它们更有可能是正确的答案,因为的错误往往会使与互不相同,而事实是与* 一致。类似地,自我一致性作为唯一的约束最近仅从视频中生成了近 SOTA 无监督深度感知。***
永远记住细节
我有理由相信,你永远不会想要明确地组合原始的感觉网络,这是一个错误,希望“将众多任务集成到一个单一的端到端神经网络中,将提高性能”。第号保留所有微小的感觉网络,并保留每一个单独的和多余的干,只要它实际上起到类比的作用。这样,任何一个组件任务都有能力独立地与一个新任务相结合,形成一个专门且独特的类比。相比之下,已经集成到单片端到端网络中的任务将从新的 GAN 模拟形成中模糊,因为单片网络作为一个整体不是模拟的。**
随着安钢的进展,我会继续更新,我还不想过多地谈论细节。简而言之:有许多更抽象的损失函数可能值得添加到单个网络的损失函数,以有效地调节这些 gan 的生成和整合。此外,用于推理阶段的 GANs 架构显然有很大的作用;我受到了关于元神经元的工作的启发,这些元神经元用于组合 GAN 输出的不和谐声音。Hinton 的胶囊也是一个值得记住的好模型。请随意尝试——我很慢而且不稳定,所以你可能会在我之前完成。😃**
甘斯:不同的视角
一个直观和无障碍的介绍,以生成敌对网络
生成对抗网络是现代人工智能领域最热门的话题之一。在本文中,我们将从一个不同的角度来看 GANs,即,不把 GANs 看作美丽图像的生成器,而是看作概率分布转换函数。我们将探索 GAN 的核心思想,而不会被实现和复杂的数学所困扰。我们从分析我们手头的问题类型开始。然后,我们了解解决方案的需求如何塑造 GAN 理念。
欢迎来到游乐园!
假设我们拥有一个游乐园。在这个公园里,我们有一台机器,它接收 10 美元,然后随机返回一个价值在 1 美元到 100 美元之间的物品。这台机器在游客中很受欢迎,因为他们不时赢得非常酷和昂贵的东西。此外,这台机器对我们来说很有利可图。因此,机器的赠品选择逻辑准确地击中了甜蜜点,确保了我们和客户的满意度。
作者图片
因此,我们想增加更多的这种机器,以获得更多的利润。但是,有一个问题。这台机器超级贵。因此,我们有兴趣制造我们的机器。为此,我们需要弄清楚机器的项目选择逻辑。显然,选择一个项目的关键参数是它的价值。如果一个项目是昂贵的,它应该是不太可能被选中,以保证我们的利润。然而,如果我们降低选择昂贵物品的概率,就会导致游客的不满。因此,我们的目标是尽可能精确地了解物品价值的概率分布。首先,我们有一个以前机器的赠品列表及其相应的价格。首先,我们试图看看赠品的分布。如果分布类似于一个众所周知的概率分布,问题就解决了。我们使用概率分布作为我们新机器的项目选择逻辑的核心。我们从这个分布中抽取样本来决定返回哪个项目。
作者图片
复杂的机器,复杂的问题
然而,如果我们遇到一个复杂的赠品分布,我们需要设计一种方法来学习一个生成过程的概率分布,只给出分布中的样本。
作者图片
换句话说,我们需要一个模型来查看我们的数据,并找出机器逻辑。的主要观点是,学习数据的概率分布是数据生成的主要任务。
转型生成
让我们抽象地描述我们的目标。首先,我们有一组数据,从这一点开始,我们称之为真实数据。我们的目标是伪造与真实数据相似的人工数据。人工数据通常被称为假数据。因此,我们需要一个模型来查看真实数据并生成逼真的假数据。目标很明确。现在,我们需要从抽象的目标转向更详细的任务描述,并希望将它与更熟悉的东西联系起来。为此,我们需要改变对问题的看法。首先,我们需要熟悉一下变换函数。假设我们有一组来自概率分布的样本。通过应用变换函数,我们可以将这些样本从它们的原始分布变换成期望的目标分布。理论上,我们可以从任何源分布转换到任何目标分布。然而,计算这些变换函数并不总是解析可行的。
现在,让我们回到我们的问题。我们可以把我们的世代问题重新定义为一个转变的任务。我们从已知的分布开始。通常,我们选择均值为 0、标准差为 1 的高斯分布。我们称这种分布为“潜在空间”。现在,我们需要定义一个转换函数,将样本从我们的潜在空间转换到数据空间。换句话说,我们的变换函数从潜在空间中提取样本,并输出数据空间中的样本,也称为数据点。瞧!我们生成数据!只有一个问题。解析地定义这个函数是不可能的。但是,我们不是用神经网络来近似解析定义不了的复杂函数吗?是的,我们有,这正是我们要做的。我们使用神经网络来近似我们的转换函数。我们称这种神经网络为“生成器”,因为最终它会生成数据。挺懂事的。
作者图片
现在谈到使用神经网络,我们需要定义一个损失函数来训练我们的网络。损失函数是正确训练和真实数据生成的关键。因此,我们需要根据我们的目标精确地定义它。
鉴别器:非常有用
一般来说,损失函数评估我们的神经网络在我们的目标方面表现如何,并向模型提供反馈(以梯度的形式)以改进自身。这里,我们需要一个损失函数来衡量我们生成的数据遵循真实数据分布的程度。换句话说,我们想要一个损失函数,它可以告诉我们,我们的假数据有多真实。尽管如此,我们没有任何关于真实数据分布的信息。这从一开始就是我们的主要问题。然而,我们可以通过区分真实数据和虚假数据来达到同样的目的。
假设我们的损失函数可以区分真实数据和虚假数据。
作者图片
然后,我们可以将我们的假数据提供给这个函数。对于那些与真实数据难以区分的假样本,我们不需要做任何事情。对于其他假样本,损失函数将提供反馈来更新和改进我们的生成器。
作者图片
更具体地说,我们可以使用一个分类器作为损失函数,可以对真实数据和虚假数据进行分类。如果一个生成的数据点被分类为真实的,这意味着它类似于真实的数据,我们不需要采取任何进一步的行动。对于那些被识别为生成数据的假样本,我们会问损失函数,我们应该如何更新我们的生成器,以使这些样本看起来更真实。损失函数以梯度的形式提供答案,以更新我们的神经网络中的权重。
看来我们已经找到了解决方案的最后一部分!然而,我们必须注意另一个问题。虽然我们建议的损失函数满足我们的要求,但在实践中并不容易实现。因此,我们的损失函数是一个复杂的函数,我们可以定义它的特征,但我们不能直接实现它。看起来是个死胡同。但是,是什么阻碍了我们使用神经网络来近似这个损失函数呢?没什么!所以,我们开始吧。我们可以使用分类器神经网络作为我们的损失函数。我们称这个网络为“鉴别器”,因为它可以鉴别真实和虚假的数据。非常明智的命名。
作者图片
最重要的是,我们非常熟悉使用神经网络进行分类。我们知道如何训练它们,它们的损失函数,以及它们的输入和输出应该是什么样子。然而,同时训练两个神经网络不是常规的事情。现在,最后的问题是,我们应该如何一起训练所有这些网络。
让火车开始吧!
作者图片
如果我们在开始训练生成器之前有了完美的分类器,我们的训练将变得非常简单。不幸的是,在训练过程的开始,我们的鉴别器就像我们的生成器一样毫无头绪。更糟糕的是,我们不能在开始训练生成器之前训练鉴别器,因为我们需要假数据来训练鉴别器。如你所见,这两个网络在训练中相互依赖。发生器需要来自鉴别器的反馈来改进,并且鉴别器需要随着发生器的改进而保持更新。因此,我们交替训练它们。对于一个批次,我们训练鉴别器来区分真假样品。然后对于一个批次,我们训练生成器生成被鉴别器识别为真实的样本。这种方法被称为“对抗训练”。当我们使用对抗训练进行数据生成任务时,我们得到生成性对抗网络,简称 GAN。
然而,当我们看训练程序时,我们看不到“对手”本身。为了找出“对抗性训练”这个术语的来源,我们应该仔细看看两个网络的目标。鉴别器的目标是尽可能准确地对真实数据和虚假数据进行分类。因此,在鉴别器训练阶段,鉴别器试图正确地识别假样本。另一方面,我们训练生成器生成逼真的假数据。为了通过真实性测试,生成器应该让鉴别器相信它生成的数据是真实的。换句话说,生成器试图愚弄鉴别器,而鉴别器试图不被生成器愚弄。这些相互矛盾的目标启动了培训过程。
在培训期间,两个网络都在目标方面有所改进。最后,在某个点上,生成器变得如此之好,以至于鉴别器无法区分假数据和真实数据,这就是我们完成训练的点。
作者图片
陷阱。很多啊!
对于一个非常困难的问题,GANs 是一个美丽而复杂的解决方案。借助 GAN,我们可以快速、高效、精确地解决一个长期存在的问题,并为许多激动人心的应用铺平道路。然而,在开始应用之前,我们应该了解 GANs 的常见问题。首先,生成器是一个神经网络,根据定义,它是一个黑盒。虽然经过训练的生成器将关于真实数据分布的信息嵌入到其权重中,但我们无法显式访问它。当我们处理低维数据时,我们可以通过采样来检索这些信息,但对于高维数据,我们无能为力。此外,与其他神经网络不同,GANs 损失函数提供的关于训练进度的信息很少。在培训期间,我们需要手动检查发电机样品,以检查培训进度。最后,如前所述,训练发生在生成器和鉴别器之间的战斗中。如果他们停止互相争斗,训练过程就会加快,不幸的是,他们经常在一段时间后停止争斗。造成这个问题的原因有很多。例如,如果其中一个网络比另一个提高得快得多,它就会压倒另一个网络,训练就会停止。因此,网络架构应该是平衡的。但是平衡是什么意思呢?这个问题没有直接的答案。通常,人们应该通过反复试验来找到它们。所以 GAN 训练过程相当不稳定。对于稳定性问题有许多建议的解决方案,但是它们大多解决一个并增加另一个,或者需要满足一些特定的条件。简而言之,提高甘的训练进度仍然是一个未解决的问题,围绕这一问题的研究非常活跃。
结论:冰山一角
让我们回到我们的昂贵的机器开始。从时间和资源的角度来看,这台机器象征着所有昂贵的数据生成过程。假设我们有一个中等规模的人脸数据集,对于一个应用程序,我们需要一个更大的数据集。我们可以拿起相机,给人们拍照,然后把它们添加到数据集中。然而,这是一个耗时的过程。现在,如果我们在可用的图像上训练一个 GAN,我们可以在几秒钟内生成数百个图像。因此,数据扩充是 GANs 最突出的应用之一。
数据稀缺并不是唯一的动机。让我们回到人脸数据集。如果我们想使用这些照片,我们很可能会遇到隐私问题。但是如果我们使用实际上并不存在的人的假图像呢?非常好!没人会在意。因此,GANs 为数据隐私问题提供了一个简洁的解决方案。甘的研究团队现在非常活跃,每天都有新的应用或改进被提出。尽管如此,仍有许多东西有待发现。这只是冰山一角。
GANs 和低效映射
甘人如何把自己绑在绳结里,为什么这会损害训练和质量
图片来源:维基共享资源
给手机用户的一个警告:这篇文章中有一些厚的 gif 图片。
生成对抗网络(GANs)被誉为生成艺术中的下一个大 Thing™️,这是有充分理由的。新技术一直是艺术的驱动因素——从颜料的发明到照相机到 Photoshop——GANs 是自然的下一步。例如,考虑以下图片,发表在 2017 年埃尔加马尔等人的论文中。
图一:残创作的抽象艺术(来源: arXiv:1706.07068v1 )
如果你不熟悉 GANs,这篇文章包含了训练过程的简要概述。简而言之,GANs 将随机噪声作为输入,并且(如果训练顺利的话)产生与真实数据不可分辨的输出,真实数据实际上可以是任何东西(一组抽象画、名人的照片、手写数字等)。).
与之前的变分自动编码器一样,在 GAN 文献中,输入值通常与输出没有明确的关系,这是一个记录良好的问题。正如我前面提到的,GANs 接受随机噪声(通常是 100 个随机的正态分布值)作为输入,每个随机数都可以看作是控制输出的杠杆。理想情况下,每个杠杆对应一个特征——在生成人脸的情况下,将有一个杠杆用于微笑或皱眉,一个用于肤色,一个用于头发长度,等等;这种情况很少发生,这使得把 GANs 用于艺术有些冒险。作为这个问题的可视化,考虑下面的动画:
图 2:(上图)在 MNIST 数据集上训练的 GAN 的输出。当(底部)控制杆被调整时,输出无意识地改变,一次一个,而其余的保持不动。只有两个杆被调节,其他 12 个(静态)杆未显示。
在这里,我使用 16 维的潜在空间在 MNIST 手写数字数据集上训练了一个 GAN。我使用这个 GAN 生成了一个随机样本,然后举例说明了当一个输入值被调整而其他值固定不变时,输出是如何变化的。正如你所看到的,这两个杠杆都没有以一种人类可能会觉得直观或有用的方式改变输出;第一个杠杆控制数字是 7 还是 9 以及笔画角度,而第二个杠杆控制数字是 7 还是 9 以及笔画粗细。很蠢,对吧?人们可以想象生成“手写”数字的理想工具是什么样的:第一个杠杆控制生成哪个数字,从 0 到 9;第二杠杆控制笔画的粗细;第三个控制冲程角度;第四,循环……你明白了。相反,我们看到这些特征中的几个由单个杠杆控制,其中一个由多个杠杆控制。想象一下,如果 Photoshop 的旋转工具也通过色轮旋转图像的色调,那将是多么令人沮丧!
这里显而易见的问题是,对于图像生成来说,这是一个低效的、完全混乱的界面。然而,还有另一个不太明显的问题:输入和输出之间扭曲复杂的关系也阻碍了训练,限制了输出的整体质量。
问题一:螺旋
正如我在这篇文章中所解释的,GANs 本质上是一种建模一些数据分布的工具,无论是正态分布还是人脸分布。因此,GAN 是从某个潜在空间到某个样本空间的变换或映射。当 GANs 的学生一头扎进像图像生成这样的高维问题时,这一点经常被忽视。在这里,我打算使用简单的二维问题来演示低效的映射问题,第一个问题如下所示:
图 3:(左)将[[-1,1],[-1,1]]中的均匀噪声映射到螺线的简单函数的潜空间和(右)样本空间。色调和值用于演示潜在空间中的哪个区域映射到样本空间中的哪个区域
这是一个相当简单的函数,它将输入空间中的 x 轴映射到样本空间中沿螺旋的位置(角度和半径),将 y 轴映射到螺旋内的横向位置。出于可视化的目的,x 轴也映射到色调,y 轴映射到值(彩色对黑色)。为了进一步阐明此功能,请考虑以下动画:
图 4:图 3 中描述的函数的潜在空间和样本空间之间的线性插值
那么,问题是训练一个 GAN,它能够以这样一种方式从这个螺旋分布中采样点,使得来自 GAN 的一批和来自真实函数的一批是不可分辨的。注意,GAN 不必学习原始映射;只要输出分布相同,任何映射都可以。
结果:
图 5:(左)GAN 的潜在空间和(右)输出分布
使用典型的 GAN 训练技术(代码可在文章末尾获得)对 GAN 进行 60k 训练步骤的训练。如你所见,GAN 成功地学会了螺旋分布。然而,它有几个问题:
- 它比目标函数要细得多。尽管螺旋的某些部分具有一定的宽度,GAN 基本上将这种分布减少到 2 维空间中的 1 维流形。
- 输出很乱;注意散布在螺旋负空间的点。这些从来没有在目标函数中出现过,那么它们在这里做什么呢?
- 注意点(0.60,-0.63)和(0.45,0.17)的奇怪伪影;这些不连续性导致分布中的空洞。
- 将 GAN 产生的螺旋中的色调和值的分布与原始函数中的进行比较(图 3);它们的有序性要差得多,并且没有显示出潜在空间(杠杆)和产出之间的明确关系。
所有这四个问题在这个动画中都有说明:
图 6:潜在空间和 GAN 输出之间的线性插值
如你所见,这四个问题实际上都是同一个问题。比较图 6 和图 4,我们可以看到 GAN 已经学会了一种低效的映射。首先考虑潜伏空间右上角的撕裂;裂口上方的潜在空间区域被映射到螺旋的最外面部分,而紧靠裂口下方的区域被映射到螺旋的中心。这种撕裂行为解释了混乱(问题 2);位于和上的任何一点都被映射到这两个极端之间的某个地方,通常落在螺旋的负空间。它还解释了(0.60,-0.63)处的伪像(问题 3),因为在该区域中生成的点是从潜在空间中的远点映射的,这也是为什么颜色的色调和值也不一致(问题 4)。最后,通过映射的复杂性解释了学习分布(问题 1)的皮肤性;分布的大部分方差来自于沿着螺旋的位置*,而在螺旋宽度内的位置不太重要。因此,甘人首先学会了如何制造螺旋。每当它试图扩大范围时,映射的复杂性会导致一些其他区域中断,就像新手开发人员的意大利面条代码一样(我们都经历过)。GAN 基本上把自己困在了一个无法逃脱的局部极小值中。如果你很好奇(如果不是,恕我直言,你为什么要读这篇文章?),这是 GAN 训练时的样子:*
图 7:训练期间螺旋生成 GAN 的输出(彩色)和来自目标函数的样本(灰色)。
图 7 显示,GAN 很快了解到最外层和最内层区域的不兼容映射,其余分布被迫在它们之间进行协调。
问题二:八个高斯人
图 8:八高斯问题,左边是潜在空间,右边是样本空间。
该函数将 2.5 维空间映射到 2 维空间。潜在空间中的前两个维度是独立的、标准的正态分布值。剩余的“0.5”是具有八个可能值的离散维度,被编码为长度为八的向量,其中一个值被设置为一,而其余的值为零。在图 8 中,潜在空间中的随机样本通过在 x 轴和 y 轴上绘制两个连续维度来说明,而离散维度由颜色表示。目标函数基于潜在维度的值,通过以因子 0.2 重新缩放正态分布并将其移动到八个点之一,将该潜在空间映射到样本空间。这个过程在这里是动画:
图 9:八高斯问题的潜在空间和样本空间之间的线性插值
那么,问题是训练一个 GAN,它能够以这样一种方式从这八个高斯分布中采样点,使得来自 GAN 的一批和来自真实函数的一批是不可分辨的。注意,就像上面的螺旋问题一样,GAN 不必学习原始映射,但是有一个简单的映射显然是更可取的。
结果:
图 10:(左)在八高斯问题上训练的 GAN 的潜在空间和(右)输出分布
很糟糕。GAN 完全不能在两种模式下产生样本(模式崩溃),它在模式之间产生大量的点,它不能产生正态分布的模式,并且在潜在空间和样本空间之间明显没有合理的关系。这一点在下面的动画中更加明显:
图 11:潜在空间和 GAN 输出之间的线性插值
显而易见,两个连续潜值内的不同区域被剪切并映射到六个样本空间模式。这与螺旋问题中的撕裂提出了同样的问题;落在裂缝上的点被映射到模式之间的负空间。尽管解决方案很简单(即缩小连续维度,并将离散维度中的每个值映射到不同的模式),但 GAN 陷入了局部最小值,无法将自己挖出来。
问题三:一个高斯
图 12:“一个高斯”问题,潜在空间在左边,样本空间在右边。
八高斯问题显然太难了,所以这里有一个更简单的问题:将二维均匀噪声转换成二维标准正态噪声。如同在螺旋问题中,通过沿着 x 轴旋转色调和沿着 y 轴改变潜在空间的值来给点着色。最简单的映射很简单:独立扩展每个维度。这里举例说明了这一点:
图 13:一个高斯问题的潜在空间和样本空间之间的线性插值
结果:
图 14:(左)在一个高斯问题上训练的 GAN 的潜在空间和(右)输出分布
正如你所看到的,即使是从简单的二维正态分布中采样,GAN 仍然会打结。最值得注意的是,GAN 似乎将潜在空间折叠在自身上,导致样本空间右下角出现扭结、间隙和突起。以下是插值动画:
图 15:潜在空间和 GAN 输出之间的线性插值
结束语
可能我已经反复强调了这一点。然而,我希望上面的可视化已经清楚地表明,输入和输出特征之间的模糊关系不仅仅是一个简单的不便,而是一个更基本的问题的征兆。如果您对用于训练上述 GANs 的代码或可视化代码感兴趣,两者都可以在以下 github repo 中获得:
低效 GAN 映射的训练代码和可视化
github.com](https://github.com/ConorLazarou/medium/tree/master/12020/visualizing_gan_mapping)
推动生物研究的甘斯
图片来自【来源】
介绍
像 GANs 这样的生成网络对于其他深度学习模型来说是独一无二的,因为它们生成样本,而不是优化输出。这允许一定程度的创造性;科学家可以分析生殖模型的输出,以了解生物系统。
本文的目的是详细说明 GANs 在科学研究中的潜在应用,所以我将假设对 GANs 有一个初步的了解。基本上,GANs 包含一个生成器,它在鉴别器的帮助下学习数据集的分布,从而产生一个能够输出新样本的模型。该架构如下所示:
GANs 的一般架构。图片来自来源
我将 GANs 对科学研究的贡献分为三大类:准备、指导和建模。
准备
准备研究样本可能是生物学研究中最不吸引人的部分之一。当我们有一些数据,并且我们想把这些数据转换成图像时,GANs 是有用的(当我们输入数据时,我们使用条件 GANs,或 cGANS)。因此,我们需要分析在准备阶段我们可能需要在哪里生成图像。
一篇论文[1]使用 cGANs 作为用于计算分析的标准化染色组织细胞的方法。进行染色标准化是为了减少染色组织中的不一致性(例如,一些样本可能比其他样本染色更深),并为计算机辅助检测系统准备这些组织。
然而,执行染色标准化的标准技术通常会扭曲组织结构中的细微之处。作者利用 cGAN 来解决这个问题,因为 cGAN 可以更好地了解组织样本的底层结构,从而保留其结构。因此,cgan 可以用作组织分析管道中的预处理步骤。
标准标准化与 cGAN 染色到染色翻译(STST)。目标是使生成的染色与参考相似。图片来自【来源】
方向
GANs 对于在科学研究中建立潜在的方向特别有用:我们可以使用 GANs 生成分子或尝试潜在的蛋白质结构。
GANs 输出的分子很少是稳定的或潜在有用的,但我们可以随后使用其他深度学习模型来筛选数据集中少数有前途的分子。这将通过产出比我们用标准技术生产的更多的可行药物来推进药物发现(药物发现的标准技术意味着仅仅依靠高级化学家的想象力)[2]。
红圈代表 GANs 将影响的药物研发阶段。图片修改自【来源】
然而,药物发现的过程不仅仅是发现可能的药物。测试是严格的,一种药物通过这些标准的概率极低。对于一种有用的药物,它必须与预期的蛋白质或途径发生反应,以产生预期的效果,同时不与我们无数的其他身体系统发生反应。这样的壮举必然是困难的;甘斯只是让我们更快地失败。
GANs 还可以通过产生潜在的蛋白质设计来提出新的科学方向。然而,输出新的蛋白质比生成小分子要困难得多,因为无数的相互作用促成了蛋白质的复杂结构。因此,使用 GANs 来设计新的蛋白质并不像产生更小的分子那样发达。然而,由于新的蛋白质被用于工业(例如,洗衣液使用酶),蛋白质设计的任务不受生物系统中分子下游效应的限制。
建模
GAN 能够输出新的图像,因为它学习了特定种类的成像的分布。例如,如果 GAN 在猫的数据集上训练,它学习猫图像的分布,因此能够基于该分布输出图像(看起来像猫)。我们可以用同样的方法来模拟生物系统。
如果一种蛋白质影响整个细胞的结构,那么我们可以修改代表该蛋白质的特征向量,以生成细胞结构的图像。使用这种 GANs,我们可以通过在细胞发育的不同阶段取样来研究细胞结构的变化。然后,我们可以插入输入蛋白质的特征向量,从而产生细胞发育的连续模型[4]。
细胞结构取决于红色染色的蛋白质。图片来自【来源】
我们可以将相同的过程应用于过多的系统,例如组织发育建模[5]。随后,当我们进一步研究该系统时,我们可以导出影响该系统的附加变量。我们可以通过添加新发现的变量来重新训练我们的 GAN,然后 GAN 将成为生物系统的一个更加精确的模型。然后,当我们发现所有重要的变量时,GAN 实际上将是生物系统的完美代表:我们输入一些变量,然后它生成生物系统的确切条件。
鉴于实际上任何生物系统的复杂性,我们还远远没有实现这个理想,随着我们对它们的进一步研究,GANs 有可能代表生物系统的完美数学模型。
参考
- 萨利希,佩加等人。基于 Pix2Pix 的染色到染色翻译。
- 使用基于潜在向量的生成对抗网络的从头分子生成方法。
- 拉姆松达、巴拉思、等。面向生命科学的深度学习。
- 奥索金,安东,等人。生物图像合成。
- 韩,,等。用有监督的遗传神经网络学习组织的生成模型
每个人的 GANs
革命性人工智能概念的直观解释
来源。图片免费分享。
“对抗训练是自切片面包以来最酷的事情.”— 脸书首席人工智能科学家 Yann LeCun
生成对抗网络(GAN)在机器学习领域已经显示出巨大的能力和潜力来创建逼真的图像和视频。除了其生成能力,对抗性学习的概念是一个框架,如果进一步探索,可能会导致机器学习的巨大突破。
本文将使用易懂的解释和图表,本能地解释 GANs 如何工作,他们在训练中遇到什么挑战,以及对抗性学习的力量。
GAN 是由两个模型组成的系统:发生器和鉴别器。
鉴别器只是一个分类器,它确定给定的图像是来自数据集的真实图像还是来自生成器的人工生成的图像。这个二元分类器将采用卷积神经网络的形式。
生成器的任务是接收随机输入值(噪声),并使用去卷积神经网络创建图像。可以把这个概念想象成为随机数发生器设置一个种子,同样的输入噪声会产生同样的输出。生成器使用随机噪声作为各种种子来产生图像。
作者创建的图像。
双模型系统的目标是让生成器欺骗鉴别器,但也让鉴别器以其所能达到的最高精度对生成器的图像进行分类。这两个有价值的对手(生成性对抗性网络)之间的持续战斗意味着两种模式都通过试图击败对方而变得更好。生成器使用鉴别器来获得关于其图像可信度的反馈,并且鉴别器从生成器获得更多数据来进行训练。
去进化神经网络(DNN)是 GAN 的心脏。它是负责生成图像的算法。顾名思义,卷积神经网络可以被认为是“反向运行 CNN”,但其机制要复杂得多。DNNs 也称为 deconvs 或转置卷积神经网络,它使用类似于 CNN 的层,但向后向上采样(与向下采样相反),使图像更大。
这比 CNN 还难。通过压缩或概括图像信息来缩小图像,比放大图像而不使其模糊且细节不变要容易得多。这个问题用转置卷积(反卷积)来解决。
在这个意义上,如果 DNN 是 GAN 的心脏,转置回旋就是动脉。理解反卷积首先需要理解卷积。例如,考虑以下卷积:
作者创建的图像。
假设步幅为 1,如下执行以下卷积。卷积将图像概括为一个较低的维度。
作者创建的图像。
去卷积层的目标与卷积层相反:获取一个简化的图像和一个可训练的内核,并预测“原始图像”在这种情况下,随机噪声将通过一系列反卷积进行转换,以产生更清晰的图像。
作者创建的图像。
基于鉴别器的结果训练这些转置卷积。如果鉴别器表现不佳,那么生成器的当前权重是可取的,并且适当地欺骗了鉴别器。但是,如果鉴别器性能良好,则需要大幅改变生成器的当前权重,以降低鉴别器的性能。换句话说,鉴别器是发电机的损失函数。
虽然这个想法是革命性的,但众所周知,GANs 很难训练。GANs 中的一个常见故障是鉴别器超过了生成器,以 100%的确定性识别生成的图像是假的。因为鉴别器用作调整反卷积层权重的损失函数,所以绝对确定性不会给生成器留下下降的梯度。
训练 GANs 的另一个常见故障是模式崩溃,即生成器发现并利用鉴别器中的弱点。当 GAN 生成相似的图像而不管随机输入的变化时,可以在 GAN 中识别模式崩溃。这意味着生成器只生成它知道几乎总是会欺骗鉴别器的图像。这意味着生成器没有改进,因为鉴别器给出的结果很差,这意味着生成器正在产生理想的结果。模式崩溃有时可以通过以某种方式“加强”鉴别器来纠正(例如,通过调整其训练速率或重新配置其层)。
用 GANs 生成手写数字。照片来自奥莱利。图片免费分享。
GANs 基于这样一种理念,即两个实力相当的个体之间的竞争会促进双方的发展,并要求双方都受到健康而谨慎的监管,以免一方剥削另一方。
生成对抗网络和对抗学习作为一个领域仍然非常年轻,并显示出巨大的潜力。他们有巨大的潜力来塑造数字世界——无论是好是坏。Deepfakes 有能力将人们的脸放在令人反感的视频上(通过指定图像作为生成器的输入噪声),可以摧毁生命并欺骗数百万人。危险的深度伪装的解决方案可能在于对抗性学习本身——加强和分析鉴别器。
甘斯从零开始。
生成对抗网络及其在 PyTorch 中的实现
去年,生成对抗网络(GANs)凭借那些令人印象深刻的人类面孔在人工智能领域掀起了一场风暴。他们真的很酷,不是吗?它们基本上是从无到有产生的。
没什么??。咳嗽炫耀咳嗽*。你们用数据来训练模型。我们知道这些“机器学习”是如何工作的。这只是一个输入输出函数的近似值。没什么让人印象深刻的。这只是另一种算法。*
不完全是。甘氏属于内隐学习方法。在显式学习模型中,模型直接从数据中学习其权重。而在隐式学习中,模型在没有数据直接通过网络的情况下进行学习。
啊!,所以是强化学习?
RL 和 GANs 之间有一些相似之处,因为他们都使用演员-批评家的方法。但学习的性质在甘是不同的。
好吧!我放弃了。所以,把甘解释成我 5 岁。
好吧。因此,在巴塞罗那市,一个新的警察被任命来验证驾驶执照的真实性。他的工作是分类合法的和假的。因为他是新人,所以不管他的分类是否正确,他都会从他的同事那里得到反馈。镇上还有一个新的伪造者,他的目标是制造假驾照。所以,伪造者打印任何他认为是执照的东西,然后提交给警察。警察然后接受/拒绝它。每当警察拒绝它时,伪造者从错误中吸取教训,并试图开发一个万无一失的许可证,当它被接受时,他生产更多类似的许可证。但是当警察接受假执照时,他被同事纠正了。通过相互学习,警察和伪造者都会做得更好。
咄!似乎应该由同事来验证
我以为你才 5 岁。好吧,这是一个更好的版本。在 GANs 中,有两个网络鉴别器(警察)和生成器(伪造者)。生成器创建假数据(图像),鉴别器对图像进行分类。基于来自鉴别器的结果,生成器开始学习创建越来越好的图像。因此,鉴别器和发生器都竞相提高性能。他们互相学习,每次跑步都越来越好。有趣的是,这两个网络都在学习过程中。所以,即使是鉴别器也不能一直正确分类。假设鉴别器将假图像分类为真图像,生成器从该结果得知生成的图像是好图像。当鉴别器通过从训练数据(同事)获得反馈来学习时,这将被修复。听起来他们两个肯定会融合。但是 GANs 的收敛性和稳定性是一个独立的话题。
嗯,我必须说 GANs 现在听起来很有趣。因此,基本上生成器在看不到数据的情况下学习数据的底层分布。但是它从鉴别器网络学习,鉴别器网络也随着发生器同时学习。令人印象深刻。现在我想实现 GANs 并创造这些新的人工智能人。
卡拉斯等人https://arxiv.org/abs/1812.04948
呃。没那么快。为了这个结果,你需要更好地了解 CNN,大量的超参数调整,8 特斯拉 GPU 和一周的培训时间。在笔记本电脑上训练 20 分钟的基本数据集上的香草甘怎么样?听起来不错?那我们就这么做吧。
我使用 PyTorch 来实现它们。是的,我已经能听到来自 Keras/Tensorflow 人的“嘘声”。保持冷静,抓住机会适应它,就像我一样。
数据集:
听说过 MNIST 数据集吗?。是的,我们会用到它。图像是灰度的,形状为 28×28 像素。让我们从torch.datasets
模块加载数据集。图像被展平,并且使用multiple_transforms
将值归一化为 0–1。DataLoader
功能帮助批量切片训练数据。
from torch.datasets import MNIST
from torchvision import transformstrans = transforms.Compose([transforms.ToTensor(), torch.flatten])
traindata = MNIST(root='./data', transform=trans, train=True, download=True)
trainloader = torch.utils.data.DataLoader(traindata, batch_size=6000, shuffle=True)
网络架构:
我们将使用具有以下配置的全连接网络。不要对层和神经元感到困惑。您可以根据需要删除/添加层。这种配置有一些最佳实践,我将在后面解释。发生器的输入是任意值的噪声。在这里,我选择了 128 个神经元。生成器的输出必须与训练数据值(784)的形状相匹配。鉴别器得到 784 个神经元的输入,输出单个值,不管是真(1)还是假(0)。
将整个架构转化为网络相当简单。实现nn.Modules
类并定义forward
函数。pytorch 最棒的地方就是亲笔签名的功能性。这意味着,我们不需要做背后的数学运算。自动计算所有神经元的梯度。
酷毙了。一旦定义了这两个类,我们就可以实例化它们了。别忘了定义成本函数和要使用的优化算法。
discriminator = Discriminator()
generator = Generator()criterion = nn.BCELoss()
discrim_optim = optim.Adam(discriminator.parameters(), lr= 0.0002)
generat_optim = optim.Adam(generator.parameters(), lr=0.0002)
为什么要进行这种 BCELoss 和 Adam 优化?
香草甘使用极大极小算法。最小最大损失通过生成器和鉴别器预测概率的对数损失来计算。BCELoss 是二元交叉熵损失,它是概率的对数损失。可以使用两个不同的损失函数来训练生成器和鉴别器,但是这里我们对两者使用一个损失函数。对于权重更新,我们使用 Adam optimizer,因为每个人都在使用它。哈哈,jk。你可以试试其他优化软件,比如 SGD,Adagrad。
这样,模型设计完成了。耶。现在,让我们训练模型。
模特培训:
无论会发生什么样的混乱,都发生在这里。我们一步一步来。所以我们必须同时训练鉴别器和发生器。这基本上意味着以下步骤。
- 向前通过鉴别器
- 反向传播鉴别器误差
- 更新鉴别器权重
- 向前通过发电机
- 反向传播生成器错误
- 更新发电机重量
重复一遍。
# Noise input for generator
def noise(x,y):
return torch.randn(x,y)for epoch in range(2000):
for pos_samples in trainloader:
# Training Discriminator network
discrim_optim.zero_grad()
pos_predicted = discriminator(pos_samples[0])
pos_error = criterion(pos_predicted, torch.ones(batches,1)) neg_samples = generator(noise(batches, 128))
neg_predicted = discriminator(neg_samples)
neg_error = criterion(neg_predicted, torch.zeros(batches,1)) discriminator_error = pos_error + neg_error
discriminator_error.backward()
discrim_optim.step()
# Training generator network
generat_optim.zero_grad()
gen_samples = generator(noise(batches, 128))
gen_predicted = discriminator(gen_samples)
generator_error = criterion(gen_predicted, torch.ones(batches, 1))
generator_error.backward()
generat_optim.step()
就是这样。搞定了。
哇哇哇。慢点。我有很多问题!
为什么只索引数据, *pos_samples[0]*
。训练数据的标签怎么了?
- 漂亮的斑点。在香草甘,我们不在乎标签。我们基本上给出所有的训练数据来训练网络,而不管它来自哪个类。因此,发生器网络必须拟合权重,以重现不同噪声输入的所有变化。也就是说,GANs 有几个变化,它考虑了像辅助 GANs 这样的标签。
这个 zero_grad()对于优化器来说是什么? -对于每个时期,我们希望梯度为零,以便在每次反向传播期间计算的梯度可以在神经元中没有剩余梯度的情况下出现。如果没有 zero_grad(),梯度将在每个时期累积,这在像 RNNs 这样的网络中很有用。
如何将两个错误相加并执行 backward()?
——好大的 pythonic 吧?这是 pytorch 的亲笔签名模块。它负责反向传播这两个错误。
好的,那么现在你如何知道网络何时被训练?。我应该观察哪个成本函数?
- 如前所述,收敛是 GAN 中一个有趣的问题。严格来说,当鉴别器和生成器都达到纳什均衡时,GAN 就被称为被训练。由于 GAN 是一个极小极大问题,当一个网络最大化其成本函数时,另一个网络试图最小化它。我们正在训练两者来提高。纳什均衡状态下,代理人不改变其行动的过程,不管其他代理人的决定。在训练过程中,一个网络从另一个网络开始训练,但是当它到达一个点,不管另一个网络的决定,鉴别器或生成器都不会变得更好时,它就达到了纳什均衡。实际上,给定一组相同的真实和伪造图像,鉴别器将检测每个真实和伪造图像为真实的,因此预测精度将为 50%。
最佳实践:
几乎没有关于更好的模型和更快收敛的最佳实践。我故意把这个放在最后,因为有些讨论可能会改变代码,如果在主要内容中解释,会导致混乱。
- 在最后一层,对鉴别器使用 sigmoid 激活函数,对生成器使用 tanh 函数。在这种情况下,发电机的输出将在范围(-1,1)内。因此,我们还必须将训练数据标准化到这个范围(-1,1)
- 不是为 1 训练真实图像,为 0 训练虚假图像,而是用 0.98 和 0.02 或类似的值训练它们
- 为了快速检查您的 GAN 设置是否正常工作,请将训练数据限制在单个类中,并检查它们的表现如何。在包含 10 个类的 MNIST 数据集上,对于一些未失真的图像,可能需要几个小时的时间,因此最好检查一下配置是否适用于有限的数据集。
- 由于生成器比鉴别器需要更多的训练时间,所以在鉴别器中使用丢弃层可以阻止过拟合。
以下是完整的代码:
感谢您阅读帖子。如果你发现了任何错误或有疑问,请在评论中告诉我。
欢迎通过 Github 、 Twitter 和 Linkedin 联系我。干杯!。
非常感谢文章作者迭戈·戈麦斯莫斯克拉。
生成对抗网络
深度学习领域的 GANs
深入深度学习的神奇世界,释放您机器的艺术能力。
“我们不断前进,打开新的大门,做新的事情,因为我们很好奇,好奇心不断引领我们走上新的道路。”—华特·迪士尼
机器学习是我们生活中不可或缺的一部分。从我们手机键盘顶部的东西到驱动自动驾驶汽车领域的东西,它无处不在。机器学习领域每天都在进步,不断有创新和新想法出现。机器学习的一个贡献,确切地说是深度学习领域,是 GAN 生成性对抗网络,在我看来,这是科学创造的一种纯粹的魔法形式。
GAN 是一类致力于创造新事物的深度学习框架。与用于检测各种事物的传统深度学习技术不同,GAN 用于产生新的事物。把甘想成一个画家;它喜欢画画。识别一个特定的物品,比如说一顶帽子,任何有文化的人都能做到。我们可以使用深度学习框架在计算机上轻松模拟这一点。而甘则是向创造力迈进了一步,一个接近智力的层次。
信用:此人不存在
上面显示的图像不是真人,而是由机器从头开始生成的。这就是甘的全部。
甘是伊恩·古德菲勒和他的同事在 2014 年提出的,当时伊恩 28 岁。作为甘的父亲,他被认为是赋予机器想象力的人。传说有一天晚上,伊恩的朋友在一家酒吧就一台生产图像的机器找到了他。现在,让我们仔细看看伊恩的甘斯。
在我们大致了解 GANs 如何工作之前,我请求您阅读一些关于深度学习的内容,所有这些都是通用算法,如反向传播和 CNN,以便更好地理解 GANs。以下是一些有用的链接。
1.反向传播[http://neuralnetworksanddeeplearning.com/chap2.html
2.CNN[https://brohrer . github . io/how _ convolatile _ neural _ networks _ work . html]
3.自适应反进化网络[https://ieeexplore.ieee.org/document/6126474
GAN 的两个主要支柱是发生器和鉴别器。这是两个复杂的神经网络,是 GAN 的神奇背后的工作手。
我们先用一个例子来试着理解这些。
把生成器和鉴别器分别看成是学生和助教(TA)。他们两个都是来这里接受检查的。让我们假设他们一开始什么都不知道。学生(生成者)的工作是写答案,助教(鉴别者)的作用是从答案本上检查答案。最初,学生们草草写出几个随机答案,然后交给助教。TA 随机给那些答案分配粗分,然后他接着用答题卡查答案。这样做的时候,助教会意识到自己的错误并从中吸取教训,同时给出正确的分数。
此外,一旦学生得到分数的反馈,他就会了解自己的错误,并努力写得更好,接近正确答案。这种双重循环的循环继续下去,直到产生的答案真正接近正确的答案。简单来说,这就是 GAN 的工作原理。
生成性对抗性网络框架由塔尔斯·席尔瓦
如上所述,生成器和鉴别器都是神经网络。生成器,顾名思义,生成新的数据实例;另一方面,discriminator 充当生成的数据实例的判断者。这两个网络都是从零开始训练的,同时它们在猜测的游戏中相互竞争。这个游戏是基于数据分布的标准。我们不会深究他们工作的数学原理。生成器从样本随机噪声中生成假图像(老实说,没有什么是真正随机的,所以让我们称之为伪随机),然后它将假图像传递给鉴别器,希望这些假图像被鉴别器接受为真实图像。鉴别器还传递地面实况,即真实的分类数据集。鉴别器试图通过首先给图像 0(假)和 1(真)之间的随机概率来识别真假照片。然后,它从错误中学习并反向传播错误以提供更好的概率。这个循环继续,直到它给所有图像接近正确的概率,即对于真实图像接近 1,对于伪图像接近 0。一旦完成,假图像的概率的反馈被反向传播到生成器,然后生成器试图创建具有更好概率的新图像。这种双循环一直持续到生成图像的可能性接近 1。简而言之,这就是甘的工作方式。
信用:生成对抗网络
TL;速度三角形定位法(dead reckoning)
- 生成器从随机噪声中生成图像,并将其向前发送。
- 鉴别器给出接收图像的概率。
- 鉴别器从真实数据集中学习,并提供更准确的概率。然后,它向后返回。
- 生成器从返回的概率中学习,并尝试创建具有更好概率的图像。
演职员表: CycleGAN
现在来说说 GAN 的一些好玩有趣的现实生活应用;这将帮助你认识到甘斯到底有多神奇。
下面是由杰森·布朗利列出的 GAN 的一些奇妙应用。请仔细阅读他的文章,了解所有这些应用。
- 生成图像数据集的示例
- 生成人脸照片
- 生成逼真的照片
- 生成卡通人物
- 图像到图像的翻译
- 文本到图像的翻译
- 语义图像到照片的翻译
- 人脸正面视图生成
- 生成新的人体姿态
- 照片到表情符号
- 照片编辑
- 面部老化
- 照片混合
- 超分辨率
- 照片修复
- 服装翻译
- 视频预测
- 3D 对象生成
你可以在这个神奇的网站上看到甘的行动,【thispersondoesnotexist.com】。该网站使用 StyleGAN2,每当您访问该网站时,它都会向您呈现一张计算机生成的随机图片,照片中的人在现实生活中并不存在。只是不断刷新。生成的图像逼真得令人震惊,这有助于展示 GANs 的真正力量。该网站由 Phillip Wang 创建,旨在展示 StyleGAN2 和 GANs 的总体潜力。这不是很神奇吗?!
现在,我们知道了 GAN 的能力,让我们尝试用 python 编写我们自己的 DCGAN。
这主要归功于哈德琳·德·庞特维斯。
首先,你需要由彩色图像组成的数据集。请访问此链接下载 CIFAR-10 python 版本数据集。
https://www.cs.toronto.edu/~kriz/cifar.html
提取数据集并将其放入“数据”文件夹中。此外,在同一目录中创建一个空文件夹来保存输出图像。在包含数据和空文件夹的目录中启动一个新的 python 文件。
注意:如果您不想手动下载数据集,或者在下载时遇到一些问题,请不要担心。下面 Colab 文件中的第四个代码单元格将为您完成这项工作。
Google Colab 上的 DCGAN
提示:你可以在 Google Colab 上编写完整的 DCGAN 代码。在你的 Goggle Colab 笔记本中,进入运行时>更改运行时类型,在硬件加速器下选择 GPU 。
Google Colab 笔记本链接—https://Colab . research . Google . com/drive/1 hnpkzucnm _ VM-A-Z _ lwxs 4c 9 lnva 9 ez?usp =共享
我们的模型每走 100 步后的输出图像。
有用的链接
1.生成敌对网络[【https://arxiv.org/abs/1406.2661】T2
2.反向传播[【http://neuralnetworksanddeeplearning.com/chap2.html】T4
3.CNN[https://brohrer . github . io/how _ convolatile _ neural _ networks _ work . html]
4.适应性去进化网络[https://ieeexplore.ieee.org/document/6126474
5.计算机视觉& GANs[https://www . superdata science . com/courses/computer-Vision-z-learn-opencv-GANs-cutting-edge-ai]
进一步阅读
1.迈克尔·乔丹
GANs:利用技术创造更美好的明天
下面的文章讨论了 GAN 的基础知识以及它的一些变种。
当有人只是把自己的脸实时换成一些已知人物的脸,是不是很神奇?或者,当你看到一幅时尚的肖像画仅仅通过提供一个小的布局就用电脑制作出来时,你会变得非常好奇和兴奋吗?这就是我们在这篇文章中要揭示的。所有这些很酷的想法大多是在机器学习中的一个现代想法的帮助下实现的,即 GANs 。
注意:上述想法也可以通过有效使用计算机图形包来实现,这超出了本文的范围,但是我在参考资料部分添加了一些链接。
GANs 或生成对抗网络是一类能够生成与真实图像相似的图像的网络。如果你熟悉风格转移的概念,那么 GANs 的想法对你来说并不陌生。然而,你可以从参考部分的链接中得到一个很好的风格转换的复习。GANs 有各种各样的应用,像图像-图像翻译,文本-图像翻译,实时视频模拟,生成卡通人物等等。我认为 GANs 也可以证明自己有用的一个想法是对数据进行上采样。(仔细想想!).
最近,我参加了一个由 IEEE 主办的技术写作比赛,该比赛旨在写任何技术的未来的潜在和有益的用例,因此我写下了关于 GANs 的内容。你可以在参考资料部分找到这篇文章的 PDF 文档!
目录:
1.定义:
基本上如上所述,GANs 或生成对抗网络是我们生成与真实世界图像相似的图像的网络。但是等等!到底是谁生成了这些图像?图像生成怎么可能呢?模型是如何训练的?模型如何学习映射来生成图像?我们不用卷积网络吗?你会在文章中找到所有这些问题的答案,所以请仔细阅读。
特定的 GAN 包含两个不同的网络。其中一个被称为发生器网络,另一个被称为鉴别器网络。生成器模型(作为艺术家)试图生成与真实图像相似的图像,鉴别器模型(作为艺术评论家)区分真实图像和生成的图像。
注意,鉴别器网络也被称为对抗网络,因此得名生成对抗网络。
图片来源:https://www.tensorflow.org/tutorials/generative/dcgan
图片来源:https://www.tensorflow.org/tutorials/generative/dcgan
GAN 网络的理想条件是鉴别器网络无法区分真实图像和发生器网络产生的图像。
在非常基础的水平上,发生器和鉴别器网络的工作可以概括为
生成器模型不会直接看到真实图像,并且只对观察到的图像(或 DCGAN 情况下的矢量)起作用。在生成图像之后,该图像被发送到鉴别器网络,该网络将其分类为真或假。鉴别器网络也能看到真实的图像,因此能从中获取一些信息。对于生成图像的输入,我们从鉴别器网络获得的输出包含一些关于真实图像的信息。然后,我们根据该输出计算发电机网络的损耗。通过这种方式,生成器网络获得关于真实图像的信息,然后在下一次尝试中,它试图生成与真实图像更相似的图像。通过不断的练习,生成器模型变得能够生成与鉴别器不能分类的真实图像非常相似的图像。
2.GANs 的当前使用案例:
对于技术社区来说,gan 并不是什么新鲜事物,几十年来,我们的技术社区已经发展到如此程度,以至于研究的速度比以前更快了。因此,我们已经在许多领域实施了 GANs,并且效果很好。让我们揭开其中的一些领域:
a)深度假:
DeepFake 是 GANs 的一个惊人的实现,其中图像或视频中的一个人被一个长相相似的人取代。不仅是图像在这里被替换,而且说话者的声音有时也会改变。
图片来源:https://en.wikipedia.org/wiki/Deepfake
然而,这种技术引入了各种负面用法,如名人色情视频、复仇色情、假新闻、恶作剧和金融诈骗。虽然 DeepFake 可以用于许多错误的任务,但它也有各种积极的实现,如电影配音,教育学生等。
b)生成肖像:
GANs 的一个非常有益的实现是从零开始生成美丽而有创意的肖像。我们可以以成对(其中存在 b/w 观测图像和真实图像的直接映射)和不成对(其中不存在 b/w 观测图像和真实图像的直接映射)的形式向这些模型提供训练样本。
c) ExGANs:
ExGANs 或范例生成对抗网络是脸书正在实施的一种方法。ExGANs 是一种有条件的 GANs,它利用样本信息来产生高质量、个性化的内部绘制结果。这种方法特别使用 ExGANs 将闭着眼睛的人的图像转换成睁着眼睛的相同图像。
还有其他领域也大量使用了 GANs。请参阅参考资料部分了解更多信息。
3.gan 的类型:
虽然 GAN 有多种变体,但今天我们将讨论三种常见类型的 GAN,即 DCGAN、Pix2Pix GAN 和 CyclicGAN。这些 GANs 的实现由 tensor flow发布为官方教程,所以不要忘记查看。好了,让我们开始吧:
a) DCGAN:
DCGANs 或深度卷积生成对抗网络是学习从噪声向量到图像的映射的 GANs 的一些基本形式。现在你可能会想,我们如何把一个矢量转换成图像?这个问题的答案很简单。它使用转置卷积层对输入执行反卷积。这与卷积层所做的正好相反。卷积层从输入图像中提取特征,使得通道的数量增加,但是在转置卷积层中,新的特征被添加到输入向量中,从而将它们转换成图像。
图片来源:作者
图片来源:作者
生成器网络建立在一系列[转置卷积+ BatchNorm + LeakyReLU 层]之上。鉴别器网络是一个正常的分类器,它使用卷积层来分类输入图像是真实的还是生成的。
鉴别器损耗是真实图像输出和生成图像输出的综合损耗。使用的损失函数是 BinaryCrossEntropy (但选择不受限制)。发生器损耗是根据我们从鉴频器网络获得的输出计算的,用于将生成的图像作为输入。
def discriminator_loss(real_op, gen_op):
loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
real_loss = loss(tf.ones_like(real_op), real_op)
gen_loss = loss(tf.zeros_like(gen_op), gen_op)
return real_loss + gen_lossdef generator_loss(gen_op):
loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
return loss(tf.ones_like(gen_op), gen_op)
b)pix 2 pix gan:
这些类别的任务属于条件任务的范畴。条件甘是那些基于输入图像中的条件生成图像的甘类。例如,考虑下面的图像-
图片来源:https://arxiv.org/pdf/1611.07004.pdf
在上面的图像中,我们必须使用左边的图像生成右边的图像。在这里,我们可以看到输入和输出之间存在直接关系,并且该模型非常容易学会基于这样的对来生成图像。这种数据也被称为成对数据。
现在,一个特定的 Pix2Pix GAN 也有一个生成器和一个鉴别器模型。但是在这里,它们和在 DCGANs 中使用的不一样。发生器网络利用U-Net架构,鉴别器网络利用 PatchGAN 架构。
U-Net 架构基本上是一个普通的编码器-解码器网络,增强了层间的跳跃连接。添加跳过连接的论点可能是模型将同等地学习每一层的编码和解码特征。Pix2Pix 网络中使用的 U-Net 架构(特别是在关于城市景观数据集的 tensorflow 教程中)可以被可视化为-
图片来源:作者
现在来描述鉴别器网络!鉴别器网络是一个 PatchGAN 网络。但是首先什么是 PatchGAN 网络呢?PatchGAN 网络属于机器学习分类器类,它学习对输入数据中的高频结构进行分类。他们在面片的尺度上惩罚结构。这些模型使用从图像中提取的小块用于分类任务。鉴别器使用一个 N×N 的小块来鉴别一幅图像是真是假。通常图像的一个 70x70 部分被用于分类,因为它产生更好的结果。这一点从原论文中的解释可见一斑。
图片来源:https://arxiv.org/pdf/1611.07004.pdf
鉴别器损耗通过计算真实图像和生成图像的输出的交叉熵之和来获得。生成器除了计算生成图像的损失外,还计算目标图像和生成图像之间距离的 L1 范数。
def discriminator_loss(disc_real_op, disc_gen_op):
loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
real_loss = loss(tf.ones_like(disc_real_op), disc_real_op)
gen_loss = loss(tf.zeros_like(disc_gen_op), disc_gen_op)
return real_loss + gen_lossdef generator_loss(disc_gen_op, generated_op, target, lambda=10):
loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
gan_loss = loss(tf.ones_like(disc_gen_op), disc_gen_op)
l1_loss = tf.reduce_mean(tf.abs(target - generated_op))
gen_loss = gan_loss + (lambda*l1_loss)
return gen_loss
c)循环甘斯:
环状氮化镓是应用最广泛的一类氮化镓。在深入循环 GANs 之前,让我们先谈谈未配对数据。考虑下面的图像-
图片来源:https://arxiv.org/pdf/1703.10593.pdf
左侧的一对图像在它们之间具有一定程度的对应性,正如我们已经讨论过的,它们被称为配对数据。右侧的图像在它们之间没有任何对应关系,被称为不成对数据。在许多情况下,我们只能得到不成对的数据,因为创建成对数据的成本更高,而且不容易获得。
现在你可能会问-
只针对不成对数据的训练,你在实现一个全新的架构?我们不能用以前的方法学习不成对的数据吗?
答案是肯定的,您可以使用以前的方法,但这在性能方面不会有太大的好处。因此,我们需要一种新的方法来处理这种数据。不仅是未配对的数据,我们还可以使用 CyclicGANs 从配对的数据中学习,并产生非常有希望的结果。
现在让我们来考虑一下使用周期因子的一些原因
我们考虑两组图像,即 X 和 Y,作为我们要在其间转换图像的两个域。
- 假设我们学会了从集合 x 中的图像“a”生成集合 Y 中的图像“b”。现在我们对图像“b”运行生成器模型。你能保证我们能找回 a 的形象吗?不,如果使用上述 GANs 的变体,我们不能保证这一点。
- 我们能自信地说集合 X 中的所有图像都将被映射到集合 Y(双射)中的所有图像吗?
这两个问题都已经被 CyclicGANs 解决了。现在让我们了解一下 CyclicGANs 的架构。
一个特定的循环 GAN 由两个发生器网络和两个鉴别器网络组成。
两个发电机网络即 G 和 F 互为逆。 G 从集合 X 到 Y , G:X →Y ,以及 F 从集合 Y 到 X , F:Y →X 中的图像学习映射。
图片来源:作者
为了将两个发生器网络的输出分类为真或假,我们有两个鉴别器网络,即 Dx 和 Dy 。 Dx 基本将 F 生成的图像分为真假, Dy 将 G 生成的图像分为真假。
图片来源:作者
鉴别器损耗(对抗性损耗)和发电机损耗实现为-
def discriminator_loss(real_op, gen_op):
loss = tf.keras.layers.BinaryCrossentropy(from_logits=True)
real_loss = loss(tf.ones_like(real_op), real_op)
gen_loss = loss(tf.zeros_like(gen_op), gen_op)
return real_loss + gen_lossdef generator_loss(gen_op):
loss = tf.keras.layers.BinaryCrossentropy(from_logits=True)
return loss(tf.ones_like(gen_op), gen_op)
请注意,我们通常将鉴频器损耗乘以 1/2,这是因为与发生器网络相比,它的学习速度较慢。
除了这些损失之外,还有一个循环一致性损失,它完成了循环一致性的目标函数。循环一致性丢失解决了我们前面遇到的反向映射问题。这种损失确保了从集合 X 映射到集合 Y 的图像具有到其自身的反向映射。让我们听听这篇论文中关于为什么要引入循环一致性损失的一些话
有了足够大的容量,网络可以将同一组输入图像映射到目标域中图像的任意随机排列,其中任何学习到的映射都可以导致与目标分布匹配的输出分布。因此,单独的对抗性损失不能保证学习的函数能够将单个输入*【Xi】映射到期望的输出易。*
敌对网络不能保证期望的输出,这导致我们引入循环一致性损失。考虑下面的图片-
图片来源:【https://arxiv.org/pdf/1703.10593.pdf
考虑图像的左侧,我们可以看到它使用 G 从图像 x 生成图像 y_hat ,我们再次传递这个生成的图像以使用 F 获得图像 x_hat 。恰恰相反的是在图像的右侧。
现在一致性损失基本上衡量的是 x 和 x_hat (左侧)之间的相似性,我们也称之为前向循环一致性损失,根据 y 和 y_hat (右侧)之间的相似性计算的损失也称为后向循环一致性损失。这个损失基本上是真实({x,y})和生成({x_hat,y_hat})图像之间的距离的 L1(或曼哈顿)范数。
循环一致性丢失可以实现为
def cyclic_consistency_loss(generator, cycled_image, real_image, lambda=10):
loss = tf.reduce_mean(tf.abs(cycled_image - real_image))
return loss*lambda
因此,[对抗性损失+λ*(前向循环一致性损失+后向循环一致性损失)+发电机损失]一起构成了循环性问题的完整目标函数。这里的λ是一个要调整的超参数。
注意,在上面讨论的任何方法中,用于模型建立的其他超参数的选择完全是场景特定的。但在我看来,原始文件中指定的值通常会有更好的结果。
4.结论:
虽然 GANs 在架构和工作方面都非常棒,但是还有更多值得探索的地方。我们不需要认为甘斯会接受工作或其他什么。甘人在他们的地方很酷,但仍然依赖人类完成各种任务。
5.参考资料:
- https://arxiv.org/abs/1705.04058
- https://arxiv.org/pdf/1703.10593.pdf
- https://drive . Google . com/file/d/1 kayaspozrkowruyvfygopody 3 ZD rd 74 x/view?usp =共享
- https://www.tensorflow.org/tutorials/generative/dcgan
- 【https://www.tensorflow.org/tutorials/generative/pix2pix
- https://www.tensorflow.org/tutorials/generative/cyclegan
- https://research . FB . com/WP-content/uploads/2018/06/Eye-In-Painting-with-Exemplar-Generative-Adversarial-networks . pdf
我希望我很成功地向你表达了我的观点。我已经尽力解释了原文中的观点。然而,如果你仍然对任何部分有疑问,或者觉得我没有正确地描述一件事,请随意在评论中写下。
快乐编码
GARCH 和谷歌相处融洽。GG!
使用 GARCH 过程预测谷歌股票收益的波动性。
G 在本文中,我们将关注 GARCH/ARCH 模型及其重要性,尤其是在金融相关领域。在这里,我们将对谷歌股票价格回报的波动性进行建模和预测,然后进行一些与未来几天回报值的波动性相关的推断。在应用中,如果一只股票的回报波动性较小,我们可能会投资于风险较小的股票,而不是在给定的时期内,同样的模型波动性更大或变化更大。
研究条件异方差的主要动机与金融中资产收益的波动性有关。波动性的重要性是显而易见的,因为它有广泛的应用,如期权定价、风险管理(风险价值计算)、波动指数(VIX)交易。因此,如果我们能有效地预测波动性/方差,我们就能创造更复杂的工具来制定交易策略。这里有一个快速的术语介绍,忽略这里的数学方程。更多信息,请参考。
广义自回归
AR 或自回归项突出了与序列中先前元素相关联的方差的线性组合。AR 滞后阶数, p 定义滞后版本的阶数,用于回归给定时间序列中的方差。换句话说,ARCH§过程遵循一个 AR§ 过程。相关的问题是,我们是否可以应用 MA(q) 或移动平均模型来模拟我们的方差以及 AR 过程,这是 GARCH 或广义 ARCH 过程的动机,它试图考虑移动平均成分以及自回归成分。因此,GARCH(2,2)过程由 AR(2)和 MA(2)过程组成。而简单的 ARCH 过程不考虑移动平均项;ARCH§模型。
条件异方差
让我们先快速地看一下我们所说的异方差是什么意思,然后是条件部分。当在一个变量集合中,我们看到一个在某个区域(或子集)上相当大的增加或减少的方差分组时,比如在一段时间内,它通常不同于集合中的其余变量,并且我们可以看到变化方差的“群集”,那么这种形式的规则变化在数学上被称为异方差。这种不同形式的金融波动可以由各种原因触发,这些原因导致序列相关异方差,以变化方差的周期为条件。换句话说,方差的增加与方差的进一步增加相关。
现在,我们对正在进行的工作有了一个大致的了解,让我们开始实现,并通过预测一段时间内的值来做一些有趣的预测。
程序步骤:
- 从雅虎财经获取谷歌股票数据。
- 计算和分析资产回报。
- 确定阶数并拟合 GARCH 模型。
- 训练模型。
- 验证模型。
- 预测。
获取谷歌股票数据
Python 中的 yfinance 包支持直接从 yahoo finance 中轻松获取股票数据。我们必须提供正确的股票代码,如谷歌的“GOOG”或微软的“MSFT ”,以创建股票包装器。然后,我们使用*。包装器的 history()* 方法,通过指定数据的开始和结束日期来获取数据帧形式的数据(这里是 df_goog )。我们获取 2015 年到最近可用日期的数据。
today = datetime.today().strftime('%Y-%m-%d')
td1 = yf.Ticker('GOOG')
df_goog = td1.history(start = '2015-01-01', end = today, period = '1d')
df_goog.info()
计算和分析资产收益
我们通过将我们的数据帧移动一个周期,然后使用 NumPy 的*,来计算对数回报(这里知道为什么对数回报优于正常回报)。【T21 日志()】法。我们的数据框中添加了一个相同的列。*
*df_goog_shifted = df_goog.Close.shift(1)
df_goog['Return'] = np.log(df_goog.Close/df_goog_shifted).mul(100)
df_goog.dropna(inplace = True)
df_goog*
接下来,我们通过绘制 2015 年以来每天的数据来可视化我们的资产回报。
*yr = pd.date_range(start = '2015', end = '2020' , freq = 'Y')
ret = df_goog['Return']
fig = plt.figure()
plt.plot(ret)
plt.title("Asset Returns")
for i in yr:
plt.axvline(i, linestyle = '--' , color = 'gray')*
为了检查回报是否平稳,我们应用了 增广迪基富勒 测试;零假设的统计检验,表明由于趋势分量,序列是非平稳的。从stats models . TSA . stat tools*我们导入 adfuller API 作为 *adf。检验的 p 值是检验结果的第二个要素。
*p_val = adf(ret)[1]
print("Since the pvalue:",p_val,"in the Augmented Dicky Fuller test is less than 5% we easily reject \
the null-hypothesis that returns are non-stationary")*
因此,我们可以得出结论,我们的回报是相当稳定的,可以建模。这是必要的,以确保平稳性,因为这种模型像 ARMA,ARIMA,GARCH 等。可以应用于平稳过程。(知道为什么吗?)此外,直观上看不出季节性。
确定阶次并拟合 GARCH 模型
通过绘制几个滞后的收益平方的偏自相关图,我们得到了 GARCH 过程的阶 p 和 q 的概念。stats models . graphics . TSA plots的 plot_pacf 就是用来实现这个目的的。
从 statsmodels.graphics.tsaplots 导入 plot_pacf
*fig = plot_pacf(ret**2, lags = 20, zero = False)*
我们观察到,在滞后 2 之后,该图似乎停止了,这表明了它的重要性。这表明我们可以尝试 GARCH(2,2)过程。现在,我们拟合模型,为此,我们使用了 arch API 的 arch_model 函数。假设标准化残差的分布函数是学生 t 的分布函数。
从 arch 导入 arch_model
*model = arch_model(ret , p = 2, q = 2, dist = 't').fit(disp='off')
model.summary()*
训练模型
为了训练我们的模型,我们使用固定 滚动窗口预测 (一种回溯测试)的技术,其中窗口大小是固定的。我们的想法是预测特定范围内的值,然后在我们知道该范围内的实际(真实)值时,移动窗口以包括这些预测值,从而更好地训练我们的模型,并再次预测下一个范围。这使预测适应新的观测结果,并避免回顾偏差。它也较少受到过度拟合的影响。在所取的窗口大小上重复该过程。
这里,我们取一个窗口大小为一年中交易天数的 5 倍(即 252),并利用历史数据来训练我们的模型。生成回报以及预测值的曲线图。在使用 arch_model 函数拟合一个模型之后,我们使用。forecast()* 方法通过设置参数 *horizon = 1 来预测紧接的下一个值。准确地说,是进行 1 天滚动窗口预测。请记住,我们需要找到标准偏差,这就是为什么我们取预测方差的平方根。
*rolling = []
window = 252*5
for i in range(window):
train_data = ret[:-(window-i)]
model = arch_model(train_data, p = 2, q = 2).fit(disp='off')
pred = model.forecast(horizon = 1)
rolling.append(np.sqrt(pred.variance.values)[-1,:][0])
rolling = pd.Series(rolling , index = ret.index[-window:])
plt.plot(ret[-window:])
plt.plot(rolling)
plt.legend(['Returns','Volatility'])
plt.title('Rolling Window Forecast')*
我们可以看到,我们的模型能够捕捉随时间变化的方差。有必要知道橙色曲线表明我们的股票回报有多波动。当收益偏离均值时,波动率曲线也会偏离,以表明方差变化的时期。橙色长尖峰表示高波动时期,而较短的尖峰表示资产回报波动较小的时期。从视觉上看,我们的模型似乎工作得还不错,但最好在其他统计测试的帮助下进行验证。
验证模型
数学上,标准残差是残差除以其标准差。它是对观察值和期望值之间差异强度的度量。标准残差应遵循一个白噪声过程;一个过程,其中变量是连续不相关的(在任何滞后时间都相互独立),具有零均值和有限方差。我们将在这里使用三种验证技术:
a)绘制标准化残差图,直观地查看残差是否遵循白噪声过程。这里,标准化残差 std_resid 通过使用来计算。resid* 和*。我们的模型对象的 conditional_volatility* 属性如下面的代码所示。*
b)绘制自动相关图,以验证标准残差在任何滞后时间都不显著相关。除了滞后零点之外,在图中看不到明显的滞后。
从stats models . graphics . TSA plots*导入 plot_acf*
*std_resid = model.resid/model.conditional_volatility
fig, ax = plt.subplots(nrows = 2, ncols = 0)
ax[0] = plt.plot(std_resid, color = ‘r’)
plt.title(‘Standardised Residuals’)
for i in yr:
plt.axvline(i, linestyle = ‘ — ‘ , color = ‘gray’)
ax[1] = plot_acf(std_resid,lags = 20)*
**
c)执行l 接线盒测试。这个测试的动机不仅仅是检查不同滞后的随机性,就像案例 b 一样,相反,它让我们了解基于指定滞后数的变量的总体随机性。零假设:数据是独立分布的。每个滞后的 p 值大于 5%,表明我们未能拒绝零假设。
从 statsmodels.stats.diagnostic 导入 acorr_ljungbox
*lb_test = acorr_ljungbox(std_resid, lags = 20)
lb_test[1] //gives us the p-values at each lag*
在上述所有三种情况下,可以得出合理的结论,因为我们的模型正在产生表示白噪声过程的标准化残差,变量是随机的,因此彼此不相关,我们拟合和训练的模型工作得相当好。
预测
最后,是时候做一些预测了!我们将使用我们的模型来获得未来七天的波动预测。为了实现这一点,我们指定视界参数等于 7。这里需要注意的是,这些预测逐渐趋向于长期平均值。
*future_index = pd.date_range(start = (df_goog.index[-1]+timedelta(1)).strftime("%Y-%m-%d"), periods = 7, freq = 'D')
predict = model.forecast(horizon = 7)
pred_vol = np.sqrt(predict.variance.values[-1:][0])
pred_vol = pd.Series(pred_vol,index = future_index)
plt.plot(pred_vol, marker = 'o', markerfacecolor = 'r', linestyle = '--', markeredgecolor = 'k', markersize = 6)
plt.title("Next seven day volatility forecast")
plt.grid(True)*
预测表明波动性变化会略有增加,然后最终下降。那么回报的波动性是高还是低呢?投资谷歌是不是一个风险很大的时候?你能有多自信?
**注:*您可以选择更高阶的模型,如 GARCH(3,0)或 GARCH(3,3)模型,但请记住,模型摘要中的 omega 、 *alpha、和 beta 参数的值应该非常重要。另外,不要忘记检查和验证相应的标准残差。
在我的 GitHub 上找到 jupyter 笔记本。
参考资料:-
* [## 时间序列的广义自回归条件异方差 GARCH(p,q)模型
在这篇文章中,我们将考虑著名的广义自回归条件异方差模型…
www.quantstart.com](https://www.quantstart.com/articles/Generalised-Autoregressive-Conditional-Heteroskedasticity-GARCH-p-q-Models-for-Time-Series-Analysis/)
领英:-
[## Swarnim Pandey — SRM 大学—印度北方邦勒克瑙| LinkedIn
查看世界上最大的职业社区 LinkedIn 上的 Swarnim Pandey 的个人资料。Swarnim 有 2 份工作列在…
www.linkedin.com](https://www.linkedin.com/in/swarn6/)*
加利福尼亚州的加登格罗夫是美国的波巴之都
罗莎琳德·张在 Unsplash 上的照片
搜集 300 多个美国城市的 Yelp 数据,了解泡泡茶的受欢迎程度
加登格罗夫——一座人口 17 万多一点的城市,位于洛杉机以南 35 英里处——是美国的波巴首都。截至 2020 年 7 月,该市共有 33 家波霸商店,即该市每 5200 名居民就有一家商店。
从这个角度来看——截至 2020 年 6 月,美国有15.3 万家星巴克门店,为近 3.3 亿美国人服务,或者说每 21.5 万美国人就有一家星巴克门店。这意味着加登格罗夫的人均波霸商店数量是美国人均星巴克商店数量的四倍多。
也就是说,与加登格罗夫相比,美国其他城市的排名如何?这里先睹为快:
- **每位居民最多的波霸商店:**加利福尼亚州加登格罗夫
- **波霸商店密度最高:**加利福尼亚州旧金山
- 最高 Yelp 评分:南卡罗来纳州查尔斯顿
但是首先…这些数据是从哪里来的?
我使用了两个数据集:
- **美国城市数据集:**为此,我使用了维基百科的 美国城市人口列表 ,,其中列出了 317 个使用 2019 年人口普查估计值的美国人口最多的城市。这份名单中所有城市的人口都超过 10 万。这些城市在下面的地图中标出:
- **Boba 商店数据集:**一旦我有了上面的城市列表,我就使用 Yelp 的 API 遍历所有的城市。收集数据的过程非常快——我能够在不到三分钟的时间内收集 4200 家波霸商店的数据。
为了了解单个城市的这一过程,让我们以旧金山为例。如果我想找到旧金山附近的波霸商店,我会发送一个 API 请求返回市中心 25 英里半径内的所有波霸商店 (Yelp 有一个我用过的名为“bubbletea”的类别)。冲洗并重复我列表中剩余的 316 个城市。
**就是这样!**我们可以将 Yelp 数据集加入城市数据集,并以多种不同的方式聚合数据。
其他城市排名—近距离观察
有几种方法可以看出波霸商店在一个城市的流行程度。本节探索了查看数据的不同方法,揭示了可以与加登格罗夫相抗衡的其他城市。
**人均波巴商店:**这是用来宣布加登格罗夫为美国波巴之都的方法。这是衡量波霸商店普及率最简单的指标,因为它回答了以下问题:该城市的每家波霸商店服务多少人?
如果我们只看每个城市的波霸商店数量,你最终会发现人口更多的城市,所以我不认为这个指标抓住了这一分析的精神。
紧随加登格罗夫之后的是伯克利,位居第二,糖地和檀香山紧随其后。也很高兴看到一些来自非加州的州的代表进入前 5 名!
波霸店铺密度: 每平方英里有多少家波霸店铺?
事情变得有点有趣了。我们有三个明显的突出,前两名分别是旧金山和伯克利。这是因为这两个北方城市的人口密度更高。
最高 Yelp 评分: 哪个城市的居民最爱他们的波霸?
我们可以看看每个城市波霸店铺的平均评分。为此,我们希望删除商店数量较少的城市,以及没有足够评论的城市,因为这些结果可能会有噪音。对于一个城市的资格,我会设置两个门槛:该城市必须至少有 5 个波霸商店和至少 500 个总评论。
当我们查看这些结果时,我们看到南部和西南部的城市给出了最高的评价!南卡罗来纳州的 Charleston 是这里的明显赢家,其 5 家不同的波霸商店的平均评分为 4.63。接下来最接近的城市是佛罗里达州的杰克逊维尔,得分为 4.42,以及加利福尼亚州的默里塔和俄亥俄州的辛辛那提,均为 4.41。
从下图中,我们还看到拉斯维加斯和火奴鲁鲁是仅有的拥有大量波霸商店的城市,跻身前 30 名。有很多商店的城市的居民往往对他们的波霸更挑剔:有最多评论的旧金山的平均评分只有 3.82,而圣何塞为 3.86。
但是等等……纽约市呢?
乔纳森·赖利在 Unsplash 上拍摄的照片
这就是事情变得有点复杂的地方——因为我只对上面的城市感兴趣,纽约没有进入任何一个名单,因为它太大了,而且很杂乱。然而,任何去过纽约或在纽约生活过的人都知道,这里有很多不错的选择——纽约实际上是拥有最多波霸商店的城市,有 335 家商店。因此,这一部分致力于近距离观察纽约市。
从下面的地图来看,波霸的商店主要有三个集群:
- 皇后区法拉盛
- 曼哈顿唐人街
- 布鲁克林日落公园
因为乘坐公共交通工具,骑自行车,甚至步行都可以很容易地在纽约市四处走动,所以我认为将这些街区与我在上面看到的其他城市进行比较是不公平的。如果我这么做了,那么这三个街区将会横扫波霸人均商店和波霸商店密度的第一、第二和第三名。
弗拉辛
为了证实这一点,我们可以仔细看看 Flushing,因为 Yelp 实际上将 Flushing out 分解为自己的“城市”(比如你可以看看 Yelp 上的 虎糖)。
法拉盛是一个有 72000 人的社区,有 44 家商店,所以每 16000 名居民就有一家商店。此外,法拉盛每平方英里有 33 家商店,将旧金山打得落花流水 10 倍以上!
唐人街
日落公园
寻找美国最受欢迎的商店
***总的来说,大多数评论:*在这里,我们看到一些来自加州的 Boba 商店排在前 20 名,只有两家来自州外。
***优于竞争对手:*我们可以将波霸的每家店铺与其竞争对手进行比较,方法是将每家店铺的评分与该市所有波霸店铺的总体平均评分进行比较。与我在上一节中所做的类似,我只包括有足够多评论的商店——在这种情况下,我将截止值设为 500。这应该能让我们控制人们倾向于评分较低的城市(如旧金山)。
一些标注
在上面的分析中没有考虑到的事情很少——尽管肯定有可能找到解决它们的方法,但为了节省时间,我决定不把它们包括在分析中。从最重要到最不重要:
- ***哪个城市将成为后 COVID 时代的第一名:*随着餐馆经历一段艰难时期,一些波霸商店可能会在未来几个月内关闭。由于只有 1-2 家商店分布在这个列表中的顶级城市,如果我们在 2021 年重新审视这个问题,它们之间可能会有一些变化。
***2。波霸商店的类型:*该分析查看了所有在 Yelp 上有“Bubble Tea”类别的商店。然而,你也有像冰柱一样的商店,出售波霸,但主要出售其他东西,如冰淇淋。所以在分类时会有一些模糊性。
***3。波霸商店的规模:*该分析对所有波霸商店一视同仁,但是有些商店会比其他商店大得多,可以服务更多的顾客。
***4。一些波霸商店不在 Yelp 上:*并非所有的商家都在 Yelp 上列出。然而,如果你所在的城市有很多你的竞争对手在 Yelp 上,我想你可能也希望你的生意在那里。为了得到一个更明确的波霸商店列表,我可以看看其他来源,如谷歌或黄页。
总之…
如果你发现自己在上述城市之一,别忘了去看看他们众多的波霸商店中的一家!
参考
- Yelp API
- 美国人口数据
- 用于分析的代码(Github)
用 Python 收集所有冠状病毒相关数据的简单方法
简单是关键。
冠状病毒在全球的传播令人担忧。截至今日(2020 年 7 月 15 日),冠状病毒 确诊病例超 1300 万。****
约翰·霍普斯金地图
目标
这篇文章的目的是获得研究所需的数据,并通过将所有相关数据收集到一个Pandas数据框架中获得关于新冠肺炎的主动可见性。
步伐
- 步骤 1:设置技术先决条件
- 第二步:聚集新冠肺炎确诊病例
- 第三步:收集 COVID 的消息
- 第四步:收集财务和其他指标
- 第五步:将所有的数据混合在一起
第一步。先决条件
- 安装 Python 2.6+或 3.1+版本
- 安装 pandas,matplotlib,openblender 和 wordcloud(带 pip)
*$ pip install pandas OpenBlender matplotlib wordcloud*
第二步。收集新冠肺炎确诊病例
CSSE 正在做惊人的工作上传每日数据 这里。然而,它非常杂乱并且在许多不同的数据集上,所以我将它分类并上传为一个单独的 OpenBlender 数据集:
让我们通过运行以下脚本将数据拉入熊猫数据帧:
*from matplotlib import pyplot as plt
import OpenBlender
import pandas as pd
import json
%matplotlib inline action = 'API_getObservationsFromDataset'parameters = {
'token':'**YOUR_TOKEN_HERE**',
'id_dataset':'5e7a0d5d9516296cb86c6263',
'date_filter':{
"start_date":"2020-01-01T06:00:00.000Z",
"end_date":"2020-03-11T06:00:00.000Z"},
'consumption_confirmation':'on',
'add_date' : 'date'
}
df_confirmed = pd.read_json(json.dumps(OpenBlender.call(action, parameters)['sample']), convert_dates=False, convert_axes=False).sort_values('timestamp', ascending=False)
df_confirmed.reset_index(drop=True, inplace=True)
df_confirmed.head(10)*
- 注意:要获得令牌,您需要在 openblender.io (免费)上创建一个帐户,您可以在您个人资料图标的“帐户”选项卡中找到它。
因此,现在我们有了按日期和地点汇总的确诊病例数、死亡人数和康复人数。
这里我们可以看到伊朗、意大利和韩国确诊病例的爆发。我们还可以看到西班牙、法国和德国开始崛起。
第三步。收集新冠肺炎的消息
我们将从这些来源收集 COVID 新闻和文本:华尔街日报、 CNN 新闻、 ABC 新闻和今日美国推特(你可以寻找其他来源)
所以让我们获取数据。
*action = 'API_getOpenTextData'parameters = {
'token':'**YOUR_TOKEN_HERE**',
'consumption_confirmation':'on',
'date_filter':{"start_date":"2020-01-01T06:00:00.000Z",
"end_date":"2020-03-10T06:00:00.000Z"},
'sources':[
# Wall Street Journal
{'id_dataset' : '5e2ef74e9516294390e810a9',
'features' : ['text']},
# ABC News Headlines
{'id_dataset':"5d8848e59516294231c59581",
'features' : ["headline", "title"]},
# USA Today Twitter
{'id_dataset' : "5e32fd289516291e346c1726",
'features' : ["text"]},
# CNN News
{'id_dataset' : "5d571b9e9516293a12ad4f5c",
'features' : ["headline", "title"]}
],
'aggregate_in_time_interval' : {
'time_interval_size' : 60 * 60 * 24
},
'text_filter_search':['covid', 'coronavirus', 'ncov'],
'add_date' : 'date'
}
df_news = pd.read_json(json.dumps(OpenBlender.call(action, parameters)['sample']), convert_dates=False, convert_axes=False).sort_values('timestamp', ascending=False)df_news.reset_index(drop=True, inplace=True)*
以上,我们指定了以下内容:
- 我们选择了 4 个来源来收集数据。具体来说,带有文本的功能列
- 我们指定要从 1 月 1 日到今天(3 月 10 日)的数据
- 我们要求将新闻汇总成 24 小时小组或观察
- 我们过滤了提及“冠状病毒”、“冠状病毒”或“ncov”的新闻
*# Let's take a look
df_news.head(20)*
每个观察都是按天对新闻的聚合,我们有 source 和 source_lst ,前者是所有新闻的串联,后者是该时段的新闻列表。
时间戳(返回为 unix 时间戳)是指从前一个时间戳到当前时间戳(严格来说是之前)的间隔内发生的新闻:
现在让我们来看看一些感兴趣的国家的提及次数。
*interest_countries = ['China', 'Iran', 'Korea', 'Italy', 'France', 'Germany', 'Spain']for country in interest_countries:
df_news['count_news_' + country] = [len([text for text in daily_lst if country.lower() in text]) for daily_lst in df_news['source_lst']]df_news.reindex(index=df_news.index[::-1]).plot(x = 'timestamp', y = [col for col in df_news.columns if 'count' in col], figsize=(17,7), kind='area')*
**
我们来看一个来自最近 20 天新闻的词云。 可选步骤(如果要安装 wordcloud )😗
*from os import path
from PIL import Image
from wordcloud import WordCloud, STOPWORDS, ImageColorGeneratorplt.figure()
plt.imshow(WordCloud(max_font_size=50, max_words=80, background_color="white").generate(' '.join([val for val in df['source'][0: 20]])), interpolation="bilinear")
plt.axis("off")
plt.show()plt.figure()
plt.imshow(WordCloud(max_font_size=50, max_words=80, background_color="white").generate(' '.join([val for val in df['source'][0: 20]])), interpolation="bilinear")
plt.axis("off")
plt.show()*
*上面的代码生成了图像的最后一个 wordcloud。
早期新闻中的关键词如“神秘”、“正在调查”、“几十个”与后期关键词如“中国”、“冠状病毒”、“全球”形成对比。更有最近的:“新型冠状病毒”、“冠状病毒流行”、“爆发”、“巡航”、“新型冠状病毒”等…
第四步。收集财务和其他指标
为此,我们可以从道琼斯数据集中分离出来,混合其他几个数据,比如汇率(日元、欧元、英镑)材料价格(原油、玉米、铂、锡),或者股票(可口可乐、道琼斯)。
*action = 'API_getObservationsFromDataset'
parameters = {
'token':'**YOUR_TOKEN_HERE**',
'id_dataset':'5d4c14cd9516290b01c7d673', 'aggregate_in_time_interval':{"output":"avg","empty_intervals":"impute","time_interval_size":86400}, 'blends':[
#Yen vs USD
{"id_blend":"5d2495169516290b5fd2cee3","restriction":"None","blend_type":"ts","drop_features":[]}, # Euro Vs USD
{"id_blend":"5d4b3af1951629707cc1116b","restriction":"None","blend_type":"ts","drop_features":[]}, # Pound Vs USD
{"id_blend":"5d4b3be1951629707cc11341","restriction":"None","blend_type":"ts","drop_features":[]}, # Corn Price
{"id_blend":"5d4c23b39516290b01c7feea","restriction":"None","blend_type":"ts","drop_features":[]}, # CocaCola Price
{"id_blend":"5d4c72399516290b02fe7359","restriction":"None","blend_type":"ts","drop_features":[]}, # Platinum price
{"id_blend":"5d4ca1049516290b02fee837","restriction":"None","blend_type":"ts","drop_features":[]}, # Tin Price
{"id_blend":"5d4caa429516290b01c9dff0","restriction":"None","blend_type":"ts","drop_features":[]}, # Crude Oil Price
{"id_blend":"5d4c80bf9516290b01c8f6f9","restriction":"None","blend_type":"ts","drop_features":[]}],'date_filter':{"start_date":"2020-01-01T06:00:00.000Z","end_date":"2020-03-10T06:00:00.000Z"},
'consumption_confirmation':'on'
}df = pd.read_json(json.dumps(OpenBlender.call(action, parameters)['sample']), convert_dates=False, convert_axes=False).sort_values('timestamp', ascending=False)
df.reset_index(drop=True, inplace=True)print(df.shape)
df.head()*
所以现在我们有了一个单独的数据集,其中包含每日观察到的价格随时间的变化。如果我们想要比较它们,我们最好将它们归一化到 0 到 1 之间,这样我们就可以更好地欣赏这些模式:
*# Lets compress all into the (0, 1) domain
df_compress = df.dropna(0).select_dtypes(include=['int16', 'int32', 'int64', 'float16', 'float32', 'float64']).apply(lambda x: (x - x.min()) / (x.max() - x.min()))
df_compress['timestamp'] = df['timestamp']# Now we select the columns that interest us
cols_of_interest = ['timestamp', 'PLATINUM_PRICE_price', 'CRUDE_OIL_PRICE_price', 'COCACOLA_PRICE_price', 'open', 'CORN_PRICE_price', 'TIN_PRICE_price', 'PLATINUM_PRICE_price']
df_compress = df_compress[cols_of_interest]
df_compress.rename(columns={'open':'DOW_JONES_price'}, inplace=True)# An now let's plot them
from matplotlib import pyplot as plt
fig, ax = plt.subplots(figsize=(17,7))
plt = df_compress.plot(x='timestamp', y =['PLATINUM_PRICE_price', 'CRUDE_OIL_PRICE_price', 'COCACOLA_PRICE_price', 'DOW_JONES_price', 'CORN_PRICE_price', 'TIN_PRICE_price', 'PLATINUM_PRICE_price'], ax=ax)*
有趣的是,几乎所有的*(除了锡价)都遵循相似的模式。***
第五步。将所有数据混合在一起
现在,我们将把新冠肺炎确诊病例*、冠状病毒新闻和经济指标数据排列成按照时间混合的单一数据集。***
为了混合数据,让我们将创建的数据集上传到 OpenBlender:
***# First the News Datasetaction = 'API_createDataset'parameters = {
'token':'**YOUR_TOKEN_HERE**',
'name':'Coronavirus News',
'description':'YOUR_DATASET_DESCRIPTION',
'visibility':'private',
'tags':[],
'insert_observations':'on',
'select_as_timestamp' : 'timestamp',
'dataframe':df_news.to_json()
}
OpenBlender.call(action, parameters)***
***# And now the Financial Indicatorsaction = 'API_createDataset'parameters = {
'token':'**YOUR_TOKEN_HERE**',
'name':'Financial Indicators for COVID',
'description':'YOUR_DATASET_DESCRIPTION',
'visibility':'private',
'tags':[],
'insert_observations':'on',
'select_as_timestamp' : 'timestamp',
'dataframe':df_compress.to_json()
}
OpenBlender.call(action, parameters)***
*注意:您将希望在下面使用每个数据集的“id_dataset”。
现在,我们只需提取初始新冠肺炎数据集,并通过将来自我们创建的数据集的“id _ dataset”s放置在“id _ blend”字段上,来混合我们创建的新数据集。**
***action = 'API_getObservationsFromDataset'# ANCHOR: 'COVID19 Confirmed Cases'
# BLENDS: 'Coronavirus News', 'Financial Indicators for COVID'
parameters = {
'token':'**YOUR_TOKEN_HERE**',
'id_dataset':'5e7a0d5d9516296cb86c6263',
'date_filter':{
"start_date":"2020-01-01T06:00:00.000Z",
"end_date":"2020-03-11T06:00:00.000Z"} ,'filter_select' : {'feature' : 'country_region', 'categories' : ['Italy']},'aggregate_in_time_interval':{"output":"avg","empty_intervals":"impute","time_interval_size":86400}, 'blends':[{"id_blend":"**YOUR_CORONA_NEWS_ID**","restriction":"None","blend_type":"ts","drop_features":[]},
{"id_blend":"**YOUR_FINANCIAL_INDICATORS_ID**","restriction":"None","blend_type":"ts","drop_features":[]}]
}df = pd.read_json(json.dumps(OpenBlender.call(action, parameters)['sample']), convert_dates=False, convert_axes=False).sort_values('timestamp', ascending=False)
df.reset_index(drop=True, inplace=True)***
上面我们选择了“意大利”、的观测值,按天以秒为单位(8640)进行聚合,混合了新数据。**
***df.head()***
现在我们有了一个数据集,它包含了所有数据按时间混合的日常信息!****
这有很大的发展空间。
请发布进一步的发现。