抓取新加坡米其林星级餐厅名单
今天,我想通过提取新加坡米其林星级餐厅的名称、地址、星级和菜肴类型来练习网络抓取,以了解其地理位置和菜肴类型分布。
没有一个网站能同时包含这两种信息,所以我找到了一个包含地址的新闻网站和包含 T2 美食种类的米其林官方网站。我使用了 selectorgadget 和 rvest 来收集数据,做了一些清理工作,因为一些地址在帧中用不同的 CSS ids 进行了编码,而且菜肴类型包括英语和汉语单词。
然后我使用 BatchGeo 通过地址查找地理编码,这相当准确,也方便地提供了地图,只是它是否在输出中提供纬度/经度数据并不明显。
click for interactive version
它们似乎主要集中在 3 个集群周围:
- 从丹戎巴葛一直到市政厅(市中心)
- 位于果园/植物园区域(购物/旅游区)
- 3 在圣淘沙,1 星(Osia)/2 星(L’Atelier de Joel Robuchon)/3 星(Joel Robuchon)(旅游/富裕住宅区)各一个
Click for interactive version
下一步,我们可以模糊匹配来自两个来源的餐馆名称(不同的拼写)以获得菜肴类型,按照地理区域对它们进行分组,并确定到不同住宅区的距离。
看看菜肴类型,当代和创新的食物是一件大事。法国菜和广东菜分别在西方和本地食物排行榜上名列前茅。今年有两家小贩/街头小吃被评为一星级。
cuisine types by star rating
这是我关于数据科学和视觉故事的# 100 日项目的第 57 天。报废数据可以在这里找到。感谢阅读。欢迎新主题的建议和反馈。
刮痧和模型和游戏,天啊!
(Beautiful) Soup of the Day
注意:这不是一个高科技博客。然而,如果你是一个对这种事情感兴趣的男人或女人,这里是我的 GitHub 上这个项目的代码 !
完全披露:我累坏了。今天早上我在 Metis 展示了我的第一个重要的个人项目。这是一个为期两周的项目,巧合的是,这是我两周内的第一篇博文。我认为这其中可能存在一种有意义的关联——称之为有抱负的数据科学家的直觉吧。
不管怎样,这个项目完成了,我的报告结束了,冷的那份被打开了。因此,我在这里记录下我最后几周的神秘启蒙之旅和技术能力。
Data trumps features trumps algorithms… one of the main morals of this fable
在这个项目中,我们可以自由支配。唯一的方向是:
- 通过网络搜集搜集某种类型的数据集
- 使用线性回归预测你搜集的数据中的某种目标变量
我知道“乞讨”有负面含义。那是因为我选择从MobyGames.com收集数据。对于那些不熟悉的人来说,莫比游戏是“最古老、最大、最准确的视频游戏数据库”… 根据莫比游戏的说法。我有疑问。
我的目标(我试图预测的变量)是综合评价分数。特征(用于产生预测的变量)是每个游戏的特征,例如:ESRB 等级、流派、游戏风格、发布日期、控制台等。
注意:有技术倾向的人可能会注意到这些特征都是绝对的。哦天啊。
我喜欢刮数据。然后我讨厌它。然后我又喜欢上了它。这样的循环重复了几次,我却降落在了爱的一边(awww)。使用 BeautifulSoup,我写了几个刮刀。一个抓取了一个主游戏列表并收集了所有游戏的 URL,另一个实际上从这些页面中抓取了数据。
单个页面刮刀需要多次更换。因此,爱恨循环。尽管莫比游戏公司提出了很高的要求,但这些页面是不一致的,包含不同的字段,并且一般来说不能很好地使用通用的页面抓取器。然而,我克服了这个巨大的困难,写了一个对所有 8000 页都有效的 scraper。
That blank look on the whale’s face should have been a red flag
所以刮刮太棒了!我手里拿着一个数据框。一个包含所有现代家用游戏机游戏数据的数据框架——至少我是这么认为的。
不要误会我的意思:我的确成功地获取了莫比奥运会的所有数据,但对我来说不幸的是,只有 250 个条目包含了我的目标变量:综合评论家得分。
所以我减少到一个 250 行的数据集。虽然没有 8000 英镑好,但至少也算不错了。当然,一旦我开始清理数据,我发现在那些包含评论家分数的 250 款游戏中,其中大约有 160 款有一套很好的功能没有任何 NaNs 不是一个数字’——也就是莫比游戏中另一个缺失的值)。
当我进行实际的线性回归时,我正在处理一个非常小的数据集。哦,我所有的特征都是绝对的。我尝试对各种特性的组合进行建模,但是由于要处理的观察数据如此之少,而特性又如此之多(一旦类别被分解到各自的列中),我只能对噪声进行建模。
这个故事的一个重要寓意是:当涉及到一堆分类变量时,线性回归并不好。
My pesudo-ordinal feature. Along with MPAA equivalents for those supposed ‘real adults’ out there who don’t know the ESRB scale.
这是我开始有创造力的时候。我没有数字特征作为输入,但这并不意味着我不能强制使用一个。如果你真的斜视,ESRB 评级可以被视为序数值。从适合孩子的到更成熟的,ESRB 组织对每个等级都设定了最低年龄。因此,我的“目标年龄”功能诞生了。
我的“万福玛利亚”特征工程起作用了…技术上。它确实给了我一个有一点点预测能力的模型。该模型采用游戏的目标年龄并预测评论家得分。
Can you even fathom the analytical beauty you see before you? The purple points are the actual data, the red line is the predicted scores from my model.
我的模型比 100 分制的随机猜测要好*,所以为我欢呼吧!(我在等谷歌招聘人员的电话)。平均而言,两个方向都只相差大约 9.7 点。印象深刻,对吧?*
嗯……没有。
我还建立了一个“虚拟模型”,不管游戏特征如何,它都能简单地猜出 77.5 分(平均值)。平均而言,该模型在任一方向上都偏离了 9.9 个百分点。不需要一个数据科学家就能看出 9.7 并不是一个巨大的进步,但它确实是一个进步。
由于数据如此不完整且充满了分类变量,要挤出任何预测值,需要极其不确定的特征工程辅助。我在数据收集和建模方面投入了大量的时间和精力,但最终,一切都回到了这篇博客条目顶部的白板寓意:
数据胜过特征胜过算法。
我可能没有造出世界上最好的模型,但我学到了从石头中吸取血液的重要一课。另外,构建过多无用的模型也无妨。它不仅给了我一些关于模型构建的很好的实践,而且给了我甚至更好的经验来评估糟糕的模型并确定它们实际上是糟糕的。
我们已经被介绍了项目 3,所以是时候开始了。我不是 100%确定我接下来会处理什么,但我知道一件事:
我将彻底检查我的下一个数据来源。
使用 Python 抓取哈维飓风洪水数据
正如数据科学中常说的那样,80%的工作是不那么迷人的数据获取和数据争论任务,剩下的 20%留给“性感”的分析和机器学习任务。通常,即使是这些数字也很慷慨——就我个人而言,我在这些乏味的数据争论任务上花费了过多的时间。如果你从事数据科学工作,你可能会感受到同样的痛苦。
在最近的一个项目中,我需要收集我的家乡德克萨斯州休斯顿的洪水数据,所以我建立了一个网络抓取器来从哈里斯县洪水预警系统获取数据。为了帮助缓解上面提到的一些乏味的数据科学困境,我在 Github 上为其他对洪水研究感兴趣的人发布了我的代码。您可以在下面的链接中找到该回购的链接。这篇文章的其余部分将展示几个使用代码的快速例子。
****** Github 洪水数据网页抓取器 ******
项目背景
当地县应急管理部门开发了 【哈里斯县洪水预警系统(FWS)】。
Stream Gage Locations on the Harris County Flood Warning System (FWS) Website
FWS 从美国地质调查局(USGS)维护的流量表中获取数据。虽然每个 stream gauge 网站都提供了以 Excel 文件形式下载数据的功能,但我需要更多的数据,所以我构建了一个 webs scraper。你可以从这个回购中克隆刮刀。
使用
T21【Scraper】克隆 repo 后,安装’ requirements.txt '文件中列出的需求。使用刮刀很简单:
Code snippet for querying stream gauge data from the FWS website
数据也可以下载到 JSON 文件中:
“高程”字段包含溪流底部上方水深的记录。“深度”字段是一个计算字段,记录了高出堤岸顶部的水的高度(TOB)。如果
水的深度高于 TOB,则‘above bank’键保存值‘True ’,否则为‘False’。有关更多详细信息,请参见自述文件。
{
"sensorMetaData": {
"sensorId": "519",
"sensorType": "USGS Radar",
"installedDate": "3/27/1984",
"topOfBankFt": 32.0
},
"sensorData": [
{
"timestamp": "8/26/2017 7:31 AM",
"elevation": {
"value": 21.69,
"units": "ft"
},
"depth": {
"value": 0,
"units": "ft"
},
"aboveBank": false
},
{
"timestamp": "8/27/2017 5:43 AM",
"elevation": {
"value": 39.49,
"units": "ft"
},
"depth": {
"value": 7.490000000000002,
"units": "ft"
},
"aboveBank": true
}
]
}
查询和绘图示例 下面是从 475 号流量计获取数据并绘制数据的一小段代码:
这就产生了下面的情节…
Plotting the data using matplotlib
…正如我们所料,这符合 FWS 的情节:
Data as shown at https://www.harriscountyfws.org
最后总结 希望这个刮刀对其他有抱负的洪水研究者有用。如果您在使用代码时有任何疑问或问题,请随时联系我们!
刮实际和预测工资
我最近参与的一个最有趣的项目涉及收集数据科学工作的工资信息,以便根据位置、职位和工作摘要来预测某些工作的工资。该项目是对一些新获得的数据科学技能的真正测试,如网络搜集、自然语言处理和建立分类预测模型。回归可以用于这样的任务,但由于工作工资存在相当大的差异,我将这视为一个分类问题,目标是预测工作工资是高于还是低于数据科学家的工资中位数。
这个问题的第一部分包括从 Indeed.com 上列出的招聘信息中收集数据,包括职位名称、公司、工作摘要、地点和薪水。这一部分是通过抓取大量不同的搜索页面来完成的。正如我在我的其他帖子中多次提到的,抓取是我最喜欢的,也可能是我最好的数据科学技能之一,所以在这一部分我有一点乐趣。首先,我创建了一个全国 30 个主要城市的列表,希望从中收集工作数据。然后,为了能够从一个网页上获得尽可能多的职位发布,我使用了 indeed 上的高级搜索功能来显示 50 个结果,但后来意识到我可以调整 url 来显示 100 个结果。
https://www.indeed.com/jobs?q=data+scientist&**l=Washington+DC**&**limit=50**&radius=25&**start=0**&pp=ADIAAAFbp-95iAAAAAEMMobjAQEBD3MzvjaRN_DEggu9hUHO3jOZTkJ2Z7SvcZJ1pEgnRjAhqUC21q96H2LZRAEACYLb_gg9TZj-Uiq9LmLnHRNRQqKGAQPQktPTwy4n4Swd39sFFyyDrS9wQYcfRpSo64YDtw
正如你在上面的 url 链接中看到的,为了让页面显示 100 个搜索结果,我只需将limit=50
改为limit=100
。然后,为了过滤搜索结果页面,我可以将start=0
改为start=100
、start=200
,一直到start=900
,以获得相应城市的 1000 个结果。然后,我可以通过简单地将 url 中的l=Washington+DC
更改为另一个城市名,比如l=Pittsburgh
,为列表中的所有 30 个城市做这件事。
为了做到这一点,我创建了一个 for 循环,它将遍历我的 30 个城市,然后遍历每个搜索页面,为每个城市收集多达 1000 个职位发布。数据收集过程中出现的第一个问题是,并不是所有的招聘信息都列出了薪水。为了解决这个问题,我创建了一个简单的 try/except 语句,如果没有列出薪水,就返回'NA'
。一旦我有了一个可用的 web 刮刀,我就在两三天的时间里运行刮刀几次,以便收集尽可能多的结果。然后我把我的结果放入熊猫的数据框架中,以便进行我的分析。因为我试图预测工资,所以我必须过滤我的结果,只包括列出工资的招聘信息,我决定只包括年薪。下一步是计算我的结果的中位数工资,结果是 110,000 美元,然后我为每份工作创建了一个二元变量——如果工资高于中位数,则为 1,如果工资低于中位数,则为 0。
继续建模!现在我有了一个清晰完整的数据框架——大约有 500 条记录,我可以用它来建立许多具有不同特征的分类模型,然后检查是什么因素导致一份工作成为“高薪”或“低薪”工作。我决定对模型使用随机森林分类,因为这是最准确的学习算法之一,而且它还会返回对分类中重要变量的估计,这对我们的分析尤其有价值。我特别感兴趣的特性是位置、职位和工作摘要。我分别为每个特征建立了分类模型。例如,我建立了一个模型,仅仅根据位置来预测一份工作是高薪还是低薪。对于职称和工作总结模型,我使用自然语言处理来根据出现的各种单词预测工资类别。
总的来说,我对结果相当满意。位置模型产生了大约 66%的准确性分数,这是三个模型中最不准确的。随机森林模型的要素重要性属性将为每个要素返回一个值,在本例中为每个城市,该值描述了该要素在模型预测过程中的重要性。我使用这个函数来查找最具预测能力的城市,并且我还将每个城市的工资中位数与我用于分析的总体工资中位数进行了比较。结果并不令人惊讶。我的模型显示,大市场和更昂贵的城市通常意味着更高的工资。这些城市包括纽约、圣何塞、旧金山、波士顿和费城。较小和较便宜的城市通常意味着较低的工资,如圣路易斯、密苏里州、佛罗里达州的珊瑚墙、宾夕法尼亚州的匹兹堡、德克萨斯州的休斯顿和德克萨斯州的奥斯汀。
职称和工作总结模型产生了更好的结果。为了稍微扩展一下模型构建过程,我首先使用了一个计数矢量器函数,该函数计算哪些词出现在了职位名称中,以及这些词出现的次数。这在所有职位上完成,以便为所有职位发布创建一个词频值矩阵。然后,我用这些字数建立了一个模型来预测一份工作是高薪还是低薪,这产生了一个强有力的模型,准确率约为 81%。根据该模型的结果,数据、科学家、工程师、学习、高级和机器等关键词通常与高薪工作相关,而研究和分析师等词通常与低薪工作相关。
使用相同的自然语言处理技术来构建工作总结模型。根据工作总结中出现的单词,最终的模型能够在大约 83%的情况下正确地确定一份工作是高薪还是低薪。机器、学习、数据、分析、工程和 python 等词通常与高薪工作相关,而健康、研究和大学等词通常与低薪工作相关。
为了构建一个更加复杂的模型,我将所有三个特性聚合到一个模型中。从本质上讲,这个模型会根据某个职位发布的位置、职位名称和职位摘要进行预测。虽然这并没有产生一个更准确的模型(大约 79%的准确率),但它确实表明,与工作地点相比,职称和工作总结更能预测一份工作的薪酬是高还是低。
那么这些信息为什么有用呢?作为雇主,我们的调查结果可以告诉我们,根据求职者被聘用的职位以及该职位所需的技能,他们可能值多少钱。例如,精通 python 技能的数据科学家可能比数据分析师的报酬更高。此外,如果一家公司希望扩大他们的数据科学团队,他们可能会考虑在数据科学家工资不高的地方进行,如密苏里州圣路易斯或德克萨斯州休斯顿。
在进行这样的分析时,肯定会有一个很大的假设。此问题假设 Indeed.com 上发布的数据科学家工资代表所有数据科学家的工资。这是一个不太安全的假设,因为大多数公司都不会在招聘信息中包含薪资信息。虽然这种假设可能会给我们一个数据科学家的工资中位数的不准确估计,但我们对某个工作是高薪还是低薪的预测仍然是有效的预测,这是可信的。
和往常一样,这里有一个我的 jupyter 笔记本的链接,以便更仔细地查看我的分析!
用 PRAW 刮红迪网
最近,我试图开始一个项目,该项目将使用自然语言处理来分类一个给定的帖子来自哪个子编辑。例如,这个模型应该能够预测一个帖子是否来自于 r/Python 子编辑或者 r/Rlanguage 子编辑。这个过程的第一步是从每个子编辑中收集一些帖子。在过去,我使用过 BeautifulSoup 和 requests python 库来完成这项工作。我的一些同事提到 API 包装器非常有用,可以简化大部分过程。这就是我如何偶然发现 Python Reddit API 包装器( PRAW )。
我发现的最有帮助的文章之一是 Felippe Rodrigues 的“如何用 Python 刮 Reddit”他在基本步骤和设置方面做得很好。如果你有兴趣做类似的事情,一定要去看看。我将这篇文章作为我自己项目的起点。下面我将带你了解如何使用 PRAW 进行设置,以及如何抓取文章标题、内容和其他元数据。你可以在我的个人 Github 上找到完整的代码。
开始使用 PRAW 的第一步是通过 reddit 创建一个应用程序。如果你转到这个链接,你应该会在底部找到一个标有“创建应用”或“创建另一个应用”的按钮你必须给你的脚本一个名字,并填写一个描述。一旦完成,确保选择“脚本”选项,然后确保将以下内容放入重定向 uri 框: http://localhost:8080 。这是由 PRAW 文档建议的,但显然是必要的,因为 Reddit 需要一个重定向 uri,即使我们的应用程序不使用它。如果成功的话,你会得到两串看似随机的字符。你可以在左上角找到第一个,你的“个人使用脚本”,就在“个人使用脚本”的正下方这个应该有 14 个字符长。接下来你需要的是“秘密”。虽然这听起来像是幻想小说中的东西,但它应该表示为一个 27 个字符的字符串,列在“个人使用脚本”的下面。有了这两样东西,我们终于可以开始从 Reddit 抓取帖子的旅程了!
现在,您需要打开您最喜欢的编辑器或 IDE。我用 PyCharm 做这个项目,但是 Atom 或者 Sublime 也可以。我们首先需要创建一个 praw.ini 文件。这将允许我们在未来利用 PRAW Reddit 实例,这意味着如果您决定发布它,我们可以将我们的个人使用脚本和秘密从我们的主要脚本中删除。
你可以参考关于 praw.ini 文件的文档,但是一定要确保这个文件确实叫做“praw.ini ”,并且它和你的抓取脚本位于同一个目录。可以在这个文件中定义多个凭证,但是今天我们将只使用一个凭证,所以我们将坚持使用[默认]站点。
[DEFAULT]
; this is your 14 character personal use script
client_id=51IfSlyxtyOUy3; this is your 27 character secret
client_secret=NToU1zG5d0LJq9fo3ryUtOigM5h; this is the name you gave your application
user_agent=subreddit scraper; this is username for the reddit account the app was created with
username=fake_username; password for the account
password=fake_password
请确保在这些字段中填写您的信息。上面的字段是使用随机生成的假值填写的。如果您不使用自己的信息替换这些字段,它将不起作用。
现在我们可以开始编写实际的抓取脚本了。第一步是导入必要的库,并使用我们在 praw.ini 文件中定义的凭证实例化 Reddit 实例。
from os.path import isfile
import praw
import pandas as pd
from time import sleep*# Get credentials from DEFAULT instance in praw.ini* reddit = praw.Reddit()
我决定创建一个类,允许我指定我感兴趣的特定子编辑、排序方法、文章数量以及结果是否应该写入文件。init 方法如下所示:
class SubredditScraper:
def __init__(self, sub, sort=**'new'**, lim=900, mode=**'w'**):
self.sub = sub
self.sort = sort
self.lim = lim
self.mode = mode print(
**f'SubredditScraper instance created with values '
f'sub = {sub}, sort = {sort}, lim = {lim}, mode = {mode}'**)
我加入了一些打印语句来感受一下脚本的进度,因为在处理数百个帖子时可能需要一点时间来运行。接下来,我们将为 subreddit 实例设置排序方法。
def set_sort(self):
if self.sort == **'new'**:
return self.sort, reddit.subreddit(self.sub).new(limit=self.lim)
elif self.sort == **'top'**:
return self.sort, reddit.subreddit(self.sub).top(limit=self.lim)
elif self.sort == **'hot'**:
return self.sort, reddit.subreddit(self.sub).hot(limit=self.lim)
else:
self.sort= **'hot'** print(**'Sort method was not recognized, defaulting to hot.'**)
return self.sort, reddit.subreddit(self.sub).hot(limit=self.lim)
这个方法将把 reddit 实例的 subreddit 和排序参数设置为我们在实例化我们的类时指定的值。这将返回一个元组,我们将在下一个方法中解包它。如果排序方法不是“新”、“前”或“热”,则默认为“热”。
最后,我们可以开始从指定的子编辑中收集帖子和其他信息:
def get_posts(self):
*"""Get unique posts from a specified subreddit."""* sub_dict = {
**'selftext'**: [], **'title'**: [], **'id'**: [], **'sorted_by'**: [],
**'num_comments'**: [], **'score'**: [], **'ups'**: [], **'downs'**: []}
csv = **f'{self.sub}_posts.csv'** *# Attempt to specify a sorting method.* sort, subreddit = self.set_sort()
*# Set csv_loaded to True if csv exists since you can't
# evaluate the truth value of a DataFrame.* df, csv_loaded = (pd.read_csv(csv), 1) if isfile(csv) else (**''**, 0)
print(**f'csv = {csv}'**)
print(**f'After set_sort(), sort = {sort} and sub = {self.sub}'**)
print(**f'csv_loaded = {csv_loaded}'**)
print(**f'Collecting information from r/{self.sub}.'**)
这里我们创建了一个占位符字典,其中包含了我们将从这个子编辑的每个帖子中收集的每个属性。那我们就要建立。csv 文件以备将来使用,我们正在对 set_sort 方法返回的元组进行解包。最后一项设置是查看我们之前是否为此子编辑收集过帖子。如果是这样,我们将加载它。csv 文件放入数据帧,并将布尔变量 csv_loaded 设置为 1。否则,df 将是一个空字符串,csv_loaded 将被设置为 0。
这给我们带来了真正的刮肉。我们将使用 for 循环来查看每篇文章,并收集我们感兴趣的属性。
for post in subreddit:
*# Check if post.id is in df and set to True if df is empty.
# This way new posts are still added to dictionary when df = ''* unique_id = post.id not in tuple(df.id) if csv_loaded else True
*# Save any unique posts to sub_dict.* if unique_id:
sub_dict[**'selftext'**].append(post.selftext)
sub_dict[**'title'**].append(post.title)
sub_dict[**'id'**].append(post.id)
sub_dict[**'sorted_by'**].append(sort)
sub_dict[**'num_comments'**].append(post.num_comments)
sub_dict[**'score'**].append(post.score)
sub_dict[**'ups'**].append(post.ups)
sub_dict[**'downs'**].append(post.downs)
sleep(0.1)
如果您计划多次使用这个脚本来收集大量的帖子,我们需要检查每个帖子是否是唯一的,或者我们是否已经将它添加到我们的。csv 文件。这就是我们的布尔变量 csv_loaded 派上用场的地方。我们将检查文章的 id 属性是否在数据框(df)的“id”列中。如果这是我们第一次为此子编辑收集帖子,那么 unique_id 将为每个帖子设置为 True。然后,我们将把我们感兴趣的文章的每个属性添加到占位符字典中。最后,也可能是最重要的,我们会在每次发布后睡十分之一秒。这是一种人为的限速器。如果我们不这样做,我们最终会达到 API 的请求限制(1000)。有几种方法可以绕过这个限制,其中之一是请求一个刷新令牌,但是这暂时应该可以正常工作。
接下来,我们将把结果保存到. csv 文件中,或者根据我们之前是否抓取过这个子编辑来修改现有的文件:
new_df = pd.DataFrame(sub_dict)
*# Add new_df to df if df exists then save it to a csv.* if **'DataFrame'** in str(type(df)) and self.mode == **'w'**:
pd.concat([df, new_df], axis=0, sort=0).to_csv(csv, index=False)
print(
**f'{len(new_df)} new posts collected and added to {csv}'**)
elif self.mode == **'w'**:
new_df.to_csv(csv, index=False)
print(**f'{len(new_df)} posts collected and saved to {csv}'**)
else:
print(
**f'{len(new_df)} posts were collected but they were not '
f'added to {csv} because mode was set to "{self.mode}"'**)
这里我们使用 pandas concat 方法,以便将我们的新结果添加到现有结果中。如果存在 csv 文件,并且在实例化我们的类时 mode 被设置为“w ”,那么我们将它加载到 df 数据帧中。如果没有现存的。我们将把结果写入这个子编辑的 csv 文件。如果模式没有设置为“w ”,我们将打印出找到的帖子数量,而不是将它们写入文件。
这就是我们完善 SubredditScraper 类所需的全部内容。剩下要做的最后一件事是实例化我们的新类。
if __name__ == **'__main__'**:
SubredditScraper(
**'python'**,
lim=997,
mode=**'w'**,
sort=**'new'**).get_posts()
如果你不熟悉if __name__ == '__main__':
的用法,我建议看看科里·斯查费的关于这个话题的视频这里。这样,您应该能够运行这个脚本,从 python subreddit 中收集近 1000 篇帖子,并将这些帖子及其一些元数据保存到一个. csv 文件中。我希望这有所帮助!别忘了你可以在这里找到这个项目的完整代码。
用于酒店评论的网页抓取猫途鹰、文本挖掘和情感分析
Phone credit: pexels
如何应用自然语言处理对酒店评论进行分类
一项又一项研究表明,猫途鹰在旅行者的决策过程中变得极其重要。然而,理解猫途鹰泡沫评分与数以千计的猫途鹰评论文本之间的细微差别可能具有挑战性。为了更彻底地了解酒店客人的评论是否会影响酒店的加班表现,我从猫途鹰搜集了一家酒店的所有英文评论——希尔顿夏威夷村。我不会讨论网页抓取的细节,这个过程的 Python 代码可以在这里找到。感谢 Furas 的提示。
加载库
library(dplyr)
library(readr)
library(lubridate)
library(ggplot2)
library(tidytext)
library(tidyverse)
library(stringr)
library(tidyr)
library(scales)
library(broom)
library(purrr)
library(widyr)
library(igraph)
library(ggraph)
library(SnowballC)
library(wordcloud)
library(reshape2)
theme_set(theme_minimal())
数据
df <- read_csv("Hilton_Hawaiian_Village_Waikiki_Beach_Resort-Honolulu_Oahu_Hawaii__en.csv")
df <- df[complete.cases(df), ]
df$review_date <- as.Date(df$review_date, format = "%d-%B-%y")dim(df); min(df$review_date); max(df$review_date)
Figure 1
希尔顿夏威夷村在猫途鹰上有 13,701 条英文评论,评论日期从 2002 年 3 月 21 日到 2018 年 8 月 2 日。
df %>%
count(Week = round_date(review_date, "week")) %>%
ggplot(aes(Week, n)) +
geom_line() +
ggtitle('The Number of Reviews Per Week')
Figure 2
2014 年底收到的每周评论数量最多。该酒店在那一周收到了 70 多条评论。
评论文本的文本挖掘
df <- tibble::rowid_to_column(df, "ID")
df <- df %>%
mutate(review_date = as.POSIXct(review_date, origin = "1970-01-01"),month = round_date(review_date, "month"))review_words <- df %>%
distinct(review_body, .keep_all = TRUE) %>%
unnest_tokens(word, review_body, drop = FALSE) %>%
distinct(ID, word, .keep_all = TRUE) %>%
anti_join(stop_words, by = "word") %>%
filter(str_detect(word, "[^\\d]")) %>%
group_by(word) %>%
mutate(word_total = n()) %>%
ungroup()word_counts <- review_words %>%
count(word, sort = TRUE)word_counts %>%
head(25) %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n)) +
geom_col(fill = "lightblue") +
scale_y_continuous(labels = comma_format()) +
coord_flip() +
labs(title = "Most common words in review text 2002 to date",
subtitle = "Among 13,701 reviews; stop words removed",
y = "# of uses")
Figure 3
我们肯定可以做得更好一点,把“留下来”和“留下来”,把“游泳池”和“游泳池”结合起来。所谓的词干化,词干化是将屈折词(或有时是派生词)简化为词干、词根或词根格式的过程。
word_counts %>%
head(25) %>%
mutate(word = wordStem(word)) %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n)) +
geom_col(fill = "lightblue") +
scale_y_continuous(labels = comma_format()) +
coord_flip() +
labs(title = "Most common words in review text 2002 to date",
subtitle = "Among 13,701 reviews; stop words removed and stemmed",
y = "# of uses")
Figure 4
二元模型
我们经常想了解一篇复习中单词之间的关系。评论文章中有哪些常见的单词序列?给定一个单词序列,接下来最有可能是哪个单词?哪些词之间的关系最强?因此,许多有趣的文本分析都是基于这些关系。当我们检查两个连续单词对时,这被称为“二元模型”。
那么,希尔顿夏威夷村对猫途鹰最常见的评论是什么呢?
review_bigrams <- df %>%
unnest_tokens(bigram, review_body, token = "ngrams", n = 2)bigrams_separated <- review_bigrams %>%
separate(bigram, c("word1", "word2"), sep = " ")bigrams_filtered <- bigrams_separated %>%
filter(!word1 %in% stop_words$word) %>%
filter(!word2 %in% stop_words$word)bigram_counts <- bigrams_filtered %>%
count(word1, word2, sort = TRUE)bigrams_united <- bigrams_filtered %>%
unite(bigram, word1, word2, sep = " ")bigrams_united %>%
count(bigram, sort = TRUE)
Figure 5
最常见的重名是“彩虹塔”,其次是“夏威夷村”。
我们可以想象单词网络中的二元模型:
review_subject <- df %>%
unnest_tokens(word, review_body) %>%
anti_join(stop_words)my_stopwords <- data_frame(word = c(as.character(1:10)))
review_subject <- review_subject %>%
anti_join(my_stopwords)title_word_pairs <- review_subject %>%
pairwise_count(word, ID, sort = TRUE, upper = FALSE)set.seed(1234)
title_word_pairs %>%
filter(n >= 1000) %>%
graph_from_data_frame() %>%
ggraph(layout = "fr") +
geom_edge_link(aes(edge_alpha = n, edge_width = n), edge_colour = "cyan4") +
geom_node_point(size = 5) +
geom_node_text(aes(label = name), repel = TRUE,
point.padding = unit(0.2, "lines")) +
ggtitle('Word network in TripAdvisor reviews')
theme_void()
Figure 6
以上可视化了猫途鹰评论中常见的二元词,显示了那些至少出现了 1000 次并且没有一个词是停用词的词。
网络图显示了顶部几个单词(“夏威夷”、“村庄”、“海洋”和“景色”)之间的强连接。然而,我们在网络中看不到清晰的聚类结构。
三元模型
二元模型有时是不够的,让我们看看希尔顿夏威夷村的猫途鹰评论中最常见的三元模型是什么?
review_trigrams <- df %>%
unnest_tokens(trigram, review_body, token = "ngrams", n = 3)
trigrams_separated <- review_trigrams %>%
separate(trigram, c("word1", "word2", "word3"), sep = " ")
trigrams_filtered <- trigrams_separated %>%
filter(!word1 %in% stop_words$word) %>%
filter(!word2 %in% stop_words$word) %>%
filter(!word3 %in% stop_words$word)
trigram_counts <- trigrams_filtered %>%
count(word1, word2, word3, sort = TRUE)
trigrams_united <- trigrams_filtered %>%
unite(trigram, word1, word2, word3, sep = " ")
trigrams_united %>%
count(trigram, sort = TRUE)
Figure 7
最常见的三元组是“希尔顿夏威夷村”,其次是“钻石头塔”,等等。
评论中的关键词趋势
随着时间的推移,哪些词和话题变得越来越频繁或越来越不频繁?这些可以让我们了解酒店生态系统的变化,如服务、翻新、问题解决,并让我们预测哪些主题将继续增长。
我们想问这样的问题:随着时间的推移,哪些词在猫途鹰评论中出现的频率越来越高?
reviews_per_month <- df %>%
group_by(month) %>%
summarize(month_total = n())word_month_counts <- review_words %>%
filter(word_total >= 1000) %>%
count(word, month) %>%
complete(word, month, fill = list(n = 0)) %>%
inner_join(reviews_per_month, by = "month") %>%
mutate(percent = n / month_total) %>%
mutate(year = year(month) + yday(month) / 365)mod <- ~ glm(cbind(n, month_total - n) ~ year, ., family = "binomial")slopes <- word_month_counts %>%
nest(-word) %>%
mutate(model = map(data, mod)) %>%
unnest(map(model, tidy)) %>%
filter(term == "year") %>%
arrange(desc(estimate))slopes %>%
head(9) %>%
inner_join(word_month_counts, by = "word") %>%
mutate(word = reorder(word, -estimate)) %>%
ggplot(aes(month, n / month_total, color = word)) +
geom_line(show.legend = FALSE) +
scale_y_continuous(labels = percent_format()) +
facet_wrap(~ word, scales = "free_y") +
expand_limits(y = 0) +
labs(x = "Year",
y = "Percentage of reviews containing this word",
title = "9 fastest growing words in TripAdvisor reviews",
subtitle = "Judged by growth rate over 15 years")
Figure 8
在 2010 年之前,我们可以看到一个围绕“星期五焰火”和“泻湖”的讨论高峰。像“度假费用”和“忙碌”这样词在 2005 年之前增长最快。
哪些词在评论中出现的频率越来越低?
slopes %>%
tail(9) %>%
inner_join(word_month_counts, by = "word") %>%
mutate(word = reorder(word, estimate)) %>%
ggplot(aes(month, n / month_total, color = word)) +
geom_line(show.legend = FALSE) +
scale_y_continuous(labels = percent_format()) +
facet_wrap(~ word, scales = "free_y") +
expand_limits(y = 0) +
labs(x = "Year",
y = "Percentage of reviews containing this term",
title = "9 fastest shrinking words in TripAdvisor reviews",
subtitle = "Judged by growth rate over 4 years")
Figure 9
这显示了几个自 2010 年以来兴趣逐渐消失的话题,包括“hhv”(我相信是希尔顿夏威夷村的简称)、“早餐”、“升级版”、“价格”和“免费”。
让我们比较几个精选的单词。
word_month_counts %>%
filter(word %in% c("service", "food")) %>%
ggplot(aes(month, n / month_total, color = word)) +
geom_line(size = 1, alpha = .8) +
scale_y_continuous(labels = percent_format()) +
expand_limits(y = 0) +
labs(x = "Year",
y = "Percentage of reviews containing this term", title = "service vs food in terms of reviewers interest")
Figure 10
服务和食物都是 2010 年之前的热门话题。关于服务和食物的对话在 2003 年左右的数据开始时达到高峰,在 2005 年后一直处于下降趋势,偶尔出现高峰。
情感分析
情感分析广泛应用于客户意见材料,如评论和调查回复、在线和社交媒体,应用范围从营销到客户服务再到临床医学。
在我们的案例中,我们旨在确定评论者(即酒店客人)对其过去的经历或对酒店的情绪反应的态度。态度可能是一种判断或评价。
评论中最常见的正面和负面词汇。
reviews <- df %>%
filter(!is.na(review_body)) %>%
select(ID, review_body) %>%
group_by(row_number()) %>%
ungroup()
tidy_reviews <- reviews %>%
unnest_tokens(word, review_body)
tidy_reviews <- tidy_reviews %>%
anti_join(stop_words)
bing_word_counts <- tidy_reviews %>%
inner_join(get_sentiments("bing")) %>%
count(word, sentiment, sort = TRUE) %>%
ungroup()
bing_word_counts %>%
group_by(sentiment) %>%
top_n(10) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word, n, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free") +
labs(y = "Contribution to sentiment", x = NULL) +
coord_flip() +
ggtitle('Words that contribute to positive and negative sentiment in the reviews')
Figure 11
让我们试试另一个情感库,看看结果是否相同。
contributions <- tidy_reviews %>%
inner_join(get_sentiments("afinn"), by = "word") %>%
group_by(word) %>%
summarize(occurences = n(),
contribution = sum(score))
contributions %>%
top_n(25, abs(contribution)) %>%
mutate(word = reorder(word, contribution)) %>%
ggplot(aes(word, contribution, fill = contribution > 0)) +
ggtitle('Words with the greatest contributions to positive/negative
sentiment in reviews') +
geom_col(show.legend = FALSE) +
coord_flip()
Figure 12
有趣的是,“钻石”(如钻石头)被归类为积极情绪。
这里有一个潜在的问题,例如,“干净”,取决于上下文,如果前面有“不是”这个词,就有一种消极的情绪。事实上,在大多数情况下,unigrams 都有否定的问题。这就把我们带到了下一个话题:
在情感分析中使用二元模型提供上下文
我们想知道单词前面有多少个像“不是”这样的单词。
bigrams_separated %>%
filter(word1 == "not") %>%
count(word1, word2, sort = TRUE)
Figure 13
在数据中有 850 次单词“a”在单词“not”之前,在日期中有 698 次单词“the”在单词“not”之前。但是,这些信息没有意义。
AFINN <- get_sentiments("afinn")
not_words <- bigrams_separated %>%
filter(word1 == "not") %>%
inner_join(AFINN, by = c(word2 = "word")) %>%
count(word2, score, sort = TRUE) %>%
ungroup()
not_words
Figure 14
这告诉我们,在数据中,跟在“not”后面的最常见的情感关联词是“worth”,跟在“not”后面的第二个常见的情感关联词是“recommend”,它通常具有 2 的(正)分数。
那么,在我们的数据中,哪些词在错误的方向上贡献最大?
not_words %>%
mutate(contribution = n * score) %>%
arrange(desc(abs(contribution))) %>%
head(20) %>%
mutate(word2 = reorder(word2, contribution)) %>%
ggplot(aes(word2, n * score, fill = n * score > 0)) +
geom_col(show.legend = FALSE) +
xlab("Words preceded by \"not\"") +
ylab("Sentiment score * number of occurrences") +
ggtitle('The 20 words preceded by "not" that had the greatest contribution to
sentiment scores, positive or negative direction') +
coord_flip()
Figure 15
“不值得”、“不太好”、“不好”、“不推荐”和“不喜欢”这几个词是错误识别的主要原因,这使得文本看起来比实际情况积极得多。
除了“不”之外,还有其他否定后项的词,如“没有”、“从来没有”、“没有”。我们去看看。
negation_words <- c("not", "no", "never", "without")
negated_words <- bigrams_separated %>%
filter(word1 %in% negation_words) %>%
inner_join(AFINN, by = c(word2 = "word")) %>%
count(word1, word2, score, sort = TRUE) %>%
ungroup()
negated_words %>%
mutate(contribution = n * score,
word2 = reorder(paste(word2, word1, sep = "__"), contribution)) %>%
group_by(word1) %>%
top_n(12, abs(contribution)) %>%
ggplot(aes(word2, contribution, fill = n * score > 0)) +
geom_col(show.legend = FALSE) +
facet_wrap(~ word1, scales = "free") +
scale_x_discrete(labels = function(x) gsub("__.+$", "", x)) +
xlab("Words preceded by negation term") +
ylab("Sentiment score * # of occurrences") +
ggtitle('The most common positive or negative words to follow negations
such as "no", "not", "never" and "without"') +
coord_flip()
Figure 16
看起来,将一个词误认为积极的最大来源是“不值得/很棒/很好/推荐”,而被错误分类的消极情绪的最大来源是“不坏”和“没问题”。
最后,让我们找出最正面和最负面的评论。
sentiment_messages <- tidy_reviews %>%
inner_join(get_sentiments("afinn"), by = "word") %>%
group_by(ID) %>%
summarize(sentiment = mean(score),
words = n()) %>%
ungroup() %>%
filter(words >= 5)sentiment_messages %>%
arrange(desc(sentiment))
Figure 17
最正面评论的 ID 是 2363:
df[ which(df$ID==2363), ]$review_body[1]
Figure 18
sentiment_messages %>%
arrange(sentiment)
Figure 19
最负面评论的 ID 是 3748:
df[ which(df$ID==3748), ]$review_body[1]
Figure 20
很有趣!源代码可以在 Github 上找到。祝你一周愉快!
参考:文本挖掘用 R
筛选数据科学职位的候选人—我的经验
我是多伦多一家中型软件公司的数据科学家。在过去的几个月里,我参加了三个数据科学职位的面试——数据工程师、数据科学家和数据科学 QA。这篇文章包含了我作为一名面试官看待这些申请的一些想法。我写下这些,希望那些想申请数据科学职位的人会发现这有助于准备简历和参加面试。我确实找到了很多关于准备数据科学面试的东西,但从面试官的角度来看并不多。
公司中的“数据科学”团队是一个相对较新的现象,其中有各种各样的角色。这篇文章总结了一些角色及其描述。随着这种角色的增加,我们开始看到许多主要和次要角色提供数据科学方面的认证课程。抛开这些认证中哪些是好的不谈,由于这种趋势,我们开始看到许多带有“认证数据科学家”标签的简历。这也是评估一份简历变得困难的地方。
So many data science resumes! (image source: https://goo.gl/hWe6jy)
通常,当你作为一个非人力资源人员直接成为被雇佣者的团队成员看简历时,你会寻找什么?我寻找的是:a)与团队工作相关的经验,b)简历中还有哪些关于候选人的细节,如何呈现?体验部分很明显。我说的第二点是什么意思?我在寻找这样的东西:
- 清楚和/或完整地描述候选人工作/学习的时间和地点
- 存在任何 Github 档案和/或技术博客
- 技能和成就部分有哪些内容
- 简历的长度
我来一一说说,为什么我觉得这些很重要。
- 清晰/完整的描述:我一直看到简历中没有提到目前工作的国家或城市。我认为这很重要,尤其是当雇主对签证担保或那些通常希望在本地招聘的人有一些限制时(我不是在评论这是好是坏——这些只是雇主的偏好)。开始某种面试过程,然后很久以后才意识到这是一个限制,这是在浪费每个人的时间。一些候选人没有提到毕业的国家。虽然这本身不是一个大问题,但我认为这不必要地让简历看起来不完整。不是所有的大学都举世闻名。如果有人写“斯坦福大学”而没有提到一个国家,我仍然会说它不完整,但不是“红旗升旗”那种不完整。如果有人写了一个“ABC 工程学院”,之后什么也没提,那就是让简历看起来可疑的事情。当然,我只是给出个人观点,但我肯定我不是唯一的一个,而且在那里加上城市/国家名称并不需要太多。只是一个权宜之计,只要写的是真的。简历应该精确、简洁、完整。
2。github 简介/博客的出现:我认为这对于刚接触数据科学的人来说尤其重要,尤其是刚刚完成认证课程和相关顶点项目的人。仅仅列出课程项目是不够的,因为每个完成课程的人都必须完成这些项目。除此之外,还必须有一些东西告诉面试官,候选人理解他们所学的东西,能够适应新的问题场景,并关注该领域正在发生的事情。从事个人数据科学项目(例如,不属于任何课程的 kaggle 竞赛),发布一些文章(例如,关于他们最近阅读的内容,或者他们喜欢的工具,或者一些算法等。)是展示这一点的一些方式。
我个人觉得很难评估除了来自已知/未知机构的认证之外,完全不相关的工作,只有数据科学的“经验”是这个认证计划的课程项目,没有其他参考资料的个人资料。我同意这对求职者来说是一项额外的工作,但我认为这是值得的,因为这将我们与其他求职者区分开来,他们也有类似的背景/经验水平。
3.被提及的技能/成就有哪些:我不认为是 MS Office、敏捷方法论、参与每日 scrum 会议、在机器学习课上获得最高分等等。应该在中作为数据科学家职位的成就或技能提及。我希望在技能中看到的是某种逐项列出的项目,这些项目是技能的不同方面,例如:编程语言、机器学习库、可视化库、项目管理等。我一般不把成就放在我自己的简历中,但是如果有人把它放在那里,我希望看到一些实际的成就(例如,我为 Y 建立的模型 X 将软件 Z 中的错误减少了 XX%等)。用每一个可能的关键词填充简历也是一个坏主意。它可能通过了机器的筛选,但会吓退一个人。
4.**简历长度:**不同的人、不同的国家对此有不同的规范。最近,在 LinkedIn 上有一个关于这个话题的讨论,在安德烈·布尔科夫的帖子下,他说任何工作经验少于 10 年的人都应该有一页纸的简历。在其他地方,我每 5 年读 1 页,这对我来说更有意义。然而,我经常看到长达 7-8 页的简历(这在 QA 职位上更常见),它们基本上不能给我任何信息。每个小项目都有不必要的详细解释,在大多数情况下,项目甚至与数据科学毫无关系。
一些博士生或博士后的简历列出了他们所有的出版物。我认为这也是在软件行业背景下让面试官却步的原因。我本人有博士学位,有些工作我提交了长达 8 页的简历,列出了所有的出版物。然而,我还保留了一份 2 页的简历,专门针对与工程团队有更密切互动的行业职位。
另一件让我完全困惑的事情是——有些人在电话采访中听起来是多么冷漠。表现出对工作的兴趣 , 向潜在的团队成员提问(例如,团队有多少人,典型的分工是什么,比如工程和研究等),以及对面试过程的好奇心——这些都表明了候选人自己对广告职位的兴趣。在我有限的经验中,不问这些问题是一个很大的危险信号。虽然这只会发生在简历筛选之后,但有些问题也可以在求职信中解决(只要有选择,就使用它!).我个人对超长的求职信和那些有很多关于公司的通用的、最高级的奉承形容词的求职信感到厌恶。然而,我认为,即使没有这些特征,也可以写一封求职信,表明候选人对这个职位的兴趣,以及他们是如何适合这个职位的。
快速总结一下,在准备简历和准备面试时,要记住以下 5 件事:
- 确保简历清晰、简洁
- 尝试拥有一个最新的 github 简介和/或博客,并在简历中给出链接
- 使技能/成就部分简洁并与职位相关
- 不要把简历写得太长
- 对公司和职位表现出兴趣
那么,这是否意味着以前没有数据科学经验的人不应该申请呢?不,我不是这个意思。让我们考虑个人 P 的情况,他是一位自学成才的数据科学家。他们做了一些在线课程,并从那里接手,自己做了一些家庭项目。他们没有写博客,也没有把所有东西都放在 github 上,但是可以详细描述他们做了什么。那应该怎么写在简历里呢?对此我不知道一个好的答案,但我看到人们放了一个叫做“个人数据科学项目”或类似的标题,来描述他们所做的工作——每个项目 3,4 句话。这是展示你作品的一种方式。显然,这不应该一直持续下去。也许挑选 2-3 个最重要的项目就可以了。然而,光靠 Kaggle 竞赛可能还不够,因为它们远离真实世界的场景。
最终,每个人的目标都是让自己的个人资料在其他人当中脱颖而出。
还有一些其他问题与工作职位有关(例如,数据科学 QA 职位对筛选候选人个人来说特别具有挑战性),以及关于面试流程,但也许我会在将来就此单独写一篇文章。 Jeremie Harris 关于“要成为数据科学家,不要从众”的帖子给了我写这篇帖子的灵感。所以,我向他致谢。
SD-WAN 链路交换机作为深度 Q 学习的强化学习实验
Credit — https://usblogs.pwc.com/emerging-technology/deep-learning-ai/
Deep Q '或 Deep Q-Learning 是强化学习中众所周知的算法,它用深度神经网络逼近 MDP 系统的 Q 值。在本文中,我探索了解决 SD-WAN 网络中链路切换问题的相同算法,为此我已经开发了一个基于 Mininet 的 AI-gym(参见我以前的文章-Open-AI gym for SD-WAN Link Selection)。在应用 Deep-Q 算法时,我发现基于 Mininet 的 gym 通过发送真实的 TCP/UDP 流量来执行测量,花费了相当多的时间。这让我想到了另一个使用纯统计后端的想法,它通过生成具有特定均值和方差的高斯随机数来模拟流量测量。然后,该算法会根据数千集进行调整,并在最后与实际的 Mininet 后端进行交叉检查。本实验为 SD-WAN 链路切换问题可以通过强化学习得到有效解决提供了合理的证据。
关于深度 Q 学习实现的一些话
深度 Q-Learning 出自 DeepMind 的研究团队(见开创性论文 — 用深度强化学习玩雅达利(Atari)Mnih et 的。艾尔。).实现这种算法有几种选择。我可以实现“双 Q 网络”或“单 Q 网络”以及“经验回放”。我也可以使用决斗架构(王等人的深度强化学习决斗网络架构)。艾尔。).围绕着*(open-ai,* Denny Britz , Keon ) 我从Greg *中汲取了灵感。*这是一个简单的实施,只有经验回放和单一网络。这是解决翻转 问题的基线。跟我的问题类似,有离散的动作和无限连续的状态空间。这类似于我在两条链路中的一条上发送流量并观察吞吐量的问题。代理部分非常相似,只是 Cartpole AI-gym 将被替换为我之前已经开发的 SD-WAN 专用 AI-gym(参见我以前的文章)。
用于近似 Q 值的深度神经网络模型具有两个密集层,随后是线性激活
观察空间是由三个参数组成的元组——
(动作 _ 选择,当前 _ 带宽,可用 _ 带宽)
动作空间有两个值——0 和 1,用于选择 MPLS 或 INTERNET 链接。
深度 Q 学习的参数如下
伽马= 0.95
学习率= 0.001
内存大小= 1000000
批处理大小= 20
EXPLORATION_MAX = 1.0
EXPLORATION_MIN = 0.01
探索 _ 衰退= 0.995
回顾—剧集评分的下降趋势
正如我在之前的文章中提到的,单集的累积奖励呈下降趋势,如下图所示
从多次试验中也可以明显看出,随机试验的平均回报并没有显示出任何改善。
正如这里看到的,分数在零附近波动。没有任何学习就没有上升趋势(因为我们还没有应用深度 Q 学习)。然而,这一次在应用深度 Q 学习算法时,我遇到了一种新的障碍。在进行多集实验时,仅完成一集就存在时间跨度大的问题。这一次我使用 Mininet 来模拟 SD-WAN 环境,完成一集最多 30 个“时间刻度”真的很漫长。
基于 Mininet 的剧集执行时间过长
有了 Mininet 的后端,即使只有 30 个时间刻度,每集也要花相当多的时间。随着每个“时间滴答”流量在互联网链路上发送,然后进行测量。一个 100 集的实验在云虚拟机上轻松进行了 12 个多小时,并且在深度 Q 学习的性能上没有明显的趋势
深度 Q-Learning 众所周知需要大量的训练,只有 100 集,还不能确定训练进展如何。
统计后端
这个想法很简单。由于通过 Mininet 的实际流量需要时间,为什么我不根据某种统计分布来生成测量值呢?在 Mininet 实验中,我生成了一些分布式流量。为什么不在不实际发送流量的情况下,在生成测量时应用相同的分布呢?有了这个想法,我创建了一个健身房的统计后端,它基于正态分布生成测量值,具有一定的均值( )和标准差(σ),但没有流量通过链接。
以前,我们实际上是以一定的平均值( )和标准差(σ)生成互联网链接流量,然后将它发送到 Mininet 链接。现在,我们没有生成任何实际流量,而是将测量结果直接输出为由具有相同σ的正态分布生成的数字。这表示占用链路的外部互联网流量。由于链路容量固定在某个值,我们通过从链路容量中减去外部流量带宽来获得流量吞吐量。我在测量“达到的带宽”时也加入了一些随机性。这是通过生成一个具有窄正态分布的数字来实现的,该数字具有“实现的带宽”和低σ值(0.5 Mbps)。
具有统计后端的较短剧集
我用 deep Q agent 和随机试验进行了相同的训练测量。现在这几集的时间缩短了很多,但是学习并不明显。
下面是《随机特工》超过 100 集的评分。你可以看到平均分数是负的-
以下是用深 Q 网训练 100 集的结果-
你可以看到平均分数远低于零。
1000 集(见下)很明显训练失败了。没有上升趋势。这几集的累积分数都很低-
奖励设计中的修正
很明显,这个问题对代理人来说太难训练和解决了。据我所知,有多种因素导致代理人的报酬较低
1)严格的带宽分配
我将链路容量设置为 10 Mbps,并通过它发送了 5 Mbps 的 UDP 流量(偏差为 2 Mbps)。这为我们的预期流量留下了大约 5 Mbps。然而,我将 SLA 限制设置为 6 Mbps。这意味着,如果“实现的带宽”小于 6 Mbps,我们应该进行链路切换。由于这种紧密的安排没有太多的空间,代理别无选择,只能不时地进行链接切换,最终导致较低的累积分数。所以解决方案是公平分配带宽。我再次将 SLA 保持在 6 Mbps,但这次给了其他一般流量 4 Mbps。这为我们留下了大约 6 Mbps 的“预期流量”,以满足现在更频繁的 SLA。
2)奖励设计因失败而倾斜
以前的设计是增加+1 以在“时间滴答”中存活。每当“实现的带宽”不能满足 SLA 限制时,惩罚为-5。同样,对于采用 MPLS 链路,惩罚是-2。然而,对于采取正确的行动,即在带宽可用时使用互联网链接,只给予+1 奖励。因此,在默认奖励为+1 的情况下,如果它采取了正确的行动,总奖励为 2,而对于错误的行动,总奖励为-1。此外,每当错过 SLA 时,该“时间刻度”的总奖励为-4。由于紧张的带宽预算,代理经常无法达到 SLA 目标,总体得分迅速下降。
还有一条规则可以提前结束一集。如果一个情节连续两次没有达到 SLA 指导原则,则该情节会被突然终止。然而,这并没有体现在奖励上。这也在新的逻辑中被修正了。
新逻辑
新的设计原则基于以下几点
鼓励在“时间滴答”中生存
鼓励正确的链接选择,这次奖励更多
阻止错误的链接选择,但不要像以前那样惩罚
阻止 SLA 违约,但不作为最高处罚
因结束这一集而受到重罚
下面是新逻辑的实现(参见下面的代码)
因此,这一次我们在选择 MPLS 链路时扣除 1,而不是 2。此外,只要选择了正确的链接,奖励就会增加+2。“SLA 失误”被罚了-2 分,而不是之前的-5 分。每多活一个滴答+1 的奖励仍然存在。然而,我们因为提前结束这一集而扣除了最大值(-5)。这一次,没有提前结束这一集的目标变成了奖励设计。
3)短插曲长度
每集长度会影响奖励结果,从而影响学习过程。以前一集只有 30 分钟。考虑到实际的 Mininet 后端的实验速度很慢,这个值保持得很低。以每集 30 个“时间刻度”计算,总共 100 集在云虚拟机中需要大约 12 个小时。这是将情节重复数千次的主要障碍。众所周知,深度 Q-learning 最初需要许多片段来预热,因此不知道学习是否正在进行。有了统计后端,我能够保持 300 集的长度(因为 30 集对于一集来说是很低的数字),并且剧集完成得更快。我这次做了几千次实验,以获得学习的真实情况。只有当我切换到统计后端时,这种扭曲的奖励设计才变得明显。
培养
在修改了奖励设计和应用了统计后端之后,我又开始训练代理人。统计后端上的随机代理没有显示任何预期的学习。然而这一次每集的平均分数是正的。
然而,深度 Q 代理在很早的时候就显示出轻微的上升趋势事件,甚至有 100 集。
预热发生在大约 500 集的时候,如下图所示
当我们放大到 400-600 的范围时,这种突然的跳跃是很明显的
确认
在我用统计后端运行了 1000 集的训练后,很明显代理人在每一集上都有持续的进步。现在是在 Mininet 后端验证这种学习的时候了。关于统计后端的学习对于 Mininet 是否仍然有效,在这里我们实际发送流量以确定吞吐量?
我使用Mininet 后端运行 deep Q agent,但这次使用的是通过使用统计后端学习 1000 集训练获得的相同神经网络权重。细看单集 - ,评分的涨幅非常明显
Single Episode comparison after training
与随机和确定性代理相比,可以看到 deep Q 代理的明显增益。
从下面两个图中也可以清楚地看出,与随机代理相比,deep Q 代理进行的链路切换非常少
Random agent one episode details
Deep Q agent play for one episode
最后,对 100 集的情节进行了比较,很明显,deep Q 代理的平均回报远远高于具有 Mininet 后端的相同设置的随机代理
100 episode play random vs deep Q agent
结论
很明显,deep Q 代理知道何时为 SD-WAN 设置切换链路,并实际解决了链路切换问题。这是一个非常简单的代理,只有单 Q 网络与经验重播。结果可以通过更复杂的方法来改善,如双 Q 网络或决斗双 Q 网络,甚至通过政策梯度方法,如演员-评论家(见萨顿和巴尔托)或 A3C 。本实验的目标不是实现最大可能的回报,而是表明强化学习在应用于 SD-WAN 链路切换问题时,实际上可以以合理的效率解决问题。人们可以通过增加 QOS 参数,如抖动、延迟等,用更先进的算法和更真实的观察空间来改进这一点。
密码
上述实验的代码已经被签入 github(https://github.com/amitnilams/sdwan-gym、https://github.com/amitnilams/sdwan-gym-stat、https://github.com/amitnilams/sdwan-rl)
参考
1)我之前的文章— Open-AI gym for SD-WAN 链接选择
2 ) 玩深度强化学习的雅达利由 Mnih et。铝
3) 深度强化学习的决斗网络架构王等。
4) open-ai 基线
5) DQN 实施由丹尼·布里兹
6)深度 Q 由 Keon 实现
8)Richard s . Sutton 等人提出的利用函数逼近进行强化学习的策略梯度方法。艾尔。
9) 深度强化学习的异步方法Mnih et。艾尔。
11)David Silver 等人的利用双 Q 学习的深度强化学习。艾尔。
在随机森林中寻找能量
我们需要覆盖多少地球表面的太阳能电池板来满足整个人口的能源需求?不多,根据土地艺术发电机倡议组织,他们在 2009 年计算出我们需要在世界上大约 496,805 平方公里的土地上铺设太阳能电池板来满足人类 2030 年的能源需求。这听起来很多,但事实上只有 0.35%的土地没有被水覆盖。
这太不可思议了,看起来是一个完全可以实现的目标,尽管这有点简单化。我们不能只把那些面板放在一个地方,很多地区可能更适合不同的清洁能源。事实上,在一次更新中,原始文章指出需要考虑可再生能源生产的多样性和分布。然而,这种“容易”的想法是诱人的,100%可再生能源的想法正在被一些组织如解决方案项目认真推动。
那么,我们如何着手弄清楚哪种类型的可再生能源应该去哪里呢?这实际上是一个极其复杂的决定,需要我们考虑地球物理因素,包括天气、气候、土地类型、海拔、坡度,以及人口密度、基础设施、电网特征、能源市场等人为因素。如果你是决定在哪里建下一个发电厂的人,那要考虑很多。因此,围绕这个问题有一个完整的行业,它依赖于大量的人类专业知识。
对我来说,这似乎是一个绝佳的机会,看看我们是否能够利用机器学习做出更好、更快的决策。有成千上万个现有的可再生能源网站,我们可以训练计算机从中学习。为什么不尝试教一种算法来理解每个地点的什么特征使这些地点成为建设可再生能源的好地方,将该公式应用于我们剩余的可用土地,并查看全球最佳的能源生产地点在哪里?
在华盛顿大学的 2016 年地理黑客周上,我提出了这个想法,并成立了一个项目来测试它。在几天黑客攻击的时间限制内,目标是获取美国各地带有少量地理特征的可再生能源站点的位置,并使用这些信息来训练计算机,以决定应该在整个国家放置哪些类型的可再生能源。为了让事情变得简单一点,我们把自己限制在只关注大规模的太阳能、风能和地热发电。
我们选择的机器学习方法是随机森林分类器。分类器是一种学习预测类别(从有限的选项中选择)的算法。随机森林技术通过构建一系列决策树来实现这一点。在我们的例子中,我们告诉它每个有清洁能源的地方的特点,以及那里有什么类型的可再生能源。然后,它会生成多个不同的决策树,这些决策树都可以用来计算哪些特征会导致每一个可更新。这是我们的森林。当我们给它一个未知类别的新数据点(在我们的例子中,是关于我们想要知道最佳可再生能源适用性的特定位置的数据)时,它会遍历所有决策树,并从他们的选择中获得多数票,以决定哪种可再生能源最适合该位置。
可再生能源所在地的数据来自EIA,我们收集了海拔、坡度、坡向、太阳辐照度、风速、温度梯度和人口数据。我们为地理空间机器学习问题选择的平台是谷歌地球引擎。它利用谷歌的硬件资源以非常高的速度完成巨大的地理空间计算,并内置了机器学习功能。我们部署了他们的随机森林算法,来制作一张地图,以令人难以置信的 4 公里分辨率,在全国范围内预测风能、太阳能和地热能生产的适宜性。我们也将某些地点设为禁区,例如城市、森林和水体。
最终的地图显示了现有的两个可再生能源网站,以及整个美国在 4 公里网格上的每个点上从三个可再生能源中选择最佳的颜色编码。即使只是考虑几个变量,我们也能看到有意义的东西;中西部大多被归类为最适合风能的地区,而南部有更多适合太阳能的地区,该算法预测地热的最佳地点集中在山脉和火山周围。从放大的地图部分,我们还可以看到,在局部水平上,为每种类型的能源生产选择的区域之间有高分辨率的区别。
这只是一个原型黑客,但它仍然很酷,看看如何可能确定整个国家的可再生能源的适用性,在高空间分辨率的几个点击。它非常符合能够为全世界提出可再生能源计划的愿景,同时赋予决策者在地方层面制定优化能源战略的权力。在现实世界中,情况肯定更复杂。我们没有包括许多相关的功能,没有考虑现有可再生能源站点的建设时间,也没有考虑复杂的因素,如经济、地方政策或电力分配。
至于分类机器学习方法是否是这个问题的最佳方法,我可以想到一些优点和局限性。首先,任何机器学习技术都是从过去关于在哪里建电厂的决策中建立理解。一方面,这是好的,因为我们在没有明确定义它们的情况下,自动将人类的专业知识和关注点构建到我们的模型中,但是不能保证以前的决策适用于未来的场景。现代电网、政治、能源市场和可再生技术本身都处于进化状态,但也许通过精心选择的特征,这些都可以得到解释。
还有一个问题是,分类模型的最终结果只能告诉我们哪种可再生能源最适合某个地方。它没有告诉我们不同类型在每个地点的比较,或者一个地点是否比另一个地点更适合某种类型。仅仅知道你的国家哪里比其他可再生能源更适合太阳能,而不知道哪里是建造太阳能发电厂的最佳地点,这并没有多大用处。我们简要地看了一下实现这一点的回归算法(产生一个数量,而不是一个简单的选择),设想创建一个相对场地适宜性的热图,进一步探索肯定会很有趣。另一种选择可能是使用人类专家定义的公式,并应用全局优化方法来生成相对场地适宜性图。
这个项目在未来肯定会有一些有趣的方向,希望我能找到时间回到这个话题上来!关于 hack week 项目的更多技术细节、数据和代码可以在它的 GitHub 库上看到。非常感谢我的团队成员,劳拉·辛克曼,山姆·胡珀,茱莉亚·金和瑞秋·怀特同意继续这个想法,并感谢凯瑟琳·库恩的所有协助。也感谢 Anthony Arendt 和 GeoHackWeek 团队的其他成员举办了一场精彩的活动!
相关链接
这里有一个其他可再生能源测绘项目和组织的列表,它们是这个项目的灵感来源。
- 可再生能源忍者——模拟全球风能和太阳能输出。
- 谷歌的项目天窗——告诉你你的屋顶有多适合太阳能。
- 爱荷华州风力涡轮机场地适用性的机器学习——一篇学术论文证明我不是唯一一个愚蠢到认为这可能是一个好主意的人。
- NREL 可再生能源潜力 —报道美国可再生能源的技术和经济潜力。
这篇文章的副本也可以在georgerichardon.net上找到
寻找为《纽约时报》撰写专栏的抵抗组织成员
自然语言处理能预测作者的真实身份吗?
周三下午,《纽约时报》发表了一篇令人震惊的观点文章,详细描述了一些白宫顾问为遏制特朗普总统最鲁莽的倾向而进行的秘密抵抗,这是这家著名(或者我敢说,失败)报纸发表匿名评论的罕见例子。该专栏的作者被描述为一名未透露姓名的“特朗普政府高级官员”,他以匿名的名义撰写,可能是为了避免作者立即被解雇,但也是为了让读者能够专注于故事的重要信息,而不是信使。几分钟内,这篇文章就像病毒一样传播开来,因为现在是 2018 年,Twitter 和全国各地的政治学者立即开始搜索这位作者。大量的理论迅速充斥网络,几个小时内多家博彩公司发布了的投注赔率。当互联网侦探在一些暗示作者身份的奇怪短语上划区域时(对于任何声称在阅读文章之前知道‘lodestar’是什么意思的人来说——Google Trends 保留收据),我在过去 3 个月里完全沉浸在数据科学中,立即想到是否有可能使用自然语言处理来揭示作者的身份。这是我对破案的初步尝试。
Trump criticizing the “amomynous” author
假设
首先,我需要对这个列做一些假设。虽然 NYT 的一条推文最初称作者为“他”(一名时报发言人后来澄清这是一个错误),但我忽略了作者的性别被如此无伤大雅地暴露出来的想法。相反,我认为他们被称为男性,因为政府中没有高级别的女性,如果作者被揭露为女性,公众很容易发现他们的身份。我还必须假设观点文章是用作者自己的声音写的,而不是由演讲稿撰写人精心制作的,或者经过大量编辑,因此不可能符合作者的独特风格。【Axios 公司的张克帆·斯旺之前的一份报告称,一名白宫官员详细描述了他们如何“注意其他员工的习惯用语,并将其用在[他们的]背景引语中”,以掩盖他们的踪迹。
These people definitely did not write it
我最后的假设是,一名政府官员的公开否认并不排除那个人写了这篇文章——知道被曝光的可怕后果,对他们的参与撒谎是他们的最大利益。没有这些假设,就不可能准确地预测作者,我必须强调,目前的这项工作是一项非常不精确的研究。
一旦我的假设成立,我必须得到一份潜在作者的名单。不幸的是,对我自己和这个国家来说,有一个长得惊人的潜在候选人名单,涵盖了行政部门的所有领域。
出于时间的考虑,我把名单缩小到了三个人,每个人都有可能成为候选人,他们都有公开的演讲和在线发表的专栏文章。我最初选择关注的三个人是副总统迈克·彭斯、驻联合国妮基·黑利大使和现任经济顾问委员会主席凯文·哈塞特。Pence 被包括在内是因为“lodestar”这个词的奇怪用法,在文章发布几分钟后,Twitter 用户 @danbl00m 发现它是副总统(显然不是其他人)常用的词之一。这篇文章对外交政策失误和经济及放松管制的成功进行了深入的审视,因此我觉得有必要将各个学科的官员都包括进来。我选择了哈利和哈塞特,因为在我看来,他们都是高级官员,在很大程度上避开了目前笼罩白宫的真人秀聚光灯。
余弦相似性
一旦我有了我想看的三个候选人的名单,我就在网上搜寻这些人的观点、文章和演讲。我使用的第一种方法是余弦相似度,它使用两个矢量化语料库之间的余弦角来衡量相似度,输出越接近 1 被视为越相似。使用术语频率-逆文档频率(TF-IDF)将每个语料库转换为向量,我能够计算潜在作者和匿名抵抗成员之间的相似性。
好消息是每个作者的余弦相似度接近 1,这意味着很好的匹配。坏消息是,这三个数字被如此紧密地组合在一起,以至于无法确定哪个(如果有的话)与作者最相似。我推断,三个余弦相似性之间缺乏变化是由于一个小的目标集,在这种情况下,只有 881 个词写在专栏中。
TF-IDF 降维
我尝试的下一个方法是使用 t-SNE 将每个候选人的 TF-IDF 向量矩阵的维度降低到三维,然后绘制每个候选人的图表,以查看是否有任何候选人比其他人更接近专栏作家。令我沮丧的是,这 4 个点就像我能想象的那样平均分布,对于作者可能是谁没有留下任何洞察力。
Useless 3D Scatter Plot
作者归属
我的最后一次尝试使用了尼尔·雅戈开发的作者归属代码,它分析了四个不同的特征来预测哪个作者最有可能写了一篇文章。这四个特征分别是:词汇特征,如每句话的平均字数和作者词汇量的大小;**标点特征,**包括每个句子中逗号、分号和冒号的平均数量;**单词包特征,表示特定单词在文档中出现的频率;以及句法特征,**将每个词归类到某个词类(名词、动词等。).在大多数 NLP 实例中,通常会删除在所有文档中频繁出现的单词,如“the”和“are ”;然而,作者归属的操作不同于正常的文本分类,并且有一种信念,即作者以一种独特但一致的方式使用这些常用词。
###### code to create lexical and punctuation feature vectors ######for i, text in enumerate(authors):
tokens = nltk.word_tokenize(text.lower())
words = word_tokenizer.tokenize(text.lower())
sentences = sentence_tokenizer.tokenize(text)
vocab = set(words)
words_per_sentence = np.array([len(word_tokenizer.tokenize(s))
for s in sentences])
# Average number of words per sentence
fvs_lexical[i, 0] = words_per_sentence.mean()
# Sentence length variation
fvs_lexical[i, 1] = words_per_sentence.std()
# Lexical diversity
fvs_lexical[i, 2] = len(vocab) / float(len(words))
# Commas per sentence
fvs_punct[i, 0] = tokens.count(‘,’) / float(len(sentences))
# Semicolons per sentence
fvs_punct[i, 1] = tokens.count(‘;’) / float(len(sentences))
# Colons per sentence
fvs_punct[i, 2] = tokens.count(‘:’) / float(len(sentences))
在创建了特征向量之后,我继续在特征空间中寻找三个聚类,希望至少一些(如果不是所有的)专栏特征将与候选人的那些特征共享一个聚类。我决定用三个集群来测试它,假设三个已知作者中的每一个都将他们的功能作为独特集群的一部分,而论坛版功能将属于其中之一。
author_files=[pence,hassett,haley,oped]**code:**
fvs_list = [fvs_lexical,fvs_punct,fvs_bow,fvs_syntax][PredictAuthors(fvs).labels_ for fvs in fvs_list]**output:**
[array([0, 0, 2, 1], dtype=int32),
array([2, 1, 0, 0], dtype=int32),
array([0, 1, 2, 2], dtype=int32),
array([0, 2, 0, 1], dtype=int32)]
Representation of which cluster each feature belongs to
数组中的每一行代表一个不同的特性,而列代表四个不同的作者(最后一列是专栏)。数字表示每个要素属于哪个聚类。同样,结果是不确定的,尽管它们比前两种方法提供了更多的信息。该论坛版的标点符号和单词袋功能与妮基·黑利的相同功能共享一个群集,而其其他功能都不属于与其他两位作者的匹配功能相同的群集。这是朝着正确方向迈出的一步,但仍然没有给出明确的答案。
在接下来的几天里,我希望收集更多政府成员的发言和文章,看看是否有官员引人注目。这个最初的尝试给了我一个坚实的感觉,我将需要使用的技术,以作出准确的预测。我期待改进这个模型,并对作者的真实身份给出一个有把握的猜测。
**更新:**维基解密将搜索范围缩小到一名年长的保守男性。
西雅图非常适合数据科学家。原因如下!
Photo by Zhifei Zhou on Unsplash
最近,我有机会在西雅图与我工作的数据科学学院 Metis 进行了为期六个月的教学轮换。我小时候的最初记忆是和家人一起探索市中心和华盛顿湖;在东海岸住了多年后,我欣然接受了在翡翠城多待些时间的机会。现在,我有一些时间来反思我在西雅图的经历,我开始意识到这个城市是有抱负的数据科学家可以称之为家的最佳地方之一。
第一:西雅图是美国发展最快的城市。一个主要原因是强劲的就业市场,尤其是在科技领域。像亚马逊和 Zillow 这样的公司正以贪婪的速度增长,为有 STEM 头脑的学生和工人带来了有利可图的职业前景和高流动性。事实上,Indeed.com 对下一个“硅谷”的搜索发现西雅图是科技中心,科技职位空缺增速最快。
西雅图特别需要数据科学家,因为这个城市面临着美国最大的数据科学家短缺之一推动数据科学家军备竞赛的因素之一是需要以下领域的专家:
- 自然语言处理(微软 Cortana vs .亚马逊 Alexa )
- 视觉机器学习和 AR/VR ( 微软 HoloLens )
- 推荐系统(亚马逊的电子商务和脸书的个性化)。
尽管这个城市及其经济飞速发展,我还是很高兴地发现西雅图并没有失去它的魅力。它提供了纽约市、芝加哥或旧金山的大部分能量,同时让人感到亲切和平易近人。这里的新数据科学家可以很快感觉自己是一个真实社区的一部分;在网络活动中看到熟悉的面孔意味着联系和插上电源并不困难!
这种平衡感延伸到在西雅图雇用数据科学家的各种公司,这些公司形成了初创公司、家喻户晓的组织的卫星办公室以及将西雅图作为家的大型科技公司的良好组合。每个人都知道该地区的大公司,如微软和亚马逊。在初创企业方面,西雅图的前沿城市精神依然存在,因为来自大公司的团队已经脱离出来,成立了自己的组织。即使是总部不在西雅图的科技企业集团也不能忽视西雅图的人才库,因此脸书和谷歌等公司已经在市中心设立了办事处,以确保他们不会错过这个机会。
有人可能会说,那些在西雅图设立卫星办公室的组织只是在追随员工的流失。事实上,在过去的一年中,大多数 LinkedIn 会员从旧金山湾区搬到的美国城市已经有了定论。顶级城市?你猜对了。口袋里有更多的钱也没有坏处,因为西雅图数据科学家的平均工资(根据生活成本调整后)超过了旧金山和纽约。
西雅图的另一个好处是该地区丰富的学术成就历史。顶级教授和从业者在西雅图生活和工作,他们中的许多人在西雅图的大小公司兼职,横跨学术界和商界。这座城市的整体氛围有利于深入思考和学术研究;下雨的天气往往会这样!
当我们谈到自然的主题时,我必须提到美丽的海滨和各个方向的山脉景观(奥林匹克、瀑布、雷尼尔),以及城市的其他自然特征。徒步旅行和滑雪的机会比比皆是,西雅图以其名副其实的绿色城市而闻名(色彩、环保意识和休闲)。
在过去的两年里,我在亚特兰大、芝加哥、西雅图和旧金山(我目前在 Metis 的 SoMA 校区任教)生活和工作,因此我可以谈谈每个地区的独特之处。如果你能适应灰色的天空,你会发现西雅图是一个称之为家的好地方,有丰富的身心锻炼活动,从聚会和黑客马拉松到皮划艇和山地自行车。作为一名数据科学家,西雅图是最值得投资的市场,具有巨大的潜在上升空间和强劲的发展势头!
有了所有这些有利条件,越来越多有抱负的数据科学家开始把西雅图当成自己的家也就不足为奇了!
你住在西雅图还是最近去过?同意还是不同意?
HBR 分析的秘密段落
我们来谈谈混合角色,研究的本质,Bat 信号,数据江湖骗子,牛逼的分析师!
我本周的博文在 HBR 发表,所以如果你错过了那篇,你可以在:
在发送之前,我尽了最大的努力来缩短篇幅,所以如果你在读完的文章后还觉得不够,这里有一些秘密段落和 B 面供你娱乐。尽情享受吧!
购买奖品
小心你崇拜的技能,因为不明智的选择会带来毁灭性的影响。除了管理不善的团队和不必要的雇佣,你会看到真正的英雄辞职或自我再教育,以适应你今天的动机。这种现象的一个主要例子是在分析。
买家当心
不幸的是,真正的分析师相对较少——买家请注意:有许多数据骗子冒充数据科学家或数据分析师。这些人兜售胡说八道,以无纪律的方式超越数据,以基于一厢情愿的想法“支持”决策。如果你的道德标准松懈,也许你会把这些蛇油推销员留在身边,把他们安置在你生意的营销黑艺术部分。就我个人而言,我宁愿不要。
统计学家的真正本质
大多数人没有意识到的是统计学家本质上是认识论者。因为没有魔法能把不确定性变成确定性,所以他们的角色不是产生真相,而是把合意的假设和可用的信息进行合理的整合。
毫不奇怪,许多统计学家对那些学习方程式却没有吸收任何哲学的“暴发户”反应尖刻。如果与统计学家打交道似乎令人疲惫不堪,这里有一个快速解决办法:不要得出任何超出你的数据的结论,你就不需要他们的服务了。(说起来容易做起来难,对吧?尤其是如果你想做一个重要的发射决定。)
草率的胡说八道还是一流的故事?
为了避免浪费时间,分析师应该把他们想说的故事摆出来,从几个角度戳穿它,并进行后续调查,看看它是否站得住脚,然后再提交给决策者。如果一个决策者因为一个鼓舞人心的故事而面临被迫采取重要行动的危险,那么的就是一个蝙蝠信号,让的统计学家突然介入,并根据决策者愿意接受的假设和他们的风险偏好来检查(当然是新数据)该行动是否是一个明智的选择。
分析师和统计学家的混合体
对于坚持事实的分析师来说,没有错,只有慢。将统计专业知识添加到“正确做事”中,在一个重要的方面错过了要点,特别是因为在探索性数据分析和统计严谨性之间有一个非常重要的过滤器:决策者。负有决策责任的人必须签署追求分析师洞察力的业务影响,这值得专家花费大量时间。除非分析师和统计学家的混合体也是一个熟练的决策者和商业领袖,否则他们的技能组合会形成一个中间有裂缝的三明治。
然而,弥合这一差距的分析师,其价值不亚于黄金。珍惜他们!
分析师和 ML 专家的混合体
分析师加速机器学习项目,因此双重技能非常有用。不幸的是,由于分析和 ML 工程在编码风格和方法上的差异,很难在一个人身上看到顶尖的专业知识(更难得的是,这个人在需要的时候表现得缓慢而富有哲理,这就是为什么真正的全栈数据科学家是一种罕见的野兽)。
低估分析师的危险
初学者没有意识到的是,这项工作要求顶级分析师比其他任何一种应用类型都更好地掌握数据科学的数学知识。除非任务足够复杂,需要发明一种新的假设检验或算法(T2 的研究人员 T3 的工作),统计学家和 T4 的 ML 专家 T5 可以依靠检查现成的软件包和测试是否适合这项工作,但他们通常可以跳过不得不面对方程本身。
例如,统计学家可能会忘记一个t-测试的 p 值的方程式,因为他们是通过点击软件包上的 run 得到的,但他们永远不会忘记如何以及何时使用它,以及对结果的正确哲学解释。另一方面,分析师不打算解读。他们在寻找一个血淋淋的,巨大的,多维数据集的形状。通过了解 p 值方程分割数据集的方式,他们可以形成原始数据集中的模式的反向视图,以产生他们看到的数字。如果不懂得数学,你就不会有这种观点。然而,与统计学家不同的是,他们不关心数据的测试是否正确。他们关心的是 t 检验能让他们对当前数据集中发生的事情有一个有用的了解。区别很微妙,但很重要。统计学家处理数据之外的事情,而分析师坚持数据之内的事情。在 peak excellence,两人都有深厚的数学功底,他们经常使用相同的方程式,但他们的工作完全不同。
类似地,分析师经常使用机器学习算法来分割他们的数据,识别引人注目的分组,并检查异常情况。由于他们的目标不是性能而是灵感,他们的方法是不同的,在 ML 工程师看来可能显得草率。同样,这是在不同的工作中使用相同的工具。
用一个类比来总结一下:别针被外科医生、裁缝和办公室工作人员使用。这并不意味着工作是相同的,甚至是可比的,鼓励你所有的裁缝和办公室职员学习外科以在职业生涯中取得进步是危险的。
研究人员的护理和喂养
如果这听起来还不够糟糕的话,许多领导者试图聘请博士,并过分强调 研究——而不是应用版本的统计学家和 ML 工程师 …而没有一个有价值、重要且已知不可能用现有算法解决的问题。
只有在你投资于一个研究部门,并且不打算询问你的研究人员最近为你做了什么的情况下,这才是好的。为研究而研究是一项高风险投资,很少有公司能够承担得起,因为从中得不到任何价值是一种非常现实的可能性。
只有当你有合适的问题让他们解决时,研究人员才属于研究部门之外——他们的技能是从零开始创造新的算法和测试,而现成的版本并不存在——否则他们将经历一个悲惨的西西弗螺旋(这将完全是你的错,而不是他们的错)。研究人员通常会花上十年以上的时间进行培训,这至少值得尊重,因为他们不会从事完全不相关的任务。
因此,在你的分析师帮助你确定了一个有价值的项目,并且试图用应用数据科学家完成它的努力已经失败之后,才是雇佣他们进行应用项目的合适时机。当你让职业发明家上场的时候。
VICKI JAURON, BABYLON AND BEYOND PHOTOGRAPHY/GETTY IMAGES image used with the HBR article. My favorite interpretation is that the human is a business leader chasing away flocks of analysts while trying to catch the trendy job titles.
感谢阅读!YouTube AI 课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
Enjoy the entire course playlist here: bit.ly/machinefriend
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。
深度学习之美背后的秘密酱:激活函数初学者指南
激活功能是获取输入信号并将其转换为输出信号的功能。激活函数将非线性引入网络,这就是为什么我们称之为非线性。神经网络是通用函数逼近器,深度神经网络使用反向传播来训练,反向传播需要可微分的激活函数。反向传播在这个函数上使用梯度下降来更新网络权重。理解激活函数非常重要,因为它们在深度神经网络的质量中起着至关重要的作用。在这篇文章中,我列出并描述了不同的激活功能。
- 恒等式或线性激活函数— 恒等式或线性激活函数是所有激活函数中最简单的。它对你的数据进行恒等运算,输出数据与输入数据成正比。线性激活函数的问题是,它的导数是一个常数,它的梯度也是一个常数,下降将是一个常数梯度。
Equation for Identity or Linear activation function
范围:(-∞,+∞)
例如:f(2) = 2 或 f(-4) = -4
- Heaviside(二进制步长,0 或 1,高或低)步长函数通常只在单层感知器中有用,这是一种早期的神经网络,可用于输入数据可线性分离的情况下的分类。这些函数对于二元分类任务非常有用。如果输入和高于某个阈值,则输出为某个值 A1,如果输入和低于某个阈值,则输出为 A0。感知器使用的值是 A1 = 1 和 A0 = 0
Equation for Heaveside/Binary Step Function (0 or 1, high or low)
范围:{0 或 1 }或 1
例子:f(2) = 1,f(-4) = 0,f(0) = 0,f(1) = 1
Source — https://en.wikipedia.org/wiki/Heaviside_step_function
- Sigmoid 或逻辑激活函数(软步骤)- 主要用于二元分类问题(即输出范围为 0-1 的值)。它有渐变消失的问题。由于输入(X)在输出(Y)中引起非常小的变化,网络在某些时期后拒绝学习或学习非常慢。它是一个广泛用于分类问题的激活函数,但最近。这个函数更容易使后面的层饱和,使得训练更加困难。计算 Sigmoid 函数的导数非常容易。
对于神经网络中的反向传播过程,你的误差将在每一层被压缩(至少)四分之一。所以,你的关系网越深,从数据中获得的知识就会越多。我们从输出层获得的一些“大”错误可能不会对相对较浅的层中的神经元的突触权重产生太大影响(“浅”意味着它接近输入层)——来源https://github . com/kul bear/deep-learning-nano-foundation/wiki/ReLU-and-soft max-Activation-Functions
Sigmoid or Logistic activation function
Derivative of the sigmoid function
范围:(0,1)
例如:f(4) = 0.982,f(-3) = 0.0474,f(-5) = 0.0067
Source — https://en.wikipedia.org/wiki/Logistic_function
Source — https://github.com/Kulbear/deep-learning-nano-foundation/wiki/ReLU-and-Softmax-Activation-Functions
- **双曲正切(TanH)——**它看起来像一个缩放的 sigmoid 函数。数据以零为中心,所以导数会更高。Tanh 比 sigmoid 和 logistic 激活函数收敛更快
Equation for Hyperbolic Tangent(TanH) activation function
范围:(-1,1)
示例:tanh(2) = 0.9640,tanh(-0.567) = -0.5131,tanh(0) = 0
Source — https://commons.wikimedia.org/wiki/File:Hyperbolic_Tangent.svg
- **整流线性单元(ReLU)——**训练速度比 tanh 快 6 倍。当输入值小于零时,输出值将为零。如果输入大于或等于零,则输出等于输入。当输入值为正值时,导数为 1,因此不会出现在 sigmoid 函数反向传播误差的情况下出现的压缩效应。
Equation for Rectified Linear Unit(ReLU) activation function
范围:[0,x]
例如:f(-5) = 0,f(0) = 0 & f(5) = 5
Source — https://en.wikipedia.org/wiki/Rectifier_(neural_networks)
From Andrej Karpathy’s CS231n course
- 泄漏整流线性单元(泄漏 ReLU) — 当单元不工作时,泄漏 ReLU 允许一个小的非零梯度。0.01 是小的非零梯度 qhere。
Equation for Leaky Rectified Linear Unit (Leaky ReLU) activation function
范围:(-∞,+∞)
Leaky Rectified Linear Unit(Leaky ReLU)
- **参数校正线性单元(PReLU)——**它使泄漏系数成为一个参数,该参数与其他神经网络参数一起学习。α(α)是这里的泄漏系数。
对于α ≤ 1 f(x) = max(x,αx)
范围:(-∞,+∞)
Equation for Parametric Rectified Linear Unit(PReLU)
- 随机泄漏整流线性单元(RReLU)
范围:(-∞,+∞)
Randomized Leaky Rectified Linear Unit(RReLU)
- **指数线性单元(ELU)——**指数线性单元试图使平均激活接近零,从而加快学习速度。研究表明,ELUs 比 ReLUs 具有更高的分类精度。这里,α是一个超参数,需要调整,约束条件是α ≥ 0(零)。
范围:(-α,+∞)
Exponential Linear Unit (ELU)
- 比例指数线性单位(SELU)
范围:(-λα,+∞)
Scaled Exponential Linear Unit(SELU)
- S 形整流线性激活单元(SReLU)
范围:(-∞,+∞)
S-shaped Rectified Linear Activation Unit
- 自适应分段线性(APL)
范围:(-∞,+∞)
- **soft plus—**soft plus 函数的导数是逻辑函数。ReLU 和 Softplus 在很大程度上是相似的,除了在 0(零)附近,softplus 非常平滑且可微分。计算 ReLU 及其导数比使用 log(.)和 exp(。)的提法。
范围:(0,∞)
Softplus
softplus 函数的导数是逻辑函数。
Derivative of the softplus function
Source — https://en.wikipedia.org/wiki/Rectifier_(neural_networks)
- 本特的身份
范围:(-∞,+∞)
Bent Identity
- Softmax- Softmax 函数将原始值转换成后验概率。这提供了一定程度的确定性。它将每个单元的输出压缩到 0 和 1 之间,就像一个 sigmoid 函数一样。但是它也划分每个输出,使得输出的总和等于 1。
Equation for Softmax function
softmax 函数的输出相当于分类概率分布,它告诉您任何类为真的概率
结论:ReLU 及其变体应优先于乙状结肠或 tanh 激活功能。以及 ReLUs 训练起来更快。如果 ReLU 导致神经元死亡,使用 Leaky ReLUs 或它的其他变体。Sigmoid 和 tanh 遭受消失梯度问题,不应用于隐藏层。ReLUs 最适合隐藏层。应该使用易于微分和易于训练的激活函数。
参考资料:
- https://en.wikipedia.org/wiki/Activation_function
- https://github . com/kul bear/deep-learning-nano-foundation/wiki/ReLU-and-soft max-Activation-Functions
- https://en . Wikipedia . org/wiki/Rectifier _(neural _ networks)
关于
在Mate Labs我们已经构建了 Mateverse ,一个全自动的机器学习平台,在这里你可以构建定制的 ML 模型,比 快 10 倍,而无需编写一行代码。我们利用专有技术、复杂管道、大数据支持、自动化数据预处理(使用 ML 模型的缺失值插补、异常值检测和格式化)、自动化超参数优化和等等,让分析师和数据科学家的工作变得更加轻松。
为了帮助您的企业采用机器学习,而不会浪费您的团队在数据清理和创建有效数据模型方面的时间,请填写类型表 此处 ,我们将与您联系。
让我们携起手来。
在 Twitter 、LinkedIn 上与我们分享您的想法
如果你有新的建议,请告诉我们。我们的耳朵和眼睛总是为真正令人兴奋的事情而张开。
之前我们分享过。
- 如何在 5 分钟内训练出一个机器学习模型。
- 公共数据集:用这些在 Mateverse 上训练机器学习模型。
- Mateverse 公测公告。
- 为什么我们需要机器学习民主化?
- 一个非常清晰的解释全有线电视新闻网的实施。这些研究人员如何尝试一些非常规的东西来实现更小但更好的图像识别。
- 我们的愿景。关于人工智能大家都没告诉你的事情
Vinho Verde 的秘密
本周的挑战是利用研究的力量来确定哪些 T2 因素促成了一杯上好的红酒。
至少有 3 名葡萄酒专家对 1599 款葡萄酒进行了测试,并给出了从 0 (糟糕)到 10 (优秀)的质量等级。
测量了 11 个因子:固定酸度*,柠檬酸,残糖,氯化物,游离和总二氧化硫,密度,pH,硫酸盐和酒精*。
Example of Normal (density) and Skewed (Free SO2) distributions.
单变量分析
查看每个因子并检查空值和异常值 ( 异常高或低条目)并做出相应的决策。
分布*(即密度)越“正常”,比较结果越好。对于具有偏斜分布的因子(即游离 SO2)* ,我测试了 log10 或平方根转换是否会改善这种情况,并相应地做出了决定。
双变量分析
现在使用 GGPairs 来寻找因素之间的相关性。
显著的 Pearson 的 R 结果以黄色(0.3-0.5 的小意思)或橙色(0.5-0.7 的中等意思)突出显示。我还在流程图上追踪了这个。
这导致了 3 个观察结果:
1.游离 SO2 和总 SO2 高度相关,但与其他变量不相关。
2。残糖与密度有很小的相关性,但与其他无关。
**3。三个关键因素:**酒精、挥发酸、硫酸盐。
关键因素 1:酒精
酒精含量越高,似乎意味着葡萄酒质量越好。
没什么10<为顶的质量。
没事没事> 12** 为降低质量。多数中间范围 (5/6) = 10。**
高于质量= 5 有一个明显的积极趋势。
其他变量呢?
随着密度的降低酒精的含量会略微增加(这并不奇怪,因为它们是相互关联的)。
当固定酸度较低而 pH 较高时,这种趋势更加明显。
统计结果还表明,这种关系可能是显著的。
关键因素 2:硫酸盐
图表显示硫酸盐和品质之间存在轻微的正相关关系,即品质越高的葡萄酒硫酸盐含量越高。
然而,统计结果并不支持这一点,所以我们对这种关系的信心要少得多。
关键因素 3:挥发性酸度
这里的图表显示了明显的负面趋势。高质量的葡萄酒往往具有较低的挥发酸含量。因为高挥发性酸度会导致酸味,所以这并不奇怪。
不幸的是,统计结果并不确定,所以我们也不能确定这两者之间的相关性。
结论
结果表明,以下因素可能有助于高品质的葡萄酒:
- 高酒精水平(超过 10)
- 低密度(低于 0.998)
- ●固定酸度**(低于 9)**
- ph 值更高(超过 3)
它们还表明了到之间的可能联系
- 低挥发酸度**(低于 0.75)**
- 更高的硫酸盐**(超过 0.5)**
但是对于这个数据集,它看起来并不重要。理想的后续行动是对随后几年进行匹配分析。该数据集记录于 2009 年。如果在过去的六年里收集了类似的数据,那将使我们得出更可靠、更有力的结论。
安全数据市场和分布式深度学习
单个项目中的人工智能和区块链听起来可能非常自大,但这不仅仅是营销废话,所以不要太早逃跑。深度学习可以做很酷的事情,但它通常需要大量的数据。此外,在许多情况下,这些数据是敏感的,人们不想分享这些数据。然而,有一种方法可以根据来自许多矿工的数据训练神经网络,同时保持其私密性。每个矿工将训练模型,但不能做出任何有意义的预测。模型的所有者将能够使用它,但不会获得任何数据。双赢。OpenMined 旨在为此开发开源工具包。
Mine, Syft and Sonar are the names of corresponding services
通用组件:
联合深度学习-计算每个用户的梯度并在通用模型中总结它们的方法。事实上它只是分布式随机梯度下降。它既有很好的理论属性,也在一些大型产品(如 Android)中得到了验证。
同态加密保护这些梯度到主服务器的安全过渡。he 的主要特点是可以对加密数据进行数学运算,解密后效果相同。由于计算成本高,它没有被广泛使用,但在过去几年中,一些有效的整数和浮点数类型得到了发展。
通过基于区块链的智能合约,所有的梯度和金融交易对矿商和公司来说都将是透明和安全的。
循序渐进
- AI Inc .创建了一个模型,并将其发布给矿工
- Miner 下载该模型,并根据他的数据计算该模型的梯度
- Miner 对渐变进行编码,并发送给 AI Inc .
- AI Inc .评估这些梯度如何改进验证集上的模型
- AI Inc .根据矿工的坡度值按比例支付报酬
- 重复 2-5 次,直到模型达到所需的精度
很酷,不是吗?OpenMined 团队将不得不应对许多挑战,如培训速度、评估质量、支付策略、安全性等。总之,整个想法看起来很有希望。你可以在本帖中找到加密分布式 DL 的技术细节。
公司可能会用它来训练医疗记录、个人资料、驾驶模式等敏感数据的模型。或者,他们可以合作创建一个通用模型,而不互相泄露他们的数据。或者,你可以挖掘和出售数据来获利。这些工具肯定会有很多用例。
如果您对更多细节感兴趣,请查看他们的 github、推介资料中的 Docs 文件夹以及公开会议的录音:
最初发表于 认知混乱 。
人工智能和机器学习中的安全和隐私考虑—第 2 部分:新资产
Where are the assets that need to be protected?
注:这是“人工智能中的安全和隐私&机器学习”系列文章的第二部分。以下是所有文章的链接(到目前为止):
- Part-1
- 第二部分(本文)
在上一篇文章中,我们从“传统”网络安全的角度(没有深入到 AI & ML 工作流的具体细节)看了从端到端考虑 AI & ML 生态系统和工作流时出现的关键挑战。在这一部分中,我们将开始放大 AI & ML 组件——从探索 AI & ML 带来的有趣的新资产开始。这一练习将帮助我们认识这些资产,使我们在执行威胁建模和为端到端系统选择安全技术时,能够将它们与其他关键信息资产一起对待。识别资产后,将更容易考虑攻击者破坏这些资产的机密性、完整性或可用性(CIA)的可能方式,每种类型的破坏可能对业务产生的影响,并系统地确保我们设计和实施针对这些攻击的适当保护。
在上一篇文章中,我们已经讨论了如何在端到端人工智能工作流的各个点上涉及大量的敏感业务数据,以及由于(a)新工具和框架的大量涌现,(b)系统/子系统的新类型和组合,以及©涉及的新利益相关方,我们已经看到了一些安全和隐私挑战。我们将从那里向前迈进,并通过其他层来识别与用于“学习”的业务数据量相关的“下游”有趣资产。
AI & ML 引入的有趣“新资产”
在一个非常简单的层面上,许多 ML 算法(尤其是那些与预测或分类有关的算法)本质上试图解决一个看起来像这样的数值问题:
y=w . x+b
这里’ x '表示输入(或特征),'y【T21]'表示过去数据中观察到的相应输出或结果。
因此,在房屋销售预测环境中, x 可能是影响其价格的房屋属性(如建筑面积、庭院大小、位置、条件等)。)和“ y ”可能是过去几个月房屋销售的价格。该算法的任务是发现最佳的’ w 和’ b ‘,它们可以解释过去的数据,并且可以用于做出良好的未来预测’ y ‘,给定先前未看到的输入’ x *'。*计算出“ w ”和“ b ”(以下统称为“权重”或“ w ”)的过程称为“训练”或“学习”。
一旦算法“学习”了权重“T24”w“T25”,我们就可以用它们来预测新投放市场的房屋可能的售价。(在大多数现实世界的问题中,对’ w '的求值涉及到对非常大的矩阵的计算密集型和昂贵的操作。)
在这个非常简短的概述的背景下,让我们看看从 AI & ML 中出现的有趣的新资产:
1。特点
在许多 ML 问题中,数据科学家与领域专家密切合作,为机器学习算法设计数据的最佳“表示”。这被称为“特征工程”,需要大量的努力和洞察力。领域专业知识有助于直觉判断什么可能是(或不是)值得考虑的有趣特征,数据科学家或统计学家有助于找出最合适的方法来考虑这些特征。因此,即使您从相同的训练数据开始,良好的特征选择和组合也可以产生更好的结果,并且从数据保护的角度来看,这使得“特征工程”的工件成为重要的资产。
(如今,模型自己“学习”这些特性变得越来越普遍,尤其是在较大的系统中。这项技术被称为“特征学习”或“表征学习”,其基本原理是输入所有可用的输入,并让算法(在内部)找出哪些特征重要,哪些不重要。当这种情况发生时,“特征”仍然保留在模型内部。也就是说,没有显式的称为“特性”的工件需要担心保护。然而,如果特性是手工设计的,它们就代表了一个有价值的工件,需要像对待任何其他信息资产一样对待。)
A typical ‘deep’ neural network
2。模型超参数
大多数机器学习算法都有几个“设置”,可以调整这些设置来修改算法的行为。这些设置可以被认为是定义底层机器学习模型的物理特征和行为的“设计选择”。例如,在线性回归的情况下,“学习率”是影响模型在搜索最佳权重时收敛(或不收敛)速度的因素。在深度神经网络的情况下(见上面的图片),有许多其他选择,如层数(网络的深度)、每层中神经元的数量(层的高度)、训练期间使用的批量大小、通过的次数、使用的优化方法等。等。
这些设置被称为“超参数,因为它们的选择会影响模型从训练数据中学习到的最终“参数”(即系数或权重)。在更大的问题中,可能会涉及到几十个这样的选择,需要做大量的工作来发现和确定能够提供期望结果的正确组合。在数据本身不是唯一的问题环境中(例如,在各方都可以获得数百万张图像的情况下的图像识别),这些超参数代表了一种竞争优势。换句话说,一旦您投入了大量辛勤工作来创建一个已经开始产生巨大成果的模型,相应的超参数对于您的组织来说与任何其他“高价值资产”(HVA)没有什么不同,无论它们位于何处,考虑保护它们都变得非常重要。
3。权重或系数
与超参数类似,模型学习到的权重/系数(上面的“y=w . x+b”中的“ w 和“ b ”)代表了模型在训练阶段从数百万条数据记录中收集到的所有宝贵“见解”。模型中的未来预测是使用这些权重对新数据点进行简单(通常也是快速)的数学运算。
就像“超参数”一样,这些砝码是“可重复使用的”。此外,与超参数相比,它们更易于重用。使用一种称为“迁移学习”的技术,其他数据科学家可以从您的模型导出的权重开始,进一步改进给定的解决方案,或者尝试解决原始问题的变体。事实上,这是数据科学家常用的协作技术。
然而,根据业务环境的不同,共享这些权重可能并不总是明智的(有意或无意)。例如,如果你是一家股票交易公司,你的团队制定了一个创新的基于 ML 的交易方案,你希望从中获得大量利润,你真的不希望另一个竞争对手利用这些权重进行“迁移学习”。(因为在类似的市场条件下,他们可能会开始做类似或比你更好的交易。)
The weights/coefficients of a model. (Source: Andrej Karpathy on Medium)
4。专业硬件上的计算投资
大多数大规模/现实世界的问题需要大量的计算时间来学习正确的系数。由于涉及大量基于矩阵的计算,大多数解决方案需要专门的硬件——现场可编程门阵列(FPGAs)或图形处理单元(GPU)——来以省时的方式计算权重。使用这些硬件技术是因为它们能够以高度并行的方式执行计算(高维矩阵计算就是这种情况)。
Specialized hardware is often needed to make ML time-efficient (Source: NVidia)
此外,由于拥有这些设备可能非常昂贵,而且技术一直在快速发展,大多数情况下都采用云托管服务来访问这些硬件,因此可以使用“按需付费”的模式。
A cloud datacenter (Source: Microsoft)
大多数人听到后会说“哇!”关于谷歌 DeepMind 团队创造的 AlphaGo 系统如何击败围棋世界冠军(一种靠蛮力计算和搜索深度都不够的高度直观的游戏)。然而,人们忽略了一个细节,那就是投入了多少计算工作。
AlphaGo playing Lee Sedol at Go (Source: DeepMind)
DeepMind 关于他们壮举的论文提到了42 天的训练时间和各种硬件进步,有些涉及 48 个张量处理单元(TPU),有些涉及 168 个 TPU——所有这些都托管在云中。
在许多现实世界的问题环境中,对计算的投资和由此产生的费用可能会类似地急剧增加。因此,在“ w ”矩阵中所有那些“权重”代表了大量的$$。此外,还必须小心对计算的访问,因为您不希望攻击者使用或重新利用它来满足自己的计算需求(例如试图从被盗的数据库中破解密码或增强其僵尸网络的计算能力)。
5。自定义算法
人工智能和人工智能领域正在迅速发展,因为有很多机会以创造性的方式和在新的问题领域应用这些技术。有趣的是,来自一个问题领域的算法和模型的现有“最佳实践”在应用于一个完全不同的领域时并不一定“延续”。也就是说,在一个问题领域产生优秀结果的东西在另一个领域可能不那么有效或有洞察力。因此,从一个在另一个环境中工作的解决方案开始的团队经常发现他们自己在开始得到有趣和令人兴奋的结果之前投入了大量的实验,并进行了重大的修改和改进。因此,如果你正在研究一个新奇的问题,当你有效地解决了这个问题之后,如果你看到一个专有的算法,你不应该感到惊讶。当这种情况发生时,恭喜您,您手头又多了一份需要保护的无价资产!
ML algorithms (Source: SciKit-Learn docs)
保护新资产
我们已经看到了 ML & AI 解决方案带来的有趣的新型信息资产——如工程特征、模型超参数、权重/系数、高度昂贵的计算以及定制或专有的 ML 算法。
这些新资产遭受的攻击可以分为两类。可以被视为“传统”数据篡改/数据窃取攻击的攻击,我们可能会在其他数据保护环境中看到这些攻击。(例如,从数据科学家的笔记本电脑或邮箱中窃取模型参数,或者从不受保护的文件共享中窃取权重。)保护这些资产免受这种“传统”攻击的技术和方法已经在上一篇文章中介绍过了。只要这些新类型的资产也包括在威胁目标中,并且在工作流的不同阶段(相应的资产出现的地方)建立了足够的保护,我们就可以认为这类攻击已被涵盖。
第二类也是更有趣的一类代表了源于人工智能& ML 算法内部工作方式的攻击。我们将在下一部分继续我们的旅程,并通过冒险进入 AI & ML 系统的“运行时”来探索这些。
People at work!
[在‘资产’的话题上,我还想提一下,在当前人工智能和人工智能人才相对于需求如此稀缺的时代,优秀的数据科学家和机器学习/数据工程师也是任何企业的宝贵资产。所有良好的人力资源实践,通过恰当的认可和奖励,让你最优秀的员工保持快乐、有挑战性和兴奋、有动力,等等。,应该对那些有所帮助!]
人工智能和机器学习中的安全和隐私考虑—第 3 部分:对“运行时”的攻击
Photo by Justyn Warner on Unsplash
注:这是“人工智能中的安全和隐私&机器学习”系列文章的第 3 部分。以下是所有文章的链接(到目前为止):
不适当或不完整的数据验证一直是程序和系统安全的祸根。在新的计算范式中,当系统本身从输入数据中“实现”(或定义)时,我们该怎么办?
欢迎来到对抗性机器学习的世界!
在本系列的上一篇文章中,我们探索了当人们考虑 AI & ML 的内部时,会出现的有趣的新资产。最后,我们观察到这些新资产的安全和隐私方面可以从两个角度来考虑——第一个是传统的数据安全/隐私(我们现有的分析可能的攻击点和设计保护的技术应该适用),第二个是基于 AI & ML 算法如何在内部工作。在本文中,我们将关注第二类攻击——涉及 AI & ML 算法运行时方面的攻击。
我们所说的“运行时间”是什么意思?
自动驾驶汽车长期以来一直是人工智能和人工智能领域的魅力和进步的衡量标准。你一定读过很多文章,看过很多视频,比如下面这个让我惊叹的视频:
在最近的一次演示中,当我要求举手表决有多少人愿意坐在后座时(播放完视频后),大约一百人中只有两个人举手!你有什么看法?
不管怎样,当我问汽车在陡峭弯曲的街道上行驶时看到了什么,答案包括“路边”、“标志”、“人”、“建筑物”、“障碍物”等等。真的是这样吗?或者这就是我们相信(或希望)汽车看到的情况?
在汽车的情况下,“视觉”大多是从一个流(漩涡?)的位,如下所示:
What is the self-driving car really ‘seeing’?
从那里开始,车辆中的各种系统一起工作,在这个过程中,应用概率、统计、向量代数、和大型多维矩阵上的浮点运算,以得出关于如何命令车辆(转向、加速器、刹车等)的决策。)实时而且——尽管有可靠的数学基础——潜在的决策过程有很强的概率成分。
考虑下图,其中描述了卷积神经网络(CNN)对“显示”给它的图像进行分类。如果我们快速看一下左边的图片,我们大多数人都不太可能认出图片中的车辆,除了“一辆汽车”。然而,正如你在网络的输出端看到的,CNN 对于它是什么有一个更“分散”的观点。事实上,网络的某些部分甚至认为它可能是一匹马!
Clearly a car but a small part of the network thinks this is a horse!
对抗性机器学习利用上述思想使 AI/ML 系统中的学习和/或预测机制“做错事”。这可以通过影响学习过程(当攻击者可以在学习权重或系数的同时提供数据)或在预测/操作期间(当攻击者可以让模型对攻击者选择的给定输入做一些错误或意外的事情)来实现。此外,在安全术语中,攻击可能以“白盒”方式进行(当攻击者知道关于模型内部的大部分事情,超参数等)。)或“黑盒”方式(当攻击者只能从“外部”通过观察系统对某些输入的决定(像任何其他最终用户一样)来探索系统)。在对抗性攻击中,从数学上来说,攻击者试图“扰乱”输入,使“这是什么?”的概率分布以对攻击者有利的方式变化。(因此,在上面的 CNN 例子中,对手可能试图将图像的某些部分调整到“刚好足够”,以便网络认为它是“马”的概率显著上升,并且“马”被投票为“正确”的分类。)
这里可怕的部分是,算法预测失误或行为不当所需的修改往往非常微妙,人类很容易错过。
Humans are used to ‘looking past’ the graffiti and stickers on traffic signs!
例如,只需几个精心放置的贴纸(通过视觉算法观察到的图像“变形”),自动驾驶汽车就可以快速驶过停车标志,就像是限速标志一样。现在,作为人类,我们很少会把停车标志当成其他东西——即使上面有贴纸、海报或涂鸦(如上图所示)。目前,让机器做同样的事情似乎并不容易。也就是说,对立的例子不可能欺骗人类观察者,但是会对 AI/ML 系统产生不利影响。研究人员已经发现并展示了一些技术,这些技术可以获取正确分类的输入图像,并进行选择性修改,以使网络将其分类为任何其他图像。例如,在这张纸的下面的图像中,在图像的选定位置添加一些点,任何给定的输入数字都可能被误分类为任何目标输出数字。
Adversarial examples for mis-classifying hand-written digits
顺便说一下——虽然我们已经谈论了神经网络,并从视觉相关的问题中提取了例子——类似的挑战也适用于其他学习算法家族(决策树、支持向量机等)。)和其他问题领域(例如,自然语言处理、推荐系统等。).此外,同样有趣的是,对立的例子似乎在算法家族之间“翻译”——即使算法的数学基础非常不同!因此,一种类型的模型的坏例子很可能服务于攻击者的目的,即使在其他类型的模型中。当攻击者试图进行黑盒攻击时,这给了他们很大的优势。
Macrovision 复制保护——一种平行?
对抗性机器学习让我想起了一种有趣的复制保护技术,称为 Macrovision(或 MV),它曾在 80 年代末和 90 年代的 VCR 时代流行过。(是的,电子内容保护甚至在模拟时代也很流行,在那个时代,现代 DRM 和 IRM 技术都无能为力!)
Content protection in the analog era
时代的需要是有效地阻止 T2 人复制从商店购买或租用的原版 VCR 磁带。Macrovision 的内容保护方法基于一项有趣的观察,即电视和录像机中的电子设备对噪声信号的灵敏度和响应之间的差异。MV 保护本质上是在原始录制内容上叠加一个精心制作的“噪声”信号。这种噪声信号使得接收该信号的另一个 VCR(例如,试图从受 MV 保护的原始磁带上进行录制)会以某种方式“补偿”该噪声,使得录制本身有噪声并且实际上不可观看(亮度、色带、抖动等的剧烈波动)。).然而,同样的(“噪声叠加”)信号发送到电视上会播放得很好,并且可以观看,没有任何副作用!
A VCR‘s response to ‘noise’ was very different than a TV
通常情况下,对抗性输入表现出类似的行为——对数据的干扰人类很难察觉,但完全摆脱了人工智能和人工智能的机器。
“Tay Bot”——一个反对学习幼稚的案例
考虑到敌对输入的可能性,现实世界的学习系统不能是幼稚的。这方面的一个很好的例子是由微软人工智能研究团队创建的人工智能聊天机器人 Tay Bot ,它在 Twitter 上发布,与其他用户进行对话,并学习“沿途”与人互动。然而,作为协调攻击“误训”它的结果,Tay 迅速变得令人不快,并开始发布各种煽动性的推文。它必须在发射后 14 小时内被击落!
The Tay bot survived for just 14 hours in the ‘big bad world’
抵御对抗性攻击——当前的想法
鉴于在现实世界场景中部署人工智能和人工智能系统的风险越来越高,目前一个巨大的挑战和研究领域是我们如何在对手面前正确学习。换句话说,我们如何才能让学习变得更加健壮,这样——系统不仅可以沿着一条‘快乐的路径’(由良好的输入和无害的用户组成)做正确的事情——而且在存在主动和被动对手的情况下都不能做任何错误的事情!
对于那些在各种背景下经历过几轮软件安全漏洞的人来说,这应该感觉像是似曾相识。在某种程度上是这样的。但是解决方案并不是那么明显。多年来,我们已经开发了许多防御措施,帮助我们的程序变得强大,可以抵御敌对的输入。然而,我们所有的成熟度和工具都是为人类编写程序的世界而构建的。在人工智能/人工智能的世界里,程序是由机器编写的(或者说是由机器内部“计算出来的”)——我们只是通过向机器提供大量数据(有时还有标签或奖励/强化)来帮助它们计算出程序。因此,在这个软件 2.0 的新时代——模型内部的许多工作方式仍然超出了解释的范围——我们几乎没有什么可以应付的。
那么,很自然的是,当前的许多重点是设计能够更好地解释他们的决策并在额外约束下工作的算法。例如,较新类型的神经网络(例如,胶囊网络或 CapsNets)可以提供更高级别的保证,并接受某些物理约束(例如,在直立图像中,不仅脸部有两只眼睛和一个鼻子,而且鼻子必须在眼睛下方)。这些应该有助于减少对手的“自由度”。CapsNets 还能够通过从最外层向后工作来重现“他们所看到的”,从而为可验证性提供了范围。令人欣慰的是,人们已经意识到安全问题以及在设计阶段解决这些问题的必要性。
关于安全的简要说明
当我们谈到健壮性的话题时,让我们看看 AI & ML 的“安全”考虑。一个重要的区别是,即使没有敌对的输入,这些也可以发挥作用。例如,下面这张来自这篇 Twitter 帖子的图片显示,一辆特斯拉的仪表盘上显示 101 号高速公路标志为“限速 105”。令人欣慰的是,似乎这辆车实际上并没有加速到 105 英里/小时,但这个例子应该足以突出令人担忧的安全隐患。(Twitter 上的帖子读起来很有趣——首先是几个关于“人类司机如何在 101 号高速公路上以 105 英里/小时的速度行驶”的笑话,几个对埃隆·马斯克的挖苦,一些对问责制影响的有效思考,甚至有人发布了一段代码片段,可能会避免一个灾难性的决定实际得到实施。)
解决 AI & ML 中的安全问题的方法是零碎的、特定领域的,并且(有时)“硬编码”以确保特定解决方案中的安全性。然而,随着系统变得更加自主,并开始做出可能产生深远影响的决策,有必要探索适用于各种环境和学习算法的通用解决方案。
A Tesla reading the Highway-101 sign as ‘Speed Limit 105’
(出于对安全和隐私风险的关注,我将把对这个相当有趣的安全话题的讨论限制在这里。如果你想阅读更多,这篇论文提供了一个广泛的安全处理和一个相关工作的无价的引用列表。)
接下来呢?
在迄今为止的文章中,我们已经研究了正确对待传统网络安全的重要性(第 1 部分),分析了特定于 AI & ML 的新资产(第 2 部分),并考虑了 AI & ML 系统如何工作所带来的安全风险(第 3 部分,本文)。
在下一部分中,让我们稍微转向积极/建设性的一面,看看 AI 和 ML 是如何在各种环境中被用来提高安全性的,以及攻击者是如何使用上述技术来破坏安全机制的。
人工智能和机器学习中的安全和隐私考虑—第 4 部分:安全用例
Photo by Enrique Alarcon on Unsplash
注:这是“人工智能中的安全和隐私&机器学习”系列文章的第 4 部分。以下是所有文章的链接(到目前为止):
AI & ML — use cases for security
在这篇文章中,我们将仔细研究 AI&ML 在各种与安全相关的用例中的使用。我们不仅会讨论网络安全,还会讨论一些一般的安全场景,以及基于人工智能和人工智能的解决方案是如何在所有这些领域变得越来越流行的。最后,我们还将探索攻击者可能规避这些安全技术的方法。
因此,让我们从一些有趣的领域开始,在这些领域中,安全特性受益于 ML&AI。
监控和响应
当我们考虑网络安全时,AI&ML 最常被提及的领域之一是解决大规模环境安全中的“大海捞针”问题。当你看到一个大的生态系统时,人类几乎不可能在噪音的海洋中发现真正的积极因素。多年来,我们一直试图通过制定越来越复杂的试探法来应对这一挑战,这些试探法依赖于基于规则的过滤,试图发现可能的可疑事件。然而,最终,基于规则的方法被限制在规则设计者已知或构想的模式范围内。也就是说,任何基于规则的方法只能从规则覆盖的有限空间中发现问题。最后,当基于规则的系统确实发现了可能的可疑活动时,在传统的安全运营中心(SOC)环境中,我们仍然面临着由于人的疲劳而遗漏它的风险。
Suspcious activity is far more challenging to identify in large systems
基于 ML 的系统可以毫不费力地解决以上三个问题!也就是说,它可以扩展到来自不同层的不同传感器的数十亿个事件,它可以“识别”新的、迄今为止未见过的攻击模式,并且它可以随时做出正确的判断,而不像疲惫的 SOC 工程师那样。基于 ML 的系统在 0 天攻击(基于签名的方法根本不起作用)和高级持续威胁(APTs)的环境中具有进一步的优势,在高级持续威胁中,攻击者在很长一段时间内秘密地取得进展,并明确试图保持在可能触发警报的阈值以下。
在线欺诈—金融和其他
另一个基于 AI/ML 的安全特性产生影响的有趣领域是欺诈检测和欺诈预防领域。在这里,早期的方法也是“基于规则”的,并提出了自己的挑战。例如,使用现有技术的企业发现,由于“假阳性”(来自好客户的交易被拒绝),他们损失的钱比系统标记的“真阳性”(实际欺诈案例)节省的钱多。因此,较低的“假阳性”率对他们来说非常重要。在这种背景下,基于人工智能和人工智能的技术显示出了更好的“精度”和“召回”指标的前景——更不用说能够检测到以前没有看到的异常。
Minimizing false positives is critical in fraud detection techniques
除了金融欺诈,还有许多其他欺诈检测领域采用了基于 ML 的技术。例如,风格测定领域采用基于 ML 的技术来识别写作和音乐中的作者身份欺诈(或者甚至基于对编码风格的分析来识别恶意软件的作者)。
Stylometry — not only for writing but also music (and code!)
高级身份验证
传统上,用户认证是在系统的入口点进行的单一的“一刀切”式的检查。在跨站点请求伪造(CSRF)等基于 web 的攻击盛行之后,当用户将要执行更具特权的操作(例如,转账,而不仅仅是浏览帐户余额)时,一些更敏感的场景开始通过额外的挑战(非常熟悉的 OTP)得到保护。然而,这些大多是增强身份验证的静态方法。随着 AI&ML 进入游戏,游戏场将会变得更好,而且是显著的改变。
Learning individual keystroke patterns
就在几年前,在一个网上银行的场景中,银行不能做出任何假设,除了线路另一端的人知道密码(如果是你的密码,那么一定是你的!).随着“多模态生物特征识别”(使用一种以上的生物特征识别)和“行为生物特征识别”(通过个人的打字模式或鼠标移动来识别个人等功能)的出现,身份认证的可信度开始大幅提高。
此外,在 AI&ML 的支持下,身份验证在本质上变得真正“自适应”,因为系统可以根据大量信号和环境条件(关于用户、正在使用的设备、地理位置、网络层指标、一天中的时间、活动性质等)做出决定。)在一系列互动的任何阶段,用什么因素来挑战一个人。这些自适应认证机制很可能成为未来大多数在线系统的规范。
乘客筛查
这些年来,机场的安全检查越来越严格。缓慢移动的队列和不得不把你的电子产品包翻过来(然后把所有东西都装回去)的痛苦是任何地方的每个人都一致感受到的……这甚至没有涉及到侵犯隐私和侧写等敏感问题。
“black DSLR camera near sunglasses and bag” by Anete Lūsiņa on Unsplash
这一切可能很快会变得更好。基于人工智能和人工智能的人脸识别系统(FRS)已经可以大规模部署,并与其他识别属性(如某人的行走风格(步态分析))结合使用。人们也在努力从实时 X 射线扫描中更好地识别可疑物体。例如,在 2017 年期间,TSA 赞助了一场数据科学家之间的全球竞赛,以帮助提高其乘客筛查系统的预测准确性,奖金为 150 万美元!
鉴于这一切,我们可能离一个愿景不远了,当你要赶飞机时,你只需进入机场,径直走向登机口,进入飞机,按照你的座位号就座。那不是常旅客(以及其他人)的乌托邦吗?
Can we fly like it is our own private plane?
大规模监视
说到人脸识别和物理安全,在监控和人群安全领域有很多有趣的场景。人群监控系统现在可以识别和跟踪大量人群中的个人——这在寻找和监视潜在的麻烦制造者方面非常方便。即使潜在的麻烦制造者以前并不为人所知,人群中的异常行为也可以用来更好地进行有针对性的管理。
AI&ML are making crowd surveillance tractable
在要覆盖的区域非常大的监控场景中,基于人工智能和人工智能的技术与它们在网络安全 SOC 场景中的表现非常相似——它们可以识别大量传入流中的异常,并且不太可能因疲劳而错过一些东西。
Surveillance of a large area
这些新功能有多简单?
寻找安全特性中的缺陷和弱点一直是攻击者感兴趣的领域。自然,在我们上面提到的许多基于 AI & ML 的安全特性的上下文中,同样的故事也在上演。
例如,人脸识别系统(FRS)已经被证明容易受到对人脸巧妙修改的影响。研究人员用这个展示了一些惊人的结果。在这篇有趣的论文中,作者展示了通过佩戴定制印刷的护目镜(见论文下面的图片),他们可以伪装成一个看起来完全不同的目标人物,骗过最先进的 FRS 系统。
Researchers wore custom-printed goggles to impersonate to an FRS system
这与我们之前在第 3 部分中看到的问题是相反的,当时我们考虑了一个稍加修改的停车标志的例子。在这种情况下,我们观察到人类绝不会将带有涂鸦的停车标志误认为除了停车标志之外的任何东西——然而机器却将其解释为完全不同的东西。相反,在下面描述的攻击中,人类不可能把上面的人误认为下面的人。然而,FRS 系统很容易被说服。不过,这两种攻击的基本技术是相似的。定制印刷的护目镜用于充分地改变输入矩阵(或向其添加扰动),使得其余的计算产生关于该人是谁的完全不同的结论。
类似的攻击也适用于基于语音的认证系统。在这种情况下,声音样本被组合或者使用声音变形技术来欺骗声音识别技术。此外,已经证明只有音素足以制作攻击样本。也就是说,不用等着偷偷录下你说’嘿,Siri ‘即使攻击者可以听到你说单个单词’',坐’, rim’ ',来自那里的音素可以组合成’嘿,Siri '!现在想一想,如果您是语音模仿攻击的目标,有多少种不同的方法可以收集您的语音样本?
安全性仍然是系统设计关注的问题!
有时,攻击者可以通过不特别需要击败系统的 AI/ML 组件来绕过基于 AI/ML 的安全特性。这里有一个很好的例子:
在一项名为海豚攻击的巧妙攻击中,研究人员能够向几乎所有的个人助理(Alexa、Siri 等)发送“听不见的”命令。)做各种事情,从“打开后门”或“订购此项”。这种攻击包括产生高于人类听觉范围的声音,然后解决问题,使其仍能被个人助理“听到”(因此得名“海豚攻击”)。
Dolphins communicate at frequencies above human audible range
一对巧妙的观察被用于策划实际的攻击。首先,个人助理设备中的麦克风通常响应声音信号而产生“谐波”,其次,这些设备中的下游电子设备被设计成滤除或忽略人类可听范围以上的频率(在期望人类执行命令的合理假设下)。因此,攻击将人类频率命令(h’)调制到一个听不见音高的载波信号(c’)上,产生一个组合(人类听不见)信号(c+h’)。当设备中的麦克风接收到该信号时,它会产生谐波(原始信号中分量频率的各种倍数/组合,即 2(c+h)* 、 2c+h* 、 c-h 等)。).你猜怎么着?其中一个产生的谐波恰好是’ h '!现在,低通滤波器负责消除人类不可能产生(或听不到)的一切,下游(设备更深处)记录的只是“ h ”。也就是系统的反应就像听到了主人的命令一样!
The Dolphin Attack uses harmonics
这次攻击很好地提醒了我们,归根结底,安全性是一个系统设计问题。仅仅集成一个复杂的基于 ML 的安全特性实际上并不能使系统更加安全。攻击者可能会到处寻找,为了真正提高安全级别,设计人员必须进行端到端的考虑,确保不仅新功能被安全集成,而且支持机制是在考虑安全性的基础上从头设计的。因此,基于 ML 的安全特性本身可能并不是系统中最薄弱的环节。但是攻击者在乎吗?
接下来呢?
我们从 AI&ML 被用于构建网络安全和物理安全领域的各种类型的安全特性的领域开始了这一部分。我们还研究了对这些功能的攻击是如何同时发展的。在本系列的下一部分,我们将看看攻击者如何通过对各种类型的攻击使用 AI&ML 技术而受益,以及攻击者如何能够“武器化”AI 带来一些可怕的可能性。
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
人工智能和机器学习中的安全和隐私考虑—第 5 部分:当攻击者使用人工智能时。
注意:这是“人工智能中的安全和隐私&机器学习”系列文章的第 5 部分。以下是所有文章的链接(到目前为止):
ML & AI as an attacker’s weapon
在上一篇文章中,我们回顾了 AI & ML 在安全相关场景中的一些建设性用例。然而,正如我们,防御者,已经开始越来越多地使用人工智能来提高安全性一样,攻击者也开始让攻击变得更加复杂!
让我们看看 AI & ML 是如何被部署和利用作为攻击者军械库的一部分的。与之前一样,我们将从网络安全场景开始,但也会触及围绕“武器化”的更广泛问题,以及对人工智能失控的担忧。
攻击者工具箱中的 AI & ML
现在让我们看看更广阔的空间,我们假设攻击者开始使用 AI & ML 作为他们武器的核心部分。
为什么验证码变得这么难?
你还记得就在 3-4 年前,当遇到挑战时,我们曾经愉快地“通过”的“简单”验证码吗?你从一张图片上读出一串弯弯曲曲的字母和数字,然后把它们输入文本框,瞧,你被认证为人类(而不是机器人)!如今,当我看到一个包含大量图像的验证码时,我会感到害怕(如果我需要完成的一个重要动作被这样的验证码保护,我会感到紧张)。似乎验证码不知何故把事情搞混了——它们提出的问题似乎对人类来说更难解决!
然而,这是攻击者使用 AI & ML 破解验证码的必然结果。图像识别和转录技术进步如此之大,以至于当攻击者热衷于使用人工智能/人工智能来绕过它们时,旧式验证码就是“活靶子”。这篇 BlackHat 论文详细介绍了如何结合机器学习,利用现有服务的巧妙即兴创作,破解目前使用的最复杂的验证码。
Do CAPTCHAs make you nervous these days?
适应性恶意软件和智能僵尸网络
就像通过使用人工智能和人工智能,身份验证等安全功能已经变得“适应性”一样,网络攻击也是如此。拥有机器学习能力的恶意软件可以“学习”在某个环境中什么可能有效,什么可能无效,并改变自身以通过防御和渗透系统。此外,一旦恶意软件进入目标系统,如果它可以为每个目标系统制定不同的隐藏策略,那么它不被检测到的机会就会大大增加。
Malware that can ‘learn’
攻击者经常使用一群被入侵的计算机来实施大规模攻击。这些通常被称为“僵尸网络”,由来自 C&C 指挥控制中心的攻击者控制。随着 AI & ML 的引入,这些僵尸网络被设计成“自我学习”和“智能”,使它们在发现可能的攻击点的方法上更加点对点,在决策上更加自主,而对 C&C 中心的依赖比传统僵尸网络少得多。这种方法将使这些群机器人变得非常高效,同时也非常致命。
Swarm botnets
机器学习破解密码
今天,许多信息安全都建立在密码学的基础之上。许多密码学原语都是基于密码学家设计的算法,其目标是通过使攻击者“在实践中很难”破解密码来实现“足够好”的安全性(而不是逃避性的“完美”安全性)。
例如,对称加密技术试图实现“伪随机”置换函数的效果。也就是说,实际上,对于不知道加密密钥的攻击者来说,明文块和相应的加密文本之间的映射看起来就像是原始块中比特的随机排列。
然而,要意识到在设计好的算法的这种“伪随机”行为和真正的随机性之间有一个差距。此外,隐藏密钥和算法的组合本质上代表了“伪随机”函数。
现在考虑,在他们的核心,ML 技术是关于发现一个隐藏的“目标功能”。一个强大的神经网络有可能用足够多的纯文本和加密文本样本“推断”出一个密钥吗?(注意,这里的“足够”可能是一个非常大的数字。然而,在密码学中,即使是超出算法理论难度的微小改进——通常表现为强力方法中的努力——也会被视为漏洞或弱点。)同样,在不知道密钥的情况下,给定一个新的明文,一个经过“训练”的神经网络能产生一个可能的密文吗?
Can Crypto be attacked using machine learning?
有趣的是,谷歌大脑团队似乎已经沿着这些路线(使用人工智能的加密攻击和防御)进行了一些工作,正如本文中概述的那样。虽然这个 Reddit 帖子让人们对这项工作的价值产生争议,但我觉得人工智能加密的风险并不完全是假设的,也不牵强。
在一个非常基础的层面上,AI & ML 已经开始极大地帮助攻击者的一个领域是加速对 crypto 的暴力攻击。暴力攻击的挑战之一是能够推断解密密文的暴力尝试何时产生“潜在有效”的明文。在过去,这需要人工检查,并大大降低了暴力攻击的速度。鉴于原始纯文本在许多常见用例中是自然语言,使用各种自然语言处理(NLP)技术来自动标记“看起来”像是有效消息的解密消息大大减轻了攻击者的负担。
社会工程及其他…
考虑到人类一直是系统安全中“最薄弱的一环”,“社会工程”领域是攻击者部署人工智能和人工智能的天然目标。
AI & ML 能做些什么让‘社会工程’攻击变得更可怕?
网络钓鱼邮件——社会工程师使用的一种更流行的技术——现在可以变得更有说服力和“个性化”。在过去,精明的收件人(或检测软件)可以推断出特定的电子邮件是一个骗局。然而,有了分析和捕捉一般上下文并模拟自然写作风格的能力,这项任务的难度就越来越大。此外,在过去,如果攻击者想要让特定/目标用户真正信服,他们必须手动进行大量的“攻击个性化”。今天不会了!ML & AI 解决了社会工程攻击的一个主要扩展挑战。
Future ‘social engineering’ will be AI-powered
如果我们看看基于电话呼叫的攻击,请注意今天我们如何经常听到另一端的陌生人的声音试图执行“社会工程”。基本上,某个你以前不认识的人(但掌握了一些关于你的信息)正试图说服你泄露敏感信息。然而,鉴于人工智能和人工智能的进步,未来另一边的人可能听起来像亲密的家庭成员(例如,在困境中寻求帮助的孩子或配偶)。当这种情况发生时,我们该怎么办?
这种攻击的另一端是 ML & AI 为“大规模社会工程”提供的能力。快速追逐这些会让我们陷入对民主等基本社会制度的威胁。如今的选举更多的是关于数据科学,而不是候选人的竞选承诺和跟踪记录,人工智能和人工智能已经提供了急需的技术,以可扩展的方式瞄准(和操纵)个体公民。(我们将在以后的文章中再次讨论这一方面。)
Democracy under attack?
我们的球场怎么样?在大多数司法管辖区,法院在了解和采用新技术方面往往落后。随着基于 ML 的音频和视频创作的进步,我们离能够制作一个完全无法从现实中分辨的假场景还有多远?视听证据的可采性会发生什么,当这种情况发生时,倒霉的法官该怎么办?
Fabricated evidence will get more real and convincing.
自主武器
进一步考虑这个“人类面临的风险”的主题,在“自主武器”的背景下,关于人工智能和人工智能的使用有很多争论。这就是反对自主武器的签名运动对这个术语的定义:
自主武器在没有人类干预的情况下选择并攻击目标。例如,它们可能包括武装四轴飞行器,可以搜索并消除符合某些预定义标准的人,但不包括巡航导弹或遥控无人机,因为人类可以做出所有的目标选择决定。人工智能(AI)技术已经达到了这样一个地步,即在几年内(而不是几十年内)部署这样的系统是可行的——即使在法律上不可行,也是可行的,并且赌注很高:自主武器被描述为继火药和核武器之后的第三次战争革命。
本质上,使用自主武器,人类被排除在最终的“扣动扳机”决定之外——本质上是授予 AI“杀人许可”。
即使在今天,人工智能和人工智能已经被广泛地部署在各种武器系统中,并为拥有这些先进系统的一方提供了显著的优势。然而,自主系统完全改变了等式,并带来了重大的道德和伦理困境——除了快速、不受控制的升级风险。几乎所有从事 AI & ML 开发的主要软件供应商都宣布了不参与这类武器开发的决议。但是,在资源丰富的国家有兴趣创建它们的情况下,这很难说是一种安慰。此外,如果我们回顾战争的历史——在机枪、潜艇和化学战的背景下也出现了类似的担忧——自主武器的最终部署和使用似乎是不可避免的。我们从过去的经历中非常清楚地知道,“跨国信任”是一个复杂的概念。各国可能会从事这样的工作,只是因为担心“如果我们不这样做,别人就会这样做”。
Autonomous Weapons — the next frontier of weaponization!
有一天 AI 会控制人类吗?
本文的大部分内容都是关于(人类)攻击者使用 AI & ML 作为他们工具包/军械库的一部分。然而,有一个很大的社区担心人工智能会发展成“意识”或“有自己的思想”并变得流氓。在这种情况下,我们必须把人工智能本身看作是一个对手!
这个场景涉及两个基本概念。
第一个是关于“特殊目的”与“一般目的”的智能。这更类似于在通用计算机出现之前,我们仍然拥有专用的、特定领域用例的计算机。用那个类比,我们目前仍然处于特殊目的(专用)人工智能的时代。我们有很多复杂的东西,并且看到了巨大的成果——但是是在垂直的、面向任务的领域(无人驾驶汽车、语音识别等)。).这些场景和支持它们的人工智能类型可以归类为人工“特殊”智能(ASI)。然而,正在进行认真的努力来征服下一个前沿领域,并创造可以称为人工“通用”智能(AGI)的东西——机器可以自己学习一系列不相关领域中以前未知的任务。
第二个概念是关于人工智能能力的指数级加速(这是我们所熟悉的,因为我们已经看到它在过去的其他技术中发生了)。在这里,预计在大约 15-20 年内,人工智能将与人类不相上下,尽管在人脑的能力和人工智能/人工智能系统的能力之间的映射上存在争议。将“意识”添加到这个画面中,可怕的可能性开始出现在未来,从那时起,我们进入了人工“超级”智能(ASI)的领域及其令人不安的含义。
这里要注意的一件重要事情是——尽管“人类智力水平”对我们(人类)来说似乎是一个重要的里程碑——对一个有意识的 ASI 来说,它甚至可能不仅仅是学术兴趣!
The road to ASI (Courtesy: Wait but Why — Tim Urban)
就我们而言,如果一个 ASI 出现了,那么现在地球上就有了一个全能的上帝——对我们来说最重要的问题是:它会是一个好上帝吗?
——蒂姆·厄本(等等,但是为什么
自然,这是一个激烈辩论的话题,讨论的双方都有来自“人工智能和 ML 中的名人”的头面人物(人工智能是否会接管 v. 仍然牢牢地在人类的控制之下)。然而,其他研究人员提出了一种不同的、不那么引人注目的方式来描述这个问题,即“如何构建人工智能,使它不会开发出与其创造者不一致的目标?”。
接下来呢?
在这篇文章中,我们触及了一系列非常广泛的问题——我们从利用人工智能和人工智能的网络攻击开始,一直到人类的生存问题。
虽然这个系列的标题是“AI & ML 的安全和隐私,但是到目前为止,我们只是零星地涉及了隐私。在下一篇文章中,我们将更加关注人工智能的隐私含义,以及正在开发的提供各种级别隐私保证的技术。
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
人工智能和机器学习中的安全和隐私—第 1 部分:现状
如今,关于机器学习(ML)和人工智能(AI)以及它们为几乎各行各业带来的用例,人们兴奋不已,议论纷纷。在如此多的领域中,我们现在已经有了成熟的解决方案,而且,我们不时地听到 ML & AI 在解决迄今为止尚未探索的问题方面有趣而有见地的应用,这让我们不禁“哦,哇!”。
随着部署的场景变得更加丰富和广泛,我们必须确保 AI & ML 的安全和隐私方面得到充分考虑。为了做到这一点,理解安全和隐私与人工智能和人工智能领域交叉的不同方式是很重要的。在本系列中,我们将一次一个“方面”地探索这些交叉点,目的是了解所涉及的风险的性质和程度,以及针对每种风险有哪些保护措施可用或正在探索中。
虽然我在信息安全和隐私领域有几年的工作经验,但相对而言,我对 AI & ML 还是个新手。(我们刚刚开始在工作中的云安全和开发运营项目中使用 ML 技术。)所以这个系列更多的是从一个安全人员的角度,以系统的方式对 AI & ML 环境中的安全和隐私进行推理。本系列的前几部分将集中在稍微狭窄的技术方面。然而,在这个系列的过程中,我们也将涉及更广泛的社会/社会问题。随着这个系列的发展,我很想听听这两个领域的专家对我组织演讲的方式的看法。
在这第一部分中,我将从网络安全的角度出发,从“让我们把基本的东西做好”开始,而不会深入到 AI & ML 的内部。在接下来的部分中,我们将开始仔细观察 AI & ML 组件。
人工智能和人工智能解决方案的传统网络安全
像任何新领域一样,AI & ML 带来了一堆有趣的人工制品,相关的细微差别和警告,从安全角度来看,它们构成了挑战。
下面的两张图片(来自微软 Azure 文档)显示了端到端 AI/ML 工作流的不同阶段涉及的典型工件和利益相关者团体。
The End-2-End Workflow — Lots of systems, data formats, tools, stakeholders, etc.
The diaspora of development tools, platforms, frameworks, data handling, etc.
此类图表强调了我们面临的安全挑战的性质和类型的以下特征:
- 有一个由(一些旧的,一些新的)工具、语言、框架组成的庞大生态系统,其功能包括数据摄取、数据预处理、建模、模型评估、集成、可视化、打包和部署等。
- 从传统的软件工程师到机器学习工程师、数据科学家和统计学家,多个利益相关者群体都参与到任何项目中。
- 完整的工作解决方案通常涉及在不同接口耦合在一起的多个系统。
从安全的角度来看,这是很多未知的新事物。我们正在寻找许多新的工具和框架,新的人(利益相关者团体)和新的系统或系统的组合。暂且抛开人工智能& ML 的细节/内部机制,在这样的背景下,即使仅仅是传统的网络安全也很难做得很好。这是因为新的工具和框架通常需要时间来变得“足够安全”,新的利益相关群体可能并不总是对安全性有统一的理解或认识,第三,涉及许多系统和接口的解决方案在边界/接口处有过有趣的安全失败历史。
关于数据科学中“数据”的一点注记
现在让我们看一下“数据安全”方面。在人工智能和人工智能的背景下,数据安全挑战的以下特征非常突出:
- 在大多数解决方案中,巨大(巨大!)涉及大量的业务数据。我们谈论的是数百万甚至数十亿张唱片。而且,根据问题领域的不同,这些信息可能具有巨大的价值(例如,经纪公司过去的交易)或敏感性(例如,来自连锁医院的病历)。
- 此外,不仅涉及大量数据,而且更倾向于考虑数据的所有属性/方面(维度)。这与隐私的“数据最小化”原则产生了有趣的矛盾。
- 与传统的软件工程不同,在 AI & ML 中,通常不能在测试/预生产阶段使用“虚拟数据”。(整点讲的是‘从数据中学习’!)因此,在生态系统的所有点上,我们都在谈论处理宝贵的真实数据的各种利益相关方和各种系统。(例如,协作开发模型的数据科学家团队必须在实验过程中访问许多相同的数据,而这些数据是您多年来在生产系统上精心保护的,这导致业务数据进入了过去通常不会进入的系统。)对各种数据的多次迭代和请求可能会破坏您现有的任何数据治理。
- 鉴于 AI & ML 已经进入了各行各业,我们正在寻找数百种迄今为止晦涩难懂的数据和记录格式(以及相应的阅读器、编码器和解码器)。我们有着丰富多彩的安全漏洞历史,只是在少数更流行的编码格式中。当我们考虑到乘数效应时,想想未来会发生什么。
第一步:做好基础工作
虽然这些挑战确实令人望而生畏,但对于安全从业者来说,上述许多挑战并不陌生。我们过去经历过技术范式的转变。我们已经看到了良好安全性的基本原则是如何保持不变的,以及如何在仔细理解任何新环境/生态系统的细微差别和独特要求后应用它们。在一天结束的时候,它应该归结为做好最基本的事情——也就是说。,
- 确保所有团队成员/利益相关者对安全性和隐私有很好的基本了解,如数据分类、数据保护技术、身份验证/授权、隐私原则、适用的法规要求等。目标应该是确保所有利益相关者对安全和隐私有适当的理解,并且每个人都使用相同的术语,知道并理解相关的政策和标准。
- 拥有良好的数据治理结构。随着数据在每个工作流程的不同阶段易手,各利益相关方的所有权和责任应该是明确的。考虑到 ML & AI 项目中不可避免的数据的广泛流通,这一点尤其重要。
- 在组件级别和从端到端的角度对解决方案进行认真的威胁建模。这将确保安全性被“内置”到设计中,并且在端到端系统中的每一点(处理、存储或传输有价值的数据的地方)都满足适用的安全性要求。
- 在威胁建模时,应该特别注意不同子系统之间的边界和接口。任何一方在这些接口上所做的假设都应该清楚地记录和验证。
- 此外,因为生产数据无处不在,所以请确保详尽地涵盖威胁模型中的所有工作流—从最早的实验和概念证明开始,到将在生产中部署的完全可操作的系统。
- 确保在实施过程中遵循良好的编程实践,并根据所使用的技术减轻相应的漏洞(例如,如果解决方案的某个部分基于 web,则必须保护身份验证令牌/cookie 免受 XSS、CSRF 等攻击。)
- 通过执行功能安全测试和渗透评估的组合,确保在威胁建模过程中识别的、被认为足够重要的所有威胁/风险都得到实际解决。
- 确保不同框架和子系统的本机安全模型得到充分理解和合理化,以实现整个系统的统一安全性。这一点尤其重要,因为多个可能完全不同的组件和框架将“粘合”在一起,组成端到端的解决方案。
- 对于在项目的不同阶段被不同的利益相关者使用或者被导入到不同的“管道”中的软件组件要小心。在可能的情况下,使用经过验证和签名的组件,如果这不是一个选项,则考虑其他因素,如开发人员的声誉、使用范围、存储库的可信度、评论和审查、安全问题/漏洞的历史等。这些应该有助于从安全质量的角度评估组件是否足够好。
- 考虑您的部署(CICD)管道的安全性。你能很好地控制谁能改变构建/发布环境吗?您是否充分保护了部署所需的任何机密/连接字符串?您的生产设置是否足够严格,以至于人们无法进行特别的配置更改?
- 实行良好的监控和安全卫生。确保所有软件组件都处于最新的安全补丁级别,定期进行访问检查,轮换密钥/证书等。
- 最后,一定要有一个好的事件响应计划,这样如果灾难真的发生了,你就可以应对。
好了,我们到了!对于安全专业人士来说,以上这些听起来都不新鲜。你过去一定在不同的问题环境中做过一些或所有这些事情。因此,AI & ML 的安全和隐私的第一个方面是在新的环境中应用所有的专业知识,同时与所有相关的利益相关者合作。
但是要意识到,到目前为止,我们已经将系统的 AI & ML 组件作为一个“黑盒”来对待。当我们更仔细地观察这个盒子时,事情开始变得有趣多了。这正是我们将在本系列的下一部分中探讨的内容。期待再次见到你!
注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
参见机器人游戏:探索人类和机器的好奇心。
好奇心在人类和人工智能代理中的作用。
你可以在文章末尾找到一个 GitHub 存储库,里面有重现实验的代码。
F 从生存的角度来看,驱动动物和人类的主要生物需求并没有特别的不同。人类和动物需要吃和喝才能生存,需要庇护,他们有一种繁殖的冲动,以保持物种的生存。但是,很明显,人类和动物的行为完全不同。这是为什么呢?
人类大脑的进化创造了动物不存在或特别发达的区域,如前额皮质,这是一个通常负责推理、规划和逻辑思维的区域。大脑的这种发展导致了完全不同的冲动和驱动力的产生。其中之一在很大程度上驱动了人类的行为。这是电影和图书产业存在的原因,举几个例子,这是几个世纪前探险家航行数月的原因,也是你阅读这篇文章的原因:好奇心。
好奇心是寻找意想不到的东西的冲动,是探索、发现和揭开面纱的需要。它经常被描述为智慧物种的一个特征:探索和扩展知识的需要甚至在伟大的希腊神话中就被认为是定义智慧和美德的女人和男人。
因此,在人类的好奇心和人工智能之间建立联系是很直观的:研究人员认为,在人工大脑中模仿这些现象将是创造真正的机器智能的基础。在这篇文章中,我们将探索如何在智能体的电子大脑中创造好奇心,以及它对其行为有什么影响,发现它将如何导致在某种意义上非常人性化的行为。
我们在这篇文章开始时谈到了需求和冲动。我们如何在机器中模拟那些生物信号?一个非常流行的框架是强化学习 (RL)。在 RL 中,智能体(如机器人)可以观察环境和自身的状态,如其在空间中的位置,并采取相应的行动。代理人的主要目标是获得高额报酬。奖励是我们定义的信号,它应该告诉代理哪些行为是好的,哪些行为应该避免。从生物学的角度来看,积极的回报可以通过饮食来给予。消极的奖励可能是通过对自身造成伤害来给予的。比如像吃豆人这样的电子游戏,吃水果会有奖励,而被鬼吃了之后会有负奖励,而这就足以教会玩家如何打败游戏了。
近年来,深度强化学习取得了巨大的成就,比如学会了以超人的水平玩雅达利电子游戏,打败了世界上最好的围棋选手,学会了如何控制复杂的模拟机器人。让我们关注最后一个例子:为了教会机器人移动,环境奖励代理向前移动而不是摔倒,因此 RL 算法通过试错来学习导致向前移动的行为,例如步态或行走模式。这些奖励被称为外在:它们来自环境,它们是任务的一部分,因此代理可以学习如何完成任务。但是还有第二种奖励:内在奖励。内在奖励不是环境的一部分,而是由代理本身产生的。代理可以奖励自己发现新事物或达到新的未知状态,无论最终的环境任务是什么。在这一类别中,我们可以找到好奇心:这的确是对发现新奇事物的一种奖励,就像你发现了一篇新的有趣的文章、一本书或一家餐馆时的奖励一样。那么,好奇心是如何在代理中产生的呢?为了理解这一点,我们必须首先理解什么是预测正向模型。
Explorers sailed to discover new lands driven by curiosity.
在计算机科学和控制理论中,我们可以创建模型,在给定当前状态和动作的情况下预测下一个状态。这些模型通常是神经网络,根据经验预测行动对未来的直接影响。你知道用一定的力量把球抛向空中会发生什么,因为你以前经历过。因此,神经网络可以通过从以前的观察、行动和新观察的经验中学习,来学习预测下一个机器人手臂将会发生什么。简而言之,这是一个预测性的正向模型。
从某种意义上来说,你的大脑在不断地根据刚刚过去的事情预测不久的将来。正如一些神经科学研究所表明的,大脑是一台预测机器。因此,如果事情没有按预期进行,你会感到惊讶。你可能几乎每天都走同一条路线去上班,所有这些记忆都渐渐消失了。但是如果有一天你看到一辆车在路中间着火了呢?几年后你肯定会记得这件事,甚至可能记得确切的日期。同样,这也是为什么你要读一本书、一篇文章、看一部电影、去某个地方旅行:去看看和学习一些你没有预料到或已经知道的东西。既然我们知道什么是正向模型,这种驱动冲动可以在机器中复制:人工智能代理可以通过采取导致其达到令人惊讶的状态的行动来奖励自己。从计算上来说,惊喜是预期的未来和实际发生的未来之差,从一个状态,做某个动作。
我们现在可以介绍我们将做实验的环境:一个模拟的取物机器人,它可以用手臂推着一个盒子。这是著名的 OpenAI 的健身房图书馆里的 FetchPush-v1 环境。代理的目标是将盒子推到它的目标位置,即红色的球。但是我们现在不关心这个任务:正如之前解释的,我们对内在奖励感兴趣,我们想看看通过用好奇心引导代理会发生什么。
我们机器人 Fetch 可以在三维空间内移动它的末端执行器。每走一步,它都能观察到自己在空间中的位置,以及立方体的位置。我们可以在智能体中创建一个内部预测向前模型,通过简单地移动手臂,让它体验它的环境。基于这种经验,代理将很快了解当它给它的手臂一个命令时会发生什么:手臂在指定的方向上移动一点点。因此,前向模型在预测手臂运动方面将很快变得非常好。但是当给手臂一个动作命令时,第二件事可能发生:手臂可以触摸立方体并移动它。虽然这对我们来说很直观,但对像婴儿一样第一次探索世界的机器人来说却不是这样。学习预测立方体被触摸时会发生什么是非常困难的,这既是因为接触力的复杂物理学,也是因为在最初的探索中,机器人只会触摸立方体几次,因为整个操作空间相当大,而立方体非常小。所以,机器人将体验到立方体在 99%的情况下不受手臂移动的影响,并且可能认为立方体永远是静止的。因此,预测正向模型将很难预测立方体的移动。这里我们可以看到好奇心对机器人的影响。
Two of the Fetch gym environments. We will focus on FetchPush (left).
既然机器人已经学会了最初的前进模式,我们可以让它在好奇心的驱使下更多地探索环境。然后,机器人将尝试寻找结果令人惊讶的动作。正如预期的那样,移动手臂对机器人来说通常很无聊,因为它很清楚会发生什么。但是,一点一点地,它会知道它发现在触摸立方体时会发生什么令人惊讶的事情。立方体以一种不可预测的方式移动,这是它感到惊讶的原因,激起了它的好奇心。因此,就像婴儿一样,机器人将学习玩立方体,因为从某种意义上来说,这很有趣。有趣的是,它发现当它把盒子推出桌子时,最不可预测的事情发生了,盒子掉在了地上。
Fetch learns to play with the cube guided by curiosity.
机器人已经学会在没有任何外部指导或信号的情况下玩立方体**。它不知道任务的目标,它只是试图探索周围的世界,并试图发现令人惊讶的事情,因为它很好奇。这种简单的内在动机使它发现了立方体,就像玩具一样是它现在的主要兴趣。正如在这篇博文中所描述的,好奇心可以极大地帮助一个特工探索周围环境,发现原本看不见的东西。有了好奇心,智能体可以学习激活环境中的罕见事件,并逐渐了解复杂系统的所有底层机制。**
近年来,人工智能领域的研究人员已经在广泛的环境中研究了好奇心对智能体的影响。最有趣的结果之一来自于将好奇心应用到玩电子游戏的代理人身上。最近的一项研究表明,如果有好奇心的引导,一个代理人可以在没有任何外部奖励的情况下学会玩几个级别的超级马里奥兄弟。它对打破记录没有兴趣,只是对发现接下来会发生什么有着强烈的兴趣,并渴望发现新的和意想不到的东西。在这个游戏中,最好的方法就是在一个关卡中前进并发现下一个区域。为了做到这一点,代理人必须学会如何生存,避免敌人和陷阱,只是为了发现新的东西。
另一项研究展示了这种情况在几款雅达利视频游戏中是如何发生的:代理人可以通过遵循这种内在奖励来学习如何玩好一款游戏。但真正有趣的是研究人员在论文中写道的一个结论:这个结果不仅是人工智能的一项成就,也是对人类好奇心影响的一个很好的洞察。我们玩电子游戏是因为它们很有趣,它们是新的刺激、体验和挑战的来源。因此,一个设计良好的视频游戏应该围绕奖励玩家的好奇心来创建,这就是为什么由好奇心驱动的人工智能代理可以学习玩这些游戏。
好奇心是人类智力的重要组成部分。它不仅是人类行为的特征,也是构建进一步智能和知识的重要工具:没有好奇心,我们就无法发现新事物,除非它们撞上我们。这就是为什么,要建造真正智能的机器,就必须对好奇心和其他内在刺激进行描述和建模,这些刺激是由我们的大脑产生的,并推动人类不断进化。
觉得好奇?你可以在这个 GitHub 库里找到所有的代码。
谢谢你读到这里!你可以在推特(@normandipalo)上关注我关注我的工作和研究。
Seed AI:历史、哲学和艺术状态
让我们把超智能机器定义为一种能够远远超越任何人的所有智力活动的机器,不管这个人有多聪明。因为机器的设计是一种智力活动,一台超级智能机器可以设计出更好的机器;毫无疑问,那时将会出现“智力爆炸”,人类的智力将会被远远地抛在后面。因此,第一台超智能机器是人类需要制造的最后一项发明,只要这台机器足够温顺,能告诉我们如何控制它。(欧文·约翰·古德,1965)
上面的引文包含了对术语智能爆炸的第一次提及和解释。从那以后,人工智能领域发生了很多事情,无论是哲学上还是实践上。尽管自 1965 年以来,该领域已经取得了巨大的进展,但与智能爆炸的想法密切相关的术语“种子人工智能”相对来说是闻所未闻的。
什么是 Seed AI?
种子人工智能是人工智能研究者和理性倡导者 Eliezer S. Yudkowsky 创造的一个术语。在我们讨论种子 AI 的定义之前,有必要讨论一个人工通用智能。我会用维基百科的定义:
人工通用智能 ( AGI )是一台机器的智能,它能够成功地完成人类能够完成的任何智力任务。
继续讨论 Seed AI,LessWrong 的 Wiki(由 Yudkowsky 创建的一个流行博客)对这个术语的定义如下:
一个种子 AI (一个由 Eliezer Yudkowsky 创造的术语)是一个人工通用智能 (AGI),它通过递归地重写自己的源代码来改进自己,而无需人工干预。
同一篇文章中提到了 Seed AI 的几个关键特征:
- “了解自己的源代码。”因为一个 AI 是的源代码,这意味着它理解本身。如果一个人工智能不理解自己代码的“目的、语法和架构”,它就不能成为种子人工智能。
- "重写自己的代码。"这已经在定义中了,但重要的是要指出它是在没有人类干预的情况下做到这一点的,并且更好地实现了它的目标。
种子人工智能的目标可以是任何东西。例如,Nick Bostrom 创建了一个著名的思维实验,其中中央人工智能的目标是最大化宇宙中回形针的数量。因此,重写自己的代码使它变得有趣。
AI-Foom
种子人工智能可以从相对较低的智能水平开始。然而,如果它足够聪明,可以重写它的源代码以变得更聪明(也就是说,更好地实现它的目标),结果它甚至可以更好地重写自己的源代码以变得更聪明。这个可能导致智能爆炸,人工智能迅速变得超级聪明(远比列奥纳多·达·芬奇聪明)。
Will AI ever reach for the clouds? Photo by Samuel Zeller on Unsplash
这种“傻瓜”的可能性已经被争论了很多,也许最著名的是由埃利泽·尤德考斯基和罗宾·汉森提出的。对他们争论的全面讨论超出了这篇文章的范围,但是他们讨论的一个(明显的)关键点是种子人工智能变得更加智能的速度。Yudkowsky 认为,人类的结构变化(DNA 的变化)导致了相对较大的智力差异(比学习更大),因此,有能力改变其结构(代码)的人工智能可以使其智力产生巨大差异。另一方面,汉森认为,虽然可能性可能存在,但这并不一定会给人工智能智慧来做出正确的结构变化。他们的讨论远不止这些,但这部分已经很有趣了。
哥德尔机器
Seed 人工智能的一个理论模型是由 Jürgen Schmidhuber 在 2003 年提出并以库尔特·哥德尔的名字命名的哥德尔机器。哥德尔机器从其环境接收输入,并产生能够影响其环境的输出。在任何给定的时间,哥德尔机器都希望最大化它的效用函数,代表它在环境中成功地实现了它的目标,不管这个目标是什么。然而,关键的是,如果哥德尔机器能够证明新代码在最大化其效用函数方面更好,那么它有能力重写自己的源代码。这正是种子人工智能所需要的:人工智能重写其源代码,以便能够更好地实现其目标。
还没有人造出哥德尔机器,但是理论上是可能的。
技术发展水平
你可能知道,据我们所知,还没有人建立一个种子人工智能。然而,有一些组织正在为此而努力。这种组织的一个例子是机器智能研究所(MIRI)。MIRI 的工作(到目前为止)主要是理论性的,侧重于有益的机器智能的数学基础。OpenCog 基金会有一个更实际的方法,旨在通过开源计划开发有益的一般智能。
种子、卫星和传感器——科技如何种植今年的作物
他们说成功是 90%的准备和 10%的汗水的结果。这适用于许多活动及其潜在结果。农业就是这样一种努力,计划和准备是成功收获的主要因素。
为健康茁壮的作物打下良好的基础至关重要。在撰写本文时,几乎是春天了,所以对许多种植者来说,种植指日可待。由于作物生长和繁殖周期的性质,农业具有很强的季节性。每种作物都有一个健康种子发芽所需的土壤温度、湿度和肥力的最佳窗口。
这个播种窗口是生长季节最关键的时期之一。对于种植者来说,在正确的时间将正确的种子与正确的土壤相匹配是重中之重(仔细权衡,试图确定各种商品的市场价格走向)。
一旦播种开始,接下来就是执行了。将适量的种子放在合适的深度,让它们同时发芽,有助于管理风险。统一的作物意味着相同的护理和管理措施可以应用于整个季节(假设不存在其他主要的可变性来源)。
然而,如果种子在不同的时间发芽,那么作物的成熟度和整体健康状况会在整个田地中发生变化。正在进行的作物季节变化管理可能会出现问题,并可能导致收获时产量的重大损失。
幸运的是,现有的技术可以帮助种植者高精度地管理播种。目标是建立一个坚实的基础,使作物能够茁壮成长。一些新兴的精量播种技术可以改装到现有设备上,而不需要购买大量资本。
事半功倍
随着商品价格在可预见的未来保持在历史低位,种植者不太倾向于购买新设备。然而,他们确实认识到需要不断改进他们的经营,并寻找新的方法来提高产量、降低成本和增加农场利润。
农业是资本高度密集的行业。以中西部一个 2000 英亩的玉米和大豆农场为例。资本成本可能包括每英亩约 5,000 美元的土地价值、300,000 美元的大马力拖拉机、200,000 美元的精密播种机、350,000 美元的联合收割机……你明白了吧。
除此之外,农民每英亩还必须投入数百元用于种子、化学药品、肥料和其他投入成本。正如你所看到的,一些农民可能有数百万美元的收入,却无法保证他们年底的作物收入。
资本设备最终会磨损并需要更换,然而,如果种植者目前的机器处于良好的工作状态,那么当利润如此之低时,就没有必要更换它。播种机技术就属于这一类。一台新的精密高速播种机的成本可能高达 25 万美元,而升级现有播种机的成本约为 4 万美元。
通过将正确的硬件升级与正确的精准农业软件相结合,经济回报将变得非常可观。此外,在大宗商品价格上涨后,效率的提高每年都会持续很久。
种子、卫星和传感器
农业中有许多活动部件,需要考虑大量信息。幸运的是,技术正在帮助消除分析和规划阶段的大量繁重工作。
现在农民在种植过程中可以利用的一些技术包括:
种子科技
- 种子杂交技术(使种子特性与土壤和条件相匹配)
- 种子处理(建立抗虫害和杂草能力)
- 种子微生物(处理种子以减少肥料需求)
卫星
- 种子位置的精确放置(精确施肥)
- 卫星参考数据(对理解现场可变性至关重要)
- 实时季节图像(测量作物生物量的卫星图像)
传感器
- 关闭控制以防止种子重叠(使用较少的种子)
- 单行控制(使种子品种与土壤类型相匹配)
- 精确的下压力系统(均匀的种子深度和出苗)
投资回报
所有这些技术都提供了一定程度的经济回报。例如,消除种子深度、重叠和位置的可变性具有明显的投资回报。各种自动化下压力技术的制造商报告称,与传统系统相比,玉米产量每英亩可提高 10-11 蒲式耳。因此,即使玉米价格为每蒲式耳 3.50 美元,这也相当于可观的回报。
假设整个作物的平均产量每英亩增加 5 蒲式耳。在前面引用的农场示例中,2000 英亩的农场每英亩 17.50 美元,即第一年 35000 美元。几乎一年就能收回硬件升级成本,这意味着投资在接下来的几年里会产生正回报。
土壤类型的可变性越大,控制下压力的需求就越大,潜在回报也就越大。新的自动化设备还带来了其他好处,因为在换季期间减少了重新校准和设置。
数据驱动决策
当结合新一代自动化精准农业软件工具,如 AgDNA 时,回报甚至会更高。这些基于云的大数据工具能够分析上一季数百万英亩的土地,以确定最佳的种子和土壤组合。
每年都有这么多新的杂交种子技术被引进,种植者几乎不可能确定哪一种适合他的操作。然而,AgDNA 等新一代大数据平台可以在云端运行这些预测分析,并产生惊人的结果。
对大量数据集进行基准分析,以确定给定土壤类型和其他属性的最佳种子品种,可以带来每英亩 30 美元以上的回报。对于种植者来说,这是非常宝贵的信息,不仅可以让他们了解什么最适合他们的农场,还可以让他们根据选择参与标杆管理服务的其他种植者的经验获得洞察力。
结论
因此,尽管 2017 年农业大宗商品价格前景看好,但种植者仍有重大机会利用新兴硬件和软件技术,获得明显的经济回报。作物生产行业作为一个整体,在寻求更高的产量和更高的效率方面继续推进创新的边界。
因此,下次你在杂货店或吃你最喜欢的谷物时,请放心,全国各地的农民正在采用创新技术和耕作方法,以实现更可持续的未来。
从决策树看随机森林——对随机森林的一种解释
So many bagged decision trees, so little processing resources.
在过去的这个周末,我有点无聊,决定温习一下我的简历。作为一名在 Insight 的研究员,我几乎完全是用 Python 编程的,但我实际上没有做过太多的 R 语言预测分析,除了非常普通的线性回归。我想要一个有点干净的数据源,这样我就可以在 r 中进行建模了。因此,一个好的干净数据源是好的 ole’ kaggle 。我决定研究一个视频游戏销售数据集。
决定,决定…
决策树,以及它们的表亲如袋装决策树、随机森林、梯度推进决策树等。,通常被称为系综方法。
为了理解更复杂的集成方法,我认为理解这些方法中最常见的决策树和随机森林是很好的。让我们举一个最简单的例子:使用决策树的回归。对于一个给定的 n 维数据集,你可以生成一个有 n 个分支和 n 个叶子的决策树。决策树的目标是确定最大程度减少残差平方和的分支,并尽可能提供最具预测性的叶子。也许一个数字会有所帮助…
Taken from the book Introduction to Statistical Learning
上图显示了一个棒球相关的数据集,我们想要确定一个球员的日志工资。在左图中,如果一个球员的经验少于 4.5 年,他们预计可以赚 511 万美元。如果一个玩家有超过 4.5 年的经验,但少于 117.5 次点击,他们预计会赚 6 千美元(同样基于日志)。在右边的数据中,预测值分别代表子空间 R1、R2 和 R3。
For those who like the see the math: decision trees essentially grow branches that reduce the sum of the errors for Rj sub-spaces in the data.
上面的例子使用了连续的数据,但是我们可以将其扩展到分类。在分类设置中,我们本质上是在增加分支以减少分类错误,尽管这并不那么简单。在分类设置中,我们采用一种类似熵的度量,并尝试减少每个分支的熵值,以提供最佳的分支分裂。基尼指数是一个常用的指标。
p-hat mk 表示来自第 k 类的第 m 个区域中的观测值的比例。从本质上说,基尼指数是一种方差的度量。方差越大,错误分类就越多。因此,基尼系数越低,分类越好。
将这些预测打包…
决策树通常被称为“贪婪的”。这只是算法如何试图确定减少误差的最佳方式的函数。不幸的是,这导致了模型过度拟合和模型过度一般化。
一种用于应对这种情况的方法被称为自举聚合或简称为‘bagging’。如果你理解统计学中的 bootstrapping 的概念(在估计未知人口的方差和误差方面),当涉及决策树时,bagging 是类似的。
在打包过程中,我们决定要从数据集中抽取多少个重复的引导,将它们放入同一个决策树中,然后将它们聚合在一起。这给了我们一个更健壮的结果,并且不容易过度拟合。
此外,通常每棵装袋的树会留下三分之一的样本。然后,我们可以将装袋的树与该样本进行拟合,并获得袋外误差率。这实质上是交叉验证的决策树版本,尽管您可以在超出袋外错误率的基础上执行交叉验证!
进入随机森林
现在我们对决策树和装袋有了大致的了解,随机森林的概念就相对简单了。香草随机森林是一个袋装决策树,其中一个附加算法在每次分裂时随机抽取 m 个预测值。这有助于对随机森林中使用的树进行去相关处理,并有助于自动应对多重共线性。
在分类中,所有的树都聚集在一起。从这种聚合中,该模型实质上采取了投票/投票来将数据分配给一个类别。
对于给定的观察,我们可以通过观察每个袋装树为该观察输出什么类来预测类。然后我们查看所有的树,看看这个观察被预测了多少次。如果观察结果是根据大多数袋装树预测的,则为该观察结果指定一个类别。
A random forest takes a random subset of features from the data, and creates n random trees from each subset. Trees are aggregated together at end.
一个在 R 中应用随机森林的危险的简短例子,使用视频游戏 Sales kaggle 数据集
我所有乱七八糟的代码都可以在我的 github 上找到。
本例的目标是看看销售数字和游戏所在的主机是否可以预测其类型(例如,体育、动作、RPG、策略等)。).
在这个例子中,我使用了caret
和ggplot2
。我使用包dummies
为分类预测器生成虚拟变量。
我想得到一些使用caret
的练习,它本质上是 R 版的scikit-learn
。但是首先,和任何数据集一样,有必要对其进行一点探索。我的一般方法是首先在数据中寻找古怪之处,探索潜在的相关性,然后再深入一点,看看数据中是否有任何其他值得注意的趋势。理想情况下,您会希望在建模之前从各个方面检查数据。为了简洁起见,我跳过了一些数据探索,直接进行了一些建模。
首先,我检查了数据中缺失的值。有一大堆的NaNs
,所以我继续使用DMwR
包做了 K-最近邻插补。
接下来,我想检查一下销售数据,看看是否有异常值。曾经有。而且分布是高度倾斜的。
Most sales were far less than $20 million total.
我继续使用对数转换将它们标准化。
Normalized-ish, but still sorta skewed.
在这里,我为每个游戏运行的不同主机生成虚拟变量,然后检查相关性。毫不奇怪,全球销售额与所有其他销售额相关联。评论家分数和计数不是。这里没有显示控制台的相关性。考虑到控制台虚拟数据的稀疏性,这里没有什么值得注意的。如果多重共线性是一个大问题,可以简单地删除全局销售变量,而不是保留所有其他销售变量。
在caret
中,我做了 80%-20%的训练测试分割,作为进行建模的惯例。我将所有的流派重新标为数字,它们如下:
- 运动
- 平台游戏
- 竞赛
- 角色扮演游戏
- 难题
- 多方面的
- 射手
- 模拟
- 行动
- 战斗的
- 冒险
- 战略
我做了一些网格搜索在每个树分裂可用的功能数量。回想一下,当随机森林为树中的每个节点创建一个分割时,它不会获取所有可用的功能。这是模型中可操作的超参数。
mtry <- sqrt(ncol(vg))
tunegrid <- expand.grid(.mtry = mtry)
在上面的代码片段中,我将列数的平方根作为可用的初始数字特性。在此基础上进行网格搜索,使得caret
将迭代初始起始变量,然后在下一次拟合迭代中进行另一次 sqrt(ncol(vg))附加特征,然后再次评估模型。
metric <- 'Accuracy'
control <- trainControl(method = 'repeatedcv', number = 10, repeats = 2, search = 'random', savePredictions = TRUE)
接下来,我将我的度量设置为准确性,因为这是一个分类过程。我做交叉验证来评估我的训练数据是否不可靠。典型的折叠次数为 5-10 次(表示为number
参数)。我做了一个随机搜索,因为它更快,计算量更小。
使用 caret,我训练了两个模型。一个有 15 棵袋装树。另一个有 500 袋树。500 树模型需要一些时间来运行(可能大约 30 分钟?).人们可以很容易地将袋装树木的数量纳入网格搜索中。为了简洁(和时间),我只比较了两个模型。
注:我允许模型使用 Box Cox 来确定如何适当地规范化数据(它对数据进行了对数转换)。
model_train1 <- train(Genre ~ ., data = vg_train, method = 'rf', trControl = control, tunegrid = tunegrid, metric = metric, ntree = 15, preProcess = c('BoxCox'))model_train2 <- train(Genre ~ ., data = vg_train, method = 'rf', trControl = control, tunegrid = tunegrid, metric = metric, ntree = 500, preProcess = c('BoxCox'))
我的交叉验证结果显示,500 树模型做得好一点点…但只是一点点。给定交叉验证结果,每个分割 21 个特征似乎是合适的。
Model 1 with 15 bagged trees.
Model 2 with 500 bagged trees
我的准确度是然而全然可怕的 。我在 Model 2 的整体准确率只有 34.4%。
随机森林允许我们查看特征重要性,这是一个特征的基尼指数在每次分裂时降低了多少。某个特征的基尼指数下降得越多,它就越重要。下图从 0 到 100 分对这些特性进行评分,100 分是最重要的。
看来用户数和评论家数尤为重要。然而,鉴于模型拟合度如此之差,我不确定解释这些变量有多大用处。我已经包含了变量重要性代码的一个片段,以防您想要复制它。
# Save the variable importance values from our model object generated from caret.
x<-varImp(model_train2, scale = TRUE)# Get the row names of the variable importance data
rownames(x$importance)# Convert the variable importance data into a dataframe
importance <- data.frame(rownames(x$importance), x$importance$Overall)# Relabel the data
names(importance)<-c('Platform', 'Importance')# Order the data from greatest importance to least important
importance <- transform(importance, Platform = reorder(Platform, Importance))# Plot the data with ggplot.
ggplot(data=importance, aes(x=Platform, y=Importance)) +
geom_bar(stat = 'identity',colour = "blue", fill = "white") + coord_flip())
我们可以查看混淆矩阵,看看有多少准确的分类和错误的分类。对角线表示正确的分类百分比。斜线表示模型错误分类一个流派的次数百分比。
太可怕了。射击游戏有 68%的机会被正确分类……但是也有很大一部分时间被错误分类为策略游戏。
外卖食品
为什么我们的模型做得这么差?有几个原因。该模型往往不符合数据。这可能意味着 random forest 不够复杂,不足以捕捉数据中的趋势,我们可能必须使用另一个模型来使用更复杂的方法。然而,更有可能的是,这些特征根本不能预测视频游戏的类型。
如果我们的功能有点糟糕,我们可以做两件事之一:我们可以为给定的数据集设计一些额外的功能。例如,我们可能能够创建一个变量,表示数据中每种游戏类型的平均评论家分数,作为一个预测器(但这可能是无趣的)。
我们可能要做的是从视频游戏存储库中获取一些额外的信息,该存储库中可能有每种类型的视频游戏的额外历史销售数据。第二个简单的方法是简单地计算每个流派的总销售额,然后将其应用于整个数据集。这么多选择!
或者答案更简单。可能是数据在类别方面不平衡。如果是这种情况(如果你进一步检查数据的话,确实如此),你可能想要修剪或合并流派来纠正这种情况。
结论
随机森林是机器学习中常用的模型,通常被称为经常使用的现成模型。在许多情况下,它的性能优于它的许多等效参数,并且启动时计算量较小。当然,对于任何模型,请确保您知道为什么要选择模型,例如随机森林(提示,可能您不知道您的数据的分布,可能您的数据非常高维,可能您有很多共线性,可能您想要一个易于解释的模型)。不要像我在这里一样漫不经心地选择一个模型。😃
资源
我并不真正深入研究随机森林的机制。如果你想深入了解,我强烈推荐两本书:
后者被一些人认为是机器学习的圣经!