人工智能 vs 机器学习 vs 数据科学
人工智能、机器学习和数据科学是在几乎所有领域的专业人士中变得非常流行的几个术语之一。如果任何专业人士从未听说过这些术语中的任何一个,那将是一件令人惊讶的事情。
随着第四次工业革命的开始,一场正在模糊物理、数字和生物领域之间界限的技术革命,现在有必要更好地理解快速变化的技术术语。
完全理解这些术语容易吗?
我们假设您事先不了解这些术语。我们的目标是深入研究每一个概念,并强调使每一个概念与众不同的特征。
什么是人工智能(AI)?
“人造的”可以是任何由人类制造的非天然的东西。你对“智力”这个词的理解是什么?它是理解、思考和学习的能力。因此,人工智能是计算机科学的一个广阔领域,它使机器看起来像具有人类智能。
人工智能的目标是模仿人脑,创造能够智能和独立运行的系统。人工智能可以以许多不同的方式表现出来。
如果你曾经要求 Alexa 为你点餐或浏览网飞电影的建议,你正在与 AI 互动,而没有意识到这一点。
人工智能的设计让你意识不到有一台机器在发号施令。在不久的将来,人工智能有望变得不那么人工,而更加智能。
“智力”这个词的定义在这里很重要。让我们用另外两种方式来定义智力。“智能”是在给定一组输入和各种可能的行动的情况下做出正确决定的能力,或者它是一组思维属性——计划、解决问题和推理的能力。
智能行为表现出什么?
- 解决问题——为复杂问题寻找解决方案的过程。
- 推理——以逻辑方式思考问题的行为。
- 规划——为某事制定计划的过程。
- 决策——做出重要决策的过程。
- 做出推论——根据证据做出结论或判断。
- 学习——通过学习、体验或接受教育获得知识。
什么是机器学习(ML)?
我们将从最不正式和最简单的定义开始。机器学习是一种事物标签,你可以用例子而不是指令来解释你的任务。
机器学习背后的概念是,你把数据喂给机器,让它们在没有任何人工干预的情况下(在学习的过程中)自主学习。考虑一个小场景。比方说,你报名参加了一些游泳课程,但你以前没有游泳经验。
不用说,最初,你的表现不会很好,因为你不知道如何游泳,但随着你观察和收集更多的信息,你的表现会越来越好。
纪念活动只是另一种收集数据的方式。就像我们人类如何从我们的观察和经验中学习一样,当机器获得大量数据时,它们也能够自主学习。
这正是我们如何运用机器学习的概念。它是让机器从经验中学习和改进的过程,而不是显式地自动编程。
那么,如何让机器从经验中学习呢?
要理解这部分,我们需要理解什么是算法。一个简单的谷歌定义指出,算法是“在计算或其他解决问题的操作中,特别是由计算机遵循的一个过程或一组规则。”
换句话说,算法可以是定义明确的计算机可执行指令的有限序列,通常用于解决一类问题或执行计算。现在我们知道了什么是算法,让我们来探索是什么让机器学习。
机器学习算法本质上是一个过程或一组程序,帮助模型适应给定目标的数据。ML 算法通常指定数据从输入到输出的转换方式,以及模型如何学习从输入到输出的适当映射。
更简单地说,机器学习算法是程序(数学和逻辑),当它们接触到更多数据时,会自我调整以表现更好。
机器学习的“学习”部分意味着这些程序随着时间的推移改变他们处理数据的方式,就像人类通过学习改变他们处理数据的方式一样。
它们以这样一种方式改变,即任何特定输入值被映射到其正确输出值的概率在每次通过改变算法内的一组变量(或结构)而暴露给新数据时增加,该算法用于对输入值执行计算并得出最终输出值。
从术语“机器学习”中使用的“学习”一词可以明显看出,它与人工智能有关,人工智能包括人脑的学习能力。
机器学习是关于机器一起体验相关数据并获取模式,就像人类可以在任何数据集中找出模式一样。
机器学习是人工智能的一个子集
机器学习算法有不同的类型。一些算法被输入标记的数据,如果后来暴露于任何未标记的数据,这些算法会自我调整以吐出正确的标签(监督学习)。
一些算法给出了未标记的数据,以找出数据集中隐藏的模式(无监督学习)。
如果机器学习是人工智能的子集,那么什么人工智能不是机器学习?
机器还可以通过许多其他方式来展示它们的智能。机器学习算法依靠数据来智能地执行。
有没有不依赖数据但仍能显示智能的人工智能算法?
好吧,我们来探索一种人工智能的搜索算法。
人工智能中的“搜索”是什么意思?
人工智能中的搜索是通过中间状态的转换从起始状态导航到目标状态的过程。搜索算法对数据科学家来说非常有用。
红色的值是每个节点的试探法,黑色的值是在两个节点之间移动的成本。任何节点的启发式值表示从该特定节点到达目标节点所需的成本。从 a 到 e 的成本是 3 + 10 = 13。
A*算法利用成本和启发式值,通过计算最便宜的解决方案的估计成本,即 f(n) = g(n) + h(n),找到从初始状态到目标状态的最短路径。g(n)是从初始节点移动到节点 n 的代价,h(n)是从节点 n 到达目标状态的估计代价(启发式值)。
这个算法是否智能执行?
该算法在每一步进行计算,保留以前计算的知识,并在每一步做出决定。这确实是一种人工智能。
但这是否需要数据集像任何机器学习算法一样智能地学习和执行呢?不。这是人工智能吗?是啊!这是机器学习的例子吗?不要!
人工智能是一个比机器学习更广泛的概念
人工智能是一种技术,其目标是创造能够模拟人类智能的智能系统。相比之下,机器学习是让系统获得特定形式的人类智能的方法之一。为了更好地区分这两者,我们将使用一个表格。
人工智能机器学习领域。人工智能的子集。目标是模拟人类智能来解决复杂问题。
目标是从数据中学习,并能够在出现新数据时预测结果,或者只是找出未标记数据中隐藏的模式。导致智力或智慧。通向知识。
寻找最佳解决方案的尝试。试图找到唯一的解决方案,无论它是否是最优的。
现在已经很清楚如何区分机器学习和人工智能的其他应用了。
尽管存在差异,但这些术语经常互换使用。因此,了解关键差异非常重要。人工智能经常使用 ML 及其其他子集,例如,自然语言处理(NLP)来解决文本分类等问题。
数据科学
“在未来 10 年,数据科学和软件对医学的贡献将超过所有生物科学的总和。”—维诺德·科斯拉
你知道什么是推荐引擎吗?你可能用过亚马逊网上购物。你有没有注意到,当你在亚马逊上搜索一个特定的商品时,你会得到类似的商品推荐?
亚马逊在这一切背后是如何运作的?它是如何向你展示你感兴趣的项目的?亚马逊、沃尔玛和网飞等公司表现出色的原因是他们如何利用用户生成的数据。
这些是数据驱动的公司。这些公司的关键一直是数据。
推荐系统根据用户的浏览历史、评级、个人资料详细信息、交易详细信息、购物车详细信息等过滤出每个用户的选择列表。这种系统用于获得对顾客购物模式的有用洞察。
它为每个用户提供了基于他们个人资料的电子商务网站的特定(独特)视图。
例如,如果你在亚马逊上搜索一台笔记本电脑,你可能也需要买一个电脑包。亚马逊将类似的交易映射在一起,然后向用户推荐相关的商品。
在我们深入探讨这个主题之前,有必要了解一些通常与数据科学相关的术语的含义。
什么是数据科学?
数据科学是一个多学科领域,专注于从大量原始(非结构化)和结构化数据中发现可行的见解。
数据科学家使用不同的技术来获得答案,结合计算机科学、预测分析、统计学和机器学习来解析海量数据集,以建立尚未想到的问题的解决方案。
数据科学专家的主要目标是提出问题并找到潜在的研究途径,而不太关心具体的答案,更重视搜索要问的正确问题。
你听说过大数据吗?
大数据是指难以实时存储和处理的海量数据。这些数据可用于分析洞察力,从而做出更好的决策。
什么是数据分析?
数据分析是对数据进行检查、清理、转换和建模的过程,其目标是发现有用的信息、提供结论和支持决策。它和数据科学不一样。
数据科学项目的工作步骤是什么?
- 理解业务问题——询问相关问题,理解并定义问题的目标。
- 数据采集—从多个来源收集数据。
- 数据准备—数据清理和转换。
- 探索性数据分析——定义和细化将在模型开发中使用的特征变量的选择。
- 数据建模——这是数据科学项目的核心活动。这包括对数据重复应用不同的机器学习技术,如 KNN、决策树、朴素贝叶斯,以确定最适合业务需求的模型。
- 可视化和交流——会见客户和交流商业发现。这一步创建了强大的报告和仪表板。
- 部署和维护—在生产环境中部署之前,在生产前环境中测试模型。
在探索数据科学时,我们已经弄清楚了机器学习在其多样化环境中的确切应用位置(在数据建模步骤中)。让我们问自己一些重要的问题。
数据科学与机器学习有什么样的关系?机器学习是数据科学和人工智能的交叉吗?下图可视化了数据科学、人工智能和机器学习之间的关系。
显然,你可以看到 ML 和 AI 都不是数据科学的子集,而数据科学也不是这两者的子集。数据科学不仅仅是人工智能和人工智能。
人工智能和人工智能不仅仅是数据科学。数据科学中使用了 ML 技术来执行特定的任务和解决特定的问题。
数据科学领域采用了人工智能概念,而不是人工智能技术。
文本挖掘(人工智能和数据科学的交叉,但不是 ML)是一种人工智能技术,它使用自然语言处理将文档和数据库中的原始(非结构化)文本转换为适合分析或驱动机器学习算法的标准化结构化数据。
了解差异的重要性
数据科学领域提供了大量有前途的职业。为了给自己选择正确的专业,了解这些经常被错误地互换使用的不同术语之间的区别是至关重要的。
我们希望现在你对什么是数据科学,什么是机器学习,什么是人工智能的概念有了更好的了解。然而,关于人工智能和数据科学,你还有很多可以探索的。
人工神经网络
神经网络是执行由人脑中的神经元执行的任务的系统。神经网络包括作为人工智能(AI)一部分的机器学习,是我们开发神经元和大脑功能以复制人类学习方式的系统。
这是系统发展的第一步,该系统复制我们大脑中神经元的功能,帮助我们像人类一样学习。
神经网络(NN)形成一个隐藏层,其中包含将输入从输出更改为输出的单元,以便输出层可以使用该值。这种转化称为神经层,称为神经单元。下一级的输入由一系列称为功能的功能使用,这些功能又在一系列变换中用作下一级的输入,每一级的每一个都有不同的值。
通过重复这些转换,神经网络学习边缘形状等非线性特征,然后与最终层结合,对更复杂的对象进行预测。本文的主题将是神经网络的扩展版本,即深度学习。网络权重参数会发生变化,以最小化输入值与特定属性或边形状的期望值之间的差异。
人类大脑是已知的最强大的计算机器之一,其内部工作通常以已知的生物神经网络为模型。根据美国国立卫生研究院(NIH)的数据,它包含大约 1000 亿个通过路径和网络连接的神经元。
人工神经网络是受生物启发的计算机模型,以人脑中的神经元网络为模型。它们也可以被视为模拟输入输出关系的学习算法。人工神经网络的应用包括模式识别和预测。
人工神经网络(ann)被描述为机器学习算法,旨在通过从数据中提取有用的模式来获取自己的知识。他们将非线性函数应用于输入的加权和,并对它们之间的关系进行建模。
人工神经网络由许多互连的计算单元组成,称为神经元,是将输入映射到输出的函数逼近。人工神经网络是将输入映射到输出的函数或近似器,反之亦然。
单个神经元几乎没有内在收敛,但当许多神经元一起工作时,它们的组合效应可以表现出显著的学习性能。由神经元及其突触形成的神经网络是人类认知的关键组成部分,负责许多认知功能,如记忆、思维和决策。然而,今天,生物神经元被认为是人脑中最强大的计算单元之一,能够学习和记忆。
鉴于此,一个自然的假设是,为了复制大脑的功能和能力,包括智能的能力,并因此能够进行认知功能,如学习和决策,必须实现神经网络的计算机化版本。关系网络和图灵神经机器提供了证据,证明连接主义和计算主义的认知模型不需要相互矛盾,可以共存。
人工神经网络(ann)是直接受生物神经网络启发或部分模仿生物神经网络的统计模型。存在被称为人工神经网络的高级统计技术和概念,并且它们最重要的特征之一是并行模拟输入和输出之间的非线性关系的能力。
已经出现了几种类型的神经网络,但最基本的类型,神经网络,是所谓的“迁移信息网络”最常见的网络类型是神经网络,其中数据从网络的一部分线性地流向另一部分。
人工神经网络(ANN)与之类似,但它是科学中的一种计算网络,类似于人脑的属性。ANN 可以模拟人脑的原始神经元,所以它的处理部分被称为“人工神经元”。
术语“神经元”和“人工神经元”是等价的单位,并且暗示与生物神经元的密切联系。人工神经网络由相互连接的神经元组成,这些神经元受大脑工作方式的启发,但具有不同的特征和特性。
在微观层面,术语“神经元”用于解释深度学习是对人脑的模仿。然而,“深度学习”与人脑的神经生物学关系不大,而是与神经网络有关。
神经网络是一种机器学习方法,其中计算机通过分析训练样本来学习执行任务。在宏观层面上,神经网络可以被认为是人类智能使用的机器。
神经网络是对人脑的松散模拟,由紧密连接的简单处理节点组成。今天,大多数神经网络都是由节点层组成的,每个节点都在网络内外有意义地移动。例如,可以向物体识别系统提供一系列与特定标签一致相关的图像中的视觉图案。她会发现图像中的视觉图案与标签相匹配。
引用来源
- http://news . MIT . edu/2017/explained-neural-networks-deep-learning-0414
- 【http://uc-r.github.io/ann_fundamentals
- https://www . kdnugges . com/2016/10/人工智能-深度学习-神经网络-解释. html
- https://www . digital trends . com/cool-tech/what-is-an-artificial-neural-network/
- https://developer . NVIDIA . com/discover/artificial-neural-network
- https://mindmajix . com/人工智能中的神经网络
- https://www . software testing help . com/人工神经网络/
CNN 新手手势识别
使用 Python 和 SqueezeNet 的有趣实验
奥斯曼·拉纳在 Unsplash 上拍摄的照片
CNN 或卷积神经网络是图像分类问题中最常用的算法。图像分类器将照片或视频作为输入,并将其分类到它被训练识别的可能类别之一。它们在各个领域都有应用,如无人驾驶汽车、国防、医疗保健等。图像分类有许多算法,在这个实验中,我们将研究这种类型中最受欢迎的算法之一,DeepScale 称之为 SqueezeNet 。
目标是:
我们的目标是设计一个应用程序,它将使用网络摄像头(或外部摄像头)作为输入设备,然后它将识别手势并将其分类到我们将要定义的类别中。在本文中,我们将看到如何使用 SqueezeNet 算法来设计一个应用程序,它采用不同的手势,然后触发某些动作。简而言之,我们可以向我们的计算机发送一些命令(无需触摸键盘或鼠标)。让我们戴上魔术师的帽子吧!🧙♂️
实验包括下列四个阶段:
概述:
- 定义我们的分类类别
- 收集训练图像
- 训练模型
- 测试我们的模型
1.定义我们的分类类别(手势)
在我们最后的节目中,我们将表演一些动作。这是我决定要做的一些事情的清单。根据您的具体要求,此列表中的项目数量会有所不同。接下来,为了方便起见,我们将使用类别名称来映射这些操作,以便稍后在我们的程序中使用。
- 增加扬声器音量(类别= 向上 )
- 降低扬声器音量(类别= 调低 )
- 静音/取消静音(类别= 静音 )
- 播放/暂停(类别= 播放 )
- 打开谷歌浏览器(*category =*Chrome)
除了这五个类别,我们还应该有另一个类别(category =nothing),当用户做出我们的模型无法识别的手势时,或者当用户没有输入手势时,我们将在最终的程序中使用这个类别。
现在我们已经决定了我们的六个类别,让我们看看我的手势看起来怎么样。
我在下面创建了一个所有手势和它们各自类别名称(红色)的拼贴画。
所有手势及其类别名称的拼贴画(使用网络摄像头拍摄)
2.收集用于训练的图像
下一组是为每个类别准备我们的训练图像。为了收集我们的训练数据集(图像),我们将使用网络摄像头。为了让事情变得简单,我确保使用背景简单整洁的图片。下面的 python 程序将使用 OpenCV 库来执行这个动作,并将这些图像存储到一个名为“ training_images”的文件夹中。 程序需要两个输入参数:
python get_training_images.py 50 up
a) 要拍摄的图像数量(例如:- 50)
b) 标签(或类别)名称(例如:-向上、向下、播放、铬等)
程序 在捕捉到那么多图像后停止。第二个参数指示这些图像所属类别的名称。该程序在我们的’ training_images '文件夹中根据类别名称创建一个子文件夹,并将所有图像存储在那里。
“training_images”文件夹中所有子文件夹的屏幕截图
一旦你运行该程序,网络摄像头的饲料将打开。将手放在白色框的边界内,按下“ s ”键到 开始 给手拍照。在此过程中,尝试移动您的手,在训练数据集中添加一些变化。我从这里开始,对每个类别运行程序两次,右手 50 张图片,左手 50 张图片。一旦程序结束,你应该能够看到你的手势名称的子文件夹中的图像。一旦这个过程完成,你将在每个文件夹中得到 100 张图片。你可能想选择一个适合你的号码,越多越好。
3。训练模型
在这个演示中,我们将使用 SqueezeNet。SqueezeNet是一个流行的用于图像分类问题的预训练模型,它非常轻量级,具有令人印象深刻的精确度。我们将在训练过程中使用 Keras 库。 Keras 是一个简单而强大的 python 库,广泛应用于深度学习。这使得训练神经网络模型变得非常容易。
让我们看一下用于我们培训的一些参数。
**顺序:**我们将使用顺序模型,这意味着各层以线性堆栈(顺序)排列。模型中的层作为参数添加到此构造函数中。
**退出率:**在较小数据集上训练的神经网络往往会过度拟合,因此在新数据上不太可能准确。从理论上讲,训练模型的最佳方法可能是尝试不同参数值的不同组合,然后取这些单独结果的平均值,以得出一个概括的结果。但是这将需要大量的时间和计算资源来用这些参数的多种组合多次训练模型。为了解决这个问题,引入了辍学率。这里,层中的一些单元/节点(来自输入层或隐藏层,但不来自输出层)被’丢弃’,这使得该节点的输入和输出连接消失。简而言之,当在训练期间多次这样做时,不同数量的节点从层中被丢弃,使得该层在节点数量及其与前一层的连接方面看起来不同(粗略地模拟具有不同层配置的多个模型)。一个图层的辍学率的较好值在 0.5–0.8 之间。就我而言,在尝试了几个不同的值之后,我发现 0.5 给了我最好的结果。请注意,脱扣是用来避免过度拟合。如果模型的精确度低,则可以避免该参数。
**节点:**我们输出层中神经元/节点的数量等于我们试图预测的类的数量。
**输入形状:**SqueezeNet 要求的输入形状至少是 224 X 224(RGB 有 3 个通道)。在这个程序中,我们使用了 225 X 225。
**选择优化器&损失:**这里我选择了 亚当 优化器。并且基于问题的类型选择损失函数。例如:-对于二元分类问题,[loss = ’ binary _ cross entropy ']更适合,对于多类分类问题,选择[loss = ’ categorial _ cross entropy ']。而对于回归问题,可以选择 [loss=‘mse’] 。由于我们的问题是一个多类分类问题,我们将使用 分类 _ 交叉熵。
**历元数:**历元数是整个数据集在训练过程中通过神经网络的次数。对此没有一个理想的数字,它取决于数据。在这种情况下,我从 10 开始,我用了 15。数字越大表示训练时间越长。
**激活函数:**我们使用的是 ReLU 激活函数,这是神经网络中最常用的激活函数,因为它计算简单(还有其他优点)。该函数为负输入返回零,为正输入返回值本身。对于大多数现代神经网络,ReLU 是默认的激活函数。还使用的其他激活函数是 Sigmoid、Tanh 等。
**池化:**在 CNN 中,通常的做法是在卷积&激活层之后添加一个池化层。输入图像被下采样或转换成低分辨率版本,以便仅保留重要的细节并去除较精细的不太重要的细节。
**soft max:**soft max 层用在输出层之前的多类分类中。它给出了输入图像属于特定类别的可能性。
import numpy as np
from keras_squeezenet import SqueezeNet
from keras.optimizers import Adam
from keras.utils import np_utils
from keras.layers import Activation, Dropout, Convolution2D, GlobalAveragePooling2D
from keras.models import Sequential
import tensorflow as tfGESTURE_CATEGORIES=6
base_model = Sequential()
base_model.add(SqueezeNet(input_shape=(225, 225, 3), include_top=False))
base_model.add(Dropout(0.5))
base_model.add(Convolution2D(GESTURE_CATEGORIES, (1, 1), padding='valid'))
base_model.add(Activation('relu'))
base_model.add(GlobalAveragePooling2D())
base_model.add(Activation('softmax'))base_model.compile(
optimizer=Adam(lr=0.0001),
loss='categorical_crossentropy',
metrics=['accuracy']
)
训练后,我们将把训练好的模型参数存储到一个文件(手势-模型 05_20.h5)中,我们将在稍后的模型测试中使用该文件。全部代码都在 github 库中。
model.save("gesture-model05_20.h5")
4。测试型号
为了测试这个模型,我使用了我的网络摄像头再次捕捉到的一些手势图像。该程序加载模型文件“手势-模型 05_20.h5 ”,并将输入图像作为参数,并预测其所属的类别。在传递图像之前,我们需要确保我们使用的尺寸与我们在训练阶段使用的尺寸相同。
from keras.models import load_model
import cv2
import numpy as npimg = cv2.imread(<input image file path>)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (225, 225))model = load_model("gesture-base-rmsprop-model05_20.h5")
prediction = model.predict(np.array([img]))
对于以下测试图像,模型预测正确。然而,如果图像在背景中包含太多其他项目,它并不总是准确的。
测试图像(使用网络摄像头拍摄)
最后,尽管这种模式可能无法每次都完美运行,并且我们可以做很多事情来改善其性能,但它为我们提供了一个起点,并从这里开始建立这些基础。感谢您抽出时间阅读这篇文章,我希望它能帮助您创建您的第一个 CNN 项目。我期待着看到这个项目你的版本。请与我分享您的想法:)
在我的下一篇 文章 中,我们将看看如何使用 Python 基于已识别的类采取行动。
本文使用 Python OpenCV。如果您不熟悉 Python 中的 OpenCV 库,这里有一个链接,链接到我关于这个主题的介绍性文章。
使用 Python OpenCV 在图像和视频中检测人脸的介绍。
towardsdatascience.com](/face-detection-in-10-lines-for-beginners-1787aa1d9127) [## 在 5 分钟内制作一个声控鼠标
Python 中语音识别和 GUI 自动化的初学者指南
medium.com](https://medium.com/@b.arindom/build-a-voice-controlled-mouse-keyboard-in-5-minutes-952bc8f101fc)
参考文献&延伸阅读:
[1] SqueezeNet,https://codelabs . developers . Google . com/codelabs/keras-flowers-SqueezeNet/
[2] Pooling,2019,https://machine learning mastery . com/Pooling-layers-for-convolutionary-neural-networks/
[3] SqueezeNet Paper,2016,https://arxiv.org/abs/1602.07360
[4]备选 OpenCV 方法,https://www.youtube.com/watch?v=-_9WFzgI7ak
[5]辍学:防止神经网络过度拟合的简单方法,2014,http://jmlr.org/papers/v15/srivastava14a.html
人为的特殊白痴
人工通用智能不太为人所知的堂兄
机器学习研究领域的大部分动力来自对一个终极目标的追求:对人工通用智能的探索(AGI)。这一长期目标激发了人们的热情,因为它总是让人们觉得遥不可及,但矛盾的是,出于深层的根本原因,人们无法理解。有人可能会创造一种全新的感知形式,这种可能性让一些人将对 AGI 的探索提升到了一种准宗教的目的——最近有人毫不讽刺地告诉我,“我愿意放弃我的生命来解决 AGI。”将这种狂热与对 AGI 根深蒂固的恐惧形成对比是很有趣的,如果流行文化是世界内在神经症的准确反映,那么普通大众似乎也同样广泛地分享这种恐惧。
可能会让一些人感到惊讶,我发现自己对参与寻找 AGI 相对不感兴趣。明确地说,我不能“不关心”AGI,部分原因是因为似乎有很多人真的认为制造终结者是我字面上的工作描述(剧透:它不是)。作为一名从事人工智能和机器人研究的人,我非常认真地承担责任,确保我的工作和行动解决该研究领域产生的问题,而不管它们在其他人身上引发的恐惧或热情。
假装和制造它
但我对寻求 AGI 有矛盾心理的主要原因是,我认为我们正处在一个实现“功能性 AGI”的轨道上,比实现“真正的 AGI”要快得多,而且前者很可能在未来几十年填补后者的生态位。就像飞机的发明严重阻碍了对建造人工鸟翼的追求,或者鉴于轮子的存在,对人工腿运动的追求从来不是人类最迫切的关注,今天的机器学习进步正在带来各种能力,这些能力可能在所有意图和目的方面看起来、感觉起来和行为起来都像真正的人工智能,但与真正的 AGI 的道路有很大差异,同时在功能上填充其技术角色。
举例来说,我最近与“人工智能”进行了对话,这些对话比我与许多人(当然不是你……我发誓,与你交谈要有趣得多……)的对话更有吸引力、更高级、更有用,然而这些神经网络(因为它们就是这样)只是稍微复杂,但却是固定的数学函数 y=f(x),没有状态,没有永久记忆,也没有适应性。这些人工智能在时间中被冻结了。它们是输入-输出映射,没有进化或形成长期信念的机制。但它们展示了许多功能属性,这些属性将使系统能够偷偷通过图灵测试:它们表现得好像它们理解文化参考,它们开玩笑,它们可以在对话中携带上下文,并对基础事实做出推断。如果你的目标是拥有帮助人们完成任务的自动化交互代理,它们也是非常有用的。
具有讽刺意味的是,如果一场智能对话即将成为一个警告信号,表明你可能正在与一个机器人交谈,那么我们有一系列全新的问题需要关注。
简而言之,通往 AGI 的“假装成功直到成功”的道路实际上让我们走得比我想象的更远,这让我想知道,如果没有任何支撑 AGI 背后许多恐惧的不断发展、自我优化的机制,AGI 的大部分价值能否实现。要清楚的是,没有什么根本的东西阻止我们创造有状态并与长期记忆互动的人工智能,但仍然有一点值得赞赏的事实是,今天,人工智能管理的所有最大成就都不需要那种机器,但仍然在推动“感觉”智能和普遍有用的边界。时间会告诉我们这种模式能走多远,这种模式的好处是在实际环境中推理、训练和部署更简单。
在 AGI
假设我大错特错:这些“假”功能人工智能无法填补智能代理的生态位,而强大的人工智能确实就在我们的门口。一个主要的存在主义担忧是害怕释放非人类的、非常聪明的、非常强大的实体到世界上。这些可能是具有无限生命周期的代理人,他们的目标并不总是与我们的一致,他们有能力调动大量资源,并有能力迫使人类为他们的目的服务。
够吓人吗?如果这就是 AGI 的真正定义,那么这些实体今天已经在地球上漫游了:它们被称为公司和政府。公司和政府是由人组成的这一事实,并没有让它们变得不那么做作、不那么强大,或者更符合人类的偏好。(声明一下,这种将公司比作 AGI 的类比并不是我发明的,尽管我还没能找到我第一次遇到它的地方。欢迎指点。)
公司和政府都是这样的构造,它们一次又一次地证明了它们的目标是如何与任何个人的合理愿望大相径庭的:这些系统的动力本质上是非人类的,并且服从于诸如利润最大化或社会控制之类的目标,而这些目标往往与个人的利益关系不大。他们用近似人类语言的方式“说话”,但不完全是人类语言:他们用广告、新闻稿或宣传来和我们说话。和他们顶嘴可能是一种奇怪的体验,任何一个和客服打过交道或者在车管所排队的人都可以证明这一点。它们的流程是由人设计和进化的,没错,但 AI 也是。
公司和政府在任何情况下都是 agi。它们可能又大又可怕,以一种非常直接的方式统治着你的日常生活。但是我们已经接受了人类可以与之共存,事实上我们已经和它们发展了或多或少的共生关系。那么,为什么当一个假想的 AGI 是由硅制成的,而不是由人和过程制成的时候,感觉(包括我自己)要可怕得多呢?我们有理由相信,如果强大的 AGI 成为现实,它与人类的关系将会与它与企业实体的关系发生显著的不同吗?丹尼尔·吉尔伯特(Daniel Gilbert)在他的书《跌跌撞撞的幸福》中(用数据)指出,预测一个人未来的最佳方式不是想象未来的自己,而是环顾当下相关的代理人。我想知道,当谈到对强大的 AGI 可能到来的推理时,看一看工业革命期间现代公司的崛起是否是比常见的科幻小说比喻和叙述更好的代理:无论从哪方面来看,这都不是人类状况的直接和无痛的发展,但人类通过新的社会结构、新的法律和新的监督机制来适应它,迄今为止,这些已经以总体有益的方式带我们度过了这场混乱。
平心而论,我确实可以想象出类比可能会失效的几种方式。首先,如果这样的突破是在几年内而不是几十年内发生的话,所涉及的时间尺度。一代人内发生的颠覆与跨代变化看起来非常不同。其次,将任何新的参与者引入现有的生态系统,无论是生物的、社会的还是技术的,都存在真正的风险。第三,现代国家和企业未能解决的一个问题是如何将外部性管理(特别是地球资源和环境)纳入其“智能”中。有人可能会理直气壮地说,AGI 最大的外部因素……是我们。一个发人深省的想法是,如果我们今天不解决管理生态系统外部性的问题,我们可能永远没有机会真正面对这个问题。
在 ASI 上
我个人认为,围绕机器学习作为人类增强工具的问题比寻求更高形式的智能更具吸引力、可操作性和说服力。事实上,我的最终目标与其说是追逐 AGI,不如说是解决它的老白痴表亲的崛起:人工特殊白痴(ASI),即无意或有意滥用当今不那么普遍的人工智能。与我们今天所接触到的 AGI 的替代品有关的问题,以及这些问题如何对我们生活的世界产生积极或消极的实质性影响,是深刻而迷人的。
因为 ASI 比较专业,所以他们对世界的理解往往会有盲点。事实上,他们对世界的理解可以更好地描述为他们无知的汪洋大海中的一个小岛。你不能仅仅通过向它展示狗和猫的图片来建立一个狗和猫的图像识别系统,否则它会根据狗或猫来推理它看到的一切,并且不会知道它不知道的东西,即世界上的大多数东西也不是。是的,我知道。贝叶斯主义者会告诉你,你可以使用适当的概率推理。试试看。当它不起作用时,他们可能会告诉你,你使用了错误的先验。恭喜你,你赢得了贝叶斯宾果游戏,只是用一个棘手的问题换了另一个。如果你一直在关注最近围绕基于能源的模型的一系列兴趣,你就会知道这个领域可能正在发生变化,回避概率可能就是入场券。
我记得我从事语音识别的日子,到目前为止,要提高语音到文本模型的准确性,最重要的事情是改善所有不是语音的东西的建模,从关门声到背景音乐到婴儿啼哭,这包含了比语音本身更大的听觉景观。理解你不知道的东西是当今人工智能领域最有趣的追求之一:我们与建模“已知的未知”斗争,更不用说“未知的未知”在这个领域有很多有趣的工作要做——是的,答案可能仍然是贝叶斯,但话说回来,什么不是呢?
然而,对我来说更有趣的是解决与 ASIs 相差一步的问题:帮助从业者理解首先存在问题,并且已经建立了解决方案和最佳实践的人的问题。无论是关于公平性、信任和可解释性、测试和验证,一旦人们消除了可能导致 ASI 的人类盲点,就有许多实用的方法来处理这些问题。
我今天工作的 AI 和机器人世界对 ASIs 绝对是无情的。与物理系统合作提高了风险:物理安全始终是机器人学的前沿和中心,在其关键路径中引入学习意味着从内部建立安全。它还提出了解决问题的新方法,通过帮助人工智能在物理世界中扎根,并使其体现为人类社会的参与者。我们正在进行的与日常机器人项目的合作体现了许多这些特征:人类世界中的机器人需要深刻的情境意识,无论是在物理还是社会互动方面。脆弱的人工智能的答案很可能是让它面对复杂混乱的物理世界。
问正确的问题:在新任务中训练 T5 变压器模型
T5 转换器将任何 NLP 任务构建为文本到文本的任务,使预先训练的模型能够轻松学习新任务。让我们教老狗一个新把戏!
自从 2019 年 10 月 way 推出 T5(文本到文本转换变压器)以来,我就一直渴望尝试它(这是一个漫长的几个月)。我尝试了几次谷歌的开源代码和,但是我从来没有让它正常工作过。其中的一些超出了我的理解范围(张量流)😫)所以我想我要等拥抱脸来救援了!和往常一样,变压器的实现更容易使用,我对它进行了修改,以便与简单变压器一起使用。
在我们开始精彩内容之前,先简单介绍一下 T5 车型是什么,以及它为何如此令人兴奋。根据谷歌人工智能博客 T5 上的文章所述,该模型是一项关于迁移学习技术的大规模研究(论文链接)的结果,旨在了解哪种方法最有效。T5 模型在 C4 ( 巨大干净的爬行语料库)上进行预训练,这是一个新的绝对大规模的数据集,与模型一起发布。
预训练是迁移学习的第一步,在这一步中,模型在大量未标记的文本数据上进行自我监督的任务训练。在此之后,该模型在为特定任务定制的较小的标记数据集上进行微调(训练),与在没有预训练的情况下简单地在较小的标记数据集上进行训练相比,产生了优越得多的性能。关于预训练语言模型的更多信息可以在我下面的帖子中找到。
[## 理解 ELECTRA 并训练一个 ELECTRA 语言模型
变形金刚模型如何学习语言?伊莱克特拉有什么新消息?你如何在一个平台上训练你自己的语言模型
towardsdatascience.com](/understanding-electra-and-training-an-electra-language-model-3d33e3a9660d)
T5 模型的一个关键区别是所有的 NLP 任务都是以文本到文本的格式呈现的。另一方面,BERT-like 模型将文本序列作为输入,并从输入中输出单个类标签或一段文本。通过在 transformer 模型之上添加相关的输出层,针对特定任务对 BERT 模型进行了改进。例如,为分类任务添加一个简单的线性分类图层。然而,T5 避开了这种方法,而是重新构建任何 NLP 任务,使得输入和输出都是文本序列。这意味着相同的 T5 模型可用于任何 NLP 任务,无需对架构进行任何售后更改。要执行的任务可以通过一个简单的前缀(也是一个文本序列)来指定,该前缀被添加到输入中,如下所示。
来自https://ai . Google blog . com/2020/02/exploring-transfer-learning-with-t5 . html
T5 的论文探讨了 NLP 迁移学习的许多最新进展。很值得一读!
然而,本文的重点是调整 T5 模型来执行新的 NLP 任务。由于统一的文本到文本的方法,这变得(令人惊讶地)容易。所以,让我们来看看前面提到的好东西!
任务
T5 模型在各种各样的 NLP 任务上被训练,包括文本分类、问题回答、机器翻译和抽象概括。我们将教授 T5 模型的任务是问题生成。
具体来说,当给定一个上下文时,模型的任务是询问相关问题。
您可以在简单变形金刚回购的 示例 目录中找到本指南使用的所有脚本。
数据集
我们将使用亚马逊评论数据(2018) 数据集,其中包含亚马逊上各种产品的描述以及与这些产品相关的问答对。
描述和问答配对必须单独下载。您可以按照下面的描述和问答对中的说明手动下载数据,也可以使用提供的 shell 脚本。本研究中使用的类别列表如下。
描述
- 转到评论网址。
- 从页面上的链接下载元数据文件(json.gz)。请注意,从每个类别的数据链接 (例如http://deepyeti . ucsd . edu/简墨/亚马逊/metaFiles/meta _ AMAZON _ fashion . JSON . gz)下载可能比下载所有产品的完整元数据更好。完整的元数据是一个 24 GB 的档案,您将需要一个lotRAM 来处理它。
- 将
*meta_ALL_Beauty.json.gz*
重命名为*meta_Beauty.json.gz*
以匹配问答文件中的名称。
问答配对
- 转到问答网址。
- 下载每个类别的文件。请注意,我使用的是没有多个答案的问答配对。
命令过程
或者,下面的 shell 脚本应该通过读取下面给出的两个文本文件的链接来下载所有必要的文件(将文本文件放在与 shell 脚本相同的目录data/
)。它还会将*meta_ALL_Beauty.json.gz*
重命名为 *meta_Beauty.json.gz*
以匹配问答文件中的名称。
链接到元 JSON 文件
qa JSON 文件的链接
下载 JSON 文件的 Shell 脚本
有了数据文件,我们就可以开始训练我们的模型了!
设置
我们将使用简单变形金刚库(基于拥抱脸变形金刚)来训练 T5 模型。
下面给出的说明将安装所有的要求。
-
从这里安装 Anaconda 或者 Miniconda 包管理器。
-
创建新的虚拟环境并安装软件包。
conda create -n simpletransformers python pandas tqdm
conda activate simpletransformers
-
如果您使用 fp16 培训,请安装 Apex。请遵循此处的说明。(从 pip 安装 Apex 给一些人带来了问题。)
-
安装简单变压器。
pip install simpletransformers
参见安装 文档
数据准备
我们可以使用下面给出的脚本处理数据文件,并以方便的格式保存它们。这也将把数据分成训练集和评估集。
改编自亚马逊评论数据 页面 给出的有帮助的脚本。
检查您的 *data/*
目录中是否有*train_df.tsv*
**eval_df.tsv*
文件。*
训练模型
数据格式
T5 模型的输入数据应该是包含 3 列的 Pandas 数据帧,如下所示。
prefix
:表示要执行的任务的字符串。input_text
:输入的文本序列。target_text
:目标序列。
在内部,简单的转换器将从熊猫数据帧中构建适当格式化的输入和目标序列(如下所示)。
T5 模型的输入具有以下模式:
*"<prefix>: <input_text> </s>"*
**目标序列有如下模式:
*"<target_sequence> </s>"*
前缀值指定了我们希望 T5 模型执行的任务。为了训练 T5 模型执行新任务,我们简单地训练模型,同时指定适当的前缀。在这种情况下,我们将使用前缀ask_question
。即,我们的数据帧中的所有行在前缀列中将具有值ask_question
。
培养
使用简单的变压器训练模型非常简单。
正如您可能从培训脚本中观察到的,我们正在使用t5-large
预培训模型。在t5-large
模型上使用这些参数需要用一个泰坦 RTX GPU 进行大约 12 个小时的训练。根据你的 GPU 资源,你可以增加train_batch_size
来加快训练速度,或者你可以减少它来适应带有更少 VRAM 的 GPU(泰坦 RTX 有 24 GB)。
注意,您可以通过增加 *gradient_accumulation_steps*
来抵消小批量的影响。有效批量大致等于 *train_batch_size * gradient_accumulation_steps*
。
您还可以通过选择t5-base
模型来显著提高训练速度和 GPU 内存消耗。这可能会导致相对更差(但绝不是差*)的模型。*
该训练脚本还将使用权重&偏差框架自动记录训练进度。你可以在这里看到我的日志。
评估模型
评估一个语言生成模型比评估一个分类模型稍微复杂一些。这是因为没有正确的答案可以和分类模型进行比较。评估数据集包含人们对这些产品的描述和问题,但这并不意味着这些是你可以问的唯一正确的问题。
因此,评估语言生成模型的最佳方式之一是生成文本,并让一个实际的人(或几个人)对其进行评估。
说到生成文本,过去几年解码算法令人印象深刻的发展导致了能够生成非常真实的文本序列的模型。(解码算法用于生成文本)
以下部分简要概述了当前使用的流行解码算法。
解码算法
这一部分主要基于关于文本生成的拥抱脸笔记本。我强烈推荐阅读这本笔记本,以便更深入地理解解码算法,因为它很好地解释了算法并展示了如何使用它们。
- 贪婪搜索—在每个时间步长选择概率最高的单词作为下一个单词。T5 论文将该算法用于短序列生成(例如分类)。
- 波束搜索——在每个时间步跟踪
n
最可能的假设(基于单词概率),并最终选择总体概率最高的假设。(n
是光束的数量) - Top-K sampling —在每个时间步从 K 个最可能的下一个单词中随机抽取一个单词。每一步可供选择的单词数量是固定的。
- Top-p 采样—从最小可能单词集中采样一个单词,该单词的累积概率(每个单词的概率之和)超过每个时间步长的概率 p 。每一步可供选择的单词数量是动态的。
我们将结合使用 Top-K 和 Top-p 抽样技术,通过 T5 模型生成问题。这种策略通常会产生看起来更自然的文本。
问题生成
简单变压器 T5 模型的predict()
方法用于生成预测,或者在我们的情况下,生成问题。
这里,我们为eval_df
数据集中的每个描述生成 3 个问题。
让我们来看看一些样品。
**只是为了好玩,我将生成的问题与数据集中的实际问题混在了一起。每个描述有 4 个问题,其中 3 个是生成的,一个是原始的。看你能不能分辨出哪个是哪个!我很想在评论中看到你的猜测。😉
样本 1
描述:
Smart Solar San Rafael II Solar Mission Lantern 将为任何户外环境提供优雅的氛围,是您的露台、甲板或花园的理想选择:由全天候聚塑料制成,具有种子玻璃效果,15 英寸的灯笼可以放在任何表面上,也可以使用集成的挂环悬挂。Rafael II 由顶部的两个暖白色 LED 照明,灯内有一根蜡烛,灯内有一个琥珀色 LED,产生温暖的发光效果。Rafael II 由一体式单晶太阳能电池板和可充电镍氢电池供电,无需布线或运营成本。灯笼在黄昏时自动打开,在黎明时自动关闭。Smart Living Home & Garden 为从授权分销商和零售商处购买的全部产品提供自最初购买日期起 1 年的有限制造商保修。Smart Solar 成立于 2002 年,提供各种太阳能产品。我们为您的庭院和花园设计、制造和定制所有我们自己的产品。享受我们的太阳能、节能、环保照明解决方案、水景和户外装饰。我们相信你会喜欢太阳能生活——这就是为什么我们近 15 年来一直在创造太阳能产品,发展太阳能生活方式。
问题:
- 从地面到 LED 灯泡的高度是多少?谢谢
- 柱子蜡烛用的是什么电池?
- 需要多大尺寸的灯泡?
- 它们重吗?我们有很多风,他们会在桌子上
样本 2
描述:
带治疗孔耐用狗球
问题:
- 哈巴狗玩它会安全吗?
- 有没有吱吱声?
- 狗嚼的时候会爆吗
- 这件物品的重量是多少?
样本 3
描述:
Petco 河岩石浅溪水族馆砾石 Petco 水族馆砾石是理想的淡水和安全的海洋水族馆。这种高质量的砾石具有彩色、耐用的涂层,专门为其永久性和无毒而开发。砾石被加工以去除潜在的有害碎片和物质。它不会影响水的化学性质,也不会伤害任何鱼类、无脊椎动物或植物。可用于水族馆、池塘、水上花园和水族箱。
问题:
- 我有一条鱼鳍很精致的斗鱼。我想确保我得到的砾石不会刮伤或撕裂它们。这东西有用吗?
- 有人在盐水中尝试过吗,如果有,效果如何?
- 袋子和塑料/材料的尺寸是多少?
- 这种砾石有利于水族馆中藻类的生长吗?
样本 4
描述:
进入一个世界的建设乐趣与乐高城市启动设置具有 3 个标志性的车辆。和骑摩托车的警察一起抓强盗!用消防员的快速消防车灭火。然后比赛在救护车上帮助摔倒的阿飞。年轻的建造者需要所有的灵感来探索拯救世界的有趣方式,创造无限的玩耍可能性!包括 5 个带附件的迷你人:强盗、警察、消防员、救助者和一个阿飞。272 件。5 岁以下。+.,“进入一个充满乐趣的积木世界,乐高城市首发套装包括 3 辆标志性的汽车。和骑摩托车的警察一起抓强盗。用消防队员的快速消防车灭火。然后比赛在救护车上帮助摔倒的阿飞。年轻的建造者需要所有的灵感来探索拯救世界的有趣方式,创造无限的玩耍可能性。包括 5 个带附件的迷你人:强盗、警察、消防员、救助者和一个阿飞。
问题:
- 当所有的零件都在盒子里时,启动装置会在盒子里占据多少空间?
- 积木本身有多大?
- 乐高迷你人可以被制作成适合乐高家吗?
- 这套是什么颜色的?画面不清晰,看起来很暗。
样品 5
描述:
这款电视柜优雅时尚,为您的家庭带来全新的面貌。呈深浓咖啡色。两扇滑动门。四个存储区。
问题:
- 如果我的电视不是 32 英寸的,有什么方法可以调整这个单元的高度或宽度吗?
- 这些架子有多高?我有一个高接收器,想确定它是否合适。
- 两个储物格的尺寸是多少?谢谢!
- 抽屉是可以拆下来的还是固定的?
样本 6
描述:
我们说棉花了吗?你打赌我们做到了。男士充电棉长袖 t 恤可能感觉像一件普通的棉 t 恤,但它绝不是普通的。其独特的制作结合了棉的经典舒适性和全天候装备的内置防水性,创造出世界上第一件真正的高性能棉 t 恤。它摸起来很柔软,但比普通棉干得更快,所以你永远不会被压垮。轻盈舒适。可拉伸的机动性。这是你穿过的最有力量的棉质 T 恤衫。毕竟,这是安德玛。
问题:
- 你能帮我拿个大号的吗?
- 这对跑步/短跑有用吗?我的手臂很小,没有太多的灵活性,但做了很多短跑。我穿 vrs2 可以吗
- 12 岁男孩的衬衫尺寸是多少?
- 尺寸大是什么胸部尺寸英寸?
额外样品
描述:
连接圆点!,“连接打点器!Dotters 是我们的 10 只喜气洋洋的达尔马提亚狗,由我们的超软毛绒材料制成,不仅可爱,而且可机洗!
问题:
- 你能吃这个吗?
👀
您还可以在其他产品描述上测试您的模型。下面的脚本使用了我在易贝上找到的一个随机描述。
以及由此产生的问题:
- 地球仪有多大?
- 这盏灯是什么颜色的?
- 我能为这盏灯购买更多的球吗?
包裹
对我来说,T5 模型最吸引人的方面是通过仅仅改变前缀来训练它完成全新任务的能力。在本文中,我们已经训练模型通过查看产品描述来生成问题。然而,通过简单地改变前缀,完全有可能在其他任务上训练相同的模型,并在不同的任务之间切换。**
这种灵活性为 T5 型号打开了一个全新的可能性和应用世界。我等不及要看接下来会发生什么了!
您还可以通过选择t5-base
模型来显著提高训练速度和 GPU 内存消耗。这可能会导致相对较差(但绝不是较差*)的性能。*
有抱负的数据科学家和程序员:你现在正在把钱留在桌子上
交互式工具,用于评估当今环境中所需的技能,并确定获得经验的垫脚石
佩皮·斯托扬诺夫斯基在 Unsplash 拍摄的照片
有许多关于成为数据科学家或开发人员所需的十大技能的精彩文章。这些技能需要数年时间来培养(尽管新兵训练营承诺)。与此同时,你可以在 gig 工作场所施展你的才华。在有(或没有)现实世界需求的情况下解决现实世界问题的经验,会让你对那些坚持只解决玩具问题的人有所帮助。
零工经济平台上的工作可能成功也可能失败。竞争非常激烈,尤其是那些全球性的职位。你可以做一些事情来增加找到好工作的几率。
技能自我评估
意识到什么是可用的是第一步。首先,列出你有信心按时完成专业产出的技能。一些想法:Excel 公式,SQL 查询,查询调优,web 抓取,SQL server 存储过程,可视化(Tableau,Power BI),python,R,回归模型,流失模型。对于程序员来说,这个列表可能包括各种编程语言、数据库设计、云和 AWS 组件,如 S3、红移、弹性计算、ETL。
所需技能的分析
我对 2020 年 9 月 1 日 guru.com 上发布的所有工作做了一个快照分析。具体来看软件和编程工作,我用我的发现创建了一个 Tableau 仪表板。您可以通过此链接访问 Tableau Public 上的仪表板(点击此处)。
你会发现在 viz 的顶部有很多标签。这些是一些更常见的数据科学类型的任务。我会根据我的好奇心或评论中的要求添加更多内容。
Tableau 作者截图(点此)
需求是什么?
Tableau 作者截图(点此)
对编程语言的需求一直很高。那么,典型的数据科学技能属于这个列表的哪一部分呢?Python、SQL、Web 抓取都在图表的前三分之一。这些是你获得成功应该具备的一些基本技能。接零工是一个利用这些技能赚钱的绝佳机会。
里面有钱吗?
是的,自由职业是有钱的。下图显示了一个不错的预算甜蜜点。诚然,“低于 250”是从完全不值得大惊小怪到一个令人满意的发薪日的重大跨越。有时候,与客户的一次成功合作会引发另一次成功合作。或许这能让你找到一份收入更高的工作。这种情况经常发生,尽管你应该被警告把工作从平台上拿下来是有后果的。这些平台通过削减预算来赚钱,他们想把你留在那里。
Tableau 作者截图(点击此处)
确保好的演出
有一个学习曲线。我可以给你一些建议,但是你仍然需要从经验中学习。以下是我学到的一些经验。
- 这个要求合乎道德吗?我被要求创建虚假的产品评论或完成某人的家庭作业。我拒绝了这些提议。我在金融行业工作时,也会拒绝金融领域的任何事情。
- 需求写得好吗?我只挑选那些看起来是由希望完成专业工作的专业人士编写的需求。他们提供所需的信息,并对他们想要的回报(报告、代码、数据)有一个固定的期望。
- 要求合理吗?你认为你能用 200 美元编写和部署一个全新的应用程序吗?有人要求创建一个“像脸书一样”的应用程序吗?没有。让其他一些傻瓜去做那些工作,然后为了一点点的钱去做一大堆疯狂的工作。
4.工作是否值得付出,反之亦然?我做过从 5 美元到几千美元的工作。有时快速 10 美元击球手有助于保持你的情绪,只要你知道你能在 15 分钟内快速完成要求的工作。有些要求看似合理,但一旦你进入细节,它就会爆发。做个专业人士。你签约做这项工作,报酬是这么多。如果你快完成了,那就完成它。有时事情完全失控,或者问题无法用他们所要求的架构或技术来解决。在这种情况下,写一份完整的陈述,说明你完成了什么,你发现了什么,以及你建议接下来要做什么。
我对半年内每周 30 小时的工作持谨慎态度。你全职工作,没有福利或保护。那不是演出,那是工作。
5.客户声誉好吗?他们会付你钱吗?大多数网站会提供客户的反馈,以及他们过去花了多少钱。我有时会过滤那些只想要美国工人的客户。额外的好处是对这些工作的出价少得多,所以你的机会更大。
6.最后,你有能力完成这个请求吗?你有合适水平的技能吗?从你的联盟中挑选一些东西;你可能会有麻烦。此外,该请求是否需要任何特殊许可?画面发展想到了。虽然 Tableau Public 是免费的,但企业许可证却很贵。他们需要给你一把钥匙。
利用你所知道的来优先考虑你的训练。
既然你已经看了那里有什么,是时候将你的技能列表与要求的技能进行比较了。有没有一个领域有你还没有培训好的工作机会?这可能会成为你训练清单上的下一个目标。该自我评估将帮助您根据总体价值确定培训的优先顺序。最新的深度学习模型很有趣,但巩固需求收集、项目管理、专业演示、数据管理以及基本统计和分析的基础将带你走得很远。非常远。
结论
希望你能更好地了解你的技能与自由职业者市场的匹配程度。利用这些信息来指导你的训练,并利用你已经掌握的知识积累经验。
对于那些感兴趣的人,如果你想了解以下技能的更多信息,请在回复中大声喊出来:游戏设计、通用编程、网站开发、数据库设计、故障排除、Angular、Node.js、应用程序开发、所有 Cs、云、图形、硬件、内容管理、CRM、CSS、电子商务、开发等等。
数据科学/大数据实验室——第 3 部分(共 4 部分): 3 节点集群中 Ubuntu 上的 Hive 和 Postgres
实验室数据
使用 Hadoop、Spark、Hive、Kafka、Zookeeper 和 PostgreSQL 在 Raspberry Pi 4 或 VMs 集群中组建数据科学/大数据实验室
这段文字可以用来支持在任何 Ubuntu 20.04 服务器集群中的安装,这就是设计良好的分层软件的妙处。此外,如果您有更多的节点,您可以随意分发软件。本文假设您知道 Linux 命令行,包括 ssh、vim 和 nano。
我不建议从少于三个树莓开始,因为你需要设置通信,并且 Zookeeper 和 Kafka 都需要奇数个节点。如果您尝试使用单个节点,可以使用本指南。尽管如此,性能可能会令人失望——对于单节点,我建议虚拟机具有合理数量的 RAM 和处理器。
由于篇幅原因,我不得不将教程分成四部分:
- 第一部分:简介、操作系统和联网
- 第二部分:Hadoop 与 Spark
- 第三部分:PostgreSQL 和 Hive
- 第四部分:卡夫卡与结论
*所有配置文件均可在【1】:*获得
[## ptaranti/RaspberryPiCluster
Hadoop+Spark+Hive+Kafka+Postgresql raspberry 集群(ubuntu 20.04)的配置文件
github.com](https://github.com/ptaranti/RaspberryPiCluster)
免责声明 : 此文免费提供给大家使用,风险自担。我小心地引用了我所有的资料来源,但是如果你觉得遗漏了什么,请给我发个短信。由于不同的软件版本可能会因其依赖性而表现出不同的行为,我建议使用我在第一次尝试中使用的相同版本。
4.一种数据库系统
我决定在集群中安装一个成熟的关系数据库,如果你要处理数据,这是一个明智的决定。我选择 PostgreSQL 主要是因为它对 GIS 的成熟支持(我使用 GIS 数据)。我将它放在节点 3 中,因为节点 1 有 Spark —来分配工作负载。
我将安装 Hive,它可以很好地与 PostgreSQL 以及 MySQL 和其他语言耦合。
您将找到几个关于如何安装 PostgreSQL 的教程和大量文档。
我有使用 PostgreSQL 的经验,但是按照
[## 如何在 Ubuntu 18.04 上安装 PostgreSQL
PostgreSQL 或 Postgres 是一个开源的通用对象关系数据库管理系统。PostgreSQL 有…
linuxize.com](https://linuxize.com/post/how-to-install-postgresql-on-ubuntu-18-04/)
您需要编辑以下文件
/etc/PostgreSQL/12/main/pg _ HBA . conf
我知道我很懒,以一种准许可的方式配置了 PostgreSQL。请随意更新,但是我建议您只有在所有集群都正常运行后才实施安全性。
你可能想改变设置
*/etc/PostgreSQL/12/main/*PostgreSQL . conf
我编辑了以下属性:
listen_addresses = '*'
这通知 PostgreSQL 监听主机中的所有网络接口。
为了方便,我把 postgres 的密码改成了 postgres(我知道这很蠢…这是实验室,不是生产环境):
pi@pi2:~$ sudo su - postgres
postgres@pi2:~$ psql
psql (12.2 (Ubuntu 12.2-4))
Type "help" for help.postgres=# ALTER USER postgres WITH PASSWORD 'postgres';
ALTER ROLE
postgres=# \q
postgres@pi2:~$ exit
logout
pi@pi2:~$
为了方便起见,我也把我的配置文件放在了 GitHub 中(参见 pi3)
我将数据库设置为由应用程序用户/密码访问。
我喜欢在 windows 机器上使用 visual pgadmin4 来管理数据库。该工具可安装在您的笔记本电脑上,并可远程使用:
[## [计] 下载
用于 Windows,Mac,Linux 和网络的 PostgreSQL 工具
www.pgadmin.org](https://www.pgadmin.org/download/)
注意—按照 PostgreSQL 的默认 Ubuntu 安装程序,数据库管理器服务将在每次重新启动时自动启动。
5.储备
我找到的树莓集群教程没有讨论配置单元安装。
为了更好地理解 Hive,我建议使用项目 wiki 页面:
注意:Hive 需要执行 Hadoop。在启动 Hive 之前,您需要运行:
start-dfs.sh
start-yarn.sh
我应该说安装 Hive 是痛苦的!我已经用 Derby 在本地安装了它,这或多或少很简单。但是我决定将环境作为一个产品来分发:
我在 PostgreSQL 服务器中实例化了一个 metastore 数据库。hive metastore 服务器连接到数据库并接收来自 hiveservers2 的连接。hiveserver2 通过 CLI、beeline 进行评估,并具有 webUI。
hive 架构升级得非常好,允许许多 hiveserver 和 metastore。用户可以通过网络连接并提交他们的查询。
在分布式环境中安装 Hive 最糟糕的地方是,我没有在文档或我查阅的书籍中找到任何更新的教程。但最后,一切都成功了。我将描述如何安装 Hive 分发安装。
从以下位置首次下载配置单元
[## /hive 的索引
编辑描述
downloads.apache.org](https://downloads.apache.org/hive/)
Hive 在一个完整的包中提供了所有的功能。请注意为您的 Hadoop 安装选择正确的 hive 版本。
在
/home/pi/tmp
wget [https://downloads.apache.org/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz](https://downloads.apache.org/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz)tar -xvf apache-hive-3.1.2-bin.tar.gzmv apache-hive-3.1.2-bin hivesudo mv hive /opt/sudo chown -R pi:pi /opt/hive
5.1 设置环境
编辑
在文件末尾添加:
# HIVE**export HIVE_HOME=/**opt**/**hive
**export PATH=$PATH:/**opt**/**hive**/**bin
比:
source /home/pi/.bashrc
5.2 Metastore
在 Hadoop 文件系统上创建数据仓库:
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -chmod g+w /user/hive/warehouse
hdfs dfs -mkdir -p /tmp
hdfs dfs -chmod g+w /tmp
5.3 Lib guava -冲突问题
存在由库版本引起的冲突。从 hive 中删除番石榴,并复制 Hadoop 中可用的更新版本:
$ rm /opt/hive/lib/guava-19.0.jar
$ cp /opt/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /opt/hive/lib/cp /opt/hive/conf/hive-env.sh.template /opt/hive/conf/hive-env.sh
5.4 配置文件
我只从 hive 中准备了一个安装,并通过节点 1 和 2 (pi1 和 pi2)分发它。hiveserver2 将在 pi1 中启动,hive-metastore 将在 pi2 中启动(但配置文件完全相同)。
配置文件必须在以下位置创建:
/opt/hive/conf/hive metastore-site . XML
注意——javax . jdo . option . connection URL必须指向您的 PostgreSQL 数据库。我把它安装在 pi3 (192.168.1.13)
现在,编辑以下文件:
/opt/hive/conf/hive server 2-site . XML
注意—hive . metastore . uri必须指向您的 hive metastore 服务器。我在 pi2 (192.168.1.12)安装了一个
现在,编辑该文件:
【T18*/opt/hive/conf/hive-env . sh*
从 PostgreSQL 站点下载 JDBC 驱动程序
https://jdbc.postgresql.org/download.html
并将其复制到:
/opt/hive/lib/PostgreSQL-9 . 4 . 1208 . JRE 7 . jar
注意—这是当前版本,您应该安装更多更新。
5.5 准备 Postgres
我已经在我的 windows 笔记本上安装了 pgAdmin4 并连接到 PostgreSQL。
我使用 pgAdmin4 GUI 来执行这些步骤:
首先,使用密码 hive 创建一个新的角色 hive (该信息在 hivemetastore-site.xml 配置中使用)。
之后,您需要创建一个名为“metastore”的新数据库,用户“hive”作为所有者。
5.5.1 启动 metastore 数据库模式
此过程将读取 hivemetastore-site.xml 以了解连接信息— IP、端口、用户、密码、数据库名称。
pi@pi1:/opt/hive/bin$ ./schematool -dbType postgres -initSchema
输出:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See [http://www.slf4j.org/codes.html#multiple_bindings](http://www.slf4j.org/codes.html#multiple_bindings) for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL: jdbc:postgresql://pi3:5432/metastore
Metastore Connection Driver : org.postgresql.Driver
Metastore connection User: hive
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.postgres.sqlInitialization script completed
schemaTool completed
您可以在命令行中使用 pgsql 在 pgAdmin4 接口 ou 上检查新数据库。
编辑:
添加:
**export HIVE_HOME=/**opt**/**hive
**export HIVE_CONF_DIR=/**opt**/**hive**/**conf**export PATH=$**PATH**:$**HIVE_HOME**/**bin**:$**HADOOP_HOME**/**bin**:$**HADOOP_HOME**/**sbin
请参考的最终版本。GitHub 中的 bashrc。
5.6 通过网络连接 hiveserver2 和 hive-metastore 时出现的问题
当我将 hiveserver2 连接到 hive-metastore 时,我面临了一场噩梦。最后,我成功地实现了在:
[## HiveServer2 无法连接到配置单元 Metastore 解决方案/变通办法
从 Hive 3.x 开始,增加了针对 HiveServer2 客户端的新身份验证功能。启动 HiveServer2 服务时(配置单元…
kontext .技术](https://kontext.tech/column/hadoop/303/hiveserver2-cannot-connect-to-hive-metastore-resolutionsworkarounds)
此网页描述了由于在 Hive 3 中插入了新的身份验证功能而出现的错误。用于 HiveServer2 客户端的 x。启动 HiveServer2 服务时(Hive 版本 3.0.0)。
建议的解决方法需要在 Hadoop(所有节点中)修改文件 core-site.xml 中的 proxyuser 属性。
/opt/Hadoop/etc/Hadoop/core-site . XML
这在 GitHub 中有所体现。
注意:如果事情出错,您可能需要研究错误和服务。您应该考虑安装 netstat ,以便能够检查每个服务器中监听的端口。
Hiveserver 2 —端口 1000 和 10002 (10002 用于 webUI)
Metastore 端口 9083
sudo netstat -plnt | grep ‘1000’
5.7 分配蜂箱
现在,您必须将安装复制到要运行 hiveserver2、hivemetastore 的节点,以及要执行 CLI(直线)的位置。我复制到所有 3 个节点。
在我的安装中,如前所述,我在 pi1 中使用 hiveserver2,在 pi2 中使用 hivemetastore。请注意,hiveserver2 和 metastore 的配置文件是独立的。当启动这些服务时,您提供指示您打算启动哪个服务的参数。例如,在声明 hiveserver2 时,Hive 不会读取 hivemetastore-site.xml 文件。因此,对于我们来说,将两个配置保存在同一个文件夹中并分发安装是安全的。
要将配置单元安装复制到其他节点:
在 pi2 中:
sudo mkdir /opt/hive
sudo chown -R pi:pi /opt/hive
在 pi3 中:
sudo mkdir /opt/hive
sudo chown -R pi:pi /opt/hive
在 pi1 中:
rsync -vaz /opt/hive/ pi2:/opt/hive
rsync -vaz /opt/hive/ pi3:/opt/hive
5.8 启动配置单元
你需要先启动 Hadoop 和 yarn(start-DFS . sh和 start-yarn.sh )和 postgres !!!
最初,我更喜欢用详细日志启动服务;这有助于了解一切是否顺利,以及了解 Hive 如何在后台工作。请注意, hive-metastore 和 hiveserver2 都需要单独的终端,而第三个终端对于直线来说是必要的。
您应该首先启动 hive-metastore。
在 pi2 中:
hive --service metastore --hiveconf hive.root.logger=INFO,console
初始化 hive-metastore 后,应该启动 hiveserver2。
在 pi1 中:
hive --service hiveserver2 --hiveconf hive.root.logger=INFO,console
您可以使用命令 hiveserver2 在没有详细日志的情况下启动
在初始化这个服务之后,你可以用 jps 和 netstat 命令来检查它。
5.9 直线
现在您可以运行 beeline 来检查是否一切顺利。我从 pi3 开始测试:
首先,启动 beeline 并连接到 hiveserver
pi@pi3:~$ beeline
WARNING: log4j.properties is not found. HADOOP_CONF_DIR may be incomplete.
WARNING: log4j.properties is not found. HADOOP_CONF_DIR may be incomplete.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See [http://www.slf4j.org/codes.html#multiple_bindings](http://www.slf4j.org/codes.html#multiple_bindings) for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 3.1.2 by Apache Hive
beeline> !connect jdbc:hive2://192.168.1.11:10000/default
Connecting to jdbc:hive2://192.168.1.11:10000/default
Enter username for jdbc:hive2://192.168.1.11:10000/default:
Enter password for jdbc:hive2://192.168.1.11:10000/default:
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
现在,您可以访问 hive 中的数据库
0: jdbc:hive2://192.168.1.11:10000/default> show databases;
INFO : Compiling command(queryId=pi_20200604081053_b4992aba-814a-40cd-a32e-12d5b33f0926): show databases
INFO : Concurrency mode is disabled, not creating a lock manager
INFO : Semantic Analysis Completed (retrial = false)
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO : Completed compiling command(queryId=pi_20200604081053_b4992aba-814a-40cd-a32e-12d5b33f0926); Time taken: 6.27 seconds
INFO : Concurrency mode is disabled, not creating a lock manager
INFO : Executing command(queryId=pi_20200604081053_b4992aba-814a-40cd-a32e-12d5b33f0926): show databases
INFO : Starting task [Stage-0:DDL] in serial mode
INFO : Completed executing command(queryId=pi_20200604081053_b4992aba-814a-40cd-a32e-12d5b33f0926); Time taken: 0.215 seconds
INFO : OK
INFO : Concurrency mode is disabled, not creating a lock manager
+----------------+
| database_name |
+----------------+
| default |
+----------------+
1 row selected (8.228 seconds)
0: jdbc:hive2://192.168.1.11:10000/default>
看看这些表格。Hive CLI 类似于 SQL。
0: jdbc:hive2://192.168.1.11:10000/default> show tables;
INFO : Compiling command(queryId=pi_20200604081200_943e5495-23c4-4e35-8975-cedef4563d62): show tables
INFO : Concurrency mode is disabled, not creating a lock manager
INFO : Semantic Analysis Completed (retrial = false)
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:tab_name, type:string, comment:from deserializer)], properties:null)
INFO : Completed compiling command(queryId=pi_20200604081200_943e5495-23c4-4e35-8975-cedef4563d62); Time taken: 0.157 seconds
INFO : Concurrency mode is disabled, not creating a lock manager
INFO : Executing command(queryId=pi_20200604081200_943e5495-23c4-4e35-8975-cedef4563d62): show tables
INFO : Starting task [Stage-0:DDL] in serial mode
INFO : Completed executing command(queryId=pi_20200604081200_943e5495-23c4-4e35-8975-cedef4563d62); Time taken: 0.193 seconds
INFO : OK
INFO : Concurrency mode is disabled, not creating a lock manager
+-----------+
| tab_name |
+-----------+
+-----------+
No rows selected (0.463 seconds)
0: jdbc:hive2://192.168.1.11:10000/default>
5.10 配置单元服务器 2 WebUI
Hiveserver2 在端口 10002 上有一个默认的 webUI:
然后
[## 数据科学/大数据实验室——第 4 部分,共 4 部分:卡夫卡和 Zookeeper over Ubuntu in a 3-node…
使用 Hadoop、Spark、Hive、Kafka 在 Raspberry Pi 4 或 VMs 集群中组建数据科学/大数据实验室…
towardsdatascience.com](/kafka-and-zookeeper-over-ubuntu-in-a-3-node-cluster-a-data-science-big-data-laboratory-part-4-of-4-47631730d240)
[1] P. G .塔兰蒂。https://github.com/ptaranti/RaspberryPiCluster
[2] R .唐。 HiveServer2 无法连接到 Hive Metastore 解决方案/变通办法 (2018)
数据科学/大数据实验室—第 2 部分,共 4 部分:3 节点集群中基于 Ubuntu 20.04 的 Hadoop 3.2.1 和 Spark 3.0.0
实验室数据
使用 Hadoop、Spark、Hive、Kafka、Zookeeper 和 PostgreSQL 在 Raspberry Pi 4 或 VMs 集群中组建数据科学/大数据实验室
这段文字可以用来支持在任何 Ubuntu 20.04 服务器集群中的安装,这就是设计良好的分层软件的妙处。此外,如果您有更多的节点,您可以随意分发软件。本文假设您知道 Linux 命令行,包括 ssh、vim 和 nano。
我不建议从少于三个树莓开始,因为你需要设置通信,并且 Zookeeper 和 Kafka 都需要奇数个节点。如果您尝试使用单个节点,可以使用本指南。尽管如此,性能可能会令人失望——对于单节点,我建议虚拟机具有合理数量的 RAM 和处理器。
由于篇幅原因,我不得不将教程分成四部分
- 第一部分:简介、操作系统和联网
- 第二部分:Hadoop 和 Spark
- 第三部分:PostgreSQL 和 Hive
- 第四部分:卡夫卡与结论
*所有配置文件均可在【1】:*获得
[## ptaranti/RaspberryPiCluster
Hadoop+Spark+Hive+Kafka+Postgresql 集群(ubuntu 20.04)的配置文件
github.com](https://github.com/ptaranti/RaspberryPiCluster)
免责声明 : 此文免费提供给大家使用,风险自担。我小心地引用了我所有的资料来源,但是如果你觉得遗漏了什么,请给我发个短信。由于不同的软件版本可能会因其依赖性而表现出不同的行为,我建议使用我在第一次尝试中使用的相同版本。
3.安装 Hadoop 和 Spark
Hadoop 和 Spark 安装考虑了来自[3,4]和其他来源的指令。
我使用了 Apache 网站上的更新版本:
- hadoop-3.2.1.tar.gz
- spark-2 . 4 . 5-bin-Hadoop 2.7 . tgz
3.1 设置您的环境
首先:下载,并将文件解压到/opt。授予 pi 用户访问权限。
sudo tar -xvf hadoop-3.2.1.tar.gz -C /opt/
sudo tar -xvf spark-2.4.5-bin-hadoop2.7.tgz -C /opt/cd /opt/pi@pi1:/opt$ sudo mv hadoop-3.2.1 hadoop
pi@pi1:/opt$ sudo mv spark-2.4.5-bin-hadoop2.7 spark
pi@pi1:/opt$ sudo chown -R pi:pi /opt/spark
pi@pi1:/opt$ sudo chown -R pi:pi /opt/hadoop
添加到 /home/pi/。巴沙尔:
编辑后:
source /home/pi/.bashrc
3.2 将 Hadoop 和 Spark 配置为单个节点
现在您需要配置 Hadoop 和 Spark
为了清楚起见,我们首先将其配置为单个节点,然后针对群集进行修改。我在 GitHub 中的存储库只包含最终的集群配置文件。
Hadoop
转到文件夹
在这一点上,我遇到了很多麻烦:我不小心在文件头上插入了一行 blanc。这一空白行导致解析错误,Hadoop 一直失败,直到我意识到这个问题。
编辑文件
/opt/Hadoop/etc/Hadoop/Hadoop-env . sh,
在末尾增加以下一行:
**export JAVA_HOME=/**usr**/**lib**/**jvm**/**java-8-openjdk-arm64
编辑配置于
/opt/Hadoop/etc/Hadoop/core-site . XML
编辑配置于
【T18*/opt/Hadoop/etc/Hadoop/HDFS-site . XML*
现在准备数据区:
$ sudo mkdir -p /opt/hadoop_tmp/hdfs/datanode
$ sudo mkdir -p /opt/hadoop_tmp/hdfs/namenodesudo chown -R pi:pi /opt/hadoop_tmp
编辑配置于
/opt/Hadoop/etc/Hadoop/map red-site . XML
编辑配置于
/opt/Hadoop/etc/Hadoop/yarn-site . XML
准备数据空间:
$ hdfs namenode -format -force$ start-dfs.sh
$ start-yarn.sh$ hadoop fs -mkdir /tmp$ hadoop fs -ls /
Found 1 items
drwzr-xr-x - pi supergroup 0 2019-04-09 16:51 /tmp
使用 jps 检查所有服务是否开启(数字变化…) :
$ jps
2736 NameNode
2850 DataNode
3430 NodeManager
3318 ResourceManager
3020 SecondaryNameNode
你需要这五项服务!
测试
为了测试单个节点,我参考了教程[2]:
执行以下命令:
**pi@pi1:/opt$ hadoop fs -put $SPARK_HOME/README.md /**
2020-06-24 19:16:02,822 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2020-06-24 19:16:06,389 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
**pi@pi1:/opt$ spark-shell**
2020-06-24 19:16:23,814 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at [http://pi1:4040](http://pi1:4040)
Spark context available as 'sc' (master = local[*], app id = local-1593026210941).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 3.0.0
/_/Using Scala version 2.12.10 (OpenJDK 64-Bit Server VM, Java 1.8.0_252)
Type in expressions to have them evaluated.
Type :help for more information.**scala> val textFile = sc.textFile("hdfs://pi1:9000/README.md")**
textFile: org.apache.spark.rdd.RDD[String] = hdfs://pi1:9000/README.md MapPartitionsRDD[1] at textFile at <console>:24**scala> textFile.first()**
res0: String = # Apache Sparkscala>
此时,我陷入了困境,出现了类似于以下内容的重复消息:
INFO 纱。委托人:申请报告 _1434263747091_0023(状态:已受理)
我遵循了[4]和其他来源的建议,更改了以下文件/opt/Hadoop/etc/Hadoop/capacity-scheduler . XML。
如果在资源较少的单台机器上运行集群,应该设置参数yarn . scheduler . capacity . maximum-am-resource-percent。此设置指示可分配给应用程序主机的资源比例,从而增加了可能的并发应用程序的数量。请注意,这取决于您的资源。它在我的 Pi 4 4GB 内存中工作。
编辑文件,添加属性:
/opt/Hadoop/etc/Hadoop/capacity-scheduler . XML
注意——教程通常提供命令抑制警告。我更喜欢在实验时看到这些警告。如果您想删除它,请参考第一个教程。
3.3 集群中的 Hadoop 与 Yarn
现在,您应该在单个节点中拥有一个完全可操作的安装。是 Hadoop 走向集群的时候了!
我完成了教程,但是遇到了一些问题。这是意料之中的—不同的环境,不同的软件版本。
经过一些尝试,我成功地拥有了一个稳定的环境。配置 Hadoop 以在集群中使用 Yarn 的下一步是将两者结合起来[2,4]。
注意—由于火花,除了节点 pi1 (pi1 ->主节点)之外,所有节点都具有相同的配置(p2、p3、… ->工作节点)。同样,我的 GitHub 存储库中有可用的配置。我已经提供了所有节点的配置。
为所有节点创建文件夹:
$ clustercmd-sudo mkdir -p /opt/hadoop_tmp/hdfs
$ clustercmd-sudo chown –R pi:pi /opt/hadoop_tmp
$ clustercmd-sudo mkdir -p /opt/hadoop
$ clustercmd-sudo chown -R pi:pi /opt/Hadoop
下一步将从 Hadoop 中删除所有数据。如果有重要的事情,先做好备份。
$ clustercmd rm –rf /opt/hadoop_tmp/hdfs/datanode/*
$ clustercmd rm –rf /opt/hadoop_tmp/hdfs/namenode/*
注意,火花只会存在于主人身上。
复制 Hadoop:
来自 pi1:
pi@pi1:~$ rsync -vaz /opt/hadoop pi2:/opt/ hadoop
pi@pi1:~$ rsync -vaz /opt/hadoop pi3:/opt/ hadoop
pi@pi1:~$ rsync -vaz /opt/hadoop pi4:/opt/ hadoop
对所有节点都这样做。
我更喜欢一个一个做,确认没有异常行为。
现在,需要编辑以下文件,更改配置:
/opt/Hadoop/etc/Hadoop/core-site . XML
/opt/Hadoop/etc/Hadoop/HDFS-site . XML
注意—属性 dfs.replication 表示数据在集群中复制的次数。您可以设置在两个或更多节点上复制所有数据。不要输入高于实际工作节点数的值。我用 1 是因为我的一个笔记本用的是 16GB 的 micro SD。由于新冠肺炎病毒爆发,我的一些部分在邮件中延迟了。如果配置错误,由于缺乏资源,您的 spark 应用程序将陷入“已接受”状态。
注意—最后一个属性DFS . permissions . enabled被设置为 false 以禁用权限检查。我使用集群外部机器上的 spark,这方便了我的访问。显然,我建议不要在生产环境中使用这个设置。我还关闭了安全模式。为此,在完成安装运行后:
hdfs dfsadmin -safemode leave
数据在集群中复制的次数。您可以设置在两个或更多节点上复制所有数据。不要输入高于实际工作节点数的值。我用 1 是因为我的一个笔记本用的是 16GB 的 micro SD。由于新冠肺炎病毒爆发,我的一些部分在邮件中延迟了。如果配置错误,由于缺乏资源,您的 spark 应用程序将陷入“已接受”状态。
/opt/Hadoop/etc/Hadoop/mapred-site . XML
/opt/Hadoop/etc/Hadoop/yarn-site . XML
创建两个文件:
/opt/Hadoop/etc/Hadoop/workers
更新所有节点上的配置文件后,需要格式化数据空间并启动集群(可以从任何节点启动):
$ hdfs namenode -format -force$ start-dfs.sh
$ start-yarn.sh
3.4 配置火花
基本上,您需要创建/编辑以下配置文件:
/opt/spark/conf/spark-defaults . conf
这些值可以根据您的硬件进行调整,但它们将适用于 Raspberry Pi 4 4GB。
将环境变量设置为:
*/opt/spark/conf/*spark-env . sh
在所有节点中安装以下软件包,以便允许节点处理用 python/pyspark 准备的作业:
sudo apt intall python3 python-is-python3
3.5 测试集群
重新启动所有节点,并重新启动服务:
$ start-dfs.sh
$ start-yarn.sh
您可以发送一个应用示例来测试 spark:
$ spark-submit --deploy-mode client --class org.apache.spark.examples.SparkPi /opt/spark/examples/jars/spark-examples_2.12-3.0.0.jar
在处理结束时,您应该会收到 PI 值的近似计算结果:
**Pi is roughly 3.140555702778514**
(这个圆周率计算需要改进!!!!)
3.6 面向 Hadoop 和 Yarn 的 Web 应用
Hadoop webUi
最初,我无法在线处理(上传/删除)文件。以下网址提供了一种解决方法:
当我试图上传文件到 HDFS,它显示“错误:未定义”。然而,从终端我可以成功上传文件…
community.cloudera.com](https://community.cloudera.com/t5/Support-Questions/unable-to-upload-files-to-hdfs/td-p/33650)
该解决方法是通过向 Hadoopcore-site . XML添加以下属性来实现的:
Yarn WebUi
然后
[## 数据科学/大数据实验室——第 3 部分(共 4 部分): 3 节点集群中 Ubuntu 上的 Hive 和 Postgres
使用 Hadoop、Spark、Hive、Kafka 在 Raspberry Pi 4 或 VMs 集群中组建数据科学/大数据实验室…
towardsdatascience.com](/assembling-a-personal-data-science-big-data-laboratory-in-a-raspberry-pi-4-or-vms-cluster-8a1da8d49b48)
[1] P. G .塔兰蒂。https://github.com/ptaranti/RaspberryPiCluster
[2]华生。构建 Raspberry Pi Hadoop / Spark 集群 (2019)
[3]梁伟雄。从零开始构建 Raspberry Pi Hadoop/Spark 集群 (2019)
[4]霍巴特。如何安装和设置 3 节点 Hadoop 集群 (2019)
数据科学/大数据实验室—第 1 部分,共 4 部分:Raspberry Pi 或 VMs 集群—操作系统和通信
实验室数据
使用 Hadoop、Spark、Hive、Kafka、Zookeeper 和 PostgreSQL 在 Raspberry Pi 4 或 VMs 集群中组建数据科学/大数据实验室
这段文字可以用来支持在任何 Ubuntu 20.04 服务器集群中的安装,这就是设计良好的分层软件的妙处。此外,如果您有更多的节点,您可以随意分发软件。本文假设您知道 Linux 命令行,包括 ssh、vim 和 nano。
我不建议从少于三个树莓开始,因为你需要设置通信,并且 Zookeeper 和 Kafka 都需要奇数个节点。如果您尝试使用单个节点,可以使用本指南。尽管如此,性能可能会令人失望——对于单节点,我建议虚拟机具有合理数量的 RAM 和处理器。
由于篇幅原因,我不得不将教程分成四部分
- 第一部分:简介、操作系统和联网
- 第二部分:Hadoop 与 Spark
- 第三部分:PostgreSQL 和 Hive
- 第四部分:卡夫卡、动物园管理员和结论
*所有配置文件均可在【1】:*获得
[## ptaranti/RaspberryPiCluster
Hadoop+Spark+Hive+Kafka+Postgresql 集群(ubuntu 20.04)的配置文件
github.com](https://github.com/ptaranti/RaspberryPiCluster)
免责声明 : 此文免费提供给大家使用,风险自担。我小心地引用了我所有的资料来源,但是如果你觉得遗漏了什么,请给我发个短信。由于不同的软件版本可能会因其依赖性而表现出不同的行为,我建议使用我在第一次尝试中使用的相同版本。
1.介绍
培训或学习数据科学或商业智能通常是一项孤独的任务。你可以去读 MBA 或者在网上诅咒,但是巩固知识需要实践和尝试。
对于某些技术来说,这很简单。Python 和 R 可以很容易的安装在一般的电脑上。然而,一个完整的实验需要集成几个工具,从数据采集到报告/可视化。
这些工具…我能说什么呢…我不喜欢不理解我正在使用的工具。我是一个 1987 年和 12yo 一起学习 Basic 语言的老家伙。我用 Z80 从磁带播放器加载程序,在 90 年代,我管理 Novell networks,在 Minix 之后几年才使用 Linux 不,我不是博物馆馆长。我学了 Fortran,Pascal,C,Java…现在又学了 R 和 Python。我想在接近真实的环境中训练管道和分析——这让我回到了工具上。我觉得不仅需要有训练的环境,还需要真正了解这个环境。
关于环境,我说的是 Apache 支持的解决方案(和一些朋友):Hadoop,Spark,Hive,Postgres,Kafka 等等,安装在一个集群上。在你的桌面上,你很可能使用 Anaconda 和 Rstudio(抱歉 Anaconda,但我更喜欢单机 Rstudio)。
这是我梦寐以求的实验室,我去了。
大数据环境需要现实世界中的分布式解决方案,可扩展性是首要要求。因此,学习如何配置环境对我来说很重要。我没有选择基于云的解决方案——我想要完全的控制,对“个人实验室”没有任何限制。
首先,我已经在我的笔记本上安装了完整的解决方案,使用了三台虚拟机(在 VirtualBox 上安装了 Ubuntu 20.04)。它工作了,但是有一些缺点——性能和网络。最糟糕的是——我把我的笔记本电脑从家搬到工作的地方,在那里使用这种“虚拟网络”是不可接受的。
当我决定尝试 Raspberry 时,我打算为我的实验室购买一个强大的工作站来虚拟化集群。新的 Raspberry Pi 4 最高可配 4GB 内存。这不是一辆法拉利,但我只需要一辆小型车就能拥有范并完成工作。我读了一些关于如何用 Raspberry 组装集群的文本,用于 Hadoop + Spark 解决方案——他们用 PI 3 取得了成功。
然后我决定用三个树莓派组装自己的集群。
我对结果很满意;它起作用了,它的性能允许我进行实验。我会向学生推荐这个。
2.组装集群
第一部分将引导您组装物理集群,安装 Ubuntu server 20.04,并为集群设置环境
2.1 你需要什么?
3 个或更多覆盆子 Pi 4 4GB
1 个千兆交换机(10/100/1000)
用于给 Pi 供电的 USB-C 电缆
你的覆盆子的微型 SD 卡
网络用以太网电缆
电源(我使用带 3 个 USB 3A 端口的充电器)
集群的丙烯酸底座
集群装载 1
集群装载 2
2.1.1 关于材料的一些说明:
树莓 Pi 4 有 wifi 和千兆以太网。我选择了使用千兆交换机的有线网络进行集群通信。我还使用无线网络进行远程访问。因此,您应该使用 cat 6 电缆。
因为想玩数据,所以买了 128GB 的 SD 卡。然而,其中一张卡没有交付,我开始为第二个覆盆子(节点 pi2)使用 16GB 的卡,它工作了。购买高读写速度的优质 SD 卡对集群性能至关重要。树莓有一些扩展板,可以让你使用 2.5 HD,SSD SATA 或 NVME。我没有安装它,但你可以很容易地安装一个 NAS 或数据存储区。
我花了很多时间配置集群,发现问题和归零几乎花了三周时间。我不是一个寻求让别人遭受同样痛苦的虐待狂,所以我决定出版这个指南,希望你喜欢。
我用了这些优秀的指南作为参考,重点在第[2,3,4]:
[## 构建 Raspberry Pi Hadoop / Spark 集群
专业提示:如果您只是在寻找如何配置 Hadoop 和 Spark 在集群上运行,请从这里开始。动机和…
开发到](https://dev.to/awwsmm/building-a-raspberry-pi-hadoop-spark-cluster-8b2) [## 从头开始构建 Raspberry Pi Hadoop/Spark 集群
本文将带领您从头开始使用 Raspberry Pi 构建 Hadoop 集群的漫长过程。
medium.com](https://medium.com/analytics-vidhya/build-raspberry-pi-hadoop-spark-cluster-from-scratch-c2fa056138e0) [## 使用 Raspberry Pi 构建 Hadoop 集群——IBM 开发人员食谱
简介 Hadoop 潜力巨大,是最知名的大数据项目之一。在本教程中,我们将…
developer.ibm.com](https://developer.ibm.com/recipes/tutorials/building-a-hadoop-cluster-with-raspberry-pi/)
然而,即使按照教程,我发现了许多问题和陷阱。有些问题可能与不同的软件版本有关。
为了在阅读本文时帮助您,也为了在我需要重新安装时帮助我自己,我将所有的配置文件保存在一个与 raspberries 中存在的文件夹结构相似的文件夹结构中——小心使用(IP、服务器名称等可能会因您而异)。所有文件都是最终版本,有 Hadoop、Hive、Zookeeper、Kafka 的分布式版本(Spark 和 Postgres 安装在单节点)。
2.2 安装操作系统
首先,您应该在集群支持中组装物理设备,而不是 SD 卡。不要急于从桌子上摆满零件开始;这样容易短路,你会丢失你的素材。
我的笔记本运行 Windows 10——我没有忘记黑暗面(Linux)——我有一些 Linux 虚拟机可供选择和使用。但是我在描述教程的时候会参考 Windows 支持软件。如果你是一个只懂 Linux 的极客,我相信你知道如何用你的工具完成工作(在 Linux 中通常更容易)。
2.2.1 下载并安装 Raspberry Pi 成像仪
使用 Ubuntu 服务器创建微型 SD 卡的最佳工具是 Raspberry Pi Imager [5]。该工具适用于 Windows、Ubuntu 和 Mac,可从以下网站下载:
Raspberry Pi OS(以前称为 Raspbian)是我们所有型号的 Raspberry Pi 的官方操作系统。使用…
www.raspberrypi.org](https://www.raspberrypi.org/downloads/)
此实用程序将刻录原始版本的初始操作系统。
建议:我尝试使用廉价的 microSD 转 SD 适配器,通常与笔记本 SD 插槽中的 micro SD 卡一起提供。速度非常慢,我换了一个 micro-SD 转 USB 适配器,用在 USB 3.0 端口。好多了。
Raspberry Pi 4 有 AMR64 架构——之前的版本是 AMR32。因此,任何 Linux 32/64 都可以很好地安装。在我的第一次尝试中,我使用了 Raspbian(只有 32 位版本),但我在 Hadoop 安装上遇到了问题。之后我决定用 Ubuntu 64bit 版本(Ubuntu 推荐 Pi 4)。
插入您的 SD,启动 Raspberry Pi Imager 并格式化它(我总是在安装任何操作系统之前格式化)。安装 Ubuntu server 20.04 64 位。对你所有的 PI Micro SD 卡做同样的事情。
Ubuntu 20.04 服务器是最小版本,设置为通过 DHCP 连接以太网。
注意—如果您在将 micro SD 卡安装到 Raspberry 之前将其重新插入笔记本电脑读卡器,您将可以访问安装配置文件。理论上,你可以设置你的初始用户和网络配置。网络配置文件遵循 yaml 文件的网络计划标准。然而,我试了几次,都不能正常工作,于是我决定像往常一样,通过 ssh 连接或者使用键盘和显示器。
注意——Ubuntu 安装了 vim 和 nano 编辑器。我已经习惯了 vim,但是颜色的高亮模式使得阅读变得困难——即使戴着眼镜!我用了纳米。快捷方式显示在 nano 界面的底部。
连接到网络
这是一个集群——网络至关重要。本教程假设您有一个带路由器/网关的家庭网络。
您需要访问操作系统来配置您的网络。你可以通过两种不同的方式来实现:更简单的一种是购买一个从 micro-HDMI 到 HDMI 的适配器,有线键盘,然后逐一插入你的覆盆子。您可以使用初始用户名/密码直接访问。
默认用户/密码是 ubuntu/ubuntu,首次登录时会要求您更改密码。我把密码改成了“覆盆子”。这是一个实验,避免在集群中使用真实密码。
最初连接树莓的第二种方法是依靠您的 DHCP 并连接有线网络(以太网)上的 Pi,同样是一个接一个。
当访问您的路由器管理页面时,您将可以访问连接的设备,树莓将显示为“ubuntu”。记下远程连接的 IP 地址。
因为我的有线键盘没有准时到达,所以我用宋承宪做到了。一次只启动一个 Raspberry,配置它的网络、主机名、主机和用户,然后关闭它。这将有助于识别 ssh 初始连接的动态 IP。
当您给 Pi 4 加电时,您会看到 micro SD 附近的红色和绿色 led 闪烁。红色 led 表示电源,绿色表示它正在访问您的辅助内存(micro SD)。
我的所有 Pi 都有相同的用户/密码和文件位置配置。这使得管理集群变得更加容易。
2.2.3 第一项任务是建立您的网络。
就像我之前写的,我决定设置以太网和 wifi。我这样做是因为我的集群没有直接链接到我的路由器。我有一个 wifi 网络扩展器,TP-Link RE200,它提供一个以太网端口 10/100,但提供 2.4GHz + 5.0GHz 的无线传输。因此,我的解决方案是让千兆交换机仅用于集群内通信和我使用 wifi 的远程访问。无论如何,我将扩展器(RE200)的以太网连接到交换机,以确保到集群的第二条路由—以防万一。
Ubuntu server 20.04 使用 netplan 进行网络配置。作为一份简历,你制作一个格式良好的文本文件,并要求系统解析和处理/etc/netplan 文件夹中带有 yaml 后缀的文件。然后,Netplan 会相应地更改您的网络设置。
重要—缩进必须有 4 个空格。在意识到这一点之前,我在编辑时很挣扎。
您将找到以下要编辑的文件:
/etc/net plan/50-cloud-init . YAML
我很懒,只编辑了它,但是你可以通过改变它的后缀来避免 netplan 读取它并创建一个新的。
注意——在一些安装中与我的 Pi 失去连接后,这迫使我重新安装系统(我没有 USB 键盘),我选择首先配置 wifi 并重新启动。在确保 wifi 正常后,我将以太网从 DHCP 改为静态 IP。
您可以复制我的文件并进行相应的编辑:
/etc/net plan 50-cloud-init . YAML
编辑文件后,您需要确认更改:
ubuntu@ubuntu:/etc/netplan$ sudo netplan apply
您需要使该文件适应您的环境。通常,您只需决定集群的 IP,更改路由器 IP(网关)并配置 wifi(名称和密码)。我有 2 个 wifi 网络(2.4G + 5G)。
为了让我的生活更轻松,我保持简单:
Hostname IP (Ethernet) IP(wifi)
pi1 192.168.1.11 192.162.1.21
pi2 192.168.1.12 192.162.1.22
pi3 192.168.1.13 192.162.1.23
注意—确保从路由器可用于 DHCP 连接的范围中删除您选择的范围。
一旦有了稳定的网络连接,就可以开始真正的配置了。请记住,集群使用网络连接,树莓之间的访问权限必须正常,否则您的分布式服务将会失败。
我的集群架构如图所示:
2.3 创建您的用户
您将在所有节点中创建相同的用户,使用 sudo 访问:
注意—不要使用低级的 useradd 命令!
sudo adduser pi
sudo passwd pi
New password:
Retype new password:
passwd: password updated successfullysudo usermod -aG sudo pi
sudo usermod -aG admin pi
usermod 命令确保sudo 访问。
作为 pi 登录,并更新您的系统!
sudo apt update
sudo apt upgrade
你会发现安装 net-tools 包很有用!它附带了 netstat ,我们将使用它来检查节点中的活动服务(端口):
sudo apt-get install net-tools
2.4 远程桌面访问
我安装了一个带有网络浏览器(chromium)和远程桌面访问(xrdp)的轻量级图形界面(xfce4)。然而,这不是真的需要,我正在考虑删除它。但是如果你是一个 GUI 爱好者,你可能会喜欢它:
为了启用远程桌面访问,您需要:
安装 xfce4 和 xrdp:
Sudo apt-get install xfce4
sudo apt-get install xrdp
并创建文件
创建文件 /home/pi/。x 会话
echo xfce4-session > /home/pi/.xsession
并编辑该文件
sudo nano /etc/xrdp/startwm.sh
在最后一行之后增加以下内容:
startxfce4
重新启动服务:
sudo service xrdp restart
xcfe4 网页浏览器坏了。我安装了铬合金:
sudo apt-get install chromium-browser
以防万一,安装 extFat 支持(这可能有助于笔驱动程序):
sudo apt install exfat-fuse
重新启动后,您应该能够使用远程桌面从任何 windows 机器远程连接。
2.5 配置主机名和主机
您需要更新主机名以及/etc 中的主机文件。参见 GitHub 中的例子。
注意—从主机文件中删除对本地主机 127.0.01 的引用。
关于主机名,我建议您使用 pi1、pi2、pi3、… piX。这是因为我所有的配置文件都考虑这些主机名。否则,您将需要非常小心地编辑它。
2.6 安装 Java
这是一个致命的弱点:
Hadoop 经过编译,在 Java8 上运行良好。我已经寻找过了,但是我没有找到来自 Java Hotspot 8 或 Oracle Java 8 的 AMR64 架构版本。经过一些实验后,我决定支持 OpenJDK8,它已经在 Ubuntu 仓库中可用,并且维护得很好(我希望如此)。
您可以在[6]中找到关于 Hadoop 和 Java 支持的信息:
[## 阿帕奇软件基金会
Apache Hadoop 3.x 现在只支持 Java 8 Apache Hadoop 从 2.7.x 到 2.x 支持 Java 7 和 8 Java 11 支持现在…
cwiki.apache.org](https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions)
要安装 java:
sudo apt-get install openjdk-8-jdk
这是我的版本:
pi@p2:~$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1ubuntu1-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
2.7 配置 SSH
编辑文件(参见 GitHub):
为 ssh 创建快捷方式
为所有群集节点中的用户 pi 生成公钥/私钥对:
命令和输出,您应该期望:
pi@pi1:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/pi/.ssh/id_rsa
Your public key has been saved in /home/pi/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:mKDvp5u/AsK5CxUUYdkFNSM+rSI4S4aQJR7Wd1AcPZU pi@pi1
The key's randomart image is:
+---[RSA 3072]----+
|.oB=o=Ooo ... |
|o*oo.+ = o E |
|o.. = o . |
|+ o + o |
|*o= . o S |
|+B.o |
|o.... |
|.. .... |
| .. =*o. |
将公钥复制到授权密钥列表:
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
并复制到所有节点:
cat ~/.ssh/id_rsa.pub | ssh pi2 'cat >> .ssh/authorized_keys'
cat ~/.ssh/id_rsa.pub | ssh pi3 'cat >> .ssh/authorized_keys'
注意—您应该在每个群集节点中执行此过程。最后,所有节点的列表中都会有所有的公钥。这一点很重要——没有密钥会阻止以后的机器间通信。
注意——作为一个例子,我在 GitHub 中包含了我的 ssh/authorized_keys 。显然,你不能使用它,因为它不会工作。你需要做你的钥匙圈。
基于密码的身份验证
参考教程建议禁用基于密码的身份验证,主要是因为安全问题。我决定不采纳他们的建议,因为我想使用传统的基于密码的访问来轻松访问节点。
如果您想探索这个选项,请查看本文开头引用的前两个教程。如果你想探索这个选项,请查看本文开头提到的两个教程。
2.8 管理集群的脚本
通过在以下文件中添加以下内容,创建函数来帮助您进行集群管理:
运行命令:
source /home/pi/.bashrc
您必须在所有节点中执行此操作。如果您愿意,可以使用 scp 在节点之间复制。如果使用 WinSCP 远程访问,您将能够复制和粘贴——但是在命令行中使用 scp 更快,您应该学会这样做。
注意—原始教程没有 clustercmd-sudo 。我把它包括进来,因为我试验了需要超级用户访问的命令问题。
注意—这些函数假设节点的主机名是 pi1、pi2、pi3、pi4…,并且所有节点都有一个用户/密码 pi/pi。这些假设也是在 Hadoop/Spark/Zookeeper/Kafka/Postgres 配置下做出的。如果您选择了不同的名称,那么您需要仔细检查每一行。
2.9 时间同步
通常,我用 UTC 时间服务器同步我所有的机器。在集群中,这一点更加重要。
pi@p2:~$ clustercmd date
Fri May 29 21:09:59 UTC 2020
Fri May 29 21:09:57 UTC 2020
Fri May 29 21:10:02 UTC 2020
好吧,我作弊了。我的集群已经同步了,我插入了时差编辑。但是你的集群可能有差异。
运行以下命令:
clustercmd-sudo apt install htpdate -yclustercmd-sudo htpdate -a -l [www.pool.ntp.org](http://www.pool.ntp.org)
后一个命令使用 htpdate 将节点时钟与www.pool.ntp.org 同步。
然后
[## 数据科学/大数据实验室—第 2 部分,共 4 部分:3 节点集群中的 Hadoop 和 Spark over Ubuntu
使用 Hadoop、Spark、Hive、Kafka 在 Raspberry Pi 4 或 VMs 集群中组建数据科学/大数据实验室…
towardsdatascience.com](/assembling-a-personal-data-science-big-data-laboratory-in-a-raspberry-pi-4-or-vms-cluster-e4c5a0473025)
[1] P. G .塔兰蒂。https://github.com/ptaranti/RaspberryPiCluster
[2]华生。构建一个 Raspberry Pi Hadoop / Spark 集群 (2019)
[3]梁伟雄。从零开始构建 Raspberry Pi Hadoop/Spark 集群 (2019)
[4]弗杜戈。使用 Raspberry Pi 构建 Hadoop 集群:使用单板计算机安装、配置和测试分布式存储和处理集群 (2017)
[5] G .霍林沃思。介绍 Raspberry Pi 成像仪,我们的新型成像工具 (2020)
[6] A. Ajisaka。 Hadoop Java 版本 (2020)
R 语言中的断言编程
您的代码应该按预期工作,否则会立即失败
您可能熟悉使用 testthat 包的单元测试。单元测试的目标是检查你的功能是否被正确开发。断言检查你的函数是否被正确使用。
单元测试是为开发人员准备的,并根据命令执行。
断言是针对用户的,并且在每次函数调用时执行。
照片由 chuttersnap 在 Unsplash 上拍摄
快速失败
运行时测试,通常称为断言,是一小段代码,用于检查条件,如果条件不满足,测试就会失败。断言使你的代码能够快速失败——这是一件好事。当某个东西出错时,我们不希望我们的程序继续运行,直到错误复合并暴露出来。相反,我们希望程序在错误的源头立即失败,并给出清晰准确的错误消息。
本文的目标是让你的 R 函数快速失效。假设你的函数没有错误或者副作用,错误进入你的函数的唯一途径就是通过它的输入。在本文中,您将学习如何使用断言来识别不良输入并警告用户(包括未来的您)。
输入有两种不好的方式:
- 功能输入包含错误。R 发现了一些错误:从不可能或丢失的值到十进制数中逗号和点的不一致使用。其他错误更加隐蔽。想想无效的信用卡号或不存在的邮政编码和糟糕的电子邮件格式。
- 你在开发你的功能时考虑了一个特殊的用例。你无法想象用户试图使用你的代码的所有方式。他或她可能以技术上正确的输入使用你的功能,但不是以预期的方式。你试过用
sort.list(list(2, 1, 3))
排序列表吗?
为什么 R 包“自信”
r 有几个用于编写断言的包。这篇文章提倡 R 包自信有三个原因:
- 该软件包为许多不同的情况提供了大量的功能
- 它的功能非常容易阅读
assert_all_are_positive(c(1, -2, 3))
3.并提供信息丰富的错误消息
Error: is_positive : c(1, -2, 3) contains non-positive values.
There was 1 failure:
Position Value Cause
1 2 -2 too low
直接从起重机安装软件包,并将其加载到您的 R 会话中:
install.packages("assertive")
library(assertive)
写你的第一个断言
假设您编写了一个对数值向量的元素求和的函数:
add_numbers <- function(numbers) {
result <- sum(numbers)
return(result)
}
向量的值可以是任何数字。让我们在函数的开头写一个断言来检查我们的输入向量:
add_numbers <- function(numbers) {
**assert_is_numeric(numbers)**
result <- sum(numbers)
return(result)
}add_numbers(c(1, 2, 2, 3)) # pass
注意断言是写在函数内部的*。这意味着它总是在那里,等待每次调用函数时被执行。检查一个断言只需要几毫秒的时间,这对于除了对性能要求最高的应用程序之外的所有应用程序来说都没问题。*
检查多个条件
假设您修改了函数,期望得到一个唯一的值的向量。现在你需要两个断言:
- 一个用于检查向量是否为数字
- 另一个检查向量没有重复值
您可以通过用来自magritter包的转发管道 %>%
链接两个或更多断言来保持代码的可读性:
library(magrittr)add_unique_numbers <- function(input_vector) {
**input_vector %>%
assert_is_numeric %>%
assert_has_no_duplicates** result <- sum(input_vector)
return(result)
}add_unique_numbers(c(1.5, 2, 2, 3)) # fail
有很多断言函数,适用于各种情况。全部背下来不太实际。只需在 CRAN 上搜索包文档就能找到适合你特定需求的功能。
让我们用一个练习来试试这个。下面的函数需要百分比值的向量,例如percentages <- c(64, 55, 97, 85)
,并计算平均百分比。你能在 assertive 包中找到合适的断言吗?
calculate_mean_percentage <- function(percentages) {
**# ... your assertion goes here** result <- mean(percentages)
return(result)
}
提示:在你的 R 控制台中编写 ls("package:assertive", pattern = "percent")
来搜索 assertive 中名称与“百分比”匹配的函数。
断言和谓词
您可能会在这里看到一种模式。所有断言都由三部分组成:
- 他们总是以
assert_
开头 - 后跟谓语
is_
或has_
- 并以期望结束,例如
numeric
当检查对象的单个元素而不是对象本身时,谓词is_
在中变为all_are_
或any_are_
。例如,下面的断言检查传递给函数的所有数字是否都是整数:
add_whole_numbers <- function(whole_numbers) {
**assert_all_are_whole_numbers(whole_numbers)**
result <- sum(whole_numbers)
return(result)
}add_unique_numbers(c(1.5, 2, 2, 3)) # fail
除了核对数字
到目前为止,我们只处理了数字。但是断言包包含了各种情况下的断言。为了说明这一点,我们将用一些检查文本、日期甚至主机操作系统的例子来结束我们的讨论。
- 你的函数需要一个人名向量吗?
检查缺失或空字符串:
assert_all_are_non_missing_nor_empty_character()
- 有一个只在 Windows 上工作的功能?然后确保用户正在运行 Windows:
assert_is_windows()
- 你的函数期望一个人的出生日期吗?
确定事情已经过去:
assert_is_in_past()
结论
在本文中,您学习了如何使用 assertive 包编写断言。多亏了断言,你的函数将做它们应该做的事情,或者快速失败,并给出一个清晰的错误消息。
参考文献
棉花理查德。(2017).*测试 R 代码(第一版)。*查普曼&霍尔。
亨特安德鲁。托马斯戴夫。(1999).《实用程序员》(第 25 版,2010 年 2 月)。爱迪生韦斯利朗曼公司。
用程序生成的游戏评估奖励学习中的概括(2/2)
奖励学习中的泛化
在 OpenAI Procgen 基准游戏上实现 T-REX 奖励学习算法
作者:安东·马基耶夫斯基,周亮,马克斯·奇西克
注:这是 第二个两个 博文(部分 一个 )。在这些帖子中,我们描述了一个项目,该项目旨在评估奖励学习代理的概括能力。这个项目的实现是 GitHub 上可用的。
在第一篇文章中,我们回顾了一些基本的背景材料,并描述了我们项目的灵感和目标。在此过程中,我们讨论了一些作为我们实验出发点的论文。
****我们的实现基于 T-REX【Brown and Goo et al . 2019】。我们选择它是因为它的简单设置,以及作者提供的开源实现,这将节省我们大量的时间。根据这篇论文,该算法在 Atari 游戏上显示了强大的结果,因此我们想评估这些结果在 Procgen 环境中的表现如何,在 proc gen 环境中,级别将随机生成,因此无法记忆。
我们在四个 Procgen 游戏环境中运行了 T-REX 算法:CoinRun、FruitBot、StarPilot 和 BigFish。简单回顾一下:该算法应该学会在不访问游戏分数的情况下玩好游戏。游戏目标必须从所提供的一组分级演示和奖励模型的结果预测中仅推断出。****
这些是我们实现的算法步骤:
奖励学习算法步骤(图片由作者提供)
创建我们的演示数据集
为了训练任何东西,我们需要一个数据集。对于 T-REX,数据集由来自环境的分级演示组成。他们有多少人?在 T-REX 的论文中,作者仅用 12 个排名演示就能够在 Atari 上获得良好的结果。然而,我们怀疑我们将需要更多,因为我们相信 Procgen 环境可能会因为固有的随机等级而更难学习。
无论哪种方式,我们都需要从我们想要测试的四个 Procgen 环境中产生不同质量的演示。为此,我们可以自己玩游戏,也可以在这些环境中训练强化学习代理,利用实际环境本身提供的真正回报。
我们选择了后者;与手动方法相比,拥有训练有素的代理可以让我们以快几百倍的速度生成演示。当奖励学习的目的是在没有得到信息的情况下学习时,为什么使用真正的奖励是“合法”的?在训练期间,算法只能访问演示,而不能访问演示获得的奖励。
幸运的是,Procgen 的论文附带了代码,我们可以使用这些代码来训练许多代理人达到不同程度的性能。即使有这样的速度,每次生成“新鲜的”演示仍然需要在每次实验开始时等待几分钟。这将大大降低我们迭代和改进代码的效率,因此我们决定在运行任何实验之前生成所有的演示——每个环境数千个演示,并根据获得的总回报对它们进行排序
通过这种方式,我们为任何环境、任何质量、任何长度的演示创建了一个健壮的源,无论何时我们想要它们。
我们的第一个奖励模型
现在我们有了演示数据集,是时候用霸王龙的程序来训练我们的第一个奖励模型了。
为了评估奖励模型的质量,我们可以使用强化学习算法来训练代理,并评估代理的表现,但这在计算上是昂贵的。因此,我们寻找一个临时指标,通过它我们可以检验我们的训练的奖励模型与真实的奖励模型有多接近。我们决定使用一个简单的衡量标准,即相关系数。对于奖励模型来说,这个临时指标可能是一个不太可靠的衡量标准。然而,引入这一指标将每次实验花费的时间减少了大约 5 倍,使我们能够获得更多的数据点来评估算法。然后,我们将选择最佳回报模型,并对其运行 RL 算法,而不是必须对所有模型运行 RL 算法。
我们的目标是在训练奖励模型和真实环境奖励模型之间的环境事件上具有高相关性,这意味着训练奖励模型类似于真实(目标)模型。对于我们选择的四个环境中的每一个,我们都进行了测试,改变了提供给 T-REX 的演示次数。我们测量了奖励模型预测的游戏总奖励与游戏中收集的实际奖励之间的相关性。
看看我们的第一个结果:
在 Procgen 游戏中,不同演示次数的真实奖励和预测奖励之间的相关性(图片由作者提供)
x 轴是实验中使用的演示次数,y 轴是相关系数。我们用橙色和蓝色线条向展示了两种不同类型的相关性。图中的每个大点代表每批演示中 5 次不同运行的平均结果,由较小的点代表。
我们从该图中得出三个主要观察结果:
- 除了 CoinRun 之外,所有游戏的相关性看起来都很强。
- 这种相关性随着演示次数的增加而增加。正如我们所猜测的,在更复杂的 Procgen 环境中,12 个演示是不够的。从 100 到 200 个演示,相关性相当稳定和高。
- 当我们进行到 100 到 200 个演示时,运行的方差显著降低。我们看到,随着演示数量的增加,代表运行的小点越来越靠近。
我们的下一步是使用我们的奖励模型在 Procgen 上训练强化学习代理,该模型显示了最高的相关性,而不是来自环境的真实奖励。这是我们得到的信息:
根据我们的一个奖励模型(图片由作者提供)在星际飞行员中训练 RL 特工
根据我们的一个奖励模型(图片由作者提供)训练 FruitBot 中的 RL 代理
有点不对劲
剪辑通常看起来很好,但有些东西是关闭的。如果你看看 FruitBot,你会发现尽管我们训练有素的代理已经学会了不要撞墙,但它还没有学会如何避免非水果物品,这些物品共同构成了游戏对象的一半。回想一下,游戏中的任务是生存,同时尽可能多吃水果,避免所有其他食物。理想的代理应该是这样的:
最佳水果机器人代理使用 RL 训练游戏环境的真实奖励(图片由作者提供)
我们推测,我们训练有素的特工主要是在学习如何在中生存,也就是说,尽可能长时间地保持这一集(优化所谓的“长寿”目标)。生存直接导致奖励的环境的一个例子是掷竿子(在之前的博客文章中显示),代理人每阻止一根竿子倒下一秒钟就获得+1 的奖励。在 FruitBot 中,到达最后一关会得到一大笔奖励,所以也许代理人已经知道了这一点的重要性,但不知道避开非水果的重要性。**
不过,在下结论之前,我们想做一些进一步的测试。我们意识到,这个“长期存在”的目标非常有意义,可以用作比较我们一般奖励模型的基线——换句话说,在 Procgen 环境中训练的好的奖励模型应该比简单的奖励模型做得更好,简单的奖励模型为代理活着的每个时间步长返回+1 奖励,就像在 CartPole 中一样。通过使用这样的基线,我们将对此进行测试。所以我们做了一些对比。
下面我们展示了与上面相同的相关图,但是现在有了实时基线(用红色虚线表示),显示我们的回报模型通常表现稍差或接近基线,即使有 100 和 200 次演示!CoinRun 是一个例外,因为基线本身的相关性很差。
**在 Procgen 游戏中,不同数量的演示的真实和预测奖励之间的奖励相关性具有长期基线。所有游戏中使用两种相关类型的基线大致相同,所以我们用一条平均线来代表它们。(图片作者提供)
虽然学习奖励模型和真实奖励模型之间超过 75%的相关性看起来相当强,但高寿命基线相关性是令人担忧的,因为它们表明可能有一个实际上与环境无关的高度相关的奖励模型!
怎么办?
深度强化学习很棘手。正如我们在上一节中看到的,看起来令人鼓舞的结果在仔细观察后可能并不那么好。我们把精力集中在 FruitBot 上,这是问题最突出的地方,我们观察了真实的和预测的奖励在各个情节中是如何变化的:
使用单一奖励模型在 6 个不同的 FruitBot 等级中的真实与预测累积奖励(图片由作者提供)
每张图显示了一个代理在不同级别中的真实(绿色)和预测(橙色)回报。x 轴是该集的时间步长,y 轴是到该时间步长为止获得的累积奖励。在 FruitBot 中,如果一集达到 420 个时间步,该集将自动结束,代理人将获得一大笔奖励(由结尾附近的绿色尖峰指示)。理想情况下,绿色和橙色的线看起来非常相似,因为习得的奖励应该与环境的真实奖励相似。
不幸的是,他们不是。事实上,除了接近尾声时的峰值之外,预测的和真实的回报似乎彼此毫无关联。这是怎么回事?
我们在代码中寻找错误,并尝试了几种方法来改进我们的奖励模型。在不涉及太多细节的情况下,我们尝试了标准的可靠方法来“按摩”我们的训练程序,包括诸如提前停止和正规化等元素,以及改变奖励模型的神经网络架构。
然而,这些变化似乎没有产生任何显著的差异,如这些更新的图表所示:
在尝试改进我们的训练程序以创建更好的奖励模型后,使用单一奖励模型在 6 个不同的水果机器人级别中比较真实和预测的累积奖励(图片由作者提供)
接下来,我们决定简化实际任务。如果代理可以在简化版本中学习,那么我们将逐渐增加任务的难度,以找出是哪些特定元素导致了问题。我们知道 Brown 等人的论文中的算法在 Atari 游戏上只有 12 个演示,并试图在 Procgen 中使任务至少一样简单。
首先,我们将修改 Procgen,使游戏关卡按照固定顺序进行,而不是随机顺序。这就是雅达利游戏的工作方式,这使得代理人更容易学习。
此外,我们将远远不止使用 12 次演示,而是在 T-REX 算法中使用 150 次演示来提供更多的学习数据。这应该会导致更精确的奖励模型。然而,即使在这些修改之后,水果机器人的奖励模式还是不令人满意。
在通过更多演示和连续关卡简化我们的训练程序后,使用单一奖励模型,在 6 个不同的 FruitBot 关卡中的真实与预测累积奖励(图片由作者提供)
在这一点上,我们确信我们做错了一些的事情,因为看起来我们修改后的任务至少和褐皮书中的任务一样简单,在褐皮书中 T-REX 算法训练了成功的代理。**
回到源头
在即使在简化的环境下也无法产生好的奖励模型之后,我们决定更仔细地研究最初的实现和作者报告的结果,以准确地指出我们的分歧所在。因为作者最初编写算法是为了在 Atari 上工作,所以我们无法进行直接比较。然而,我们可以看看他们提供的奖励模型与我们之前建立的长期基线相比如何。因此,我们从雅达利游戏《太空入侵者》中选取了一个经过霸王龙训练的奖励模型,并检查了它的预测奖励与环境给出的真实奖励之间的比较:**
雅达利游戏《太空入侵者》中真实与预测的累积奖励为了了解这个情节在最初的 T-REX 文件实现中是如何表现的(图片由作者提供)
红线应该看起来像绿线,但它们非常不同,就像我们在早期的水果机器人游戏中看到的那样。看起来代理人正在学习一个恒定的正奖励,类似于长期基线。
经过进一步的研究,我们注意到,在论文作者提供的实现中,原始 T-REX 算法的输出是通过 sigmoid 函数传递的,该函数将预测的奖励值限制在 0 到 1 之间。
s 形函数图( 来源 )
我们怀疑这将使奖励模型偏向终生方法,因为给予小的、持续的积极奖励是容易的。
我们联系了丹尼尔·布朗,T-REX 论文的主要作者,讨论这些问题,他非常积极地回答我们的问题,并帮助我们排除可能的问题。事实证明,他自己也考虑过这个问题,甚至在他后来的一篇论文中进行了相关实验——他用霸王龙奖励模型和长期目标训练了代理人,并报告了他们的表现对比。根据报告的结果,T-REX 算法实际上产生了一个有意义的模型,其表现优于基线。
我们决定自己进行相应的实验。正如我们之前提到的,由于计算限制,我们无法运行我们想要的那么多“完整”测试,所以我们只在最简单的(顺序)模式下为 FruitBot 环境运行了实验。
训练有素的代理人在 FruitBot 中获得的平均总奖励,带有红色长期基线的连续等级(图片由作者提供)
如你所见,在我们的实验中,我们找不到比那些在长期客观基线上训练过的人表现更好的代理人。公平地说,对于 T-REX 算法来说,水果机器人是一个艰难的游戏,在其他游戏中,我们有时会得到超越基线的代理,但很少如此。
我们不是经验丰富的深度强化学习研究人员,我们的结论可能是错误的,但对我们来说,T-REX 算法似乎以相当小的幅度击败了基线。我们计划看看如果我们引入 Procgen 水平的随机性,这种差异会如何变化,并且考虑到我们开始时与基线的接近程度,这种差异将很难发现。
包扎
经过相当长时间的讨论,我们决定最好从 T-REX 开始,尝试另一种奖励学习算法。毕竟,我们项目的最初灵感并不是霸王龙独有的——我们想从总体上研究奖励学习算法。我们最初选择霸王龙是因为它似乎最容易实现,也最容易操作;然而,回想起来,尝试使用更成熟的奖励学习方法可能会更好,特别是因为我们将该算法应用于更困难的设置。最值得注意的是,这表明实施了 Christiano 等人 2017 年的代码(在 post one 中讨论过),该代码通常被认为是一项重要的结果,有助于启动奖励学习在深度强化学习中的使用。
尽管 GitHub 上有这篇文章中的算法实现,但是没有一个能够很容易地集成到我们的项目中。因此,最简单的前进方式是从头开始重新实现。
反射
最初,我们感兴趣的是解决测量奖励学习代理概括能力的问题。我们认为这是一个重要的问题,因为为了让一个智能体实际部署在现实世界中,它需要能够在看不见的情况下稳健地机动。以前的泛化测试仅限于标准的强化学习算法,我们希望通过应用相同的工具(如 Procgen)来奖励学习,从而帮助弥合这一差距。
简而言之,我们发现我们所学的回报函数相当脆弱。在许多不同的 Procgen 环境和许多不同的参数设置下训练了许多奖励学习代理之后,我们无法获得可用于进一步稳健地训练新代理的奖励函数。我们对神经网络架构进行了实验,但这很困难,因为除了直觉之外,几乎没有指导我们探索的原则。我们尝试了一些经典的改变——增加卷积层,改变滤波器大小,改变损失函数来预测多个步骤等。—并获得了中等的结果,有时比我们已经有的要好,但没有我们希望的那么好。
与任何深度学习项目一样,网络性能可能会受到架构或训练程序的精确变化的影响。尽管我们试图尽可能好地复制 T-REX 论文中发现的方法,但总有一些参数设置会产生良好的奖励函数,这是可行的。
外卖食品
虽然我们的项目不幸没有带来有趣的结果,但我们获得了宝贵的经验和重要的教训,其中一些我们想分享:
- 写下你在整个项目中的进展和计划——写下你的想法可以理清你的思路。如果我们仔细考虑接下来的实验,我们会节省很多时间。尽快落地很有诱惑力,但实际上,它并不像看起来那样富有成效。
- 从既定的算法开始。重要的是获得有效的结果,然后优化实施!
- 尽早建立基线——我们已经听了无数次了,但是仍然没有像我们应该做的那样早。我们本可以更早发现主要问题。
- 不要羞于向别人寻求帮助(如果你已经完成了你的工作)。我们并不建议给人们发电子邮件来询问你可以在几分钟内搜索到的问题。但是如果你的研究是基于某篇论文,并且取得了有趣的进展,或者对之前报道的结果有一致的担忧,你当然应该尝试联系作者。在项目过程中,我们与许多导师和其他与我们项目相关的研究人员进行了交流,包括丹尼尔·布朗、简·雷科和亚当·格里夫等人。我们通过人工智能安全营被介绍给他们中的一些人,但我们也只是简单地给其他人发邮件。他们都非常友好,对我们的问题给予了周到而详细的回答。我们非常感谢他们的帮助。
这总结了我们的旅程,它的结果和经验教训。我们希望每一个有抱负的研究人员都有机会体验我们在这个项目中所做的一切,我们非常感谢让这一切成为可能的人们。
用程序生成的游戏评估奖励学习中的概括(1/2)
奖励学习中的泛化
强化学习、概括和奖励学习概述
作者:安东·马基耶夫斯基、周亮、马克斯·奇西克
注:这是 第一篇两篇 的博文(部分 两篇 )。在这些帖子中,我们描述了一个项目,该项目旨在评估奖励学习代理的概括能力。这个项目的实现是 GitHub 上可用的。
这第一篇文章将提供强化学习、奖励学习和概括的背景,并总结我们项目的主要目标和灵感。如果你有必要的技术背景,可以跳过前几节。
关于我们
我们是参加 2020 人工智能安全营 (AISC)的团队,这是一个早期职业研究人员就人工智能安全相关的研究提案进行合作的计划。简而言之,AI 安全是一个旨在确保随着 AI 的不断发展,它不会伤害人类的领域。
鉴于我们团队在人工智能技术安全和强化学习方面的共同兴趣,我们很高兴能在这个项目上合作。这个想法最初是由另一位 AISC 参与者 Sam Clarke 提出的,我们在夏令营期间与他进行了富有成效的交谈。
强化学习
在强化学习(RL)中,一个主体以获得奖励为目标与一个环境进行交互。最终,代理想要学习一种策略,以便随着时间的推移获得最大的回报。不过,首先要做的是:代理人到底是什么,报酬是什么?一个智能体是一个通过采取行动与某个世界互动的角色,也称为环境 、。例如,代理可以是玩视频游戏的角色、自动驾驶汽车模拟中的汽车或扑克游戏中的玩家。奖励只是代表代理人目标的数字,不管代理人的遭遇是否更好。例如,捡起一枚硬币可能给予积极的奖励,而被敌人击中则给予消极的奖励。
在 RL 中,状态代表环境中当前情况的一切。然而,代理实际上能看到的是一个观察。例如,在扑克游戏中,观察可能是代理自己的牌和对手以前的动作,而状态还包括对手的牌和一副牌中的牌的顺序(即代理看不到的东西)。在一些像象棋这样没有隐藏信息的环境中,状态和观察是一样的。
给定观察结果,代理采取动作。每次行动后,代理将从环境中获得以下形式的反馈:
- ****奖励:标量值,可以是正、零、负
- ****新观察:从先前的状态采取动作的结果,这将代理移动到新的状态并产生这个新观察。(此外,新状态是否为“终止”,意味着当前交互是已结束还是仍在进行中。比如完成一个关卡或者被对手吃掉会终止很多游戏。)
在 RL 中,我们的目标是通过使用奖励作为反馈来训练代理真正擅长一项任务。通过许多可能的训练算法之一,代理逐渐学习一种策略(也称为策略),该策略定义了代理在任何状态下应该采取什么行动来最大化回报。目标是在整个情节中最大化奖励,这是一个代理从交互开始到结束状态所经历的一系列状态。
巨大成功的代理人被训练成在诸如 Atari 和 Go 游戏中有超人的表现。
强化学习过程(图片由作者提供)
以视频游戏 Mario 为例,让我们看看一个示例算法是如何工作的。假设马里奥右边有一个敌人,左边有一个蘑菇,上面什么都没有(见下图)。在这三个行动选项中,如果向左,他可能得到+2 的奖励,如果向右,他可能得到-10 的奖励,如果向上,他可能得到 0 的奖励。马里奥采取行动后,他将处于一个新的状态,有新的观察,并根据他的行动获得奖励。然后就是下一个动作的时候了,过程继续。回想一下,目的是最大化整个情节的回报,在这种情况下,这是从游戏开始到马里奥一生中的一系列状态。
马里奥学习吃蘑菇(图片由作者提供)
算法第一次看到这种情况时,它可能会随机选择一个选项,因为它还不了解可用操作的后果。随着它越来越多地看到这种情况,它会从经验中了解到,在像这些情况下,向右走不好,向上走可以,向左走最好。我们不会直接教狗如何捡球,但通过给予奖励,狗会通过强化来学习。同样,马里奥的行动也因经验反馈而得到加强,即蘑菇是好的,而敌人不是。
算法是如何实现回报最大化的?不同的 RL 算法以不同的方式工作,但人们可能会跟踪从这个位置采取每个动作的结果,并且下次 Mario 在这个相同的位置时,他会根据先前的结果选择预期最有回报的动作。许多算法大多数时候选择最佳行动,但有时也会随机选择,以确保它们探索所有选项。(注意,在开始时,代理通常随机行动,因为它还没有了解任何关于环境的信息。)
重要的是要不断探索所有的选择,以确保代理不会找到合适的东西,然后永远坚持下去,可能会忽略更好的选择。在马里奥游戏中,如果马里奥第一次试着向右走,看到它是-10,然后试着向上走,看到它是 0,从那一点开始总是向上走就不好了。这将错过尚未探索的左转+2 奖励。
想象一下,你试着在家做饭,但不喜欢食物,然后去麦当劳吃了一顿美妙的饭。你发现去麦当劳是一个很好的“行动”,但如果你一直在麦当劳吃饭,而不去尝试其他可能最终会提供更好“回报”的餐厅,那将是一种耻辱(而且对健康没有好处)。
一般化
**RL 经常用在像雅达利这样的游戏设定中。在 Atari 游戏(类似于马里奥风格的游戏)中使用 RL 的一个问题是这些游戏的序列性质。赢得一关后,你进入下一关,并继续以同样的顺序通过关卡。**算法可能只是简单地记住每一关发生的事情,然后在面对游戏中最微小的变化时悲惨地失败。这意味着算法可能实际上并不理解游戏,而是学习记忆一系列按钮,从而为特定级别带来高额奖励。一个更好的算法,而不是学习记忆一系列按钮按压,能够“理解”游戏的结构,从而能够适应看不见的情况,或者说概括。
成功的概括意味着在以前没有见过的情况下表现出色。如果你知道 22 = 4,23 = 6,24 = 8,然后可以算出 26 = 12,这意味着你能够“理解”乘法,而不仅仅是记住等式。
雅达利突破(来源)
让我们看一个在垃圾邮件过滤器环境中的一般化例子。这些方法通常通过收集那些将收件箱中的邮件标记为垃圾邮件的用户的数据来工作。如果一群人将“用这一招每天赚 800 美元”的邮件标记为垃圾邮件,那么该算法将在未来学习阻止所有电子邮件用户的所有这些邮件。但是,如果垃圾邮件发送者注意到他的电子邮件被阻止,并决定智取过滤器呢?第二天,他可能会发送一条新消息,“用这另一个技巧每天赚 900 美元”。仅记忆的算法将无法捕捉到这一点,因为它只是记忆要阻止的确切消息,而不是学习一般的垃圾邮件。概括算法将学习模式,并有效地理解垃圾邮件的构成。
奖励学习
游戏通常有非常明确的内置奖励。在像二十一点这样的纸牌游戏中,奖励对应于代理每手牌赢或输的多少。在 雅达利中,奖励依赖于游戏,但有明确的规定,比如击败敌人或完成关卡可以获得积分,被击中或死亡可以失去积分。
下图来自一个名为 CartPole 的经典强化学习环境,目标是让杆子在轨道上保持直立,杆子保持直立的每一秒提供+1 的奖励。代理人将车向左或向右移动,试图保持杆子平衡,保持平衡的时间越长,获得的+1 奖励就越多。
扁担(来源)
****然而,现实世界中的许多任务并没有如此明确定义的奖励,这导致了强化学习的可能应用受到限制。这个问题因这样一个事实而变得更加复杂:即使不是不可能,也很难详细说明明确定义的奖励。人类可以在训练期间向 RL 代理提供直接反馈,但是这将需要太多的人类时间。
一种被称为逆向强化学习的方法包括从演示中“逆向工程”出一个奖励函数。对于复杂的任务,从演示中找出奖励函数是很难做好的。
*****奖励学习*涉及学习奖励函数,该函数描述了在环境中的每种情况下获得多少奖励,即当前状态和动作到所接收奖励的映射。目标是学习鼓励期望行为的奖励功能。为了训练算法来学习奖励函数,我们需要另一个数据源,例如成功执行任务的演示。奖励函数输出每个状态的奖励预测,之后标准 RL 算法可用于通过简单地用这些近似奖励代替通常已知的奖励来学习策略。
用奖励函数代替已知奖励的强化学习过程(图片由作者提供)
**先前的工作(下文描述为 Christiano 等人 2017 年)提供了一个例子,说明学习奖励函数有多困难。想象一下教一个机器人做后空翻。如果你不是一个认真的体操运动员,自己演示如何成功完成这项任务将是一个挑战。**人们可以尝试设计一个代理可以学习的奖励函数,但是这种方法经常成为非理想奖励设计和奖励黑客攻击的牺牲品。打赏黑客是指代理商可以在打赏规范中找到“漏洞”。例如,如果我们给后空翻正确的初始姿势分配了太多的奖励,那么代理人可能会学会永远重复地进入那个弯腰姿势。它会根据我们给它的奖励函数最大化奖励,但实际上不会做我们想要做的!
人类可以通过在每一步人工输入奖励函数来监督代理学习的每一步,但这将非常耗时和乏味。
指定奖励的困难指向了更大的人-人工智能协调问题,即人类希望人工智能系统符合他们的意图和价值观,但指定我们实际上想要的东西可能会令人惊讶地困难(回想一下每个精灵故事的结局!).
相关文件
我们想看看最近的几种奖励学习算法,以评估它们学习奖励的能力。我们特别感兴趣的是,当面对以前看不见的环境或游戏关卡时,算法有多成功,这测试了它们的概括能力。
为此,我们利用了大量先前的工作:
- 基于人类偏好的深度强化学习—Christiano 等人 2017。
- 奖励从人类偏好中学习,在雅达利 — 2018 由 Ibarz 等人提出。
- 利用过程化生成对强化学习进行基准测试—Cobbe 等人 2019。
- 从 Brown,Goo 等人的观察值 — 2019,通过逆向强化学习外推超过次优演示。
前两篇论文在利用奖励学习和深度强化学习方面很有影响力,第三篇介绍了 OpenAI Procgen 基准测试,这是一组用于测试算法泛化的有用游戏。第四篇论文提出了前两篇论文方法的有效替代方案。
从人类偏好进行深度强化学习(Christiano 等人,2017 年)
这篇文章的中心思想是识别一个好的后空翻比做一个好的后空翻要容易得多。该论文表明,对于我们只能识别出想要的行为的任务,即使我们无法演示,也可以学习预测的奖励函数。
提议的算法如下所示。它在通过人类偏好学习奖励函数和学习策略之间交替,这两者最初都是随机的。
重复直到代理牛逼:
1。展示两个简短的视频剪辑,展示代理在其当前策略的环境中行动
2。问一个人在哪个视频片段中代理更好
3。根据人类的反馈更新奖励函数
4。基于新的奖励函数更新策略
模拟机器人(如下图所示)被训练在一小时内完成 900 个查询的后空翻,这是一项很难演示或手动创建奖励的任务。
根据人类喜好训练后空翻动作(来源
实验在名为 MuJoCo 的物理模拟器和 Atari 游戏中进行。既然我们已经知道雅达利游戏的真正回报,为什么还要在雅达利进行这些实验呢?这提供了自动分配偏好的机会,而不是让人手动给出关于两个视频剪辑演示的反馈。我们可以通过简单地将具有更高真实奖励的剪辑排列为更好的剪辑来获得自动(合成)反馈。这使我们能够非常快速地进行实验,因为不需要人工。此外,在这种情况下,我们可以通过比较学习到的奖励函数和游戏中给出的真实奖励来评估算法的性能。
运动中的后空翻(来源
奖励从人类偏好和 Atari 演示中学习(Ibarz 等人,2018 年)
本文建立在前一篇论文的基础上,在 Atari 域中使用不同的设置和不同的 RL 算法进行了额外的实验。他们的主要创新是在开始时利用人类演示,以便开始一个体面的策略,而原始算法将不得不从一个完全随机行动的代理开始,因为在开始时不知道奖励。相对于 Christiano 使用的无演示方法,这些人类演示的加入在九个测试的雅达利游戏中的三个中显著提高了学习。
利用程序生成对强化学习进行基准测试(Cobbe 等人,2019 年)
人工智能研究实验室 OpenAI 开发了名为 Procgen Benchmark 的强化学习测试床游戏环境,其中包括 16 款独特的游戏。在每个游戏中,所有关卡都是相似的,有着相同的目标,但是实际的组成部分,如敌人和危险的位置是随机生成的,因此在每个关卡中会有所不同。
这意味着我们可以在许多随机水平上训练我们的代理,然后在全新的水平上测试它**,允许我们了解代理是否能够概括它的学习。请注意与雅达利游戏的对比,在雅达利游戏中,训练是在连续的游戏级别上进行的,敌人、奖励和游戏对象总是在同一个地方。此外,当在连续的和非随机生成的游戏中测试代理的能力时,它们以相同的顺序在相同的水平上被测试。一个重要的机器学习原理是,用一组数据训练,用另一组数据测试,真正评估智能体的学习/概括能力。**
我们在工作中主要考察了 Procgen 的四种环境:
- 躲避敌人的同时,在关卡结束时收集硬币
- 水果机器人:吃水果,避免非水果食物,如鸡蛋和冰淇淋
- ****星际飞行员:侧面滚动射击游戏
- ****大鱼:从小鱼开始,吃其他更小的鱼,变得更大
下面是每个游戏的截图。代理视图使用较低的分辨率来优化算法,以减少计算量。人类视角是指如果人类在玩游戏,游戏会是什么样子。
带有代理视图的 CoinRun、FruitBot、StarPilot 和 BigFish(图片由作者提供)
人类视角的 CoinRun、FruitBot、StarPilot 和 BigFish(图片由作者提供)
论文中的主要实验涉及在所有 16 个独特的游戏中训练代理,每个游戏的训练水平在 100 到 100,000 的范围内,同时保持训练时间固定。然后,这些代理在他们从未玩过的关卡上接受测试(这是可能的,因为每个关卡都是自动生成的)。他们发现,代理人需要在多达 10,000 个游戏级别(培训级别)上接受培训,才能在测试级别上表现良好。
下面的 StarPilot 游戏图用蓝色显示训练性能,用红色显示测试性能。y 轴是奖励,x 轴是用于训练的等级数。请注意,x 轴是对数刻度。
星际飞行员训练(蓝色)和测试(红色)(来源
我们看到代理在培训期间表现非常好,然后培训绩效下降,然后又略有回升。为什么代理训练得越多越差?由于训练时间是固定的,通过只训练 100 个级别,代理将一遍又一遍地重复相同的级别,并且可以很容易地记住所有内容(但是在测试时在看不见的级别上表现很差)。有了 1,000 个级别,代理将不得不将其时间分散到更多的级别,因此也无法学习这些级别。当我们达到 10,000 或更多的级别时,代理能够看到如此多样的级别,它能够很好地执行,因为它已经开始概括它的理解。我们还看到,测试性能很快提高到接近训练性能的水平,这表明代理能够很好地概括到看不见的水平。
通过从观察中进行逆向强化学习来推断次优演示之外的情况(Brown,Goo 等人,2019 年)
本文提出的算法名为 T-REX ,与之前提到的奖励学习方法不同,它在学习过程中不需要持续的人类反馈。虽然与监督每个代理动作相比,其他算法需要相对较少的人工时间,但它们仍然需要一个人来回答数千个偏好查询。T-REX 的一个关键思想是,通过在开始时完成所有偏好反馈,而不是在整个学习过程中持续完成,可以显著减少人类的时间投入。
第一步是生成正在学习的游戏或任务的演示。演示可以来自标准的强化学习代理,也可以来自人。
主要的想法是,我们可以通过从这些演示中提取短视频剪辑来获得大量偏好数据,并仅根据它们来自的演示的排名来给它们分配偏好。例如,有 20 个演示,每个演示将得到从 1 到 20 的等级。大量的短视频剪辑将从这些演示中选取,每个剪辑将被分配给它所来自的演示的等级,因此当它们面对彼此时,偏好将会转到来自更好的演示的剪辑。奖励函数将基于这些偏好。
这与以前的方法形成对比,以前的方法需要对每一对 1-2 秒的剪辑输入人类偏好。这里,我们只需要人类偏好输入来对初始演示进行排序。然而,霸王龙的缺点是它使用了一个近似值。并非来自较高等级的演示的所有剪辑都应该比来自较低等级的演示的剪辑更优选,但是该想法是平均而言,偏好将会很好地工作,并且该过程将足以学习奖励模型。
提供对演示的排序相当于在每一对演示之间给出偏好。例如,如果我们有三个演示,并将它们排序为 3>1>2,这意味着我们将生成 3>1、3>2 和 1>2 的排序。则根据剪辑来自哪个演示,从演示中随机生成的剪辑将被给予相同的偏好等级。
霸王龙的论文表明,只要有 12 次示范就足以学习一个有用的奖励模型。任何 12 个对象都有 12 * 11 / 2 = 66 个不同的对,因此从 1 到 12 对 12 个演示进行排名相当于回答多达 66 个关于哪个演示更好的查询,这比 Christiano 等人的算法所需的查询少约 100 倍。同样,尽管 T-REX 排名演示方法更有效,但由于简化了较好演示的所有剪辑都比较差演示的所有剪辑好的假设,它牺牲了精确度。
Brown 和 Goo 等人基于 Atari 的实验表明,霸王龙与之前描述的 Ibarz 等人的方法相比具有竞争力。它能够仅使用 12 个示范及其相应的偏好(等级)标签来学习优于示范的质量代理。
下图显示了五款 Atari 游戏中人类演示的得分与 T-REX 算法的得分之间的比较。虽然在蒙特祖马的复仇游戏中没有获得任何分数,但霸王龙的表现远远超过了人类 5 分中的 3 分。
霸王龙算法对人类(来源
T-REX 还在 8 场比赛中的 7 场比赛中超过了最先进的行为克隆算法(BCO)和模仿学习算法(盖尔),如下图所示,同时在 8 场比赛中的 7 场比赛中击败了最佳演示。(行为克隆算法试图尽可能接近演示,而反向强化学习算法试图从专家演示中恢复奖励函数。)
T-REX 算法与其他先进方法的对比(来源)
接下来:实现和实验
基于 T-REX 的强大结果和简单的想法,我们决定将我们的初始实验基于将该算法与 Procgen 游戏环境相结合,这将为我们提供一个高效的奖励学习算法和各种基准游戏来测试泛化能力。我们将在本系列的第二篇博文中解释我们实现的细节以及实验结果和我们面临的问题。