麦卡洛克-皮茨神经元——人类第一个生物神经元的数学模型
众所周知,深度神经网络的最基本单元被称为人工神经元/感知器。但是走向我们今天使用的感知机的第一步是由麦卡洛克和皮茨在 1943 年通过模仿生物神经元的功能迈出的。
注:这篇文章的概念、内容和结构都直接来自于Mitesh m . Khapra教授关于NPTEL的 深度学习 课程的精彩讲座和材料。看看吧!
生物神经元:一个过于简化的例证

A Biological Neuron — Wikipedia
树突:接收来自其他神经元的信号
体细胞:处理信息
轴突:传递该神经元的输出
突触:与其他神经元的连接点
基本上,一个神经元接受一个输入信号(树突),像 CPU (soma)一样处理它,通过一个类似电缆的结构将输出传递给其他连接的神经元(轴突到突触到其他神经元的树突)。现在,这可能在生物学上不准确,因为外面发生了更多的事情,但在更高的层面上,这是我们大脑中的神经元正在发生的事情——接受输入,处理输入,输出输出。
我们的感觉器官与外部世界互动,并将视觉和声音信息发送给神经元。假设你在看《老友记》。现在,你的大脑接收到的信息被“笑或不笑”的神经元接收,这将帮助你决定是否笑。每个神经元只有在其各自的标准(稍后将详细介绍)得到满足时才会被激发/激活,如下所示。

Not real.
当然,这并不完全正确。事实上,不仅仅是几个神经元在做决策。在我们的大脑中有一个由 10 个神经元(1000 亿个)组成的大规模并行互联网络,它们的连接并不像我上面给你展示的那样简单。它可能看起来像这样:

Still not real but closer.
现在,感觉器官将信息传递给第一层/最底层的神经元进行处理。这个过程的输出以分层的方式传递到下一层,一些神经元会激活,一些不会,这个过程继续下去,直到它产生最终的反应——在这种情况下,就是笑。
这种大规模并行的网络也确保了分工。每个神经元仅在满足其预期标准时触发,即,神经元可以对特定刺激执行特定角色,如下所示。

Division of work
据信,神经元以分层的方式排列(然而,科学家提出了许多有实验支持的可信替代方案),每一层都有自己的角色和责任。为了检测一张脸,大脑可能依赖于整个网络,而不是单一的一层。

Sample illustration of hierarchical processing. Credits: Mitesh M. Khapra’s lecture slides
既然我们已经确定了生物神经元是如何工作的,让我们看看麦卡洛克和皮茨提供了什么。
注意:我对大脑如何工作的了解非常非常有限。以上插图过于简化。
麦卡洛克-皮茨神经元
第一个神经元计算模型是由 Warren MuCulloch(神经科学家)和 Walter Pitts(逻辑学家)在 1943 年提出的。

This is where it all began…
它可以分为两部分。第一部分, g 接受一个输入(咳咳树突咳咳),执行聚合并基于聚合值第二部分, f 做出决定。
假设我想预测自己的决定,是看一场随机的足球比赛还是不看电视。输入都是布尔型的,即{0,1},我的输出变量也是布尔型的{0:会看,1:不会看}。
- 所以, x_1 可能是ispremierlegueon(我更喜欢英超)
- x_2 可能是 isItAFriendlyGame (我倾向于不太关心友谊赛)
- x_3 可能是 isNotHome (跑腿的时候不能看。我可以吗?)
- x_4 可能是ismanunitedplay**(我是大个子曼联球迷。GGMU!)等等。**
这些输入可以是兴奋性的或抑制性的。抑制性输入是那些对决策产生最大影响的输入,与其他输入无关,即,如果 x_3 为 1(非原位),那么我的输出将始终为 0,即,神经元将永远不会触发,因此 x_3 是抑制性输入。兴奋性输入并不会让神经元自己放电,但当它们结合在一起时可能会放电。从形式上看,事情是这样的:

我们可以看到 g (x) 只是在做输入的求和——简单的聚合。而这里的θ称为阈值参数。例如,如果我总是在总和变成 2 或更多时观看比赛,那么这里的 theta 是 2。这被称为阈值逻辑。
使用 M-P 神经元的布尔函数
到目前为止,我们已经看到了 M-P 神经元是如何工作的。现在让我们看看这个神经元是如何被用来表示一些布尔函数的。请注意,我们的输入都是布尔的,输出也是布尔的,所以本质上,神经元只是试图学习一个布尔函数。基于适当的输入变量,许多布尔决策问题都可以转化为这个问题——比如是否继续阅读这篇文章,读完这篇文章后是否观看《老友记》等等。可以用 M-P 神经元来表示。
M-P 神经元:一种简洁的表示

这种表示只是表示,对于布尔输入 x_1 , x_2 和 x_3 如果 g (x) 即sum≥theta**,则神经元会触发,否则不会。**
和功能

“与”功能神经元只有在所有输入都打开时才会触发,即这里的 g (x) ≥ 3。
或功能

我相信这是不言自明的,因为我们知道,如果任何输入打开,或功能神经元就会激活,即这里的 g (x) ≥ 1。
具有抑制输入的功能

这看起来可能有点棘手,但其实不然。这里,我们有一个抑制输入,即 x_2 ,所以每当 x_2 为 1 时,输出将为0。记住这一点,我们知道 x_1 和!只有当 x_1 为 1 并且 x_2 为 0 时,x _ 2才会输出 1,因此很明显阈值参数应该为 1。
让我们验证一下, g (x) 即x _ 1**+x _ 2仅在三种情况下≥ 1:**
情况 1:当x1为 1、x2为 0
情况 2:当x1为 1、x2为 1
情况 3:当x1为 0、x2
但是在情况 2 和情况 3 中,我们知道输出将是 0,因为 x_2 在两者中都是 1,感谢抑制。而且我们还知道 x_1 和!x_2
或非功能

对于要激发的 NOR 神经元,我们希望所有的输入都为 0,因此阈值参数也应该为 0,并且我们将它们都作为抑制性输入。
非功能

对于非神经元,1 输出 0,0 输出 1。因此,我们将该输入作为抑制输入,并将阈值参数设置为 0。有用!
任何布尔函数都可以用 M-P 神经元来表示吗?在你回答这个问题之前,让我们先了解 M-P 神经元在几何上做什么。
M-P 神经元的几何解释
在我看来,这是这篇文章最精彩的部分。让我们从 OR 函数开始。
或功能
由于显而易见的原因,我们已经讨论过 OR 函数的阈值参数θ为 1。输入显然是布尔型的,所以只有 4 种可能的组合— (0,0)、(0,1)、(1,0)和(1,1)。现在将它们绘制在 2D 图上,并利用 OR 函数的聚合方程
即x1+x2≥1****,使用该方程我们可以绘制决策边界,如下图所示。再次提醒你,这不是一个实数图。****

我们刚刚使用了聚合方程,即x1+x2 =1,以图形方式显示了当通过 OR 函数 M-P 神经元时,其输出位于该线之上或之上的所有输入,以及位于该线之下的所有输入点将输出 0。****
瞧啊。!M-P 神经元刚刚学习了一个线性决策边界!M-P 神经元将输入集分成两类——阳性和阴性。正的(输出 1)是位于决策边界上或之上的那些,负的(输出 0)是位于决策边界之下的那些。
让我们通过看更多的例子来说服自己,M-P 单元对所有的布尔函数都是一样的(如果从数学上还不清楚的话)。
与酌

在这种情况下,决策边界方程为x1+x2 =2。这里,位于(1,1)之上或之上的所有输入点在通过 AND 函数 M-P 神经元时输出 1。很合适!决策边界起作用了!****
同义反复

Too easy, right?
我想你现在明白了,但是如果我们有两个以上的输入呢?
或具有 3 个输入的功能

让我们通过观察一个 3 输入或功能 M-P 单元来概括这一点。在这种情况下,可能的输入是 8 个点— (0,0,0),(0,0,1),(1,0,0),(1,0,1),…你得到了点。我们可以将这些绘制在 3D 图上,这次我们绘制一个三维的决策边界。
“是一只鸟吗?是飞机吗?”
没错,是飞机!
满足判定边界方程 x_1 + x_2 + x_3 = 1 的平面如下所示:

慢慢来,通过查看上面的图来说服自己,当通过 or 函数 M-P 单元时,位于该平面上或上方(正半空间)的所有点将产生输出 1,而位于该平面下方(负半空间)的所有点将产生输出 0。
仅通过手工编码阈值参数,M-P 神经元就能够方便地表示线性可分的布尔函数。
线性可分性(用于布尔函数):存在一条线(平面),使得产生 1 的所有输入位于该线(平面)的一侧,产生 0 的所有输入位于该线(平面)的另一侧。
M-P 神经元的局限性
- 非布尔(比如说,实数)输入呢?
- 我们总是需要手工编码阈值吗?
- 所有的投入都是相等的吗?如果我们想赋予一些输入更多的重要性呢?
- 不是线性可分的函数呢?说 XOR 函数。
我希望现在清楚了为什么我们今天不使用 M-P 神经元。1958 年,美国心理学家弗兰克·罗森布拉特克服了 M-P 神经元的局限性,提出了经典的感知模型——强大的人工神经元。它是比麦卡洛克-皮茨神经元更一般化的计算模型,其中权重和阈值可以随着时间的推移而学习。
更多关于感知器以及它如何学习权重和阈值等。在我以后的帖子里。**
结论
在这篇文章中,我们简要地看了一下生物神经元。然后我们建立了 MuCulloch-Pitts 神经元的概念,这是第一个生物神经元的数学模型。我们用 M-P 神经元表示了一系列布尔函数。我们还试图通过 3D 绘图获得模型的几何直觉。最后,我们还建立了一个更一般化模型的动机,唯一的人工神经元/感知器模型。**
感谢您阅读文章。
自己活也让别人活!
答
通过简单的计算测量两个单词之间的距离

“brown rail train” by Johannes Plenio on Unsplash
在 NLP 中计算单词距离是一项常规任务。每当你想找到最近的单词或度量标准时,单词距离是实现它的方法之一。
在我之前的项目中,从 OCR 结果中识别目标信号是关键部分。为了获取更多有价值的信息,我必须容忍 OCR 结果中的微小误差。否则,我会错过许多重要的信号。
与之前的单词嵌入之间的距离不同,字符串距离是计算从一个单词改变到另一个单词所需的删除、插入或替换的最小数量。有许多方法来计算距离,而我在这次分享中将集中于两个测量。
看完这篇文章,你会明白:
- 莱文斯坦距离
- 最长公共子序列距离
- 拿走
莱文斯坦距离

“black electrical tower” by Shane Rounce on Unsplash
这种方法是 Vladimir Levenshtein 在 1965 年发明的。该值指的是从一个单词转换到另一个单词所需的最小动作数(删除、插入和替换)。

From https://en.wikipedia.org/wiki/Levenshtein_distance
为了计算 Levenshtein 距离,我们必须遍历每一个单词,并使用来自
- (i-1,j):表示左框(删除)
- (I,j-1):表示上盒(插入)
- (i-1,j-1):表示左上框(替换)
在下面的例子中,我将把“edward”转换成“edwin ”,并计算 Levenshtein 距离。

第一步:从 0 到两个单词对应的数字
第二步:由于“e”等于“e”,所以值为 0
第三步:“d”不等于“e”,所以从左(删除)、对角线(替换)、上(插入)求最小数。所以是 0 + 1 = 1

第 4 步:对下面一行重复第 3 步
第五步:“e”不等于“d”,所以从左(删除)、对角线(替换)、上(插入)求最小数。所以是 0 + 1 = 1
第六步:因为“d”等于“d”,所以复制对角线值为 0


第 7 步:对下面一行重复第 3 步
步骤 8:对盒子的其余部分重复步骤 3
步骤 9: Levenshtein 距离是 3(用红色突出显示),这是这个矩阵的最后一个
步骤 10:之后,e 可以向左(删除)或对角(替换),因为两个值都是 2。这次我选对角线。
步骤 11:同样,我们可以向左(删除)或对角(替换),因为两个值相同,都是 1。这次我选对角线。
第 12 步:这一次,最小值是 0(删除)
根据上面的公式,我们通过以下操作将“edward”转换为“edwin”
- 用“d”代替“n”
- 用“r”代替“I”
- 删除“a”
import editdistancedata = ['edward', 'Edward']for record in data:
dist = editdistance.eval(record, 'edwin')
print('Edit Distance for %s and %s is %d' % (record, 'edwin', dist))
输出
Edit Distance for edward and edwin is 3
Edit Distance for Edward and edwin is 4
最长公共子序列距离
简而言之,这是 LCS 距离。它与 Levenshtein 距离非常相似,只是 LCS 不包括替换操作。
因此,将“edward”转换为“edwin”时,该值为 5。操作是删除“a”、“r”、“d”,插入“I”和“n”。
拿走
要访问项目模板,您可以访问这个 github repo。
- 编辑距离是一种简单有效的测量两个单词之间换位的方式。
- 这是区分大小写。
- 编辑距离可以应用于纠正拼写错误或 OCR 错误。
- 在我这里,容差误差是 2 。如果真正的标签是“edward”,如果是“edweed”,我还是会接受 OCR 结果。
关于我
我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。你可以通过媒体博客、 LinkedIn 或 Github 联系我。
参考
克里斯托弗 D. M .、普拉巴卡尔 r .、欣里奇 S. 信息检索导论。
利用文本网络分析测量话语偏见
在这篇文章中,我提出了一种基于文本网络分析的方法和工具来衡量话语中的偏见水平。该度量基于文本的结构,并使用文本图的定量和定性参数来识别其有多强的偏向性。因此,它可以被人类使用,也可以被实现到各种 API 和 AI 中,以执行自动偏差分析。
偏见:好的和坏的
偏见通常被理解为对某种观点的倾向或偏见。有偏见的话语或文本可能有特定的议程或促进特定的意识形态。
在“假新闻”、极端意识形态和各种错误信息技术兴起的时代,重要的是能够识别话语中的偏见程度:无论是社交网络帖子、报纸文章还是政治演讲。
偏见不一定是坏事。有时,它可以使一个意图变得更强,推进一个议程,提出一个观点,说服,劝阻和转变。偏见是变革的动力,然而,当偏见太多的时候,它也可能是破坏性的。当我们衡量偏见时,我们衡量的是一篇文章在意识形态上有多强烈,它有多想提出某种观点。在某些情况下——比如小说或高度激烈的政治演讲——强烈的偏见可能更受青睐。在其他一些情况下——比如新闻和非小说——强烈的偏见可能揭示了一个议程。
目前还没有工具可以测量一篇文章的倾向性。各种文本挖掘 API根据文本的内容和情感对文本进行分类,但没有任何仪器可以测量文本中对某个观点的倾向程度。本文提出的工具和方法可以作为这方面的第一步。我开发的用于文本网络分析的开源在线工具已经可以基于这种方法测量偏见,所以欢迎你在你自己的文本上尝试一下,看看它是如何工作的。下面我描述了偏向指数的工作原理和一些技术细节。
作为动态网络的话语结构
任何话语都可以表示为一个网络:单词是节点,它们的共现是它们之间的连接。由此产生的图表描绘了意义循环的路径。我们可以通过将连接更紧密的节点群集(force-atlas 算法)排列成用特定颜色标记的不同组来使其更具可读性。我们还可以使图中更有影响力的节点变大(具有高介数中心性的节点)。你可以在这篇关于文本网络分析的白皮书中了解更多技术细节。
例如,这里有一个由 Julian Treasure 制作的 TED 演讲的可视化,名为“如何说话让人们愿意听”用这种方法制作。如果你有兴趣看实际的交互图,你可以在这里打开它。

从这个图表中,我们可以清楚地看到,主要的概念是
“人”、“时间”、“世界”、“听”、“声音”等。
这些概念是特定话语中意义循环的连接点。它们连接不同的节点社区(用不同的颜色表示)。
该算法以模拟人类感知的方式工作(遵循横向阅读模型,语义启动的思想,也是常识):如果单词在同一上下文中被频繁提及,它们将在图中形成一个社区。如果它们出现在不同的语境中,就会被彼此推开。如果单词经常被用来连接不同的上下文,它们在图表中会显得更大。
因此,一个文本网络图的结构可以告诉我们很多关于话语结构的信息。
例如,如果图形具有明显的社区结构(几个不同的单词社区),则话语也具有几个不同的主题,这些主题在文本中表达。在我们的示例中,我们至少有 4 个主要主题:
人—听—说(深绿色)
时间—说话—登记(浅绿色)
世界—声音—有力(橙色)
惊艳—声音(粉色)
如果我们以同样的方式分析其他文本,我们会看到产生的图形结构是不同的。例如,这是《夸兰》第一章的图像:

Text network visualization of Quaran made using InfraNodus. The structure of the graph is less diversified and more centralized. There are only a few main concepts, the discourse circulates around them, the rest of the text supports the main concepts.
可以看出它具有不同的网络结构。它更集中,更不多样化。有几个主要概念:
“神”、“人”、“信”、“主”、“给”
整个论述围绕着这些概念展开。所有其他观点都是为了支持主要观点。
我们对 1969 年至 2013 年美国总统的就职演说进行了类似的分析,并可视化了他们的叙事随时间变化的方式:
Visualization of the US presidents’ inauguration speeches made using InfraNodus (TNA) and Gephi (visualization). It can be seen that over time the structure stays more or less the same, however, Obama’s speeches seem to have more distinct influential terms, indicating a more diversified discourse.
可以看出,虽然这些年来话语的结构或多或少保持不变,但每次演讲所强调的概念都发生了变化。这可能表明修辞策略保持不变,而内容多年来发生了变化。奥巴马的演讲似乎具有更高数量的明显有影响力的节点,这可能表明话语更加多元化。
偏见是网络中意识形态的管道
既然我们已经展示了如何将话语表现为一个网络结构,我们可以在网络科学的背景下讨论偏见的概念。我们将使用一些流行病学的概念来演示网络的拓扑结构如何影响信息在节点间的传播速度。
一个网络可以被看作是一段时间内发生的相互作用的表现,一个动态过程留下的轨迹图。如果我们研究一个网络的拓扑结构,我们可以得到许多关于它所代表的动态过程的本质的见解。
在社会科学和医疗保健的背景下,**关于网络结构的信息可以为流行病学提供有价值的见解:**疾病(病毒、观点或任何其他(错误)信息)传播的速度,传播的距离,最佳免疫策略可能是什么。
已经论证(艾布拉姆森&库伯曼 2001;pastorras&Vespignani 2001)认为,随着网络结构变得更加随机化,其流行病学阈值降低。疾病、病毒、错误信息可以传播得更快,传播到更多的节点。换句话说,随着网络的社区结构越来越不明显,连接的数量增加,网络将信息传播到更多的节点,并且这种传播以非常明显的振荡(感染/未感染)发生。

A figure from the study by Abramson & Kuperman (2001) where they have shown the fraction of infected elements (n) in relation to time (t) for networks with a different degree of disorder §. The higher the degree of disorder, the more elements get infected, the oscillations get more and more intensified, but also the time-span of the infection is relatively short.
与此同时,当网络相对互联(小世界网络)时,社区结构明显,节点的“口袋”有助于在网络中更长时间地维持流行病。换句话说,较少的节点可能被感染,但是感染可能持续更长时间(流行状态)。

Representation of network structures: [a] random, [b] scale-free (better pronounced communities) and, [c] hierarchical (less global connectivity) (from Stocker et al. 2001)
在对各种社会网络进行的另一项研究中(斯托克,考恩福斯&博索迈尔 2002 )表明,等级扁平网络(即无序网络)不如无标度网络(即具有更明显社区结构的网络)稳定。换句话说,等级制度可能有利于传递秩序,但无尺度结构更有利于维持某种世界观。
正如我们所看到的,没有一种网络拓扑可以被认为是优先的。事实上,这取决于意图、背景和情况。在某些情况下,如果一个网络能够相对快速地将信息传播到它的所有元素,这可能是件好事。在其他一些情况下,稳定性可能更优先。
总的来说**,一个网络的拓扑结构反映了它传播信息的能力,它对新思想的敏感度,新思想是会在短时间内占据整个网络还是会持续更长时间。**
当我们研究偏见时,可以采用同样的方法。这里的假设是话语网络是一种传播思想的结构。
如果话语结构以几个有影响力的节点为中心,并且没有明显的社区结构,这意味着话语相当同质,这些节点周围的想法会比外围的想法传播得更好。我们把这样的话语称为有偏见的。
另一方面,如果话语网络由几个不同的词/节点社区(无标度小世界网络)组成,这意味着文本中有几个不同的主题,每个主题在话语中被赋予同等的重要性。我们称这样的话语多样化。
网络社区结构不仅可以使用图形可视化进行定性识别,还可以通过模块性测量进行识别(参见 Blondel et al 2008 )。模块化程度越高(通常在 0.4 以上),社群结构越明显。
另一个重要的标准是影响力(通过最有影响力的词/节点)在不同社区的分布。为了使话语多样化,最有影响力的节点应该分布在不同的社区之间。我们使用熵来衡量图中影响的分散程度,并在确定偏差水平时考虑到这一点。我们还检查顶部社区是否包括不成比例的高数量的节点,在这种情况下,多样化分数降低,并且图中的组件数量减少。
因此,我们可以确定我们可以用三个主要标准来确定话语中的偏见程度:
- **社区结构:**它们的不同程度以及属于顶级社区的节点的百分比;
- **影响力分布:**最具影响力的节点/词如何在不同话题/图社区间传播;
- **图形组件数量:**话语的连接程度;
基于语篇结构的倾向性指数
基于上述命题和标准,我们提出了偏倚指数,该指数考虑了语篇结构,具有四个主要参数:
- 分散(非偏置)
- 多样化(局部偏向)
- 聚焦(略偏)
- 偏置(高度偏置)
第一个价值,分散的,是一个具有高度显著的社区结构(几个不同的主题)的话语,这些社区结构没有很好的联系或者有几个组成部分(因此没有偏见)。我们的测试表明,这种图表通常用于诗歌、个人笔记、精神分裂症患者的推文以及其他各种创造性活动。例如,下面是拜伦的诗《黑暗》(你也可以查看 InfraNodus 上的交互图):

