什么是高阶函数?
编程;编排
了解什么是高阶函数,如何创建它们以及如何使用它们
感谢 Clément H 分享他们在 Unsplash 上的工作
高阶函数是将函数作为参数或返回函数的函数。这种类型的函数在许多编程语言中都有实现,包括 Go、JavaScript、Python 等;它们往往是面试中使用的一个问题。我多次与开发人员谈论这个概念,他们并不熟悉这个名称,尽管他们每天都在不知不觉中使用它,所以我决定用一篇帖子来讨论这个主题,这样我们就可以清楚地知道它们是什么以及它们如何有用。
由于这个主题在多种编程语言中被广泛使用,我将提供 JavaScript 和 Python 的代码示例。
一些简单的例子
让我们看一些高阶函数的简单示例,进入主题并使用代码,然后我们将进一步构建我们使用的一些常见函数,它们是高阶函数的示例。
将函数作为参数
首先,让我们构建一个名为doOperation
的非常简单的函数,它有 3 个参数:
- 功能操作
- 数字 1
- 数字 2
此外,我们将创建一个名为sumBothNumbers
的操作,它将简单地返回两个数的和。
Python:
def doOperation(operation, number1, number2):
return operation(number1, number2)
def sumBothNumbers(number1, number2):
return number1 + number2
doOperation(sumBothNumbers, 3, 5)------------
Output
------------
8
JavaScript:
function doOperation(operation, number1, number2) {
return operation(number1, number2)
}function sumBothNumbers(number1, number2) {
return number1 + number2
}doOperation(sumBothNumbers, 3, 5)------------
Output
------------
8
虽然在这种特殊情况下,拥有doOperation
函数似乎是多余的,如果不是错误的话,但在某些情况下它可能是有用的,例如,doOperation
函数可以是我们可以用自己的操作来扩展的库的一部分。
返回一个函数
接下来,我们将构建一个返回函数的高阶函数。我们的函数将被称为multiplyBy
,它将接受一个数字作为参数,并返回一个将其输入乘以该数字的函数。
Python:
def multiplyBy(multiplier):
def result(num):
return num * multiplier
return resultmultiplyByThree = multiplyBy(3)
multiplyByThree(4)------------
Output
------------
12
JavaScript:
function multiplyBy(multiplier) {
return function result(num) {
return num * multiplier
}
}multiplyByThree = multiplyBy(3)
multiplyByThree(4)------------
Output
------------
12
构建过滤器(),映射()和减少()
让我们使用高阶函数(实际上是高阶函数)来构建一个简单版本的流行函数。
过滤器()又名过滤()
filtering
函数将有两个参数,一个array
和一个test
函数,它将返回一个包含所有通过测试的元素的新数组。
Python:
def filtering(arr, test):
passed = []
for element in arr:
if (test(element)):
passed.append(element)
return passeddef isSuperNumber(num):
return num >= 10filtering([1, 5, 11, 3, 22], isSuperNumber)------------
Output
------------
[11, 22]
JavaScript:
function filtering(arr, test) {
const passed = []
for (let element of arr) {
if (test(element)) {
passed.push(element)
}
}
return passed
}function isSuperNumber(num) {
return num >= 10
}filtering([1, 5, 11, 3, 22], isSuperNumber)------------
Output
------------
> (2) [11, 22]
可以看到,我们的filter()
函数非常容易编码和使用,例如从一个数组中获取所有的超级数😛。
map()又名映射()
函数mapping
将接受两个参数:一个array
和一个transform
函数,它将返回一个新的转换后的数组,其中每一项都是对原始数组的每个元素调用transform
函数的结果。
Python:
def mapping(arr, transform):
mapped = []
for element in arr:
mapped.append(transform(element))
return mappeddef addTwo(num):
return num+2mapping([1, 2, 3], addTwo)------------
Output
------------
[3, 4, 5]
JavaScript:
function mapping(arr, transform) {
const mapped = []
for (let element of arr) {
mapped.push(transform(element))
}
return mapped
}function addTwo(num) {
return num + 2
}mapping([1, 2, 3], addTwo)------------
Output
------------
> (3) [3, 4, 5]
减少()又名减少()
函数reducing
将接受 3 个参数:一个reducer
函数、一个用于累加器的initial value
和一个array
。对于数组中的每一项,都调用 reducer 函数,并向其传递累加器和当前数组元素。返回值被分配给累加器。当减少完列表中的所有项目后,将返回累计值。
Python:
def reducing(reducer, initial, arr):
acc = initial
for element in arr:
acc = reducer(acc, element)
return accdef accum(acc, curr):
return acc + currreducing(accum, 0, [1, 2, 3])------------
Output
------------
6
JavaScript:
function reducing(reducer, initial, arr) {
let acc = initial
for (element of arr) {
acc = reducer(acc, element)
}
return acc
}function accum(acc, curr) {
return acc + curr
}reducing(accum, 0, [1, 2, 3])------------
Output
------------
6
结论
下一次,当你进行访问时,或者只是看到一个函数被返回或者作为参数的模式,你就会知道我们在处理高阶函数。
今天,我第一次介绍了一篇涵盖多种语言的文章,如果你觉得这是展示和比较它们的好方法,或者如果你认为这是一个糟糕的想法,请在评论中或通过 twitter 告诉我,我很乐意听到你的想法。
非常感谢你的阅读!
什么是标签地图?
注意:我们也在博客上发布了什么是标签图。在本帖中,我们将通过讨论标签图在计算机视觉注释过程中的作用来揭开标签图的神秘面纱。然后,我们将使用标签地图实际操作一些真实的例子。
作者图片
在计算机视觉数据集中,这个问题很普遍——什么是标签地图?
在本帖中,我们将通过讨论标签图在计算机视觉注释过程中的作用来揭开标签图的神秘面纱。然后,我们将使用标签地图实际操作一些真实的例子。
需要标注图的常见错误
- 缺少类名
- 类名显示为整数
- 类名与我的数据集的类名不匹配
- 无法识别类别标签
- 类别标签是数字
标签地图的作用
计算机视觉数据集有各种格式。Roboflow 支持超过 30 种计算机视觉格式的注入、转换和输出。虽然计算机视觉数据集的自动转换很方便,但了解数据集结构以便在导出后使用还是很有用的。
在计算机视觉数据集中,通常有引用类标签的注释。在上面的图像中,我们的类标签包括棋子的不同颜色和形状。为了注释图像,图像注释文件通常会定义特定于特定图像的注释。该注释文件可能包含也可能不包含特定于相关注释的类标签。
在注释文件没有指定类标签的情况下,参考标签映射来查找类名。标签映射是类注释的单独记录源。
手动操作标签地图
需要注意的是,并非所有的计算机视觉数据集格式都使用标签图。利用标注图进行分类标注的计算机视觉数据集包括:
让我们来看一个 YOLO 暗网格式的上图f9a9a175f26d4b26bca3a5338cc1405e.jpg
的注释例子。相应的f9a9a175f26d4b26bca3a5338cc1405e.txt
文件包含图像中对象的注释。
1 0.23563218390804597 0.13218390804597702 0.27586206896551724 0.14080459770114942 0 0.09051724137931035 0.28304597701149425 0.1810344827586207 0.10057471264367816 5 0.03879310344827586 0.27873563218390807 0.07758620689655173 0.10344827586206896 5 0.1896551724137931 0.40804597701149425 0.16666666666666666 0.10632183908045977 2 0.1997126436781609 0.5014367816091954 0.1781609195402299 0.10057471264367816 3 0.1221264367816092 0.4942528735632184 0.14367816091954022 0.08908045977011494 3 0.2916666666666667 0.2471264367816092 0.14655172413793102 0.08620689655172414 3 0.5387931034482759 0.4224137931034483 0.15517241379310345 0.08908045977011494 3 0.8204022988505747 0.3620689655172414 0.16091954022988506 0.10632183908045977 3 0.6925287356321839 0.5488505747126436 0.16954022988505746 0.10632183908045977 2 0.8362068965517241 0.7126436781609196 0.22413793103448276 0.12643678160919541 7 0.40948275862068967 0.8951149425287356 0.28160919540229884 0.14367816091954022 11 0.05459770114942529 0.7183908045977011 0.10919540229885058 0.11494252873563218 8 0.860632183908046 0.9425287356321839 0.22701149425287356 0.10919540229885058 10 0.10488505747126436 0.5775862068965517 0.20977011494252873 0.1206896551724138 6 0.10057471264367816 0.7586206896551724 0.1925287356321839 0.10057471264367816 6 0.4209770114942529 0.6724137931034483 0.19540229885057472 0.10344827586206896 9 0.09051724137931035 0.3864942528735632 0.14942528735632185 0.08908045977011494 9 0.11494252873563218 0.6623563218390804 0.15517241379310345 0.09770114942528736 9 0.3175287356321839 0.7514367816091954 0.14942528735632185 0.08908045977011494 9 0.4367816091954023 0.7931034482758621 0.15229885057471265 0.10344827586206896 9 0.5804597701149425 0.7212643678160919 0.16379310344827586 0.10632183908045977
引用标签映射的图像标注
在这里,你会注意到类名不见了。相反,每行的第一个条目是映射到标签映射中正确类名的整数!
我们来看看标签图_darknet.labels
。
black-bishop black-king black-knight black-pawn black-queen black-rook white-bishop white-king white-knight white-pawn white-queen white-rook
YOLO 暗网中的标签映射将整数映射到标签映射中指定的类别列表
上面的每个整数映射到这个列表中的一个位置,这就是数据集在注释中表示类标签的方式。
这就是标签地图在实践中的工作方式!
需要注意的是,不同的标签映射在格式之间的作用略有不同。例如,TensofFlow TFRecord 格式的数据集的.pbtxt
标签映射如下所示:
item { name: "black-bishop", id: 1, display_name: "black-bishop" } item { name: "black-king", id: 2, display_name: "black-king" } item { name: "black-knight", id: 3, display_name: "black-knight" } item { name: "black-pawn", id: 4, display_name: "black-pawn" } item { name: "black-queen", id: 5, display_name: "black-queen" } item { name: "black-rook", id: 6, display_name: "black-rook" } item { name: "white-bishop", id: 7, display_name: "white-bishop" } item { name: "white-king", id: 8, display_name: "white-king" } item { name: "white-knight", id: 9, display_name: "white-knight" } item { name: "white-pawn", id: 10, display_name: "white-pawn" } item { name: "white-queen", id: 11, display_name: "white-queen" } item { name: "white-rook", id: 12, display_name: "white-rook" }
TensorFlow TFRecord 格式的数据集标注图
在这里,您可以看到标签映射是以稍微不同的方式指定的,标签显示在一系列小字典条目中。此外,引用类名的整数以 1 开始,而不是 0!
结论
我们已经讨论了标签映射在注释计算机视觉数据集时所扮演的角色。我们还接触了一些真实的标签地图,看看标签地图在实践中是如何工作的。
后续步骤
到底什么是马尔可夫决策过程?
了解大多数强化学习问题中使用的模型。
我为什么要关心马尔可夫决策过程?
任何对强化学习的发展感兴趣的人都应该知道他们建立的模型——马尔可夫决策过程。他们建立了一个具有不确定性的世界结构,行动将带你去哪里,代理人需要学习如何行动。
非确定性搜索
搜索是人工智能和智能代理的中心问题。通过规划未来,搜索允许代理解决游戏和后勤问题——但它们依赖于知道某个动作会把你带到哪里。在传统的基于树的方法中,一个动作把你带到下一个状态,没有下一个状态的分布。这意味着,如果你有足够的存储空间,你可以规划集,确定性轨迹到未来。马尔可夫决策过程使得这种规划**具有随机性、**或不确定性。与本文相关的搜索主题列表很长——图搜索、博弈树、 alpha-beta 剪枝、 minimax 搜索、 expectimax 搜索等。
在现实世界中,这是一个更好的代理行为模型。我们采取的每一个简单的行动——倒咖啡、寄信、移动关节——都有预期的结果,但是生活中有一种随机性。马尔可夫决策过程是让计划捕捉这种不确定性的工具。
日常决策。照片由 mhtoori 拍摄。com from Pexels 。
马尔可夫决策过程的马尔可夫性是什么?
Markov 是关于 Andrey Markov 的,Andrey Markov 是一位著名的俄罗斯数学家,以他在随机过程方面的工作而闻名。
“马尔可夫”一般是指给定现在的状态,未来和过去是独立的。
安德烈·马尔科夫(1856-1922)。
制造马尔可夫系统的关键思想是无记忆。无记忆是指系统的历史不会影响当前状态。在概率符号中,无记忆性翻译成这个。考虑一系列的行动产生一个轨迹,我们正在看当前的行动会把我们带到哪里。长条件概率可能看起来像:
现在——如果系统是马尔可夫的,历史是 全部包含在当前状态 中。所以,我们的一步分布要简单得多。
这一步改变了计算效率的游戏规则。马尔可夫属性支撑了所有现代强化学习算法的存在和成功。
马尔可夫决策过程
MDP 由以下量定义:
- 一组状态 s ∈ S 。这些状态代表了世界上所有可能的构型。在下面的示例中,是机器人位置。
- 一组动作 a ∈ A 。动作是代理可以采取的所有可能动作的集合。动作下面是{北,东,南,西}。
- 一个转移函数 T(s,a,s’)。T(s,a,s’)持有 MDP 的不确定性。给定当前位置和提供的动作,T 决定下一个状态跟随的频率。在下面的例子中,转移函数可以是下一个状态在 80%的时间里是在动作的方向上,但是在另外 20%的时间里偏离 90 度。这对规划有什么影响?在下面的例子中,机器人选择了北方,但有 10%的可能性是向东或向西。
- 一个奖励函数 **R(s,a,s’)。任何代理人的目标都是回报总和最大化。**这个函数说的是每一步获得多少奖励。一般来说,在每一步都会有一个小的负奖励(成本)来鼓励快速解决问题,在最终状态会有大的正(目标)或负(失败的任务)奖励。下面,宝石和火坑是终端状态。
- 起始状态 s0 ,也可能是终止状态。
MDP 就是一个例子。来源——我在 CS188 做的一次讲座。
这给了我们什么?
这个定义给了我们一个有限的世界,我们一套向前的动力学模型。我们知道每个转变的确切概率,以及每个行动有多好。最终,这个模型是一个场景——在这个场景中,我们将计划如何行动,知道我们的行动可能会有点偏差。
如果机器人在火坑旁边,机器人应该总是选择北方吗?知道北方有机会把它送到东方吗?
不,最佳政策是向西。撞墙最终会(20%几率)北上,将机器人送上通往目标的轨道。
政策
学习如何在未知的环境中行动是了解环境的最终目标。在 MDP 中,这被称为策略。
策略是一种功能,它从一个状态给你一个动作。π*: S → A。
获得策略的方法有很多,但核心思想是价值和策略迭代。这两种方法迭代地建立一个状态的总效用的估计,也许是一个动作。
一个国家的效用是(贴现)奖励的总和。
一旦每个州都有一个效用,高层次的规划和政策制定就会遵循效用最大化的路线。
在 MDP 和其他学习方法中,模型增加了一个折扣因子 r γ,以区分短期和长期奖励的优先级。贴现因子直观上是有意义的——人类和生物现在比以后更能创造手中的货币(或食物)价值。折扣因子还通过将奖励的总和变成几何级数,带来了巨大的计算收敛帮助。(如果你有兴趣, 这里有一个关于 MDP 解的收敛性的讲座 )。
来源——我在 CS188 做的一个讲座。
我把它作为一个练习留给读者,让他们为这个例子找出最优策略——想想最终状态会是什么。我们能避免它吗?学习如何获得这些策略留待另一篇文章来讨论。
更多关于强化学习的介绍——你也可以在这里或者这里找到课程材料。下面是我的几篇文章。
线性代数的基础如何支持深度强化学习的顶点?
towardsdatascience.com](/the-hidden-linear-algebra-of-reinforcement-learning-406efdf066a) [## 强化学习算法的收敛性
有什么简单的收敛界限吗?
towardsdatascience.com](/convergence-of-reinforcement-learning-algorithms-3d917f66b3b7) [## 强化学习的基本迭代方法
学习价值和策略迭代能掌握多少强化学习?很多。
towardsdatascience.com](/fundamental-iterative-methods-of-reinforcement-learning-df8ff078652a)
更多?订阅我关于机器人、人工智能和社会的时事通讯!
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)
什么是 P 值?
约翰·霍普斯金 DS 专业化系列
p 值和显著性测试的介绍,p-hacking,以及 R 中 p 值的例子
由 Unsplash 上 Greg Rakozy 拍摄的照片
[Full series](https://towardsdatascience.com/tagged/ds-toolbox)[**Part 1**](/the-data-scientists-toolbox-part-1-c214adcc859f) - What is Data Science, Big data and the Data Science process[**Part 2**](/how-to-learn-r-for-data-science-3a7c8326f969) - The origin of R, why use R, R vs Python and resources to learn[**Part 3**](/a-crash-course-on-version-control-and-git-github-5d04e7933070) - Version Control, Git & GitHub and best practices for sharing code.[**Part 4**](/the-six-types-of-data-analysis-75517ba7ea61) - The 6 types of data analysis[**Part 5**](/designing-experiments-in-data-science-23360d2ddf84) - The ability to design experiments to answer your Ds questions[**Part 6**](/what-is-a-p-value-2cd0b1898e6f) - P-value & P-hacking[**Part 7**](/what-is-a-p-value-2cd0b1898e6f) - Big Data, it's benefits, challenges, and future
本系列基于约翰·霍普斯金大学在 Coursera 上提供的 数据科学专业 。本系列中的文章是基于课程的笔记,以及出于我自己学习目的的额外研究和主题。第一门课, 数据科学家工具箱 ,笔记会分成 7 个部分。关于这个系列的注释还可以在这里找到。
介绍
科学领域的一个重要原则是不存在不可证伪的理论,换句话说,没有所谓的科学证据。规范和评价一个科学理论的,是一个 证据 。更多+更好的证据=更好的科学理论,反之亦然。也就是说,我们今天拥有的所有科学知识都是试验性的,这意味着它们是有待证实的,是推测的(我们尽最大努力理解我们周围的世界,并形成关于它们的理论,但它们不是最终的,可以被证伪。)
在统计学中,情况也是如此。你不能 100%确定地证明,比如明天下午 1 点会下雨,或者谁会赢得选举。所有的统计测试都是为手头的数据分配一定的概率,并指出结果来自抽样中随机波动的可能性(参考)。
也就是说,本文将重点关注显著性测试,通过示例解释什么是 p 值,以及它如何在研究领域中被利用(p-hacking),这就是所谓的再现性危机。
什么是 P 值?
p 值告诉你一个结果发生的概率可能是随机的*。***
为了更具体地了解 p 值是什么,我们将从研究的角度来看它,这就是它在统计分析或测试中的应用——显著性测试。
但首先,你必须知道的术语是:
- p 值
- 零假设(如果被拒绝,耶)
- 替代假设
现在举个例子:古典音乐和聚焦
假设进行了一个实验来推断听古典音乐是否能提高注意力。为此,他们让 100 个人坐在一个房间里,要求他们戴着耳机听古典音乐,同时进行注意力测试。然后,他们让另外 100 个人在没有任何音乐的情况下参与测试。然后比较这两组的结果。
在上面的实验中:
零假设=古典音乐和非古典音乐没有区别
另类假设 =基本相反,有区别…
为了证明听古典音乐可以提高注意力,实验者必须能够拒绝零信号,这通常是研究人员必须清除的一大障碍。如果他们不能这样做,也就是说,没有足够的证据或数据来否定它。
在这种情况下,假设实验者对数据进行了统计分析,并得出了一个非常小的 p 值,他们很高兴并就该主题发表了论文。
那么小(显著)的 p 值又意味着什么呢?这里有几个要点
- 它告诉你结果是多么罕见
- 这意味着你得到的数字很少会偶然出现
- 例如,p 值= 0.01,这意味着如果你重复实验(在相同的条件下)100 次,并且假设零假设为真,你将只看到一次结果。或者在零假设为真的情况下,只有 1%的机会看到结果。
如果你想一想,如果实现小于 0.05 的 p 值意味着验证一个人的研究,并允许他们在论文上发表它,这是非常诱人的,为了自己的利益故意攻击这个值,这正是所发生的事情。
可复制性危机
简而言之,这场危机是关于科学领域的研究和实验必须达到<0.05, which incentivized people to intentionally tweak certain conditions in their favor. This is called p-hacking.
P-hacking
- exhaustively search data sets to find patterns and correlations that appear statistically significant by virtue of the sheer number of tests performed
- AKA 数据挖掘的黄金数字
- 如果你做了足够多的测试,你可以找到你想要的数据集和分析
P-hacking 也可能与大数据和我们今天拥有的更好的技术有关,这使得这些测试可以快速完成。
要查看 P-hacking 的实际例子,请查看 FiveThirtyEight 的精彩文章,其中有一个您可以使用的实际例子。
R 中的 P 值示例
这只是一个您可能会遇到 p 值的简单示例这是一个使用波士顿数据集的线性回归模型示例,以及包含 p 值的模型的 F 统计。
密码
*library(MASS) # library for loading datasetsfit = lm(medv ~ lstat, data = Boston) # regression model medv against lstatsummary(fit) # shows you summary about your model*
输出
线性回归模型中汇总函数的输出
上图显示了使用summary()
函数进行显著性检验的 F 统计量。
该显著性检验的前提条件包括模型中的误差项 ϵ 与 x 无关,且正态分布,均值为零,方差恒定。并将显著性水平设置为 0.05
简单来说,如果你看右下方,你会看到p-value < 2.2e-16
。这意味着 p 值远小于 0.05,这意味着我们可以拒绝零假设 β = 0。因此,在线性回归模型中,变量lstat
和mdev
之间存在显著的关系。
同样,p 值也有助于确定在样本中观察到的关系是否也存在于更大的人群中。因此,如果 p 值具有统计学意义,则有证据表明这种影响也存在于人群水平。
当然,p 值只是告诉你有相关性。为了说明模型与数据的吻合程度,这就是 R 平方值的用处。此外,残差是模型中的“误差”(回归线和数据点之间的距离),F 统计只是比较变量的联合效应(越高越好)。所有这些都是解释你的假设检验的关键因素。
更多关于以上回归的内容在我的 kaggle 笔记本中。如果你想要一个完整的介绍,看看这篇文章。另一篇关于解释回归分析中的 P 值和系数的文章在这里。
摘要
唐纳德·詹纳蒂在 Unsplash 上的照片
C 意识——我们大脑中 860 亿个神经元之间电信号传输的神秘、不可言喻的机制的产物——赋予人类对我们周围环境的主观体验,思考过去、现在和未来,质疑世界,探索深不可测的事物的能力。
我们不可思议的头脑产生了许多惊人的发现和突破,我们对世界的许多推理方式帮助我们简化了我们周围的复杂事物。但是,随着信息和技术的兴起,加速了连通性,将世界连接在一起,随之而来的是对真理的牺牲和错误信息的困扰。因此,我们必须明白,我们所有人都有偏见,我们倾向于根据激励采取行动,我们在这个现代世界的注意力不断被技术利用。
为了克服这一点,我们必须认真对待我们的行为,反思它们,并从我们的错误中吸取教训。我们必须学会把注意力放在重要的事情上,追求有意义的事情,而不是权宜之计,让我们周围都是好人,行动不是出于自私,而是为了社会和世界的更大利益。
术语摘要
- p 值——当我们说零假设是错误的时,承认我们是错误的风险的一种方式(查看 p 值的另一种方式)
- 零假设——两个样本之间的差异只是由于偶然
- p-hacking——有意识地搜索数据集,寻找模式和相关性,通过大量的测试获得有统计意义的值
需要记住的几件关键事情是:
- 显著的 p 值并不代表工作的质量
- p 值不会告诉你一个结果为真的概率,它仅仅是一个统计测试的结果。
- 人们无法证明/反驳假设,只能拒绝无效假设,并为替代假设提供支持
《如何不犯错:数学思维的力量》一书的作者 Jordan Ellenberg 对显著性测试有着深刻的见解:
显著性检验是侦探,而不是法官。这一具有挑衅性和统计学意义的发现并不是科学过程的结论,而是一个开端。
以及无效假设的总结:
- 进行实验
- 假设零假设为真,设 p 为(在该假设下)得到与观察到的结果一样极端的结果的概率。
- 数字 p 称为 p 值。
- 如果很小,欢喜;你可以说你的结果有统计学意义。
- 如果它很大,承认没有排除零假设。
作为这篇文章的结尾,这里有一些关于什么是统计的真相。
统计学的目的不是告诉我们该相信什么,而是告诉我们该做什么。统计是做决策,不是回答问题。—乔丹·埃伦伯格
感谢阅读,并保持安全。
更多关于 P 值和统计学意义的文章
- 统计显著性由威尔·科尔森解释
- 数据科学家解释的 P 值阿德蒙德李解释的 P 值
- 意义有什么重要的
如果您对学习数据科学感兴趣,请查看“超学习”数据科学系列!
这是一个简短的指南,基于《超学习》一书,应用于数据科学
medium.com](https://medium.com/better-programming/how-to-ultralearn-data-science-part-1-92e143b7257b)
查看这些关于数据科学资源的文章。
[## 2020 年你应该订阅的 25 大数据科学 YouTube 频道
以下是你应该关注的学习编程、机器学习和人工智能、数学和数据的最佳 YouTubers
towardsdatascience.com](/top-20-youtube-channels-for-data-science-in-2020-2ef4fb0d3d5) [## 互联网上 20 大免费数据科学、ML 和 AI MOOCs
以下是关于数据科学、机器学习、深度学习和人工智能的最佳在线课程列表
towardsdatascience.com](/top-20-free-data-science-ml-and-ai-moocs-on-the-internet-4036bd0aac12) [## 机器学习和数据科学的 20 大网站
这里是我列出的最好的 ML 和数据科学网站,可以提供有价值的资源和新闻。
medium.com](https://medium.com/swlh/top-20-websites-for-machine-learning-and-data-science-d0b113130068) [## 开始数据科学之旅的最佳书籍
这是你从头开始学习数据科学应该读的书。
towardsdatascience.com](/the-best-book-to-start-your-data-science-journey-f457b0994160)
联系人
如果你想了解我的最新文章,请关注我的媒体。
也关注我的其他社交资料!
请关注我的下一篇文章,记得保持安全!*
什么是感知器?–神经网络基础
感知器的历史及其工作原理概述
作者图片
单层感知器是神经网络的基本单元。感知器由输入值、权重和偏差、加权和以及激活函数组成。
在过去十年,我们见证了机器学习技术的爆炸式发展。从个性化的社交媒体反馈到可以从视频中移除对象的算法。像许多其他自学者一样,我已经决定该是我涉足人工智能世界的时候了。最近,我决定开始我的旅程,在 Udacity 上参加一个名为的课程,用 PyTorch 进行深度学习。当然,这篇文章是由课程启发的,我强烈推荐你去看看!
如果你上过这门课,或者读过任何关于神经网络的东西,你可能会听到的第一个概念就是感知器。但是什么是感知器,为什么要用它呢?它是如何工作的?背后有什么历史?在本帖中,我们将简要回答这些问题。
一点历史
感知机是由美国心理学家弗兰克·罗森布拉特于 1957 年在康奈尔航空实验室首次提出的(如果你感兴趣,可以点击原文链接)。罗森布拉特深受生物神经元及其学习能力的启发。罗森布拉特的感知器由一个或多个输入、一个处理器和一个输出组成。
作者图片
最初,Rosenblatt 的想法是创建一个像神经元一样运行的物理机器,然而,它的第一个实现是在 IBM 704 上测试的软件。Rosenblatt 最终在定制的硬件中实现了该软件,目的是将其用于图像识别。
图片来自维基共享资源
虽然最初,Rosenblatt 和 AI 社区对这项技术持乐观态度,但后来表明,这项技术只是线性分离,换句话说,感知机只能与数据点的线性分离一起工作。这导致该技术对不同模式的识别较差。
当时,糟糕的分类(以及其他一些负面报道)导致公众对这项技术失去了兴趣。然而今天,我们已经围绕这个线性分离问题开发了一种方法,叫做激活函数。
让我们看看今天感知机是如何工作的。
感知器 101
感知器通过接受一些数字输入以及所谓的权重和偏差来工作。然后,它将这些输入乘以各自的权重(这就是所谓的加权和)。然后将这些乘积与偏差相加。激活函数将加权和与偏差作为输入,并返回最终输出。
哇,这太令人困惑了…让我们通过构建一个感知机来打破这种困惑。
感知器由四部分组成:输入值、权重和偏差、加权和以及激活函数。
假设我们有单个神经元和三个输入 x1,x2 , x3 分别乘以权重 w1,w2,w3如下图所示,
作者图片
这个想法很简单,给定输入的数值和权重,在神经元内部有一个函数,它会产生一个输出。现在的问题是,这个函数是什么?
一个函数可能看起来像
作者图片
这个函数被称为加权和,因为它是权重和输入的和。这看起来是一个很好的函数,但如果我们希望输出落在某个范围内,比如 0 到 1,该怎么办呢?
我们可以通过使用激活函数来做到这一点。激活函数是基于一组规则将给定的输入(在这种情况下,输入将是加权和)转换成某个输出的函数。
作者图片
存在不同种类的激活功能,例如:
- **双曲正切:**用于输出一个从-1 到 1 的数。
- **逻辑函数:**用于输出一个从 0 到 1 的数。
等等。
注意:激活功能也允许非线性分类。如果你有兴趣了解更多关于激活函数的信息,我推荐你看看 这个 或者 这个 。
因为我们要寻找的范围在 0 到 1 之间,所以我们将使用一个逻辑函数来实现这个目标。
物流功能
后勤职能的公式如下:
作者图片
图表看起来是这样的,
图片来自维基共享资源。对 x 和 y 轴及功能进行更改后重新发布。
注意 g(z)位于点 0 和 1 之间,并且这个图不是线性的。这将允许我们输出介于 0 和 1 之间的数字,这正是我们构建感知机所需要的。
现在,我们已经拥有几乎制造感知机所需的一切。我们最不缺的就是偏见。偏差是感知器在产生输出之前必须达到的阈值。所以最终的神经元方程看起来像:
作者图片
我们可以看到(通常偏差出现在输入端附近),
作者图片
请注意,激活函数将加权和加上偏差作为输入,以创建单个输出。使用逻辑函数,该输出将在 0 和 1 之间。
为什么使用感知器?
感知器是神经网络的构建模块。它通常用于二元分类器的监督学习。这可以通过一个例子得到最好的解释。我们拿一个简单的感知器来说。在这个感知器中,我们有一个输入 x 和 **y,**分别乘以权重 wx 和 wy ,它还包含一个偏差。
作者图片
让我们也创建一个图表,用红点和蓝点表示两种不同类别的数据。
作者图片
注意 x 轴标注在输入 x 之后,y 轴标注在输入 y 之后。
假设我们的目标是分离这些数据,以便区分蓝点和红点。我们如何使用感知器来做到这一点?
感知器可以为二元分类创建决策边界,其中决策边界是图上分隔不同数据点的空间区域。
为了更好地理解这一点,我们来玩一下函数。我们可以说,
wx = -0.5
wy = 0.5
并且 b = 0
那么感知器的功能将会是这样的,
0.5x + 0.5y = 0
图表看起来会像这样,
作者图片
让我们假设激活函数,在这种情况下,是一个简单的阶跃函数,它输出0 或 1。感知器函数会将蓝点标记为 1,红点标记为 0。换句话说,
如果 0.5x + 0.5y => 0,则为 1
如果 0.5x + 0.5y < 0,则 0。
因此,函数 0.5x + 0.5y = 0 创建了一个区分红点和蓝点的判定边界。
作者图片
总的来说,我们看到感知器可以使用决策边界进行基本分类。
注意:在本例中,权重和偏差是随机选择的,用于对点进行分类,但是如果我们不知道什么权重会对数据产生良好的分离效果呢?有没有一种方法可以让感知器自己对这些点进行分类(假设函数是线性的)?答案是肯定的!有一种方法叫做 【感知器戏法】 ,我会让你自己去研究这个:)。
你坚持到了文章的结尾。让我们回顾一下你所学到的!
关键要点
什么是感知器,为什么使用它们?
- 感知器是一种非常简单的神经网络模型,用于二进制分类器的监督学习。
感知器背后有什么历史?
- 从生物神经元及其学习能力中获得灵感后,感知机于 1957 年由美国心理学家弗兰克·罗森布拉特在康奈尔航空实验室首次推出
它们是如何工作的?
- 感知器通过接受一些数字输入以及所谓的权重和偏差来工作。然后,它将这些输入乘以各自的权重(这就是所谓的加权和)。然后将这些乘积与偏差相加。激活函数将加权和与偏差作为输入,并返回最终输出。
week✨的 DL 视频
如果你有兴趣创造自己的感知器,看看这个视频吧!
额外资源/引用
- 感知器如何学习?——感知器诡计。
- 这个视频很好地解释了感知器模型
- 如果你是从机器学习开始的,这本书真的很好,并且很好地解释了感知机的
- 感知器的惊人深度视频
- 维基百科一直是学习任何东西的好资源,包括感知机
你能在哪里找到我😝
我的 LinkedIn!请随时与我联系,我喜欢谈论人工智能!
什么是概率价值主张?
这是伟大的数据产品的秘密。
Riho Kroll 在 Unsplash 上拍摄的照片
想象一下,如果 Gmail 将 95%的电子邮件发送到正确的人的收件箱,并将另外 5%发送到不同的人的收件箱。或者,想象一下,如果 Microsoft Word 成功保存了 5 个文档中的 4 个,但是对文件进行了不正确的编码,导致文档不可读。
一个只在部分时间有效的产品——这对用户来说是疯狂和令人沮丧的。没有人会买这样的产品。除非…
想象一下,如果网飞推荐的 30 个节目中只有一个是你真正想看的,而大多数都是你已经看过的。或者想象一下,如果亚马逊的 Alexa 只能理解你问她的 10 件事情中的 8 件,通常只是回答“对不起,我不明白这个问题。”
一个只在某些时候有效的产品——在这种情况下并不疯狂。有什么不同?最后两个例子是设计成具有概率价值主张的产品特性。
概率价值主张的标志是,在任何特定的互动过程中,客户期望从产品中获得的利益可能会出现,也可能不会出现。相反,价值是通过多种互动的总和来传递的:五分之一,十分之九,百万分之一。这些交互可能发生在不同的时间段、不同的环境、极端或罕见的情况下,甚至发生在不同的客户群中。
传递概率价值的产品很少,至少与 t 恤、罐头食品和电视等更传统的产品相比是如此。然而,它们存在于计算的内部和外部。例如,安全带有一个概率价值主张。我们在每次乘车时都会系上安全带,但只有在发生事故时(理想情况下永远不会发生),我们才会体验到安全带救命的好处。
人工智能和机器学习是基于统计学的,整个学科建立在概率正确的概念上*——经常足够有用,但不总是。从本质上讲,所有使用人工智能和机器学习的产品都有一个概率价值主张。因此,对于这个领域的创始人或从业者来说,理解其中的含义尤为重要。*
所有人工智能和机器学习产品都有一个概率价值主张。(图片由作者提供)
概率价值主张意味着考虑所有可能的客户体验
当我们设计一个具有确定性价值主张的产品时(像 Google 的电子邮件服务器和 Microsoft Word 的保存到磁盘这样的普通产品),我们专注于通过构建新的特性和功能来最大化我们产品的优势。我们相对于客户不使用我们的产品或客户使用竞争产品的情况来定义这些优势。因此,价值主张是我们的产品为这些领域提供的所有优势的总和。
当我们设计具有概率价值主张的产品时,我们仍然关注使用我们产品的最大利益。但是,由于好处并不总是出现,我们还必须考虑客户在尝试使用我们的产品时可能遇到的任何与中性或不良结果相关的成本。我们最终需要设计两种用户体验:一种是提供好处的用户体验,另一种是不那么迷人的用户体验,在这种体验中,我们的产品什么都不做或者得到错误的答案。因此,概率产品的价值主张是使用产品的所有收益的总和减去当产品具有不良或中性结果时使用该产品的相关成本。**
安全带在发生车祸时提供了安全的好处,但也必须足够舒适,以便在其他 99.99%的时间里使用。Gmail 可以使用人工智能从我们的收件箱中过滤垃圾邮件,但也必须提供一种功能,在数据驱动的机器不可避免地出错时,将真实的电子邮件恢复到收件箱中。
没有人喜欢想象使用他们产品的不良后果;但是概率价值主张需要这种类型的思考。在某种程度上,收益必须大于成本。如何实现这种平衡会对商业模式产生战略影响。
当使用你的产品的收益明显大于成本时,以一种你的客户可以理解的方式,你的团队不再需要把你的产品的概率本质当作一个需要被压扁的 bug。以平衡的概率价值主张构建的人工智能产品明显更容易操作、扩展、监控和故障排除。
原载于 2020 年 5 月 25 日https://www . fundamental . ai*。*
什么是编程范例?
编程范例和泛型概述
(图片由作者提供)
介绍
自从第一种高级编程语言 plank alül 的发布,以及随之而来的 FORTRAN 和 Common Lisp 等语言的发布,编程语言一直在挑战编程对计算机程序员的意义。这通常是通过所谓的编程范例来完成的。
编程范式是编程语言的方法论所遵循的概念。范式很重要,因为它们定义了一种编程语言及其工作方式。思考范式的一个很好的方式是把它看作一套思想,编程语言可以用它在更高的层次上以机器码的形式执行任务。这些不同的方法在某些情况下可能更好,而在另一些情况下可能更差。探索范式时的一条重要经验是了解它们擅长什么。虽然大多数现代编程语言确实是通用的,可以做任何事情,但是用函数式语言开发游戏可能比用面向对象的语言更困难。
陈述性与命令性
关于编程范例的概念,最有趣的事情可能是范例本身是子类,就像 C++昨天刚刚出现一样。通常在编程方法中,一种语言可以分为两大类:
- 宣言的
- 必要的
声明式编程
声明式编程是指坐在方向盘后面的程序员在任何给定的时刻都不能有效地准确编程计算机做什么,而是描述他们想要的结果的属性,而不解释如何计算它。落入此窗口的范例有:
- 函数式编程范式。
- 逻辑编程范式。
- 数学编程范式。
- 模块化编程范例。
命令式编程
命令式编程本质上与声明式编程相反。首先,使用命令式编程,用户通常直接与计算机的状态进行交互,并决定如何计算事物。推广这种编程方法的范例有:
- 面向对象的编程范例。
- 过程化编程范式。
范例应用
重要的是要记住,语言不需要遵守这些规则。尽管 C++经常被错误地认为创造了面向对象的编程范例,但它确实在编程世界中引入了一个惊人的概念:
仿制药!
泛型允许编程语言从各种编程范例中挑选某些属性,并利用最适合该语言应用的属性。在引入泛型之前,大多数语言都是为了执行非常特殊的操作而创建的。例如,Simula 是第一种真正的面向对象编程语言,它是专门为运行复杂模拟而创建的。另一个很好的例子是 COBOL,它是一种主要用于商业应用的编程语言。
大多数现代编程语言都是多范例编程语言。这是因为增加了对泛型编程概念的支持,使得编程语言可以跨范例流动,并有效地改变它们的工作方式,有时这种方式非常酷。
鉴于大多数现代编程语言都是多范式的,有些人可能会想知道为什么了解所有范式如此重要。这是一个值得问的问题,因为范式之间的界限在许多语言中是如此的不相关——我想起了我最喜欢的 Julia——为什么你应该熟悉每种范式的属性,而不是只学习一种多范式语言呢?我的反驳是这样的:
教育。
我看了莱克斯·弗里德曼(喜欢那个家伙)和比雅尼·斯特劳斯特鲁普(C++的传奇人物)的一次很棒的访谈,比雅尼·斯特劳斯特鲁普回答了这个问题的很多细节。如果你感兴趣的话,这里有一个嵌入版本,你现在可以听听:
在采访中,他继续说,一个伟大的程序员应该知道至少五种编程语言。虽然这些不一定是低级的,但是它们应该来自不同的范例。简单的事实是,函数式编程语言可以教给你很多关于编程和计算机的东西。对于命令式语言(如 C)、面向对象语言(如 Python 和 C++ ),甚至是更奇怪的范式(如结构化编程范式)来说,这当然是正确的。
这里有一个我喜欢并且知道的语言列表,可以用它们各自的范例来教你编程:
功能的
- 普通 Lisp
- 计划
- 哈斯克尔
- 稀有
- 朱莉娅
- 猎人
面向对象
- C++
- Java 语言(一种计算机语言,尤用于创建网站)
- Java Script 语言
- 计算机编程语言
- 斯卡拉
必要的
- C
- 汇编(我个人使用 NASM/FASM,只使用 64 位注册表(amd64 汇编))
- 公式翻译程式语言(formula translator)
如果你想让意识超越一种特定的编程方式的界限,我正式建议你深入其中的一些选项。从长远来看,许多概念也可能会回归,这很好。没有什么比在旧代码中强化新技能或新东西更好的了。
语言分类
人们可以解释编程语言的所有拼图是如何组合在一起的,但更好的方法可能是应用已经掌握的知识,以便在代码中绘制不同因素的线条。正如历史上大多数高级编程概念一样,我们应该从 c 开始。
C
c 是一种命令式编程语言。使用这种语言,人们通常会绘制指针并手动移动数据来解决编程问题。虽然这给了系统很大的控制权,但这也意味着要提防更多的东西,这意味着 C 可能不是进行快速运算的最理想的语言。
C++
C++也是一种命令式语言,因为它本质上是一种将孩子与 C 直接联系起来的语言。C++也是面向对象编程的典范,是至今仍在使用的这种语言的最经典的例子之一。
普通 Lisp
Lisp 是一种固有的函数式编程语言,然而大多数形式的现代 Lisp 不再是纯函数式的。这是编程语言中反复出现的一个主题,因为对于一门语言来说,只直接擅长一件事已经没有什么意义了。
稀有
r 是另一种存在于多范例光谱中的语言。r 主要是一种函数式编程语言,但是当然利用了泛型和方法论的优势,这使得它可以做比大多数典型的函数式语言更难享受的事情。
朱莉娅
在这方面,朱莉娅当然是一个很难谈论的人。Julia 的一个独特之处是语言本身背后的方法论。然而,从纯粹的基本形式来看,Julia 是一种函数式编程语言。当然,像 R Julia 一样,它也是一种多范式语言,而且通过多重调度将单词的含义提升到了一个全新的水平。
锈
Rust 是多范例编程语言的另一个很好的例子。虽然 Rust 很像一个更高级的 C 语言,但它也有很多通常被认为是功能性的属性——这并不是一件坏事。
计算机编程语言
很可能我们都知道 Python 首先是一种面向对象的编程语言。然而,Python 是另一种完全多范式的编程语言。
结论
所有编程范例对教育和能力都有好处。历史上,函数式语言在科学计算领域非常引人注目。当然,拿今天科学计算最流行的语言来说,很明显它们都是多范例的。面向对象语言也有很好的应用。软件开发、游戏开发和图形编程都是面向对象编程的很好的例子。
从所有这些信息中,我们可以得出的最大结论是,软件和编程语言的未来是多范例的。不太可能有人会在短期内创建一种纯函数式或面向对象的编程语言。如果你问我,这并不是一件坏事,因为你采用的每一种编程方法都有弱点和优点,并且许多真正的优化都是执行测试,以查看哪种方法比其他方法更有效或更好。这也给每个人都应该从多种范式中了解多种语言的想法加上了一个更大的图钉。随着范型利用泛型的力量进行合并,永远不知道什么时候会遇到完全不同的编程语言的编程概念!
什么是连体神经网络?
专门测量相似性的神经网络
照片由 Unsplash 上的 Sereja Ris 拍摄
机器学习的许多应用都围绕着检查两个对象是否相似。例如:
- 对于面部识别,检查输入的面部图像是否与数据库中的任何图像相似
- 在问答网站上,检查新问题是否与任何存档的问题相似
如今,测量两个对象之间的相似性的最常见和最方便的方法之一如下:
- 获取每个对象的矢量表示(也称为嵌入)。例如预训练 ResNet 的中间层的输出、句子中所有单词的预训练单词向量的平均值
- 计算步骤(1)中两个向量之间的余弦相似度
- 使用步骤(2)中的值来确定这两个对象是否相似
然而,这种方法通常表现不佳,因为步骤(1)中的矢量表示在我们的应用中不是专用的。如果我们想微调这些向量表示,甚至从头开始训练一个新的模型,我们可以使用连体神经网络架构。
网络体系结构
连体神经网络由两个相同的子网组成,也称为双网络,它们的输出端相连。这两个网络不仅具有相同的架构,而且它们还共享权重。它们并行工作,负责为输入创建矢量表示。例如,如果我们的输入是图像,我们可以使用 ResNet 作为孪生网络。我们可以将连体神经网络视为孪生网络的包装器。它们通过测量向量之间的相似性来帮助产生更好的向量表示。
在上图中, x ₁和 x ₂是我们要比较的两个对象, v ₁和 v ₂是 x ₁和 x ₂.的矢量表示比较层的架构取决于损失函数和训练数据的标签。由于我们的目标是在矢量表示中获得尽可能多的信息,比较层通常具有非常简单的架构。以下是一些常见的选择:
- 计算 v ₁和 v ₂
的余弦相似度标签为-1 到 1 之间的实数,损失函数为均方误差。 - 串联 v ₁、 v ₂和绝对元素差异|v₁-v₂|,接着是全连接层和一个 softmax 层
这是用于多类分类的,损失函数是交叉熵。 - 计算 v ₁和 v ₂
之间的欧几里德距离v₁v₂‖损失函数是对比损失或三重损失。由于这两个损失不太为人所知,我们将在下一节简要解释它们。
请注意,比较层应该是对称的 w.r.t. v ₁和 v ₂.结合双胞胎网络具有相同架构和权重的事实,这使得整个连体神经网络对称 w.r.t. x ₁和 x ₂.
损失函数
对比损失和三重损失都是基于距离的损失函数,主要用于学习向量表示,并且通常与连体神经网络结合使用。
对比损失
假设我们的数据集由不同类别的对象组成。例如,ImageNet 数据集由汽车图像、狗图像等组成。然后对于每一对输入( x ₁, x ₂),
- 如果 x ₁和 x ₂属于同一个类,我们希望它们的矢量表示相似。因此,我们希望最小化l=v₁-v₂‖。
- 另一方面,如果 x ₁和 x ₂属于不同的类,我们希望v₁-v₂‖比较大。我们要最小化的项是
L = max(0,m‖v₁v₂‖),其中 m 是一个超参数,称为余量。余量的想法是,当 v ₁和 v ₂相差足够大的时候, L 就已经是 0 了,不能再小了。因此,该模型不会浪费精力来进一步分离 v ₁和 v ₂,而是会关注其他输入对。
我们可以将这两种情况合并成一个公式:
*L* = *y ** ‖*v*₁ − *v*₂‖² + (1 - y) * max(0, *m* − ‖*v*₁ − *v*₂‖)²
其中 y = 1 如果 x ₁和 x ₂属于同一类,否则 y = 0。
三重损失
通过考虑输入的三元组( xa 、 xp 、 xn ),三元组损失将上述思想向前推进了一步。这里 xa 是锚对象, xp 是正对象(即 xa 和 xp 属于同一类),而 xn 是负对象(即 xa 和 xn 属于不同类)。我们的目标是使矢量表示 va 更类似于 vp 而不是 vn 。精确公式由下式给出
*L* = max(0, *m* + ‖*va* − *vp*‖ - ‖*va* − *vn*‖)
其中 m 是超参数余量。就像对比损失的情况一样,裕量决定了‖va**VP和‖va**VN之间的差异何时变得足够大,使得模型将不再从这三个一组中调整其权重。
对于对比损失和三元组损失,我们如何从不同类别的对象中采样输入对( x ₁, x ₂)和三元组( xa , xp , xn )对模型训练过程有很大影响。理想情况下,我们希望输入对和三元组对我们的模型来说不太容易,但也不太难。
履行
尽管我们在上图中有孪生网络 A 和 B,但实际上只有孪生网络的单个副本通常更方便。
def forward(self, x1, x2):
v1 = self.twin_network(x1)
v2 = self.twin_network(x2)
return self.comparison_layers(v1, v2)
TensorFlow 和 PyTorch 都内置了一些常见的损失函数。
张量流
PyTorch
- https://py torch . org/docs/stable/generated/torch . nn . cosineembeddingloss . html
- https://py torch . org/docs/stable/generated/torch . nn . tripletmarginloss . html
进一步阅读
- [1]是对连体神经网络的一个很好的概述。特别是,它包含了在不同领域,如图像分析,文本挖掘,生物学,医学和健康的暹罗神经网络应用的许多参考。
- [3]使用连体神经网络来微调由 BERT 产生的矢量表示。这是利用预训练模型的一个很好的例子。
- 三联体丢失在连体神经网络中非常普遍,并且在小批量设置中引入了它的变体。[4]在一批中为每一对锚或阳性选择“半硬”阴性,并仅在这些三元组上训练网络。下图最能说明“半硬”底片的概念:
- [2]在形成三元组时,为每个锚点选择一个批次中最难的肯定值和最难的否定值。这里最难是指最大的va—VP为正,或者最小的va—VN为负。我们参考5对这两种三重态损失变量的更详细解释,以及在 TensorFlow 中使用它们的 TensorFlow 附件文档。
参考
- D.奇克。连体神经网络:概述 (2020),人工神经网络,分子生物学方法,第 2190 卷,Springer 协议,第 73–94 页
- A.赫尔曼斯、l .拜尔和 b .莱贝。为人身重新鉴定三重缺失辩护 (2017),arXiv
- 名词(noun 的缩写)赖默斯和我古雷维奇。句子-BERT:使用连体 BERT 网络的句子嵌入 (2019),em NLP ijc NLP 2019
- F.Schroff,D. Kalenichenko 和 J. Philbin。 FaceNet:人脸识别和聚类的统一嵌入 (2015),CVPR 2015
- tensor flow 中的三元组丢失和在线三元组挖掘
什么是生存偏差,如何避免?
斯蒂芬·凯勒在的照片
评估不同的交易策略时,你需要考虑的一个简单因素
在我以前的一篇文章中,我建造了一个交易模拟器,并展示了一些结果。那些结果好得令人难以置信,然而我却欣喜若狂。有人对我说,我是一种叫做的东西的受害者。
总的来说,生存偏见是一种逻辑错误,即专注于在某种过程或一段时间内“幸存”的事物,而忽略那些没有幸存的事物。我想介绍一个简单的方法来帮助你避免同样的错误。
我的经历
如前所述,我建立了一个交易模拟器,并在上面测试了一个策略。测试时间从 2000 年 1 月 1 日至 2019 年 12 月 31 日。在此期间,这一策略在交易 S&P500 指数成份股时本可以产生 9438%的利润。
其中一条评论后来透露,我用的是目前活跃的股票。这是真的,整个模拟假设在 2000 年初,我们观察到组成 2019 年指数的相同符号。那种假设根本就是错误的!
相反,当遍历时间时,我应该做以下事情:
- 列出 2000-1-1 年构成 S&P500 指数的符号。
- 对于索引中的每次更新(一个符号被添加,另一个被删除),我也应该更新我的符号列表。
在我看来,这是对抗生存偏见的唯一方法,因为你会把失败者和成功者都考虑进去。
“历史是由胜利者书写的”——温斯顿·丘吉尔
查找相关数据
在谷歌搜索了一些相关数据后,我发现我在寻找的解决方案并不简单。根据维基百科的数据,在 1963 年 1 月 1 日至 2014 年 12 月 31 日期间,S & P500 的成分发生了 1186 次变化,而这里只列出了其中的 227 次。显然这不能完全相信。
谷歌的另一个结果告诉我,我可以花 97 美元购买 S&P500 指数的所有变更列表。出于一点小小的好奇,这有点过分了。我有点惊讶,如此琐碎的知识不是免费分享的。
下一个结果很有趣:
*[## S&P 100/500 历史组件
特定日期(变更)标准普尔 500 和 S&P 100 指数中的公司/指数成分列表。这些数据…
nemozny.github.io](https://nemozny.github.io/datasets/)*
这位作者花了很长时间提取索引数据,结果他整理出了一个漂亮的 JSON 文件 。这些条目包含两个名称-值对:一个用于日期,另一个用于组成 S & P500 指数的符号。由于它很难阅读,我不打算把整个文件粘贴到这里。相反,下图显示了 JSON 文件中两个条目的内容。你看它有多长就知道了!
JSON 文件中的两个条目。你看它有多长就知道了!
现在我们已经对 JSON 文件有了一些了解,让我们开始一些编码工作。
把它编成密码
如果我们仔细观察这个 JSON 文件,我们可以看到它是一个字典列表——每个条目都用一个 python 字典表示。我们可以用下面的代码加载数据:
*import jsonwith open('sp500-historical-components.json') as json_file:
data = json.load(json_file)*
同样,data
只是一个包含不同字典的列表。这个列表是无序的,让它有序可能很好。首先,让我们创建一个日期列表:
*dates = []
for entry in data:
dates.append(entry["Date"])*
我的代码终端显示dates
列表如下:
*['2012/11/30', '2016/10/31', '2017/04/28', '2017/05/03', '2017/03/31', '2016/12/30', '2016/08/31', '2016/09/30', '2017/01/31', '2017/02/28', '2016/07/29', '2016/06/30', '2016/04/29', '2016/05/31', '2015/10/30', '2015/07/31', '2016/01/29', '2016/02/29', '2016/03/31', '2015/12/31', '2015/11/30', '2015/09/30', '2015/08/31', '2015/06/30', '2015/05/29', '2015/04/30', '2014/12/31', '2015/01/30', '2014/10/31', '2014/11/28', '2015/02/27', '2014/09/30', '2015/03/31', '2014/08/29', '2014/05/30', '2014/06/30', '2014/07/31', '2014/03/31', '2014/04/30', '2013/12/31', '2013/11/29', '2014/01/31', '2014/02/28', '2013/10/31', '2013/08/30', '2013/07/31', '2013/09/30', '2012/12/31', '2013/05/31', '2013/06/28', '2012/10/31', '2013/02/28', '2013/03/28', '2013/01/31', '2013/04/30', '2012/08/31', '2016/11/30', '2012/09/28', '2012/04/30', '2012/06/29', '2012/03/30', '2012/07/31', '2012/05/31', '2012/02/29', '2011/10/31', '2012/01/31', '2011/08/31', '2011/05/31', '2011/06/30', '2011/02/28', '2011/03/31', '2010/12/31', '2010/11/30', '2011/12/30', '2011/11/30', '2010/09/30', '2010/10/29', '2011/09/30', '2011/07/29', '2010/06/30', '2011/04/29', '2011/01/31', '2010/02/26', '2010/01/29', '2009/12/31', '2010/08/31', '2010/04/30', '2010/07/30', '2010/03/31', '2010/05/28', '2009/09/30', '2009/08/31', '2009/10/30', '2009/04/30', '2009/11/30', '2009/03/31', '2009/06/30', '2009/07/31', '2009/02/27', '2009/05/29', '2009/01/30', '2008/10/31', '2008/11/28', '2008/12/31', '2008/09/30', '2008/08/29', '2008/07/31', '2008/06/30', '2008/04/30', '2008/05/30', '2008/01/31', '2008/02/29', '2008/03/31']*
现在我们可以肯定地看到我们的数据列表是无序的。此外,日期从 2008 年到 2017 年。由于这个列表中的日期不多(大约 100 个),我们可以使用一种健壮的方式来调用有序数据:
*datescopy = dates.copy()
datescopy.sort()indices = []
for date in datescopy:
indices.append(dates.index(date))*
这个方法创建了一个dates
的副本,并对其进行排序。一个列表indices
帮助我们映射有序和无序数据之间的日期。自己看:
*for index in indices:
print(data[index]["Date"])*
打印出来的日期是有序的。酷!
假设你想回测你的交易策略。您已经创建了您的交易模拟器,并特别希望包括 2008 年 1 月 31 日至 2017 年 5 月 3 日期间 S&P500 的股票。
你用data[indices[0]]["Symbols"]
初始化你的可交易符号,一旦根据data
有了更新,你也随着时间的推移更新你的符号列表。
这种方法简单易行,效果很好。不幸的是,这些数据在 2017 年停止,并且不再定期更新。如果你有更好的免费数据,请在评论中告诉我。
摘要
- 维基百科 https://en.wikipedia.org/wiki/List_of_S%26P_500_companies S&P500 组件列表:
- 数据集的链接:https://nemozny.github.io/datasets/
资源
什么是激活功能?
来源:米里亚姆·埃斯帕奇
神经网络最重要的部分之一
激活函数定义了给定一个输入或一组输入时一个神经元/节点的输出 。这是对生物神经元刺激的模拟。
激活函数到下一层(浅层神经网络中:输入层和输出层,深层网络中到下一个隐层)的输出称为前向传播(信息传播)。它被认为是一个神经网络的非线性变换。
一个笔记本的全部代码都在这里: GitHub
有一个常用的激活功能列表:
- 二进制
- 线性
- 乙状结肠
- 谭
- ReLU
- 泄漏的 ReLU (LReLU)
- 参数 ReLU (PReLU)
- 指数线性单位(eLU)
- ReLU-6
- Softplus
- 软设计
- Softmax
- 唰
二进制
二元激活函数是最简单的。它基于二进制分类器,如果值为负,输出为 0,否则为 1。把这个激活函数看作二元分类中的一个阈值。
二元激活函数的代码是:
def binary_active_function(x):
return 0 if x < 0 else 1
这个函数的输出是什么?
for i in [-5, -3, -1, 0, 2, 5]:
print(binary_active_function(i))output:
0
0
0
1
1
1
或者视觉上:
二元激活函数
优点:
- 二元分类
缺点:
- 在多标签分类中不起作用
- 梯度计算的导数始终为 0,因此无法更新权重
线性激活函数
二元函数之后的下一步是用线性函数代替阶跃。输出与输入成正比。
对应的代码是:
def linear_active_function(a, x):
return a*x
我们可以针对不同的a值来计算它:
$ x = numpy.linspace(-10, 10, 5000)
$ y_1 = [linear_active_function(1, i) for i in x] # a = 1
$ y_2 = [linear_active_function(2, i) for i in x] # a = 2
$ y_1
> [-10.0, -9.9, -9.8, -9.7, ..., 9.7, 9.8, 9.9, 10.0]
如果我们绘制 a = 1、2、4 和 10 的结果:
优点:
- 二元和多元分类
- 高度可解释性
缺点:
- 导数对应于" a ",因此在后推过程中权重和偏置的更新将是恒定的。
- 如果梯度总是相同,则效率不高。
乙状结肠的
Sigmoid 是使用最多的激活功能,带有 ReLU 和 tanh 。这是一个非线性激活函数,也称为逻辑函数。该激活函数输出在 0 和 1 之间变化。神经元的所有输出都将是正的。
相应的代码如下:
def sigmoid_active_function(x):
return 1./(1+numpy.exp(-x))
快速计算:
$ x = numpy.linspace(-10, 10, 5000)
$ y = [sigmoid_active_function(i) for i in x]
$ y
> [4.5397868702434395e-05, 4.5854103946941324e-05, ... , 0.9999532196250409, 0.9999536850759906, 0.9999541458960531]
如果我们画出结果:
Sigmoid 激活函数
缺点:
- 这个函数的问题是每个神经元的输出会饱和。大于 1 的值表示为 1,小于 0 的值表示为 0。
- sigmoid 函数的最佳灵敏度在中心点(0,0.5)附近。
- 在饱和期间出现了一个大问题,算法在这个位置期间无法学习(这是消失梯度问题的来源,对应于梯度中没有方向)。
双曲正切
正切双曲函数(tanh)与 sigmoï函数的形式相似。Tanh 在 0 中是对称的,值在-1 和 1 的范围内。作为乙状结肠,它们在中心点(0,0)非常敏感,但是它们对于非常大的数(正和负)饱和。这种对称性使它们比 sigmoid 函数更好。
应用双曲正切函数的相应代码是:
def tanh_active_function(x):
return 2*sigmoid_active_function(2*x)-1
计算 y 值:
$ x = numpy.linspace(-10, 10, 5000)
$ y = [tanh_active_function(i) for i in x]
$ y
> [-0.9999999958776927, -0.9999999957944167, ... , 0.9999999956227836, 0.9999999957094583, 0.9999999957944166]
以及相应的结果:
tanh 激活函数
优点:
- 范围在-1 和 1 之间
- 梯度比 sigmoid 更强(导数更陡)
缺点:
- 像 sigmoid 一样,tanh 也有一个消失梯度问题
- 浸透
热卢
开发了整流线性单元以避免大正数的饱和。非线性允许保存和学习数据中的模式,线性部分(>0-也称为分段线性函数)使它们易于解释。
下面的函数显示了如何实现 ReLU 函数:
def relu_active_function(x):
return numpy.array([0, x]).max()
y 计算:
$ x = numpy.linspace(-10, 10, 5000)
$ y = [relu_active_function(i) for i in x]
$ y
> [0.0, 0.0, ... , 9.97, 9.98, 9.99]
结果是:
ReLU 激活功能
优点:
- 易于实施且速度非常快
- 真 0 值
- 当激活函数是线性时,优化是容易的
- 最常用于神经网络生态系统
缺点:
- 当 x = 0 时,函数不可微。这个点的梯度下降无法计算,但实际上这没有影响。线性部分对应于值为 1 的斜率,负部分等于零。
- “垂死的 ReLU 问题”:如果输出为 0,则对应于神经元的不活跃部分。当神经元不活动时没有梯度,因此如果大部分神经元没有被激活,则可能导致模型的较差性能
- 不适用于 RNN 类算法(RNN、LSTM、GRU)
泄漏 ReLU
该激活功能是 ReLU 激活功能的修改,以避免“死亡问题”。该函数返回线性斜率,其中 a=0.01,这允许用梯度流保持激活神经元。
参见下面的代码:
def leaky_relu_active_function(x):
return 0.01*x if x < 0 else x
计算 y 轴来绘制结果:
$ x = numpy.linspace(-10, 10, 5000)
$ y = [leaky_relu_active_function(i) for i in x]
$ y
> [-0.1, -0.0999, ... , 9.97, 9.98, 9.99]
绘制结果图:
泄漏 ReLU 激活功能
优点:
- 纠正“将死的 ReLU 问题”
- 零件 y=x 的 ReLU 激活功能的相同组成部分
参数 ReLU
在泄漏 ReLU 之后,创建了另一个激活函数来避免“死亡 ReLU 问题”,即参数化的 ReLU。系数 a 不锁定在 0.01(泄漏 ReLU),但可以自由估计。它是 ReLU 的推广,算法学习整流器参数。
代码:
def parametric_relu_active_function(a, x):
return a*x if x < 0 else x
计算不同 a 值的结果:
$ x = numpy.linspace(-10, 10, 5000)
$ y_1 = [parametric_relu_active_function(0.25, i) for i in x]
$ y_2 = [parametric_relu_active_function(0.5, i) for i in x]
$ y_3 = [parametric_relu_active_function(0.75, i) for i in x]
$ y_4 = [parametric_relu_active_function(1, i) for i in x]
$ y_1
> [-2.5, -2.4975, ... , 9.97, 9.98, 9.99]
绘制 a = 0.25,0.5,0.75,1:
参数 ReLU 激活函数
如果 a = 0,参数 ReLU 相当于 ReLU 激活函数。如果 a=0.01,参数 ReLU 对应于泄漏 ReLU。
优点:
- 推广 ReLU 激活函数
- 避免“垂死的 ReLU 问题”
- 神经网络学习参数“ a
指数线性单位
eLU 是 ReLU 函数的另一种变体。函数的负部分由缓慢平滑的指数函数处理。
相应的功能:
def elu_active_function(a, x):
return a*(numpy.exp(x)-1) if x < 0 else x
y 计算:
$ x = numpy.linspace(-10, 10, 5000)
$ y_1 = [elu_active_function(0.1, i) for i in x]
$ y_2 = [elu_active_function(1, i) for i in x]
$ y_3 = [elu_active_function(2, i) for i in x]
$ y_4 = [elu_active_function(5, i) for i in x]
$ y_1
> [-0.09999546000702375, -0.09999541437933579, ... , 9.97, 9.98, 9.99]
绘制 a = 0.1,1,2,4 的结果:
eLU 激活功能
优点:
- ELU 慢慢变得平滑,直到其输出等于-α,而 RELU 急剧平滑。
- ELU 是 ReLU 的有力替代者。
- 与 ReLU 不同,eLU 可以产生负输出。
缺点:
- 对于 x > 0,可以用输出范围[0,inf]吹爆激活。
ReLU-6
ReLU 函数的另一个变体是 ReLU-6,6 是手动固定的任意参数。优点是将大正数的输出整形为 6 值。
相应的代码:
def relu_6_active_function(x):
return numpy.array([0, x]).max() if x<6 else 6
y 计算:
$ y = [relu_6_active_function(i) for i in x]
绘制结果图:
ReLU-6 激活功能
Softplus
softplus 激活功能是 sigmoid 和 tanh 功能的替代功能。此功能有限制(上限、下限),但 softplus 在范围(0,+inf)内。
相应的代码:
def softplus_active_function(x):
return math.log(1+numpy.exp(x))
y 计算:
$ y = [softplus_active_function(i) for i in x]
绘制结果图:
Softplus 激活功能
软设计
这种激活函数是 tanh 的一种变体,但在实践中并不常用。tanh 和 softsign 函数密切相关,tanh 指数收敛,而 softsign 多项式收敛。
相应的代码:
def softsign_active_function(x):
return x / (1 + abs(x) )$ y = [softsign_active_function(i) for i in x]
绘制结果图:
软设计激活功能
Softmax
softmax 激活函数不同于其他函数,因为它计算概率分布。输出的总和等于 1。
相应的代码:
def softmax_active_function(x):
return numpy.exp(x)/numpy.sum(numpy.exp(x))
计算输出是不同的,因为它是考虑到指数和的概率分布,函数需要所有的 x 点来计算输出 y 。
$ x = [0.8, 1.2, 2.4, 4.6]
$ y = softmax_active_function(x)
$ y
> [0.01917691, 0.02860859, 0.09498386, 0.85723064]
$ numpy.sum(y)
> 1.0
嗖嗖
Swish 是较新的激活功能,由谷歌在 2017 年发布,它提高了 ReLU 在更深模型上的性能。这个函数是 sigmoid 函数的变体,因为它可以表示为:x*sigmoid(x)。
Swish 具有在零点的单侧有界性、光滑性和非单调性,这些性质可能在 Swish 和类似激活函数的观察功效中起作用。
SWISH:一个自门控激活函数,Prajit Ramachandran,Barret Zoph,Quoc V. Le,2017
相应的代码:
def swish_active_function(x):
return x/(1+numpy.exp(-x))
或者:
def swish_active_function(x):
return x*sigmoid_active_function(x)
计算值:
$ x = numpy.linspace(-10, 10, 5000)
$ y = [swish_active_function(i) for i in x]
$ y
> [-0.0004539786870243439, -0.0004967044303692657, ..., 9.699405586525717, 9.799456604457717, 9.89950329556963]
绘制结果图:
Swish 激活功能
优点:
- 与 ReLU 相比,每个点都是可微的
结论
这里展示了一些激活函数(最流行的)及其代码和表示。希望这种视觉化可以让每个人理解神经元的输出,并决定哪种功能更适合他们处理的问题。
最后一个图对应于一个图形中的激活功能堆栈。
所有激活功能(无 softmax)
参考
- https://medium.com/r/?URL = https % 3A % 2F % 2f ml-cheat sheet . readthedocs . io % 2 fen % 2 flatest % 2 factivation _ functions . html
- https://machine learning mastery . com/rectified-linear-activation-function-for-deep-learning-neural-networks/
- 伊恩·古德菲勒,约书亚·本吉奥和亚伦·库维尔,深度学习(2016 年),麻省理工学院
- Kevin Jarrett 等,物体识别最好的多阶段架构是什么? (2009),电气和电子工程师协会
- Vinod Nair 和 Geoffrey Hinton,整流线性单元改进受限玻尔兹曼机器 (2010),美国计算机学会
- Xavier Glorot,Antoine Bordes,Yoshua Bengio , 深度稀疏整流器神经网络 (2011),机器学习研究论文集
- Andrew L. Maas、Awni Y. Hannun 和 Andrew Y. Ng,整流器非线性改善神经网络声学模型 (2013),斯坦福
- 泽维尔·格洛特,约舒阿·本吉奥,理解训练深度前馈神经网络的难度 (2010),《机器学习研究论文集》
- 何等,深入研究整流器:在 ImageNet 分类上超越人类水平 (2015).
- 激活功能,维基百科
- 消失渐变问题,维基百科
- 整流器(神经网络),维基百科
- 分段线性函数,维基
- https://medium . com/@丹青/a-practical-guide-to-relu-b 83 ca 804 f1 f 7
- 温岭尚、 Kihyuk Sohn 、迪奥戈阿尔梅达、 Honglak Lee 、通过级联整流线性单元理解和改进卷积神经网络 (2016)、
- Softmax 函数,维基百科
- https://medium . com/@ himanshuxd/activation-functions-sigmoid-relu-leaky-relu-and-soft max-basics-for-neural-networks-and-deep-8d 9c 70 eed 91 e
- 普拉吉特·拉玛钱德朗,巴雷特·佐夫,阔克诉勒,寻找激活函数 (2017),arxiv.org
亚马逊 EC2 是什么,怎么用?
云计算
使用 AWS 云上的 GPU 实例训练您的模型。
克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片
AWS——云计算的先锋
云计算可以被认为是将 IT 产品转变为 IT 服务。
亚马逊网络服务(AWS)是亚马逊提供的按需云计算服务和应用程序编程接口(API)。自 2006 年成立以来,AWS 经历了多年的发展,现已从全球数据中心提供超过 175 种全功能服务。
在本文中,我将介绍一下亚马逊弹性计算云(EC2) 的基础知识,这是一个允许用户启动实例的 web 服务,它在云中提供安全且可调整大小的计算能力。
稍后,我们将学习部署 EC2 实例,用于 ML/DL 模型培训。
EC2 的特点
- EC2 实例是随需应变的,是可靠且可扩展的基础设施,能够在几分钟内增加和减少容量。
2.预先配置的 AMIs。
3.可配置的 CPU、内存存储和网络容量称为**实例类型,**在实例上运行您的应用程序或软件。
4.用于安全登录实例的公钥和私钥对。
5.实例存储卷用于存储当您停止或终止实例时删除的临时数据。
6.访问 Amazon Elastic Block Store(Amazon EBS)获取持久存储卷。
7.静态 IPv4 地址称为弹性 IP 地址用于动态云计算。
8.部署与 AWS 云逻辑隔离的虚拟专用云(VPC)。
9.这是一种按需服务,在实例终止之前,您将按使用情况付费。
10.当实例重新启动时,它会移动到新的主机上。请务必注意,您不能重新启动已终止的实例,但可以制作名为 images 的实例的副本,并从该映像启动新实例。
11.Amazon EC2 基础设施是可编程的,您可以使用脚本来自动化部署过程、安装和配置。
12.如果您担心 Amazon EC2 实例上的敏感和机密数据,您最好在上传之前加密数据。
基础设施
亚马逊机器映像(AMI)
为了使用 EC2 实例,我们需要使用 Amazon 机器映像创建一个虚拟机。这些虚拟计算环境被称为实例。
AMI 是一个模板,包含启动 EC2 实例所需的所有信息。您可以将 AMI 视为一个包含操作系统、应用服务器和应用程序的盒子。
您可以启动作为云中虚拟服务器运行的 ami 副本的实例。
用户可以访问预配置的 ami,也可以对它们进行定制。
可以从单个 AMI 启动多个实例,AMI 的硬件由实例类型决定。
位置
AWS EC2 实例可在全球范围内获得。这些位置具有区域、可用性区域、本地区域和波长区域。
地区是遥远的、独立的地理区域。
每个区域都有多个隔离位置的可用性区域。
这些隔离的位置具有本地区域,您可以将计算和存储等资源放置在离终端用户更近的多个位置。
波长区域向 5G 设备和终端用户部署具有超低延迟的 AWS。
储存;储备
AWS EC2 支持 AWS EC2 实例存储、AWS EBS 和 AWS S3。
AWS EC2 实例商店
AWS EC2 实例存储是临时的块级存储。它位于主机的磁盘上。因为它是临时存储,所以当关联的实例停止或终止时,数据不会持续。因此,EC2 实例存储并不意味着长期数据存储。在这种情况下,你必须选择 EBS 或 S3。
AWS EC2 实例存储不可移植。这意味着您不能从一个实例分离并将其附加到另一个实例。
AWS EBS
AWS 弹性块存储(AWS EBS)是推荐的存储选项。它是持久存储。
一个实例可以有多个 EBS 卷。
AWS S3
AWS 简单存储服务(AWS S3)本质上是一个存储桶。你可以在网上的任何地方存储和检索任何数量的数据。
人们可以从 EBS 复制数据,称为快照,并将其保存在 S3。这可以在以后用于创建一个新的 EBS 卷,该卷可以连接到另一个 EC2 实例。因此,您可以从实例中分离卷,并将其附加到不同的实例。
根设备卷
根设备卷包含用于引导 EC2 实例的映像。当实例终止时,这个卷被删除(DeleteOnTermination
属性是true
)。然而,这种行为也是可以改变的。
网络和安全性
默认情况下,EC2 实例在启动到默认 VPC 时具有 IPv4 地址。在非默认 VPC 的情况下,应该在启动时专门分配 IPv4 地址。
当一个实例出现故障时,被替换的实例具有与原始实例不同的 IPv4 地址。如果你的应用需要一个静态 IPv4 地址,Amazon EC2 提供了弹性 IP 地址。
安全组可用于控制对实例的访问。可以将单个实例分配给具有特定规则的多个组。
AWS 身份和访问管理(AWS IAM)
IAM 允许您向 AWS 帐户添加用户和组,并为每个用户分配特定的安全凭据。资源可以在同一个帐户和另一个 AWS 帐户中的用户之间共享。用户可以控制每个用户使用 AWS 资源执行任务的权限。
通过在 Amazon EC2 中使用 IAM,您可以完全控制使用 Amazon EC2 和特定 AWS 资源执行任务的用户。
设置您的 AWS EC2
我希望你已经在 AWS 上注册了一个帐户。如果不是这样做。现在前往 AWS 管理控制台。
AWS 管理控制台主页。图片由作者提供。
登录 AWS 控制台后,从标有服务的下拉菜单中选择 EC2。
在使用任何 AWS 服务之前,我们需要检查并在必要时修改我们计划使用的特定资源的 AWS 服务限制。所以让我们来研究一下。
GPU 限制增加请求
AWS 资源有一个默认配额,称为“限制”。这些限制取决于您的 AWS 帐户所在的地区。现在,我将只专门讨论 EC2 实例。
提高 GPU 极限的步骤:
1.我们首先需要选择适当的 AWS 区域,它支持我们选择使用的 GPU 实例。我们将使用 p2.xlarge. P2 是功能强大且可扩展的并行处理 GPU 实例。
2 .确保您的 AWS 区域支持该特定实例。你可以在这里交叉核对。
3.现在您的地区已经设置好了,我们需要在此链接查看您的 EC2 服务限制报告,并找到您在 P2 的“当前限制”。(或者转到 EC2 仪表板,点击限值,查看 P2 限值)。
AWS EC2 仪表板。点击限制。图片由作者提供。
4.**你的上限将是 0。**这意味着什么?AWS 将用户可以运行的 p2.xlarge 实例的数量限制为 0,这实际上阻止了您启动该实例。
P2 资源限制 0。图片由作者提供。
5.如果 p2.xlarge 实例的限制为 0,则需要增加限制才能启动实例。
6.点击计算 vCPU 限值以提出限值增加请求。极限计算器用于计算您需要多少 vCPUs(虚拟中央处理器)来启动您的按需实例,在我们的例子中是 P2。
增加限制。图片由作者提供。
7.点击添加实例类型,选择 p2.xlarge. 确保 实例计数为 1 。验证新限值显示的是 4 个 vcpu,然后点击请求增加限值。 *除非你启动一个实例,否则请求增加限额不会从你的卡上扣款。*这将打开以下屏幕。如果尚未选择,点击服务限制增加。
服务限制增加。图片由作者提供。
8.案例详细信息中的限制类型将是 EC2 实例。现在,在请求下,选择 AWS 账户的区域,然后选择主实例类型为 所有 P 实例。将新的限值设置为 大于 4。
9.向下滚动填写案例描述您的限额增加案例,并点击**提交。您将收到一封带有相应案例 ID 的邮件。**您必须等待 AWS 批准您的限额增加请求。AWS 通常会在 48 小时内批准这些请求。
注意: 如果您从未在 AWS 上启动过任何类型的实例,您可能会收到一封来自 AWS 支持部门的电子邮件,要求您在他们批准增加限额之前,通过创建实例来初始化您的帐户。
启动我们的 EC2 GPU 实例
一旦 AWS 批准了您的 GPU 限制增加请求,您就可以开始启动实例的过程。
启动 EC2 GPU 实例的步骤:
- 单击启动实例
- 选择一个亚马逊机器映像(AMI)。我们将使用深度学习 AMI。
- 选择实例类型。如前所述,我们将使用 p2.xlarge.
- 新闻评论和发布。它会将您带到一个页面,您可以在其中进一步更新配置详细信息、存储卷等。现在,让我们只编辑安全组。
- 配置安全组—将一组防火墙规则附加到您的实例,以控制传入实例的流量。只需点击 e dit 安全组选项并选择创建一个新的安全组。让我们将这个安全组命名为“ *Jupyter”。*按下键添加规则。将端口范围 8888** 和源的自定义 TCP 规则**设置为 anywhere 。
- 点击发射。
- 现在让我们创建一个认证密钥对。这样做是为了访问您的 GPU 实例。点击 c 创建新的密钥对并点击下载密钥对按钮。这样会下载一个**。pem 文件**,您需要它来访问您的实例。
- 移动下载的。pem 文件保存到您计算机上的安全位置,因为您需要该文件来通过您选择的位置访问您的实例。下载完。pem 文件,点击 l 启动实例。
- 单击查看实例按钮,转到 EC2 管理控制台,查看实例引导。
启动实例(橙色按钮)。图片由作者提供。
选择 AMI。深度学习 AMI。图片由作者提供。
选择 GPU。p2.xlarge .作者图片。
编辑安全组。图片由作者提供。
实例已启动。图片由作者提供。
注意:
关闭任何未使用的实例或其他 AWS 资源,否则将按小时收费。AWS 对正在运行的实例收费,直到您停止实例。但是,在您“终止”(即删除)该实例之前,还会继续产生较小的存储费用。
AWS 计费警报
没有办法将 AWS 限制在特定的预算范围内,并在达到该阈值时自动关闭。但是,您可以设置 AWS 计费警报。
登录您的 AWS EC2 实例
- 转到 EC2 仪表板,点击运行实例的选项。将显示您的实例。
- 记下 IPv4 地址。
- 从终端导航到您存储的位置。pem 文件。(例如,如果你把你的。pem 文件时,
cd ~/Desktop/
会将您移动到正确的目录。) - 键入
ssh -i YourKeyName.pem ubuntu@X.X.X.X
,其中:X.X.X.X
是在 AWS 中找到的 IPv4 公共 IP,YourKeyName.pem
是您的名称。pem 文件。 - 在您的实例中,为了创建 Jupyter 笔记本设置的配置文件,请键入:
jupyter notebook --generate-config
。 - 打开任何 GitHub repo 或克隆到实例终端。
- 启动 Jupyter 笔记本
jupyter notebook --ip=0.0.0.0
- 现在,您的终端将以这种方式显示令牌 ID:
unnecessary_stuff:8888/?token=something_useful_here
9.通过访问X.X.X.X:8888/?token=...
,从您的 web 浏览器访问 Jupyter 笔记本索引(其中 X.X.X.X 是您 EC2 实例的 IP 地址,以:8888/?token=
开头的内容是您刚刚复制的内容)。万岁。给你。您的 Jupyter 笔记本已经在 EC2 实例上启动并运行。恭喜你。
10.要关闭笔记本,请按 ctrl-c 两次,要退出实例终端,请键入 exit。
外卖食品
您可以通过键入conda config-set auto _ activate _ base true在启动时激活 conda
有时您的实例可能没有所需的包,只需 pip 安装相同的包。
如果你有一个 requirements.txt 文件,只需输入sudo python3 -m pip install -r requirements.tx
不使用时停止并终止实例。您需要理解,即使实例没有被使用,AWS 也会向您收费。因此,正在运行和空闲的实例也会烧光你的口袋。这是 AWS 的一个缺点。另一方面,如果实例空闲,Google Cloud 不会向您收费。
结论
恭喜你。现在你知道什么是亚马逊 EC2,以及如何使用它。AWS 是最常用的云服务,因此熟悉 1 或 2 项技术是有用的。亚马逊 EC2 有更多的功能。打开 EC2 仪表板,了解更多信息。我希望您了解如何部署 GPU 实例。下一场见。干杯!
谢谢你。
什么是编码器解码器模型?
编码器解码器是深度学习中广泛使用的结构,通过本文,我们将了解其架构
迈克尔·泽兹奇在 Unsplash 上的照片
在本文中,我们将介绍一些情况下称为序列对序列(Seq2Seq)模型的编码器和解码器结构。为了更好地理解这个模型的结构,先前关于 RNN 的知识是有帮助的。
我们什么时候使用编码器解码器模型?
1-图像字幕
编码器解码器模型允许机器学习模型生成描述图像的句子的过程。它接收图像作为输入,并输出一系列单词。这也适用于视频。
ML 输出:“棕榈树环绕的通往海滩的道路”,照片由 Milo Miloezger 在 Unsplash 上拍摄
2-情感分析
这些模型理解输入句子的含义和情感,并输出情感得分。它的等级通常在-1(负)和 1(正)之间,其中 0 表示中性。它在呼叫中心用于分析客户情绪的演变以及他们对某些关键词或公司折扣的反应。
作者图片
3-翻译
这个模型阅读输入的句子,理解其中的信息和概念,然后把它翻译成第二种语言。谷歌翻译是建立在一个编码器解码器结构上的,更多细节请参见本文。
作者图片
什么是编码器解码器模型?
理解编码器-解码器模型概念的最佳方式是玩猜图游戏。游戏的规则非常简单,玩家 1 从列表中随机选择一个单词,并需要在一张图中勾画出其含义。团队中第二个玩家的角色是分析图画,并识别图画所描述的单词。在这个例子中,我们有三个重要的元素玩家 1(将单词转换成图画的人)、图画(兔子)和猜测图画代表的单词的人(玩家 2)。这就是我们理解一个编码器解码器模型所需要的,下面我们将建立一个比较的猜字游戏和一个将西班牙语翻译成英语的编码器解码器模型。
猜谜游戏,作者图片
如果我们将上面的图表转化为机器学习概念,我们会看到下面的图表。在接下来的章节中,我们将详细介绍每个组件。
编码器解码器模型,图片由作者提供
1-编码器(画师)
编码意味着将数据转换成所需的格式。在图片示例中,我们将单词(文本)转换为图片(图像)。在机器学习的背景下,我们将西班牙语中的单词序列转换成一个二维向量,这个二维向量也被称为隐藏状态。编码器由递归神经网络(RNN) 堆叠而成。我们使用这种类型的层,因为它的结构允许模型理解序列的上下文和时间依赖性。编码器的输出,即隐藏状态,是最后一个 RNN 时间步长的状态。
编码器,图片作者
2-隐藏状态(草图)
编码器的输出,一个封装了输入序列全部含义的二维向量。向量的长度取决于 RNN 中细胞的数量。
编码器和隐藏状态,图片由作者提供
三解码器
解码意味着将编码信息转换成可理解的语言。小组中第二个玩猜字游戏的人将把图画转换成单词。在机器学习模型中,解码器的作用将是将二维向量转换成输出序列,即英语句子。它也建立了 RNN 层和一个密集层,以预测英语单词。
解码器,图片由作者提供
结论
这种模型的主要优点之一是输入和输出序列的长度可能不同。这为非常有趣的应用打开了大门,如视频字幕或问答。
这种简单的编码器/解码器模型的主要限制在于,对于很难实现的长输入序列,所有信息都需要在一维向量中进行总结。话虽如此,理解编码器解码器模型是 NLP 最新进展的关键,因为它是注意力模型和变压器的种子。在下一篇文章中,我们将遵循使用编码器/解码器结构构建翻译模型的过程。然后,我们将继续探索注意力机制,以实现更高的准确性。
[## 如何建立一个编码器解码器翻译模型使用 LSTM 与 Python 和 Keras。
按照这一步一步的指南来建立一个编码器和解码器模型,并创建自己的翻译模型。
towardsdatascience.com](/how-to-build-an-encoder-decoder-translation-model-using-lstm-with-python-and-keras-a31e9d864b9b)
什么是离群值?
你就是!
其实不是。这不是一篇关于你的文章。
但是,正如格拉德威尔在《离群者》一书中所说的,如果你发现自己是那种离群者,你相当幸运。而且罕见。
什么是真正的离群值?
照片由来自 Pexels 的 Daniel Reche 拍摄
根据 Meriam-Webster 的说法,异常值是:
“在数值上与样本中的其他值明显不同的统计观察”
但你不是为此而来的,对吧?
让我们简单地解释一下什么时候一个数据点被认为是异常值,为什么会这样,以及你能做些什么。
什么时候?
有多种方法可以识别和突出异常值,但我们的目标是保持简洁,所以让我们讨论最简单的方法。你可以在这里找到其他方法。
如果任何观测值超出第一个四分位数-1.5 倍 IQR 到第三个四分位数+ 1.5 倍 IQR 的范围,则被视为异常值。
资料来源:giphy.com
呆在这里!
我保证会很容易,所以会的。我们只需要确定这个 IQR(四分位数间距)意味着什么。
让我们假设你要见你的高中同事,9 个人。都是开车来的。为了便于解释,让我们想象一下,我们按照升序收集所有汽车的马力数据。
收集了 105 | 133 | 146 | 183 | 190 | 195 | 210 | 220 | 510←个值
如果你懂一点统计学,我们有所谓的四分位数。如果您不记得,请查看此处的然后再回来。
IQR =第三个四分位数-第一个四分位数= 215–139.5 = 75.5
现在,回到我们例子中的异常值,我们需要计算 Q1-1.5 倍 IQR 和 Q3+1.5 倍 IQR。
- Q1-1.5 x IQR = 139.5–75.5 = 64*(Q1——第一个四分位数)*
- Q3+1.5 x IQR = 215+75.5 = 290.5*(Q3—第三个四分位数)*
我们很亲密。留在这里!
如开始计算前所述,任何超出区间[64;290.5]被认为是异常值。与收集的数据相比的极值。问题是,在我们的数据中是否有超出区间的值?没错, 510 就是。(让我们假设那是你,你有一辆新的宝马 M5)。
这是从一组简单收集的数据中计算异常值的非常简单的方法。
为什么?
异常值可能出现在一组数据中有多种原因。有好有坏。
数据输入错误 →您想要键入 210 而不是 510,因此该值成为异常值;
测量错误 →你已经在一家以夸大数据闻名的服务中心测量了你的汽车的功率。510 不是真的。
实验误差→ 你的一个同事,有 105 的那个告诉你数值是 kw 而不是马力,误会是实验误差;
故意的 →你在考验你的同事,告诉他们一个不真实的值;
自然→ 这就是我们的处境,你真的是一个骗子,你的 M5 力量不是实验测量 BS,你真的是一个异数。
什么?
现在你知道它们是什么,你如何找到它们,以及什么可能导致它们,怎样做才能利用或消除它们?
- 如果你想吹嘘你班上的 hp 平均值有多高,保持数值。考虑平均值不具有代表性,因为它受到异常值的影响。你。
- 如果你认为你的车与众不同,你是其他车的例外,去掉你的价值。
- 如果你觉得有其他开着豪车的高中同事却没有出现,那就再开一次会,把你的小组当成一个不同的小组。
就这样。
资料来源:giphy.com
和往常一样,这是一种过于简单和幽默的方法来解释相当复杂的统计概念。
如果你喜欢我的作品,可以考虑看看我的其他帖子,我尽量每周发布:
[警告这太容易了] -包含简短的示例 R 代码
towardsdatascience.com](/standard-deviation-vs-standard-error-5210e3bc9c04) [## 我们为什么用 0.05?
还是不是?
towardsdatascience.com](/why-do-we-use-0-05-8cd43a39edfa)
什么是人工智能?
一口大小的视角
直截了当的介绍
Jelleke Vanooteghem 在 Unsplash 上拍摄的照片
人工智能(AI)是一个你可能听说过的术语——它对社会产生了巨大的影响,并被广泛用于各种行业和应用。那么,AI 到底是什么,能做什么?这里简单介绍一下。
人工智能(AI)是我们日常生活的一部分——从语言翻译到医疗诊断和无人驾驶汽车到面部识别——它每天都在对行业和社会产生越来越大的影响。
但是 AI 到底是什么?
简单来说,AI 就是 通过计算机、系统或机器 复制人类智能的技术。
然而,这是一个相当宽泛的描述,不同的人有不同的解释方式。让我们考虑几个:
- 《麻省理工技术评论》将人工智能描述为“T14 寻求建造能够推理、学习和智能行动的机器”
- IBM 认为“任何能够模拟人类智能和思维过程的系统都被称为具有人工智能”
- 安德鲁·摩尔,卡耐基·梅隆大学计算机科学系主任,建议人工智能是“让计算机以我们认为需要人类智能的方式运转的科学和工程”
- 人工智能的先驱明斯基和麦卡锡曾说过,对于机器执行的任何任务,如果需要人工智能来完成同样的任务,那么这项任务就被认为是人工智能
无论如何描述,人工智能的概念并不新鲜,至少从 1950 年就已经存在了。当时,颇具影响力的计算机科学家和数学家艾伦·图灵(Alan Turing)推测人工智能是“会思考的机器”。
图灵接着开发了“图灵测试”,该测试基于机器以类似人类的能力进行推理谜题的能力来识别人工智能。
人工智能为什么重要?
自图灵时代以来,人工智能已经走过了漫长的道路,现在已经拥有令人印象深刻的能力,包括语言解释和复杂的推理。
例如,2011 年,IBM 的人工智能机器“沃森”在流行的单词联想游戏 Jeopardy 中击败了人类冠军。这对于人工智能来说是一个相当大的成就——对于传统的计算机程序来说,在危险中使用的关联并不容易处理。
在人工智能能力的另一次展示中,2015 年,英国公司 DeepMind Technologies 发布了 AlphaGo 。这是一台人工智能机器,它在古代围棋比赛中击败了(人类)世界冠军。
围棋是一种高度复杂的游戏,需要直觉和创造力——以前认为机器不可能在围棋上击败人类冠军。AlphaGo 的胜利是人工智能的一个重要里程碑。
但是除了这些令人印象深刻的壮举,是什么让人工智能变得重要?
人工智能很重要,因为它在许多方面有助于改善我们的生活。这是人工智能越来越有吸引力的一个简单而有力的原因。
让我们来看一些例子,看看人工智能是如何影响我们的工作和生活的。
人工智能能做什么?
人工智能的应用多种多样,以下只是几个例子:
机器人学
人工智能正在为制造装配线、仓储、消费电子产品、无人机甚至商业厨房的先进机器人技术提供动力。
例如,Miso Robotics 创造了能够烹饪和上菜的自主机器人。他们使用 3D 热视觉从周围环境中学习并获得新技能。
iRobot 制造家用机器人清洁和生活设备。他们最受欢迎的产品是真空吸尘器,可以确定房间大小,检测地板类型,记住房间里的物品位置,并选择最佳路线。
卫生保健
人工智能正在启用虚拟助手,这些助手可以节省护士的时间,并帮助医生处理工作流程。这也减少了制药公司的研究时间和成本。
人工智能正在通过以下公司进入医疗保健领域:
金融
人工智能在金融中用于提供准确、实时的报告和处理大量数据。
个人金融行业也一直在使用机器人顾问,这是一种人工智能算法,提供个性化的财务规划工具。例如,金融服务公司 Betterment 利用人工智能为其客户提供量身定制的投资组合管理服务。
在投资管理领域,AlphaSense 等公司使用人工智能金融搜索引擎来帮助他们的客户在投资过程中获得信息优势。
社会化媒体
脸书、Twitter 和 Slack 等公司正在使用人工智能来改善其平台的交互、安全性和体验。
Twitter 使用人工智能来帮助识别具有社会破坏性的语言,如仇恨言论。
Slack 是一个工作场所协作平台,利用人工智能过滤相关消息,突出知识专长,帮助员工提高工作效率。
营销
人工智能在帮助公司改善客户细分、内容创作和线索生成方面非常成功。
Amplero 是一家使用人工智能来帮助公司执行和优化营销活动的公司。它通过更好的客户细分和对购买偏好的实时分析来做到这一点。
Drift 是另一家通过聊天机器人使用人工智能来帮助客户的公司。聊天机器人帮助解决产品问题,并帮助确定满足客户需求的最佳产品或服务。
人工智能的类型
人工智能显然有大量的能力,并涵盖了广泛的应用领域。
随着人工智能的发展,它也发展了一系列子学科——监督学习、非监督学习、强化学习、神经网络、机器学习、深度学习、自然语言处理和计算机视觉都是人工智能的例子。
上述人工智能应用的例子在做它们所做的事情时使用了这些子学科中的一个或多个。
例如,Drift 使用自然语言处理来为聊天机器人提供动力,而 Miso Robotics 使用深度学习来帮助机器人“看”和准备食物,AlphaSense 使用一系列子学科来获得投资优势。
自然语言处理近年来发展迅速,并在许多方面改善了我们的生活。所以…
highdemandskills.com](https://highdemandskills.com/natural-language-processing-explained-simply/)
但是描述人工智能的不同子学科并不总是容易的,因为它们在实践中经常重叠,并且在如何组织它们方面没有明确的一致意见。
为了帮助理解它,维基百科提供了人工智能的全面概述,包括它的历史,子学科,应用和挑战。对于人工智能更简洁的总结,的这篇文章作者 Richaldo Elias 也值得一读。
或者,复杂性科学家和技术投资者 Francesco Corea 开发了一种组织人工智能的有用方法,称为“人工智能知识地图”。你可以在这篇文章里了解一下。Corea 的知识地图为人工智能的不同领域如何相互联系提供了一个简洁的视觉总结。
许多人工智能新人将可能参与机器学习、深度学习或自然语言处理。近年来,这些领域得到了大量的研究,并在大量用例中成功部署。
AI 的下一步是什么?
根据牛津理论神经科学实验室主任西蒙·斯金格的说法:
“人工智能研究的目的是开发一种机器,能够承担人脑可以完成的任何认知任务。”——西蒙·斯特林格
斯特林格这么说是什么意思?
他提出了一种人工智能状态,通常被称为“人工通用智能”或 AGI。
AGI 被视为人工智能的“圣杯”。它将有效地复制人脑的功能。这包括感知、对周围环境的感官解读以及学习因果关系的能力。
AGI 系统将在一系列情况下实现类似人类的功能。这将大大增强人工智能在我们日常生活中的作用。
今天的人工智能,尽管取得了令人印象深刻的成就,但更多地被视为“定制自动化”的复杂应用,而不是具有真正类似人类的能力。
例如,当人工智能模型被训练时,它会找到一组最适合其训练和评估框架的参数。当部署该模型时,它使用其训练参数以或多或少“类似机器”的方式完成工作。尽管这很有用,但它与 AGI 承诺的认知智能程度相去甚远。
随着我们向 AGI 迈进,我们所知的人工智能将会继续快速发展,并为社会带来巨大的利益。而且肯定有一些令人兴奋的可能性值得期待!
结论
人工智能寻求通过计算机、系统或机器复制人类智能。它已经有许多成功的使用案例,并且是一个快速发展的技术领域。
人工智能的一些领域已经非常成熟,例如深度学习和自然语言处理。其他公司开始发展并发现新的应用程序,因为他们利用了当今前所未有的数据和计算能力。
更重要的是,人工智能通过让我们做更多的事情,以更高的效率和更好的结果来帮助改善我们的生活。
人工智能的未来看起来很光明,很可能在未来几年看到大量的增长和进化。
事实上,这已经发生了。
本文原载于 高需求技能博客
什么是注意机制?
解决 Seq2Seq 问题技术的演变,从 RNN 到自我关注
作者图片
在整篇文章中,我们将首先了解我们所使用的技术的局限性,然后介绍新的机制来克服他们所面临的问题。我们将了解以下几个部分:
- 编码器解码器,瓶颈问题
- 注意机制
- 自我关注
1 —编码器解码器,瓶颈问题
编码器解码器架构由 RNN 构建,广泛用于神经机器翻译(NMT)和序列到序列(Seq2Seq)预测。它的主要好处是我们可以分离编码器和解码器,所以它们有不同的长度。
例如,具有不同序列长度的模型是接收单词序列并输出数字的情感分析,或者输入是图像而输出是单词序列的图像字幕模型。这种架构非常强大,甚至谷歌都将其作为谷歌翻译的核心技术。
在下图中,我们可以看到一个翻译示例的模型:
作者图片
我们用一个输入层和一个递归神经网络(RNN)更准确地说是一个长短期记忆(LSTM)构建了编码器(蓝色矩形)。编码器接收西班牙语句子,并且输出单个向量,该向量是最后一个 LSTM 时间步长的隐藏状态,整个句子的含义在该向量中被捕获。然后解码器接收这个隐藏状态作为输入,并返回一个单词序列,即英语翻译。
图片由作者提供:编码过程中,输出的是隐藏状态的最后一个时间步。
这种架构已经展示了它在 Seq2Seq 问题上的巨大能力,然而它也有一个重要的限制。正如我们已经说过的,所有输入句子的含义都是在一个向量中捕获的,所以**随着句子长度的增加,模型捕获这个向量中的信息就越困难。**因此,它的性能随着长句而下降,因为它倾向于忘记部分长句,隐藏向量成为瓶颈。
注意机制建立在我们刚刚分析过的编码器解码器结构之上。存在两个主要的差异,我们将在下面的章节中进行分析
2—隐藏状态的 Stack
在前面的结构中,我们只是传递了上一个时间步的隐藏状态。有了这个新的结构**,我们保持了每个时间步的所有隐藏状态。**
正如我们在下图中看到的,以前编码器的输出是一个向量,我们现在有一个由每个隐藏状态组成的矩阵。这解决了只有一个向量没有足够信息的问题,但它也增加了完全相反的问题,太多的信息。对于解码器想要翻译的每个单词,它不需要完整的矩阵,因为不是所有的单词都提供相关信息,所以解码器如何知道应该关注矩阵的哪一部分或对给予更多关注?
作者图片
当人类描述一幅图像时,我们并不把它作为一个整体来分析,而是检查图像的相关部分,并关注我们所描述的内容。一个机器学习模型是如何关注的?
完全一样的方式。注意机制的一个很好的例子可以在论文“ 显示、出席和讲述 ”中找到。这里我们有一个图像作为输入,目标是生成一个描述它的句子。在下图中,我们有一个热图,显示了模型在生成单词时更关注的地方,白色区域越多,关注越多,黑色区域越少。
当它描述鸟时,注意力集中在动物身上(白色部分),而当它描述水时,注意力从动物转移到它的周围。
作者图片:模型架构
图 1:显示模型关注的地方。图片来自“展示、参与和讲述”
另一个例子可以在 Bzmitry Bahdanau 等人于 2015 年发表的论文‘通过联合学习对齐和翻译进行神经机器翻译’中找到。让我们分析下面的热图,它显示了模型在翻译句子时更关注的地方:
图 2:图片来自“通过联合学习对齐和翻译的神经机器翻译”
x 轴对应于英语的源句子,y 轴对应于生成的法语翻译。每个像素显示了模型转移注意力的地方,区域越白,注意力越集中,区域越暗,注意力越少(就像前面的例子)。
例如,为了生成单词“accord ”,它主要关注“agreement”。当模型将“欧洲经济区”转换为“欧洲经济区”时,我们可以看到关注机制的力量。在英语中,形容词用在名词之前,而在法语中,形容词在名词之后,所以在这种情况下,模型将注意力转移到后面出现的单词。
关键问题是,模型如何知道关注哪里?它计算出一个被称为对齐分数的分数,该分数量化了我们应该给予每个输入多少关注。存在多种比对分数,最流行的是加法(也称为 concat, Bahdanau et al 2015 )、位置基、一般和点积( Luong 2015 )。这种区别导致了更广泛的类别,如全局/软和局部/硬注意。
我们转移注意力的方式对我们的解释有影响,因此对结果也有影响,我们选择的比对分数函数也有类似的影响。
这种注意机制在模型中只能应用一次,它是连接编码器和解码器的部件,并允许比较输入和输出句子,如前一幅图像所示。它从编码器接收隐藏状态矩阵并根据需要注意的对齐分数进行计算,简化表示如下:
作者图片:模型架构
3 —自我关注
2017 年,在谷歌团队的论文’关注是你所需要的’中,他们介绍了一种称为变压器的新型架构,这也是变压器 (BERT) 双向编码器表示的种子。
在这篇论文中,他们提出了我们已经分析过的先前架构的两个主要变化。首先,他们把 RNN 从照片中去掉。第二,他们增加了自我关注机制。在下一节中,我们将分析这两个决定及其含义。
谢谢你载了 RNN
如果 RNN 在 NLP 任务中表现得如此出色,我们为什么要取消它呢? RNN 按顺序工作,这意味着为了计算句子的第二个单词(第二时间步),我们需要计算第一个隐藏向量(第一时间步)。然后为了计算隐藏状态,时间 t,你必须一直等待 t-1 的结果,,所以我们不能并行化。此外,RNN 意味着大量的计算需要大量的资源。
图片由作者提供,要处理单词“camino”我们必须首先计算“Estoy”和“de”
此外,注意力 RNN 已经改善了对较长句子的时间依赖的提取,但仍然与长序列作斗争,所以我们还没有完全解决这个问题。
**如果我们没有 RNN,模型结构是什么?**为了更好地理解这款新车型,我们来看看下图:
作者图片
正如我们可以看到的我们保留了编码器解码器、的结构,但是我们不再有相互连接的注意力机制。那么注意力机制是从哪里计算出来的呢?如果我们没有 RNN,编码器和解码器里面是什么?
作者图片
编码组件是一堆编码器,这些编码器共享相同的内部结构。本文提出的模型由 6 个编码器构成,解码器也是如此。
让我们来探索这些组件:
作者图片
让我们首先关注编码器,它由两层组成自关注机制(我们将在后面探讨)和前馈网络。每个编码器都有这两层,所以如果我们之前说我们堆叠了 6 个编码器,那么我们在编码阶段就有 6 个自关注机制。这意味着我们并不局限于应用一次注意机制,而是可以应用我们所拥有的层数。
解码器共享相同的层,并增加了一层称为编码器-解码器注意的层,我们可以将这一层视为第二节中使用的注意机制(attention mechanism)来连接编码器和解码器。
这篇文章的目的是关注注意力机制,如果你想更好地了解变形金刚,我推荐下面这篇文章 。
由于新的结构,模型可以并行化,所需的计算对资源的要求更低,从而大大提高了训练性能,这是深度学习中的关键任务。此外,无论句子有多长,它都可以从整个句子中提取时间依存关系。那么,这种新的突破技术是如何工作的呢?
自我关注
虽然之前我们使用注意机制来连接编码器和解码器,但是这里我们使用注意机制来计算同一个句子的单词之间的依赖关系,输入的句子的单词相互作用(自身)。在下图中,我们可以看到一个翻译结果的示例,更准确地说,我们关注的是 5 号编码器:
图片来自以下链接
在这张图片中,我们看到同一个句子出现了两次。当模型翻译单词“it”时,它需要注意相关的单词并提取其含义,这个单词是指动物还是街道?在本例中,我们选择单词“it”(右栏),它会突出显示更关注的单词(左栏),在本例中是“the”和“animal”。颜色越深,模特就越关注这个特定的单词。
虽然之前我们计算了输入和输出句子之间的注意机制(图 1,图 2 ),但这里我们计算的是句子和句子本身之间的注意。
多头关注
论文不断对模型进行微调,并增加了多头关注。
图片来自下面的链接
从这个例子中我们知道单词“它”指的是动物,但是这个动物会发生什么呢?只有一个子空间,我们无法提取这么多的意义,这就是多头注意力的来源:
图片来自下面的链接
在这张图片中,我们现在有两个头或子空间(橙色和绿色),颜色越强,它越受关注。从第一个子空间我们知道“它”指的是动物,从第二个子空间我们知道动物“累了”。多头是在自我注意机制中增加维度或子空间的概念,以获取更多的意义,在本文中他们使用了 8 个头。
结论
通过这篇文章,我们分析了注意机制的演变。我们从使用 RNN 和编码器解码器结构来解决 Seq2Seq 问题开始。这些模型的问题是瓶颈,我们期望在一个隐藏状态中提取句子的全部意思。
为了解决这个问题,我们保留了编码器的所有隐藏状态但是现在信息太多,所以我们需要注意相关部分。这里当我们引入注意机制来连接编码器和解码器时。
最后,变形金刚忽略了 RNN ,它主要关注自我注意机制。在这种情况下注意不只是用于一次连接编码器和解码器,而是我们可以多次使用。而且,自我注意是用来比较一个句子和它自己,而不是输入和输出。
[## 如何建立一个编码器解码器翻译模型使用 LSTM 与 Python 和 Keras。
按照这一步一步的指南来建立一个编码器和解码器模型,并创建自己的翻译模型。
towardsdatascience.com](/how-to-build-an-encoder-decoder-translation-model-using-lstm-with-python-and-keras-a31e9d864b9b) [## 我喜欢成为数据科学家的 3 个原因
这一切都归结于马尔科姆·格拉德威尔在他的书《局外人》中解释的“有意义的工作”的概念。
towardsdatascience.com](/3-reasons-why-i-love-to-be-a-data-scientist-90696ac0d314)
什么是 AutoML,为什么它很重要?
机器学习,数据科学
AutoML 是将人工智能应用于可证明问题的开始到结束的循环自动化的方法。
马库斯·温克勒在 Unsplash 上的照片
在这篇文章中,你可以探索 AutoML ,AutoML 能否取代数据科学家,AutoML 是否接近强 AI 以及,AutoML 与神经架构搜索有什么区别?
什么是 AutoML?
照片由 Katarzyna Pe 在 Unsplash 上拍摄
一个 自动机器学习(AutoML) 与为数据科学家产生机器学习解决方案相关联,而无需对数据准备、模型选择、模型超参数和模型压缩参数进行无限制的查询。
在 AutoML 框架之上,帮助数据科学家:
- 数据可视化
- 模型可理解性
- 模型部署
AutoML 被视为关于算法选择、模型的超参数调整、迭代建模和模型评估。它是关于让机器学习任务更容易使用更少的代码,并避免手动过度调整。
AutoML 中使用的核心创新是超参数搜索,用于预处理组件和模型类型选择,以及优化它们的超参数。有许多种优化算法,从随机和网格搜索到遗传算法和贝叶斯。
当前的 autoML 框架还利用它们的经验来提高它们的性能。
AutoML 不能取代数据科学家的专业知识,但是企业定义鼓励他与模型开发相关的技术工作保持战略距离。
驱动 AutoML 开源包有:
- 自动 sklearn
- 汽车 weka
- 自动 keras
AutoML 能取代数据科学家吗?
David Levêque 在 Unsplash 上拍摄的照片
无论 AutoML 将如何发展,都必须看到,它还不能真正理解明确的信息对一个组织、其业务和业务环境意味着什么。领域知识同样是一种选择性的人类才能,不能机械化。
AutoML 可能不会取代数据科学家专家。个人电脑取代了数学家吗?不,对数学家的需求显著增加,因为他们的计算假设可以被应用。
不管 AutoML 是否能根据要求制作任何机器学习模型,统计模型都不是没有缺陷的。这是专家介入的地方,他们以模型很好地适应问题为目标,整理出一些勾勒模型的方法。
AutoML 是为了加快他们的工作,允许他们快速尝试,并帮助他们改善结果。
AutoML 接近强 AI 了吗?
我不认为 AutoML 正在接近强 AI 。强大的人工智能与在环境自主和非任务情境中实现人类水平的洞察力密切相关。AutoML 在一个固定的环境中执行一项相当确定的任务。
AutoML 和神经架构搜索有什么区别?
AutoML 和神经架构搜索(NAS) 是深度学习据点的新统治者。它们是快速而混乱的方法,可以让你的人工智能任务非常精确,而不需要大量的工作。基本且可行;这就是我们需要的人工智能!
- AutoML 就是消化深度学习所有令人难以置信的部分。你需要的只是数据。就让 AutoML 做最麻烦的一块设计吧!
- NAS 是一种寻找最佳神经网络设计的算法。让计算采用各种模块,并设置这些模块来构建网络。训练并测试网络。根据你的结果,调整你用来制作网络的积木以及你如何把它们连接在一起。
这种新的 AutoML 和 NAS 为人工智能社区提供了激励困难,并真正为科学的另一次飞跃打开了大门。
结论
AutoML 是将人工智能应用于可证明问题的开始到结束的循环机械化的方法。它基本上围绕两个重要方面——数据收集和数据预测。
中间发生的各种各样的进步可以毫不费力地自动化,同时传达一个增强良好并准备进行预测的模型。
现在,把你的想法放在TwitterLinkedin,以及Github!!**
同意 还是 不同意 与绍拉夫·辛拉的观点和例子?想告诉我们你的故事吗?
他对建设性的反馈持开放态度——如果您对此分析有后续想法,请在下面的 评论 或伸出手来!!
推文@ SauravSingla _ 08,评论Saurav _ Singla,还有明星SauravSingla马上!
什么是批量正常化?
深度学习
有什么帮助?
里卡多·阿尔塞在 Unsplash 上的照片
批量标准化
批量规范化是由 Sergey Ioffe 和 Christian Szegedy 在 2015 年的论文中引入的:批量规范化:通过减少内部协变量移位来加速深度网络训练。
批量标准化缩放层输出,使平均值为 0,方差为 1。输出以这样的方式缩放,以便更快地训练网络。它还减少了由于参数初始化不佳而导致的问题。
规范化背后的直觉
我们知道标准化或特征缩放可以加快学习过程。批处理规范化背后的直觉是相似的。批量标准化对隐藏单元做同样的事情。
为什么用批次这个词?因为它规格化了当前批次中的值。这些有时被称为批量统计。
具体来说,批量标准化通过减去批量平均值并除以批量标准偏差来标准化前一层的输出。
这非常类似于特征缩放,这样做是为了加速学习过程并收敛到一个解决方案。
内部协方差移位
在谈论批处理规范化时,您可能听过一个时髦的词,那就是内部协方差移位。考虑一个学习将 x 映射到 y 的函数的网络。内部协方差偏移指的是输入 x 的分布的变化。如果发生变化,我们的网络将不够有效,并且不能泛化。因此我们必须从头开始训练。
考虑这个例子来理解协方差移动。如果我们训练一个网络来检测棕色狗的图像,然后你停止将这个网络应用于彩色狗图像的数据,它将不能很好地执行,我们将不得不再次训练。输入分布的这种变化就是协方差移动。那么批处理规范化在这里有什么帮助呢?
批量标准化到救援
如果每一层的输入分布都相同,则网络是有效的。**批量标准化使图层输入的分布标准化,以对抗内部协方差偏移。**它控制隐藏单位的移动量。
如何进行批量归一化?
我们取每层的平均值,称为 μB 。这被称为计算为层 x_i 的所有值的总和除以所有 m 值的平均值。
卑鄙。图片由作者提供。
然后我们计算方差σ B 如下:
1。从每个值中减去μB,即每个值的偏差,并对偏差的平方取平方
2。对每个值的结果求和,然后除以值的数量 m ,得到平均值或均方差。
方差。图片由作者提供。
然后我们发现标准差是均方根偏差和ε的和。ε是小至 0.001 的恒定值。这是为了避免被零除的情况,也是为了增加方差。
方差的增加有什么帮助?
既然我们已经计算了平均值和标准偏差,我们可以如下进行归一化。
标准化值。图片由作者提供。
然后,归一化值乘以γ,再加上β。这些是可学习的参数,用于进一步缩放标准化值。最终批次标准化值如下:
批量标准化值。图片由作者提供。
可以在激活功能之前和之后应用批量标准化。然而,研究表明,在激活功能之前使用效果最好。
在 PyTorch 中,可以使用batch norm 1d对线性输出进行批量归一化,对于卷积层过滤后的图像,可以使用batch norm 2d进行 2d 输出。
有什么好处?
- 训练更快。
- 使用更高的学习率。
- 参数初始化更容易。
- 通过调节输入使激活功能可行。
- 总体效果更好。
- 它会添加噪声,从而通过调整效果减少过拟合。因此,在应用批处理规范化时,请确保使用较少的丢失,因为丢失本身会增加噪声。
结论
当应用于神经网络时,批量标准化通过将输入标准化到隐藏层来产生更好的结果。有趣的是,批处理规范化是在 VGG 之后引入的,所以 VGG 可以通过批处理规范化得到改进,从而在 ImageNet 上获得更好的结果。使用更高的学习率而不消失或爆炸梯度的能力也是有希望的。注意到批处理规范化解决的问题后,我希望您现在对此有了更好的理解。