视频游戏是人工智能的完美游乐场
为什么科学家使用虚拟世界来创造现实生活中的解决方案
Photo by Franck V. on Unsplash
近年来,人工智能领域发展迅速,人工智能背后的一系列技术有望改善我们生活的几乎每个方面。因此,人工智能被用于提高制造效率,为汽车创造自动驾驶系统,预测股票价格,安排工业产品的维修,以及其他可以直接改善我们生活的有用事情。
然而,人工智能算法的另一个应用似乎没有带来任何经济效益,但仍被广泛研究——玩视频游戏的人工智能。
在这里,我们不是在谈论作为你在游戏中旅程的一部分的 NPC(游戏中的非人类角色,机器人),尽管它们中的一些是稍微有点人工智能的,使它们感觉更真实。焦点在于真正的人工智能算法,即像任何其他独立演员一样玩视频游戏,当他们按下控制器上的按钮时,完全像人类一样。从这里,一个问题出现了——为什么开发者和研究人员在似乎没有增加价值的算法上投入了如此多的精力,因为他们只是在玩游戏?
科学家如何将游戏和人工智能结合起来?
答案很简单——玩电子游戏的人工智能不仅仅是为了玩电子游戏而被创造出来的(令人惊讶)。在这种情况下,游戏环境充当不同类型算法的游戏场,它们可以在那里测试和尝试新事物;这些结果可以应用于现实生活或未来的研究中。
例如,这是 the Verge 写的关于 DeepMind 的人工智能代理玩《雷神之锤 3》的内容:
“和以往类似的研究一样,我们的目标不是在电子游戏中真正打败人类,而是找到新的方法来教会智能体在复杂的环境中导航,同时追求共同的目标。换句话说,它是关于教授集体智慧的——这是(尽管有大量相反的证据)人类作为一个物种的成功所不可或缺的。“夺旗只是未来更大游戏的一个代表。”
在视频游戏中测试的人工智能技术的主要子集是机器学习,更具体地说,是强化学习。强化学习是一种机器学习,它意味着代理通过执行动作并获得反馈来学习如何在环境中表现。换句话说,这种类型的机器学习类似于人类甚至狗早年的学习方式:
采取行动→收到反馈(正面或负面)→根据反馈得出结论,行动是好是坏。
视频游戏中也使用了类似的结构。想象一个计算机系统,它有一个视频游戏和控制器。系统不知道该做什么,但它有一套可以执行的操作。如果它在一局游戏中前进,没有死亡,环境给系统一些奖励(没死:+1)。如果系统右移并死亡,则不获得奖励(死亡:0)甚至获得惩罚(死亡:-1)。由此,一台机器明白了向前比向右好。最终,算法的目标是最大化从其行为中获得的回报。
显然,这是对背景中实际发生的事情的简化,但是为了将重点放在视频游戏而不是实际的算法上,这个例子应该足够了。关于更多细节,有一篇很好的文章解释了 RL 如何工作的基本原理:
本文是🕹️. tensor flow 深度强化学习课程的一部分点击这里查看教学大纲
medium.freecodecamp.org](https://medium.freecodecamp.org/an-introduction-to-reinforcement-learning-4339519de419)
DeepMind Technologies 首次成功尝试在视频游戏中实现机器学习,他们创造了一种深度强化学习算法,可以玩旧的 Atari 2600 游戏。
然而,最新和最有趣的进展之一是由来自埃隆·马斯克共同创立的“专注于奇点的智库”开放人工智能的研究人员取得的。这组研究人员应用了一种所谓的“好奇心驱动的方法,这意味着他们没有解释算法要做什么,甚至没有解释获胜意味着什么。相反,他们编写了自然的“好奇心”来驱动机器“探索”事物,而机器只是出于好奇而玩游戏。
“这并不像听起来那么奇怪。发展心理学家认为内在动机(即好奇心)是发展早期的主要驱动力:婴儿似乎采用无目标探索来学习对以后生活有用的技能。还有很多其他不需要外在奖励的例子,从玩《我的世界》到参观当地动物园。”
如果你教机器人钓鱼,它很可能会捉到鱼。然而,如果你教它好奇,它只会看电视…
thenextweb.com](https://thenextweb.com/artificial-intelligence/2018/08/23/researchers-gave-ai-curiosity-and-it-played-video-games-all-day/)
所以总的来说,在电子游戏中测试不同 AI 算法的总体思路是收集数据,为现实世界的应用或后续研究创建知识库。
为什么电子游戏对机器学习如此有益?
视频游戏在人工智能研究人员中流行背后的第一个原因是视频游戏在许多方面模仿现实生活的趋势。当涉及到老游戏时,这个想法不是很直接,因为它们有街机风格的图形和物理。
Photo by Kelly Sikkema on Unsplash
内在动机
然而,深入挖掘一下,我们会发现,即使在像马里奥这样的卡通游戏中,前进和执行某些动作的动机与我们的日常生活并没有太大的不同。作为一个英雄,你有一个你想要实现的特定目标,你采取特定的行动来让自己更接近这个目标。如果你的英雄在游戏中死亡,你将此视为负面反馈并改变策略。
向主要目标迈进一步→获得反馈→根据反馈改进→再试一次。
简·麦克戈尼格尔(Jane McGonigal)等作者甚至将这种反馈循环描述为在现实生活中使用游戏方法实现目标的聪明策略,因此人工智能算法可以直接从视频游戏中学习这一点是很自然的。正如 ITUNews 所说的:
“视频游戏旨在通过让玩家专注于包括克服障碍和跟随子故事在内的元素来挑战人类的思维。游戏设计的一个核心理念——也是许多人喜欢玩游戏的部分原因——是玩家一直在学习。”
真实的生活,但又安全又快捷
说到现代电子游戏,对现实生活的模拟更加明显。例如,侠盗猎车手,这基本上是一个带有有趣元素的生活模拟器,已经被某些研究人员用来训练自动驾驶汽车。由于交通规则、道路和汽车物理已经编码在游戏中,科学家在那里测试算法比在现实生活中更容易。由于 GTA 非常逼真,它可以用来生成“与使用真实世界图像生成的数据一样好”的数据。
Classifying different objects in the road scenes. Source: MIT Technology Review
此外,视频游戏安全而快速——不需要与真实环境进行交互来训练 AI,而虚拟环境允许算法训练和开发的速度比物理空间快得多。据称,在机器人可以执行 10 项任务并在现实生活中获得有用反馈的时间内,一个算法可以玩一个游戏 10,000 次,并生成有价值的数据。对于自动驾驶系统等人工智能应用领域,这一功能尤其有用,因为收集道路数据非常耗时,而在交通方面,人们的生命也岌岌可危。
此外,视频游戏很复杂,但提供了一个渐进的过程,使学习过程可以自然进行。因此,游戏往往以不同但相对容易的关卡开始,并随着每个后续的关卡而逐渐变得更难。因此,人工智能算法可以像人类一样学习玩游戏——通过试错和随着时间的推移提高技能。
“视频游戏是训练人工智能算法的一种很好的方式,因为它们旨在让人类的思维逐渐进入越来越困难的挑战。”
简单数据
另一个要点与数据清理有关。对于现实生活中的观察,大多数导出的数据在用于机器学习之前应该被“清洗”,因为诸如缺少某些值或有偏见的反馈之类的不完善之处在现实中会出现。然而,可以预期的是,由于视频游戏基本上是由数据点创建的,所以在让机器从那里学习之前,您不需要清理太多数据。这在理论上应该可以减少一个机器学习项目所需的时间相关资源。
电子游戏很有趣
最后,在电子游戏中实现人工智能算法的一个简单原因是游戏很有趣。这种类型的娱乐与高参与度相关,一些游戏拥有数百万忠实粉丝,这在其他类型的活动中不像游戏那样常见。
因此,如果一项科学成就不是用数学术语而是用游戏洞察力来解释,人们更有可能对它感兴趣。例如,创造一种算法,让在《星际争霸》中击败职业电竞玩家,或者以极高的效率玩雅达利游戏,吸引了大量的关注,并增加了媒体对这项研究的报道。这让人们更加了解人工智能和视频游戏,这对所有参与方来说都是一个双赢的局面。
视频:欺诈检测中的神经网络入门
从预处理到学习范畴嵌入
神经网络(NNs)最常用于处理自然数据,如文本、语音或图像。在处理传统的表格数据时,很少使用它们。然而,它们可以提供许多好处。我在一个关于卡格尔信用卡欺诈检测竞赛的新视频中探讨了这个话题。
首先,您可以通过将 NN 模型与更传统的基于树的模型预测相结合来提高性能。这是有效的,因为神经网络很可能学到了一些不同的,正是这种差异导致了有用的集合。【如果你想了解更多关于组装的知识,你可以在这里 观看我关于这个话题的视频 [。]](https://youtu.be/lgnl-Jiu1D0)
其次,学习嵌入本身可以启发分析。例如,在上图中,我们绘制了完整事务嵌入的 2D 投影。这显示了许多集群的有趣结构。通过分析这些聚类,我们可以看到模型认为哪些交易是相似的。这可以帮助我们创造新的功能,以促进更好的学习。
你可以在这里看到视频:
更多类似的内容,你可以订阅我在blog.zakjost.com的邮件列表
视频:如何通过集成提升性能
关于信用卡欺诈检测问题的演练
作为关于信用卡欺诈检测的新 Kaggle 竞赛的视频系列的一部分,我将向您展示如何通过将几个模型组合在一起来极大地提高模型性能。我还讨论了处理类别不平衡和将数据分成训练/验证集的策略。
自上而下的观点:首席数据官研讨会的三点收获
当今世界最具创新性的 CDO 在做什么
Photo by Skye Studios on Unsplash
本月早些时候,我有幸第一次参加了麻省理工学院的首席数据官研讨会。来自美国、加拿大、德国、荷兰等地的 60 多名 CDO 出席了会议。财富 500 强公司、政府机构和学术界的顶级数据组织都有代表出席。对我来说,这明确了即将到来的一年将是重要的一年,因为 CDO 的角色变得更加明确,并开始影响各个行业。
我被会议上的能量所鼓舞,并想分享当今最具创新性的 CDO 正在做的事情,这些事情让我觉得是每个数据优先公司都应该考虑的及时之举:
# 1:CDO 正在为自己以及数据行业定义角色
随着 CDO 努力塑造自己的角色,以及他们对底线的重要性不断增加,这促使人们自然而然地思考公司应该从他们的数据中获得什么,以及真正的数据驱动意味着什么。我在研讨会上听到的一些关键要点是:
- 进攻的重要性,而不仅仅是防御,在您的数据战略中
- 管理和投资于数据的“基础”
- 接近收入并证明数据工作的投资回报
注意:对于更长时间的思考,汤姆·达文波特在《福布斯》上有一个的精彩总结。
但上述优先事项给我留下最深刻印象的是——以及它们在角色和业务成熟度方面的标志——这是 CDO 崛起的一个独特时刻。(毕竟,说到政府,你知道我们已经掌握了一种趋势:7 月初,白宫授权每个机构任命一名首席数据官。)
在私营部门,CDO 角色在组织中日益重要的表现是:
- 报告结构越来越接近首席执行官
- 责任越来越大,包括分析、数据工程、BI
- 与公司目标相关的明确使命和章程
如今,每个组织都需要有一个数据战略,而 CDO 是掌舵这一战略的最佳人选。但挑战在于如何让数据计划成功超越数据功能的界限,并对更广泛的组织产生影响。
一个叫 CDO 的人告诉大家,他创造了一个新的角色,叫做“数据素养负责人”,为整个企业服务。这个人负责确保这个~10K 员工组织中的每个业务单元“数据流畅”例如,他们正在为每个业务部门创建记分卡,以根据数据技能(如 Excel、SQL、R、Python 等)来衡量职能部门的绩效。然后,他们帮助每个职能部门定义他们的数据素养目标(即,每个人应该知道什么技能,以及达到什么样的深度和广度);培训/教育团队,帮助成员提高技能;作为一个组织,总体上变得更加“数据流畅”。
在组织中建立一个单一的责任点是非常强大的,可以让整个公司以一种非常具体、可衡量的方式掌握数据。
#2:使用数据推动有意义的商业价值,并对其进行量化
在研讨会期间的一个小组中,一位 CDO 分享了这个关于如何思考数据“防御”工作的价值的伟大比喻:
想象一下:你的公司是一个隐喻的杂货店。想象一下,如果货架上所有的商品都杂乱无章,购物者找不到他们需要的商品——这是一种多么可怕的体验。同样,当你的数据杂乱无章时,这也是数据消费者的感受——他们不知道在哪里可以找到他们需要的数据。现在想象商店里的物品被棕色的袋子覆盖着。购物者不知道他们在买什么。类似地,这就是为什么您需要收集和组织元数据来描述和理解您的资产。
我要指出的是,大型科技公司已经建立了解决其中一些问题的本土解决方案,比如 Lyft 的阿蒙森和 LinkedIn 的数据中心。
但最具创新性的 CDO 不会止步于防御。公司现在将数据作为竞争优势;例如,使用它来确定新的市场成熟的破坏,新产品或新功能的开发,新的方法来提高成本和效率。事实上,如果做得好,您的数据战略不仅会紧密联系在一起,还会极大地影响您的业务战略。如今,数据团队实际上扮演着各种功能的业务合作伙伴的角色,作为他们的营销、销售、客户成功、产品和工程对应方的积极思维伙伴。数据团队参与业务合作伙伴的 KPI 以提高绩效的情况并不少见。业务成功就是数据组织的成功。
#3:在业务需求的驱动下,寻找并采用新技术
将创新和自动化引入一个行业可以从根本上改变商业运作的方式——从我们构建、运营和成功的方式。就我个人而言,我认为我们将会看到这种创新,其形式是自动化和工程概念被新应用于数据。我之前写过关于数据可靠性以及团队如何发展以变得更加主动地管理他们的数据停机时间以及以 AI/ML/自动化优先、可扩展的方式解决这个问题的需求。擅长采用数据和新技术来管理数据的公司将占据上风。
一位来自东海岸的 CDO 在一个小组中分享道,她上任后做的第一件事就是组织公司的数据主管去拜访西海岸的同行。他们与具有前瞻性思维的数据组织会面,交流最佳实践,了解有用的新技术,并确保他们在数据、自动化、AI/ML 等方面推动自己的思维。另一位财富 500 强金融机构的 CDO 表示,她将自动化视为其组织的首要任务;以至于她和她的团队几乎 30%的工作都与识别和采用新平台有关,以使她的数据团队更加有效!
数据行业的创新和变革步伐是巨大的,我迫不及待地想看看几年后我们会在哪里。无论您是数据科学家、分析师、工程师还是业务人员,我们都有责任尽可能成为最好的数据管家,带领我们的组织完成这一转型。有一点是清楚的:成为这场运动的一部分,这无疑是一个特殊的历史时刻。
通过机器的眼睛看文本
如何让黑盒语言模型更加透明
Visualising how machines read text. In this article we will build a heatmap to identify where a text model is ‘reading’ to determine whether a coffee is a light or dark roast
多年来,我们已经能够在计算机视觉任务中揭开卷积神经网络(CNN)的盖子。这给该领域带来了重大改进,具体表现在:
- 提高模型的稳健性;
- 模型偏差的可见性和减少;和
- 更好地理解对立图像如何改变深度学习模型的输出。
既然更好的模型理解带来了如此明显的好处,为什么我们在自然语言处理(NLP)领域对模型可解释性的关注程度似乎不一样呢?
This is what a neural network thinks dumbbells look like. Notice that the model has not separated arms from weights in this case and therefore has not learned generalised representations of this class. Photo from Google AI Blog
创建一个 CNN 正在看的地方的可视化:
在这篇文章中,我们将看到如何应用同样的技术来理解基于视觉的 CNN 在看什么,并将其应用于文本。然后,我们将创建一个热图,显示 CNN 在输入文本的特定区域“聚焦”的位置,以便进行分类。
是的,我知道,在 GPT-2,伯特,埃尔莫等时代,CNN 现在被认为有点“过时”。然而,它们仍然提供了很好的现实世界性能,没有这些尖端模型带来的大模型大小,长推理时间和大内存使用。
预测咖啡烘焙:
为了浏览一个例子,我们将首先建立一个简单的分类器,根据它的描述来预测一杯咖啡是浅烘焙咖啡还是深烘焙咖啡。
我们的数据集是一系列咖啡评论。在这张桌子上,我们将使用盲品笔记来尝试预测烘焙的颜色是浅还是深。
在 Keras 中构建 CNN 并根据这些数据对其进行训练的代码如下:
X = df.blind_assesment.values
y = df.y.valuestokenizer = Tokenizer(num_words=4000)
tokenizer.fit_on_texts(X)X = tokenizer.texts_to_sequences(X)vocab_size = len(tokenizer.word_index) + 1 # Adding 1 because of reserved 0 indexmaxlen = 200
embedding_dim = 50X = pad_sequences(X, padding='post', maxlen=maxlen)sequence_input = layers.Input(shape=(maxlen,), dtype='int32')
embedded_sequences = layers.Embedding(vocab_size, embedding_dim, input_length=maxlen)(sequence_input)
l_cov1 = layers.Conv1D(317, 3, activation='relu')(embedded_sequences)
l_pool1 = layers.MaxPooling1D(2)(l_cov1)
l_cov2 = layers.Conv1D(317, 1, activation='relu')(l_pool1)
l_cov3 = layers.Conv1D(317, 2, activation='relu')(l_cov2)
l_pool3 = layers.GlobalMaxPooling1D()(l_cov3) # global max pooling
l_bnorm = layers.BatchNormalization()(l_pool3)
l_dense = layers.Dense(128, activation='relu')(l_pool3)
preds = layers.Dense(1, activation='sigmoid',name='preds')(l_dense)model = Model(sequence_input, outputs=preds)model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.summary()model.fit(X, y, epochs=3, validation_split=0.1, batch_size=10)
如果 Keras 中的模型看起来有点不同,这是因为它使用了函数式 API ( 这里有更多细节)。该代码训练并拟合模型,验证准确率约为 75–80%。有很多关于构建 CNN 文本分类器的其他帖子,所以我在这里不再赘述。相反,我们将关注如何解释这个分类器做出的预测。
创建激活图:
使用 Keras,这既快速又简单,只需要几行代码:
- 得到模型预测和网络的最终 CNN 层:
You can get a breakdown of the model structure in Keras using model.summary(). Here conv1d_45 is the name of the final CNN layer in the model
然后,以下代码获取预测类和最后一个 CNN 图层:
class_idx = np.argmax(y_pred[0]) #not needed in this case as only two classes
class_output = model.output[:, class_idx]
last_conv_layer = model.get_layer("conv1d_45")
2.由此,我们可以计算类输出相对于特征图的梯度,然后汇集所有的梯度。这听起来很复杂,但使用 Keras 后端函数,只需几行代码就可以完成:
grads = K.gradients(class_output, last_conv_layer.output)[0]
pooled_grads = K.mean(grads)
iterate = K.function([model.input], [pooled_grads, last_conv_layer.output[0]])
pooled_grads_value, conv_layer_output_value = iterate([Xtst])
3.然后,我们对该特征图进行平均,并将其归一化到 0 和 1 之间:
heatmap = np.mean(conv_layer_output_value, axis=-1)
heatmap = np.maximum(heatmap,0)
heatmap /= np.max(heatmap)#normalise values in the prediction
我们现在有了预测类在最后一个 CNN 层的输出形状长度上的激活热图。我们现在需要做的就是根据原始输入的长度(单词数)来调整(拉伸)它,以了解哪些单词触发了网络。
用 HTML 可视化输出:
向最终预测添加一些基本的 HTML 可以创建一个非常有影响力的用户界面,同时增加了理解模型如何达到其预测的能力:
norm_len = maxlen/last_conv_layer.output_shape[1] # find the ratio of the text vs the conv layer lengthhtml = ""
if y_pred[0]>0.5:
pred = 'light'
else:
pred = 'dark'
html += "<span><h3>Based on the description, the model believes that this is a {} coffee roast. ".format(pred)
html += "<small><br>Confidence: {:.0f}%<br><br></small></h3></span>".format(abs(((y_pred[0][0]*100)-50)*2))
for j,i in enumerate(tokenizer.sequences_to_texts(Xtst)[0].split()):
html += "<span style='background-color:rgba({},0,150,{})'>{} </span>".format(heatmap[math.floor(j/norm_len)]*255,heatmap[math.floor(j/norm_len)]-0.3,i)HTML(html)
这个 HTML 片段在 Google Colab 中创建了以下输出:
Here we can see the model has ‘read’ that the coffee in question has tastes of ‘wild strawberry’ and has a ‘sweet’, ‘fresh acidity’ and is therefore (correctly) confident that this is a light roast.
总之,在本文中,我们已经看到了如何轻松地突出显示模型正在“阅读”的文本区域,以进行预测。这些信息对于以下工作至关重要:
- 执行基本模型调试和意义检查。
- 更好地理解为什么模型会对训练样本进行错误分类。
- 检测潜在的模型偏差。
感谢阅读。如果你有任何问题,请在评论中告诉我。
完整的代码可以在下面的 Colab 笔记本中找到:
文本可解释性
colab.research.google.com](https://colab.research.google.com/drive/1taIt9A9tsENJTYh3eK0ZuUyRIdrHeNty)
小提琴情节——是时候抛弃盒子情节了
在您的数据探索之旅中,您很可能遇到过许多类型的图表,它们的主要目标是提供您正在处理的数据的可视化摘要。
Photo by Providence Doucet on Unsplash
你已经得到了你的直方图和/或 KDE 图,向你展示一个特定的属性是如何分布的,你已经得到了你的箱线图来寻找最终的异常值。但是你觉得把这两种图表结合起来的想法怎么样?
这就是小提琴情节的由来。
在潜入文章之前,我先说清楚这篇文章是给看的。如果你已经每天都在使用小提琴的情节,并且对它们了如指掌,你可能就不应该继续读下去了。但是对于其他人来说,这篇文章将是一个很好的复习资料,甚至对于初次学习者来说是一个很好的资源。
小提琴情节——精粹
violin 图背后的主要思想是结合直方图(或 KDE 图,更准确地说是)和箱形图的功能。也就是说,violin plots 将显示您将在方框图中看到的所有信息,例如:
- 中值(中间的白点,稍后你会看到)
- 四分位数范围 (IQR,白点周围的粗黑条)
- 下/上限值(从粗黑条延伸的线,定义为 Q1-1.5 IQR 和 Q3+1.5 IQR-用于异常值检测)
你知道上面所有的那些术语是什么,因为我相信你以前见过一个盒子图,所以没有必要继续纠缠下去。
然而,这三件事并没有使小提琴情节变得特别(因为那是盒子情节的工作)。它的特别之处在于,它还显示了数据的整体分布。
让我们来看看实际情况,我将从标准正态分布中抽取一个样本,然后在 KDE 旁边绘制直方图,然后是箱线图,最后是小提琴图:
执行上面的代码将产生以下输出:
**爽!**简单提一下,如果你对调整 Matlotlib 图表的外观感兴趣,请参考我的上一篇文章。
现在,当我们了解了基础知识后,让我们进一步探索在真实数据集上绘制 violin 图的能力。
向下钻取
为了这篇文章,我将使用技巧数据集,您可以免费下载并跟随它。很容易将它加载到熊猫中,不需要下载 CSV 文件,只需传入 URL:
执行上面的代码将显示数据集的前几行:
以防你想知道 Bamboolib 是什么。现在我真的不想对这个数据集进行深入分析,因为,嗯,今天是圣诞节 ( 祝你节日快乐,我的读者朋友),但是我将探索小提琴情节的一些属性。
首先是total_bill
属性(代码:sns.violinplot(tips_df['total_bill'])
):
如你所见,分布有点倾斜。右侧有异常值(延伸条结束处右侧的区域),表明有几张昂贵的钞票,大约在 40 美元以上。
现在,让我们更深入地探索每天和每次总账单金额(代码:`sns.violingplot(x=‘day’, y=‘total_bill’, data=tips_df)``)的 violin 情节:
嗯,这很奇怪。不要误会我的意思,所有的情节都很好,但似乎酒吧/餐厅在周一,周二和周三不工作。有史以来最高的账单是在周六,大约 60 美元,但是每天都有异常值。
有一句老话说,吸烟者往往在酒吧和餐馆花更多的钱(我只是为了证明一点而编造的),让我们看看这是不是真的(代码:sns.violinplot(x='day', y='total_bill', hue='smoker', data=tips_df)
:
看起来这种说法在大多数日子里都是正确的,至少如果我们看一下账单金额的中位数(中的白点),但对于周五来说,情况通常不是这样。当然,有一些异常值,但是你不能真的指望他们作为大多数数据。
这个hue
的东西实质上是图表上小提琴图数量的两倍,这有点不必要,因为小提琴图是对称的,你只要看它的一边就可以得出相同的结论。这就是split
参数派上用场的地方。让我们看看它在示例中做了什么(代码:sns.violinplot(x='day', y='total_bill', hue='smoker', data=tips_df, split=True)
:
现在有了这张更加紧凑的图表,你可以像以前一样看到每一点信息。
在你走之前
现在,您已经拥有了将数据分析技能提升到下一个水平所需的基本工具。箱形图很好,KDE 图也很好,但是小提琴图会让你在做决定时节省一些时间。
我鼓励你继续深入探索,在评论区与世界分享你的发现。
感谢阅读。保重。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
小提琴情节解释
Source: Unsplash
学习如何使用小提琴情节,以及它们比盒子情节有什么优势!
一般来说,violin 图是一种绘制数字数据的方法,可以被认为是盒图和核密度图的组合。在小提琴图中,我们可以找到与盒子图中相同的信息:
- 中值(小提琴图上的白点)
- 四分位范围(小提琴中间的黑条)
- 下/上相邻值(从条上拉伸的黑线)——分别定义为
first quartile — 1.5 IQR
和third quartile + 1.5 IQR
。这些值可用于简单的异常值检测技术(图基栅栏),位于这些“栅栏”之外的观察值可被视为异常值。
与箱线图相比,小提琴图无可置疑的优势在于,除了显示上述统计数据之外,它还显示了数据的整体分布。这是令人感兴趣的,尤其是当处理多峰数据时,,即,具有一个以上峰值的分布。
用 Python 实现
在本文中,我们使用以下库:
seaborn 0.9.0
numpy 1.17.2
pandas 0.25.1
matplotlib 3.1.1
我们首先定义我们将从某些分布中抽取的随机观察值的数量,以及为结果的可重复性设置种子。
N = 10 ** 4
np.random.seed(42)
然后,我们定义一个绘制以下内容的函数:
- 具有核密度估计的直方图(KDE)
- 箱线图
- 小提琴的情节
我们将使用这个函数来检查随机创建的样本。
def plot_comparison(x, title):
fig, ax = plt.subplots(3, 1, sharex=True)
sns.distplot(x, ax=ax[0])
ax[0].set_title('Histogram + KDE')
sns.boxplot(x, ax=ax[1])
ax[1].set_title('Boxplot')
sns.violinplot(x, ax=ax[2])
ax[2].set_title('Violin plot')
fig.suptitle(title, fontsize=16)
plt.show()
标准正态分布
我们从最基本的分布开始——标准正态分布。我们随机抽取 10000 个数字并绘制结果。
sample_gaussian = np.random.normal(size=N)
plot_comparison(sample_gaussian, 'Standard Normal Distribution')
我们可以做一些观察:
- 在直方图中,我们可以看到分布的对称形状
- 我们可以在箱线图和小提琴图中看到前面提到的指标(中位数、IQR、图基围栏)
- 用于创建小提琴图的内核密度图与添加到直方图顶部的内核密度图相同。小提琴图的较宽部分代表观察值取给定值的较高概率,较薄部分对应较低概率。
我相信把这三个情节放在一起展示,可以很好地直观地了解小提琴的情节到底是什么,以及它包含了什么样的信息。
对数正态分布
在第二个例子中,我们考虑对数正态分布,它肯定比正态分布更偏斜。
sample_lognormal = np.random.lognormal(size=N)
plot_comparison(sample_lognormal, 'Log-normal Distribution')
高斯混合物—双峰
在前两个例子中,我们已经看到小提琴图比盒子图包含更多的信息。当我们考虑多式联运配送时,这一点更加明显。在本例中,我们创建了一个双峰分布,作为两个高斯分布的混合。
如果不看直方图/密度图,就不可能在我们的数据中找到两个峰值。
高级用法
小提琴图通常用于比较给定变量在某些类别中的分布。我们在下面介绍了几种可能性。为此,我们从seaborn
加载tips
数据集。
tips = sns.load_dataset("tips")
在第一个例子中,我们看看小费在不同性别中的分布。此外,我们改变了 violin 图的结构,只显示四分点。一些其他的可能性包括point
用于显示所有的观察结果,或者box
用于在小提琴图内绘制一个小方框图。
ax = sns.violinplot(x="sex", y="tip", inner='quartile', data=tips)
ax.set_title('Distribution of tips', fontsize=16);
我们看到,两种性别尖端的整体形状和分布是相似的(四分位数彼此非常接近),但男性的异常值更多。
在第二个例子中,我们研究了每天账单总额的分布。此外,我们按性别划分。我们立刻发现,性别分布形状的最大差异发生在周五。
ax = sns.violinplot(x="day", y="total_bill", hue="sex", data=tips)
ax.set_title('Distribution of total bill amount per day', fontsize=16);
在最后一个例子中,我们调查了与前一个例子相同的事情,但是,我们设置了split=True
。这样做,我们得到的不是 8 把小提琴,而是 4 把——小提琴的每一面对应不同的性别。
ax = sns.violinplot(x="day", y="total_bill", hue="sex", split=True, data=tips)
ax.set_title('Distribution of total bill amount per day', fontsize=16);
结论
在这篇文章中,我展示了什么是小提琴情节,如何解释它们,以及它们相对于盒子情节的优势。值得注意的最后一点是,只要四分位数保持不变,箱线图就不会发生变化。我们可以用四分位数不变的方式修改数据,但分布的形状会有很大的不同。下面的 GIF 说明了这一点。
一如既往,我们欢迎任何建设性的反馈。你可以在推特或评论中联系我。您可以在我的 GitHub 上找到本文使用的代码。
喜欢这篇文章吗?成为一个媒介成员,通过无限制的阅读继续学习。如果你使用这个链接成为会员,你将支持我,而不需要额外的费用。提前感谢,再见!
病毒时尚、网络和统计物理学
模拟德国人为何放弃与互动代理人的关系
“所有的模型都是错误的,但有些是有用的”——乔治·博克斯
2017 年 5 月,当德国总理安格拉·默克尔会见德国汽车制造商戴姆勒和梅赛德斯-奔驰的首席执行官迪特·蔡澈,为一家新工厂奠基时,德国商界的一些人并没有关注增加电动交通投资的信息,而是在学习办公室着装。蔡澈是美国最有权势和影响力的商人之一,他不打领带。
接下来几周的反应是决定性的。据坊间报道,德国企业中打领带的比例从 90%骤降至 10%。
服装上如此迅速协调的变化是怎么发生的?一个可能的解释很简单:蔡澈对什么是合适的影响如此之大,以至于他的行动单枪匹马地改变了绝大多数德国上班族的想法。
另一种解释更复杂,也可能更有见地。着装习惯的突然改变表明,打领带可能不是每个人的首选(几乎所有打领带的人都证实了这一点),而是为了迎合他人。蔡澈的行为打破了在公共场合的这种一致性,也许只有少数人不打领带。这些人的行为会影响其他人,这种影响会在人群中扩散。
这项研究采用了流行病学的方法,表明在工作场所打领带的决定与疾病在人群中传播的方式非常相似。不管多么简单,探索这样一个模型有可能突出趋势和规范如何在社会群体中传播。
How tie wearing evolves after an influencer (red) doesn’t wear a tie for one day. Light colours indicate that a tie is worn, dark indicate that no tie is worn.
该模型假设每个人根据其网络中大多数人前一天的穿着决定每天是否打领带,稍微倾向于不打领带。随着时间的推移,打领带的人口比例显示出与德国一样的大幅下降。
The influencer wears no tie on day 5. The change to a new stable state of no ties is abrupt.
这个过程表明,所有打领带的人群处于一种亚稳态——如果影响者永远不会放弃打领带,那么没有人会放弃,每个人都会无限期地打领带。然而,如果系统被某人(被称为影响者,他们的身份无关紧要)扰乱,行动将会蔓延,没有人会留下领带。这种状态可与过热的水相媲美,纯水即使在 100 度以上的温度下也会保持液态。引起所有水蒸发所需要的只是引入少量污染物以提供成核位置。
Right: Pressure-Density of water, reproduced from “Critical Mass” by Phillip Ball. Left: Hypothetical tie wearing model. The metastable state described previously is at point (a).
此外,模型和示例中描述的这种变化是突然的,似乎不存在领带佩戴者和非领带佩戴者共存的稳定状态,就像液态水和汽化水通常不存在于相同的条件下一样。
当描述水和其他物质的状态时,要用相图来描述物质在不同压力和温度下的相态(固态、液态或气态)。
Source: MIT
这些相似性表明,领带穿着习惯可能有一个相图,它描述了系统的稳定状态如何随着模型参数的调整而变化。这是引入影响者后系统的稳定状态。这让我们可以探索如果人们真的不介意打领带,或者如果蔡澈只影响了一小部分人,德国的情况会发生怎样的变化。
Tie wearing phase diagram starting at state where everyone wears a tie. Black indicates no-tie is stable, grey indicates tie wearing is stable. Influence is measured as the proportion of individuals that are connected to the influencer’s node in the network. Tie annoyance is the size of the penalty to utility from wearing a tie in relation to the utility gained from conforming, a measure of how much individuals would prefer to not wear a tie.
上图表明,蔡澈的影响在决定会议后的最终状态方面并不十分重要,只要至少其他一些人受到影响。然而,有一个最低水平的领带烦恼需要克服的愿望,以符合。
进一步的参数可以调整。稳定状态对网络中的个体数量是鲁棒的,只要平均连接数与个体数量相比是小的。个体之间的联系也可以调整,无论是平均数量还是可变性。
The phase diagrams are produced for a range of connections and connection variability.
随着平均连接数和连接可变性的增加,影响者改变群体习惯的机会减少。此外,在所有连接配置中,影响者的影响并没有产生很大的效果,相反,对关系的厌恶似乎是决定性因素。这是一个合乎逻辑的结论,因为对领带的厌恶是驱动最初的领带佩戴状态变得亚稳定而不是内在稳定的原因。
那么,这个模型有用吗?
这些模拟和由此产生的复杂行为依赖于遵循一套简单规则的一群相互作用的个体。这种简化方法忽略了办公室时尚的细微差别,而这种差别是存在的。忽视他们无疑会让每个人的行为变得错误。然而,这并不意味着整个人口的统计行为是不正确的,只要每个个体决策模型中的误差大致相互抵消。事实上,办公室里的一些人很少注意其他人的着装,而另一些人则确保他们的着装不仅符合标准,而且超出平均水平。通过这些人口规模属性,该模型可以揭示手头的过程,并增强我们对规范如何在社会中传播的理解。在其他应用中,这种类型的模型已经被证明对模拟行人运动和社会政策很有用。
技术说明:
个人决策:
使用以下效用函数,将是否打领带的决定建模为效用最大化问题:
无论哪一个决定(平局或不平局)产生更大的效用,都是当天的决定。
网络布局:
网络被生成为完全连接的随机图。虽然小世界网络更适合用来模拟社会联系,但随机图的使用产生了相似的特征路径长度,并减少了长时间模拟的运行时间。
代码:
所有代码都可以在 Github 的这里获得。
从招聘角度看香港的虚拟银行竞赛
即使你不在找工作,招聘广告也是有用的吗?
Photo by Autri Taheri on Unsplash
如果你一直在关注香港虚拟银行牌照的相关新闻,你可能会听说过这些名字——Livi VB、SC Digital Solutions、ZhongAn 和 WeLab 。前 3 家公司于 3 月 27 日获得香港金融管理局颁发的第一张虚拟银行牌照,WeLab 于 4 月 10 日加入该俱乐部。关于这些公司的信息有限,本文试图通过分析它们的职位空缺来了解更多。
他们是谁?
你可能听说过自 2013 年以来一直在 P2P 融资领域的 WeLab ,以及 2017 年在香港上市的众安母公司,但其余公司对普通大众来说似乎相当“神秘”。
根据SCMP—
香港金融管理局(Hong Kong Monetary Authority)表示,由中国银行(香港)、JD Digits and Jardines、渣打银行(香港)、HKT、PCCW 和携程组成的合资公司 SC Digital Solutions 以及由中安在线和国金资讯组成的合资公司中安虚拟金融(香港)共同拥有的 Livi VB 将成为前三个牌照的运营商
职位空缺:不同的扩展重点
根据他们的商业计划,这些新获得牌照的虚拟银行打算在获得牌照后的 6 至 9 个月内推出其服务。在如此短的承诺期限内,这些公司自确认其银行地位以来一直在更加积极地招聘。
在过去的 2 周里,我一直在收集这 4 家公司的虚拟银行职位空缺。截至 4 月 22 日,我已经从这 4 家公司的各种网上来源收集了 73 个虚拟银行职位空缺。图表中只有 3 家公司,因为我找不到与 Livi VB 相关的角色。通过分析这些新虚拟银行发布的职位空缺,我们可以看到这些公司团队扩张重点的一些有趣模式。
渣打银行、WeLab 和众安也有类似数量的职位空缺,每个都招聘 25 个左右的职位。为了了解每家公司关注的领域,我将这些角色归类到它们相应的业务职能中。例如,角色“高级 FP&A 经理”被归类为“财务”业务功能,“后端开发人员”被归类为“工程**”**等。
我发现下面这张雷达图挺有意思的:
当我们试图在雷达图中将相关的业务功能放在一起时,它揭示了每个公司的相对扩张重点—
渣打银行
- 大量强调扩展技术相关功能(工程、项目管理、安全)
- 风险/合规
- 营销(尤其是在线/社交媒体渠道)
中安
- 当务之急是加强核心业务职能(运营、风险、财务)
- IT 和管理
WeLab
- 与众安类似,首要任务是强化核心业务功能。而众安更强调扩大运营团队,WeLab 目前的重点是扩大财务团队。
- 建立各种营销/关系功能,这在其他两家公司中是没有的——期待更多的营销活动?
- 工程
- 招聘实习生
职位描述中的关键词
除了像扩展焦点这样的高层次见解,如果我们更深入地研究工作描述,还会有其他有趣的发现。
一份工作描述通常至少由两部分组成——(I)角色的职责,以及(ii)角色的要求。职责更多的是关于角色(任务),而要求更多的是关于人(需要的技能)。我将这两个部分分开,并对它们分别应用关键词提取(前 5 个关键词)。
我们使用由名为 textacy 的软件包提供的 SGRank 算法,该软件包在 spacy 的基础上提供了许多方便的 NLP 工具包。SGRank 算法提取的前 5 个关键词相当不错,即使没有任何微调。
比如 WeLab 中的行政助理角色,职责关键词是[“地面交通”、“差旅预订、“商务会议”、“会议日程安排、“级别高管”],需求关键词是[” 沟通技巧、” ms word】、"优秀人际交往、"高度灵活性、"良好英语]。这些很好地总结了角色的性质和所需的技能。
使用单词嵌入和 t-SNE 将角色聚类成组
spacy 为我们提供了名词块和单词嵌入,这在我们试图将单个数据点聚类成组时非常有用。spacy 内置的词性标注器在从给定文本中提取名词块方面做得非常好。这些名词很好的代表了角色性质。
如果你拿到了**。vector** 属性,它将返回名词块的单词嵌入(向量表示)。单词嵌入允许我们量化单词之间的关系(两个单词/短语有多相似)。它甚至使文字上的算术成为可能!
在我们的例子中,我对每个角色的需求列的 noun_chunks 单词嵌入进行了平均,并应用了一种称为 t-SNE 的方法来将 300 维向量减少到(x,y)坐标中。结果显示在由散景创建的交互式绘图中。
如果我们悬停在相邻的点上,我们可以看到这些点之间的一些结构。剧情下部多为工程角色,fullstack 开发者介于前端开发者和后端开发者之间。在左边,行政助理、行政助理、接待员等管理角色彼此靠近,在图的其他部分也存在类似的结构。当人力资源经理/招聘人员试图分析市场上竞争对手的职位空缺时,这种技术可能会很有用。
关闭
我们可以从一家公司的职位空缺中获知很多信息,尤其是当这家公司正在积极招聘时。这可以解释为什么像对冲基金这样的“秘密”行业倾向于通过代理人招聘。
与此同时,职位空缺可以向候选人/投资者/公众传达一个信号,表明你公司的“舞台”或“品味”——你最常聘用的是什么样的角色,这可能会讲述一个关于“舞台”的故事;职位描述中列出的技术/技能很能说明你公司的“品味”。
鉴于这一子行业所享有的优势,虚拟银行的前景只会越来越好。2018 年,渣打银行在租金/建筑相关事务上花费了 7.9 亿 HKD[1],占总运营支出 116.47 亿英镑的 6.78%。当银行可以取消分支机构时,70.74 亿英镑的员工成本可以得到更有效的利用。几年后,零售银行业可能会大不相同。
[1]https://av.sc.com/hk/zh/content/docs/hk-c-ar2018-101.pdf第 256 页
附录:本分析中使用的数据
Python 虚拟环境指南
它们是什么,如何使用它们,以及它们实际上是如何工作的。
The Gate of Dependency Hell: “Abandon all hope, ye who enter here.” Illustration by Gustave Doré.
Python 的虚拟环境让生活变得更加轻松。轻松很多。
☄在本指南中,我们将涵盖虚拟环境的基础知识以及如何使用它们。然后,我们将深入了解虚拟环境实际上是如何工作的。
⚠️注意:在本指南中,我们将在 macOS Mojave 上使用最新版本的 Python 3.7.x。
目录
为什么要使用虚拟环境?
什么是 Virtualenv?!
使用虚拟环境
管理环境
虚拟环境如何工作
延伸阅读
为什么要使用虚拟环境?
虚拟环境为大量潜在问题提供了一个简单的解决方案。特别是,它们可以帮助您:
- 通过允许你为不同的项目使用不同版本的包来解决依赖问题。例如,您可以对项目 X 使用包 A v2.7,对项目 y 使用包 A v1.3。
- 通过在一个需求文件中捕获所有的包依赖,使你的项目自包含和可重复。
- 在您没有管理员权限的主机上安装软件包。
- 通过消除在系统范围内安装包的需要来保持你的全局目录整洁,你可能只需要一个项目。
听起来很方便,不是吗?当你开始构建更复杂的项目并与其他人合作时,你会发现虚拟环境是多么重要。如果你像我一样是一名数据科学家,你也会想熟悉他们的多语言表亲 Conda environments 。
但是首先要做的是。
什么是虚拟?!
到底是什么虚拟环境?
虚拟环境是用于依赖管理和项目 隔离的 Python 工具。它们允许 Python 站点包(第三方库)被本地安装在特定项目的一个隔离的目录中,而不是被全局安装(即作为系统范围 Python 的一部分)。
太好了。这听起来不错,但是什么是虚拟环境呢?嗯,虚拟环境就是一个包含三个重要组件的目录:
最后一点是所有的 s***下降的地方。稍后我们将更深入地了解一下,但是现在让我们看看我们实际上是如何使用虚拟环境的。
Virgil appeases Cerberus — Canto VI. Illustration by Gustave Doré.
使用虚拟环境
创造环境
假设我们想要为一个名为test-project/
的项目创建一个虚拟环境,它有如下的目录树。
test-project/
├── data
├── deliver # Final analysis, code, & presentations
├── develop # Notebooks for exploratory analysis
├── src # Scripts & local project modules
└── tests
我们需要做的就是执行[venv](https://docs.python.org/3/library/venv.html)
模块,它是 Python 标准库的一部分。
% cd test-project/
% python3 -m venv venv/ # Creates an environment called venv/
**⚠️注:**您可以根据您的环境用不同的名称替换“venv/”。
瞧啊。一个虚拟的环境诞生了。现在我们的项目看起来像这样:
test-project/
├── data
├── deliver
├── develop
├── src
├── tests
└── venv # There it is!
♻️提醒:虚拟环境本身就是一个目录。
剩下唯一要做的就是通过运行我们前面提到的脚本来“激活”我们的环境。
% source venv/bin/activate
(venv) % # Fancy new command prompt
我们现在在一个活动的虚拟环境中(由以活动环境的名称为前缀的命令提示符指示)。
在这一点上,我们将像往常一样工作在我们的项目上,安全地知道我们的项目与我们系统的其余部分是完全隔离的。在我们的环境内部,我们无法访问系统范围的站点包,并且我们安装的任何包在我们的环境外部都是不可访问的。
当我们完成我们的项目时,我们可以用
(venv) % deactivate
% # Old familiar command prompt
安装软件包
默认情况下,只有pip
和setuptools
安装在新环境中。
(venv) % pip list # Inside an active environmentPackage Version
---------- -------
pip 19.1.1
setuptools 40.8.0
如果我们想安装一个特定版本的第三方库,比如说numpy
的 v1.15.3,我们可以照常使用pip
即可。
(venv) % pip install numpy==1.15.3
(venv) % pip listPackage Version
---------- -------
numpy 1.15.3
pip 19.1.1
setuptools 40.8.0
现在我们可以在脚本或活动 Python shell 中导入numpy
。例如,假设我们的项目包含一个脚本tests/imports-test.py
,其代码如下。
#!/usr/bin/env python3
import numpy as np
当我们直接从命令行运行这个脚本时,我们会得到:
(venv) % tests/imports-test.py
(venv) % # Look, Ma, no errors!
成功。我们的剧本顺利地引进了🥳.的numpy
Dante and Virgil cross the river Styx — Canto VIII. Illustration by Gustave Doré.
管理环境
需求文件
使我们的工作可以被其他人复制的最简单的方法是在我们项目的根目录(顶层目录)中包含一个需求文件。为此,我们将运行pip freeze
,它列出已安装的第三方包及其版本号,
(venv) % pip freeze
numpy==1.15.3
并将输出写入一个文件,我们称之为requirements.txt
。
(venv) % pip freeze > requirements.txt
每当我们更新一个包或者安装一个新的包时,我们可以使用这个命令来重写我们的需求文件。
现在,我们共享项目的任何人都可以通过使用我们的requirements.txt
文件复制我们的环境,在他们的系统上运行我们的项目。
复制环境
等等——我们到底该怎么做?
想象一下,我们的队友 Sara 从我们团队的 GitHub 库中取出了我们的 T8。在她的系统上,项目的目录树如下所示:
test-project/
├── data
├── deliver
├── develop
├── requirements.txt
├── src
└── tests
注意到任何轻微的不寻常的事情吗?是的,没错。没有venv/
文件夹。我们已经把它从我们团队的 GitHub 库中排除了,因为包含它会引起麻烦。
这就是为什么拥有一个requirements.txt
文件对于复制你的项目代码来说是必要的。
为了在她的机器上运行我们的test-project/
, Sara 需要做的就是在项目的根目录中创建一个虚拟环境
Sara% cd test-project/
Sara% python3 -m venv venv/
并使用咒语pip install -r requirements.txt
在一个活动的虚拟环境中安装项目的依赖项。
Sara% source venv/bin/activate
(venv) Sara% pip install -r requirements.txtCollecting numpy==1.15.3 (from -r i (line 1))
Installing collected packages: numpy
Successfully installed numpy-1.15.3 # Woohoo! 🎊
现在,Sara 系统上的项目环境与我们系统上的环境完全相同。很整洁,是吧?
解决纷争
可悲的是,事情并不总是按照计划进行。最终你会遇到问题。也许你已经错误地更新了一个特定的站点包,现在发现自己处于依赖地狱的第九层,无法运行你项目的一行代码。话说回来,也许也没那么糟糕。也许你只发现自己在第七关。
无论你发现自己处于什么水平,逃离火焰并再次看到阳光的最简单方法是重新创建你项目的虚拟环境。
% rm -r venv/ # Nukes the old environment
% python3 -m venv venv/ # Makes a blank new one
% pip install -r requirements.txt # Re-installs dependencies
就是这样。多亏了你的requirements.txt
档案,你才得以重操旧业。总是在项目中包含需求文件的另一个原因。
Dante speaks with the traitors in the ice — Canto XXXII. Illustration by Gustave Doré.
虚拟环境是如何工作的
你想知道更多关于虚拟环境的事情,是吗?比如活动环境如何知道如何使用正确的 Python 解释器以及如何找到正确的第三方库。
echo $PATH
这一切都归结于路径的值,它告诉您的 shell 使用哪个 Python 实例以及在哪里寻找站点包。在您的 base shell 中,路径看起来或多或少会像这样。
% echo $PATH
/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin
当您调用 Python 解释器或运行.py
脚本时,您的 shell 会按照的顺序搜索路径中列出的目录,直到遇到 Python 实例。要查看哪个 Python 实例路径先找到,运行which python3
。
% which python3
/usr/local/bin/python3 # Your output may differ
也很容易看出这个 Python 实例在哪里寻找带有[site](https://docs.python.org/3/library/site.html#site.getsitepackages)
模块的站点包,该模块是 Python 标准库的一部分。
% python3 # Activates a Python shell
>>> import site
>>> site.getsitepackages() # Points to site-packages folder['/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages']
运行脚本venv/bin/activate
会修改 PATH,这样我们的 shell 会在搜索系统的全局二进制文件之前搜索项目的本地二进制文件*。*
% cd ~/test-project/
% source venv/bin/activate
(venv) % echo $PATH~/test-project/venv/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin
现在我们的外壳知道使用我们项目的本地 Python 实例
(venv) % which python3
~/test-project/venv/bin/python3
以及在哪里可以找到我们项目的本地站点包。
(venv) % python3
>>> import site
>>> site.getsitepackages()['~/test-project/venv/lib/python3.7/site-packages'] # Ka-ching 🤑
理智检查
还记得我们之前的tests/imports-test.py
剧本吗?它看起来像这样。
#!/usr/bin/env python3
import numpy as np
我们能够毫无问题地从我们的活动环境中运行这个脚本,因为我们环境的 Python 实例能够访问我们项目的本地站点包。
如果我们在项目的虚拟环境之外运行来自的相同脚本会发生什么?
% tests/imports-test.py # Look, no active environmentTraceback (most recent call last):
File "tests/imports-test.py", line 3, in <module>
import numpy as npModuleNotFoundError: No module named 'numpy'
是的,我们得到了一个错误— 正如我们应该得到的。如果我们不这样做,这将意味着我们能够从项目外部访问项目的本地站点包,破坏了拥有虚拟环境的整个目的。我们得到一个错误的事实证明我们的项目完全 与我们系统的其余部分隔离。
环境的目录树
有一件事可以帮助我在头脑中组织所有这些信息,那就是对环境的目录树有一个清晰的了解。
test-project/venv/ # Our environment's root directory
├── bin
│ ├── activate # Scripts to activate
│ ├── activate.csh # our project's
│ ├── activate.fish # virtual environment.
│ ├── easy_install
│ ├── easy_install-3.7
│ ├── pip
│ ├── pip3
│ ├── pip3.7
│ ├── python -> /usr/local/bin/python # Symlinks to system-wide
│ └── python3 -> python3.7 # Python instances.
├── include
├── lib
│ └── python3.7
│ └── site-packages # Stores local site packages
└── pyvenv.cfg
Dante and Virgil return to the mortal realm — Canto XXXIV. Illustration by Gustave Doré.
进一步阅读
如果你的好奇心还没有得到满足,你还想了解更多关于虚拟环境的知识,我强烈推荐 Real Python 的关于虚拟环境的极好的入门。如果你发现自己沉迷于古斯塔夫·多雷的出色插图,我强烈推荐你阅读但丁的 地狱 。
除此之外,我们差不多做到了。如果你想了解我最新的数据科学帖子,请随时在 twitter 上关注我。
干杯,祝阅读愉快。
虚拟现实趋势
四大虚拟现实趋势值得关注
Virtual Reality Trends
2019 年对于虚拟现实来说将会是梦幻般的一年。这是改变我们生活、社交和工作方式的技术之一。它正以更快的速度前进。
从一个完全沉浸式的计算机生成的世界到像 Ready Player One 这样给你一个真实世界视图的创新,虚拟现实的进步令人着迷。谁知道 Cox Connect app 还推出了一些针对 Cox bill pay 的 VR 功能。
对虚拟现实的回顾
虚拟现实不是一项为创造另一个世界而设计的独立技术。它能够创造出逼真的现实。这是所有技术中最令人身临其境的。它包括佩戴一个耳机,创造一个 360 度的模拟。用户被放置在一个数字环境中,他感觉自己真的在那里。
另一方面,增强现实用通常由移动设备生成的数字图像覆盖物理环境。Pokémon Go 游戏是 AR 的一个显著例子。它使用玩家的 GPS 位置来寻找和捕捉数字生物。
2019 年虚拟现实趋势
1。虚拟现实和人工智能的增强
没有人工智能VR 的趋势清单永远不完整。这对组合有改变世界的潜力。首先,这两家公司还处于起步阶段,但它们已经出现了一些。
以 Instagram 和 Snapchat 为例。狗脸和其他有趣的滤镜是人工智能和虚拟现实的创造。如果你在寻找一个科学的例子,谷歌的机器学习显微镜是一个完美的例子。这个工具能够突出癌组织。现在就等着 AR 和 VR 创造出什么厉害的东西。
2。消费娱乐
Oculus 已经与 NBA 合作。该品牌正在使用虚拟现实为其用户提供最先进的娱乐。是的,你猜对了。当你戴着 Oculus VR 耳机坐在球场边时,你会感觉好像真的在 NBA 比赛中一样。很酷,对吧?
VR 头戴技术变得比以前更容易获得。不仅仅局限于游戏玩家。电视观众也可以得到娱乐。
3。教育和培训
教育和培训是工作场所中最昂贵和最危险的活动之一。有了虚拟现实技术,组织可以削减成本,为员工提供最好的培训,而不会让他们面临风险。
最近,沃尔玛已经使用了 17,000 个 Oculus Go 耳机来培训其客户服务部门的员工。同样,美国陆军一直在使用微软 HoloLens 技术为士兵提供他们环境的实时更新。
4。旅行和旅游
通过虚拟现实旅行是一种不同的旅行。身临其境的视频让你甚至在打包行李之前就能体验你的目的地。有了虚拟现实,你可以拥有“先试后买”的体验。
如果你认为你会觉得在邮轮特等舱幽闭恐惧症,那么为什么不测试水域?也许你穿西装会感觉更好。虚拟现实允许你在预订之前探索游轮房间以及酒店房间。
除了检查你的房间,你还可以看到街景,检查场地和附近的餐馆。有了这个虚拟旅游,你可以决定你为自己挑选的目的地是好是坏。
这还不是全部,有了 VR 旅行 app,你甚至可以在回国后重温假期。这是你肯定会珍惜的东西。
VR 的未来如何?
专家表示,虚拟现实的未来是基于位置的。但是等等,这和 GPS 技术无关。基于位置意味着将虚拟现实体验带给用户,无论他们身在何处。他们无需购买就能接触到技术。
然而,为此,客户需要意识到虚拟现实的主动性。他们一定也对家用虚拟现实感兴趣。它还有很长的路要走。
结论
当今时代的消费者追求的是体验。VR 有能力在未来的学习和发展中发挥巨大的作用。通过虚拟仿真,用户可以以很少的成本获得真实的生活体验。
虚拟现实的未来仍在发展中。这很像不同频道的考克斯频道阵容。并非所有受欢迎的频道在所有地区都可用。一些虚拟现实技术和应用已经投入使用,但大部分仍在开发中。
可视化 100,000 件亚马逊产品
快速句子嵌入 (fse) 使您能够在几分钟内计算数百万条评论的句子嵌入。
t-SNE Mapping of 100,000 Amazon Products. © Oliver Borchers
本文中的 fse 代码可能会被弃用。请确保使用Github上概述的更新代码。
介绍
在我的博士研究中,我经常研究句子嵌入。更具体地说,我使用平均[1]和平滑逆频率(SIF)[2]嵌入。虽然 Github 上的原始实现非常有用,但我总是发现它们很难集成到我使用的任何 NLP 管道中。这是由于非标准化的接口和缺乏优化。因此,我决定在一个优化的包中实现 Average、SIF 和 uSIF [3]嵌入,这个包巧妙地集成到 Gensim 中。部分是因为我喜欢挑战,部分是因为我需要好的工具。这个包叫做 fse ,在 Github 和 Pypi 上都有。看看教程笔记本看看它是怎么工作的。
pip install -U fse
您将需要常规的 Python (>3.6)包,特别是 Numpy、Scipy、Cython 和 Gensim。
TL;DR:如果你需要快速的句子嵌入,就用:
from gensim.models import FastText
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
ft = FastText(sentences, min_count=1, size=10)from fse.models import Average
from fse import IndexedList
model = Average(ft)
model.train(IndexedList(sentences))model.sv.similarity(0,1)
这篇文章是为技术数据科学受众而写的。我们将探索如何使用快速句子嵌入来可视化众所周知的亚马逊评论数据集。这个故事中使用的交易工具是 fse 、FIt-SNE 和 Tableau。
这条管道的结果显示在本文的第一张图中。在这篇文章的最后,你会发现一个交互式 Tableau 地图的链接,可以浏览所有 100,000 种产品。
关于这个库内部工作的更详细的介绍,请随意阅读我的第一篇关于句子嵌入的文章。
数据
如果你和 NLP 一起工作,你很可能已经听说过公共的斯坦福亚马逊评论数据集。三年前,我收到了朱利安·麦考利的完整版本,用于我的市场营销博士研究,并不时地继续使用它。第二大类别是“电子产品”类别,共有 7,824,482 条评论。知道里面到底有什么不是很好吗?
为了获得每个产品的嵌入,我们需要评论数据和元数据。两者都由唯一的 Amazon ASIN 标识符连接。我已经准备好了一个很好的熊猫数据框架(不允许我分享)。让我们来看看元数据:
Metadata of Amazon Reviews. © Oliver Borchers
为了实际可视化数据(例如,将每个产品表示为一个可映射的向量),我们只能使用每个产品的评论。因此,我们正在处理多对一嵌入。在过滤掉少于 10 条评论的 asin 后,我们最终得到 97,249 条唯一 asin 和 6,875,530 条评论。
我们不对文本数据进行任何预处理。
为什么?
因为。
从评论到产品嵌入
为了获得每个评论的嵌入,我们首先需要某种预训练的嵌入。评论很可能包含许多不认识的单词。幸运的是, fse 提供了开箱即用的 FastText 模型支持。我们首先加载公开可用的 FastText 模型:
from gensim.models.keyedvectors import FastTextKeyedVectors
ft = FastTextKeyedVectors.load("../models/ft_crawl_300d_2m.model")
接下来,我们实例化来自 fse 的 SIF 模型。
from fse.models import SIF
model = SIF(ft, components=10, lang_freq="en")
组件的数量等于 10,这在 STS 基准再现性部分中报告。
请注意 lang_freq 参数。一些预先训练的嵌入不包含关于语料库中词频的信息。 fse 支持多种语言预训练模型的词频归纳,这对于 SIF 和 uSIF 模型是必不可少的(这可能需要一段时间,取决于您的词汇量)。
所有的 fse 模型都要求输入是一个元组列表。元组的第一个条目是标记列表(句子),第二个条目表示句子的索引。后者确定句子被添加到嵌入矩阵中的目标行。我们稍后将在单行上写多个句子(评论)(多对一)。
s = (["Hello", "world"], 0)
fse 提供了多个输入类,它们都提供了不同的功能。有 6 个输入类可供选择:
- IndexedList:用于已经拆分的句子。
- 索引列表:对于已经预先拆分的句子,每个句子有一个自定义的索引。
- SplitIndexedList:用于未拆分的句子。会分裂琴弦。
- Split C IndexedList:用于未拆分的句子,每个句子有一个自定义索引。
- SplitIndexedList:用于未被拆分的句子。会分裂琴弦。您可以提供自定义拆分功能。
- CSplitCindexed list:用于你想提供自定义索引和自定义 Split 函数的句子。
- IndexedLineDocument:用于从磁盘上流式传输句子。可编入索引以方便搜索相似的句子。
这些是按速度排序的。也就是说,IndexedList 是最快的,而CSplitCindexed list 是最慢的变体(调用越多=越慢)。为什么要上多节课?因为我希望每个 getitem 方法有尽可能少的代码行,不会降低计算速度。
对于我们的审查数据,我们使用 Split C IndexedList,因为我们不想预分割数据(预分割 700 万)。评论会占用大量内存)。在内部,该类将指向我们的评论,并且只在您调用 getitem 时执行预处理。
from fse import SplitCIndexedListreview = ["I really like this product.", "Its nice and comfy."]
s = SplitCIndexedList(review, custom_index = [0, 0])
print(s[0])
print(s[1])>>> (['I', 'really', 'like', 'this', 'product.'], 0)
>>> (['Its', 'nice', 'and', 'comfy.'], 0)
注意,两个句子都指向索引 0。因此,它们都将被添加到索引为 0 的嵌入中。为了将每个 ASIN 映射到一个索引,我们只需要一些更方便的函数。
from fse import SplitCIndexedListASIN_TO_IDX = {asin : index for index, asin in enumerate(meta.index)}indexed_reviews = SplitCIndexedList(data.reviewText.values, custom_index = [ASIN_TO_IDX[asin] for asin in data.asin])
既然一切都准备好了,我们可以打电话了
model.train(indexed_reviews)
该模型在具有 16 个内核和 32 GB ram 的云实例上进行训练。整个过程大约需要 15 分钟,大约 8500 条评论/秒。每条评论平均包含 86 个单词,我们总共遇到 593,774,622 个单词。我们将大约 700 万条评论压缩成一个 10 万* 300 的矩阵。添加更多的工人没有什么区别,因为预处理(分割)是瓶颈。
如果你的数据已经预先拆分,在普通的 MacBook Pro 上你可以达到每秒 500,000 句。如果你想了解更多,可以看看教程笔记本。
使用和可视化嵌入
在训练句子嵌入之后,我们可以通过索引或完整的嵌入矩阵来访问每个单独的嵌入。该语法尽可能接近 Gensims 语法,以便于使用。
model.sv[0] # Access embedding with index 0
model.sv.vectors # Access embedding matrix
相应的 Sentencevectors (sv)类提供了相当多的函数来处理生成的句子嵌入。例如,您可以使用相似性、距离、最相似、按单词相似、按句子相似或按向量相似。
如果我们回到标准的 sklearn t-SNE 实现,可视化这么多数据可能需要非常长的时间。因此,让我们尝试一种更优化的方法: FIt-SNE 。这种优化的 t-SNE 实现利用傅立叶变换来加速 t-SNE 的计算。请随意阅读这篇论文。它工作起来很有魅力,使用了机器的所有 16 个核心。
import sys; sys.path.append('../FIt-SNE')
from fast_tsne import fast_tsnemapping = fast_tsne(model.sv.vectors, perplexity=50, seed=42)
计算完映射后,我们已经有效地完成了最困难的部分。将元数据中的一些信息添加到每个点,我们最终可以将所有内容导出到 Tableau。
表格映射
要访问相应的图形,请访问我的公共 tableau 页面:
您可以将鼠标悬停在每个点上,获取关于产品价格、名称、品牌等信息。
观察嵌入,我们观察到每个聚类中包含相当多的信息。
Map of Amazon Reviews. © Oliver Borchers
此外,我研究了数据,并手动标记了一些聚类,以确定这些聚类的形成是否至少在某种程度上是有效的。看起来映射捕获了评论中包含的大量信息。
请记住:我们所做的是平均每个评论的所有单词,并总结所有评论。我对使用简单的基于平均值的嵌入所能实现的东西感到非常震惊。
Manual Category Labels of Amazon Reviews. © Oliver Borchers
结论
句子嵌入是自然语言处理流水线的重要组成部分。这篇博文展示了如何使用快速句子嵌入、FIt-SNE 和 Tableau 来可视化众所周知的亚马逊评论数据集。
我希望你能从使用 fse 中找到乐趣。请随时建议可能有用的进一步模型或功能。
相应的 fse 包可在 pip / Github 上获得,为数据科学家提供了一种快速计算句子嵌入的方法。
如有疑问,欢迎联系 me 。
如果你喜欢这些内容,别忘了关注我:-)
附加说明
这篇文章的代码可以在 Github 和 pip 上找到:
pip install -U fse
文学
- Iyyer M,Manjunatha V,Boyd-Graber J,Daumé III H (2015)深度无序合成与文本分类的句法方法相匹敌。继续。第 53 届 Annu。见面。协会计算机。语言学家。第七国际。Jt。糖膏剂纳特。郎。过程。, 1681–1691.
- Arora S,Liang Y,Ma T (2017)一个简单但难以击败的句子嵌入基线。里面的糖膏剂学习。代表。(法国土伦),1-16 岁。
- Ethayarajh,Kawin (2018)无监督随机行走句子嵌入:一个强大而简单的基线。NLP 表征学习第三次研讨会会议录,91–100。
- 林德曼 G C,拉赫 M,霍斯金斯 J G,斯坦纳伯格 S,克鲁格 Y (2019)基于快速插值的 t-SNE,用于改进单细胞 RNA-seq 数据的可视化。自然方法(16),243–245 页。
放弃
所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。作者对本网站内容的任何错误或遗漏不承担任何责任或义务。本网站包含的信息按“原样”提供,不保证完整性、准确性、有用性或及时性。
视觉失认症:一个神经网络类比
Visual Agnosia: Intricate Brain Imbroglio
本周,我开始阅读奥利弗·萨克斯博士的故事《把妻子错当成帽子的男人》,这是一个引人入胜的故事,讲的是一位失去视觉解读能力的 P 博士,这种能力在神经学上被称为视觉失认症。故事从对他的症状的粗略描述开始,逐步发展到详细描述他进入功能失调的视觉系统的妄想世界。从一个具有深刻视觉想象力和判断力的人到一个像卷积神经网络一样以非常抽象的方式看待世界的人,这是一种诗意的衰退。我越来越多地阅读这个故事,不禁将它与表现糟糕的卷积/胶囊/RNN 网络和相应的生成网络相提并论,试图用一些其他图像来弥补不足。
在这篇文章中,我提出了一些理论,你可以称之为未经训练的头脑的漫谈,可能是一个长镜头,将神经心理学和深度学习两个不同领域的片段放在一起。考虑到激发这篇文章和最初故事的音乐家 P 博士的情况,这似乎是合适的。虽然,要注意的是,这篇文章只是理论上的,没有实验基础,所以它的论点应该被大量的盐(不是一点点我的意思)。
理论 1:缺失神经元理论
**症状:**视觉皮层 esp 丢失部分图像。像人脸一样的动画。有时这些脸会出现在随机的地方,比如柱子等。视觉缺失的部分被其他东西代替,比如一顶帽子代替了 P 博士妻子的头。
**假设:**顶叶和枕叶部分神经元的脱落/失活。
**解释:**P 博士表现出的无法识别面孔的症状或这些面孔被帽子或鞋子等无生命物体取代的情况,可能是由于右半球的病变/肿瘤而导致一些神经元不放电的情况,以及大脑通过产生随机意象/视觉来填补这种功能障碍所导致的缺陷的绝望尝试。我想用一张图表来说明这一点,这张图表应该模拟了你前额叶皮层中的一些神经元,至少我希望如此。
Defective visual discriminator and adversary
如果你看到上面的图表,很明显,在试图识别它通过眼睛接收的视觉信息的鉴别器网络中有一些错误。问题可能在于这个过程中的一些关键神经元已经停止运作。因此,大脑中的视觉皮层生成的图像是不完整的,因为它几乎正确地获得了各个部分,但在某些方面却缺失了,这妨碍了整体场景的创建。
为了弥补这一缺失,大脑生成了另一个片段,比如一张脸,并用这一片段来填补那些缺失的地方。但问题是,这个生成的脸被预期为对场景的上下文是正确的,因为应该告诉生成网络这个脸是否合适的对手本身缺乏一些神经元,因此呈现出扭曲的判断。
可能的处理:
一种可能的治疗方法是开出能够重新触发或模拟顶叶和枕叶神经元的药物。
第二种方法可能是重现病人遇到这些场景或人的某些场景,这样仍然完整的记忆可以用来重新点燃这些神经元。
同样,所有这些治疗建议都只是瞎猜,并不是基于彻底的研究。
理论 2:情感缺失
**症状:**P 博士无法识别他的学生/人,尽管他能够识别出诸如长鼻子、卷发或身高等个人特征。这意味着视觉的病理部分没有问题。除此之外,他以一种非常抽象、粗略的形式识别人,就像一台机器主要是 CNN,它的卷积层识别特征,最大池增加了一般化所必需的不变性。另一个限制是他能够通过听到人们的声音或他们演奏的音乐来识别他们。这就像失去的与视觉刺激相关的人类触觉/情感部分通过听觉重新获得。
**假设:**大脑右半球和杏仁核控制的情绪都有问题。这些情感是我们生活中与人联系的基本要素,是增加亲密关系的桥梁,是识别我们的朋友和家人的基本要素,就像是我们的视觉系统所依赖的 KPI 或独立变量。我想提出的理论是,由于杏仁核的功能障碍,这些情绪在网络的输入中缺乏,这导致 P 博士无法识别人。
Emotional Deficit Compensated By Music
音乐起作用的原因是,它刺激杏仁核唤起与某个情况或某个人相关的情绪,并加强输入向量,以便视觉识别起作用。
可能的处理:
一种可能的治疗是再次刺激杏仁核中的神经元/腺体,以产生进入大脑视觉识别机制的情绪输入。这些神经元可以通过讲述能够重现相同视觉意象的故事来激活。
另一种方法是重现能够唤起与一个人相关的记忆的情景,从而激活杏仁核的相同部分,重现相同的情绪。通过这种方式,输入将得到加强,并可能协调分离的部分。
理论 3:节奏难题
**症状:**如果 P 医生在进行身体活动或动作时哼的歌曲受到干扰,他似乎会失去对该身体活动或动作的上下文/判断。这也许是他表现出的最奇特的症状。P 博士似乎失去了很多识别和判断的能力,但他失去了什么,他得到了音乐敏锐度。这意味着,如果他一边哼着一首特定的歌曲,一边进行像刮胡子这样的动作,他就像一台加满油的机器,像正常人一样进行活动,但一旦像敲击这样的小事打破了他的节奏,他就会失去所有的上下文,并陷入停顿,直到同一首曲子以某种方式重新点燃精神进步。
**假设:**一个动作的序列有一个时间维度。与神经网络世界中的 RNN 平行的那个。在这种情况下,该 RNN 是编码器解码器网络,其中编码器将过去的动作编码成上下文向量,并将其输入到解码器以预测接下来的动作。在 P 博士的例子中,这个特殊的背景向量似乎在每个时间步都被大脑产生的音乐所强化。这种音乐在某种程度上给我们提供了一种注意力环境,告诉大脑注意什么和什么时候注意。但是一旦音乐停止,这个上下文就丢失了,解码器停止获得下一个时间步长的任何信息,并且变成空白。这导致了上下文和运动的丢失。
Missing context reinforced by music attention
可能的处理:
通过语音指令重新训练大脑。一遍又一遍地重复它们,直到活动完成。这可能有助于激活休眠的神经元。然后慢慢地开始让说明变得稀疏,然后完全放弃它们,让这个人自己建立那个环境。
机器人视觉注意力
利用视觉任务聚焦注意强化视觉运动策略
Teacher-Student framework for the task of robotic object manipulation. Please read our CVPR 2019 paper for more details. Also, the code and data are available on our project page.
物体操纵是机器人研究的主要任务之一。通过演示训练策略神经网络是设计视觉运动策略的一种方式。然而,重新编写演示既昂贵又耗时。此外,在记录训练演示样本后,环境可能会发生变化。例如,在测试期间,未知物体可能进入机器人的视觉场景。在这种情况下,大多数视觉运动策略都会失败,因为它们遇到了一个看不见的状态。此外,干扰可以是物理的或视觉的,这意味着某些东西可以干扰或接触物体一会儿,并阻止机器人完成工作(物理干扰)或只是机器人摄像机输入流中的一些意外视觉模式(视觉干扰)。由于存在无限的干扰场景,为每一个可能的物理干扰收集训练样本是不切实际的。
我们研究了一种在良性条件下训练策略神经网络的方法,这意味着在训练期间零干扰,同时在测试时间对物理/视觉干扰具有鲁棒性。
秘密成分?视觉注意!
我们设计了一个师生系统,从输入帧中提取丰富的特征,这些特征对看不见的干扰具有鲁棒性。我们的教师网络是一个简单的文本(机器人的任务)框架接地(作为注意力地图)网络。我们称之为任务聚焦视觉注意(TFA)。
学生网络是一个可变自动编码器(VAE)-GAN,它不仅试图重建输入帧,而且试图模仿教师网络产生的注意力。这是知识升华的一种形式。教师网络可以捕捉任务(在我们的实验中是自然语言句子)来构建知识,而学生网络可以通过模仿教师的行为来获得相同的知识,并提供移动机器人的运动网络。
我们表明,学生网络不仅可以学习注意力,还可以产生对干扰具有鲁棒性的特征。知道干扰会在注意过程中被忽略。
请阅读我们的论文了解更多详情。
此外,代码和数据可在我们的项目页面上获得。
请不要犹豫提出你的问题。
您也可以观看我的 YouTube 演示,了解更多详细信息和讨论:
视觉贝叶斯:你的伴侣忠诚吗?
什么可以解释伴侣手机上一个未知号码的心形表情符号?
“Just relax” says Bayes. Source
在大学期间,我收到了许多关于贝叶斯定理的令人不满意的解释。第一次是在统计 101。教授只是把公式写在白板上,让我们背下来。给定一个问题陈述,只需将变量输入公式,得到输出,得到一个 a。更像是一个 b。
我遇到的第二个解释使用了一棵树。它可以在 YouTube 视频这里找到。问题是不够直观。要处理的信息太多了,你无法在你祖母看电视的时候向她解释。
接下来,我尝试了一门名为“社会科学家数据分析 T2”的在线课程。麻省理工学院讲师萨拉·费希尔在几次讲座中讨论了这个定理。甚至她声明这不是很直观。在内特·西尔弗写出《信号和噪音》之前,我对一个简单且持续不断的解释失去了所有希望。
这是迄今为止我发现的最好的解释,我将尝试给它一个我在别处找不到的视觉扭曲。在我看来,贝叶斯定理允许决策者就一个困境提出 3 个问题。这是测试你的勇气和减少偏见的一种方式。
想象一下,你在伴侣的手机里看到一条短信,上面有一个来自未知号码的心形表情符号。他/她欺骗你的可能性有多大?你发现的新的证据是文本,你试图估计你的伴侣在哪里出轨的假设。如果你愿意探究 3 个问题,我们可以找到你的伴侣出轨的可能性。
- 忘掉证据。她/他欺骗你的可能性有多大?这就是所谓的先验。如果你没有看到这篇文章,你认为你的伴侣出轨的可能性有多大?这很难考虑,尤其是当你情绪激动的时候,但是这是减少你自己偏见的第一步。研究发现,在任何一年的任何一方,这个数字都是 4%。
- 假设她/他没有作弊,那么文本出现的几率有多大?所以,最好的可能情况:这只是一场误会。我们假设他们是忠实的。什么能解释这篇文章?一个密友?对一张图片的反应?也许他的某个家庭成员换了手机?我们给它分配 50%的概率。
- 鉴于她/他在欺骗,那么该文本出现的几率有多大?最坏的情况。如果他们在欺骗,那么新来的人给他们发短信是有道理的。话说回来,他们会更加小心。我们给它 70%的机会。
综上所述,你需要估计三件事。一个清白概率没有任何证据的情况下,给出证据的最好情况的几率和给出证据的最坏情况的几率。对于任何决定来说,这是 3 件值得考虑的事情。每当你收到有影响力的新闻时,就后退一步,想想用贝叶斯框架来看待它是否有意义。
内特用一个不同的事件作为证据:你在卧室里发现了不属于你的内衣。
Chapter 8: The Signal and the Noise
使用我们的数字:
- 先前(x): 4%
- 最坏情况(y): 70%
- 最佳情况(z): 50%
- 结果(后验):5%
内特的数字导致了更高的后验概率。但是有道理。他认为最好的情况是 5%。很难想象为什么内衣会出现在卧室里,如果它们不是出轨的话。在我们的例子中,一个文本可以有多种解释。毕竟,心形表情符号在很多情况下都是有用的。
当然,在这个例子中,最坏和最好的情况概率是主观的。然而,好消息是你可以在任何给定的情况下分配你自己的权重。
直观解释
这里有一个链接供您更改输入:
https://www.desmos.com/calculator/gyb1jzchr8
让我们把注意力集中在积极的象限。x 是“干净概率”。可以确定另外两个量,求后验如何反应(Y)。
增加“最佳情况©”的机会将线条拖到右下角。因此,即使有很高的先验,如果最好的情况有很高的概率,后验概率也不会很大。听起来像是我们的场景。有人收到心形表情符号的概率相当高。Bayes 说“放松就好”。
增加“最坏情况(a)”的几率将线条拖到左上角。如果最坏的情况发生的可能性很大,你应该更加谨慎。
这是一个非常对称的图表,显示了这个定理是多么的基本。希望这能节省你理解它的时间。如果你想深入数学,我推荐这篇文章。推导定理并不疯狂。如果你对配方本身感兴趣,更多信息请点击这里或这里。如果你想看这个定理的实际应用,点击这里或者这里。在下一篇文章中,我将使用 Desmos 来解释一个非常基本的神经网络。欢迎任何评论!
视觉深度计算机视觉
或者你如何在不是专家的情况下运行计算机视觉的深度学习算法。
介绍
深度学习已经推动并解决了各种计算机视觉问题,如对象检测、运动跟踪、动作识别、人体姿势估计、语义分割等。
由于卷积神经网络(CNN ),该领域的最大进步已经成为可能。CNN 具有独特的特征学习能力,即基于给定数据集自动学习特征。CNN 对于变换也是不变的,这对于某些计算机视觉应用来说是一个巨大的资产。
你可以在这里了解更多信息:
导师指导的学习指南,以应对 Coursera 深度学习专业化课程 4
towardsdatascience.com](/convolutional-neural-networks-for-all-part-i-cdd282ee7947)
请观看 Brandon Rohrer 关于他们的精彩视频:
我们通常是怎么做的
通常我们用深度学习编程来做计算机视觉,学习新的 API,有些比其他的更难,有些真的很容易,比如 Keras 或 PyTorch。为此,你需要理解深度学习、计算机视觉概念、OpenCV 等等。但是有一个问题。
如果你想运行实验,测试不同数量的时期,参数,估计,优化等等。当你编程时,这些事情开始变得复杂。在这里,我想向大家展示一个非常简单但非常强大的方法,用深度学习通过一个叫做深度学习工作室的平台来做计算机视觉。
新的方式
我之前已经讨论过这个平台,如果你想对它有一个大概的了解,可以看看这些文章:
在过去的一个月里,我有幸见到了 DeepCognition.ai 的创始人
becominghuman.ai](https://becominghuman.ai/deep-learning-made-easy-with-deep-cognition-403fbe445351) [## 深度认知的视频漫游
大家好!在本文中,我将与您分享几个视频,带您浏览深度认知的平台…
towardsdatascience.com](/a-video-walkthrough-of-deep-cognition-fd0ca59d2f76)
但在这里,我想向你展示三个使用深度计算机视觉平台的超级有用的方法。
1.上传你的 Keras 模型并训练它
假设您在自己的 jupyter 笔记本或 IDE 中创建了 Keras 模型。您希望使用该平台的所有功能。这很简单。
你要做的就是去站台:
我们想邀请您在 3 月 26 日至 29 日的 GPU 技术大会上加入 Deep Cognition 的团队,展位号为 1035…
deepcognition.ai](https://deepcognition.ai/)
并启动 app(你得先创建一个账号,是免费的 btw)。当你进入平台时,你会看到:
然后点击箭头上传你的模型。我们将在 Keras 中尝试使用带有卷积网络的 CIFAR-10 模型。这里重要的是:这个模型应该与 Keras 1.2.2 兼容,这是我们目前唯一的限制。
我们将上传合作创建的模型,您可以在此处访问:
人类的深度学习。通过在 GitHub 上创建一个帐户,为 keras-team/keras 开发做出贡献。
github.com](https://github.com/keras-team/keras/blob/keras-1/examples/cifar10_cnn.py)
如果你想从这里复制,我创建了一个要点:
在尺寸订购部分选择否。
之后,一个新的项目将会以 Python 文件的名称创建。然后点击打开,你会看到:
在数据部分选择 cifar-10-public,以便能够训练模型。顺便说一句,如果你想训练一个不同的模型,你可以上传你自己的图像数据集。
现在,如果您单击 Model 选项卡,您将看到刚刚上传的代码的可视化表示:
你可以玩玩它,看看不同的选项。在那里你可以改变你的超参数,当然也可以训练模型。
我将这个配置用于超参数:
然后你去训练你的模型。在下面的视频中,您可以看到如何使用培训选项卡解决不同的问题:
2.将您的 Keras 代码转换为 Tensorflow、Pytorch、MXNet 等
有时你的经理或公司会要求你在不同的框架中编写你的深度学习算法。如果你没有时间学习 X 数量的新 API,你可以很容易地将 Keras 代码转换成不同的框架。
在模型选项卡中,只需点击<>按钮,您将看到:
在可用选项中,您可以在不同的框架中获得您的模型:
Pytorch :
张量流:
你可以免费得到所有这些。你甚至可以下载一个桌面版本并使用你自己的 GPU,点击这里查看:
Deep Learning Studio - Desktop 是在您的硬件上本地运行的单用户解决方案。桌面版允许您…
deepcognition.ai](https://deepcognition.ai/products/desktop/)
3.将您的模型部署为 Web 服务或 REST APIs:
Having a magic button to deploy your models would be awesome.
当你完成你的模型,可悲的是很多时候它会永远留在你的电脑上。这太可悲了。想象一下,一个画家不能向任何人展示他的杰作。
通过 DLS 的部署功能,您将能够看到自己和他人的模型在运行。
让我们看看如何做到这一点。
当你建立你的实验时,你给它们命名。我将部署一个由 SGD 优化的模型,命名为 sgd-2(这只是一个名字):
在推理/部署选项卡中,单击部署:
选择运行,创建服务名,然后选择是要使用正在使用的实例还是远程实例进行部署。
如果你这样做,它会问你更多的信息。我将使用我的云实例进行部署:
之后,您将会看到类似这样的内容:
如果您还记得,CIFAR-10 数据集由 10 类 60000 幅 32x32 彩色图像组成。这些类是飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。所以我们试着上传一张飞机的图片,看看模型能不能探测到。我将用这张船的图片:
http://www.seatrade-cruise.com/media/k2/items/cache/3356e0cd9331018e19a8cee016f484a2_XL.jpg
记住我们模型船中的是第 8 级。所以我只需点击上传面板:
点击提交,我们看到:
现在你知道了!您自己的具有深度学习的计算机视觉模型部署起来超级容易!
结论
生活已经够艰难的了,让它变得更加艰难。如果你是一名程序员、数据科学家、机器学习工程师或类似的人,我可以向你保证,我在这里展示的一些内容正在让你日复一日地奋斗。
借助这些工具,您可以满怀信心地轻松试验、测试和部署您的计算机视觉问题(以及更多问题)。我希望你能从中发现价值。
稍后我会添加更多不同主题的示例:)
成为数据科学家的视觉指南
现在是进入数据科学的最佳时机!
我们生活在一个前所未有的数据创造时代。我们参与的每个流程都是数字化的,并且会留下数字足迹。这意味着需要收集、利用和提取有用信息的数据。这就是为什么现在是成为数据科学家的最佳时机。这里有一个成为其中一员的视觉指南。
How to become a Data Scientist in easy, visual steps.
开始学习
这是数据学习的开始:
GitHub 上的项目
然后,您应该开始在 GitHub 上构建一个数据科学项目组合:
数据科学书籍
你绝对应该开始阅读关于数据科学的书籍。以下是您开始的标题:
成为一名优秀的数据科学家
如果你有你的 GitHub 作品集,读了一两本书,你可能会开始找工作。以下是一些关于数据科学求职的建议:
数据科学工作类型
你应该记得有不同类型的数据科学工作:
工作访谈
最后,当你准备好并研究了你想去工作的公司后,你应该为面试做准备:
一锤定音
如果你已经做到了这一步,你应该准备好找到你的第一份(或第二/第三份)数据科学家工作。恭喜你!现在开始最激动人心的冒险。
Data Science Job
最后,如果你想了解成为一名数据科学家意味着什么,那么看看我的书数据科学工作:如何成为一名数据科学家,它将指导你完成这个过程。
祝你好运!
数据科学可视化指南
厌倦了阅读关于进入数据科学的长文?这是最短的一个。
数据科学是目前最热门的工作之一。全球有大量的机会,而且肯定会更多,因为我们才刚刚进入数据时代。那么,为什么不自己成为一名数据科学家?这应该是视觉引导,使你容易。那就是我:
Hello!
步骤 0:修改你的统计学和线性代数
第一步:阅读数据科学书籍从 Python 开始
第二步:在 GitHub 上建立一个开源项目组合。使用 Kaggle 数据集。
第三步:免费学习哈佛和其他好地方的在线课程!
第 4 步:准备数据科学面试
第五步:永远不要停止学习!
让我知道你如何喜欢这个指南,你会有什么建议。
如果你喜欢我创造的东西,请关注我的媒体频道或订阅我的 YouTube 频道,在那里我也每天谈论数据科学和机器学习。
最后,如果你想了解成为一名数据科学家意味着什么,那么看看我的书数据科学工作:如何成为一名数据科学家,它将指导你完成这个过程。
Data Science Job
用 KMeans 进行聚类的直观介绍
通过二维和三维空间以及交互式图形中的可视化方式直观了解 KMeans 聚类
聚类是一种无监督学习,当我们事先不知道数据中的每个观察值属于哪个组时,我们会使用它。
用于聚类的 KMeans 算法基本上由 5 个步骤组成:
- **第一步:**选择簇的数量 K
- **第二步:**随机选择 K 个点作为聚类中心
- 步骤 3: 将每个数据点分配到最近的质心
- 步骤 4: 计算并放置每个聚类的新质心
- 步骤 5: 重复步骤 4,直到没有观察值改变聚类
因此,让我们先看看我们将使用的数据,然后再进入下一步。
加载数据
**In [1]:**import pandas as pd
data = pd.read_csv('mall.csv')
data = data.drop(['CustomerID', 'Genre'], axis=1)
data.head() **Out [1]:** **Age Annual Income (k$) Spending Score (1-100)**
0 19 15 39
1 21 15 81
2 20 16 6
3 23 16 77
4 31 17 40
注意:我只放弃了流派特性,因为二进制数据在可视化时看起来不那么吸引人。这个功能本来也可以用的。
该数据描述了商场中顾客的 3 个特征,总共有 200 次观察。在接下来的步骤中,我们将只处理年收入(k$)和支出分数(1-100 ),并将其可视化为二维。稍后我会用所有的数据展示它在三维空间中的样子。
第一步:选择簇的数量K
不幸的是,对于聚类来说,没有找到准确的聚类数的终极方法。然而,有相当多的好工具可以帮助你,其中之一就是使用 yellowbrick 库中的 KElbowVisualizer。正如你在下面看到的,自动“肘”检测器说 5 个集群将是最好的选择。我们选择最佳点的方法是找到曲线上开始变平最多的点(这导致大量的自我解释)。
通过绘制数据,我们可以看到,这看起来确实是数据中合理的集群数量。
第二步:随机选择 K 个点作为聚类中心
在我们的下一步中,我们基本上只是在图上选择 5 个随机点作为初始聚类。
步骤 3:将每个数据点分配到最近的聚类
在下一步中,我们只需计算所有观测值到每个聚类的距离,并找出距离最小的聚类,这将是该观测值将被分配到的聚类。我们使用的距离就是我们所说的欧几里德距离,这只是直接距离的一种数学说法。
步骤 4:计算并放置每个聚类的新质心
这是我们看到算法开始工作的一步,捕捉数据中的模式。对于数据集中的每个聚类,我们计算分配给该聚类的观察值的平均年收入(k$) 和平均支出分数(1-100)。我们看到,紫色的聚类在中间获得了相当多的分配给它的观察值,这意味着支出得分(1–100)的平均值很可能会向上和向左移动一点(这意味着当我们移动聚类时,它可能会更接近最初没有连接到该聚类的其他观察值)。我们看到在下一张图中也是这种情况,星星显示了星团的初始位置。注意一些观察是如何改变聚类的。中间几乎所有的观测都和现在的紫色星团有联系。
步骤 5:重复步骤 4,直到没有观察值改变聚类
最后,我们只需重复第 4 步,直到没有观察值改变集群,我们有我们的最终集群指定。对于下图,我们只是在第二次迭代,我们看到集群已经看起来相当合理。实际上,我们可能需要重复第四步一到两次,才能让星团稳定在它们真正的中心。
在三维空间中可视化
实际上,当我们进入高维空间时,KMeans 聚类并没有什么不同。唯一的区别是,当我们超过 3 个特征时,我们就不能再想象它了。让我们试着检查一下星团在三维空间中的样子。
获取代码
If the code does not appear properly, you can click the filename at the bottom and jump directly to GitHub or download the Jupyter Notebook directly here: click here.
我希望这篇简短的介绍和对 KMeans 的可视化描述能够帮助您更好地理解集群。请随意留下您的评论或问题。你也可以看看更多关于神经网络或者决策树的其他文章。
面向分布式深度学习的环形全递归视觉直觉
最近,我发现自己正在处理一个非常大的数据集,这是一个需要并行学习才能实现的数据集。我立刻想到了优步的 Horovod 。我之前在优步的一次技术演讲中听说过它,但并没有真正使用过。我发现它非常有趣,是一个很棒的框架,从高级简化到支持这个框架的算法。在这篇文章中,我将尝试描述我对后者的理解。
那么它到底是做什么的呢?
对此需要理解的重要一点是,在深度学习中,我们需要计算梯度,以便能够调整我们的权重。没有这个学习就不可能发生。为了计算这个梯度,我们需要处理所有的数据。当这样的数据太大时,这就成了一个问题。这就是我们并行处理这些计算的原因。这意味着我们将有几台计算机并行处理一部分数据。当这些处理单元或工作者(它们可以是 CPU、GPU、TPU 等)中的每一个时,)完成了对其子集的梯度计算之后,他们需要将其结果传达给所涉及的其余过程。实际上,每个流程都需要与其他流程/工作人员交流结果。幸运的是,其他人在过去也遇到过这个问题,并设计了 Allreduce 算法,它正好可以做到这一点。我先描述一下这个。
全归算法
从概念上讲,该算法让每个进程/工作者与所有其他进程共享其数据,并应用归约操作。这种运算可以是任何一种归约运算,如求和、相乘、求最大值或最小值。换句话说,它将所有进程/工作进程中的目标数组缩减为一个数组,并将结果数组返回给所有进程。
例如,这个:
Before Allreduce operation
在所有的减少总和之后会变成这样:
After Allreduce operation
那么你真的会怎么做呢?我马上想到了天真的方法。互相发送数据数组,然后对每个进程应用 sum 运算,如下所示:
Message passing using naive Allreduce
事实证明,这种方式并不理想。它发送了太多不必要的消息,可能会使消息网络饱和。
另一种更简单的常见方法是选择一个流程/工人作为驱动者。然后,所有其他进程会将其数组发送给驱动程序,驱动程序会应用该操作,并将结果重新分配给工作进程。看起来像这样的东西:
这种方法的问题是它不能很好地扩展。驱动程序进程成为瓶颈,因为它的通信和归约操作的应用与进程的数量成比例增加。这在我只有 4 个进程的玩具例子中可能不明显。
Allreduce 算法还有许多其他实现。一些尝试最小化带宽,一些尝试最小化延迟。在研究这个问题的时候,我意识到还有很多其他的架构可以让我在这篇文章中讨论,而不会让它变得无聊。如果你想知道更多,我找到了这篇伟大的论文,它描述了一些最常见的方法。
Figure 2, from the paper, copyright by John Francis Canny
现在我们已经知道了一些不同的实现方法,让我们来描述它的环形版本,并探索它的好处。
环所有-减少
Allreduce 的环形实现有两个阶段。第一阶段,份额减少阶段,然后是纯份额阶段。
在 share-reduce 阶段,每个进程 p 向进程 (p+1) % p 发送数据,其中%是模运算符。所以进程 A 会发送给进程 B,以此类推。这就是产生类似环的连接的原因。此外,长度为 n 的数据数组除以 *p,*这些块中的每一个都将由 i 向前索引。大概是这样的:
Each process sends chunks of its array to the next process
第一个份额减少步骤会让进程 A 将 a0 发送给进程 B,进程 B 将 b1 发送给进程 C,依此类推。大概是这样的:
然后,当每个进程接收到来自前一个进程的数据时,它会应用 reduce 操作符,然后继续将它再次发送到环中的下一个进程。请记住,在我们的示例中,归约运算符是一个 sum。它看起来像这样:
Each process sends an intermediate result of the reduce operation.
同样重要的是,我们的归约运算符是 关联的 ,以及交换的 否则您无法将中间结果从一个流程传递到另一个流程。当每个进程持有块的完全缩减时,共享缩减阶段结束。此时,每个进程持有最终结果的一部分,它看起来像这样:
The state of the processes after the share-reduce step is completed
第二步,仅共享步骤非常简单,只是以类似环形的方式共享数据的相同过程,而不应用 reduce 操作。这巩固了每个进程中每个块的结果。
像这样:
The state of all processes after the Allreduce is completed
对发送数据的简单分析
如果我们比较驱动程序进程 Allreduce 和环 Allreduce 发送的数据量,我们会发现为什么环 Allreduce 是现代网络架构中共享梯度的最佳选择。
在我们的驱动程序进程 Allreduce 中,在这篇文章的前面描述过;其他所有进程都将其数组发送给驱动程序。最初的发送是发送 N 个元素(P-1)次,然后驱动程序进程将应用归约操作符并将结果发送回其他进程,因此将是另一个 N × (P-1) 通过网络发送,总共是 *2(N ×(P-1))。*这是一个与 p 成正比的项。
在 ring Allreduce 的 share-reduce 步骤中,每个进程发送 (N/P) 个元素,它执行 (P-1) 次,所以 (N/P) ×(P-1)。在仅共享步骤中,每个进程发送它计算的块的结果。那就是一个附加的(N/P)元素做了(P-1)次,所以一个附加的 (N/P) ×(P-1)。总共加起来是2((N/P)×(P-1))
从这里我们可以观察到,这将缓解瓶颈,因为这是几乎相同的术语,只是驱动程序进程的 N 和环形进程的 (N/P) 不同。让我们记住,这个计算只针对环形体系结构的一个过程。即使你将得到的等式乘以 P 你也会得到同样的另一个等式,但是它仍然分布在 P 进程中,而不是全部在驱动程序进程中。这就是如何缓解瓶颈,这就是为什么他们称这种算法为最佳带宽。
结论
我们调查了为什么在计算深度神经网络中的梯度时,我们需要分布数据。我们直观地探索了 ring Allreduce 算法是如何工作的,并执行了一个基本的分析,将它与其他 Allreduce 范式进行了比较,了解了什么使它成为更好的选择,以及为什么它被用在 Horovod 这样的框架中。据我所知,它现在甚至内置在 tensor flowcollectiveallreducedstrategy中。
参考文献:
https://eng.uber.com/horovod/
https://preferred research . jp/2018/07/10/technologies-behind-distributed-deep-learning-all reduce/
https://www . toms hardware . com/news/Baidu-svail-ring-all reduce-library,33691.html
https://mpitutorial.com/tutorials/mpi-reduce-and-allreduce/
视觉网络:营销顾问
理解非线性关系和营销诡计
神经网络在分类图像和创建原文方面取得成功的原因有很多。其中的几个原因是低廉的培训成本、可扩展的实现和该领域的投资。特别有趣的是他们捕捉非线性关系的能力。这种关系的一些例子是税级和收入、关税和贸易量、你的年中公司销售奖金、人口数量和时间等。像“过了这一点它会翻倍”或者“它会变得越来越糟糕”这样的短语隐藏了非线性关系。
Tax Brackets(y) and Income(x)
另一方面,线性关系是直接的。以工资和工作时间为例。你打卡的时间越多,月底你得到的存款就越多。很简单,每小时工资 10 美元,你工作 7 小时可以赚 70 美元。
营销投资并非一帆风顺。公司在广告上的花费和他们的回报当然是非线性的。让我们试着用神经网络来捕捉这种关系。
想象一下,你有数百家公司的营销投资和预算,你想要一种方法来预测你未来的回报。你知道,沃尔玛投资 7 美元获得 14 美元的回报,埃克森美孚投资 13 美元获得 26 美元的回报,数百美元也是如此。你能预测你的投资会有什么回报吗?
Return(Y) and Investment(X)
鉴于你要投资 15 美元,之前公司的经验对你有什么帮助?有没有办法用数据捕捉投资和回报之间的关系?
在这种情况下最常用的工具是线性回归。我们试图找到一条尽可能接近图中所有点的线。德斯莫斯建立了线性回归模型。这里有一个链接到这个例子。
Linear Regression in Desmos
我们将直线与点拟合,并找到一种方法来预测我们的回报。看起来我们会做得很好。红点在上面很高,只在联想下面。你很兴奋,决定投资 15 美元到脸书广告公司。几个星期后,你看到你的回报,得到 6 美元。如何解释如此灾难性的表现?你用了数学,你试图从以前的经验中学习,但还是失败了。
“营销投资并不是直截了当的。公司在广告上的花费和他们的回报当然是非线性的”
至少这不是世界末日,你只损失了 15 美元。但你还是想明白为什么会这样。幸运的是,你有一个每天都在做脸书广告的朋友。他是领域专家。你给他看数据,他马上就能看出你失败的原因。他说是“创造性疲劳”。显然,脸书用户对一个创意感到疲惫,并停止点击它。你还在花钱却没有得到好的业绩。
在你决定数学是一个骗局之前,我们需要再看看数据。用线性模型获取数据不是正确的方法。让我们回到德斯莫斯,现在我们知道了创造性枯竭。看来投资太多是要罚款的。也许福特在埃克森美孚之下的原因不是随机的。
我们不能使用线性模型。我们需要一种非线性的方法来拟合数据。这就是机器学习的全部内容。曲线拟合。有关曲线拟合工作原理的更多详细信息。连杆、连杆和连杆。
我们需要一种工具来适应不断变化的市场决策。这就是神经网络可以发挥作用的地方。你可以点击以下 3 个交互式可视化来了解更多关于神经网络如何工作的信息。
直观解释
One Neuron
在其最简单的形式中,神经网络只能描述线性关系。一个神经元不会让你走那么远。
点击这里: 链接
Three Neurons
三个神经元能够紧密配合我们的非线性问题。有一些误差,但比线性模型小。您可以移动不同的值,看看可以描述什么类型的关系。
点击这里 : 链接
Six Neurons
我们可以用六个神经元来拟合任意的关系。
点击这里: 链接
最后,神经网络可以捕捉任意怪异的关系。您只需要数据,输出是一个定义明确的函数。很多问题随之而来。怎样才能开始做推理而不是预测?我们如何避免过度拟合?我们如何从神经网络中提取人类可解释的关系?当你在查看 3 个或数千个输入变量时,这变得越来越复杂。我们如何解释一段有数千个变量的关系?很多人都在研究这些问题,并取得了令人兴奋的成果。更多信息这里,这里这里,这里这里,这里这里。
Recurrent Neural Chat Boats is where it’s at.
智能零售收银台的视觉产品搜索
用数据做酷事!
简介
人工智能正在改变几个经济领域,如汽车、营销和医疗保健。零售业可能是下一个。在商店购物的基本零售体验几十年来一直没有改变。人工智能可以从根本上改变这种体验,让它以高成本效益的方式为每个消费者提供大规模的完全个性化、沉浸式和优化的体验。
我们正在这里写一系列博客,详细介绍人工智能在零售业的应用。每个博客处理不同的用例,并分享演示可行性的实际代码。这是第一个。
视觉产品搜索
很多时候,我们发现很难回忆起一件产品的确切名称,或者无法清晰地描述它以便谷歌搜索,或者想要重新订购我们看到别人穿的衣服。在所有这些情况下,以及更多的情况下,“视觉产品搜索”是拯救。我们不需要描述,只需要给产品拍张照片,然后搜索它。
Visual Product Search
视觉产品搜索是如何工作的?
视觉产品搜索的概念也称为反向图像搜索,是将图像表示为特征向量。现代深度学习技术可以使用预训练的 CNN 将图像编码成特征向量。特征向量类似于图像描述符,并对深度学习已经学习到的相关图像信息进行编码。为了运行视觉产品搜索,我们有一个可以编码成特征向量的图像数据库。然后,我们获得一个查询图像,并将其向量与整个数据库进行比较,以获得最接近的匹配。
视觉产品搜索的应用
视觉产品搜索在人工智能中可以有很多应用。两个这样的应用是:
- 对于在线订购,我们可以使用摄像头进行搜索,并自动将商品添加到商店购物车中。许多大型零售商如亚马逊、Nordstrom 已经提供这种服务。只需拍摄一张照片即可添加到购物车中
- 对于实体店,我们可以有一个智能结账系统,它可以使用一个摄像头来自动为产品向客户收费。零售商会喜欢它,因为它会削减成本,顾客会享受顺利结账的体验。干脆买了就走。没有队列。
我们已经通过可视化产品搜索为智能结账做了一个演示。我们开始吧!
Who likes long checkout queues?
智能结账系统
我们使用 Google Vision API 来构建这个应用程序。他们有一个功能叫做视觉产品搜索。如果您是 API 的新手,请参考这个文档了解如何开始。
创建一个物品数据库
有两种方法可以创建将被搜索的数据库:
- 创建一个空的产品集,并使用在线导入向其中逐个添加图像
- 使用批量导入同时创建产品集,创建多个产品及其参考映像。
我们通过从互联网上抓取图片,创建了一个常见零售商品的数据库——冷饮、饼干、薯条、面条等。然后,我们使用批量导入将这些图像添加到 API 中。通过这样做,API 将每个图像转换成一个特征向量。
对于批量导入,主要步骤是:
- 将你的数据库上传到谷歌云存储
- 创建描述数据库中图像的 CSV 文件。CSV 文件的细节在下一节给出。将这个 CSV 文件上传到 Google 云存储桶中。
- 使用存储在 Google 云存储桶中的图像或 base64 编码的本地图像向 Vision API 产品搜索发出请求。
CSV 包含各种列。列名及其说明如下:
- image-uri :参考图片的 Google 云存储 uri。
- image-id :您可以提供的唯一值。否则,系统将分配一个唯一的值。
- product-set-id :导入图像的产品集的唯一标识符。
- 产品类别:允许值为家居用品-v2、服装-v2、玩具-v2 和包装商品-v1。
- 产品-显示-名称 : 可选 。如果不为产品提供名称,显示名称将被设置为" "。
- 标签 : 可选 。描述参考图像中产品的键值对字符串(带引号)。比如:“品类=鞋子”,“颜色=黑色,款式=正式”。
- 包围多边形 : 可选 。指定参考图像中的感兴趣区域。如果一个边界框没有被指定。如果 API 检测到多种产品,单个图像中的多个区域可能会被编入索引。
我们现在可以用我们的查询图像向 api 发出请求。这是使用 curl 完成的,如这里的所述。
实验及结果:
我们通过网络搜集创建了一个普通零售产品的图片数据库。对于实际用例,这将是零售商存档的产品图像。为了测试 API,我们传递了一个通过手机摄像头捕捉的查询图像。以下为面条的查询图片:
Noodles Query Image
对 api 的请求给出了以下匹配的产品
API result on Noodles Image
然后我们传递了一张可口可乐的查询图片如下:
Coke Query Image
对 api 的请求为 coke image 提供了以下匹配产品。
API result for Coke Query image
还不错!API 能够非常准确地导航到正确的产品类型。这是很有希望的,因为过程相对简单,API 成本也相当合理。
这个简单的演示表明,通过对商店销售的整个数据库进行编码,上述技术可以扩展到更智能的客户结账。在结账时,安装的摄像头可以检测每个对象的位置,裁剪它们的图像,并对 API 进行批量查询,以获得数据库中最匹配的产品,从而进行结算。
结论
根据全球市场洞察,到 2024 年,零售部门对人工智能的投资将超过 80 亿美元。人工智能在零售领域有很多应用,智能结账将是一个革命性的变化。
我有自己的深度学习咨询公司,喜欢研究有趣的问题。我已经帮助许多初创公司部署了基于人工智能的创新解决方案。请到 http://deeplearninganalytics.org/来看看我们。如果你有一个我们可以合作的项目,那么请通过我的网站或在info@deeplearninganalytics.org联系我
你也可以在https://medium.com/@priya.dwivedi看到我的其他作品
参考文献:
带有红色节点的视觉识别应用程序
这篇博文演示了如何在 10 分钟内毫不费力地让定制的人工智能服务参与到自己的解决方案中,并学习了一种基于 Node-Red 的新的节点流代码开发。
为了实现这一点,您将了解 Watson 视觉识别(这是一项经验丰富的商业行业级人工智能服务,可通过 IBM Cloud 获得),Watson Studio for fast machine learning,Node-Red-一种基于 javascript 的图形节点流语言,可在在线模式下使用创建的视觉识别分类器。
为什么
我是一名全栈开发人员,一直在寻找可以在现代系统中使用的优秀技术。自从我创办了一家机器人初创公司以来,我一直对无人机和机器人的人工智能视觉识别服务的使用感到惊讶。在这篇博文中,我将与你分享现在让人工智能为你和你的系统/机器人/无人机做事情是多么容易。回到 10 年前,我试图在一群机器人中使用自主机器人来探测武装入侵者——当时在我看来,如果没有巨大的财政资源,这个任务是不可能完成的。今天,解决方案可以在一整天的黑客马拉松后交付。_Man,我希望我那时就知道我现在要与你分享什么;) _
此外,联合国、红十字会和 IBM 等组织支持 CallForCode.org 黑客马拉松来帮助受灾难影响的人们。使用具有图像识别功能的无人机可能会影响并改善所有受影响者的福祉。我将展示检测受野火、洪水等影响的房屋的代码。所以为什么不接这个电话,为事业做贡献,帮助别人!
在 Node-Red 中使用 Watson 视觉识别
沃森视觉识别是一种经过训练的基于人工智能的服务,它可以告诉你它在经过预训练的分类器的图片上看到了什么。它可以检测颜色、人、脸、一些物体、食物等。你会非常喜欢的。
Node-Red 是一个开源项目,是一个编程工具,用于以新颖有趣的方式将硬件设备、API 和在线服务连接在一起。它提供了一个基于浏览器的编辑器,使用调色板中的大量节点可以很容易地将流连接在一起,只需单击一下就可以将这些节点部署到它的运行时环境中(在 nodered.org 站点之后重复)
因此,让我们从 IBM 视觉识别开始——我上次检查是在 2019 年 5 月 30 日——你可以使用 IBM Cloud lite 帐户免费调用该服务,每月大约一千次。你可以通过点击我的个性化链接(如果你使用这个网址,我会被告知这个博客很不错)为自己获得一个免费的建兴账户(只需提供你的电子邮件地址):cloud.ibm.com——使用以下链接创建账户给我一些印象分——https://ibm.biz/Bd2CUa
补充说明一下——只需使用 IBM Cloud Lite 帐户,您就可以轻松地为投资者准备一个可行的概念验证原型。
注册后,登录并打开目录,从人工智能类别中选择 Watson 视觉识别服务,然后创建它。之后,您还需要创建 Node-RED Starter 服务。这两种服务都可以在免费层工作!
提供节点红色服务后,将其与之前创建的 Watosn 视觉识别服务连接。将它们连接在一起后,您需要重新准备节点红色服务。当您设置服务运行时,您可以创建第一个流并使用以下 Node-RED lab:https://github . com/Watson-developer-cloud/Node-RED-labs/tree/master/basic _ examples/visual _ recognition
小提示:在 Node-RED 实验页面的底部有一个链接,指向所需 Node-RED 流程的完整 JSON。只需复制流的 JSON,从剪贴板导入流编辑器中的 JSON,就可以在 1 分钟内启动这个服务!不要忘记使用“部署”按钮来安装新的或更改的流。
您的服务将如下所示:
现在,您可以通过这个简单的 web 应用程序在您的 web 浏览器中尝试您的测试服务(只需使用带有**/reco**扩展名的链接),例如:【http://my-node-red-app.mybluemix.com】T2/reco
使用自定义分类器自定义人工智能服务
如果你想添加一些新的东西——创建一个定制的分类器——你需要提供 1000 张图片进行阳性检测,正如我被告知的那样——这个数字中大约有一半是“阴性”图片——即不代表所选分类的图片。
最基本的例子是从十几张图片开始。John Walicki 提供了一个完美的例子,他训练了一个定制的分类器来检测无人机拍摄的照片中被烧毁的房屋。你可以使用他的一个实验室来做这样一个无人机分类器——这个基于 github 的实验室介绍了创建一个分类器来检测被野火摧毁或被洪水淹没的房屋的实验室:【https://github.com/IBM/drones-iot-visual-recognition
我制作了一个简短的视频,展示了这是如何一步一步完成的(然而视频被加速了 2-3 倍):https://youtu.be/kW7cjuWuPS0
为了训练 Watson 视觉识别,您将使用 IBM Watson Studio。概括来说,训练视觉识别服务需要提供单独的图片或将它们组合在 zip 文件中——一个是正面图片,一个是负面图片集。在自由层,你可以得到这样的两个等级。
现在,为了查看它,只需用一个额外的功能节点扩展您现有的节点-红色流,并用下面的代码填充它。更多细节在链接中的步骤 3-https://github.com/blumareks/ai-visrec-under-10min
摘要
使用创建的自定义分类器,您可以为您的无人机或软件配备检测灾难幸存者和受害者的能力。沃森视觉识别的能力可以用在好的方面,在 CallForCode.org 黑客马拉松和更远的地方。
你打算用它实现什么解决方案?让我知道!
在推特上关注我
使用图形的视觉识别
介绍
卷积神经网络在视觉识别任务中取得了巨大成功。本文特别关注语义分割。使用 CNN 背后的逻辑是图像具有位置感,也就是说,彼此靠近的像素更相关。CNN 能够通过卷积运算捕捉到这一点,并且考虑的局部区域(正式称为感受野)取决于核的大小。图像中还存在长程相关性,这有助于视觉识别任务。为此,概念是堆叠许多卷积层,这将在理论上增加感受野。因此,现在长程和短程依赖性都被考虑在内,把网络放在训练上,你很容易得到结果,对不对!
但是我相信你很清楚,理论和实践并不总是一致的。最近发表了一篇论文(作者罗、等)表明感受野并不随卷积层数线性增长,而且受到严格限制。此外,感受野取决于各种其他因素,如初始化方案。那么解决办法是什么呢?
图表来拯救
如果我们能够将图像分组为区域,并使用这些区域来提取特征并进一步处理图像,情况会怎样?除此之外,地区之间也存在依赖关系,这将有助于获得长期依赖关系。所有这些都可以使用图像的图形表示来实现。
广义地说,图中的所有顶点代表图像中的不同区域。边缘将表示区域之间的关系或相似性。
圆圈代表具有代表该区域的相应特征向量的区域。边缘是区域之间的相似之处。
语义分割
语义分割是给每个像素分配其所属的类别的任务。一个基本的技术是,将有一个编码器,后面跟着一个解码器,其输出将是像素级的分配。
分段是如何工作的?让我们举一个非常基本的例子,假设有一个图像只由红色、蓝色、绿色组成,如
Fig1
假设这些颜色代表一些物体。现在假设谁想把图像分割成用颜色表示的三个物体。要做到这一点,你需要什么样的特征向量?对这个只有颜色就足够了。如果我们说根据特征向量,那么每个特征向量的深度是 3;对于红色[0,0,1],对于蓝色[1,0,0],对于绿色[0,1,0]。正如你所看到的,这些特征足以将图像分割成 3 个区域。现在考虑一个现实生活中的图像,如图 2 所示。只用颜色你能完成任务吗?不,没错。我们需要图像中存在的每个对象的特征表示,以将其与其他对象分开,并使相似的对象更加接近,这就是编码器发挥作用的地方。它将彩色图像表示转换成某种潜在空间表示,在这种潜在空间表示中,同一物体的特征更接近,而不同物体的特征彼此远离。显然,编码器需要训练。一旦我们在一些分离不同物体的潜在空间中有了特征,我们就需要将信息传播到像素级,这就是解码器发挥作用的地方。
让我们理解图在语义分割中是如何有用的。一旦使用编码器提取了特征向量,图形就开始发挥作用。考虑图 2 中的图像。图像从上到下依次分别是实际图像、地面真实、用 FCN 分割、用 GCU 分割。在此图中,使用 FCN 时,枕头和床类别的概率非常接近。因此,你可以在图 2 中看到枕头和床被合并。
现在假设编码器后面有一个图形表示。从编码器得到的图像的特征向量表示被迫分成多达 8 个区域(即 8 个顶点的图)]。如果我说就损失而言,如果顶点是空的,即没有像素被分配给它,则损失更高。在训练的初始阶段,枕头和床也将被分配到同一个班级。但是当我们进一步训练网络时,每个特征向量被分配给一个顶点,即没有顶点是空的。图像在图形表示中被分割的可能区域是在地面上的区域。因此在训练结束时枕头和床将被分割成两个不同的区域。通过乘以一些权重来进一步处理分配给顶点的特征,并且所得到的特征向量与来自编码器的特征向量一起被进一步用于分割。因此,图形表示进一步改进了图像的特征表示。
一个显而易见的可能发生的事情是当将图像划分为区域时,图像的过度分割。但是过度分割的区域将在进一步的操作如卷积后重新组合。
现在的问题是如何将基于网格的图像表示转换为这种图形表示,并学习图形表示的参数,答案是图形卷积单元(GCU)。
图形卷积单位(GCU)
就像卷积在网格状结构上操作一样,GCU 在图形状结构上操作。GCU 有三个主要步骤
- **图形投影:**在这个步骤中,图像的网格状表示被转换成图形表示。该图由以下参数参数化:
- V :图中顶点的数量,暗示图像将被分割的区域的数量。
- W :表示区域的特征向量。形状是(d,V),其中 d 是特征向量的维数
- 方差:它是分配给特定顶点的所有像素在每个维度上的方差。形状是(d,V),其中 d 是特征向量的维数。
V 是固定的,而 W 和方差是在训练中学习的。假设存在具有高度 H 和宽度 W 的图像的 2-D 特征图,并且每个元素具有维度 D。计算属于每个顶点的每个特征向量的概率,这产生概率矩阵 q。下面的等式用于计算概率:
其中,xᵢⱼ是二维特征图的 iᵗʰ行和 jᵗʰ列的特征向量,wₖ是表示 kᵗʰ区域(顶点)的特征,σₖ是沿着顶点 k 的所有维度的方差。现在,通过取残差的加权平均值来计算所有顶点的特征编码。残差越多,它在计算编码特征中的贡献就越小。使用下面给出的等式:
其中 zₖ是编码特征。邻接矩阵由 ZᵀZ 计算,它给出不同顶点之间的余弦相似性。这一步总共计算了 3 样东西
- 概率矩阵 Q,形状(HW,d)
- 编码特征 Z,形状(d,V)
- 邻接矩阵 A,shape ( V,V)-表示区域之间的相似性,因此它捕获了图像中的长程相关性。
2.**图形卷积:**该步骤类似于卷积的前一步,即在生成的图形上进行卷积。使用下面给出的公式:
其中 W g 是形状的权重矩阵(d,dₒᵤₜ).如您所见,等式中有一个邻接矩阵 A,在计算新的编码特征时会考虑长程相关性。因此新的编码特征依赖于所有的区域(A)和当前的编码特征(Z)。关于图形卷积的阅读,请参考这篇文章和这篇。这些文章中给出了非常容易理解且足够的信息。
3.**图形重投影:**最后将图形转换回网格状结构,以便可视化或做进一步操作。等式如下所示
架构和实现
使用的架构是预训练的 ResNet 50/101,扩展被添加到最后两层,因此输出被降采样 8 倍。其次是 GCU。在最初的实现中,4 个 gcu 的输出连接到 ResNet 的输出,如下图所示。
在这种情况下,d 是 1024,dₒᵤₜ是 256。串联后输出的深度将是 1024(来自 ResNet50) + 256x4 = 2048。使用双线性插值对级联输出进行上采样。接下来,卷积层用于将像素分配到不同的类别。用于最小化误差的损失函数是负对数似然损失函数。
Fig3 Training loss curve
我实现的 Pytorch 在这里可用。我在下面给出了实现细节。使用的数据集是 ADE20K。
- 使用 resnet 50 expanded,在 ADE20K 上进行预训练,此处可用。ResNet50 的输出深度是 2048。
- gcu 跟随 ResNet50。在论文中,4 个 GCU 单元被连接在一起,但由于计算能力有限,我只使用了 1 个 16 顶点的 GCU。我写了一个通用代码,所以你可以很容易地修改 4 个 gcu 的代码。要了解更多关于 GCU 实现的细节,请参考我的下一篇帖子。
- 在这种情况下,d 是 2048,dₒᵤₜ是 256。串联后输出的深度将是 2048(来自 ResNet50) + 256= 2304
- 接着是双线性上采样操作,然后是 1 个卷积层。
- 图像在传送到网络之前会被调整到 512×512 的大小。
- 由于计算量有限,我使用的批量大小为 1,训练了 120 个时期,每个时期有 1000 次迭代。
- SGD 用的是 0.9 的动量。学习率从 0.01 开始,并随着训练的进行而衰减
- 目前,该模型使用 2 个 GPU。一个 GPU 专用于 ResNet,另一个用于所有其他计算,如 GCU、上采样和卷积。
培训损失图如图 3 所示。用给定的超参数进行训练后,训练准确率约为 78%。
这篇文章基于李因和阿比纳夫·古普塔的论文。
如有任何疑问或建议,欢迎联系我😃。还有,在 Twitter 和Linkedin上找我。再见!!
视觉文本校正
我们可以检测并修复视频字幕中的错误吗?
Given a video and an inaccurate description, the Visual Text Correction (VTC) task is to detect and fix the inaccurate word(s). [1]
数据集、论文和幻灯片:https://amirmazaheri1990.github.io/VTC/
代号:【https://github.com/amirmazaheri1990/Visual-Text-Correction
视频、图像和句子是可以表达相同语义的媒介。人们可以通过阅读一个句子来想象一幅图画,或者用一些词语来描述一个场景。然而,句子中即使很小的变化也会导致与相应视频/图像的显著语义不一致。例如,通过改变一个句子的动词,意思可能会彻底改变。已经有许多努力来编码视频/句子并将其解码为句子/视频。
在这篇文章中,我将介绍我最近的一篇论文。本文介绍了一个新的问题,称为视觉文本校正(VTC),即在视频的文本描述中找到并替换一个不准确的单词。句子和视频之间或者句子的单词之间的语义不一致会导致不准确的描述。我们提出了一个深度网络,它可以同时检测句子中的错误,并通过替换不正确的单词来修复它。我们的方法利用了视频和单词的语义相互依赖性,以及句子中单词的短期和长期关系。据我们所知,这项工作是视觉文本校正任务的第一次。
作为一名社交媒体爱好者,我不得不说,在很多场合,我看到过朋友们发来的视频,标题写得不太好。在许多情况下,字幕有语法错误,或者与上传的视频并不相关。主要问题是,机器能学会阅读视频字幕并修复不太准确的字幕吗?
尽管社交媒体是第一个想到视觉文本纠正(VTC)的例子,但它有许多应用程序。例如,想象一个人工智能(AI)系统,它可以根据警官可穿戴相机或犯罪现场可用的安全相机记录的视频来验证警方的报告。多酷啊。
方法:
The proposed framework for Visual Text Correction. The goal is to find and replace the inaccurate word in the descriptive sentence of a given video. There are two main modules: 1) The Inaccuracy Detection module finds the inaccurate word, and 2) the Correct Word Prediction module predicts an accurate word as a substitution. Both of these modules use the encoded text and visual features. The Inaccuracy Detection uses Visual Gating Bias to detect inaccuracy and the Word Prediction Modules uses an efficient method to encode a sentence and visual features to predict the correct word. [1]
视觉编码:
我们使用预训练的 VGG19 和 C3D 网络来编码视频。然而,我们使用时间最大池从整个视频中获得一个特征向量。在消融研究中,我们表明每个特征都对最终结果有贡献。
文本编码:
一个句子中有两种类型的依存关系,叫做长期依存关系和短期依存关系。句子中每个单词的意义和作用会受到相邻单词的影响,也会受到句子中所有单词的影响。在我们的方法中,我们分别使用 1D CNN 和比尔斯特姆对短期和长期依赖性进行建模。
我们可以仅通过使用文本来找到不准确性分数:
Detection by reconstruction for inaccurate word detection in a sentence. [1]
事实上,我们试图重构每个单词,并通过句子中的实际单词来找到它的距离。
视觉门控偏差:
不是所有的单词都有视觉外观。例如,像颜色、物体和动作动词这样的词具有清晰的视觉外观。另一方面,许多单词在视觉单词中没有任何模式。比如“满意”这个词,并不是一个视觉概念。
为了解决这一现象,我们引入了一种新的融合方法,其中,我们与每个词的视觉特征门。事实上,没有任何视觉外观的单词可以关闭视觉特征上的所有闸门,使其成为全零向量。
Gating the visual features based on each of words in the sentence. [1]
最后,我们将门控视觉偏差与重建项相加:
The visual bias term is added to the detection by reconstruction formulation. [1]
事实上,视觉特征对不同的单词重构有不同的影响。
在找到句子中最不准确的单词后,任务是建议字典中最好的单词来替换句子中不准确的单词。为此,我们使用重构的单词向量来预测正确的单词,以替换不准确的单词。
关于更详细的公式,请看看的原始论文,或者看看我在这篇文章底部的 YouTube 演示文稿。
实验:
据我们所知,没有关于“视觉文本校正”任务的可用数据集。因此,我们建议生成一个。我们为 VTC 任务构建数据集的方法背后的主要思想是从每个句子中删除一个单词,并用一个不准确的单词替换它;然而,为了构建真实的数据集,有几个挑战需要解决。在这里,我们列举了一些,并提出了我们应对这些挑战的方法。我们的目标是建立一个包含各种视频和文本描述的大型数据集。我们要求数据集的词汇和视频样本的数量足够大,以训练一个深度网络;因此,我们选择“大规模电影描述挑战(LSMDC)”数据集[ 链接 ][2],这是可用的最大视频描述数据集之一。此外,LSMDC 还被注释为“视频填空(FIB)”任务[2][3]。在 FIB 数据集中,每个视频描述包含一个或多个需要填充的空白。对于 VTC 问题,我们引入不准确的词来代替 FIB 数据集中的空白。如果在 FIB 数据集的一个句子中有一个以上的空格,我们生成该句子的多个例子。
请注意,有一些与替换单词的选择相关的要点,我们需要记住。首先,原始单词和替换单词之间不应该有很高的相关性。比如我们经常把“car”这个词换成“bicycle”,任何方法都会有偏差,总会建议在所有的句子里把“bicycle”换成“car”。第二,我们希望我们的句子即使在单词替换后看起来也很自然。因此,替换单词应该具有相同的“词性”(POS)标签。比如一个单数动词最好换成另一个单数动词。为每个样本手动标注和选择替换词的成本很高,因为视频数量很大,并且数据集的词汇量很大。此外,人类注释者很难防止原始单词和替换单词之间的相关性。我们已经考虑了所有提到的要点来构建我们的数据集。有关如何生成数据集的更多信息,请阅读我们的全文。
结果:
为了成功地解决 VTC 任务,应该正确地检测不准确的单词,并且找到最准确的单词进行替换。这两个步骤中任何一步的失败都意味着整个 VTC 任务的失败。下面我们展示我们的结果表:
K: Number of inaccurate words in the sentence, WB: Word Based measurement in which each corrected word has a value, SB: Sentence Based measurement in which the whole corrected sentence has a value. We also show both MAP and Accuracy measurements.
提出的职训局问题是其研究路线的第一项工作。我们希望将这项工作扩展到更真实的数据集,并将其应用于社交媒体中人为的不准确性。
我想邀请观众观看我的 18 分钟 YouTube 演示,并阅读我们的全文。我感谢任何意见,以改善这项研究在未来。
参考资料:
[1]马扎赫里,阿米尔,和穆巴拉克沙阿。"视觉文本校正。"欧洲计算机视觉会议论文集(ECCV) 。2018.
[2]马哈拉杰、甘特等人,“通过填空问答理解视频数据的数据集和模型探索。”IEEE 计算机视觉和模式识别会议论文集。2017.
[3]马扎赫里、埃米尔、董璋和穆巴拉克·沙阿。"视频使用 lr/rl lstm 填补空白,具有时空注意力."IEEE 计算机视觉国际会议论文集。2017.
Visual_UI
我的任务是为机器学习库创建一个图形用户界面(GUI)(在这里是【fastai】),目的是提供各种训练参数的无缝集成,提高用户可用性,并且不需要任何代码!
学习机器学习中的各种概念和训练机器学习模型时可用的过多选项已经足够具有挑战性了。
例如,您必须选择您的标准化参数(imagenet、cifar、mnist 或自定义设置)、您的架构(resnet18、resnet34、resnet50、xresnet、alexnet、vgg16、vgg19、densenet121、densenet161、densenet169、squeeznet1_0、squeeznet 1 _ 1…仅举几个例子)、您是否想要预训练的权重、选择您的批量大小、图像大小、众多增强参数(缩放、旋转、扭曲、光照、翻转…)、训练),你的学习速度,周期长度,如何查看你的结果… 列表很广泛。
这导致必须按顺序运行大量单元来执行您的代码。
很明显,选择的数量是巨大的,在某些情况下,你甚至不知道所有的选项是什么。
下面是一个 Jupyter 笔记本或 Google Colab 笔记本目前可能的样子:
code from fast.ai
该项目的目标是将多个代码单元转换为一个代码单元,允许用户在一个视线内改变各种参数:
GUI displaying ‘Data’ and ‘Augmentation’ tabs
概念
我喜欢演奏音乐,并拥有许多合成器。我对雅马哈的DX7特别着迷,这是第一个成功的数字合成器。
Yamaha DX7 (1983–1989)
我喜欢键盘上显示按钮和算法的方式,这简化了合成器的功能。各种算法的图形表示打印在各种按钮上方,向用户显示每种算法的功能。
这就是我最终想要为机器学习库重新创建的图形用户界面…然而…但这是一项正在进行的工作。
如前所述fastai在我看来是目前为止最好的机器学习库,这个项目( Vision_UI )是基于使用 fastai 库创建一个图形用户界面。你可以通过从我的 GitHub 页面克隆我的项目来使用 Visual _ UI或者直接在Google Colab上实验。**
Visual_UI 是使用 ipywidgets 制作的,它们是用于 Jupyter 笔记本和 IPython 内核的交互式 HTML 小部件。这允许用户获得对其数据的控制,并且可以可视化数据中的变化。对于文件选择,我决定使用 Tkinter ,它是一个内置的 Python 模块,可以跨不同的平台兼容(虽然不是在 Google Colab 或 AWS 上,因为 Tkinter 为文件选择创建了一个新窗口,而 Colab 和 AWS 是在云上运行的,它们不能在你的机器上打开一个窗口。在这种情况下,使用了 Colab 章节中提到的另一种方法。这允许 GUI 使用面向对象编程的形式,即 事件驱动 ,程序响应事件,这些事件是用户采取的动作。****
设计
Fastai 提供了一种组织管道的结构化方式。加载数据、选择您的增强参数、学习率、选择您的训练指标、训练并查看结果)
Model Pipeline
这是 Visual_UI 中选项卡的基础(后来添加了其他选项卡)。该设计是使用 ipywidgets 的 Accordion 小部件实现的。
>信息 标签:方便查看相关系统信息,如 fastai 版本、GPU 信息(或 TPU,如果使用 Colab)、python 版本、访问 fastai 文档以及选择数据所在文件夹的路径。
‘Info’ tab
选择数据所在的文件夹需要使用 Tkinter,这会打开一个新窗口,您可以从中选择文件夹。(对于 Colab,我使用了另一种方法,因为 Tkinter 不支持 Colab)
Tkinter is a great tool that allows the ability to choose folders and files within a notebook
>数据 选项卡:方便地允许选择各种数据参数,例如指定如何存储您的数据(目前 Visual_UI 仅适用于存储在文件夹中的数据,我正在处理包括来自数据框和来自 csv 的数据)、归一化值、架构、预训练值、批量大小和图像大小。
‘Data’ tab uses a mixture of widgets to construct a GUI
“数据”选项卡使用了许多小部件(完整列表可在此处找到),与雅马哈 DX7 的概念非常相似。Toggle 小部件(提供一种方便的方式来查看所有可用的选项,以及使用不同的颜色来区分小部件的其他部分),CheckBox 小部件和 FloatSlider 小部件被用来构建界面。**
>增强 选项卡:该选项卡显示各种增强参数,并混合使用 Toggle 和 FloatSlider 小部件来创建效果。您可以将增强图像作为一批 8 张图像进行查看。
真正方便的是能够查看不同的增强参数如何影响图片(例如,在下图中,缩放和扭曲参数被更改,我们可以看到这如何影响图像)
Example of 2 different augmentations used (bottom picture: zoom and warp parameters were changed)
>批量 选项卡:该选项卡方便地显示从前两个选项卡中选择的所有参数,数据和增强,并显示一批将用于训练的图像。这是查看所使用的增量是否适合训练数据的好方法。
>模型 标签:这可以方便地显示模型的概要表示
‘Model’ tab
>指标 选项卡:允许轻松选择将在培训中使用的指标。在这种情况下,再次使用了垂直对齐的 Toggle 小部件。在未来的更新中,将添加更多指标。
‘Metrics’ tab
****> 训练 选项卡:该选项卡再次允许查看训练参数的选项,以及使用学习率查找器的选项,以便找到训练的最佳学习率。一旦确定了这一点,就可以设置学习率和周期长度。目前,Visual_UI 使用 Leslie Smith 提出的单周期策略,并在本文中进行了讨论。特别是,在训练复杂模型时,这种策略可以快速给出结果。这个政策在这个 帖子 里解释的极其到位。
一旦训练完成,模型将自动保存在 models 文件夹中,命名顺序如下:’ architecture ‘+’ pre trained '+batch size+image size,因此使用批大小为 32、图像大小为 128 的预训练 resnet34 architectur 将保存为 resnet 34 _ pre trained _ True _ batch _ 32 _ image _ 128 . PTH
‘Train’ tab
>结果 选项卡:这是迄今为止所有选项卡中最有趣的一个!还有选择最多的一个。结果选项卡是一个独立的实体,因为它不需要来自任何其他选项卡的输入。在这种情况下,必须指定文件夹路径以及加载保存的模型文件。再次使用 Tkinker 允许无缝集成选择相关文件夹和。pth 文件。
在这种情况下,可以轻松加载之前保存的文件 resnet 34 _ pre trained _ True _ batch _ 32 _ image _ 128 . PTH。一旦模型被加载,附加选项变得可用(混淆矩阵、多 _ 顶 _ 损失、顶 _ 损失)。关于这些选项的更多信息可以在 fastai 优秀的 文档 中找到
我在’混淆矩阵’选项卡中做了最大的改动(需要注意的是,目前,这仅在不超过 2 个类的情况下有效)。我经常发现自己想知道更多关于混淆矩阵的结果。
典型的混淆矩阵是这样的:
Typical Confusion Matrix
除了这些数字,很难看出是什么驱使这个模型得出这些结果。我想知道更多关于真阳性、真阴性、假阳性和假阴性的图像。我还想选择使用热图(一种很好的可视化模型所关注的内容的方式)以及查看分配到 4 个象限的图像的能力。考虑到这一点,我对混淆矩阵选项进行了改进。
首先是查看结果是否带有热图的选项
View Heatmaps?
其次是选择色图、插值和阿尔法参数的选项,以便更好地匹配正在查看的数据
Various Heatmap options
下图显示了使用不同色彩映射表选项的示例:
并且通过添加 4 个可点击的按钮来更新混淆矩阵本身,这 4 个按钮全部对应于每个象限中的值
Updated confusion matrix
每个可点击的按钮将相应的图像保存到单独的文件夹中(假阴性、真阳性、假阳性、真阴性),从而允许用户更详细地查看图像。下图是打开热图选项时每个文件夹中图像的外观示例。
Images above using the Chest Xray dataset
在 Google Colab 上使用 Visual_UI
让 Visual_UI 在 Google Colab 上工作存在一些挑战。点击 这里 可以进入 Colab 笔记本:
第一个挑战是 Colab 中 Accordion 小部件的不兼容性。不幸的是,这将所有选项卡显示在一起,您无法单独单击任何选项卡。
ipywidgets Accordion does not render correctly in Google Colab
这里的修正是改为使用 Colab 小部件,这里有一个很棒的教程了解更多信息。第二个挑战是决定如何选择文件夹路径或增强图像,因为Tkinter 与 Colab 不兼容,您必须安装 Google drive 才能访问文件。
“ 驱动器 ”选项卡自动装载驱动器。
选择文件夹或图像路径的选项是通过使用文本小部件来完成的,它允许您轻松地复制和粘贴文件或文件夹路径,并使用按钮小部件来执行选择。这个选项延续了不使用任何代码的主题。
It is easy to copy and paste the path
总结一下我想要实现的概念:
目前,Visual_UI 是这样的:
有一些相似之处,但显然需要做更多的工作,因为我希望包括额外的功能,并希望在未来形成各种架构和参数的可视化表示。您可以通过在我的 github 页面上克隆这个项目或者在 Google Colab 上测试 Visual_UI 来查看代码并进行测试。