Visualization of Lord Byron’s “Darkness” made using InfraNodus. The discourse structure is identified as Dispersed (see the Analytics pane to the right) because of the high modularity (0.68) and high influence dispersal (the most influential words are spread among the different communities and only 14% of the words are in the top community).
正如我们从图表中看到的,它在视觉上非常稀疏,我们的工具已经将话语结构识别为分散的,因为模块性度量非常高(发音为社区/主题),并且有影响力的节点/词在主要主题中分布非常均匀(80%的分散,顶部社区/主题中只有 14%的词)。如果你阅读这首诗本身,你会发现它有相当丰富的词汇,它唤起了许多不同的形象,而不是试图推动一个特定的议程(也许只是通过诗歌,而不是修辞手段)。
下一个价值,多样化,是一个话语,有一个明显的社区结构,但那里的社区联系良好。通常它表示一种反映几种不同观点的话语,并在全球层面上给予它们或多或少的平等地位(地方偏见)。许多旨在提出若干观点的文章和谈话、研究笔记、报纸标题(取自各种来源)和非小说类文章都有这种结构。例如,这是 2018 年 10 月 4 日的新闻标题(带预告)的可视化效果(请参见此处的交互式可视化效果):

Visualization of the news headlines and teasers (via RSS) made using InfraNodus for the 4th of October 2018 taken from NYT, WSJ, FT, The Guardian and Washington Post. As we can see the selection of news is ranked as Diversified as the modularity measure is relatively high and yet the topics are also connected to each other. The most influential words are spread among the main topical clusters / communities, which indicates that the selection of news was quite diverse.
我们可以看到,话语结构被归类为多样化,这意味着在这个话语中有几个不同的主题,但它们在全球层面上是联系在一起的。
第三个值,聚焦,表示话语对某个主题有软偏向。这通常意味着话语提出了几个观点,但只关注一个,并进一步发展。具有聚焦分数的话语结构是报纸文章、散文、报告的特征,其被设计来提供对某一观点的清晰和简明的表达。例如,下面是本文前三部分的可视化:

The previous three sections of this article visualized as a text graph using InfraNodus. We can see that the discourse structure is ranked as Focused, indicating a slight bias. The community structure is present, but they are not very distinct. Almost all the most influential words are concentrated in one community / topic: “network / structure / discourse” and then there’s a smaller topic with “text / bias / measure”.
最后,第四种类型的话语结构是偏向的,这是具有低社区结构或没有社区结构的文本的特征。主要观点集中在一起,文中使用的所有其他概念都是为了支持主要议程。这种话语结构通常可以在高度意识形态化的文本、政治演讲以及任何其他文本中观察到,它们诉诸修辞来说服人们采取行动。例如,这里有一个共产党宣言的可视化:

Text network visualization of the Communist Manifesto made using InfraNodus. The community structure is not pronounced and the most influential words belong to the two main topics and are highly interconnected. The rest of the discourse is subjugated towards the main agenda (class struggle).
编后记
在这篇文章中,我提出了一种基于文本网络可视化结构和从图形分析中获得的各种参数的话语偏见的测量方法。
重要的是要注意,我并不声称(还)我提出的命题是科学合理的。对一个更大的数据语料库的全面研究正在进行中(欢迎你加入)。
我的经验表明,这个索引在研究文本时非常有用,并且已经作为一个工作特性在 InfraNodus 文本网络分析和可视化工具中实现。
因此,我邀请您亲自尝试一下,并将您可能有的任何反馈、建议和提议发送给我。请不要客气,在这里留下任何评论,我很想知道你的想法和我们如何进一步发展它。InfraNodus 是一个开源工具,所以非常欢迎你加入并实现你作为一个代码可能有的任何主张。
Dmitry Paranyushkin 是拥有Nodus Labs的研究员,也是文字网络可视化工具InfraNodus的创造者。
你可以通过@ Nodus Labs或通过Nodus Labs关注我并联系我。
测量模型的良好性—第 1 部分
你的模型有多好并不重要。一点也不。朱莉娅·埃文斯
数据和人工智能正在改变世界各地的商业,从金融、制造和零售到医疗保健、电信和教育。这种转变的核心是将原始数据转化为信息和有用的、可操作的见解的能力。这就是数据科学和机器学习的用武之地。

Machine Learning [Source]
上面的方法虽然滑稽,但肯定是构建机器学习系统的一种方式。然而,如果它需要良好和可靠,我们应该更有条理一点:
- 了解业务需求
- 获取和处理相关数据
- 准确地表述问题
- 使用正确的机器学习算法构建模型
- 评估模型,以及
- 在最终部署之前,验证现实世界中的性能
整个过程被记录为微软的团队数据科学过程(TDSP) ,如下图所示。

TDSP [source]
这篇文章是由两部分组成的系列文章的一部分,主要关注模型的良好性,特别是量化商业价值和转换典型的机器学习性能指标(如精度、召回率、RMSE 等)。)到业务指标。这是模型在现实世界中被验证和接受的典型方式。在上图中,流程的相关阶段以红色突出显示。度量模型的良好性还包括将模型性能与合理的基线进行比较,这也将在本文中讨论。为了说明所有这一切,将考察两大类机器学习问题:
- 分类:包含在第 1 部分中
- 回归:包含在第二部分(2018 年 9 月 4 日更新)
分类
分类是预测定性或分类反应的过程[ 来源 ]。这是一种受监督的机器学习技术,它将新的观察结果分类到一组离散的类别中。这是基于包含已知类别的观察值的训练数据来完成的。分类问题可以是有两个目标类别的二元或有两个以上互斥目标类别的多类。
A Binary Classification Problem
在这篇文章中,我将以乳腺癌检测为例来研究二元分类问题。我将使用威斯康星开放乳腺癌数据集进行建模和评估。下面讨论的技术可以很容易地扩展到其他二元和多类分类问题。所有用于构建和评估模型的源代码都可以在 Github 这里找到。
让我们首先了解业务上下文和数据。乳腺癌是女性最常见的癌症,也是女性癌症死亡的主要原因[ 来源 ]。癌症类型的早期检测——无论是良性还是恶性——可以通过选择适当的治疗策略来帮助挽救生命。在该数据集中,总共有 569 个病例,其中 357 个是良性的(62.6%),212 个是恶性的(37.4%)。总共有 30 个特征,是从乳腺肿块活检的数字化图像计算出来的。这些特征描述了细胞核的特征,如半径、纹理、周长、光滑度等。癌症类型的检测目前由放射科医师完成,这是耗时的,并且商业需求是加速诊断过程,以便可以尽早开始适当的治疗。在深入建模阶段之前,我们需要了解做出正确/错误预测的价值/成本。该信息可以使用如下所示的价值-成本矩阵来表示:

矩阵中的行表示实际类别,列表示预测类别。第一行/列代表阴性类别(在这种情况下为良性),第二行/列代表阳性类别(在这种情况下为恶性)。以下是矩阵中每个元素所代表的含义:
- 第 0 行,第 0 列:正确预测负类的值
- 第 0 行,第 1 列:错误预测正类的成本
- 第 1 行,第 0 列:错误预测负类的成本
- 第 1 行,第 1 列:正确预测正类的值
对于乳腺癌检测,我们可以将价值-成本矩阵定义如下:

- 正确检测良性和恶性病例具有同等的积极价值。尽管恶性肿瘤对患者来说是最糟糕的情况,但目标是早期诊断,开始治疗并治愈这两种类型的癌症。因此,从治疗的角度来看,准确检测这两种情况具有同等的价值。
- 将恶性病例标记为良性(假阴性)的成本比将良性病例标记为恶性(假阳性)的成本要高得多。因此,假阴性的成本为-4,假阳性的成本为-2。
另一个业务需求是尽可能多地自动化流程。做到这一点的一种方式是使用机器学习模型作为过滤器,以自动检测较简单的良性病例,并且仅标记可能的恶性病例供放射科医师查看。如下图所示。我们可以通过查看需要手工评审的 %的案例(在图中表示为 x )来量化这个业务需求。理想情况下,我们希望一切都自动化,而不需要人参与。这意味着模型应该具有 100%的准确性,并且 x 应该等于正类的实际比例。

正确量化业务需求后,下一步是定义合理的基线来比较我们的模型。
- 基线 1:随机决定癌症类型是良性还是恶性的随机分类器。
- 基线 2:多数类分类器,总是挑选多数类。在这种情况下,多数阶级是良性的。如果这些阶层高度不平衡,这种策略会更有意义。
我们可以添加第三个基准*,这是放射科医师或企业当前部署的任何其他模型的性能。但是在这个例子中,这个信息是未知的,所以这个基线被删除了。*
现在是构建模型的有趣部分。我将在这里掩饰很多细节,因为可能需要一整篇文章来进行探索性分析、建模技术和最佳实践。我使用了一个由特征缩放器、用于特征缩减的 PCA 和最后的随机森林(RF)分类器组成的流水线。进行 5 重交叉验证和网格搜索以确定最佳超参数。完整的源代码可以在这里找到。
一旦模型被训练,下一步就是评估它们。有各种各样的性能指标可以使用,但在这篇文章中,我将回顾以下 6 个指标,因为它们很容易解释、可视化并转化为业务指标。
- 真阳性(TP) / 真阳性率(TPR) :假设实际类别为阳性,正确的阳性预测数/预测为阳性的概率
- 假阴性(FN) / 假阴性率(FNR) :假设实际类别为阳性,则错误的阴性预测数/预测为阴性的概率
- 真阴性(TN) / 真阴性率(TNR) :假设实际类别为阴性,则正确的阴性预测数/预测为阴性的概率
- 假阳性(FP) / 假阳性率(FPR) :假设实际类别为阴性,则错误阳性预测的数量/预测阳性的概率
- 精度§ :预测阳性正确的比例
- Recall ® :实际捕获的阳性比例
所有这些指标都是相互关联的。使用 ROC 曲线和混淆矩阵可以很容易地看到前四个。最后两个可以使用精确回忆 (PR)曲线来可视化。让我们首先使用 ROC 和 PR 曲线来可视化模型和基线的性能。


两个图都显示了使用各种阈值来确定正类和负类的模型的性能。可以看出,RF 分类器在各个方面都优于基线。一旦选择了合适的阈值,我们就可以绘制标准化的混淆矩阵,如下所示。这些矩阵显示了给定实际值时预测值的条件概率。我们可以看到基线表现很差,特别是在预测阳性类别时,假阴性率很高。另一方面,RF 分类器似乎获得了更多的正面和负面类别预测,达到了 93%的 TPR 和 97%的 TNR。

既然我们已经确定新的射频模型优于基线,我们仍然需要确保它符合我们的业务目标。即高的正业务价值和更少的手动审查案例。因此,我们需要将上述性能指标转化为以下内容:
- 模型的总预期价值/成本
- 需要手动审查的案例百分比
第一个业务指标可以通过取展平的混淆矩阵(通过样本总数标准化, S )与展平的价值成本矩阵的点积来计算。如下所示。

注意 S 是一个标量,等于 TN + FP + FN + TP。期望值实质上是价值/成本的加权平均值,其中权重是预测正类和负类的概率[ 来源。
第二个业务指标可以使用 precision 和 recall 来计算,如下所示。

正类率是从用于评估模型的数据,即测试集得知的。根据业务需求,我们需要决定我们必须准确确定多少正类,即召回。如果我们想检测出所有的阳性病例,目标召回率应该是 100%。然后,我们可以从 PR 曲线中找到相应的精度(和阈值)。对于具有 100%精度和召回率的理想模型,要检查的正面案例的比例将等于实际的正面分类率。这意味着理论上我们可以实现 100%的自动化。
接下来的两个图显示了根据两个关键业务度量对模型良好性的最终评估。


观察结果:
- 由于高假阴性,两种基线模型都有相当大的成本。随机森林分类器通过获得大量正确的正反例而具有良好的正价值。
- 对于乳腺癌检测的情况,我们希望捕获所有阳性/恶性病例,即 100%召回。在这个例子中,着眼于 50%或 75%的召回是没有意义的,因为不治疗恶性病例的成本很高。对于其他二元分类问题,例如欺诈检测,只要模型能够标记出高成本节约的欺诈案例,较低的召回率可能是可以接受的。无论如何,我们可以看到随机森林分类器在自动化方面也优于基线。为了捕获 100%的恶性病例,放射科医师只需要检查所有病例的大约 50%,即 13%的额外假阳性,而他/她必须使用基线模型检查几乎所有的病例。
总之,本系列的第一部分已经从业务的角度考察了度量模型的良好性,特别是考察了分类类型的问题。关于这个主题的更多细节,下面的书是很好的参考。在本系列的第二部分也是最后一部分中,我将介绍回归,这需要查看稍微不同的度量标准。
进一步阅读
- 统计学习的要素,作者 Trevor Hastie,Robert Tibshirani,Jerome Friedman
- 福斯特·普罗沃斯特和汤姆·福西特的《商业数据科学》
- 用 Scikit-Learn 和 Tensorflow 进行机器实践学习,作者 Aurélien Géron
这是回归系列的第二部分。
这是从 MSDN 数据洞察博客 这里 交叉发布的。
测量行人可达性
适宜步行的社区有利于健康、幸福和经济增长。世界各地想要吸引有才华的年轻劳动力的城市越来越注重创造良好的步行体验。我们如何使用数据科学工具来测量和绘制步行性?
这篇博客提出了一种借鉴 Pandana(由 Fletcher Foti 开发的优秀 Python 库)的方法。
这能回答什么问题?
我们将处理沿道路网络的邻近分析。测量商店、办公室和公交车站等设施的密度“直线距离”是微不足道的;密度图可以在地理信息系统软件中制作。但是,如何绘制从城市的每个部分到最近的设施的步行或开车时间呢?或者更好的是,回答诸如“大多数日常差事可以步行完成吗?”为此,我们需要网络约束距离:沿着城市街道到达目的地的米数。
第一步:创建街道网络对象
网络数学的一个分支,图论,是由 Leonard Euler 在试图模拟穿过 Konigsburg 七座桥的路线时发展起来的。我们可以使用相同的节点(在我们的例子中是街道交叉口)和边(街道)术语来模拟道路网络。
由于几位研究人员,特别是 Foti 和 Geoff Boeing,创建了将 OpenStreetMap (OSM)道路转换为有效图形对象的自动化方法,Python 中的道路网络分析变得更加容易。他们的工具 Pandana 和 OSMNx 都通过像删除不代表实际交叉点的点这样的步骤下载和清理 OSM 道路数据(因此在图论意义上不是节点)。
让我们来看看摩洛哥卡萨布兰卡的街道网络:

Network object for central Casablanca
第二步:定位感兴趣的对象
比方说,我们正在开发一个医疗保健项目,希望了解哪些社区缺少获得初级医疗服务的诊所。我们需要所有这些地点的列表,以及它们的位置。让我们列出诊所以及其他一些感兴趣的对象:

Points of interest downloaded from OpenStreetMap for Casablanca (first five records)

Number of POIs by category, downloaded from OSM
第三步:计算距离
这就是用 Python 进行地理分析真正出彩的地方,而不是坐在 GIS 包前。Pandana 是为速度而生的。首先,我们将传递给它一个最大搜索距离。这是加快未来查询速度的关键一步:Pandana 将建立一个网络的精简表示(用 C++实现),允许在每个节点的定义半径内进行快速计算。我们将构建一个从几个交叉点到最近的 5 个兴趣点的距离表。

Distance in meters to five nearest amenities (two sample intersections).
这样,不同选定设施的无障碍分析可以在一秒钟内完成。(在引擎盖下,两种算法使这成为可能:收缩层次结构和 kd 树。)
第四:制作无障碍地图
接下来,我们可以制作可达性地图。让我们做一些!

正如你所看到的,有些区域你必须步行 2 公里以上才能到达最近的学校,而卡萨布兰卡市中心的平均步行距离不到 400 米。
不过,这只是针对学校的。我们可以为诊所、银行或其他在 OSM 标记的设施画出同样的图。
但是什么抓住了“可步行性”的整体概念呢?对我来说,这又回到了“我能步行完成大多数日常任务吗”的问题。解开什么是最有资格的日常任务是一个复杂的问题:我们可以根据生活设施对日常生活的重要性建立一个加权指数(例如,获得医疗保健比获得夜生活更重要);或者我们可以使用人们最常去的娱乐设施的经验数据。
不管怎样,我们使用 Pandana 的工作流程解决了这个问题。简单地列出你感兴趣的事物,并为它们建立一个加权指数。事实上,WalkScore 公司使用了类似的方法来提供美国各地社区质量的基准(你可以在浏览 Zillow 时看到)。
可访问性分数可以很快地被构建来回答一个给定的问题:是获得基本服务,还是吸引年轻工作者的适合步行的社区。现在,让我们平等地衡量所有的便利设施,并想象到第五个最近的便利设施的距离。
plot_nearest_amenity('all',5)

从网络距离到步行时间
让我们为第二个城市做同样的输出:明尼阿波利斯-圣保罗。(那里的人很好,网格状的街道也很直观。)

在这里,我们看到绘制一个可达性的复合测量值(到第五个最近设施的距离)比只绘制到单一最近文化设施(咖啡馆、餐馆或学校)的距离更清楚地显示了哪些社区最适合步行。
为了使结果更易于解释,让我们在道路网络后面构建一个 250 平方米的像元网格,将每个像元连接到其最近的节点,并将距离转换为步行、驾驶或公共交通时间。明尼阿波利斯不是一个非常适合步行的城市,尽管一些市中心街区的情况不错。

Minneapolis: Minutes walk to fifth-nearest amenity

扩展ˌ扩张
这里使用的图书馆是作为加州大学伯克利分校 UrbanSIM 项目的一部分开发的,支持一系列城市规划和房地产用例。可以使用高质量的本地生成的 GIS 数据来代替 OSM(这确实是更好的选择)。
一个重要的扩展:这种方法是房地产价格建模或建筑级预测模型的重要输入。举例来说,特征价格模型假设,购房者支付更多的钱来购买一栋可以方便地步行去星巴克或开车去医院的房子。将税收地块边界(或 OSM 建筑覆盖区)捕捉到网络,就像我们刚才将网格正方形附加到网络上一样,这使我们可以为任何给定的属性获取此数据。
同样,预测犯罪或火灾风险的机器学习模型需要尽可能多的属性来表征每栋建筑在城市结构中的位置。
通过这种框架的快速网络约束查询可以回答许多问题——从上面讨论的可步行性度量开始。
测量机器学习问题的“响应复杂性”
没有人会认为加里·卡斯帕罗夫的智力比他的深蓝更复杂,或者李·塞多尔的智力比阿尔法·围棋更复杂。作为一个人,他们把他们大部分的智力用于日常生活。与他们的机器人克星相比,他们拥有不太专业但更复杂的智能。
由于人类大脑的复杂性,它需要花费最多的时间来发展。不太复杂的生物,像我们的宠物,需要更少的时间达到成熟,因为它们有更多的专业技能。蚊子,甚至更少。这一原则在自然和数学中也适用。一个专门的系统必须做出更少的决定才能达到最佳结果。
一个智能系统必然会随着每一项新技能的加入而变得更加复杂。然而随着复杂性的增加,误差也会增加。并且需要更多的训练实例来实现给定技能中的较低错误。
因此,当我们设计一个机器学习解决方案时,问题的复杂性将与你的解决方案的复杂性密切相关。有一些问题比如我的 CNN 应该有多少层?我需要多少训练样本才能达到一定的误差。
响应复杂度是一种计算方法,用于帮助理解给定带标签训练数据的问题的复杂度。
对于具有输入 N 和的一组训练数据,N 的可能输入数为,M 的可能输出数为**,M 的可能输出数为**,以及输出的方差**,其中 n > = 1,m > = 1。**
RC =(n—1)σ(m—1)
一些观察
- 每增加一项技能,网络的复杂性就会增加
- 如果输出的可能数量为 1,则复杂度为 0。
- 如果输出的可能数量是无限的,但是方差是 0,那么复杂度是 0。
- 如果输出的可能数量是无限的,并且输入的数量是 1。复杂度为 0。不可能有明智的反应。
- 复杂度相对于 m 和 n 线性增加
离别的思绪
我的希望是,对于不同类别的反应,复杂性将表现出不同的最佳机器学习解决方案。例如,给定高于阈值 T 的 RC ,最佳架构将是 CNN 的变体。对于响应复杂性较小的问题,更简单的解决方案会出现。如果我们能够对每个问题的复杂性进行分类,这将使开发者更容易构建 ML 解决方案,甚至机器也可以构建自己的解决方案。
注
反应复杂性的等式仍然是一个新的等式,我对变量之间的具体关系有许多疑问。我相信添加一个输出比添加一个输入会增加更多的复杂性,但是现在很难确定会增加多少。我应该平方输出吗?记录输入吗?有没有可能用一个等式来统一回归变量和分类器?这是对复杂性理论的调查和对机器学习算法的分析,希望我和其他人能够继续探索。
用 VC 维度量分类器的能力
用 VC 维度量算法的表达能力

为数据选择分类器时,一个显而易见的问题是“这个分类器可以分类什么类型的数据?”。例如,如果您知道您的点可以很容易地由一条直线分隔,您可能会选择简单的线性分类器,而如果您知道您的点将在许多独立的组中,您可能会选择更强大的分类器,如随机森林或多层感知器。这个基本问题可以使用分类器的 VC 维度来回答,这是计算学习理论中的一个概念,它正式量化了分类算法的能力。
分类器的 VC 维由 Vapnik 和 Chervonenkis 定义为分类算法可以粉碎 [ 1 的最大点集的基数(大小)。这似乎是一个简单的定义,但很容易被误解,所以我现在将在这里更详细地解释定义中的关键术语。为了简单起见,我们将使用 2-D 例子,但是这些想法推广到任何数量的维度。
打碎一组点
平面上的 N 点的配置就是 N 点的任意放置。为了使的 VC 维数至少为 N ,分类器必须能够粉碎 N 点的单个配置。为了粉碎点的配置,分类器必须能够针对点的正负的每一种可能的分配,完美地划分平面,使得正点与负点分离。对于一个有 N 个点的配置,有个 2^N 个可能的正或负赋值,因此分类器必须能够正确地分离每个点。
在下面的例子中,我们展示了线性分类器的 VC 维至少是 3,因为它可以粉碎这种 3 点的配置。在肯定和否定的 2 = 8 个可能赋值的每一个中,分类器能够完美地分离两个类别。

现在,我们表明线性分类器比 4 低。在这种 4 点配置中,分类器不能在至少一个赋值中分割正类和负类。在这种情况下,需要两条线来分隔这两个类。我们实际上需要证明不存在一个可以被粉碎的 4 点构型,但是同样的逻辑适用于其他构型,所以,为了简洁起见,这个例子已经足够好了。

既然我们现在已经表明线性分类器的 VC 维数是至少是 3,并且低于 4,我们可以最终得出结论,它的 VC 维数是正好是 3。再次记住,为了有一个 VC 维度为 N ,分类器必须只粉碎N 个点的单个配置——可能会有许多分类器不能粉碎的 N 个点的其他配置。
VC 维的应用
既然你已经知道什么是风险资本维度,以及如何找到它,那么理解它的实际含义也是很重要的。在大多数情况下,一个分类器的确切 VC 维并不重要。更确切地说,它更多地用于根据算法的复杂性对不同类型的算法进行分类;例如,简单分类器类可以包括基本形状,如直线、圆形或矩形,而复杂分类器类可以包括诸如多层感知器、提升树或其他非线性分类器的分类器。分类算法的复杂度与其 VC 维直接相关,与偏差和方差之间的权衡相关。

在这张图片中,我们看到了模型复杂性的影响。在底部,每个 S_i 代表一组在 VC 维度或复杂度上相似的模型。在上图中,VC 尺寸在 x 轴上测量为 h 。观察到随着复杂性的增加,你从适应不足过渡到适应过度;增加复杂性直到某一点都是好的,在这之后,你开始过度适应训练数据。
另一种思考方式是通过偏差和方差。低复杂度模型将具有高偏差和低方差;虽然它的表达能力低,导致高偏差,但它也非常简单,因此它具有非常可预测的性能,导致低方差。相反,复杂的模型将具有较低的偏差,因为它具有更多的表达能力,但是将具有较高的方差,因为基于样本训练数据有更多的参数要调整。通常,具有较高 VC 维度的模型将需要更多的训练数据来正确训练,但将能够识别数据中更复杂的关系。
在模型的某种复杂程度上,偏差和方差之间会存在一个理想的平衡,用垂直虚线表示,在这个水平上,你对你的数据既不会欠拟合也不会过拟合。换句话说,你应该选择一个分类器,它的复杂程度对于你的分类任务来说刚好足够——少了会导致欠拟合,多了会导致过拟合。
区块链安全机制
密码哈希和 Merkle 树保持了公共和私有区块链数据的完整性。

密码散列法
哈希函数是网络安全和比特币等几种主要加密货币协议的重要组成部分。
什么是哈希?
哈希是一种加密方法,可以将任何形式的数据转换为唯一的文本字符串。任何数据都可以被散列,无论其大小或类型如何。在传统的散列法中,不管数据的大小、类型或长度如何,任何数据产生的散列总是相同的长度。哈希旨在充当单向函数,您可以将数据放入哈希算法并获得唯一的字符串,但如果您遇到新的哈希,您将无法破译它所代表的输入数据。一条唯一的数据将总是产生相同的散列。
它是如何工作的?
哈希是一种数学运算,易于执行,但极难逆转。(哈希和加密的区别在于,加密可以使用特定的密钥进行反转或解密。)最广泛使用的散列函数是 MD5、SHA1 和 SHA-256。一些散列过程比其他过程更难破解。例如,SHA1 比 bcrypt 更容易破解。

Some examples of data run through SHA1 hashes. The SHA1 hashes will always be the same for this data.
谁使用哈希算法?
普通用户每天都会遇到密码散列。例如,当您创建电子邮件地址和密码时,您的电子邮件提供商可能不会保存您的密码。相反,提供商通过哈希算法运行密码,并保存密码的哈希。每次您尝试登录您的电子邮件时,电子邮件提供商都会对您输入的密码进行哈希处理,并将该哈希与它保存的哈希进行比较。只有当两个哈希值匹配时,你才有权访问你的电子邮件。
加密货币中的散列法
在比特币区块链中,“挖掘”本质上是通过运行一系列 SHA-256 哈希函数来进行的。在今天的加密货币区块链中,散列被用于写入新的交易,给它们加时间戳,并最终在前一个块中添加对它们的引用。当一组交易被添加到区块链中,并且在不同节点的操作者之间达成共识(验证他们都具有整个分类帐的正确和真实版本)时,由于任何试图篡改区块链的人都需要巨大的计算能力,以及散列的单向性质,所以几乎不可能撤销交易。因此,哈希对于维护区块链的加密完整性至关重要。
哈希和网络安全
当一个组织发现一个平台的密码已经被破坏,这通常意味着黑客已经获得了代表密码的散列。然后,黑客运行常用词的散列和常用词与数字的组合来破译用户保存的一些密码。网络安全行业现在使用一种叫做“加盐”的机制。Salting 包括在哈希之前向密码添加随机数据,然后将“salt 值”与哈希一起存储。这一过程使得黑客更难使用预计算技术和破解他们获得的散列数据的密码。

The Merkle Root is derived from hashing each transaction pair in a block until it is down to a single hash.
Merkle 树
Merkle 树是区块链技术的基础部分。merkle 树是一种允许对大量数据中的内容进行高效和安全验证的结构。这种结构有助于验证数据的一致性和内容。比特币和以太坊都使用 Merkle 树。
Merkle 树是如何工作的?
Merkle 树通过产生整个事务集的数字指纹来汇总块中的所有事务,从而使用户能够验证块中是否包括事务。
Merkle 树是通过重复散列节点对直到只剩下一个散列(这个散列被称为根散列或 Merkle 根)来创建的。它们是自底向上构造的,由单个事务的散列(称为事务 id)构成。
每个叶节点是事务数据的散列,每个非叶节点是其先前散列的散列。Merkle 树是二进制的,因此需要偶数个叶节点。如果事务的数量是奇数,最后一个散列将被复制一次,以创建偶数个叶节点。

The Merkle Tree of transactions A, B, C & D.
让我们来看一个块中有四个事务的示例:A、B、C 和 D。每个事务都经过哈希处理,哈希存储在每个叶节点中,产生哈希 A、B、C 和 D。然后,连续的叶节点对在父节点中汇总,哈希 A 和哈希 B 产生哈希 AB,哈希 C 和哈希 D 分别产生哈希 CD。这两个散列(散列 AB 和散列 CD)然后被再次散列以产生根散列(Merkle 根)。
这个过程也可以在更大的数据集上进行:可以对连续的块进行哈希运算,直到顶部只有一个节点。哈希通常使用 SHA-2 加密哈希函数进行,尽管也可以使用其他函数。
Merkle 根汇总相关事务中的所有数据,并存储在块头中。它维护数据的完整性。如果任何事务中的一个细节或事务的顺序发生变化,Merkle Root 也会发生变化。使用 Merkle 树可以快速简单地测试特定交易是否包含在集合中。

The entire dataset doesn’t need to be downloaded to verify the integrity of Transaction 5.
Merkle 树与哈希表的不同之处在于,使用 Merkle 树,一次可以下载一个分支,并且可以立即验证每个分支的完整性,即使树的其余部分还不可用。这是有利的,因为文件可以被分割成非常小的数据块,使得如果原始版本被损坏,只需要再次下载小的数据块。
用途
使用 Merkle 树可以显著减少可信机构为了验证目的而必须维护的数据量。它将数据的验证与数据本身分开。Merkle 树可以位于本地,也可以位于分布式系统上。
Merkle 树有三大好处:
1.它们提供了一种证明数据完整性和有效性的方法
2.它们需要很少的内存或磁盘空间,因为证明在计算上是容易和快速的
3.他们的证明和管理只需要通过网络传输极少量的信息
证明日志完整且一致的能力对于区块链技术和总账概念至关重要。Merkle 树有助于验证日志的较新版本是否包含早期版本的所有内容,以及所有数据是否按时间顺序记录和显示。要证明日志是一致的,需要表明以前的记录没有被添加、更改或篡改,并且日志从未被分支或分叉。
Merkle 树使区块链的矿工和用户受益。当挖掘器从对等体接收事务时,挖掘器可以渐进地计算散列。用户可以单独验证块的各个部分,并且可以使用树的其他分支的散列来检查各个事务。
简化支付验证(SPV)
简化支付验证(SPV)是一种验证特定交易是否包含在一个块中而无需下载整个块的方法。Merkle 树被 SPV 节点广泛使用。
SPV 节点没有来自块中所有事务的数据。他们只下载块头。Merkle 树使区块链上的 SPV 节点能够检查挖掘者是否已经验证了块中的事务,而无需下载块中的所有事务。这种方法目前被一些轻量级的比特币客户端使用。
以太坊
以太坊在每个块中使用三个不同的 Merkle 根:
1.第一个根是块中的事务
2.第二个词根代表州
3.第三个词根是交易收据
以太坊使用一种特殊类型的哈希树,称为“ Merkle Patricia 树
区块链上不可或缺的工具
许可区块链等创新将进一步提高数据安全性和可访问性。在许可的区块链中,网络的参与者有能力限制谁可以参与区块链的共识机制。此外,许可区块链允许用户分配谁可以访问其数字身份数据的权限。
加密哈希技术长期以来一直在网络安全中发挥着作用,现在已经准备好为即将到来的区块链应用浪潮提供动力。Merkle 树对于区块链的矿工和用户来说是强大且不可或缺的工具。它们非常强大,是 BitTorrent、Git、比特币和以太坊等多个对等网络的核心。
—
关注 Lansaar Research on Medium,了解最新的新兴技术和新的商业模式。
来自 Shaan Ray 的最新推文(@ShaanRay)。创造新价值和探索新兴技术| ENTJ | #科学…
twitter.com](https://twitter.com/shaanray)
资源
在线哈希生成器。您可以在此处对您的数据运行 MD5、SHA1、SHA-256 和其他散列函数:
默克尔帕特丽夏树:https://github.com/ethereum/wiki/wiki/Patricia-Tree
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
医学院

2017 年 4 月,我在自己的博客上写了这篇文章,当时我还没有从医学院毕业,还没有开始攻读博士学位。但是我把我所有的帖子都移到了 Medium,所以我在这里转贴。这在某种程度上是我的“我的编程和生物信息学之旅”系列的前传。我也不一定再百分百赞同了;但我坚持下去,因为有人可能会觉得它仍然有趣。
作为未来的医生,我们的教育有了显著的进步。我们在医学院学习的理论知识保持相对稳定,在某些情况下,甚至有所减少,而对自然和生物学的理解却在呈指数增长。
它的核心医学院几十年来没有太大的发展。它从 2-3 年的基础科学开始:(生物)化学,遗传学,解剖学,生理学,药理学等等。在接下来的几年里,这些概念被用于研究疾病的机制:心脏病学、胃肠病学、泌尿学、妇科。在这些有时令人难以置信的科目之间,学生还需要学习病人指导下的护理:沟通、询问病史和体检,不仅关注生物医学问题,还要从生物、心理和社会因素的角度将病人视为一个“整体”。其主要目标之一是整合所有这些知识,以做出准确的(鉴别)诊断。
神经网络
在慕克吉博士写的一篇文章中,医学院最基本的目标之一受到了一个叫做“神经网络”领域的进化的挑战。简单来说,这是一种类似大脑中神经元工作方式的计算策略。通过反复刺激,一些网络得到加强,另一些网络被削弱。摘自文章:
“就像机器使人类的肌肉变得强大一千倍一样,机器也将使人类的大脑变得强大一千倍。[Sebastian]Thrun[计算机科学家]坚持认为,这些深度学习设备不会取代皮肤科医生和放射科医生。他们将增加专业人员,为他们提供专业知识和帮助。”
未来的博士应该学什么?
如果医学诊断过程在 10-20 年内将严重依赖机器,我们需要开始思考我们希望未来的医生学习什么技能。我们需要了解这些技术的基础吗?我记得我学习了线性加速器如何工作的基础知识,核磁共振成像和 CT 机是基于什么概念,超声波机的物理学等等。理解神经网络意味着计算机科学的基础知识,这是当前课程严重缺乏的领域。与其他 STEM 项目相比,我们不学习如何编程或数学/高级统计,如果你想深入基础科学(例如攻读博士学位),这些领域变得越来越重要。下一代测序是一个最好的例子。当我在 2010 年开始接受教育时,人类基因组计划在 2003 年才完成 7 年。快进到另一个 7 年后,无细胞 DNA 是下一件大事。非侵入性妊娠试验已经成为常规的临床实践。循环肿瘤 DNA 正在彻底改变癌症的诊断和治疗。为了理解并从事这一领域的工作,生物信息学的基础知识是必不可少的——这是大多数刚毕业的医生所缺乏的技能(但说实话,大多数医学生不需要知道编程就能成为一名好医生)。
然而,想象一下 30 年后深度学习被整合到日常实践中。医生需要非常详细的病史(更多的数据意味着更准确的诊断),使用他的电子听诊器记录心音(解释心音是算法的任务),并将所有这些数据输入到“神秘盒子”中,以诊断他的病人。根据他病历中的所有参数(包括患者的基因组、转录组、甲基组和代谢组),神秘盒子为其提供最佳治疗建议。医生审核数据,按下“确认”,剩下的时间用来和患者沟通诊断和治疗方案。
另一种未来是,医生了解这个神秘盒子在引擎盖下做什么,准确指出它的优点和缺点,以进一步提高诊断的准确性。了解机器需要哪些数据来优化准确诊断的概率以及为什么。在理解神秘盒子之后,医疗从业者与病人交谈,支持他们,开始治疗,并密切关注可能的副作用。但是为了实现这样的未来,医学院的课程必须进行重大改革。
在编程、大数据分析、生物信息学和神经网络旁边教授内科学和通信的日子不会是明天,但在未来也不是不可想象的。
医学图像分割[第一部分] — UNet:交互式编码卷积网络

Gif from this website
最后,我开始了这个系列,医学图像分割。关于这个主题,我的第一篇文章是实现众所周知的体系结构,UNet。如果你想看原文,请点击这里。(或者我也把它链接到下面)。请注意,今天我觉得有点懒,只想使用自动微分。也许在不久的将来,我可以回来为这个网络做人工反向传播。
网络架构(图形/ OOP 形式)

这篇论文在解释网络体系结构方面做得非常出色。我们可以看到网络由卷积运算、最大池、、ReLU 激活、级联和上采样层组成。现在,我知道有些人可能对如何对原始图像进行上采样感到困惑,这可以通过使用转置卷积运算来实现。我不会深入讨论这个材料,但是这篇博文做了一件令人惊奇的工作,解释了我们如何使用它来上采样图像。还有,这里是我们可以使用的 Tensorflow API 。


红框 →代表 U 网左侧
蓝框 →代表 U 网右侧
绿框 →最终瓶颈层。
从实现的角度来看,它非常简单,只需要几个卷积层,再加上最大池和 ReLu()激活。
实验设置/与论文的差异



右图 →原图
中图 →地面真实二值蒙版
左图 →地面真实蒙版叠加原图
这个网络的实验设置非常简单,我们将使用 Kaggle Challenge 超声神经分割 的公开可用数据集。我们将看看我们的模型是否能够从图像中分割出特定的部分。但是,请注意,与原文有三处不同。
- 使用了较小的特征图尺寸 →这是由于硬件的限制,我使用的特征图数量是(1、3、6、12、24 和 48)。
- 使用了不同的代价函数 →如下图所示,原纸已经使用了带交叉熵损失函数的 softmax】。

然而,我使用了一个均方损失函数,激活了 ReLu()。
3 。用了不同的优化器 →如下图所示,原论文用的是随机梯度下降优化器,我只是用了一个 Adam 优化器。

结果






右图 →原图
中图 →二值掩码
左图 →从网络生成二值掩码
总的来说,与地面真实二进制掩码相比,网络做得令人惊讶地好,网络似乎正确地分割了它周围的区域。下面是在原始图像上叠加地面真实蒙版或生成蒙版时的一些图像。




GIF 格式的结果

显示图像的顺序 → 1。原图→ 2。地面真实二进制掩码→ 3。生成的二进制掩码→ 4。原始图像上的地面真实遮罩叠加→ 5。原始图像上生成的蒙版覆盖。
以上是我根据分割结果制作的 GIF,请注意观看 GIF 的顺序,以下是网络如何加班的汇编。随着训练的持续(从 epoch 来看),我们可以看到生成的掩码变得更加精确。

互动代码/透明度

对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问 Google Colab 上的代码,请点击此处。
- 注*:我不想在 github 上托管 Kaggles 的数据,因为我可能会违反他们的数据使用政策。所以这段代码不能直接在线运行。
- 为了让这个实验更加透明,我把我所有的命令输出上传到了我的 github,如果你想看,请点击这里。
遗言
我真的想将我的技能扩展到细分领域,我很高兴最终我能够做到这一点。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。
同时,在我的推特这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 罗尼伯格,o .,菲舍尔,p .,& Brox,T. (2015 年 10 月)。生物医学图像分割的卷积网络。在医学图像计算和计算机辅助介入国际会议上(第 234-241 页)。斯普林格,查姆。
- 超声波神经分割| Kaggle。(2018).Kaggle.com。检索于 2018 年 4 月 2 日,来自https://www.kaggle.com/c/ultrasound-nerve-segmentation
- 整流器(神经网络)。(2018).En.wikipedia.org。检索于 2018 年 4 月 2 日,来自https://en . Wikipedia . org/wiki/Rectifier _(neural _ networks)
- 面向数据科学的转置卷积上采样。(2017).走向数据科学。检索于 2018 年 4 月 2 日,来自https://towards data science . com/up-sampling-with-transposed-convolution-9 AE 4 F2 df 52d 0
- TF . nn . conv 2d _ transpose | tensor flow。(2018).张量流。检索于 2018 年 4 月 2 日,来自https://www . tensor flow . org/API _ docs/python/TF/nn/conv2d _ transpose
- 达哈尔,P. (2017 年)。分类和损失评估— Softmax 和交叉熵损失。深度笔记。2018 年 4 月 2 日检索,来自https://deepnotes.io/softmax-crossentropy
- j . brown lee(2017 年)。深度学习的 Adam 优化算法的温和介绍-机器学习掌握。机器学习精通。检索于 2018 年 4 月 2 日,来自https://machine learning mastery . com/Adam-optimization-algorithm-for-deep-learning/
- 随机梯度下降。(2018).En.wikipedia.org。检索于 2018 年 4 月 2 日,来自 https://en.wikipedia.org/wiki/Stochastic_gradient_descent
- Python 中的 DICOM:用 PyDICOM 和 VTK 将医学图像数据导入 NumPy。(2014).PyScience。2018 年 4 月 2 日检索,来自https://pyscience . WordPress . com/2014/09/08/DICOM-in-python-importing-medical-image-data-into-numpy-with-pydicom-and-VTK/
- JaeDukSeo/Only_Numpy_Basic。(2018).GitHub。2018 年 4 月 2 日检索,来自https://github . com/JaeDukSeo/Only _ Numpy _ Basic/blob/master/U-net/U-net . txt
- 均方差。(2018).En.wikipedia.org。检索于 2018 年 4 月 2 日,来自https://en.wikipedia.org/wiki/Mean_squared_error
医学图像分割[第二部分]——基于交互式编码的扩展全卷积网络的病理肺组织语义分割

Gif from this website
这是我关于医学图像分割的第二篇文章。今天我们将覆盖这篇论文“ 【扩张全卷积网络的病理肺组织语义分割 ”。今天我又觉得有点懒,所以我就用自动微分来训练我的网络。
网络架构(基本构建模块/完整架构)

Image from paper
所以上图显示了这个网络的基本构建模块,它由卷积运算、归一化、加法和激活函数(ReLU)组成。既然我们已经看到了基本的构造块,那么让我们来看看完整的网络体系结构。

这篇文章确实很好地描述了整个体系结构,网络总共有 13 层,有各种级联层和丢弃层的组合。
实验设置/与论文的差异



右图像 →原始图像
中间图像 →地面真实二值蒙版
右图像→ 地面真实蒙版覆盖在原始图像之上
与原始论文有一些不同之处,这些不同之处是……
1。数据集:我将使用来自 Kaggle " 超声神经分割的分割数据
2。归一化层/批量大小:原论文使用实例归一化层,然而如下图所示,我将使用批量归一化。同样,原始纸张使用的批量大小为 1,我将使用批量大小为 2。

*3。不同数量的特征图:*原论文报道每层使用 32 个特征图,由于硬件限制我只使用 3 个特征图。(因此在连接操作中,我们将有 1 + 3 * 10 = 31 个特征地图)

成绩(原网)



即使我用各种超参数训练原始网络,我也不能得到任何好的结果。生成的蒙版只是一个漆黑的图像。所以我决定对网络做三个改变。
原网络改造

红线 →每层增加剩余连接
我做的第一个改变是在每一层增加一个额外的剩余连接,以获得更流畅的信息流。

绿线 →更改辍学率
我改变的第二件事是退学率,我决定不使用退学层。

紫线 →改变成本函数和直接连接
最终的改变是将最终图层直接链接到成本函数,并将成本函数更改为均方误差函数。(本文使用了带交叉熵损失函数的 softmax。
结果(修改后的网络)






右图 →原图
中图 →二进制掩码
左图 →从网络生成二进制掩码
网络很好地分割了感兴趣的区域。然而,我注意到的一件事是生成的蒙版中出现了看起来像正方形的伪像。众所周知,这种有时被称为棋盘状伪像的现象即使在使用去卷积操作时也会发生,本文对此进行了解释。下面是在原始图像上叠加地面真实蒙版或生成蒙版时的一些图像。




GIF 格式的结果

显示图像的顺序 → 1。原图→ 2。地面真实二进制掩码→ 3。生成的二进制掩码→ 4。原始图像上的地面真实遮罩叠加→ 5。原始图像上生成的蒙版覆盖。
以上是我根据分割结果制作的 GIF,请注意观看 GIF 的顺序,以下是网络如何加班的汇编。随着训练的持续(从历元来看),我们可以看到生成的掩模变得更加精确,但是我们可以看到棋盘伪影总是存在。

互动代码/透明度

对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问原始型号的代码,请点击此处。
要访问改装车型的代码,请点击此处。
- 注*:我不想在 github 上托管 Kaggles 的数据,因为我可能会违反他们的数据使用政策。所以这段代码不能直接在线运行。
- 为了让这个实验更加透明,我上传了我所有的命令输出到我的 github,如果你想看的话,请点击这里。
最后的话
我实现的原始网络要复杂得多。它甚至有 4D SoftMax 层。(点击这里如果你想查看 4D 软最大层。).他们在分割肺部区域方面做得非常出色。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 完整的-项目/LungNet。(2018).GitHub。于 2018 年 4 月 3 日检索,来自https://github.com/intact-project/LungNet
- Anthimopoulos,m .,Christodoulidis,s .,Ebner,l .,Geiser,t .,Christe,a .,和 Mougiakakou,S. (2018 年)。基于扩展全卷积网络的病理肺组织语义分割。arXiv 预印本 arXiv:1803.06167。
- 超声波神经分割| Kaggle。(2018).Kaggle.com。2018 年 4 月 3 日检索,来自https://www.kaggle.com/c/ultrasound-nerve-segmentation
- Ioffe,s .,& Szegedy,C. (2015 年)。批量标准化:通过减少内部协变量转移加速深度网络训练。Arxiv.org。2018 年 4 月 3 日检索,来自https://arxiv.org/abs/1502.03167
- Ulyanov,d .,Vedaldi,a .,和 Lempitsky,V. (2016 年)。实例规范化:快速风格化缺少的要素。Arxiv.org。检索于 2018 年 4 月 3 日,来自https://arxiv.org/abs/1607.08022
- 均方差。(2018).En.wikipedia.org。检索于 2018 年 4 月 3 日,来自 https://en.wikipedia.org/wiki/Mean_squared_error
- 奥登纳,a .,杜穆林,v .,和奥拉,C. (2016 年)。去卷积和棋盘伪影。蒸馏,1(10)。doi:10.23915/蒸馏水
- Roelants,P. (2018 年)。彼得的笔记。peterroelants . github . io . 2018 年 4 月 3 日检索,来自http://peterroelants . github . io/posts/neural _ network _ implementation _ intermezzo 02/
医学影像遭遇 NIPS:综述

今年,我参加了医学成像与 NIPs 研讨会,并展示了一张海报。该研讨会的重点是汇集来自医学成像和机器学习社区的专业人士。总共有十一个讲座和两个海报会议。在这里,我将回顾研讨会的一些亮点。演讲和海报通常讨论分割、分类和/或图像重建。
分割
在参加这个研讨会之前,我必须承认我没有完全理解图像分割的价值。我的思维过程一直是这样的:为什么你只想勾勒出一幅图像中的某样东西,而不想对它进行分类?这个研讨会改变了我对细分价值的看法。
放射疗法
剑桥大学放射学家、微软研究员 Raj Jena 做了一个关于“像素完美主义——机器学习和适应性放射治疗的演讲。在演讲中,他描述了机器学习如何帮助提供更好的治疗方法和优化工作流程。为了使患者接受适当的放射治疗,精确定位肿瘤的确切边界是很重要的。通过定位肿瘤和健康组织之间的精确边界,治疗可以提供更多的辐射,因为损伤健康组织的风险更小。然而,目前分割是由放射科医生手动完成的。这通常会导致不同放射科医生之间的差异,从而显著影响治疗结果。一致性在衡量与放射联合使用的药物的有效性方面也很重要,因为如果患者接受的放射不同,几乎不可能判断是药物还是更好的放射导致了改善。
机器学习提供了提供一致性和更准确分割的机会。其次,机器学习模型通常可以在几秒钟内运行,而放射科医生通常需要几个小时来手动分割图像。这些时间可以更好地用于规划治疗过程或看更多的病人。Jena 还描述了机器学习如何让他成为一名“超级放射肿瘤学家”

Slide from Jena’s talk. The “Super Radiation Oncologist” uses machine learning to constantly adapt therapy and predict effects of treatment.

Slide from Jena’s talk. Details adaptive radiation therapy.
ML 可以使肿瘤学家更好地使治疗适应健康组织的形状和大小的变化,并帮助肿瘤学家预测放射治疗可能的不利影响。例如,Jena 描述了他如何使用高斯过程等简单方法来预测辐射的潜在副作用。
这是整个研讨会中我最喜欢的演讲之一,我强烈建议大家看看 Jena 的完整报告。
构建质量数据集
整个研讨会的一个共同主题是注释的质量和建立良好的医学成像数据集的困难。在分段任务中尤其如此,在这种任务中,模型只能和它的注释器一样好,而注释器本身必须是熟练的放射科医生。
加速注释过程的一种可能方式是通过主动学习。IBM 的 Tanveer Syeda-Mahmood 在讨论 IBM 在放射学方面的工作时简单地提到了这一点。对于主动学习,可以从一个小的带标签的数据集和几个专业的人类注释者开始。ML 算法很好地学习训练集,使得它可以自己注释简单的图像,而专家注释硬边缘情况。具体而言,分类器得分低于确定性阈值的图像随后被发送给人类进行人工注释。其中一张海报(Girro 等人)还讨论了使用主动学习来帮助有效地训练语义图像分割网络。
主动学习可以解决部分问题,但不能完全解决质量问题。核心问题是,当连专家都不同意界限时,研究人员如何开发准确的数据集。关于这一点,Bjorne Menze 介绍了 BraTS 数据集的构建。BraTS 数据集是最大的脑成像数据集之一。他融合了来自几个不同注释者的数据,以创建“基础事实”自成立以来,BraTS 已经举办了几次不同的挑战。挑战之一是用机器学习算法分割所有肿瘤,最近的挑战集中在预测总生存期上。
定位、检测和分类
对医学图像中发现的疾病进行准确分类是研讨会的一个突出主题。在医学成像中,检测对象/ROI 并对其进行准确分类是一项具有挑战性的任务。这在很大程度上是由于医学图像(即,X 射线 MRI、CT、超声和声谱图)的各种形态(和维度)、图像的大小以及(与分割一样)有限的注释(有时是低质量的)训练数据。因此,演讲者展示了各种有趣的技术来克服这些障碍。
Ivana Igsum 讨论了心脏成像中的深度学习技术。特别是,她描述了自己在精确检测动脉钙化方面的工作。她描述了她和她的团队如何开发出自动计算钙含量并对心血管疾病风险进行分类的方法。为此,她的团队使用了多层 CNN 方法。

Slide from Ivana’s talk (5:46)
当天晚些时候,Yaroslav Nikulin 介绍了数字乳腺摄影挑战赛的获奖方法。
海报
芝加哥大学的 Natalia Antropova,Benjamin Huynh 和 Maryellen Giger 有一张关于使用 LSTM 进行乳腺 DCI-MRI 分类的有趣海报。这包括在应用对比染料后输入多个时间步骤的 3d MRI 图像。然后,他们使用 CNN 从这些图像中提取特征,并将其传送给 LSTM,输出一个预测。总之,这张海报提供了一个 LSTM(和 CNN)处理“4d”医学成像数据的有趣应用。
我的海报重点介绍了我目前正在进行的工作,即使用物体探测器对胸部 X 射线中的多种情况进行精确定位和分类。我的主要目标是研究对象检测算法在有限数据集上的表现,而不是在整个数据集上训练的多标签分类 CNN。我认为,如果配置和训练得当,对象检测器在医学图像中定位和分类疾病/状况方面有很大潜力,但是它们受到缺乏标记包围盒数据的限制,这也是我觉得下面的海报非常有趣的原因之一。
Hiba Chougrad 和 Hamid Zouaki 有一张关于乳腺成像分类的迁移学习的有趣海报。在摘要用于乳腺癌筛查的卷积神经网络:指数衰减的迁移学习中,他们描述了测试几种不同的迁移学习方法。例如,他们比较了微调和利用在 imagenet 上预先训练的 CNN 与随机初始化权重。最后,他们发现最佳技术是使用指数衰减学习率来微调各层。因此,对于底层(即最接近 softmax 的层),学习速率最高,而对于上层,学习速率最低。这在直觉上很有意义,因为底层倾向于学习最相关的数据集特征。通过使用这些和相关技术,我们可以(有希望)在没有大型数据集的情况下开发精确的模型。
重建和生成
心流
我通常不会对那些吹捧他们的产品有多棒以及它将如何“革新[插入行业]”的产业宣传印象深刻不过 Heartflow 和他们的 DeepLumen 血管分割算法绝对让我印象深刻。该产品减少了 83%的不必要的血管造影,并获得 FDA 批准。我不会在这里深入讨论细节,但我认为 Heartflow 是机器学习在现实世界环境中产生影响的一个很好的例子。
其他两位演讲者也谈到了重建问题。Igsum 的演讲(前面提到过)讨论了一种从低剂量 CT 构建常规 CT 的方法。帝国理工学院的 Daniel Rueckert 描述了基于 ML 的重建如何在成像中启用更多的时间戳。
海报
我发现其中一个特别有趣的海报是使用循环一致生成对抗网络的 MR-to-CT 合成。在这项工作中,作者(Wolterink 等人)采用了流行的 CycleGAN 算法,并将其用于将 MRI 图像转换为 CT 图像。这是一个潜在的非常有用的应用,可以避免患者必须进行多次成像过程。此外,CT 使患者暴露在辐射中,因此这也有可能减少辐射暴露。

Image from MR-to-CT synthesis article
还有一张由 Virdi 等人制作的海报,主题是来自双生成对抗网络的合成医学图像,以及 Mardani 等人制作的海报,主题是用于压缩感知的深度生成对抗网络(GANCS)自动核磁共振成像。
工具和平台
几位发言者谈到了旨在使临床医生和 ML 研究人员更容易利用机器学习进行医学图像分析的新工具。Jorge Cardoso 描述了 NiftyNet 以及它如何使研究人员更容易地开发医学成像模型。NiftyNet 建立在 Tensorflow 之上,它包括许多简单易用的模块来加载高维输入。

Poster from Makkie et al. on their neuroimaging platform
同样在工具方面,G. Varoquax 在 NILearn,上展示了一个基于 scikit-learn 构建的用于神经成像数据的 Python 模块。正如 scikit-learn 寻求使具有基本编程技能的人能够使用 ML 一样,NILearn 的目标是在脑成像方面做同样的事情。唯一与系统相关的海报来自佐治亚大学的 Makkie 和刘。它专注于他们的大脑倡议平台,用于神经成像,以及它如何融合几种不同的技术,包括 Spark,AWS 和 Tensorflow。最后, DLTK 工具包在大会上有了自己的海报。总之,有一些非常有趣的工具包和平台,应该有助于让每个人都更容易使用机器学习进行医学图像分析。
其他会谈
Wiro Nessen 在 T4 做了一个关于生物医学成像和基因数据融合的有趣演讲。在演讲中,他描述了如何将大型基因和成像数据集结合起来,试图检测图像中的生物标记。这两个领域的综合也有助于早期发现疾病,并找出更有针对性的治疗方法。
公告
- 在她的演讲结束时,Ivana Igsum 宣布第一届医学成像深度学习或 MIDL 活动将于 7 月在阿姆斯特丹举行。
- 我不断地在我的机器学习医疗保健策划列表中添加新的论文、会议和工具。然而,这是一个大工程,所以今天就做一个公关并做出贡献吧!
- 我正在开办一个新的 Slack 频道,致力于医疗保健领域的机器学习。所以如果你感兴趣,请随时加入。
- 我对 NIPs 的医疗保健机器学习或 ML4H 的总结将在未来几周内发表。这将涵盖从医院运营(如 LOS 预测和手部卫生),到挖掘电子医疗记录,到药物研发,再到分析基因组数据的方方面面。敬请关注。
一如既往地欢迎评论和提问。
媒体分析:愿望清单

慷慨地说,中等分析是简朴的。无论你是个人作家还是出版物,他们给你的信息很少,比如谁看过你的帖子,以及为什么他们成功或不成功。
作为一名作家和编辑,这降低了我对平台的忠诚度。我可以看到这样的事情:

Two weeks after publishing, a sudden 4x in daily views…
但是媒体让我无法发现为什么会这样,谁感兴趣,或者下次我能做些什么来增加我的收视率。我有所有的问题…但没有答案。
中,以下是我的要求:
帮我了解我的听众。
不管是关注者还是读者——或者两者都是——我希望我有更多关于谁在阅读我的作品的信息。我对人口统计数据很好奇——年龄、性别、职业——但也对我确信你有的行为统计数据很好奇。我的读者是活跃的媒体用户吗?我是否真的从使用你的平台中获得了动力,或者我只是通过在 LinkedIn 上发布我的文章来满足你的用户群?
我的读者还会读到什么或为之鼓掌吗?我的朋友读我的作品是因为他们喜欢我,还是我真的接触到了设计师和项目经理的观众?
我的读者中有多少是机器人?当我浏览我的出版物的关注者时,我看到一些空的个人资料。很难说这些人是新媒体用户还是推特式的填充者。
帮助我了解我在中观宇宙中的等级。
环顾中型平台——看到一些点击量为 1.5K 的点击诱饵,以及拥有相同数量的经济学人——我很难理解我获得的关注量是赢还是输。我很想知道一个给定的故事相对于它的同行(具有相似的内容标签和阅读时间,或者由拥有相似粉丝数量的作者)表现如何……或者甚至它与我的历史出版作品相比表现如何。
我可以想出我自己的聪明的主题或图像或格式…我不需要看到什么是流行的媒体整体和试图游戏系统。但是我想知道我和我的写作同行相比如何,这样我可以随着时间的推移改进我的策略和风格。
告诉我媒体是如何帮助我的。
当它第一次出现在我的收件箱时,我真的很兴奋:

…同样,当我点击链接却找不到自己,或者找不到关于人们如何出现在这个页面的解释时,我感到失望。由于如此多的媒介是经过策划的,我不知道这些被标记的页面应该告诉我什么。我的作品会呈现给对设计或数字设计感兴趣的人吗?我在设计标签的前一百篇文章中可见吗?Medium 实际上做了什么来将我的作品展示给其他人?
我相信你做了很多——这也是我写这封公开信的部分原因,我希望在你的策展和分享我的作品时有更多的透明度。
期待继续我们的读者-作者-出版商关系…如果你未来的分析项目需要一些测试人员…你知道在哪里可以找到我。
中型或:我如何学会停止担心,爱上博客
第一个月在介质上写数据文章的经验和收获

Just about every weekend.
我一直想写一个博客,将想法在纸上(或屏幕上)具体化,并钻研短暂的兴趣。
尽管在许多场合,我的文章想法都得到了朋友们的认可,但我发现自己还是陷入了无所作为的状态。
但是后来,发生了。

也许这是一种自信的提升。也许是最近长篇写作的热潮。或者可能是上个月我肩膀脱臼后腾出的时间。
不管怎样,在一个月的时间里,我写了四篇文章,我意识到我是多么享受尝试和写作不同主题的过程。
这里有 5 个外卖:
1.了解你的受众
“写信只是为了取悦一个人。如果你打开一扇窗,向世界做爱,可以说,你的故事会得肺炎。”—库尔特·冯内古特
写完我的第一篇文章后,我不断地质疑内容是否太长,或者是否有人对在线电子表格感兴趣。
就在那时,一位朋友给我发来了上述库尔特·冯内古特的名言。
写给一个人看。
就像你为产品创建 UX 人物角色一样,也为你的目标读者创建一个。我的第一篇文章相当模糊,没有重点。所以对于我的下一篇关于数据争论的文章,我决定为一个对数据可视化感兴趣的刚毕业的学生写,他刚刚开始研究 Python 的功能和包。他/她也将从一个相对干净的数据集开始,该数据集来自一个著名的来源,如经合组织或世界银行。
通过关注你是为谁而写,文章自然会变得更简洁以迎合读者。反过来,听众也能更好地阐述为他们增加的价值。
2.小胜利很重要
"追踪你的小成就,激发大成就."特蕾莎·阿马比尔
你有没有在完成一个个人项目或达到一个个人目标时,同时感到一阵兴奋和轻松?
每当我完成一篇文章时,同样的浪潮就会席卷我。对于我围绕数据分析项目的作品来说尤其如此。
然而,在我调试代码和写作的几周里,我的热情和动力总是下降。对于一个旷日持久的过程来说,这似乎总是一笔不常见的支出。
所以我把完成一篇文章的大“胜利”分解成代表小胜利的多个检查点。它可以像“完成介绍”或“调整正确的数据集”一样精细。

一个接一个的小胜利让我在整个写作过程中都沉浸在微量多巴胺的刺激中。更重要的是,通过积累小胜,我设法**建立势头,坚持一个常规,**并打破惯性的错觉。
又及——猫迷因的每一次机会都是一次小小的胜利。
3.抽时间
“忙是一种选择。”—安·沃斯坎普
我一直用来证明拖延写作的借口是我很忙,没有时间。我工作很忙。我正忙着建立关系网。我在健身房很忙。

我逐渐意识到,你选择在某些事情上忙碌是因为它们对你很重要,你把它们看得比其他事情更重要。
从“我在做多少不同的事情?”到“我在做多少不同的事情”,这需要重新定义我的优先事项。到“对我来说什么是重要的?”这让我致力于我的第一篇文章。学习掌握新的想法,清楚地表达自己,澄清我的想法,并参与讨论对我来说很重要,这些都是我可以通过写作解决的问题。
所以我优先考虑。我挤出了时间。早餐前的几个小时,午餐后的工作间隙,以及回家的公交车都成了制作内容的宝贵时间。
4.只是运送它
“做得比完美更好”——未知
你总是会回头看一篇发表的文章,看到一些可以改进的地方。
一直都是。
这并不是说任何草稿都应该不经过校对就发表。然而,到了一定程度,担心内容是否足够好或足够容易理解是一种毫无意义的练习。

在撰写一篇关于 P2P 贷款的数据文章时,我确实有这种感觉。这个模型可以有更多的变量。我可以包含更多的外部数据集。我本可以通过特征工程制造出更多的变量。
一天结束时,我想到了三个问题:
- 鉴于个人限制(时间、技能水平等),我是否尽了最大努力?)?
- 这是我的一个观众会觉得有价值的东西吗?
- 我从写这篇文章中学到了什么吗?
三票通过。它上升了。
5.准备好惊喜吧
“生活中几乎所有美好的事情都是我意想不到的,没有计划的。”—卡尔·桑德堡
作为一名新作家,我预计每天会有 10-20 次浏览,主要是朋友和我父亲的重复访问。
想象一下我的反应,一周后检查统计数据,看到总阅读数在一小时内翻了五倍。老实说,这主要是混乱,夹杂着些许惊讶和兴奋。
几天后,我的 CTO 转向我,说“嘿,这不是你在 Python 周刊上发表的文章吗?”。
对于一个写作和编码的新手来说,正是像这样的时刻和随后感谢我写这篇文章的信息提醒了我为什么要在 Medium 上写作。
如果你对出版犹豫不决,因为你怀疑你能提供什么或者你有多少时间来写作,我希望这篇文章能鼓励你迈出这一步。
感谢阅读!
认识人工神经网络

http://www.extremetech.com/wp-content/uploads/2015/07/neural-net-head.jpg
当听到“神经”这个词时,我首先想到的是大脑中的神经元,这是决策过程的一部分。
这是人类区别于机器人(或常规计算机程序)的主要特征之一。人类可以看到事物,分析它们,并从中学习,以便下次做得更好。
另一方面,常规程序遵循同样的一套指令,它们不会发展自己。我们可以通过编程让它们完成特定的任务,根据它们被编程的方式,我们可以得到一个好的结果。
但是如果我们能让程序学习,我们可以做很多事情。然后他们会随着时间发展自己。这被称为“机器学习”,人工神经网络(ANN)是一种用于机器学习的计算模型,其工作方式类似于生物神经元。
当信息流经神经网络时,它会感知它们,并通过调整网络来学习,以生成一个好的解决方案。通过网络传递尽可能多的数据可以获得更准确的结果。这被称为对神经网络的训练。
在使用神经网络之前,我们需要对其进行训练和调整,以便做出正确的决策。为此,我们使用测试数据。它们由网络的输入和相应的预期输出组成。通过适当地喂养它们,我们可以教会网络,然后我们可以用它来对未知数据做出决定。
基本上,人工神经网络用于非线性统计数据建模,其中输入和输出之间存在复杂的关系。训练过程用于发现数据集中的复杂关系和模式。
人工神经网络(ann)或connectionist系统是受构成动物大脑的生物神经网络启发的计算系统。这种系统通过考虑例子来学习任务(逐步提高性能),通常不需要特定任务的编程——维基百科
在需要基于计算机的预测的地方,神经网络是非常常见的。通常,他们能够做出准确的预测。一些应用是股票市场趋势预测、手写识别、语音识别、滑坡预测等。此外,像脸书这样的社交媒体,像谷歌这样的搜索引擎也利用这些来提供丰富的用户体验。
存在许多类型的神经网络。
- 前馈
- 复发的
- 监管反馈
- 径向基
- 等等…
“前馈”网络是第一种也是最简单的类型。在这种类型中,数据从输入层传输到隐藏层,最后传输到输出层。没有数据传输的周期或循环。

Neural Network with multiple layers (https://blog.ttro.com/wp-content/uploads/2017/01/TB010-Deep-Neural-Network.jpg)
另一方面,在“循环”网络中,数据向前和向后传播。递归网络输出也用作输入,当预测序列时,使用这种方法。
下面是我在 YouTube(https://www.youtube.com/watch?v=ZzWaow1Rvho)上找到的一个简单的例子,这个例子非常有助于理解这个概念。有红色和蓝色两种花,我们已经给出了一些关于它们的宽度和长度的样本数据。需要使用这些给定的数据,并预测未知花朵的颜色。

Testing Data
这里我们将使用一个前馈神经网络来预测正确的花。我们将使用 Python 和 Numpy 库来实现。你可以通过安装“迷你康达”(【https://conda.io/miniconda.html】T2)来设置这些
我们简单的神经网络有 2 个输入,即花瓣长度和宽度,输出为 0 或 1,表示红色或蓝色。

Our simple neural network
由于网络的最终输出是 0 或 1,我们在这里使用一个特殊的函数,称为“ Sigmoid ,它将任何值压缩到 0,1 的范围内。基于它与 0 或 1 的接近程度,我们进行预测。
S 形函数是具有“S”形曲线的数学函数(S 形曲线)。通常, sigmoid 函数是指逻辑函数的特例

Sigmoid function (https://qph.ec.quoracdn.net/main-qimg-05edc1873d0103e36064862a45566dba)
我们试图通过 **w1 长度+ w2 宽度+ b 对给定数据进行建模,其中 w1、w2 是两个权重,b 是一个偏差。这可用于发现数据中的任何非线性关系。
最初,我们将随机数分配给 w1、w2 和 b,在训练过程中,我们更改这些值,以使模型代表给定的测试数据。这是通过使用期望值和预测值来计算成本值,并尝试使用基本微积分理论来减少成本值来实现的。在训练过程的最后,我们将能够得到一个准确的模型,并且我们将能够使用它来预测未知的数据。
Sample source code
在本例中,我们所做的是,使用链式法则分别对 w1、w2 和 b 的成本函数进行微分,并找到使成本最小的常数。由于这是一个简单的微分手动进行。然而,有一些库可以自动完成这些任务。最后,他们找到了神秘的花的类型。
下图显示了培训结束后成本是如何降低的。它一步一步地减少,以作出更准确的预测。

Cost variation while learning
正如我之前说的,这个例子摘自一个很棒的 YouTube 系列,要了解更多信息,我强烈推荐你去看看这个!(https://www.youtube.com/watch?v=ZzWaow1Rvho
感谢阅读。
干杯!
认识深度学习的英雄

Photo by Ricardo Gomez
深度学习
你过得怎么样?我希望你很好,准备好继续学习新的东西,这就是你读书的原因,对吗?我很高兴为你写这篇文章,但是我为什么要写这个呢?几天前,我在看 Andrew NG 做的一系列采访,这些采访可以在 YouTube 上找到,他是作为 deeplearning.ai 课程的一部分做这些采访的。Andrew 的目标是召集一些最伟大的头脑,他们是深度学习领域的先驱,在这个非常惊人的领域做出了巨大的贡献和进步,让每个人都与他人分享他们如何开始研究深度学习和他们的一些动机,并给有兴趣加入该领域的人提供一些建议。有哪些不同的方法可以开始,如果你没有研究过深度学习,也许这是你知道为什么你应该或不应该(不是每个人都愿意付出努力来掌握一些东西)参与的机会。正如你可能猜到的,我觉得有责任与你分享这些,所以我来了。
我认为人们需要理解深度学习正在幕后使许多事情变得更好。深度学习已经在谷歌搜索和图像搜索中发挥作用;它允许你搜索图片,比如“拥抱”—杰弗里·辛顿
关于吴君如
- Coursera 的联合主席和联合创始人;
- 斯坦福大学兼职教授。
除了是 Coursera 的联合主席和联合创始人之外;作为斯坦福大学的兼职教授,安德鲁是百度的副总裁兼首席科学家,2011 年,他领导了斯坦福大学主要 MOOC(大规模开放在线课程)平台的开发,并为超过 10 万名学生讲授了在线机器学习课程,从而创立了 Coursera。Ng 的目标是让世界上的每个人都能免费获得良好的教育。今天,Coursera 与世界上一些顶尖大学合作,提供高质量的在线课程,是世界上最大的 MOOC 平台。
Ng 还致力于机器学习,重点是深度学习。他创立并领导了“谷歌大脑”项目,该项目开发了大规模深度学习算法。这导致了著名的“谷歌猫”结果,其中一个拥有 10 亿个参数的大规模神经网络从未标记的 YouTube 视频中学习,以检测猫。最近,他继续致力于深度学习及其在计算机视觉和语音方面的应用,包括自动驾驶等应用。
深度学习的英雄
安德烈·卡帕西
- 特斯拉 AI 总监
绝对是我的最爱之一,我真的很喜欢他关于计算机视觉识别卷积神经网络(Cs231n)的课程。安德烈·卡帕西(Andrej Karpathy)是特斯拉的人工智能总监,目前专注于自动驾驶的感知。此前,他是 OpenAI 的研究科学家,从事计算机视觉、生成建模和强化学习方面的深度学习。他获得了斯坦福大学的博士学位,在斯坦福大学,他与费-李非一起研究卷积/递归神经网络架构及其在计算机视觉、自然语言处理及其交叉领域的应用。在博士期间,他挤出时间在谷歌实习了两次,在那里他从事 YouTube 视频上的大规模特征学习,2015 年,他在 DeepMind 实习,从事深度强化学习。他和飞飞一起设计并教授了一个新的斯坦福班级,关于视觉识别的卷积神经网络(CS231n) 。
伊恩·古德费勒
- 谷歌大脑的研究科学家
Ian good fellow(2014 年蒙特利尔大学机器学习博士)是谷歌的研究科学家。他的研究兴趣包括大多数深度学习主题,尤其是生成模型和机器学习安全和隐私。他发明了生成对抗网络,是研究对抗例子的有影响力的早期研究者,也是麻省理工出版社教科书《深度学习》的第一作者。他负责机器学习的自组织会议,该会议于 2016 年在 OpenAI 成立。
约舒阿·本吉奥
- 计算机科学正教授
Yoshua Bengio 是计算机科学和运筹学系的全职教授,蒙特利尔学习算法研究所(【MILA】)的负责人, CIFAR 机器和大脑学习 CIFAR 项目的联合主任,加拿大统计学习算法研究主席。他的主要研究目标是理解产生智力的学习原理。他教授一门机器学习的研究生课程,并管理一个由研究生和博士后组成的大型团队。他的研究被广泛引用(谷歌学术在 2017 年 4 月发现了超过 65000 次引用,H 指数为 95)。
杰弗里·辛顿
- 多伦多大学教授
- 谷歌大脑的研究科学家
Geoffrey Everest Hinton 是出生于英国的加拿大认知心理学家和计算机科学家,最著名的工作是人工神经网络。截至 2015 年,他将自己的时间分为在谷歌和多伦多大学工作。他是最早证明使用广义反向传播算法训练多层神经网络的研究人员之一,也是深度学习社区的重要人物。
在推特上关注 ( **剧透:**正如他的账户中所述“只是占据这个空间,以防杰夫·辛顿决定发推特”,他不怎么发推特,可能忙着试图理解人类的大脑)。
鲁斯兰·萨拉胡季诺夫
- 苹果公司人工智能研究总监
- 计算机科学教授
我不确定我能不能把“Salakhutdinov”念对,反正这不是关于我的,我们继续吧。Ruslan Salakhutdinov 是加拿大人工智能领域的研究人员。他擅长深度学习、概率图形模型和大规模优化。Ruslan 因开发贝叶斯程序学习而闻名。自 2009 年以来,他已经发表了至少 42 篇关于机器学习的论文,还不忘提到他的研究得到了谷歌、微软和三星的资助。
林元庆
- 百度研究负责人
林是计算机视觉和机器学习社区的活跃成员。他拥有清华大学光学工程硕士学位和宾夕法尼亚大学电子工程博士学位。IDL 是百度研究院旗下的三个研究实验室之一。另外两个是亚当·科茨领导的硅谷人工智能实验室和张彤领导的大数据实验室。
彼得·阿贝尔
他获得了比利时鲁汶大学的电气工程学士/硕士学位,并于 2008 年获得了斯坦福大学的计算机科学博士学位。他于 2008 年秋季加入加州大学伯克利分校,在电气工程和计算机科学系任职。他的研究重点是机器人学、机器学习和控制。
Abbeel 教授获得了各种奖项,包括斯隆研究奖学金、空军科学研究办公室青年研究员计划(AFOSR-YIP)奖、大川研究补助金、2011 年 TR35、IEEE 机器人和自动化学会(RAS)早期职业奖和迪克·沃尔茨机器人和自动化最佳美国博士论文奖。他开发了学徒学习算法,使先进的直升机特技飞行成为可能,包括只有出色的人类飞行员才能完成的动作,如抽搐、混沌和自动旋转。他的团队还使一个机器人能够可靠地捡起随机形状的、皱巴巴的衣物并折叠它们。他的作品被许多受欢迎的媒体报道,包括 BBC、《纽约时报》、《麻省理工科技评论》、探索频道、SmartPlanet 和 Wired 。
扬·勒村
- 艾研究总监脸书
- NYU 数据科学中心创始主任
Yann LeCun 是一名计算机科学家,在机器学习、计算机视觉、移动机器人和计算神经科学方面做出了贡献。他因在光学字符识别和使用卷积神经网络(CNN)的计算机视觉方面的工作而闻名,是卷积网络的创始人。
在推特上关注
最终注释
我希望你喜欢读这篇文章,如果你认为名单中有遗漏的人,请告诉我,也许我还可以更新名单。欢迎在评论中告诉我更多你心目中的英雄。
“人工智能、深度学习、机器学习——不管你在做什么,如果你不懂,就去学吧。因为否则你会在三年内变成恐龙。”——马克·库班
进一步阅读
在你走之前!
如果你喜欢这些作品,请留下你的掌声👏推荐这篇文章,让别人也能看到。**
《与❤》作者 j .大卫·福莫!
愿原力与你同在!
见见你的新朋友“大口”

什么是吞咽?
在开发应用程序时,你是否厌倦了重复做同样的事情?当我刚接触 JavaScript 框架的时候,我不得不做的最烦人的事情就是当一个改变完成时,一次又一次地重启服务器。后来我顺便找到了**【Nodemon】**;)
嗯,吞咽是解决这个问题的方法。不仅仅是因为这个。一饮而尽解决**的重复问题。**开发人员需要反复做的大多数任务都可以通过自动化来简化。因此,Gulp 可以被认为是一个 JavaScript 任务运行器,它可以让开发人员自动完成某些任务。
GULP 是一个工具包,用于自动化开发工作流程中痛苦或耗时的任务
示例任务:
- 更改文件时刷新浏览器
- 缩小 JavaScript
- 将 SASS/LESS 编译成 CSS
- 单元测试
- 将源代码部署到输出目录(例如:dist 文件夹)
Gulp 非常容易学习,使用它很有趣。你需要知道 Gulp API 中的 4 个基本函数。
- gulp.task — 用于定义一个新的 gulp 任务
- gulp.src — 用于指向任务的输入文件所在的位置
- gulp.dest — 用于指出输出文件需要写入的位置
- gulp.watch — 用于制作 gulp 来观察文件的变化
不要对这些感到困惑。我会引导你了解每一个人,最终你会完全理解他们。
你需要明白的另一件事是管在大口喝。有时候你需要在一项任务中做不止一件事。例如,您可能需要将几个 JavaScript 文件连接成一个文件并缩小它。在这种情况下,管道就派上了用场。使用管道,您可以通过利用流来链接多个任务。在上面的例子中,你需要链接连接和缩小。这些你在玩的时候会更清楚。
让我们动手做一些简单的例子来理解 Gulp 是如何工作的。
简单的吞咽例子
1.设置环境
首先,你需要在你的电脑上安装 node.js ,如果你没有,从这里安装。
这些例子将是完全跨平台的,你不需要担心你的平台。
准备好之后,使用命令全局安装 Gulp,

然后通过运行常规命令 npm init 初始化一个节点项目
导航到您的项目目录,并作为开发依赖项在本地安装 gulp

2.你的第一个任务是吞咽
现在在项目的根级别创建gulpfile.js。我们需要运行的所有任务都将包含在这个文件中。
注意,这个名字**“gulpfile . js”**是必不可少的,因为这个名字是用来检测文件的。否则,您将得到一个错误,指示 gulpfile 未找到。
现在让我们创建我们的第一个吞咽任务。在此任务中,我们将简单地创建一个控制台日志。

如果您熟悉 node.js,这里的一切都应该很清楚,因为它是不言自明的。首先,我们导入 gulp,因为我们正在创建一个新任务,所以使用了 gulp.task 函数。这里我们需要传递两个参数。首先是任务的名称,然后是定义任务的函数,包括应该执行什么。
要执行任务,在终端运行大口控制台。在命令中,需要执行的任务名称应该跟在 gulp 后面。
如果你的任务名是**‘default’,只要在终端执行 gulp 就可以运行。这被称为大口执行默认任务**。
3.将源文件复制到输出文件夹
现在让我们做一点更有用的工作。在将应用程序部署到服务器之前,我们需要将所有内容复制到输出目录中。
让我们创建一个 src 目录,并在那里添加一个基本的 HTML 文件。在部署我们非常简单的应用程序之前,我们需要将其复制到 dist 文件夹中。让我们用吞咽来做它。

在这个新任务中,我们需要告诉 gulp 输入文件的位置和复制位置。为了做到这一点,我们使用了 gulp.src 和 gulp.dest. 这里我们指向 src 目录中的所有 HTML 文件。
注意,我们在这里使用管道,因为我们处理从输入源读取和写入目的地。
像我们之前使用命令 gulp copyToDist 一样运行任务。您会注意到,将创建一个 dist 文件夹,其中包含 src 目录中的 HTML 文件。
4.缩小 JavaScript 文件
当缩小一个 JavaScript 文件时,所有的空格都将被删除,包括注释,以使文件更轻量级。
要做到这一点,我们需要安装另一个叫做“吞咽丑陋”的依赖项。首先,使用下面的命令安装它。

然后,在 src 目录下创建一个 js 目录,并添加一个包含一些控制台日志命令的 JavaScript 文件,这些命令由空格和一些注释分隔。现在让我们缩小它,并将其添加到 js 下的 dist 目录中。

这里的一切应该是不言自明的。 uglify() 函数来自我们的新依赖项。您将看到 dist 目录中的新 JavaScript 文件通过删除所有空格和注释而被缩小。
5.将 SASS 编译为 CSS
允许你使用 CSS 中不存在的特性,比如变量、嵌套、继承等等。我们可以使用 gulp 将 SASS 编译成 CSS,方法是安装另一个依赖项,就像我们在前面的任务中所做的那样。
这次是**【大口-萨斯】**。首先从下面的命令安装它。

与前面类似,在包含 sass 文件的 src 目录中创建一个 sass 目录。让我们编译它并添加到 dist 中的 css 目录中。

你看,这里没有什么神奇的。我们使用管道,因为我们需要链接所有的东西。 sass() 函数会将 sass 编译成 css,并添加了以下部分来处理错误。如果您感到困惑,请遵循 gulp-sass 文档这里的。
6.将所有内容合并到一个命令中
起初,我告诉你 gulp 是为了简化重复。但是如果我们使用单独的命令一个任务接一个任务地运行,那就没有意义了,对吗?
Gulp 允许我们使用一个命令运行多个任务来解决这个问题。我们只需要用需要执行的任务数组替换任务中的函数。

你可以看到我在这里使用的是大口默认任务。因此,我们只需要在终端运行 gulp 。首先,删除项目中当前的 dist 文件夹,并运行上面的命令。您将看到我们指定的所有任务都完美地执行了,并像以前一样在 dist 目录中构建。
现在你可能明白这个简单工具的威力了。我们可以通过让它在我们更改 src 文件时自动执行来让它更有价值。
7.监视文件
现在让我们使用我在开始提到的 Gulp API 中的最后一个基本函数( gulp.watch) 来自动检测并构建对 dist 文件夹的新更改。

在 gulp.watch 中,我们需要指定在哪里观察,以及当变化发生时应该执行什么任务。例如,需要监视所有的 JavaScript 文件,当其中任何一个文件发生变化时,就会执行 minifyJS 任务。
运行 gulp watch 命令后, gulp 将对指定的文件进行监视,必要的任务将在改变时触发。
现在你应该对 Gulp 和如何使用它有了清晰的概念。它让开发者的生活更加轻松有趣。像我们在这里所做的那样,通过添加第三方依赖项可以完成更多的任务。
希望你喜欢这篇文章。继续读,加油!😃
在追求深度学习的职业生涯中迎接挑战
如果你能负担得起这么多小时的 AWS P2 实例,这篇文章可能不适合你阅读。
开场白:
这几段可能不是很重要。但这一部分可以告诉你,找到我下面列出的解决方案对我来说有多重要,这样我就可以继续我在深度学习方面的研究。我于 2013 年毕业于印度领先的科技大学之一卡利卡特国家理工学院,获得信号处理硕士学位。然而,我从未能在我主修的领域找到工作。生活在一个发展中国家,我无法在自己最感兴趣的领域找到工作。因此,我做了一些技术性最差、管理性更强的工作,这些工作机械性强于科学性。然而,在我的职业生涯中,我对数据非常感兴趣。多亏了《用于模式识别的神经网络这本书,这是我硕士期间选修课的一部分,它让我接触到了这个广阔的领域。我还记得我和我的朋友从西安大略大学计算机系提供的课程的讲义中掌握关键概念。我从不满足于我们所学的东西。在那些日子里,我不断在这个地区发现新的东西。
然而,毕业后立即失业以无形的方式粉碎了我。我面临的一个主要挑战是,我不是计算机科学专业的学生。我毕业于电子和电信工程专业。在大师赛的最后几个月里,我确信 Python 在我希望自己从事的任何事情上的影响力。因此,我从 Codeacademy 开始(顺便说一下,他们现在对学生上所有的课非常严格。他们不鼓励跳过某些时段)。不太相信 Codeacademy 语言的力量,我落后于我的计划(肾上腺素!).待在本加卢鲁,尽管非常注意健康,我还是得了伤寒,而且是连续的一次。我完全累了,医生坚持要我搬回喀拉拉邦(那是我的家乡)。心碎,随之而来的是痛苦。Lol!!
然而,数据似乎并没有停止打动我。因此,我被数据营吸引,在它的初期,他们的大部分课程都是免费的。这让我对数据充满热情。我不想争辩说我很擅长处理事情。但是我知道如果我得到一些指导,我会做得更好。据我所知,没有人在数据科学方面提供过这样的指导。所以下一个最好的步骤是找一个能够很好地用 Python 编程的导师。我能找到这样一个机会,对此我非常感激。这让我找到了一份 Python 开发的工作。有几个项目引起了我的兴趣。我非常喜欢的一个项目是使用网络 X 图书馆建立一个推荐系统。这与机器学习没有太大关系。然而,共同点是数据。当我的开发职业走到十字路口,我必须在追求数据科学/ML 工作或继续在 django 或我不感兴趣的事情上发展之间做出选择时,我选择了辞职。我过去和现在都不为此难过。这是我 6 个月前冒的一次险。这个决定让我有这么多时间专注于完成机器学习和深度学习的 MOOCs。
挑战:
现在,谈到挑战,我认为,生活在一个第三世界国家,没有工作,却希望在你感兴趣的领域创造奇迹,这并不轻松。我可以作证。30 岁跑步,未婚,被许多人认为是失败,但内心有追求完美的热情,这不是主流。不是每个人都有。在这 6 个月的失业期间,我做了一些惊人的事情。
- 我在 Coursera 上完成了机器学习 MOOC
- 我帮助一个朋友为他的公司应用程序设置了策略。
- 获得了一笔经济资助,以攻读 Coursera 上 5 门深度学习课程中的第门。我已经申请了第二个。
- 从喀拉拉邦飞到德里参加 PyData 会议。(激情!).
- 参加了雅思的学术考试和 GT 考试,并且都获得了 8.0 分。;)
- 我从 cs231n 开始,我认为这非常有趣。
**奖学金:**我面临的第一个挑战是在 Udacity 上资助我的数据科学纳米学位。我找不到一笔可以帮我每月支付 12500 印度卢比的固定收入。有段时间我甚至负担不起我的网络费用。所以,Udacity 是不可想象的。我几乎放弃了这个想法。那时,Udacity 提出了另一个深度学习计划。这次我很有野心。我发邮件询问奖学金事宜,令我失望的是,Udacity 没有提供奖学金。这让我很难过。
然而,一周后,教授吴恩达,在 Coursera 上宣布 deeplearning.ai 课程。这似乎是对我失望的一种即时补救。我非常高兴。但是后来,月供又让我烦恼了。因此,我申请了助学金,陈述了理由,在 8 月 23 日,我得到了批准。我一周前完成的。现在,我已经申请了一个资助来完成第二个。我知道我可以同时申请这个系列所有课程的资助。
与此同时, fast.ai 宣布了一个伙伴关系,旨在人工智能领域的多样性。我认为这是非常有希望的。我很高兴知道 fast.ai 已经朝着弥合差距迈出了这样的一步。
Lyft 和 Udacity 一起宣布了一项奖学金,面向任何打算在自动驾驶汽车领域攻读基础纳米学位的人。似乎申请现在已经关闭了。不确定他们是否会再次打开应用程序。
据我所知,这些是奖学金/助学金。我很想知道更多。
我面临的另一个挑战是建立一个 GPU 实例。我想,现在我有解决办法了。AWS 的免费层计划中不包括 GPU 实例。如果你是一名即将上大学的学生,GitHub 提供了一个学生开发者包,里面有价值 150 美元的 AWS 积分,我相信这对你尝试深度学习项目来说足够了。由于我是独立学生,我不能申请同样的服务,因此我自然选择了谷歌云平台,它在注册时提供一年 300 美元的免费积分。不像传言说 FloydHub 提供免费的 GPU 时间,他们没有。他们只免费提供 CPU 实例。除了这些,如果你是一名研究人员,NVDIA 也有兴趣通过一个 GPU 资助计划来帮助你。我还了解到 Azure 女士在注册时提供了 200 美元的信用额度。 Crestle 是另一项免费提供 10 小时 CPU 和 GPU 以及 1 GB 存储的服务。
我发现摆在我面前的另一个巨大障碍是众所周知的工作经验悖论。自从我开始找工作,这就成了一件事。即使现在,当我是一个经验丰富的 Python 程序员,完成了一些 ML/DL mooc 和认证,我也没有得到一个认可。没有公司愿意相信我这种人。我不认为许多人已经克服了这一点。在德里的 PyData 会议上,我们聊天的时候,甚至 Siraj Raval 自己也承认这个悖论挑战着许多灵魂。每次我接到关于工作的电话,在长时间的交谈之前,我都要确保他们知道我缺乏 ML 或 DL 的工业实践经验。这为我节省了时间。我没有解决这个问题的办法,除了 Siraj 给的建议。他对我说,“把拉贝·易卜拉欣做成一个你能卖的品牌”。
这篇文章结合了一些咆哮和一些信息,对那些努力保持热情的人有所帮助,通过它,我寻求一个机会,即使是在一家数据科学公司实习,无论是在线还是离线,这样我就不必再咆哮了。你可以在 LinkedIn 这里找到我。
日安!
Meetup 作为动员的来源:将数据科学工具用于社会科学
使用数据科学工具为社会科学收集数据
对于社会科学来说,收集数据来理解人类、社会和政治行为一直是一个挑战。虽然这种行为就在我们身边,但找到能够准确描述这些现象的数据是很困难的,如果不是代价高昂的话。正因为如此,对社会动态指标的创造性思考一直是社会科学的一部分。以社会学的创始人之一埃米尔·杜尔凯姆为例,他试图通过观察不同社会群体的自杀率来解释社会控制和社会融合等社会力量。涂尔干利用现有的自杀统计数据作为社会群体中缺乏融合的指标,这导致了一种不归属感。尽管他因使用综合数据来解释个人社会行为而受到批评,但他的研究是第一个社会动力学的方法论研究。
由于数据科学工具箱的快速发展,社会科学家越来越容易获得和使用数据源。 Stekmaszak an Hukal (2017) 讨论挖掘和管理新数据源的工具的发展以及使用机器从中学习如何使社会科学受益,同时警告社会调查中仍然存在的挑战。数据科学工具允许我们访问大量的新数据源,但这并不意味着我们不应该思考这些信息是如何定义、记录和传播的,以及在何种社会背景下传播的。
数据从来都不是客观的。虽然很有趣!因此,让我们考虑一个有趣的新数据来源,并学习如何将它用于社会科学。
聚会和社会运动
我是一名对社会和政治运动感兴趣的社会科学家。因此,当我了解到个人为全世界对某项政治或社会事业感兴趣的所有人组织会议的数据时,我自然感兴趣。Meet-up.com 是一个为人们提供一个平台来组织聚会的网站,聚会的话题可以是你能想到的任何话题。这可以是数据科学、小马、瑜伽或环境、女权主义或地方政治等公共事业。它的工作原理是,你可以创建一个会议,或者注册一个,并用相关主题标记会议。这是一个社交网络,它的显著特点是鼓励人们走出去,在真实世界的活动中进行身体接触。你确定一个时间和地点,那些注册的人可以参加这个活动。
对于一个社会科学家来说,这都是非常有趣的数据。你能做的就是去网站上收集关于团体和事件的信息,将它们分类(这是一种爱好,是娱乐还是运动和政治的一部分?)并查看他们的成员列表。或者你可以使用编程语言来自动化这个过程。这被称为网络抓取或数据挖掘。
通过 meetup API 挖掘数据
抓取 web 数据的一种方法是使用网站开发者制作的应用程序编程接口。这是礼貌的方式。API 基本上允许您与应用程序通信,在这种情况下是一个公共网站。我使用 Python 和 meetup.api 包与它通信。
首先,我收集了所有关于类别、城市和主题的信息。为了使用这个 API,你需要在见面会上注册并申请一个密钥。我将所有数据存储在单独的 CSV 文件中,以后可以将这些文件加载到我的环境中。下一步是获取属于这些类别的所有组。我将属于某个类别的所有组存储在一个单独的 CSV 文件中。之后,我确保收集每一个独特的组 ID。这对下一步很重要。

现在最重要的步骤是得到每个组的成员列表。您需要构建一个函数来根据惟一的组 id 获取成员数据。对于每个组,您可以有一个单独的文件,其中包含成员列表。

所有这些都会导致大量数据包含在几个 CSV 文件中。许多工作都与清理和管理数据有关。
数据管理
首先我要把相关数据筛选出来。由于我的研究涉及欧洲政治和社会运动,我最感兴趣的是欧洲的数据以及社会和政治运动的数据。因此,通过先按类别过滤,再按欧洲国家过滤,我的数据集已经变得更易于管理了!
其次,我需要清理我的数据。这需要提取相关的单词串,并将成员聚合到相关的组和主题中。为此,我需要首先创建三个数据框架:一个包含所有(匿名)成员 id 的数据,一个包含所有组的数据,一个包含所有主题的数据。
当然,关于这个数据的一个有趣的方面是,它实际上是关系型的。一个组的成员也可以是另一个组的成员。其中一些组也可能属于不同的主题。为了利用这一点,我创建了一个双模式网络(附属网络)。这意味着只要主题有共同的组成员,它们就被认为是相关的。
可视化数据
在所有这些清理和管理之后,我终于可以处理这些数据了!(这意味着我也从 Python 切换到 R)。想象一下聚会是如何随着时间的推移在欧洲传播的,我们可以清楚地看到一种地理模式。意大利正在蓬勃发展!

让我们来看看最受 meetup 用户欢迎的话题。

除了环境,似乎大多数 meetup 成员都在为贝佩·格里洛动员。此外,贝佩·格里洛在 2009 年至 2017 年发起并领导的政治运动“M5S”也是一个很受欢迎的命名话题。这可以解释在意大利 meetup 的高使用率。
M5S 是一个政治反建制政党,从 2009 年的一场运动中崛起,参加了地区和地方选举。他们在国家议会中没有任何席位,但在 2013 年的全国选举中成为最大的政党。看似突如其来,他们被认为是欧洲历史上发展最快的政党。
五星运动
然而,来自 meetup 的数据显示,从 2005 年起,人们就开始以贝佩·格里洛的名字(粉色)组织聚会。使用社交网络如 meetup 实际上是由贝佩·格里洛的博客建议来组织本地会议的。在“贝佩·格里洛之友”的保护伞下,人们开始使用聚会在贝佩·格里洛的博客上聚在一起讨论话题。虽然贝佩·格里洛仍然更受欢迎,但更普遍地专注于 M5S(蓝色)的聚会仅在 2013 年才开始。2017 年后,贝佩·格里洛辞职,路易吉·迪·梅奥接管了该党的领导权。很容易说这导致了受欢迎程度的大幅下降,但这也为时尚早,因为 2018 年的数据还不完整。然而,更普遍的是,我们可以从这些数据中得出结论,贝佩·格里洛是一个非常受欢迎的领导人,甚至比他所代表的政党更受欢迎。

M5S 动员是为了什么
政治学的一个关键问题是确定政党代表什么样的利益。使用来自 meetup 的数据,我们可以获得一些有趣的见解,了解 M5 的追随者在动员什么。
通过将 M5S 与其他主题的成员重叠表示为纽带(阈值为所有成员的 1%),我们可以看到意大利反建制党的成员正在动员哪些主题。领带颜色越深,话题之间的重叠程度越高,联系越紧密。这个图表告诉我们,M5S 成员动员最多的是环境和替代能源,其次是政治和地方政治,之后是拯救我们的民主。

根据这一分析,你可以推断政治运动的积极追随者一方面主要关心环境问题,另一方面关心民主状况,并对参与(地方)政治感兴趣。虽然这些利益似乎与 M5S 现在在政府中的实际成就形成了鲜明的对比,但他们似乎确实符合 M5S 选民对政治上特别活跃和反建制的描述(帕萨雷利&图尔托 2018 )。
警告:可靠且有代表性的数据
作为一名优秀的社会科学家,你应该经常问自己(至少)两个问题:1)我的数据有多可靠,2)有多有代表性?
首先,当我可能没有度量我想要度量的东西时,可靠性问题就出现了。例如,在线社交网络可能与现实世界中社会动态的展现方式不同。这当然是一种简化。然而, meetup 是一个帮助人们组织真实世界中真实事件的社交网络。然而,也有可能 1)会员实际上并没有参加这些活动,2)组织者分配给活动的主题可能并没有反映出活动实际包含的内容(例如,我看到了许多园艺聚会,尽管我怀疑这是他们真正想要的。)
第二,如果你想推断出一些你的数据没有直接捕捉到的结论,数据的外部验证是一个问题。在这种情况下,很可能是谁在使用 meetups 进行动员方面存在偏见。例如,使用社交网络在年轻人中可能比老年人更普遍。只有那些愿意参加公共辩论或政治集会的人才会成为这种聚会的成员。虽然研究确实表明 M5 的选民大多是 35 岁以下的年轻人,在政治集会和公共辩论中的活跃程度高于平均水平,但并非所有 M5 的追随者都是如此。简而言之,样本总体可能不是实际总体的均衡代表。从可能存在系统性偏差的样本人群中得出结论是很棘手的,需要额外的稳健性测试。
结论
总之, meetup 为社会和政治运动的研究提供了极具价值的新数据来源。这是一个免费的资源,允许研究人员在社会和政治运动出现在更传统的数据源之前研究它们的出现和发展。从民主党到茶党,几位美国政客已经认识到了 Meetup 的力量。在欧洲,你可以清楚地看到贝佩·格里洛和 5 Stelle 运动的崛起,使用社交网络分析可以显示他们的追随者在动员什么话题。尽管如此,数据科学工具的使用并不意味着社会调查的警告应该被忽略。社会科学家仍然应该确保数据的可靠性和代表性,以便得出结论。
权力越大,责任越大。
承认
Reini Schrama 是哥本哈根大学政治科学系的博士后。她的专长是欧洲政治、社交网络分析和社会科学数据科学工具箱的使用。2018 年初,她参加了推进学院(Propulsion Academy)的数据科学训练营(点击这里了解更多信息)。
使用预先训练的 word2vec 进行模因搜索
沙巴发展故事#02

模因抵得上千言万语。它们是一种文化。我和我的朋友过去常常用 Giphy 在 Messenger 上发送很多这样的消息。事情是这样的,我们有自己的模因,我们懒得上传到某个地方。与此同时,当你开始在一个文件夹中有很多迷因时,就很难记住它们的文件名了。

Little UI for the search system.
让我们尝试快速构建一个小工具,帮助我们了解哪些模因更有可能对应一个输入的句子。我们会有一个配对列表。每一对都是一个图像 URL(而不是本地路径,对您来说更容易测试)和与之相关的描述。
url_descr = [
('[https://tny.im/a13](http://tny.im/a13)['](https://giphy.com/embed/26uTr7qPYM4OHAwBW'), 'we don\'t care'),
('[https://tny.im/a0-](http://tny.im/a0-)['](https://giphy.com/embed/3o6Zt6D0wctP0kpuwg'), 'i love you'),
('[https://tny.im/a12](http://tny.im/a12)['](https://giphy.com/embed/aJlKIh8Kh0NLa'), 'relax take it easy'),
('[https://tny.im/a16](http://tny.im/a16)['](https://giphy.com/embed/ohyNdetcfoJ9K'), 'that is embarrassing'),
('[https://tny.im/a10](http://tny.im/a10)['](https://giphy.com/embed/lwrxYI7f2tNFS'), 'screw you guys')
]
我不会在这里详细解释单词嵌入;已经有关于这个主题的好文章[1,2],没有必要重新发明轮子。但是,我将给出一个高层次的概述,以便每个人都可以遵循。
单词嵌入和 word2vec
单词是离散的符号,表示它们的一种简单方法是一键向量。假设我们有一个大小为 4 的词汇表,每个单词由 4 个元素组成的列表来表示,在当前单词的索引处,除了 1 之外,所有元素都是 0。
vocabulary = ['hello', 'sun', 'desert', 'hi']
hello = [1 0 0 0]
sun = [0 1 0 0]
desert = [0 0 1 0]
hi = [0 0 0 1]
如你所见,这种表示法并不是最好的,因为如果词汇表包含成千上万的单词,那么列表将呈线性增长。但另一件重要的事情是,这种表征没有给我们任何关于单词含义的线索,甚至没有给我们任何单词之间如何联系的线索。在我们的词汇中,“hello”和“hi”有相同的意思,但是我们看不到这种与一个热点向量的关系。这里来了一个名为 word2vec 的文字嵌入算法。
这个想法是将我们的热点向量映射到密集(更密集)的向量,这样我们就可以解决大小问题;理想情况下,我们希望具有相似/相关含义的单词具有彼此接近的向量,就好像向量空间已经编码了单词的语义/上下文表示。

Skip-gram word2vec, a neural network trained to predict a window of words given the focus word as input. The word embedding matrix is the resulting weight matrix after training.
我们要训练一个 word2vec 模型吗?那鸿我们说我们想快速构建这个工具,为此我们将使用预训练的 word2vec 向量,即使我们想训练我们自己的模型,我们也不能,因为我们没有足够的数据来做这件事。
现在,让我们开始编码,我们将从这个 google drive 下载在 Google News 上训练过的预训练 w2v,然后是pip install gensim。Gensim 是一个很棒的库,允许以一种高级的方式处理 NLP。加载预训练的 word2vec 只需要一行代码。
import gensim
model = gensim.models.KeyedVectors.load_word2vec_format(W2V_PATH, binary=True)
现在模型加载完毕,我们可以看看单词是如何表示的:
>>> model.wv['hello'].shape
(300,)
>>> model.wv['hello']
array([-0.05419922, 0.01708984, ..., -0.25], dtype=float32)
向量的大小为 300,而谷歌新闻的词汇量约为 300 万字!我们说过,word2vec 的一个特点是,出现在相同上下文中的单词在距离方面倾向于具有彼此接近的向量,因为从语义上来说,它们可能是接近的。
>>> model.similar_by_word('hello', topn=5)
[('hi', 0.6548984050750732), ('goodbye', 0.639905571937561), ('howdy', 0.6310957074165344), ('goodnight', 0.5920578241348267), ('greeting', 0.5855877995491028)]
你可以看到根据余弦相似度(一种常用的距离度量),“hi”是最接近“hello”的单词。我总是对此感到惊讶;我们现在有了一个更小的向量空间,它似乎对关系进行了编码,而不是一个大的独热向量,它不能告诉我们单词之间的关系。
def cosine_sim(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

Cosine similarity. The closer to one the better
句子呢?
到目前为止,我们一直在谈论单词和它们之间的相似性,但我们需要的是一种方法来衡量两个句子之间的相似性,这似乎很复杂。当然,它是,但是我们正在建立一个小工具,我们想要好的结果而不是完美的。
def avg_sentence(sentence, wv):
v = np.zeros(300)
for w in sentence:
if w in wv:
v += wv[w]
return v / len(sentence)
平均单词向量是一种比较两个句子的简单方法,是的,这是一个嘈杂的过程,因为我们丢失了短语中的单词顺序,所以两个单词顺序相反的句子会给出相同的平均向量,但通常意义不同。另外,所有的单词都有相同的权重,而像“a”或“the”这样的单词在理想情况下应该不那么重要。然而,这个技巧非常有效,所以我们将坚持使用它,以使整个事情更简单。这种技巧背后的直觉是,如果两个句子相似,它们的平均向量将在(几乎)相同的位置结束。
>>> inputv = avg_sentence('i like you'.split(), model.wv)
>>> vec2 = avg_sentence('i love you'.split(), model.wv)
>>> vec3 = avg_sentence('screw you guys'.split(), model.wv)
>>> cosine_sim(inputv, vec2)
0.87972317862080773
>>> cosine_sim(inputv, vec3)
0.66992365073780347
所以现在我们有办法知道两个句子是否相似,接下来的步骤非常简单。记住我们有一个配对列表。每一对都是一个图像 URL 和与之相关的描述。
按顺序:
- 平均输入查询和模因描述
- 计算平均输入和平均描述之间的余弦相似度
- 按照余弦相似度降序排列列表,这样与输入句子最相似的描述将首先出现。
>>> avgs = list(map(lambda p: p + (avg_sentence(p[1].split, model.wv),), url_descr))
>>> sims = list(map(lambda p: p[:2] + (cosine_sim(inputv, p[2]),), avgs))
>>> most_similar_meme = sorted(sims, key=lambda p: p[2], reverse=True)
>>> most_similar_meme
[('[https://tny.im/a0-'](https://tny.im/a0-'), 'i love you', 0.87972317862080773), ('[https://tny.im/a10'](https://tny.im/a10'), 'screw you guys', 0.66992365073780347), ('[http://tny.im/a13'](http://tny.im/a13'), "we don't care", 0.56639891559620026), ('[https://tny.im/a12'](https://tny.im/a12'), 'relax take it easy', 0.40517121688823338), ('[https://tny.im/a16'](https://tny.im/a16'), 'that is embarrassing', 0.2843743794717129)]
结论
我们看到了如何使用预训练的单词嵌入来构建一个非常基本但还不错的迷因检索系统。然而,它远非完美,例如:
>>> inputv = avg_sentence('i like you'.split(), model.wv)
>>> vec2 = avg_sentence('i love you'.split(), model.wv)
>>> vec3 = avg_sentence('i hate you'.split(), model.wv)
>>> cosine_sim(inputv, vec2)
0.87972
>>> cosine_sim(inputv, vec3)
0.87976
根据这个模型,“恨”比“爱”更像“喜欢”(尽管差别很小)。这可以用这样一个事实来解释,即在训练中,“恨”和“喜欢”在相同的上下文中出现的次数比“爱”和“喜欢”多一点。然而,还有很大的改进空间,可以用来纠正这些缺陷,如句子分类,词频加权(tf-idf)等
我尽了最大努力让这篇文章尽可能简单(例如,我假设语义和上下文是一回事,而它们不是),如果你发现任何错误,请在 Twitter@ eyyub _ s或在评论区告诉我。大大感谢我的 shab@ ImLaaraj。
要点
[1]http://mccormickml . com/2016/04/19/word 2 vec-tutorial-the-skip-gram-model/
【2】http://colah . github . io/posts/2014-07-NLP-RNNs-re presentations/
记忆,注意力,顺序
我们已经看到分类神经网络的兴起和成功。神经网络的下一个重大步骤是理解来自观察和与现实世界互动的复杂时空数据。我们之前谈过在这个领域运作的新一波神经网络。
但是我们如何利用这些网络来学习现实世界中的复杂任务呢?比如,我该如何告诉我的高级真空清洁机器人:“Roomby:你忘了用吸尘器清理客厅红色沙发下的污点了!”并得到适当的回应?
要做到这一点,我们需要用注意机制来解析时空信息,这样我们才能理解复杂指令以及它们与我们环境的关系。
让我们考虑几个示例应用:文本或视频的摘要。考虑这段文字:
一个穿白色裙子的女人向一个穿蓝色裙子的女人走来。她切了几片苹果。然后她给了穿蓝衣服的女人一片。
为了回答这个问题:“谁提供了一片苹果?”我们需要关注“苹果”、“苹果所有者”、“给予”等词汇和概念。故事的其余部分是不相关的。故事的这些部分需要我们的关注。
类似的情况也发生在视频摘要中,一个长视频可以被摘要为一小组帧序列,在这些帧序列中,重要的动作被执行,并且再次需要我们的注意。想象你在找车钥匙,或者你的鞋子,你会关注视频的不同部分和场景。对于每个行动和每个目标,我们需要把注意力集中在重要的数据上,而忽略其他的。

Example of video summarization
仔细想想,摘要和一组集中的数据对于每个时间序列都很重要,无论是文档的翻译,还是视频中的动作识别,或者是任务的句子描述和环境中的执行的组合。
所有这些任务都需要把数据减少到焦点集中,并注意这个集中以便提供一个答案或行动
注意力是擅长理解序列的神经网络最重要的组成部分之一,无论是视频序列,现实生活中的动作序列,还是输入序列,如语音、文本或任何其他数据。无怪乎我们的大脑在很多层面上实施注意力,为的是只选择重要的信息进行处理,排除掉手头任务不需要的铺天盖地的背景信息。
神经网络中注意力的一个伟大回顾是这里给出。我在这里报告一些重要的图表作为参考:

An attention model is a method that takes n arguments y_1 … y_n and a context c. It returns a vector z which is the summary of the y_i focusing on the information linked to context c. More formally, it returns a weighted arithmetic mean of the y_i and the weights are chosen according the relevance of each y_i given the context c.

Implementation of the attention model. Notice that m_i = tanh(W1 c + W2 y_i), meaning that both y_i and c are linearly combined.

Attention model with dot-products used to define relevance of inputs vs context.
上面最后两个数字都实现了“软”注意力。硬注意是通过随机选取概率为 s_i 的输入 y_i 中的一个来实现的。这是比软注意的平均化更粗略的选择。软注意的使用是首选的,因为它可以通过反向传播来训练。
注意力和记忆系统也在这里用很好的形象化描述。
正如他们在这篇文章中提到的,注意力是有代价的,但实际上这种代价可以通过分级注意力模块来最小化,比如这里实现的。
现在看看 attention 如何能够为翻译实现整个 RNN:
它可以通过堆叠多层注意力模块来实现这一点,并采用如下架构:

Sequence to sequence system: an encoder takes in an input sequence x, and produces an embedding z. A decoder produces an output sequence y, by taking as input the embedding z and the previous output y of t-1.

Module used for attention here. Q = query, K = key, V = values. Q and K are multiplied together and scaled to compute a “similarity metric”. This metric produces a weight that modulates the values V.
在多头注意力中,可以并行使用多个注意力模块:

Multiple attention heads are used in parallel to focus on different parts of a sequence in parallel. Here V,q,K are projected with neural network layers to another space, so they can be scaled and mixed.
整个基于注意力的网络被称为“变压器”网络:

在 RNN,时间被编码在序列中,因为输入和输出一次流一个。在前馈神经网络中,需要表示时间来保存位置编码。在这些注意力驱动的网络中,时间被编码为一个附加的额外输入,一个正弦波。它基本上是一个添加到输入和输出中的信号,用来表示时间的流逝。注意这里的脑电波与神经振荡的生物相似性。
但是为什么我们要使用基于注意力的神经网络,而不是我们到目前为止一直在使用的 RNN/LSTM 呢?因为它们使用的计算量少得多!
如果您阅读论文的表 2,您将会看到这些网络可以节省 2-3 个数量级的操作!这是一些严重的节约!
我相信这种基于注意力网络将会在神经网络的许多应用中慢慢取代 RNN。
在这里你可以找到关于变压器架构和数据流的精彩解释!
记忆
一项重要且有趣的工作是快速加权。这项工作实现了一种神经联想记忆——这是一种短期记忆,位于神经权重(长期)和递归权重(基于输入活动的非常快速的权重)之间。快速权重实现了一种类似于上面看到的神经注意力机制的记忆,其中我们将当前输入与一组存储的先前输入进行比较。这基本上就是上面看到的“点积注意力模型”中发生的事情。
在快速加权中,输入 x(t) 是用于与下图中先前存储的值 h 进行比较的上下文。

Fast associative memory implemented in Fast Weights
如果你读了的论文你会发现这种神经网络联想记忆再次胜过 RNN 和 LSTM 网络,同样注意力也能。
我认为,这再次证明,目前由 RNN 执行的许多任务可以被像这样计算成本更低(更不用说使用更少的内存带宽和参数)的算法所取代。
还请再看:注意力递归比较器,也是结合注意力和递归层来了解一个学习单元的细节。
关于作者
我在硬件和软件方面都有将近 20 年的神经网络经验(一个罕见的组合)。在这里看关于我:媒介、网页、学者、 LinkedIn 等等…
捐款

如果你觉得这篇文章有用,请考虑捐赠来支持更多的教程和博客。任何贡献都能有所作为!
男人 vs 女人:媒体最受欢迎帖子的比较
为了好玩,我从网上搜集了 1000 篇今年 3 月至 10 月写的《灵媒》最受欢迎的故事。我使用 Python 的 lxml 包从这些帖子中构建了一个数据集,其中的特征是作者、标签、阅读时间、回复数、点击数和域名。
从作者的名字,我用 R 的性别包确定了他或她的性别。当 R 说不清的时候,我通过查看个人资料图片或阅读帖子来寻找线索。给定数据集,我比较了男性和女性发表的帖子有何不同。

1。计数
男性发表的文章是女性的 3 倍多。73.6%最受欢迎的帖子由男性撰写,22.6%由女性撰写,其余由某个团体或组织撰写,如中等职员。
2。标签
我取了女性和男性帖子中标签数量的比率,并在分子和分母中添加了一个常数 1.01。女性职位比男性职位更有可能是:
** Tag Ratio Fcount Mcount**
Women 16.8 16 0
The List 15.9 15 0
Russian 10.9 10 0
Fat Acceptance 6.9 6 0
Body Positive 6.9 6 0
Feminism 5.5 21 3
Sexism 5.0 4 0
Brain Body 5.0 4 0
Rape 4.0 3 0
Mueller 4.0 3 0
而男性的帖子更有可能被贴上:
**Tag Ratio Mcount Fcount**
UX Design 16.8 16 0
Apple 15.0 44 2
Business 13.2 52 3
iPhone 12.9 12 0
Productivity 11.8 82 6
Entrepreneurship 10.2 121 11
Self Driving Cars 9.9 9 0
Web Development 9.0 53 5
Product Design 9.0 17 1
Augmented Reality 8.9 8 0
3。鼓掌次数、响应次数和阅读时间
女性的帖子平均获得的掌声更少。
但是她们的帖子比男性的回复更多。
这些差异在统计学上并不显著,但如果样本量更大,可能会显著。两组的平均阅读时间持平,都在 9 分钟左右。
4。域名
我还计算了男性和女性帖子的域名比例。偏向男性职位的领域往往是出版物。
**Domain** **Ratio** **MCount FCount**
journal.thriveglobal.com 21.9 43 1
medium.com/the-mission 10.0 59 5
uxdesign.cc 8.9 8 0
thinkgrowth.org 8.9 8 0
mondaynote.com 8.9 8 0
rantt.com 8.9 8 0
500ish.com 8.9 8 0
medium.com/incerto 8.9 8 0
betterhumans.coach.me 6.9 6 0
uxplanet.org 6.5 12 1
而偏向女性帖子的域名更有可能是作者自己的媒体托管网站。
**Domain** **Ratio** **FCount MCount**
medium.com/@Amy_Siskind 15.9 15 0
medium.com/the-hairpin 5.0 4 0
medium.com/@thefatshadow 4.0 3 0
medium.com/@girlziplocked 4.0 3 0
thelily.com 4.0 3 0
medium.com/@caityjohnstone 4.0 3 0
medium.com/behavior-design 3.0 2 0
medium.com/conquering-corporate-america 3.0 2 0
medium.com/code-for-america 3.0 2 0
medium.com/@krisgage 3.0 2 0
我的直觉是,女性在写博客、写自己、写个人经历和写政治时会采取更内省的方式。相比之下,男性倾向于关注最新的科技热潮或如何制造东西。
圣诞快乐,新年快乐
我们祝你节日快乐,新年快乐🎄

🎁祝圣诞快乐,新年万事如意。我们希望你照顾好自己,和你爱的人一起庆祝这个节日。
向数据科学团队全体成员致以诚挚问候。非常感谢我们忠实的 TDS 读者,感谢我们全年提交出色文章的作者,以及我们热情而勤奋的编辑同事:周宇、朱莉莲·许、大卫·埃林顿、安德鲁·德科蒂斯-毛罗、瑞庚、查敏·纳林达、雷沙马·谢赫、哈姆扎·本德姆拉、 赵,本杰明库利,约书亚弗莱明,赫西琼斯,阿什温哈里哈兰,斯瓦普尼尔维贾伊,蒂尔塔约蒂萨卡尔,弗达奥斯杜卡里。
走向数据科学 2018 ✨
- 我们非常感谢 Medium 的工作人员和团队,感谢他们一直以来的支持,为我们提供了一个没有广告的良好发布平台。
- 感谢您参与我们的 TDS 之旅——我们才 2 岁多🎂
- 今年,TDS 的质量提升到了新的高度。我们会继续倾听您的反馈,每个月,我们都会继续收到更多发生在我们平台上的有趣话题。我们鼓励您查看我们 2018 年 12 月月刊中的 年度最受欢迎帖子 。
- 2018 年 12 月,我们出版了 我们的读者指南 来帮助您充分利用您的体验,并介绍了 我们的集合 ,它们是我们的编辑推荐的策划数据科学主题。
- 在幕后,我们全年都在从事多个项目,我们现在还不能与您分享,但 2019 年将是充满希望的一年,我们将继续建立我们的全球社区,并为您提供新鲜和高质量的内容。
- 如果你想在这个假日季节了解我们出版物的最新情况,你可以在旅行时在 Twitter 、脸书、 LinkedIn 上关注我们,或者通过 App Store 或 Google Play 在你的智能手机上下载 Medium app 。
我们祝愿您在这个假期拥有和平、爱和慷慨,并祝您的 2019 年 TDS 团队幸福快乐🎄🌅⛱
摆弄德国坦克,或者统计学的基本直觉(以及一般的数据推断问题)
统计学中我最喜欢的问题是德国坦克问题,主要是因为它迫使你思考统计学的基本问题——你做了什么和你不知道什么真相,以及如何通过合理的假设将碎片联系起来,并思考你可能出错的方式,并通过它们进行推理。数学的细节在足够多的地方都有涉及,但是,我觉得大多数容易获得的解释在给读者一种关于该方法的直觉以及它对处理数据的一般意义上有些欠缺。这是我填补这一空白的尝试。
统计学的根本问题是,无论何时你不得不处理数据,你都不知道真正的真相。你确实可以接触到数据形式的一小部分事实,但是你不知道事实和数据之间的确切关系。这个,你得猜。在德国坦克问题的情况下,你有一些缴获坦克的序列号。他们怎么说德国人到底生产了多少辆坦克?
一些不切实际的假设是必要的,以保持事情简单,至少在开始的时候。我们可以假设坦克被俘获的过程是随机的,也就是说,德国人有 X 辆坦克,但是,其中,我们只是随机俘获了 n 辆坦克。我们假设所有的德国坦克都有序列号,嗯,是连续的,所以如果我们看到一辆序列号为 100 的坦克,这意味着他们以前一定生产过 99 辆坦克——也就是说,他们至少有 100 辆坦克。
鉴于我们对序列号的假设,我们唯一感兴趣的统计数据是被俘获坦克中最大的序列号。如果最大的数字是 200,那就意味着德军至少要有 200 辆坦克。X < 200 的概率为零。
这告诉我们德国人可能拥有 500 辆、800 辆或 1000 辆坦克的可能性是什么?让我们回到我们的假设,我们是随机捕获德国坦克,或多或少。如果德军真的有 1000 辆坦克,而我们随机拿起 n 辆坦克,我们从没见过大于 200 的序列号的几率有多大?如果德国人有 500 英镑,这种可能性有多大?或者,300?对于 X 的每个可能值,即从大于或等于 200 到无穷大的所有数字,可以计算看不到大于 200 的序列号的条件概率。这是德国人可能拥有的坦克数量的分布函数,条件是我们已经看到了最大序列号 200,并且从 X 中“取样”了 n,这个分布的平均值和方差代表了我们的最佳猜测以及我们对这个猜测有多错误的最佳猜测。值得注意的是,就最大可能性而言,“最好”的猜测是德国人正好有 200 辆坦克——但这并不是最好的猜测,因为分布本来就是倾斜的(如果你向左移动,正好 200 处的高悬崖会一直下降到 0,而右边会有一条很长的尾巴)。
如果我必须自己做数学计算,我会从假设均匀分布开始,计算近似分布函数并积分,但链接的维基百科文章显示了精确的数学计算,所以如果你对技术细节感兴趣,我会向你推荐。我想提出这个问题的主要原因是,像这样的问题代表了如何处理数据的一种更诚实,“更纯粹”的表现,在这种情况下,我们必须从认识到我们不知道的东西开始。我们甚至没有一个很好的猜测,在开始的时候,我们想要知道的关于现实的价值是什么。但是,我们有一个合理的猜测,数据是如何从未知的现实中提取出来的,以及数据从现实的不同可能性中产生的条件几率是多少,这也是通过猜测得出的。一旦我们有了条件赔率,我们就可以把它们加在一起,可以说,形成了对现实的条件最佳猜测,并明确承认了我们假设的所有条件。
这些是我们在每次数据分析中采取的完全相同的步骤,但有一个重要的警告:要解决德国坦克问题,我们必须明确认识到,采样过程遗漏了一大块数据(即 200 和 X 之间的差距,不管这个 X 是什么),但如果我们创造性地使用它,这个差距实际上是帮助我们推断答案的信息部分。很多时候,我们并没有把这种差距看得太重。科学应该是关于现实的,而不是数据。数据只是帮助我们理解现实。如果数据是不完整的,有噪音的,或者有其他问题的,也许这实际上告诉我们一些关于现实的有用的东西,我们应该找到有效利用它们的方法。
R 中的“元”机器学习包
本帖发表于 2018 年年中左右。
还可以查看 2019 年底关于第二代元包的后续帖子。
你还记得在统计学课上学过线性回归吗?恭喜你!你现在是一个由统计学家、数学家、数据科学家、计算机科学家、工程师和许多(许多)使用“机器学习”方法的人组成的多样化社区的幸运成员!管它呢,你甚至可以告诉你的朋友,你正在做一些花哨的“人工智能”。
线性回归只是众多监督模型中的一种。还有数百种其他模型,包括:非线性模型、多项式模型、基于树的模型(如 CART、XGBoost)、SVM、神经网络等。这些监督模型既可以处理连续结果(回归),也可以处理二元和多类结果(分类)。
如果我告诉你,不是看多个包,每个包只关注一个单一的方法/模型,而是有一个单一的包,这里称为“元包”,它将使你能够更容易地访问所有这些依赖的模型。这个元包还可以促进多个模型的并行部署,然后聚合结果。每个模型的各种参数仍然可以仔细控制,但是“元包”在更高的分析层促进了元分析方法,将单个模型的结果包装和捆绑在一起。
事实上,集中在元级别,单个模型可以通过简单地列出被考虑的特定模型的名称来应用,并带有一组它们的缺省参数,如果需要的话可以进行调整。这使得可能不完全熟悉模型细节的用户可以将它作为某种“黑盒”来使用。
在这篇文章中,我将对整个机器学习框架使用汽车力学的类比,对任何多元模型使用汽车引擎的类比。早期性能基本的车,以前都是发动机简单。随着技术的进步,今天的汽车速度更快,也更可靠。简单的传动系统被自动齿轮取代。现代汽车是一个由先进部件组成的复杂系统,每个部件都经过精心设计,并很好地集成到一个更广泛的系统中,很好地同步,最终使汽车能够平稳运行。
不同的编程语言对此方法有不同的实现。这篇文章关注的是我自己探索这个主题的旅程,特别是在 r。

pixabay
旧剧本:
过去,我学到的第一个统计模型是线性回归。这可能是引入预测模型的最基本方法。然而,还有许多其他具有相同范围的模型,包括监督的(分类、回归)和非监督的(聚类),它们曾经(现在仍然)像雨后春笋般涌现。此外,由于该领域本身非常多样化,很难审查数百篇科学论文;每一种都有自己独特的框架和数学符号。然后,大约在 2002 年,我得到了一本很棒的书的参考资料,《统计学习的要素》,作者是这个新兴领域的创始人。这本书的 764 页涵盖了人们需要知道的一切,从线性回归模型到神经网络。它还涵盖了过度拟合、交叉验证和集成的主题。方法用详细一致的数学符号描述,并由说明性的彩色可视化支持。
唉,这本书可能不适合所有人,特别是那些缺乏数学背景的人,包括我自己。看完之后,我真希望能有一本类似的更实用的书。理想情况下,它应该涵盖完全相同的主题,但可能有简化的数学概念,更多的应用示例,以及一些针对真实数据集的实际代码演示。我最大的梦想是代码在 r 中。
我的梦想在 2013 年左右实现了,当时上述书籍原作者的学生和一些原作者写了另一本书,《《统计学习导论》》,目的完全相同。他们甚至能够将其压缩到(仅仅)441 页。

pixabay
森林中的第一步
即使在 R 的早期,也有不止一个包可以做几乎任何事情。然而,我感到无所畏惧。在第二本书的指引下,我感到安全可靠,我确切地知道每个模型应该使用哪个推荐的 R 包。我很高兴了解 GLM、卡特和其他人的特定包。
我对应用单个模型了解得越多,我就越好奇(也越贪婪)去了解更多的新模型,尽管它们通常很容易理解并在我的数据集上实现。我学习和实现更多模型的动机部分是为了实现我的模型和数据集的更高性能(就模型预测的准确性而言)。然而,这场竞争并不是唯一的原因。在 Wolpert 和 Macready 提出的“没有免费的午餐”定理的指导下,我有一个合理的科学理由继续尝试尽可能多的模型,该定理认为没有一个单一的模型总是对任何类型的数据集都具有最佳性能。

pixabay
太早兴奋?
对于有大量文档和示例的基本模型,学习如何应用它们几乎是简单明了的。然而,仍然有许多其他复杂的模型不那么容易应用。对我来说,它们的复杂性通常是由于额外的可调参数,这些参数要么缺乏关于如何使用的具体明确的指南,要么可能是这样做的技术超出了我的理解。例如,为一个惩罚回归、LASSO、通过内部交叉验证技术或其他参数调整方法选择 alpha 和 beta 参数。
在我不断寻找新模型的同时,我经历的另一个挑战是实现处理过度拟合问题的方法,比如交叉验证和引导。尽管有专门处理这些方法的包,但是集成它们并把它们包装在不同的模型/包中并不容易。调谐参数的高级搜索方法和系综(特别是叠加)也是如此。
尽管我认为我已经有了如何在各种模型和包中导航的导航图,但很快还是出现了一些失望。将所有这些方法整合在一起太难了。这些模型中的每一个都很难理解,将多个模型包装在一起,相互嵌套,并与其他“繁重”的方法(如重采样、基准测试、堆叠等)联系在一起,使其变得更加复杂和难以应付。
虽然感到沮丧和疲惫,但我仍然希望有一些有效的方法将它们集成在一起,因为最终,所有这些方法都共享相同的“统计学习”工作流:根据训练集训练/拟合模型,用新的数据集(测试)预测结果,以及测量一些性能指标。事实上,这些包中的每一个都有自己的“方言”,反映了开源 R 开发者社区的不同背景。然而,在上述预测模型的框架下,应该有一种方法来统一和重新格式化每个模型/包的输入和输出,以便它们都可以在同一个罩下,然后聚合在一起。

Photo by Neil Thomas on Unsplash
第(首?)缺少链接:脱字符包
尽管有这些挑战,我仍然感到有决心!我不会让一些数学符号或文档较少的包吓走我,我也没有失去希望。
大约在前一本书的同时,另一本书也出版了,【应用预测建模】,这本书大多只用了一个单独的软件包, 【脱字符号 。这个包试图填补上面的空白,提供我一直在拼命寻找的元方法。它统一了来自许多(目前有 237 个)监督模型(分类和回归)的访问(输入)和返回输出。没有必要从头重新编写这些模型。相反,插入符号包将单个包作为依赖项来调用。
一旦多个模型被统一和集成,开发人员继续在更高的元级别上集成其他高级方法:1。基准测试(包括作为私人案例的调优);2.重采样(交叉验证);第三。整体(装袋、增压和堆叠)。
那时我更加兴奋了!尽管我可能还没有完全理解和欣赏 caret 包的全面功能(也许甚至今天也没有),但我比以往任何时候都更愿意开始使用这个非常高效、运行良好的“机器”。
必须有多个元包才能做到!mlr 和 SuperLearner 软件包:
怀着相似的目标,开发了另外两个元包(我不知道确切的历史和时间。这篇文章仅仅代表了我自己,自我选择性偏见,学习这些软件包的方式)。这些元包各有不同的侧重点。除了监督模型之外, mlr 包还实现了用于非监督(聚类)分析的其他模型组(称为“学习者”)以及事件时间(生存)模型。它还列出了大量性能度量标准,以及非常详细的通用分析工作流文档。super leaner封装强调整体(堆叠)部分和通过多核优化的可扩展性。

pixabay
特征工程:可组合预处理步骤/操作/管道的特定扩展:
预测模型性能成功的关键步骤是“特征工程”。这是在将多变量模型应用于数据之前的早期预处理步骤中完成的。它可能包括数据集的转换、缺失值的插补以及特征或样本/观察值的过滤(早期筛选)。它还可以包括这些运算符的任意组合,以任意顺序排列。一旦编译在一起,它就被集成回学习者/模型。
此步骤的推荐实现是将在训练数据集上完成的任何转换也应用到测试/验证数据集。然而,在交叉验证中嵌套这些步骤并不简单。这不像编写一个包含所有预处理步骤的长函数那么简单。相反,它需要一个更一般化的功能框架,该框架将允许对数据的不同步骤/操作组合在一起,可以以任何顺序的方式集成,并且还允许将转换的特定参数适当地传递到测试/验证部分。这个可组合函数的另一个(明显的)用途是直接应用于实际的原始数据集本身,在嵌套重采样之外,以试错的方式简单地检查数据。
上述元包最近用新的补充包进行了扩展,以便于这种可组合的预处理操作。 recipes 包提供了多个共同的“步骤”,这些步骤通过管道连接在一起,可以在嵌套重采样之外“烘焙”成原始数据。同样的, mlrCPO 扩展 mlr 包 sl3 扩展super loader。最近,脱字符/选择软件包的作者写了一本新书《特征工程和选择:预测模型的实用方法》来讨论这种转换。
这三个元包选哪个?无可争议的
品味是无法解释的。列出每个元包的优点或缺点是不公平的,主要是因为每个元包都在不断更新,并使用最新的新工具进行扩展。尽管如此,这场卓有成效的竞赛也有来自其他编程语言的选手(这里就不一一列举了),他们都瞄准了同一个最终目标。
真正重要的是用户学习每个元包的能力,以及用他们自己的数据集成功实现这些解决方案。这取决于所需的特定解决方案的可用性,以及实施所需的文档和支持的级别。这些元包中的每一个都有不同风格的文档/支持(例如 github issues、stackoverflow 等),或者受其开发者背景(行业、学术界等)的影响,或者只是个人风格。可伸缩性也可能是一个应该关注的关键瓶颈。每个元包都以不同的方式处理它。mlr 提供了自己的云环境 OpenML ,用于部署大型管道。super leaker有一个并行化的框架扩展,叫做。
如果你很有动力(像我一样),我会鼓励你尝试这三个包中的每一个。理论上,你应该得到同样的结果。

pixabay
元元包(这不是错别字)。
还不确定选哪个元包?当你可以尝试所有的时候,为什么只妥协于一个元包呢?考虑尝试下一个更高层次的“元”分析:元(多个)“元包”。等等,什么?!?我知道,这个想法乍一看可能很吓人,但是请原谅我。这三个元包中的每一个都为单个模型提供了高级元解决方案。为什么不尝试围绕这三个元包做完全相同的事情呢?我们已经知道需要做什么。它们在单个包中做的是完全相同的事情,但这次是在下一个更高的级别:统一、聚合、比较、堆栈。
事实上,已经有跨元包的功能可以将具有相同目的的对象从一个包渲染到另一个包。例如,mlr 包有一个将插入符号的预处理对象转换成 mlr 的函数。虽然目前只对一个组件进行了这种操作,而且只在一个方向上进行,但我猜想不久将会有更多的跨包对象转换函数可用,对于跨“recipes”、“mlrCPO”和“sl3”的所有可能组合和方向的可组合预处理操作符也是如此。也许这种元-元方法甚至可以扩展到 R 之外,还可以跨不同的编程语言。

pixabay
《两种文化》(oy vey):
到目前为止,我小心翼翼地不想卷入关于【两种文化】的无休止的讨论中,尽管猜测我的血统并不困难。我对这个有争议的话题的理解,用我的车来比喻,不仅是关于一个人制造的汽车/发动机,还关于你用它来驾驶的风格。你是一个谨慎的司机吗?为了安全到达目的地,你会仔细评估你周围的环境吗?或者你愿意超速,错过-遵守一些交通法规,只是为了你可以第一个到达?也许你两者都有一点,要看情况而定。我对此的看法是,至少有一个统一的方法来访问和评估不同的汽车/发动机,允许我们以更好的系统方式回答这些问题。

pixabay
如何设计一个好的复杂系统?有凝聚力的设计:
集成多个模型、比较它们并在重采样中嵌套它们的想法绝对不是新的。然而,将所有这些放在一起是上述每个元包试图实现的目标。如果您曾经试图自己编写交叉验证技术,您可能很快就会面临一些编程设计差距问题(边缘情况或其他错误)和其他计算瓶颈,如可伸缩性。
将输入和输出名称/格式统一成一个单一的公共名称/格式只是一个技术性的语义呈现任务。然而,一旦统一,设计一个有凝聚力的系统,将所有不同的组件很好地结合在一起,编织在一起,以拥有一个强大的良好运转的机器,同时也允许各个组件的独立开发,这一点都不简单。

pixabay
(今天)谁都会开车,但是你知道车坏了怎么修吗?!?
偶尔我会回到上面描述的“旧脚本”,寻找特定模型的一些细节。我为能接触到这些资源而感到幸运,这些资源引导我走过了统计学学习的艰难历程。虽然我仍然不确定我是否也应该感到荣幸,在这条道路出现时跟随它,而不是在未来的某个地方开始,立即获得这些现代工具。毕竟,这些“旧剧本”,实际上并没有那么老。它们是最近才写的。假设我对这个领域一无所知,并且读了这篇评论,一夜之间成为这些元包的专家,我还会拥有我通过漫长而曲折的道路慢慢获得的技能吗?
我们生活在一个激动人心的时代,这样强大的工具唾手可得,开源发行版让所有人都可以免费使用。这些类型的元包允许我们访问一个全面的工具,该工具允许模型、性能测量、预处理步骤和可调参数值等的多种组合的集成。所有这些组合都可以很好地打包成一长串参数组,并在一次基准测试函数运行中进行评估。
使用这些元包,它不再是一个难以完成的任务。复杂的组件可以很容易地分解,拆卸成更简单的子组件,仔细测试他们的行为和对整体性能的影响。它还使初学者能够跳过对这些子组件的方法理解,并把每个子组件作为一组相互关联的黑盒来处理。
回到汽车驾驶的类比。驾驶汽车不需要了解汽车复杂的机械结构。然而,如果司机有兴趣提高汽车的性能,他应该更好地了解引擎盖下发生了什么,或者有机会接触到好的机械师。
在这篇文章中,我描述了自己成为汽车“机械师”的历程。对我来说,是从几本书开始的。希望读完之后,你可能会找到一个更好的起点。在熟悉了这些工具之后,您可能很快就会想要自己修改方法中的某些东西,或者根据您自己的特定需求对其进行裁剪,或者建议对现有方法进行改进。我的朋友,那是你无法再逃避肮脏工作的时刻。现在是时候长吸一口气,学习如何扩展这些方法,并投入进去了。我可以向你保证,你会像我一样在途中学到很多有用的东西。玩得开心!
还可以查看 2019 年底关于第二代元包的后续帖子。
*查看我的博客:【https://medium.com/@drorberel *
点击此处查看更多相关话题:【https://drorberel.github.io/】T4
顾问:目前接受新项目!
Meta 用 Pytorch CNNs 标记鞋子
我一直想尝试的是生成描述图像的文本。当以这种方式提出时,两条路径浮现在脑海中。首先将使用 CNN 的组合进行特征提取,并将这些提取的特征提供给 LSTM,让它通过重复迭代来生成描述。第二种方法是构建多标签分类模型,并让输出节点表示特定的标签。第一种模型适用于您希望为图像生成带有语法结构的标题的情况。多标签分类器适用于感兴趣的标签数量有限的情况。这个数字可能很大,只要有足够的数据,就可以用这种方式训练模型。
在这篇文章中,我试图只用原始图像作为输入,为鞋子生成元数据标签。至于方法,我决定使用多标签分类模型。我不使用 CNN + LSTM 路线的第一个原因是,我并不明确需要那种英国式的结构,而这正是 LSTM 的目标。第二个原因是,我觉得我需要比我愿意手工生成的更多的数据,以使模型很好地为我定制的用例训练。我希望我能够利用预训练的网络快速建立一个模型来生成这些元数据标签。这被证明是部分真实的。
注意,我把为每个图像生成的标签放在该图像的标题中。

Generated Tags: Blue, Boot, Below the Ankle
构建数据集
第一个主要步骤是收集一个小数据集,并对其进行标注以进行多标签分类。为此,我抓取了 220 张图像(训练 200 张/验证 20 张),并在电子表格中标记它们。正如我提到的,我只是想有一些非常简单的分类,所以我选定了 19 个分类,涵盖了原色、款式(平底鞋、高跟鞋、休闲鞋、凉鞋等)。),还有一些是对鞋子的更多描述,比如它们是高、矮、有光泽还是有图案。

Generated Tags: Grey, Boot, Heel, Above the Ankle, Patterned
首先要注意的是…这些可能是不好的类别,或者至少可以做得更好。我只是想有某种结构来填充一个体面的数字,但仍然有限的标签数量。特别是最后几个标签是脚踝上方或下方的标签。我想包括这些,因为我认为看看网络是否会习惯于根据图像来确定鞋子的高度会很有趣。
技术冲刺直入一堵墙
从技术角度来看,这是为这个项目定制 pytorch 数据集生成器类的好机会。这非常简单,因为您需要做的只是向它提供 pytorch dataset 基类并添加函数来生成样本。对我来说,这仅仅意味着添加从项目目录中打开图像的功能,并跟踪适当的目标标签。在这种情况下,目标标签是 1 和 0 的长度为 19 的向量。
查看我用于数据准备和培训的 jupyter 笔记本 以了解实现细节
我后来发现的一个注意事项是,BCEWithLogitsLoss()可能更有用,因为它将 sigmoid 图层与损失函数相结合,因此它返回概率(像 softmax 一样),但每个节点都是独立的(不像 softmax)。这可能有助于清理网络的输出。但是我离题了…回到我的失败。
技术设置完成后,我准备开始测试网络和超参数。显而易见的起点是使用一些标准的预训练网络,并尝试针对这个问题对它们进行定制。我测试的第一个网络是 ResNet 50 模型,在用所有 19 个目标类的 200 个训练样本对其进行训练后,我发现这些模型做得……非常糟糕。
我发现,模特们基本上只是把所有东西都叫做“靴子”,有时当感觉有创意时,就叫做“黑靴子”。
按照我目前的方法,我的第一个想法是,目前的模型表现不佳,我的问题的一个可能的解决方案是投入额外的计算能力。因此,我使用预训练的 ResNet 152 训练了另一个模型,并假设 ResNet 50 可能没有为这个问题提取足够有用的特征。
但即使有 3 倍的层数,一个更强大的模型,和超参数调整,我得到的只是更多的“靴子”。在这一点上,我遇到了一个心理障碍,可以用下面这张 GIF 来概括,GIF 是《英雄 6》中的 Hiro Hamada,他没有想出一个项目主题。

在使用我认为可行的一般方法反复失败后,我真正需要的是后退几步,对我的大脑进行一次硬重置。

I still frequently code to Immortals
寻找新的角度
所以按照《英雄 6》中浜田义的建议,我想我必须试着用不同的方式来看待这个问题。
想想我最后会去散步或者练一会儿武术。这一次,我在木人桩上练习咏春拳。虽然这是一个数据科学帖子,但我会简单地说,在木制假人上练习包括用手、胳膊和脚击打假人,以增强骨骼强度并改善形态。一开始会很痛,但一旦你的骨头变硬,就会很放松。

Donnie Yen practicing on a mook yan jong
我在练习时想出的方法简单得令人痛苦。这并不是模型没有提取有用的特征,而是我的目标空间对于我的数据集的大小来说可能太稀疏了。
对于任何给定的图像,它们往往有 3-4 个标签,因此目标数组几乎全是零。在所有 19 个职业的设置中,模型只会经常看到一些组合,但大多数是罕见的…一个常见的组合是“黑靴子”,这似乎可以解释为什么这是所有模型想要返回的原因。
现在,随着问题的重新架构,我准备从新的角度再次发起攻击。我想我可以把这个问题分解成更小的部分,用一套标签生成模型来解决它。
新角度
因此,我发现我可以使用 3 个小的 ResNet 18 模型,而不是抛出一个试图一次预测所有 19 个类的大模型。三个模型中的每一个都在 19 个节点的子集上进行训练。
第一个模型在 7 个颜色特征上被训练。映射到黑色、白色、红色、蓝色、褐色、灰色、棕色。

Generated Tags: Tan, Boot, Heel, Above the Ankle
第二个模型有 7 种风格。靴子、鞋跟、运动鞋、凉鞋、平底鞋、铆钉鞋和休闲鞋。

Generated Tags: Black, Flat, Below the Ankle, Patterned

Generated Tags: Tan, Studded, Sandal, Above Ankle
第三个模型着眼于五个特征的混合图案(鳄鱼纹理、豹纹、奇怪的字符等,脚踝以上、脚踝以下、闪亮或皮革)。

Generated Tags: White, Flat, Below the Ankle, Patterned
在将原始长度为 19 的向量划分为长度为 7、7 和 5 的三个部分之后,我使用其中的每一个作为目标来训练 3 个 ResNet 18 模型。每个 ResNet 18 在 1080 Nvidia GPU 上完成 25 个纪元的训练可能需要大约 3 分钟。
要生成您在所有图像上看到的标签,我所要做的就是让图像通过所有三个模型,并评估输出向量。现在我所做的就是将数组映射回它们原来的类,并检查哪些类有正值,或者如果所有的类都是负值,我会保留值最高的一个。
速度测试
出于好奇,我用这三个模型对标记生成速度进行了基准测试。对于这个项目,我在 jupyter 笔记本中包含了基本的低效测试循环,所有三个模型的推理速度都是每个图像 0.043 秒,因此在我的整个 220 个图像数据集上运行大约需要 9.5 秒。它包括两个内部 for 循环,这使得它非常慢。作为一个快速的改进,我去掉了一个内部 for 循环,发现所有三个模型的每幅图像都增加到了 0.025 秒,总时间是 5.7 秒。
向前看,这个评估算法可以更好地优化运行速度,但我只是想表明,即使有多个模型,推理速度也相当快。在这种速度下,对于更大规模的任务,比如说 1000 万张图像,这种设置需要 69.4 小时。
限制
考虑到训练集很小,以及我是如何有意识地挑选大部分是白色背景的工作室类型的图像的,模特们在下面这种没有白色背景的情况下挣扎。

Generated Tags: Tan, Brown, Loafer, Above Ankle, Leather
我猜这种情况下工作体面,但它可能不应该被称为这些懒汉…至少顺便说一下,我把类似的项目归类为靴子。
在下一个例子中,模型无法解释由模型的肤色等因素引起的额外变化。你可能会发现这些标签似乎都不正确…图片不是脚踝以上的黑色…

Generated Tags: Black , Heel, Above the Ankle
在我这里展示的这两种情况下,我之前构建的图像分割模型可能会有用。前一篇文章的概念是,应用图像分割模型可以帮助清理输入图像,以便像这些标签生成器 ResNet 18s 这样的第二阶段模型在进行正确分类时不会有太多问题。
前进
虽然我没有演示如何生成大量的标签,但我认为在数据很少的环境中,这种方法可以扩展到相当大量的标签。网络不需要考虑和优化目标的巨大变化,因此它应该不难建立。如果你继续使用这种方法,那就意味着你必须调用大量的网络来生成相当窄的标签,并将它们组合起来,以获得那只鞋的完整标签列表。如果输入图像随时间变化或类似情况,保持多个网络协调可能会变得更加麻烦。
在具有大量数据的环境中,使用单个大目标向量来训练更大的模型以生成标签可能是可行的。我的想法是,只要网络能够接触到足够多的样本,目标的稀疏性就不会那么重要。不过这还有待检验。拥有这些大模型的一个缺点是,添加额外的标签要么需要重新训练大模型,要么可以添加额外的小模型来扩充它。
896

被折叠的 条评论
为什么被折叠?



