TowardsDataScience 博客中文翻译 2019(三百)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

视频分类介绍

原文:https://towardsdatascience.com/introduction-to-video-classification-6c6acbc57356?source=collection_archive---------8-----------------------

许多深度学习文章和教程主要关注三个数据领域:图像、语音和文本。这些数据域因其在图像分类、语音识别和文本情感分类中的应用而广受欢迎。另一个非常有趣的数据形式是视频。从维度和大小的角度来看,视频是与社交网络或遗传密码等数据集一起最有趣的数据类型之一。YouTube 等视频上传平台正在收集庞大的数据集,为深度学习研究提供支持。

视频实际上只是一堆图像。本文将回顾一篇关于视频分类研究的论文[1],该研究由现任特斯拉人工智能总监 Andrej Karpathy 领导。

https://static . Google user content . com/media/research . Google . com/en//pubs/archive/42455 . pdf

本文使用卷积网络对视频进行建模,其方式与 CNN 对图像建模的方式非常相似。这篇论文是卷积网络强大表示能力的一个好例子。在这项工作之前,视频分类研究主要由一系列视觉词袋特征组成,这些特征被量化到 k-means 字典中,并用 SVM 等机器学习模型进行分类。这项工作突出了细胞神经网络的力量,抽象出所有这些以前的特征工程算法。该论文也为将视频的时间成分集成到 CNN 模型中的想法提供了良好的基础。

本文探讨了视频分类的三个不同组成部分,设计了考虑视频中时间连通性的细胞神经网络,可以加速计算的多分辨率细胞神经网络,以及视频分类的迁移学习的有效性。

讨论的数据集

任何深度学习项目最重要的组成部分之一是对正在使用的数据集的理解。本文使用了由 487 个类别的100 万个 YouTube 视频组成的数据集。本文还对从这个大规模数据集学习到的特征到更小的 UCF-101 数据集的迁移学习进行了实验,该数据集由属于 101 个类别的 13320 个视频组成。

有两个与所使用的视频数据集相关的直接问题。首先是数据集的巨大规模,因此将整个数据集加载到本地内存的前景是不切实际的。一种解决方法是使用 url 解析库从视频的 youtube 链接动态下载视频,并覆盖当前在内存中的视频,这些视频是在以前的批量中使用的。为了加快速度,使用了并行计算系统,使得这些批次可以在与训练模型的机器不同的单独机器上加载和预处理。Karpathy 等人使用计算集群来实现这些实验,这非常适合这种数据处理流水线。

这个数据集的第二个问题是文本挖掘应用程序经常遇到的问题,即每个实例的可变长度。例如,一个视频可能是 30 秒,而另一个是 2 分钟。在文本中,这可以通过用 0 填充文本的末尾来解决,这样所有的输入都是相同的长度。本文通过对视频中的作物进行预测并汇总所有作物的预测来解决这一问题。我认为这是需要记住的一个非常重要的细节。整个视频并没有被传送到网络上,而是使用了半秒钟的剪辑。视频通常以每秒 30 帧的速度录制。因此,这些剪辑由 15 帧组成。

聚合半秒剪辑的预测与图像分类中的测试时间增强是一个类似的概念。图像的类别预测与旋转、剪切、裁剪或增强颜色空间后的同一图像的预测相结合。这些视频分类实验还测试了半秒剪辑的翻转和裁剪增强。

时间信息融合

CNN 架构中的哪种时间连接模式最能利用视频中的局部运动信息?

额外的运动信息如何影响 CNN 的预测,它对整体性能的改善有多大?

也许本文最有趣的主题是如何修改经典卷积网络以解释视频中的时间依赖性。在本文中,一堆帧一个接一个地连接起来,输入到 CNN。传统上,CNN 采用一个(高×宽×颜色通道)矩阵作为输入。例如,这可能是一个 224 x 224 x 3 的输入张量。在这些实验中,先前的帧堆叠在颜色通道轴的顶部,使得由视频中的两个图像帧组成的输入具有 224 x 224 x 6 的形状。Karpathy 等人提出了 3 种不同的策略来组合作为 CNN 输入的帧,并将这些方法与一次分类一个帧的基线模型进行对比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单帧模型是通过简单地聚合单帧/图像的预测来对视频进行分类的一个例子。后期融合模型通过连接剪辑中的第一帧和最后一帧来组合帧。早期的融合模型从剪辑中取出较大的连续片段。最后,慢融合模型具有更复杂的方案,其中 4 个部分重叠的连续段在卷积层中被渐进地组合。实验发现慢融合策略获得了最大的个体成功,尽管并没有显著大于单帧模型。通过对所有模型的结果进行平均,找到了最佳的总体结果,(单一+早期+晚期+缓慢)。

多分辨率 CNN

本文讨论的另一个非常有趣的概念是一个引人注目的图像处理策略。多分辨率 CNN 工作如下:两个独立的输入被馈送到独立的卷积层,在两个独立的 conv-最大池-批处理序列之后融合在一起。这些多分辨率输入由下采样为 89 x 89 的 178 x 178 帧和原始 178 x 178 帧的中心 89 x 89 裁剪组成。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种策略为卷积层节省了大量的计算时间。作者报告说,由于这种降维方案,速度提高了 2-4 倍。具体来说,他们引用了全帧网络每秒 5 个剪辑的速度和多分辨率网络每秒 20 个剪辑的速度。他们还强调,如果使用高端 GPU,而不是在拥有 10–50 个模型副本的计算集群中进行并行化,这可以进一步加快速度。除了加速之外,它还报告了比单帧模型小的改进,单帧模型采用原始的 178 x 178 帧。

视频分类中的迁移学习

图像分类中的迁移学习已经被大量研究,并且是一个非常直观的概念。在 ImageNet 这样的海量数据集上训练,1.2M 的图片,把这些权重转移到一个数据较少的问题上,然后在新的数据集上微调权重。在本文中,Karpathy 等人将 Youtube-1M 数据集的特征转移到流行的视频分类数据集 UCF-101。他们实验了三个层次的迁移学习,并在 UCF-101 数据集上与从头开始的训练进行了比较。

所研究的迁移学习水平包括微调顶层、微调前 3 层和微调所有层。例如,当微调顶层时,网络中的其余权重在训练期间被“冻结”,这意味着它们只参与网络的正向传递,而不通过反向传播进行更新。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从本文来看,时间融合和多分辨率策略带来的性能提升并不显著。然而,迁移学习的结果令人大开眼界。如果这份报告也显示了单框架网络的结果,以对比慢速融合方案是否对迁移学习更有效,这将是很有趣的。

结论

我对报告的结果印象深刻,慢融合方案始终优于单帧模型。在这篇论文中,我期望时间融合算法由 CNN 特征组成,并输入到一个递归模型中,如 LSTM。我认为慢速融合的设计可以通过简单地加倍相邻块的大小来改进,也许可以通过一些参数数量的帧来连接相邻块,并添加剩余连接。

我认为多分辨率处理图像和视频是一个非常有趣的想法,可以扩展到语音和音频。这种机制主要设计用于在输入尺寸减小的情况下提高计算速度,但是,我认为在使用超分辨率技术(如 SR-GANs)对图像进行上采样后,反转这一点并测试分类精度会很有意思。

令人鼓舞的是,图像迁移学习的成功扩展到了视频。在 YouTube-1M 数据集上训练后,UCF-101 的准确率提高了近 25%,高得令人震惊!

本文为探索视频分类奠定了良好的基础。它写得非常好,讨论了在视频数据上建立深度学习模型的许多重要特征。感谢阅读,请在纸上或这篇文章上留下你的想法!

参考

[1]安德烈·卡帕西、乔治·托代里奇、桑克思·谢蒂、托马斯·梁、拉胡尔·苏坦卡尔、李菲菲。基于卷积神经网络的大规模视频分类。2014.

Selenium 和 Python 网页抓取简介

原文:https://towardsdatascience.com/introduction-to-web-scraping-with-selenium-and-python-85920d41722d?source=collection_archive---------28-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于如何开始使用 Selenium 的实用教程

当你需要数据时,网络抓取是一种快速、经济、可靠的获取方式。更好的是,数据通常是最新的。现在,请记住,当抓取一个网站时,你可能会违反其使用政策,并可能被踢出网站。虽然抓取大部分是合法的,但根据您打算如何使用数据,可能会有一些例外。所以在开始之前,一定要做好调查。然而,对于一个简单的个人或开源项目,你应该没问题。

抓取数据的方法有很多,但我最喜欢的一种是使用 Selenium 。它主要用于测试,因为它主要做的是浏览器自动化。用简单的语言来说,它创建了一个机器人浏览器,为你做事情:它可以获得 HTML 数据,滚动,点击按钮等。最大的好处是我们可以明确地说出我们想要什么样的 HTML 数据,这样我们就可以适当地组织和存储它。

Selenium 与许多编程语言兼容,但是本教程将重点介绍 Python。检查此链接以阅读 Selenium(使用 Python)文档。

第一步

要下载 Selenium,请在命令行中使用这个简单的命令:

pip install selenium

如果你在 Jupyter 笔记本上工作,你可以直接在那里而不是命令行上完成。开头加个感叹号就行了:

!pip install selenium

之后,您需要做的就是导入必要的模块:

from selenium.webdriver import Chrome, Firefox

也支持其他浏览器,但这两种是最常用的。

开始时需要两个简单的命令:

browser = Firefox()
(或browser = Chrome()取决于你的喜好)

这创建了一个 Firefox WebDriver 的实例,允许我们访问它所有有用的方法和属性。我们把它赋给了变量browser,但是你可以自由选择你自己的名字。Firefox 浏览器将自动打开一个新的空白窗口。

接下来获取您想要抓取的 URL:

browser.get('https://en.wikipedia.org/wiki/Main_Page')

get()方法将在浏览器中打开 URL,并等待它完全加载。

现在你可以从这个 URL 获得所有你想要的 HTML 信息。

定位元件

用硒定位元素有不同的方法。哪一个是最好的,取决于你抓取的页面的 HTML 结构。找出访问您想要的元素的最有效的方法可能很棘手。所以请慢慢来,仔细检查 HTML。

您可以使用选择的搜索参数访问单个元素(您将获得与您的搜索参数对应的第一个元素),也可以访问与搜索参数匹配的所有元素。要获得单个,请使用以下方法:

find_element_by_id()
find_element_by_name()
find_element_by_xpath()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_tag_name()
find_element_by_class_name()

要定位多个元素,只需在上述方法中将element替换为elements。您将获得通过该方法定位的 WebDriver 对象的列表。

抓取维基百科

所以让我们看看它是如何与已经提到的维基百科页面https://en.wikipedia.org/wiki/Main_Page一起工作的

我们已经创建了包含 WebDriver 实例的browser变量,并加载了 Wikipedia 主页面。

假设我们想要访问该页面可以翻译成的语言列表,并存储所有指向这些语言的链接。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

经过一些检查,我们可以看到所有元素都有相似的结构:它们是类'interlanguage-link'<li>元素,包含带有 URL 和文本的<a>;

<li class="interlanguage-link interwiki-bg">      <a href="https://bg.wikipedia.org/wiki/" title="Bulgarian" 
     lang="bg" hreflang="bg" class="interlanguage-link-target">

            Български </a> </li>

所以让我们首先访问所有的<li>元素。我们可以使用类名来隔离它们:

languages = browser.find_elements_by_class_name('interlanguage-link')

languages是 WebDriver 对象的列表。如果我们打印它的第一个元素:

print(languages[0])

它会打印出这样的内容:

<selenium . web driver . Firefox . web element . Firefox web element(session = " 73e 70 f 48–851 a-764d-8533–66f 738 D2 BCF 6 ",element = " 2a 579 b 98–1a 03-b04f-AFE 3–5d 3 da 8 aa 9 EC 1 ")>

所以要真正看到里面有什么,我们需要写一个 for 循环来访问列表中的每个元素,然后访问它的<a>子元素,并获得<a>的文本和'href'属性。

要获取文本,我们可以使用text属性。使用get_attribute('attribute_name')方法获得'href'。因此,代码将如下所示:

language_names = [language.find_element_by_css_selector('a').text   
                  for language in languages] links =[language.find_element_by_css_selector('a') \
                 .get_attribute('href') for language in languages]

你可以打印出language_nameslinks来看看它工作了。

卷动

有时并不是从一开始就加载整个页面。在这种情况下,我们可以让浏览器向下滚动,从页面的其余部分获取 HTML。使用将 JavaScript 代码作为参数的execute_script()方法非常简单:

scroll_down = "window.scrollTo(0, document.body.scrollHeight);" browser.execute_script(scroll_down)

scrollTo(x-coord, y-coord)是一个滚动到给定坐标的 JavaScript 方法。在我们的例子中,我们使用返回元素高度的document.body.scrollHeight(在这个例子中是body)。

正如你可能已经猜到的,你可以用execute_script()方法让浏览器执行所有类型的脚本。所以如果你有 JavaScript 的经验,你有很大的试验空间。

微小静电干扰声

点击就像选择一个元素并对其应用click()方法一样简单。在某些情况下,如果您知道需要访问的 URL,您可以让浏览器加载带有 URL 的页面。还是那句话,看什么效率更高。

为了举例说明click()方法,让我们点击左侧菜单中的“内容”链接。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该链接的 HTML 如下:

<li id="n-contents">
   <a href="/wiki/Portal:Contents" title="Guides to browsing Wikipedia">

        Contents

   </a>
</li>

我们必须首先找到具有唯一 id 'n-contents'<li>元素,然后访问它的<a>子元素

content_element = browser.find_element_by_id('n-contents') \    
                         .find_element_by_css_selector('a')content_element.click()

您现在可以看到浏览器加载了“目录”页面。

下载图像

现在,如果我们决定从页面下载图片。为此,我们将使用urllib库和一个 uuid 生成器。我们将首先用 CSS 选择器'img'定位所有图像,然后访问它的'src'属性,然后用urlretrieve('url', 'folder/name.jpg')方法为每个图像创建一个唯一的 id 下载图像。这个方法有两个参数:一个图片的 URL 和一个我们想给它的名字,以及我们想下载到的文件夹(如果适用的话)。

from urllib.request import urlretrieve 
from uuid import uuid4 # get the main page again browser.get('https://en.wikipedia.org/wiki/Main_Page') # locate image elements 
images = browser.find_elements_by_css_selector('img') # access src attribute of the images 
src_list = [img.get_attribute('src') for img in images] for src in src_list: 
     # create a unique name for each image by using UUID generator    
     uuid = uuid4()      # retrieve umages using the URLs 
     urlretrieve(src, f"wiki_images/{uuid}.jpg")

增加动作之间的等待时间

最后,有时有必要在浏览器中的操作之间引入一些等待时间。比如一个接一个加载很多页面的时候。可以用time模块完成。

让我们从我们的links列表中加载 3 个 URL,并让浏览器在使用time.sleep()方法加载每个页面之前等待 3 秒钟。

import time urls = links[0:3] for url in urls: 
     browser.get(url)      # stop for 3 seconds before going for the next page   
     time.sleep(3)

关闭 web 驱动程序

最后,我们可以关闭机器人浏览器的窗口

browser.close()

不要忘记browser是一个包含Firefox()方法实例的变量(见教程开头)。

GitHub 中的代码

这篇文章中的代码可以在 GitHub 中找到:
https://github.com/AnnaLara/scraping_with_selenium_basics

原发布于 2019 年 9 月 12 日https://dev . to

反思自己的虚拟足迹

原文:https://towardsdatascience.com/introspection-on-ones-virtual-footprint-79590857afb5?source=collection_archive---------24-----------------------

谷歌和脸书对你了解多少?可以下载自己找。

或者,一点心理分析数据

你担心网上收集的关于你的数据吗?

如果你正在读这篇文章,我想你以前听说过这个:你已经意识到网上已经有很多关于你的数据,反乌托邦 奥威尔 卡夫卡 雅哒雅哒雅哒你无力控制它。

GDPR 是欧洲保护消费者数据的一大进步;而美国有多重保护措施( COPPA隐私保护等)。)没有什么东西像 GDPR 一样既独特又包罗万象。

你至少可以追踪一些关于你自己的已知信息,并限制它们的使用来针对你。

按照我的习惯(bespoke data science 4ever),我想简要地检查一下我自己的数据。我们将快速浏览一下谷歌、Instagram 和脸书提供的内容,看看我们能轻松梳理出什么。

在我的 GitHub 上可以找到 Jupyter 笔记本来复制这里提出的问题和绘制的图表。

谷歌

谷歌提供通过外卖下载你的数据的能力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

takeout.google.com

按照给出的指示,几个小时后,谷歌将通过电子邮件向你发送链接,下载可能是几千兆字节的个人信息,这取决于你已经告诉谷歌为你保留的隐私级别。我的全部存档超过 20 GB(考虑到其中大部分是谷歌照片和邮件,我认为这是合理的)。

如果您只对浏览数据感兴趣,那么您选择的格式可能对您并不重要。HTML 可能是最容易用肉眼阅读的,但是如果您对检查数据感兴趣,您可能希望深入每个服务并更改格式,并尽可能选择 JSON,以使数据操作最容易。这个选择对于 My Activity 是最重要的,它是一个元产品,存储了跨产品的活动记录。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

You’ll want to check My Activity out.

有一些显而易见的产品,比如搜索和位置历史,你想挖掘它们的记录,但是也有一些你可能不知道的“产品”。我在这里要研究的是购买和交易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

I was not aware that Google was scraping my Gmail for purchase info and collecting it in JSON format.

“购买和交易”包含从其他谷歌服务中抓取的信息。如果 Google 检测到一条信息(通常是电子邮件)涉及购买、预订、订阅、交付或其他类型的金融交易(似乎不包括银行交易),该内容就会被提取出来并放在 JSON 文件中。每个事务都有自己的文件(与我的活动文件相反,我的活动文件包含特定产品的所有操作)。

例如,我很惊讶(但我应该惊讶吗?)来查看谷歌已经解析了我在 2017 年 11 月下的订单的一封 GrubHub 回执邮件的内容。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

part of the email receipt from GrubHub…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

… and part of the JSON extracted from this email.

我很好奇谷歌从我收到的电子邮件中提取了多少此类内容,以及从我可能不知道的其他金融服务中提取了多少与谷歌相关的内容。

事实证明相当多。

我还想知道这个 JSON 文件是如何创建的。谷歌真的提取了这些内容,还是 GrubHub 卖给了谷歌?我不知道。

在没有输入其他单个交易的细节的情况下,在我使用各种谷歌产品的过程中,谷歌似乎已经从至少追溯到 2008 年 5 月的 521 笔交易中提取/获取了数据(截至我的外卖存档时间)。(有 42 个没有日期。)

在这 521 笔交易中,有 390 笔交易有"小计"栏。将这些值相加(忽略任何行项目)表明,在过去 11 年中,Google 已经索引了我价值超过 11,000 美元的交易数据。

真正令人惊讶的是,这实际上并不多。如果我的数据具有代表性的话,看起来他们在 2013 年真正开始加快交易抓取的步伐。(也就是从那时起,我开始使用这个特殊的 gmail 地址进行更多的在线消费。或者两者都有。)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Instagram

要收集你的 Instagram 数据,请遵循标题为“在 Instagram 上下载你的数据副本”下的这些指示。

这些数据仅以 JSON 格式提供。

我们将在这里运行一个简单的查询:每个月我给其他个人资料的赞是什么样的?

我在 2012 年年中开始使用 Instagram。在几个月的小活动后,有趣的是看到幂定律似乎是从我点击小心形图标的简单任务中产生的——至少可以说,这是一场无意的受欢迎程度竞赛。(当然,配置文件名是隐藏的。)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还要注意,分级简档的数量增加了;随着我关注的账户数量的增加,喜欢的照片的差异也在增加,但粗略的幂律结构仍然保持着,即使喜欢的人自己变得越来越分散(T2)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

a sample of my Instagram likes distributions: 12/2012, 6/2014, 6/2016, 6/2018

脸书

像以前一样,按照这些指示,在问题“我如何下载我的脸书信息的副本?“你会注意到,就像谷歌的“我的活动”一样,脸书的数据有 JSON 和 HTML 两种格式。

我们将着眼于脸书数据的两个方面:反应和帖子的情绪。

反应

一旦从句子结构的帖子中提取出反应的接收者,反应(喜欢和其他类型)就可以像 Instagram 喜欢一样进行计数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

sample Facebook reaction post — if we wish to tabulate who received what reactions, we need to extract the objects of these “title” sentences.

从我自己的脸书 feed 收集 11+年的反应数据开车回家有多少人已经离开了平台;不想在没有对象的情况下丢弃这些反应),我发现,在排列我的前 25 个回复接收者时,第 5 名是所有离开脸书的占位符“NO_NAME”的总和。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

power laws emerging here make sense here too, although a power law appears cleaner with “likes” alone.

与 Instagram 的数据一样,喜欢和反应的“人气”效应表现为一种“财富分配”,受幂律支配。

帖子情感

对我在脸书的帖子进行情感分析更有趣一些。 VADER ,已经被整合到 NLTK (“自然语言工具包”)中,提供了文档级情感的分类,分为“正面的”、“负面的”、“中性的”和“复合的”。

首先,我们将检查每年有多少帖子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

this says a lot just by itself.

接下来,我们将生成每年这些帖子的情绪的箱线图。我是一个相对中立的演讲者(嗨,数学家),所以我们可以看到中间值非常坚定中立,几乎所有 2010 年以前的负面情绪(那时脸书的帖子变得更像句子,而不是 2000 年代后期的“人是 _____”格式)都被认为是离群值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这仅仅触及了你能从这些数据中了解到的一些皮毛。上面给出的例子并没有真正涉及单个交易和帖子中的细节,在这里可以进行更细致的分析。

如果你能通过这些数据了解自己,那么掌握这些数据的公司也能从中学习。并用它向你推销。并可能卖给其他人来推销给你。

你同意吗?

模型拟合背后的直觉:过度拟合 v/s 欠拟合

原文:https://towardsdatascience.com/intuition-behind-model-fitting-overfitting-v-s-underfitting-d308c21655c7?source=collection_archive---------36-----------------------

在我们深入了解过度拟合和欠拟合背后的概念之前,让我们尝试理解机器学习模型的幕后工作。

你觉得把数据给机器学习模型会怎么样?想象一个充满白点的黑色房间。因为一个房间意味着 3 个维度(高度、宽度和长度),所以基本上我们是在 3 个维度上可视化数据。现在,让我们假设黑色房间里的白点形状像一条蛇。你认为你的模型如何在黑房间(3D 空间)中学习白点的这种性质?实际上,让模型学习数据性质的过程称为模型拟合。

模型拟合是让模型学习给定训练数据的性质的过程。

模型拟合的质量取决于三个主要因素,例如你的问题范式是什么,N 维空间(这里,N=3)中存在哪种数据,以及你选择的模型的固有性质是什么。

模型拟合取决于: 问题范式、数据种类和所选模型性质

让我试着解释一下。当我说你的问题范式是什么的时候,我指的是不管是 有监督的 还是 无监督的 学习任务。监督学习简单地说就是一种机器学习的范例,其中给你的数据包含目标的值。所谓目标,我指的是模型试图预测的值。另一方面,无监督学习顾名思义,暗示了一种我们有数据但没有目标值的范式。在查看模型对 N 维数据模式的掌握程度时,理解问题范式的概念是一个需要考虑的重要方面。

在监督学习任务的情况下(例如分类或*回归),*我们知道数据的实际模式只是因为我们有目标标签。换句话说,作为读者,你知道数据的性质(暗室中白点的蛇形结构),只是因为我明确告诉你,你已经得到了数据的目标值或真实值。另一方面,如果你观察无监督的学习任务,例如聚类,其中你只有数据,但你没有办法检测实际的结构或模式或目标标签。你唯一能做的就是进行有根据的猜测,并尝试使用不同的类内和类间相似性标准来评估你的模型。

因此,只有在监督学习任务中,我们才有足够的能力相对容易地检测模型拟合的质量,即,我们的模型对我们的数据的底层结构的理解程度,因为我们有真实的数据与之进行比较。请注意,我并不是想说无监督学习范式不关心模型拟合。我只是想指出,在缺乏真实目标值的情况下,在无监督学习范式中,确定模型与数据的拟合程度是一项多么困难的任务。

**监督学习:**给定目标标签

无监督学习:没有给定目标标签

在讨论模型拟合时,第二个需要了解的最重要的事情是我们得到了什么样的数据。我的意思是,无论数据是否线性可分。 线性可分性 的思想来源于这样一个事实:与非线性数据相比,在线性可分数据上训练和学习模型更容易。例如,再次想象一个黑暗的房间,想象红色发光点在房间的一端看起来像一朵云,蓝色发光点在房间的另一端看起来像另一朵云。在这种情况下,模型可以仅仅是线性模型(如线 y=mx+c ),并且它将能够基于任何未来点在房间中的位置来预测该点是红色还是蓝色。相比之下,想象一个房间,里面充满了随机排列的红色和蓝色发光点。现在,你能想出任何简单的(线性)模型,能够分离这些点群,同时很好地概括未来的预测吗?可能是的,但是这个模型会比线性模型复杂得多。

**可线性分离:**数据可以通过线性模型分离

**非线性可分离:**线性模型无法分离数据

这里有一张以不同形式呈现的更多数据点的图片,可以帮助您更好地理解线性可分性的概念。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source of Image: http://www.robots.ox.ac.uk/~az/lectures/ml/lect2.pdf

最后但同样重要的是,当我提到模型的固有性质时,我基本上是指您选择了什么类型的模型来拟合您的数据。像直线或超平面一样是线性的吗?是像曲线一样的二次型吗?还是更复杂?选择一个能够识别给我们的数据的细微差别的模型是非常重要的。所以,选择你的模型要非常小心。

现在我们更好地理解了模型拟合,让我们看看任何机器学习模型的两个最重要的特征。即,。顾名思义,专一性仅仅意味着对给定的数据或任务的专一和专注。而可推广性意味着以可接受的性能水平推广任何未知(测试)数据的结果或模型的能力。

****特异性:对训练数据进行 f 集中学习的能力,以便模型学习数据的微小细节。

****可推广性:通过已知数据训练,对未知测试数据推广模型的能力。

当我们说模型适合数据时,我们的意思是它确定了数据中的一般趋势或模式,即,它是可概括的,而不是太具体的。把模型做得太具体会让它抓住每一个微小的细节。从而增加了它在看不见的测试数据上表现不佳的脆弱性。发生这种情况是因为模型在识别给定(训练)数据的细微差别方面变得过于精通,因此当向其提供可能显示略有不同的模式的看不见的测试数据时,它往往无法以任何可接受的效率水平对测试数据使用相同的明显特定的模型,因此表现不佳。上述场景中,模型往往过于特定于训练数据而无法进行概括,这被称为 过拟合

现在你一定在想什么是不合适的?欠拟合 是与过拟合相反的一种方式。想象一下,一个模型如此笼统,以至于无法从给定的训练数据中捕捉到任何有意义的东西。在这种情况下,有很高的普遍性,但很低的特异性。这也不好!

下图展示了红点所示给定数据的欠拟合、过拟合和完美拟合之间的差异。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以看到最左边的图包含一个模型(用黄线表示),该模型无法从数据中捕获任何有意义的信息(高概化),因为它无法通过 1 个以上的数据点(红点)(低特异性)。与之形成直接对比的是,我们看到最右边的模型穿过了所有的红点(高特异性)。这表明它试图捕捉所有数据点的复杂性,但如果我们使用这条黄色曲线并试图根据看不见的数据拟合它,它将表现不佳(低概化)。现在看中间的图片。这是一条最佳拟合或完美拟合模型线,因为它了解数据的整体结构,但在训练过程中不会太具体,从而产生一条穿过大多数数据点(红点)而遗漏一些数据点的线。换句话说,它假设可能有很少的点是异常值,并在训练时保持一定的误差幅度。

因此,为了使模型表现良好,总是需要在特异性和可推广性之间取得平衡。

简而言之,这是记住两者区别的经验法则。

过拟合:高特异性,低概化

欠拟合:低特异性,高概化

请注意,我在本文中使用的模型大多是线性的,因为它们最容易被我们所有人理解。然而,同样的经验法则也适用于更复杂的模型。

我希望这篇文章能帮助你理解模型拟合背后的基本原理,以及过度拟合和欠拟合有什么不同!

感谢您的阅读!

继续学习!

直觉:探索与开发

原文:https://towardsdatascience.com/intuition-exploration-vs-exploitation-c645a1d37c7a?source=collection_archive---------6-----------------------

权衡和常见解决方案背后的直觉。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Berries by William Felker on Unsplash

探索-开发权衡是一个众所周知的问题,它发生在学习系统不得不重复做出不确定回报的选择的场景中。从本质上来说,对于一个对世界只有不完整认识的决策系统来说,困境在于是重复迄今为止行之有效的决策(exploit)还是做出新颖的决策,希望获得更大的回报(explore)。

这与强化学习高度相关,但对于许多其他应用也是如此,例如推荐系统在线广告

在这篇文章中,我给出了三个简单且行之有效的策略的概述,以解决多武装匪徒的探索-开发权衡。

术语一个武装强盗来自老虎机,它有一只“胳膊”可以拉,可以有效地“抢劫”玩家的钱。

如果问题包括在多个离散选项(武器)中反复选择,每个选项产生一个概率奖励(金钱),我们称之为“多武器强盗问题”。在这种情况下,就像吃角子老虎机一样,每个选择的奖励与之前选择的选项无关。随着时间的推移,决策者对每个选项的回报分配建立了理解。目标是最大化期望回报,这需要找出哪个选项给出最高的平均回报,并尽可能地利用这个选项。

例如,想象你正遭受下午疲劳的折磨,你想知道如何仍然是最有效率的。每天,你可以尝试几种策略中的一种:喝杯咖啡,小睡一会儿,试着放松一下,等等。对于每一种策略,回报看起来都是概率性的,因为许多其他因素也在影响你的生产力。你开始每天选择一个选项,有时尝试新的东西,有时重复过去行之有效的东西。当你观察你每天的工作效率时,你会对你的策略的有效性有更好的理解,使你最终能够始终如一地选择最可靠的策略。

解决方案策略

正如你所想象的,有许多方法可以解决多臂土匪问题。我将试着给你一个直观的概述,介绍一些简单但有效的(也就是它们实际上正在被使用的)方法。

ϵ-greedy

这个非常简单,如果你学过强化学习 101 课程,我保证你听说过。纯粹贪婪的方法背后的想法是每一个决定都尝试一次,然后一直选择能带来最高回报的那个。

为了增加一些探索的成分, ϵ-greedy 让你决定你的决定中有多少部分要花在探索(ϵ)上,有多少部分要花在探索(1-ϵ)到目前为止的最佳选择上。如果你将ϵ设为 0.4,那么你会在过去 60%的时间里选择给你最好平均回报的选项,而在 40%的时间里选择任何其他选项。通常,你希望ϵ很小,这样你可以充分利用你的经验,但也可以不时地去探索。虽然有时候,从一个更大的ϵ开始是一个好主意,以鼓励最初的探索,并在你收集关于回报的知识时减少它。

对于许多应用程序,ϵ-greedy 工作得非常好。在其他场景中,由于不加选择地探索,它失去了一些效率。这意味着当你探索时,选择两个看似次优的选项的概率是相等的。即使有些选项总是比其他选项差,它们有时还是会被选中,浪费宝贵的资源。

置信上限(UCB)

现在我们在贝叶斯水域中行走。想象一下,对于每一个选项,我们都维护着一个我们在选择这个选项时收集到的奖励的分布。如果我们还没有收集到任何奖励,我们可以从一个假设开始:每个选项的先前奖励分布通常非常广泛(例如均匀分布)。当我们收集奖励时,我们会不断更新这个分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UCB: Three options with different densities. The orange lines are one standard deviation higher than the mean. As we explore the option with the highest μ + βσ, we would go for option 3 this time (if we chose β=1).

在每一步,我们不会像贪婪方法那样,只选择估计平均回报μ最高的选项,而是选择μ 标准差σ最高的选项。这样做的效果是,在开始时,当我们不确定任何选项的回报并且方差很大时,我们倾向于探索具有高不确定性的选项,因为σ占优势。随着我们对每个选项的平均回报越来越确定,标准差会缩小,我们倾向于选择估计平均回报μ最高的选项,而忽略回报很少的选项。

我们称 μ + βσ置信上限,其中β是一个权衡参数,用于引导更多或更少的探索。随着β趋于零,我们更接近于纯粹利用迄今为止提供最高平均回报的期权。另一方面,高β值有利于探索,直到我们几乎没有不确定性。

请注意,与ϵ-greedy 方法不同,我们的经验会影响我们要探索的选项。如果我们很早就发现其中一个选项几乎肯定比其他选项差,那么我们就不会投资去进一步探索它。

汤普森取样

请记住,我们不断地重新估计我们的奖励分布。当遵循 1933 年引入的汤普森采样方案时,我们利用了那些分布所提供的不确定性。在每个时间步,我们从每个分布中抽取一个样本。然后,我们根据这些样本的回报值对选项进行排序,就像我们之前根据平均值加上β乘以标准差对分布进行排序一样。最后,我们选择排名最高的选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Thompson sampling: Three options with different densities. The black dots represent one sample drawn from each distribution. For this set of samples, we would explore option 3, although it has a lower mean reward than option 2.

这样,估计平均回报高的选项就有可能被选中。尽管如此,我们不确定的期权也有机会被选中,因为它们的样本分布在一个很大的可能回报值区域。

采用这种策略,我们通常不会完全放弃任何选择,不像我们对 UCB 那样。相反,它越来越不可能选择一个看似糟糕的选项。

凭直觉,我们可以说 UCB 和汤姆森抽样都是“乐观的”,因为他们给了期权一个机会,即使这些期权到目前为止还没有带来最好的平均回报。在理论层面上,可以证明 UCB 和汤普逊抽样之间有着密切的联系

感谢您的阅读。我希望你喜欢这篇文章,也学到了一些有用的东西!

直观深度学习第 1a 部分:神经网络简介

原文:https://towardsdatascience.com/intuitive-deep-learning-part-1a-introduction-to-neural-networks-aaeb3a1500df?source=collection_archive---------8-----------------------

什么是深度学习?一个非常温和和直观的神经网络及其工作原理的介绍!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

近年来,eep Learning 因其在许多应用程序上令人印象深刻的表现而受到了广泛关注,包括语言翻译、x 光医疗诊断、识别图像以帮助无人驾驶汽车、击败顶级围棋选手以及高级 DotA 选手、仅从像素数据学习如何玩 Atari 游戏……所有这些都是 Deep Learning 最近取得的成就!在这篇文章中,我们将在直观的层面上(温和地)向你介绍深度学习背后的内部工作。

深度学习实际上只是机器学习的一个子集,由于它在我们上面列出的许多任务中的出色表现,最近获得了极大的关注。

这就引出了一个问题——什么是机器学习?机器学习与“传统算法”有何不同?

如果你上过算法课,那么算法的标准隐喻就是一个配方。算法是一系列步骤,当按特定顺序执行时,会产生您想要的输出。机器人制作面包的“烹饪算法”可能是这样的:

  1. 向一个大碗中加入 3 杯面粉、1 汤匙盐和 3 汤匙糖。
  2. 在另一个碗里,将一包酵母溶解在温水中。
  3. 把两个碗放在一起,揉 10 分钟。

诸如此类……(我不是面包专家,所以我不会在这里写面包的食谱)

在机器学习中,我们不会像上面那样指定算法。相反,我们指定了烹饪方法可能采用的模板(或“架构”):

  1. 向一个大碗中加入 __ 杯面粉、__ 汤匙盐和 __ 汤匙糖。
  2. 在另一个碗里,将 __ 包酵母溶解在温水中。
  3. 把两个碗放在一起,揉 __ 分钟。

空格是在开始时没有指定的数字,但是我们必须找出答案。然后,我们编写一个算法(另一系列指令),依靠我们可以访问的数据,根据什么是“最佳”(我们将在后面定义)来计算这些数字。

在很高的层面上,机器学习的任务是双重的:

  1. 找到最适合该任务的最佳模板。深度学习只是我们从中选择的模板的子集,这些模板已经被证明在许多任务中是有效的。
  2. 使用数据找出填充模板的最佳数字。这就是“机器学习”的“学习”部分。

一个成功的机器学习模型需要这两个步骤——如果没有第一步,没有面包粉,无论你尝试多少次,都不可能代表正确的“食谱”;如果没有第二步,你的面包“配方”的比例可能会完全错误,即使配料是正确的。

举一个更具体的例子,考虑根据房屋大小(平方米)、层数、到最近学校的距离(米)等特征预测房价的任务。

一个标准的算法可能是这样的:房价大约是(100 *房子大小)+ (1000 *楼层数)——(30 *到最近学校的距离。(参数化)机器学习方法看起来像这样:

第一步:我已经指定了模板:房价 __ *房屋面积+ __ *层数+ __ *到最近学校的距离。

第二步:看我列出的所有房子的数据,似乎最好的填空数字分别是(90.3,1006.2,-40.5)。

我们将更深入地探究我们具体指定了什么样的模板,以及我们如何使用这些数据来填补这些空白。但是在高层次上,许多机器学习任务采取与上面的例子类似的形式:给定一些输入,学习一些将输入转换成期望输出的函数。

这种输入-输出对的其他例子有:

  • 输入:来自照片的图像(一系列像素);输出:判断图像中是否有汽车
  • 输入:来自胸部 x 光的图像(一系列像素);输出:患者胸部感染可能性的概率
  • 输入:客户服务电话的录音;输出:预测客户对此次通话的感受,得分从 1 到 10
  • 输入:英文单词序列;输出:相应的法语翻译

机器学习算法的强大之处在于,我们可以解决以前不知道答案的问题。假设我们不知道如何将语音转换为文本的公式,因为这个公式非常复杂(如果它存在的话)。通过机器学习,我们可以仅从转录服务(例如字幕)的数据中找出复杂的公式,解决(至少近似地)一个我们之前无法用算法编码的问题。

总结:机器学习包括两步:指定一个模板,并为该模板找到最佳参数。

如上所述,深度学习只是采用“神经网络”的架构(或模板)的一个子集,我们可以在步骤 1 中指定。“神经网络”(更具体地说,人工神经网络)松散地基于我们人类大脑的工作方式,神经网络的基本单元是神经元。

在基本水平上,神经元做两件事:

  1. 接收来自其他神经元的输入并将它们组合在一起
  2. 执行某种转换来给出神经元的输出

在(1)中,我们经常取一些输入的线性组合。通俗地说,如果神经元有三个输入(让我们称它们为 x1、x2 和 x3),那么我们可以这样组合它们:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

This is a linear combination of inputs to our neurons

其中,各个空白是将被优化以用于以后的参数(即,从数据中学习什么数字最好地填充那些空白)。在数学术语中,连接到输入(x1、x2 和 x3)的空白称为权重,不连接到任何输入的空白称为偏差

对于线性组合,我们应用一些函数(称为激活函数)来实现我们的最终输出。这些功能的常见示例有:

  • Sigmoid 函数(将所有初始输出“挤压”在 0 和 1 之间的函数)
  • 双曲正切函数(将所有初始输出“挤压”到-1 和 1 之间的函数)
  • ReLU 函数(如果初始输出为负,则输出 0。否则,不对初始输出做任何事情)

这就是一个神经元的全部!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image taken from CS231N notes (http://cs231n.github.io/neural-networks-1/). This shows the parallels between the artificial neuron we’ve described and a biological neuron.

现在我们已经描述了一个神经元,一个“神经网络”简单地由神经元组成,以一种方式连接,一个神经元的输入是前一层神经元的输出(激活后):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image taken from CS231N Notes (http://cs231n.github.io/neural-networks-1/). A layer in the neural network consists of one or more neurons. These layers are connected such that the input of one layer of neuron is the output of the previous layer of neurons (after activation).

现在,激活函数的意义是什么?神经元的第一步有道理,但第二步真的有必要吗?激活函数为函数提供了一些非线性,我们需要用它来表示复杂的函数。请参见脚注 1 了解原因。

让我们通过一个简单的神经网络示例来巩固我们的理解。假设我们已经完成了培训(稍后会详细介绍),并在模板中填入了数字,这样我们就有了一个完整的模型。假设我们希望预测某人是否会通过驾驶考试。我们有三个输入特征:年龄、性别、课程数量。我们的中间层有两个神经元。假设每个神经元分别描述了它们在停车和道路驾驶中的表现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Our simple neural network to predict whether someone has passed his/her driving

现在我们已经填写了最佳数字,因此我们知道根据年龄、性别和课程数量来描述某人停车表现的最佳方式。假设函数是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A function to compute how well someone would park based on their age, sex and number of lessons

我们考虑两个人:

个人 A:20 岁,男性,已经上了 10 节课。他的“停车”神经元将输出 0(因为 ReLU 将所有负输出转换为 0)。

人 B:50 岁,女性,已经上了 20 节课。她的“停车”神经元将输出 150.5(因为 ReLU 只留下正输出)。

类似地,对于道路驾驶神经元,我们可以有这样一个函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A function to compute how well someone would drive on the road based on their age, sex and number of lessons

对于上述两个人,我们知道 A 的“道路驾驶分数”为 0,B 的“道路驾驶分数”为 179.5。

现在,这两个分数有助于这个公式中某人是否通过的最终输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A function to compute the probability of someone passing based on the output of the two intermediate neurons

在最后一层,我们已经计算出,人 A 通过的概率将是 Sigmoid(-3) = 4.74%,人 B 通过的概率将是 Sigmoid(2.9925) = 95.22%。请记住,sigmoid 是一个将我们的值压缩在 0 和 1 之间的函数,一个对获取概率有用的函数!你可以在这里找到一个 sigmoid 计算器:https://keisan.casio.com/exec/system/15157249643325

然而,在一天结束时,当数字被填入这个模板时,神经网络只是复杂的功能,其中的神经元建立在其他神经元的基础上。神经网络的强大之处在于,在实践中,它们能够灵活地(近似地)很好地表示任务的输入和输出之间的潜在关系。

附带说明:虽然术语神经网络可以指模板(模型架构),但它也经常用于指完整的模型(参数填充到模板中)。

在我们的例子中有一个错误,我想强调一下。在我们的例子中,我们确切地知道中间神经元在做什么——计算停车和道路驾驶时的表现。然而,在神经网络中,我们不知道神经元在做什么;它自己计算出什么是要计算的最佳中间特征,这将导致最终输出的准确预测。可能是‘停车’和‘道路驾驶’,也可能是其他我们并不真正理解的东西。这就是为什么人们说神经网络是不可解释的——我们不知道这些中间表示在人类可理解的层面上意味着什么。

我们再举一个例子。在最终层识别图像是否包含猫时,我们可能希望中间层识别中间特征(例如,某些类似猫的特征的存在,如胡须)。我们没有对这些中间特征进行硬编码,而是让机器来确定哪些中间特征最适合识别猫。这是否意味着中间层的神经元正在准确地识别胡须,我们不知道,但我们相信机器知道如何以最佳形式安排参数。我们没有指定那些参数,但是我们指定了为我们的模型设置边界的架构(容器)。当我们来到关于计算机视觉的第二部分时,我们将对此进行更多的讨论。

这是一个神经网络!但是现在你可能已经注意到了,我们可以有很多不同的组合来安排这个神经网络架构。我们应该有多少隐藏层?每个隐藏层应该有多少个神经元?所有这些与架构相对应的设置被称为“超参数”,我们最终也需要找到最佳的“超参数”集。我们将在第 1b 部分中回来讨论这个问题。

总结:神经网络只是我们指定的一个复杂的‘模板’,它具有建模输入和输出之间许多复杂关系的灵活性。

到目前为止,我们只触及了机器学习的“第一步”:为我们的模型设置一个好的模板或架构。我们现在进入“第二步”:假设我们已经找到了一个好的模板,我们如何从数据中学习?哪组数字最适合我们的任务?我们称之为优化:寻找符合我们模板的最优(最佳)数字。

要做到这一点,我们首先必须定义“最佳”的含义,用某种度量标准来衡量模型的表现。在我们预测一些产出(房价、某人是否患有癌症等)的情况下。),我们希望预测尽可能接近实际值。如果我对数据集的预测与实际值相差甚远,那就真的很糟糕,我可能想在我的性能指标中对此进行惩罚。

我们使用的指标被称为损失函数,它根据我们的预测与数据集中的实际值之间的差距来描述模型的表现有多差。我们的任务是提出一种算法来寻找使这个损失函数最小化的最佳参数。

分类问题的一个常见损失函数(见脚注 2)是 softmax 损失函数(见脚注 3)。

在没有给出数学的全部细节的情况下,对该损失函数的一种常见解释是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Loss Function Interpretation

其中,Prob_model (CorrectLabel)是指模型分配给我们所知的正确标签的概率。让我们通过一个例子来获得更好的直觉:

假设我的问题是识别一个图像是否是热狗:

无论如何,我给我的模型一个热狗的训练例子(所以我们知道“热狗”是正确的标签)。根据图像,我的模型可能会给我这样的概率:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Model Probabilities of Hot Dog vs Not Hot Dog

在这个训练例子的损失函数中,我们有

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Loss for Hot Dog Training Example

现在拿另一个有不同参数的模型来说,他们试图从同一张图像中进行预测。相反,该模型在识别哪个是正确图像方面表现不佳:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Probabilities and loss for a poorer model which gives a lower probability to the correct class (Hot Dog)

显然,模型预测更差,因此我们得到更高的损失。因此,损失函数确实对应于模型在预测特定示例的正确类别方面的表现。对正确答案的预测越高,损失越低。总损失可视为每个单独训练示例的平均损失。

现在我们有了一个损失函数,我们必须找到合适的参数来最小化它。为此,我们求助于一种叫做梯度下降的算法。梯度下降背后的想法很简单——在损耗减少的方向上缓慢移动参数。方向由损耗相对于这些参数的梯度给出。一个“更新步骤”是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An update step: The new parameters is one step away from the old parameters. The step is in the direction of the gradient, and how big a step we take in that direction is determined by the step size.

在我们迈出第一步后,我们继续移动并迭代这些参数,直到我们到达“最低点”,在那里没有方向会给我们带来任何明显更低的损失:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image taken from https://ml-cheatsheet.readthedocs.io/en/latest/gradient_descent.html

你可能经常听到术语反向传播。反向传播仅仅是一种在神经网络中寻找梯度的方法。这里我们不讨论数学,因为寻找梯度需要对微积分有所了解,但是我们的想法是,神经网络是一个非常复杂的函数,用“传统”方法求导可能会很困难。然而,数学显示的是,我们在早期层中需要的梯度可以表示为在它之后的层中的梯度的更简单的函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

How the gradient we needs depend on the layer after it

那我们该怎么办?一个好的策略是从最后一层开始,然后反向工作。假设有 5 层:我们找到最后一层的梯度,第 5 层(这很简单)。然后,我们找到第 4 层的梯度,因为我们已经找到了第 5 层的梯度。然后,我们找到第 3 层的梯度,因为我们已经找到了第 4 层的梯度,等等,直到我们到达第 1 层。这就是为什么它被称为反向传播:我们的计算从第 5 层一直反向传播到第 1 层。反向传播真的只是帮助我们找到更简单的表示和公式来计算梯度下降所需的梯度。

万一我们丢失了大图,让我们回顾一下为什么我们需要使用梯度下降:梯度下降帮助我们找到最小化损失的参数。通过最小化训练损失,我们得到了一个更好的模型,为我们的训练集提供了最准确的预测。

总结:指定损失函数和执行梯度下降有助于我们找到为我们的训练集提供最准确预测的参数。

合并总结:机器学习包括两步:指定一个模板,为该模板寻找最佳参数。神经网络只是我们指定的一个复杂的“模板”,它具有建模输入和输出之间许多复杂关系的灵活性。指定损失函数并执行梯度下降有助于我们找到为我们的训练集提供最准确预测的参数。

下一步 : 到目前为止,我们已经在很高的层面上涵盖了深度学习的基本概念。

这篇帖子最初是作为直观深度学习入门系列的第一篇帖子出现的。我的使命是用纯粹直观的方式解释深度学习概念!如果你是一个非技术初学者,我想为你提供深度学习内部工作原理背后的直觉,让你使用相同的语言和行话与技术工程师交流,即使你不知道背后的数学或代码。如果你是一名深度学习的学生,我相信在直觉方面获得坚实的基础将有助于你更好地理解你正在学习的课程中的所有数学和代码,为你提供一种更少痛苦的方式来学习这些概念。

如果你希望阅读更多,下一篇文章第 1b 部分将通过直觉告诉你一些我们必须注意的细微差别。我们将深入探讨如何让深度学习模型工作背后的一些本质细节,回答诸如“我们如何找到最佳的模型架构(模板)”之类的问题

如果你对编写你的第一个神经网络感兴趣,这篇文章附带了一个编码伴侣:

[## 用 Keras 建立你的第一个预测房价的神经网络

一步一步完整的初学者指南,建立你的第一个神经网络在几行代码像一个深…

medium.com](https://medium.com/intuitive-deep-learning/build-your-first-neural-network-to-predict-house-prices-with-keras-eb5db60232c)

脚注:

  1. 为什么我们的神经元中需要激活功能

如果每个神经元的输出只是其输入的线性组合,那么层输出中神经元的输出仍将是输入的线性组合,无论神经网络有多少隐藏层或有多复杂。假设相反,我们没有激活函数;那么隐藏层 2 中的神经元只是隐藏层 1 中神经元输出的线性函数。

因此,隐藏层 2 中神经元的公式可能如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Formulation of a neuron in hidden layer 2

其中 h1、h2 和 h3 是隐藏层 1 中的神经元。但是 h1 的公式应该是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Formulation of a neuron in hidden layer 1

其中 x1 和 x2 是输入特征。h2 和 h3 的公式是相似的,尽管填空的数字可能不同。尝试将 h1、h2 和 h3 的公式代入中,您会发现隐藏层 2 中神经元的公式可以简化为输入特征的线性组合,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Substituting in the formulation for neurons in earlier layers and rearranging it reveals that we merely get a linear function in the end

如果你继续这种逻辑,你会意识到,即使在最后一层,它们也只是输入的线性组合——对于建模复杂的关系来说,这真的不是一个非常复杂的函数。增加一个非线性意味着你不能重新排列它来得到一个线性函数,你最终会得到一个非常复杂的公式(来表达复杂的关系):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Substituting in the formulation for neurons in earlier layers, we see that this representation does not reduce to a simple linear combination of the inputs

  1. 回归与分类的区别

监督学习的输出通常分为两类:回归和分类。分类是这篇文章的重点:输入可以映射到几个不同的输出(称为),并且每个输入都有一个正确的标签。另一方面,回归预测的是一个实数值而不是一个类。假设我们希望从他们的评论中预测 Yelp 的星级(1 星到 5 星)。分类方法预测评论属于哪个不同的类别(1 星、2 星、3 星、4 星或 5 星);回归方法预测一些实数值(例如 3.71)。对于本系列的大多数帖子,我们将重点讨论分类问题。

3.soft max

Softmax 是最后的一个常见步骤,它将最终输出转换为一组概率。概率必须满足以下条件:每个概率介于 0 和 1 之间(包括 0 和 1),所有概率的总和为 1。

如果我们没有 softmax 层,则无法保证我们的最终输出满足上述条件,因为最终输出可以是任何没有概率意义的数字(例如-4、5.2 等)。因此,Softmax 将我们所有的最终输出标准化为一组概率,以满足上述条件。

弄脏你的手:

一个玩神经网络的好网站是 tensor flow Playground:https://playground.tensorflow.org

关于作者:

你好,我是约瑟夫!我最近从斯坦福大学毕业,在那里我和吴恩达一起在斯坦福机器学习小组工作。我想让深度学习概念尽可能直观,尽可能容易被每个人理解,这激励了我的出版:直观的深度学习

直观深度学习第 2 部分:用于计算机视觉的 CNN

原文:https://towardsdatascience.com/intuitive-deep-learning-part-2-cnns-for-computer-vision-472bbb2c8060?source=collection_archive---------16-----------------------

什么是卷积神经网络?我们如何应用神经网络来识别图像?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从无人驾驶汽车到面部识别技术,我们的机器似乎能够理解它们看到的东西。这是一个令人印象深刻的壮举:毕竟,机器只能将图像作为一系列数字来处理。机器如何将这一系列数字翻译成识别图像中的对象?

在这篇文章中,我们将揭示深度学习如何推动我们尖端的图像识别技术的秘密。

这是直觉深度学习介绍系列的第 2 部分。以下是到目前为止发生的事情的简要总结:

在第 1 部分中,我们介绍了神经网络以及如何让它们工作。我们从第 1a 部分开始,高度概括了机器学习的目标:

机器学习指定一个模板,并为该模板找到最佳参数,而不是我们自己对参数进行硬编码。神经网络只是我们指定的一个复杂的“模板”,它具有建模输入和输出之间许多复杂关系的灵活性。指定损失函数并执行梯度下降有助于找到为我们的训练集提供最佳预测的参数。

然后,我们在第 1b 部分中深入探讨了如何让神经网络在实践中发挥作用的一些基本细节。

在这篇文章中,我们将看到神经网络如何应用于图像识别。特别是,我们将介绍一种新的模型架构,称为卷积神经网络(也称为CNNConvNets )。这是一种新型的体系结构,它将利用图像数据的特殊属性,所以让我们开始吧!

首先,我们需要讨论图像的属性,然后才能讨论如何在我们的神经网络中利用它们。在计算机中,图像存储为空间排列的二维像素阵列,每个像素对应于图像的一小部分。事实上,“像素”一词来自短语“pi(x)ctureElelement”,因为它构成了图像中的一个小元素:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Images are made out of pixels arranged within a 2-D array. Image taken from https://www.photoshopessentials.com/basics/pixels-image-size-resolution-photoshop/

现在每个像素存储一种颜色;一种颜色在计算机中用三个数字表示,分别对应该颜色中红、绿、蓝的数量,范围从 0 到 255(包括 0 和 255)。所以实际上,如果您将颜色通道视为另一个维度,图像可以表示为一个三维数组(前两个维度存储图像中出现的像素,最后一个维度有三个通道——红色、绿色和蓝色)。

这对我们的深度学习算法意味着什么?当我们把一幅图像作为输入时,我们实际上是在接受一个三维数组。每个数字都是我们通过神经网络传递的图像的一个特征。假设我们的图像尺寸是 256 * 256;然后,我们将总共 256 * 256 * 3 = 196,608 个特征输入到我们的神经网络中。(功能真多啊!)从这 196,608 个特征中,我们需要找到一些复杂的函数,将它转换成对图像代表什么对象的预测。一个简单的例子是——照片里有猫吗?

回想一下,拥有 196,908 个特征意味着我们在一个神经元中需要 196,908 + 1 = 196,909 个参数。请记住,在应用激活函数之前,我们的神经元输出首先采用输入特征的一些线性组合:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A formulation of the neuron output in terms of its input features x1, x2 and x3

在三个输入特征(x1、x2 和 x3)的情况下,我们有四个需要填充数字的空白,一个对应于每个特征和一个偏差项(不附属于任何特征)。如果我们有 196,908 个特征,我们还剩下 196,909 个空白,我们需要找到最好的数字。所有这些都发生在一个神经元上!现在,如果我们有一个神经网络,那就需要学习很多参数!

让事情变得更复杂的是,猫可以在照片中的任何地方。猫可以在图片的右上角,也可以在左下角——它们对应着一组非常不同的 196,608 个特征,但它们代表着同一个东西:一只猫。

摘要:图像是一个三维特征阵列:二维空间中的每个像素包含三个数字,从 0 到 255(包括 0 和 255 ),分别对应红、绿、蓝通道。通常,图像数据包含大量输入特征。

回想一下,图像的本质是这样的:

  1. 有许多“输入特征”,每个特征对应于每个像素的 R、G 和 B 值,因此需要许多参数。
  2. 图像左上角的一只猫或右下角的一只猫应该给出相似的输出。

此时,或许可以考虑以下方法。假设我们有一个想要测试的图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An image of size 256x256 we wish to test whether there is a cat or not

这是我们的算法:

步骤 1:将图像分成四个相等的象限。让我们把图像尺寸设为 256 * 256 * 3(通道)。然后,图像的每个象限将具有 128 * 128 * 3 个特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

We cut our image into four equal quadrants of size 128x128 pixels. Remember that each pixel has 3 channels (R, G and B)

步骤 2:对左上角象限应用一个神经元,将 128 * 128 * 3 的特征转换成一个单一的数字。出于直觉(尽管这并不完全准确),假设这个神经元负责识别 128 * 128 * 3 特征范围内的猫:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

We apply the neuron which takes in the 128 * 128 * 3 features in the top-left quadrant

步骤 3:对右上象限、左下象限和右下象限应用完全相同的神经元。这被称为参数共享,因为我们对所有四个象限使用完全相同的神经元。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

We apply the exact same neuron with the exact same parameters to all four quadrants of the image

第四步:对所有四个象限应用该神经元后,我们有四个不同的数字(直观地说,这些数字代表每个象限中是否有猫)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

We get four different output numbers even though we apply the same neuron since the inputs are different (although the parameters are the same)

记住,我们得到四个不同的数字,因为我们输入了不同的输入特征,即使函数(和参数保持不变)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A formulation of the neuron output in terms of its input features x1, x2 and x3

根据上面的公式,输入特征(x1、x2 和 x3)已经改变,即使填充空白的数字没有改变;因此,这些输入特性会产生不同的输出。

第五步:我们需要一个数字来告诉我们整张照片中是否有一只猫。所以我们只取这四个数字中的最大值来得到一个数字。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

We take the maximum of the four numbers to get one number in the end

这个算法在解决我们之前的问题方面做了什么?

  • 我们最初的担心是有太多的特性,因此有太多的参数。回想一下,即使我们只有一个神经元具有所有这些特征,我们也需要 256 * 256 * 3 + 1 = 196,609 个参数用于每个神经元。如果我们将其分成四个不同的象限,并对所有四个象限使用完全相同的参数,我们只需要 128 * 128 * 3 + 1 = 49,153 个参数,几乎减少了四倍!
  • 猫在图像中的什么位置并不重要,重要的是图像中有一只猫。通过在所有四个象限中使用相同的神经元来识别猫,我们解决了这个问题,因为“识别猫的神经元”应该告诉我们哪个象限有猫!

恭喜你!你已经看到了你的第一个卷积神经网络!现在,这些不是我们在实践中建立的 CNN 的类型,但是概念只是我们已经覆盖的内容的一般扩展。

在接下来的几节中,我们将了解一个典型的 CNN 是由什么组成的。

CNN 拥有的第一个重要的层被称为卷积(Conv)层,它对应于上面算法中的步骤 1 到 4。Conv 层是一种特殊类型的神经网络层,它使用参数共享,并在图像中应用相同的较小的参数集,就像我们在步骤 1 到 4 中对猫识别神经元所做的那样。这不同于标准的神经网络层,其具有用于整个图像的参数。

卷积层有几个我们可以指定的超参数:

  • 滤镜大小。 这对应于一个神经元在宽度和高度维度上接受多少输入特征。在我们之前的例子中,过滤器的大小是 128 * 128,因为每个神经元在空间上看起来是 128 * 128 像素(宽度和高度)。我们总是假设我们不按深度(或通道)分割图像,只按宽度和高度。所以如果我们指定滤波器大小,我们神经元中的参数个数就是 filter _ width * filter _ height * input _ depth+1。在我们的例子中,参数的数量是 128 * 128 * 3 + 1 = 49,153。不过,通常情况下,合理的过滤器尺寸可能更接近 3 * 3 或 5 * 5 的数量级。
  • 泰然处之。有时一只猫并不出现在象限中,而是可能出现在两个(或更多)象限的中间。在这种情况下,也许我们不应该只在四个象限中应用我们的神经元,但我们也希望在重叠区域中应用神经元。Stride 就是当我们再次应用神经元时,我们想要移动(向右/向下)多少像素。在我们之前的例子中,我们以步幅 128 移动,因此我们立即进入下一个象限,而没有访问任何重叠区域。更常见的是,我们通常以步幅 1 或 2 移动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A convolution layer with filter width, filter height and stride. Note that while the red and blue boxes look at different areas, they use the same parameters.

  • 深度。 在我们之前的例子中,我们只应用了一个神经元来识别是否有猫,并通过在每个象限中应用相同的神经元来共享参数。假设我们希望另一个神经元也能识别是否有狗。这种神经元的应用方式与识别猫的神经元相同,但具有不同的参数,因此每个象限的输出也不同。这将如何改变我们的参数和输出大小?嗯,如果我们有两个这样的神经元,我们就会有(128 * 128 * 3+1)* 2 = 98306 个参数。在第 4 步结束时,我们将得到 2 * 2 * 2 = 8 个输出数字。前两项 2 * 2 指的是(我们四个象限区域的)高度和宽度,最后一项 2 指的是每个象限应用了两个不同的神经元。这最后一项就是我们所说的深度。

我不想一口气介绍太多概念,所以我们来做一个小测验来巩固这些概念。

假设我们有一个输入尺寸为 256 * 256 * 3 的图像。我应用了一个过滤器大小为 3 * 3,跨度为 1,深度为 64 的 conv 层。

  • 在我们的 conv 层中有多少参数?
  • 这个 conv 层的输出尺寸是多少?

我鼓励你自己解决这个问题,不要向下滚动来看答案!

— —

好了,下面是答案!(希望你没出轨,反正我也没办法知道):

  • 参数数量:我们计算出深度= 1 的情况,因为从头到尾只应用了一个神经元。这个神经元接受 3 * 3 * 3(滤波器大小*输入通道)个特征,因此这个神经元的参数数量是 3 * 3 * 3 + 1 = 28。我们知道深度= 64,意味着有 64 个这样的神经元。这为我们提供了总共 28 * 64 = 1,792 个参数。
  • 输出尺寸:先从宽度的尺寸上来想。我们在原始输入图像中有一行 256 像素。开始时,我们的过滤器的中心(神经元的输入)将在像素 2,因为我们有一个 3 * 3 的过滤器。因此,由于过滤器的最左侧将在像素 1 处,所以过滤器的中心将在像素 2 处。此过滤器每次向右移动 1 个像素,以应用神经元。在所有步骤结束时,我们的滤镜的中心将位于像素 255,这也是因为我们有一个 3 * 3 的滤镜(因此像素 256 将被滤镜的最右侧占据)。因此,假设我们的过滤器的中心从像素 2 开始,在每一步移动 1 个像素时结束于 255,数学表明我们已经在宽度上应用了神经元 254 次。类似地,我们在高度上应用了神经元 254 次。由于我们有 64 个神经元在做这件事(深度= 64),我们的输出尺寸是 254 * 254 * 64。

此时,您可能会想:那么,如果我希望输出尺寸为 256 * 256 * 64,那么输出的高度和宽度与输入尺寸保持不变呢?在这里,我将引入一个新的概念来处理这个问题:

  • **垫料。**回想一下,3×3 滤波器的中心开始于像素 2(而不是像素 1),结束于像素 255(而不是像素 256)。为了使过滤器的中心从像素 1 开始,我们可以用“0”的边界填充图像,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

This is an example of padding a 3x3 image with a padding border of size 1. This ensures that the center of a 3x3 filter will begin at pixel 1 of the original image.

至此,我们已经确切了解了许多尖端系统中使用的卷积层是什么!我们将介绍另一层,然后我们将所有层放在一个大的架构中,并讨论其背后的直觉!

概要:conv 层中 CNN 常见的一层,由滤波器大小步距深度填充定义。Conv 层使用相同的参数,并在图像的不同区域应用相同的神经元,从而减少所需参数的数量。

我们将经历的下一层被称为池层,它大致对应于开始时布置的算法中的步骤 4 和 5。如果你还记得,我们有四个数字在我们的基本算法后,应用 conv 层,我们希望它减少到一个数字。我们简单地取四个输入数,输出最大值作为输出数。这是 max-pooling 的一个例子,顾名思义,取它所看到的数字的最大值。

更一般地说,池层具有过滤器大小和跨度,类似于卷积层。让我们以深度为 1 的输入为例(即它只有一个深度片)。如果我们应用一个最大池,过滤器大小为 2x2,跨距为 2,因此没有重叠区域,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Max-pooling with filter 2 and stride 2. Note that a max-pool layer of filter 2 and stride 2 is commonly seen in many models today. Image taken from CS231N notes: http://cs231n.github.io/convolutional-networks/

这个最大池似乎非常类似于 conv 层,除了没有参数(因为它只是取过滤器中看到的四个数字的最大值)。然而,当我们引入深度时,我们会看到池层和 conv 层之间的更多差异。

汇集层分别应用于每个单独的深度通道。也就是说,最大池化操作不在不同深度取最大值;它只在单一深度通道中取最大值。这与 conv 层不同,后者合并了来自所有深度通道的输入。这也意味着我们的输出图层的深度大小不会也不能改变,这与输出深度可能不同于输入深度的 conv 图层不同。

最终,汇集层的目的是减少层的空间尺寸(宽度和高度),并且它根本不触及深度。这减少了该池层之后的未来层中所需的参数数量(从而减少了计算)。

举个简单的例子,假设在我们的第一个 conv 层(有池)之后,我们有一个 256 * 256 * 64 的输出维度。我们现在对此应用最大池(过滤器大小为 2x2,步长为 2)操作,最大池层之后的输出尺寸是多少?

— —

答案:128 * 128 * 64,因为 max-pool 操作符将宽度和高度的维度减少了一半,而深度维度保持不变。

总结:CNN 中的另一个常见层是最大池层,由过滤器大小步幅定义,通过取其过滤器内数字的最大值来减小空间大小。

CNN 中常见的最后一层是我们在前面的部分中见过的层,即全连接(FC)层。FC 层与我们的标准神经网络相同——下一层中的每个神经元都将前一层输出中的每个神经元作为输入。因此,命名为完全连接,因为下一层中的所有神经元总是连接到上一层中的所有神经元。展示一个我们在第 1a 部分中见过的熟悉的图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image taken from CS231N Notes (http://cs231n.github.io/neural-networks-1/)

我们通常在 CNN 的最末端使用 FC 层。所以当我们到达这个阶段时,我们可以将神经元展平成一维的特征阵列。如果前一个图层的输出是 7 * 7 * 5,我们可以将它们展平为一行 775 = 245 个要素,作为上图中的输入图层。然后,我们像往常一样应用隐藏层。

总结:我们通常还会在 CNN 的末端使用传统的全连接层。

现在让我们把它们放在一起。计算机视觉研究人员通常使用的一个重要基准是称为 ImageNet 大规模视觉识别挑战(ILSVRC)的挑战。ImageNet 指的是一个巨大的图像数据库,ILSVRC 的挑战是将一幅输入图像准确地分类到 1000 个独立的对象类别中。

在使用深度学习的转折点上受到欢呼的模型之一是 AlexNet,它在 2012 年赢得了 ILSVRC。在一篇题为“历史始于 AlexNet:深度学习方法综合调查”的论文中,我引用:

与所有传统的机器学习和计算机视觉方法相比,AlexNet 实现了最先进的识别准确性。这是机器学习和计算机视觉领域在视觉识别和分类任务方面的重大突破,也是历史上对深度学习兴趣迅速增加的一点。

AlexNet 表明,当我们深入时,精确度可以实现惊人的提高——即像我们看到的那样,将越来越多的层堆叠在一起。事实上,AlexNet 之后的架构决定继续深入,超过一百层!

AlexNet 的架构可以总结如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A simplistic view of the AlexNet Architecture, where some details have been omitted

如您所见,AlexNet 只是由以下构件组成:

  • Conv 层(有相关活动)
  • 最大池层数
  • FC 层
  • Softmax 层

到目前为止,我们都以这样或那样的方式看到了这些层!正如你所看到的,我们已经涵盖了强大的深度学习模型的构建模块,我们需要做的就是将这些层堆叠在一起。为什么把这么多层堆在一起会起作用,每一层到底在做什么?

我们可以想象一些中间层。这是 AlexNet 的第一个 conv 层的可视化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A visualization of the first conv layer in AlexNet. Image taken from CS231N notes: http://cs231n.github.io/understanding-cnn/

我们可以看到,在前几层,神经网络试图提取出一些底层特征。这些最初的几层然后在随后的几层中结合,形成越来越复杂的特征,最后,找出代表像猫、狗等物体的东西。

为什么神经网络会在第一层中特别挑出那些特征?它只是发现这些是表征前几层的最佳参数;他们只是制造了最小的损失。

总结 : AlexNet 是一个革命性的深度学习领域的 CNN,由 conv 层、最大池层和 FC 层构建而成。当许多层放在一起时,前面的层学习低级特征,并在后面的层中组合它们用于更复杂的表示。

综合摘要:图像是一个三维的特征数组:二维空间中的每个像素包含 0-255(包括 0-255)三个数字,分别对应红、绿、蓝三个通道。通常,图像数据包含大量输入特征。Conv 层是 CNN 中常见的一层,由滤镜尺寸步距深度填充定义。Conv 层使用相同的参数,并在图像的不同区域应用相同的神经元,从而减少所需参数的数量。CNN 中的另一个常见层是 max-pooling 层,由过滤器大小步幅定义,它通过取其过滤器中数字的最大值来减小空间大小。我们还通常在 CNN 的末尾使用传统的全连接层。AlexNet 是一个革命性的深度学习领域的 CNN,由 conv 层、最大池层和 FC 层构建而成。当许多层放在一起时,前面的层学习低级特征,并在后面的层中组合它们用于更复杂的表示。

下一步是什么:深度学习不仅改变了我们看待图像识别的方式,还彻底改变了我们处理语言的方式。但是处理语言本身也有一系列的挑战。我们如何将单词表示为数字?此外,一个句子有不同的长度。在输入可能具有不同长度的情况下,我们如何使用神经网络来处理序列?如果你很好奇,直觉深度学习第 3 部分将神经网络应用于自然语言,解决了学习如何将英语句子翻译成法语句子的问题。

如果您对编写您的第一个图像识别模型感兴趣,这篇文章附带了一个编码伴侣:

[## 建立你的第一个卷积神经网络来识别图像

一步一步的指南,建立自己的图像识别软件与卷积神经网络使用 Keras 上…

medium.com](https://medium.com/intuitive-deep-learning/build-your-first-convolutional-neural-network-to-recognize-images-84b9c78fe0ce)

这篇帖子最初是作为直觉深度学习入门系列的第三篇帖子出现的。我的使命是用纯粹直观的方式解释深度学习概念!如果你是一个非技术初学者,我想为你提供深度学习内部工作原理背后的直觉,让你使用相同的语言和行话与技术工程师交流,即使你不知道背后的数学或代码。如果你是一名深度学习的学生,我相信获得坚实的直觉基础将有助于你更好地理解你正在学习的课程中的所有数学和代码,为你提供一种更少痛苦的方式来学习这些概念。

关于作者:

你好,我是约瑟夫!我最近从斯坦福大学毕业,在那里我和吴恩达一起在斯坦福机器学习小组工作。我想让深度学习的概念尽可能直观,尽可能容易被每个人理解,这激励了我的出版:直观的深度学习

交叉熵的直观解释

原文:https://towardsdatascience.com/intuitive-explanation-of-cross-entropy-5d45fc9fd240?source=collection_archive---------7-----------------------

首先,我们需要理解的概念(很大程度上借用了可汗学院优秀的解释)。

让我们玩游戏。

游戏 1:

我将从一袋硬币中抽出一枚硬币:一枚蓝色硬币、一枚红色硬币、一枚绿色硬币和一枚橙色硬币。你的目标是用最少的问题猜出它是什么颜色。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最好的策略之一是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每枚硬币有 1/4 的概率被选中,猜对两个问题。所以猜硬币的预期问题数是 2。

游戏 2:

现在,我将从一袋硬币中抽出一枚硬币:1/2 是蓝色的,1/4 是红色的,1/8 是绿色的,1/8 是橙色的。以前的策略不再是最好的;因为抽到蓝色硬币的机会很大,所以我们应该优先猜测最有可能的结果。你的最优策略现在看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1/2 的时候是蓝色的,要猜 1 题。1/4 的时候是红色的,要猜 2 题才能猜出来。按这个逻辑,猜一个硬币的期望题数是 1/2 × 1(蓝色)+ 1/4 × 2 题(红色)+1/8 × 3 题(绿色)+ 1/8 × 3 题(橙色)= 1.75。

游戏 3:

为了对比一个极端的例子,我从一袋蓝色硬币中抽取。很简单,猜我的硬币的颜色需要 0 个问题。或者… log(1) = 0 问题如果我们用搞笑的方式写的话。注意,只有当你知道这是一袋蓝色时,才需要 0 个问题。

有趣的是,出现了一种模式:一个概率为 p 的硬币需要 log (1/p)个问题才能答对。比如 p = 1/4 时,log(4) = 2 题(本帖所有对数均以 2 为基数)。所以总的来说,这个游戏的预期问题数是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

。这就是熵的表达式。直观来看,就是这个博弈的最优策略下猜色的预期题数。 设定越不确定(游戏 1 >游戏 2 >游戏 3),熵越高。

现在,让我们从转移到交叉熵

对于第二场比赛,如果我们仍然使用第一场比赛的策略,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,1/8 的时候,硬币是橙色的,要做对 2 道题。1/2 的时间,它是蓝色的,但仍然需要 2 个问题才能答对。平均下来,需要 1/8 × 2 + 1/8 × 2 + 1/4 × 2 + 1/2 × 2 = 2 个问题才能答对,而不是用我们之前讨论的最优策略的 1.75。所以在博弈 2 中使用博弈 1 策略是一个更差的策略,2 是在这个设置中使用这个策略的交叉熵。

因此,**给定策略的交叉熵就是在该策略下猜测颜色的预期问题数。对于给定的设置,策略越好,交叉熵越低。**交叉熵最低的是最优策略的交叉熵,也就是上面定义的熵。这就是为什么在机器学习的分类问题中,人们试图最小化交叉熵。

更正式地说,交叉熵是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

,其中 p_i 是真实概率(例如,橙色和绿色为 1/8,红色为 1/4,蓝色为 1/2),而{p_i}是错误假设的概率(例如,使用策略 1,我们假设所有颜色的 p = 1/4)。可能很容易混淆日志中是 p 还是{p}。在这个解释下,就很好记了:log 是用来计算策略下的题数的,所以 log 下面的是的预测概率,\hat{p}。

所以,在决策树中,如果你的树不是以最佳方式构建的,你基本上是错误地假设了结果的概率分布,交叉熵很高。

交叉熵不仅仅是关于决策树;它适用于所有分类问题。在二元分类问题中,标签 y 为 1 的可能性就是你预测的 y,\ hat { y };y 为 0 的可能性是 1 -\hat{y}。所以我们可以用一种巧妙的方式写出我们想要最大化的可能性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

。当 y 为 1 时,乘积中的第二项为 1,我们希望最大化{ y };当 y 为 0 时,乘积中的第一项为 1,我们希望最大化 1 — \hat{y}。这仅在 y 取值为 0 或 1 时有效。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最大化可能性的对数相当于最小化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这只是交叉熵的表达式。**这就是交叉熵被称为对数损失的原因。最小化交叉熵最大化对数似然。**举个例子,我的分类里有三个数据点,它们的真实标签是 1,1,0,我预测的 y 是 0.8,0.9,0.3。那么平均交叉熵就是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我完美预测为 1,1,0,那么交叉熵为 0。(从技术上讲,log 在 0 处没有很好的定义,但是我们可以忽略这个术语。)使用硬币游戏类比,在这里,对于样本 y 的每个预测是具有游戏 3 设置的单独的硬币猜测游戏。第一个样本 y=1 就像从一个只包含“y = 1”的袋子里抽出一枚硬币。现在,如果你是一个忍者猜测者(又名完美算法),那么你也知道它必须是一个全 1 的包。所以你的\hat{p} = 1。第二个和第三个样本也是如此。因此,对于完美的算法,交叉熵是 0。

原载于www.quora.com

直观的超参数优化:网格搜索,随机搜索和贝叶斯搜索!

原文:https://towardsdatascience.com/intuitive-hyperparameter-optimization-grid-search-random-search-and-bayesian-search-2102dbfaf5b?source=collection_archive---------16-----------------------

机器学习算法中的超参数就像煤气炉中的旋钮。就像我们调整煤气炉上的旋钮,直到我们达到正确的设置,让食物按照我们喜欢的方式烹饪。同样,我们调整机器学习算法的超参数,使其工作在最佳水平,并获得我们想要的性能水平。

在我开始讨论超参数优化的搜索算法之前,让我打破一些人们对超参数的常见误解!

误区一:参数和超参数相同

这种混乱背后的原因是,在机器学习算法中存在两种类型的可学习实体:参数和超参数。参数由模型在学习期间学习,而超参数由用户在学习之前设置。

流言终结者警报

参数: 训练时学习到的机器学习模型的实体。

超参数 :训练开始前设置的机器学习模型的实体。

例如,让我们考虑逻辑回归。逻辑回归是一种分类算法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图展示了逻辑回归模型。让我简单解释一下逻辑回归背后的思想。对于任何给定的输入数据 X,我们首先学习 Z=WX+B 形式的线性模型,其中 W 和 B 充当参数。然后我们计算 Z 的 sigmoid,结果是 0 和 1 之间的值。因此,为了决定给定数据点属于哪一类(类 0 或类 1),我们通常设置阈值(例如阈值=0.5),这有助于决定类。如果 sigmoid 输出的值大于阈值,则分类任务的输出为 1,即数据点属于类 1,否则属于类 0。诸如 W 和 B 的实体被认为是在给定数据 x 的训练期间学习的参数。而诸如优化算法的类型、正则化技术、α或学习速率、C(用于保持正则化强度的正则化参数的逆,即 C = 1/λ)的实体是超参数的例子。

让我们看看另一个关于超参数优化的常见误区。

误区 2 : 使用超参数的默认值就足够了。没有必要试着去调它们。

超参数的默认值可以被各种机器学习库如 sklearn、Hyperopt 等选为默认值,因为它们对于学术文献中的某些测试问题是足够好的组合。但是,这样的值对于您的问题陈述可能并不理想。永远记住,运用这些价值观,看看什么最适合你。不相信我?开始在数据集上测试这些超参数的不同组合。你会自动看到不同之处!

流言终结者警报

默认值仅针对选定的少数问题陈述进行测试,可能不是您的问题的最佳超参数选择。所以,总是调整你的超参数!

现在,我们已经打破了一些关于超参数优化的常见神话。让我来讨论一些最常见的超参数优化技术。即 网格搜索随机搜索贝叶斯搜索

网格搜索 是一种尝试超参数集所有可能组合的方法。超参数的每个组合代表一个机器学习模型。因此,N 个组合代表 N 个机器学习模型。通过网格搜索,我们确定了表现出最佳性能的模型。这使得网格搜索不仅在时间复杂度上非常昂贵,在空间复杂度上也是如此。

看下图。正则化类型(惩罚)和 C 是逻辑回归的超参数,如下所示。

逻辑回归的超参数

正则化类型(或惩罚)= { l1,l2,None}

= { 0.1,1}

网格搜索在给定数据上测试这些值的所有组合(所有可能的模型),并通过使用用户指定的评估度量(如准确度、精确度、召回率等)来找到最佳可能的模型。

组合 :

{penalty: l1,C=0.1} == > 模型 1

{惩罚:l1,C=1}。== > 型号 2

{惩罚:l2,C=0.1} == > 模型 3

{penalty: l2,C=1} == > 模型 4

{罚:无,C=0.1} == > 模型 5

{惩罚:无,C=1} == > 模型 6

换句话说,网格搜索将一次获取一个惩罚和 C 的组合(一次一个模型),并将其拟合到训练数据(或交叉验证折叠)上,并计算其表现如何。它将对所有可能的(如上所示)组合执行此操作,最终选择表现最佳的模型。请注意,存在更多的逻辑回归超参数,但为了简洁起见,我只选择了其中的两个来演示网格搜索是如何工作的。

***网格搜索:*测试给定机器学习算法的超参数的所有可能排列组合。

随机搜索 另一方面、* 是一种我们尝试随机选择超参数组合的方法。这通常在计算上非常便宜,并设法给我们提供足够好的超参数组合,从而实现所需的性能水平。*

换句话说,随机搜索可能很快从所有可能性中选择惩罚和 C 的随机组合(如上所示),并且只测试那些选择的组合。

随机搜索:从可搜索空间中随机选择超参数的组合(所有可能的组合)。

随机搜索的唯一问题是,它没有告诉我们如何选择超参数组合。这个过程完全是随机的,没有办法知道是否存在更好的组合。没有办法缩小搜索空间,因为我们实际上不知道在哪里可以找到更好的价值。

贝叶斯搜索 从另一方面解决了上述问题。这是另一种众所周知的超参数优化方法。顾名思义,该技术基于贝叶斯原理。贝叶斯原理基本上说,后验概率分布与赋予它的先验(先验概率分布)和似然函数成正比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source of Image: https://luminousmen.com/post/data-science-bayes-theorem

简而言之,先验概率分布可以被视为提供给模型的专家知识,以帮助增加机器学习模型通过查看训练数据掌握的知识。假设事件 A 已经发生,似然函数可以被视为对事件 B 有多可能发生(或为真)的理解。最后但并非最不重要的是,后验概率分布可以被认为是最终的学习模型,它包含专家领域知识并考虑给定输入数据的可能性。

因此,贝叶斯优化或贝叶斯搜索考虑了先前已知的知识(先验知识),并且仅搜索那些它认为将提高模型性能的超参数组合。

贝叶斯搜索 :基于贝叶斯规则并考虑先前已知的知识,帮助缩小良好超参数组合的搜索空间。

贝叶斯搜索通常比随机搜索花费更多时间,但比网格搜索花费更少时间。

按时间复杂度排序

网格搜索>贝叶斯搜索>随机搜索

我希望这篇文章有助于澄清一些关于超参数优化的最常见的疑问。

感谢您的阅读!

继续学习!

资源:

sk learn/Scikit learn:https://scikit-learn.org/stable/

逻辑回归:https://sci kit-learn . org/stable/modules/generated/sk learn . linear _ model。LogisticRegression.html

远视:https://github.com/hyperopt/hyperopt

理解贝叶斯原理的一个很好的来源是:【https://luminousmen.com/post/data-science-bayes-theorem】

对深度学习中注意机制的直观理解

原文:https://towardsdatascience.com/intuitive-understanding-of-attention-mechanism-in-deep-learning-6c9482aecf4f?source=collection_archive---------0-----------------------

注意力神经机器翻译的张量流实现

警告

这是一个稍微高级的教程,需要对使用 RNNs 的序列到序列模型有基本的理解。请参考我早先的 博客这里 ,我在其中详细解释了 Seq2Seq 模型的概念。

目录

  1. 介绍
  2. 注意力背后的中心思想
  3. 为什么叫注意?
  4. 注意力是如何工作的?
  5. 代码遍历
  6. 可视化结果
  7. 参考

1.介绍

注意力是深度学习社区中最有影响力的思想之一。尽管这种机制现在用于各种问题,如图像字幕等,但它最初是在使用 Seq2Seq 模型的神经机器翻译的上下文中设计的。在这篇博文中,我将考虑与运行示例相同的问题来说明这个概念。我们将利用注意力来设计一个系统,将一个给定的英语句子翻译成马拉地语,这个例子和我在早先的博客中考虑的完全一样。

那么 seq2seq 车型有什么问题呢?

seq2seq 模型通常由编码器-解码器架构组成,其中编码器处理输入序列,并将信息编码/压缩/汇总到固定长度的上下文向量(也称为“思维向量”)中。这种表示应该是对整个输入序列的一个很好的总结。解码器然后用这个上下文向量初始化,使用它开始产生变换的输出。

这种固定长度上下文向量设计的一个关键且明显的缺点是系统不能记住更长的序列。一旦它处理了整个序列,经常会忘记序列的前面部分。注意力机制就是为了解决这个问题而诞生的。

让我们把它分解成更详细的细节。由于我已经在之前的 博客 中解释了理解注意力所需的大部分基本概念,这里我将直接进入问题的实质,不再赘述。

2.注意力背后的中心思想

为了便于说明,我将借用我在之前的 博客 中用来解释 Seq2Seq 模型的同一个例子。

输入(英语)句子:“拉胡尔是个好孩子”

目标(马拉地语)句子:“राहुल चांगला मुलगा आहे”

唯一的变化将是,而不是 LSTM 层,我用在我以前的解释,这里我将使用 GRU 层。原因是 LSTM 有两种内部状态(隐藏状态和单元状态),而 GRU 只有一种内部状态(隐藏状态)。这将有助于简化概念和解释。

回想下图,其中我总结了 Seq2Seq 建模的整个过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在传统的 Seq2Seq 模型中,我们丢弃编码器的所有中间状态,仅使用其最终状态(向量)来初始化解码器。这种技术适用于较小的序列,但是随着序列长度的增加,单个向量成为瓶颈,很难将长序列总结成单个向量。这种观察是凭经验得出的,因为注意到随着序列大小的增加,系统的性能急剧下降。

注意力背后的中心思想不是丢弃那些中间编码器状态,而是利用所有的状态来构建解码器生成输出序列所需的上下文向量。

3.为什么叫注意?

让我们将编码器的每个中间状态命名如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Encoder GRU

请注意,由于我们使用的是 GRU 而不是 LSTM,因此我们在每个时间步只有一个状态,而不是两个状态,这有助于简化图示。还要注意,注意力尤其在较长序列的情况下是有用的,但是为了简单起见,我们将考虑上述相同的示例进行说明。

回想一下,这些状态(h1 到 h5)只不过是固定长度的向量。为了发展一些直觉,把这些状态想象成在序列中存储局部信息的向量。比如说;

h1 存储出现在序列开头的信息(如“Rahul”和“is”)而 h5 存储出现在序列后面部分的信息(如“good”和“boy”)。

让我们用下面的简图来表示我们的编码器 GRU:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Compact Representation of Encoder GRU

现在的想法是共同利用所有这些局部信息,以便在解码目标句子时决定下一个序列。

想象你正在把“拉胡尔是个好孩子”翻译成“राहुल चांगला मुलगा आहे".”扪心自问,你在脑子里是怎么做到的?

当您预测“राहुल”时,很明显这个名字是单词“Rahul”出现在输入的英语句子中的结果,而不管句子的其余部分。我们说在预测“राहुल”时,我们更关注 输入句子中的单词“Rahul”。

类似地,当预测单词“चांगला”时,我们更关注输入句子中的单词“好”。

类似地,在预测单词“मुलगा”时,我们更关注输入句子中的单词“男孩”。等等…

由此得名“立正”。**

作为人类,我们能够很快理解输入序列的不同部分和输出序列的相应部分之间的映射。然而,人工神经网络自动检测这些映射并不是那么简单。

这样注意力机制通过梯度下降和反向传播发展到 【学习】 这些映射。

4.注意力是如何工作的?

让我们从技术角度切入注意力机制的本质。

在时间步长 1 解码

继续上面的例子,假设我们现在想要我们的解码器开始预测目标序列的第一个字,即“राहुल”

在时间步骤 1,我们可以将整个过程分为五个步骤,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Decoding at time step 1

在开始解码之前,我们首先需要将输入序列编码成一组内部状态(在我们的例子中是 h1、h2、h3、h4 和 h5)。

现在的假设是,输出序列中的下一个字取决于解码器的当前状态(解码器也是 GRU)以及编码器的隐藏状态。因此,在每个时间步,我们考虑这两件事,并遵循以下步骤:

步骤 1 —计算每个编码器状态的分数

因为我们预测的是第一个字本身,所以解码器没有任何当前的内部状态。为此,我们将编码器的最后状态(即 h5)视为先前的解码器状态。

现在使用这两个组件(所有编码器状态和解码器的当前状态),我们将训练一个简单的前馈神经网络。

为什么?

回想一下,我们试图预测目标序列中的第一个单词,即“राहुल".”按照 attention 背后的思想,我们不需要所有的编码器状态来预测这个单词,但是我们需要那些存储关于输入序列中单词“Rahul”的信息的编码器状态。

如前所述,这些中间编码器状态存储输入序列的本地信息。所以很有可能单词“Rahul”的信息会出现在状态中,比如说 h1 和 h2。

因此,我们希望解码器更多地关注状态 h1 和 h2,而较少关注编码器的其余状态。

为此,我们训练一个前馈神经网络,该网络将学习以通过为需要注意的状态生成高分而为需要忽略的状态生成低分来识别相关的编码器状态。

设 s1、s2、s3、s4 和 s5 是对应于状态 h1、h2、h3、h4 和 h5 生成的分数。因为我们假设我们需要更多地关注状态 h1 和 h2,而忽略 h3、h4 和 h5,以便预测“राहुल”,所以我们期望上述神经生成分数,使得 s1 和 s2 高,而 s3、s4 和 s5 相对低。

第二步——计算注意力权重

一旦生成这些分数,我们就对这些分数应用 softmax,以产生如上所示的注意力权重 e1、e2、e3、e4 和 e5。应用 softmax 的优势如下:

a)所有权重位于 0 和 1 之间,即 0 ≤ e1,e2,e3,e4,e5 ≤ 1

b)所有权重总和为 1,即 e1+e2+3+e4+e5 = 1

因此,我们得到了注意力权重的一个很好的概率解释。

在我们的例子中,我们期望如下的值:(只是出于直觉)

e1 = 0.75,e2 = 0.2,e3 = 0.02,e4 = 0.02,e5 = 0.01

这意味着在预测单词“राहुल”时,解码器需要更多地关注状态 h1 和 h2(因为 e1 和 e2 的值很高),而忽略状态 h3、h4 和 h5(因为 e3、e4 和 e5 的值很小)。

步骤 3——计算上下文向量

一旦我们计算了注意力权重,我们需要计算解码器将使用的上下文向量(思维向量),以便预测序列中的下一个单词。计算如下:

context _ vector = E1 * h1+E2 * H2+E3 * H3+E4 * H4+E5 * H5

显然,如果 e1 和 e2 的值高,而 e3、e4 和 e5 的值低,则上下文向量将包含来自状态 h1 和 h2 的更多信息,以及来自状态 h3、h4 和 h5 的相对较少的信息。

步骤 4——将上下文向量与先前时间步骤的输出连接起来

最后,解码器使用以下两个输入向量来生成序列中的下一个字

a)上下文向量

b)从前一时间步生成的输出字。

我们简单地连接这两个向量,并将合并后的向量提供给解码器。注意,对于第一个时间步,由于没有来自前一个时间步的输出,我们为此使用一个特殊的<开始>标记。这个概念在我之前的 博客 中已经详细讨论过了。

步骤 5—解码器输出

然后,解码器生成序列中的下一个字(在这种情况下,预计会生成“राहुल”),随着输出,解码器还会生成一个内部隐藏状态,我们称之为“d1”。

在时间步长 2 解码

现在,为了生成下一个单词“चांगला”,解码器将重复相同的过程,该过程可在下图中总结:

这些变化在绿色圆圈中突出显示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Decoding at time step 2

在时间步长 3 解码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Decoding at time step 3

在时间步长 4 解码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Decoding at time step 4

在时间步长 5 解码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Decoding at time step 5

一旦解码器输出了令牌,我们就停止生成过程。

注意,与在传统 Seq2Seq 模型的情况下用于所有解码器时间步骤的固定上下文向量不同,在这里,在注意力的情况下,我们通过每次计算注意力权重来为每个时间步骤计算单独的上下文向量。

因此,使用这种机制,我们的模型能够发现输入序列的不同部分和输出序列的相应部分之间的有趣映射。

注意,在网络的训练期间,我们使用教师强制,以便输入实际单词,而不是来自前一时间步的预测单词。这个概念在我之前的 博客 中也有解释。

5.代码遍历

与任何 NLP 任务一样,在读取输入文件后,我们执行基本的清理和预处理,如下所示:

对于任何给定的词汇表,创建一个类来将每个单词映射到一个索引,反之亦然:

我们使用 tf.data 输入管道来创建数据集,然后以小批量的方式加载它。要阅读更多关于 TensorFlow 中输入管道的信息,请阅读官方文档 此处此处

现在使用 TensorFlow 的模型子类 API,我们将模型定义如下。要了解更多关于模型子类化的信息,请点击 阅读官方文档

:请阅读下面代码部分的注释,以便更好地理解我们上面讨论的概念。代码中大多数重要的行都指向上面给出的解释的相应部分。

定义优化器、损失函数和检查点

使用急切执行,我们为 10 个时期训练网络。要阅读更多关于渴望执行的内容,请参考官方文档 这里

推理设置和测试:

6.可视化结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你不熟悉热图,你可以这样理解上面的图:

请注意,“父亲”和“बाबांनी”交叉处的单元格非常暗,这意味着当解码器预测单词“बाबांनी”时,它会更多地关注输入单词“父亲”(这正是我们想要的)。

类似地,在预测单词“कॅमेरा”时,解码器非常关注输入单词“照相机”。诸如此类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

首先要注意的是,翻译结果比我之前的 博客 要好很多。其次,该模型能够在输入和输出序列之间找到正确的局部映射,这些映射与我们的直觉相匹配。

给定更多的数据和更多的超参数调整,结果和映射肯定会有很大的改进。

使用 LSTM 层代替 GRU 并在编码器上添加双向包装器也将有助于提高性能。

深度学习模型通常被认为是黑盒,这意味着它们不具备解释其输出的能力。然而,注意力是成功的方法之一,它有助于使我们的模型可解释,并解释为什么它会这样做。

注意机制的唯一缺点是非常耗时,并且难以并行化系统。为了解决这个问题,谷歌大脑提出了“变压器模型”,该模型仅使用注意力,并消除了所有卷积和递归层,从而使其高度并行化和计算高效。

7.参考

PS:完整实现,参考我的 GitHub 库 这里

逆投影变换

原文:https://towardsdatascience.com/inverse-projection-transformation-c866ccedef1c?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 1: 3D points back-projected from a RGB and Depth image

深度和反向投影

当相机捕捉到一个场景的图像时,我们会丢失深度信息,因为 3D 空间中的对象和点被映射到 2D 图像平面上。这也称为投影变换,其中世界上的点被转换为 2d 平面上的像素。

但是,如果我们想做*逆呢?*也就是说,我们希望在只给定 2D 图像的情况下恢复和重建场景。为此,我们需要知道每个对应像素的深度或 Z 分量。深度可以表示为如图 2(中间)所示的图像。较亮的强度表示较远的点。

理解深度知觉在许多计算机视觉应用中是必不可少的。例如,能够测量自主车辆的深度可以更好地做出决策,因为代理完全知道其他车辆和行人之间的间距。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 2: (from left) RGB, Depth, 3D back-projected points

透视视角下的推理难度

考虑上面的图 2,仅给出 RGB 图像。很难判断左侧车道上两辆车之间的绝对距离。此外,我很难确定左边的树是离房子很近还是非常远。上述现象是**透视投影的结果,**透视投影要求我们依靠各种线索来对距离进行良好的估计。在这篇文章中,我讨论了一些你可能感兴趣的问题:)

然而,如果我们在深度图的帮助下将其重新投影回 3d(图 2。右),我们可以准确地定位树木,并认为他们实际上是远离建筑物。是的,当一个物体被另一个物体遮挡时,我们真的不擅长计算相对深度。主要的收获是只看图像,很难辨别深度。

估计深度的问题是一项正在进行的研究,多年来取得了很大进展。已经开发了许多技术,最成功的方法来自使用立体视觉确定深度[1]。并且在最近几年,使用深度学习的深度估计已经显示出令人难以置信的性能[2],[3]。

在本文中,我们将浏览并理解执行从 2D 像素坐标到 3D 点的反投影的数学和概念。然后,我将通过 Python 中的一个简单示例来展示实际的投影。此处有代码。我们将假设提供深度图来执行 3D 重建。我们将经历的概念是相机校准参数、使用内蕴及其逆的投影变换、帧之间的坐标变换。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3D reconstructed point clouds from the scene in Fig 2

针孔摄像机模型的中心投影

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 3: Camera Projective Geometry

首先,理解相机投影的几何模型是核心思想。我们最终感兴趣的是深度,参数 Z. 这里,我们考虑最简单的没有歪斜或失真因子的针孔相机模型。

3D 点被映射到图像平面(u,v) = f(X,Y,Z)。描述这种转换的完整数学模型可以写成 p = K[R|t] * P.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 4: Camera Projective Model

在哪里

  • p 是图像平面上的投影点
  • k 是摄像机内部矩阵
  • [R|t]是描述世界坐标系中的点相对于摄像机坐标系的变换的外部参数
  • p,[X,Y,Z,1]表示在欧几里得空间中预定义的世界坐标系中表示的 3D 点
  • 纵横比缩放,s:控制当焦距改变时,像素如何在 x 和 y 方向缩放

内在参数矩阵

矩阵 K 负责将 3D 点投影到图像平面。为此,必须将下列量定义为

  • 焦距(fx,fy):测量图像平面 wrt 到相机中心的位置。
  • 主点(u0,v0):图像平面的光学中心
  • 倾斜因子:如果图像平面轴不垂直,则偏离正方形像素。在我们的例子中,这被设置为零。

求解所有参数的最常见方法是使用棋盘法。其中,借助于 PnP、直接线性变换或 RANSAC,通过匹配和求解未知参数来获得若干 2D-3D 对应,以提高鲁棒性。

确定了所有未知数后,我们可以通过应用逆运算来最终恢复 3D 点(X,Y,Z)。

反投影

考虑图 4 中的等式。假设(X,Y,Z,1)在摄像机坐标系中。即我们不需要考虑外部矩阵[R|t]。扩展该等式将得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 5: Equation mapping 3D to 2D point

3D 点可以通过深度图给定的 Z 值以及对 X 和 y 的求解来恢复。如果需要,我们可以进一步将这些点转换回世界坐标系。

逆投影示例

让我们通过一个简单的例子来理解这些概念。我们将使用如图 1 所示的 RGB 和深度图像。图片是从模拟器卡拉的汽车上安装的摄像机中获取的。深度图存储为 float32,对于无限远的深度值,编码最大为 1000 米。

视场的固有参数

代替使用棋盘确定内部参数,可以计算针孔照相机模型的焦距和光学中心。所需信息是以像素为单位的成像传感器高度和宽度以及垂直和水平方向的有效视野。相机制造商通常会提供这些。在我们的例子中,我们将在垂直和水平方向都使用±45 度。我们将比例因子设置为 1。

参考图 3,焦距(fx,fy)和主点(u0,v0)可以使用简单的三角学来确定。我把它留给你作为一个练习来推导,或者你可以在代码中查找它!

现在,我们可以计算如下的倒数

  • 获得摄像机固有参数 K
  • 求 K 的倒数
  • 应用图 5 中的公式,Z 为深度图中的深度。
# Using Linear Algebra
cam_coords = K_inv @ pixel_coords * depth.flatten()

编写步骤 3 的一种更慢但更直观的方式是

*cam_points = np.zeros((img_h * img_w, 3))
i = 0
# Loop through each pixel in the image
for v in range(height):
    for u in range(width):
        # Apply equation in fig 5
        x = (u - u0) * depth[v, u] / fx
        y = (v - v0) * depth[v, u] / fy
        z = depth[v, u]
        cam_points[i] = (x, y, z)
        i += 1*

你会得到同样的结果!

结论

好了,我已经讲了做反投影所需的基本概念。

反投影到 3D 形成了经由结构形式运动的 3D 场景重建的基础,其中从移动的相机捕捉若干图像,以及其已知或计算的深度。此后,匹配和拼接在一起,以获得对场景结构的完整理解。

[## darylclimb/cvml_project

使用计算机视觉和机器学习的项目和应用

github.com](https://github.com/darylclimb/cvml_project/tree/master/projections/inverse_projection)

正投影:俯视图(可选)

使用 3D 表示的点,一个有趣的应用是将其投影到场景的自上而下的视图中。对于移动机器人来说,这通常是一种有用的表示,因为障碍物之间的距离保持不变。此外,它易于解释和利用来执行路径规划和导航任务。为此,我们需要知道这些点参考的坐标系。

我们将使用如下定义的右手坐标系

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 6: Camera coordinate and pixel coordinate

对于这个简单的例子,你认为点应该投影到哪个平面?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 7: Top-down view

如果你的猜测是在 y= 0 的平面上,那么你是对的,因为 y 代表相机坐标系定义的高度。我们简单地折叠投影矩阵中的 y 分量。

查看下图,您可以轻松测量所有车辆和物体之间的间距。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 8: Birds Eye View projection

参考

[1]赫希米勒,H. (2005 年)。通过半全局匹配和互信息进行准确有效的立体处理。 CVPR

[2]周廷辉、马修·布朗、诺亚·斯内夫利和大卫·劳。来自视频的深度和自我运动的无监督学习。2017 年在 CVPR

[3]克莱门特·戈达尔、奥辛·麦克·奥德哈和加布里埃尔·J·布罗斯托。具有左右一致性的无监督单目深度估计。2017 年在 CVPR。

倒 U 型和云计算架构:进化也是学生和悬崖的事情!

原文:https://towardsdatascience.com/inverted-u-and-cloud-computing-architectures-evolution-is-also-a-matter-of-students-and-cliffs-b264616fdba8?source=collection_archive---------32-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

source: https://en.wikipedia.org/wiki/White_Cliffs_of_Dover

首先,什么是倒 U 型?

倒 U 形是一种图形,用于探索经济、社会和其他类型的事件,该图形由一条钟形线组成,可用于表示一个值(A)的增加将导致另一个值(B)增加的情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,在倒 U 型的情况下,当你增加 A 的比例没有增加 B 的时候,它实际上开始减少 A。

在这种情况下,当数量 A 开始降低 B 的值时,可以获得最佳性能。最佳结果是使用较低水平的 A 获得较高水平的 B。

让我们举个例子,马尔科姆·格拉德威尔,在他最近的书[ 大卫和歌利亚 ]中探索了一个有趣的观点。

一个班有很多学生好还是只有几个学生好?

嗯,与常识所说的不同[我的教授会说越少越好],有一点你可以取得更好的结果,这与班级的大小直接相关,如果你只有几个学生,比如说少于 12 个,班级太小,老师不会有在课堂上如此重要的多样化的观点[仅举一个例子],但是, 假设你有超过 50 个,那么,你会有很多不同的意见,但老师会缺乏对具体案例的关注。

在这种情况下,很明显,如果你开始增加一个班级的学生人数,参与度,注意力或其他参数也会增加,至少直到班级过大的某一点,结果是相反的,你开始失去一些东西。格拉德威尔描绘了其他几个场景,这是一本值得一读的书。

这和云计算有什么关系?

我就要到了伙计[冷静!],我们先找一个计算机科学中的倒 U 型场景,好吗?

嗯,你们都听说过线程吧?[如果你不记得了,看看这个视频

图像有大量数据要处理,但只有一个线程来处理,假设这个处理过程需要 100 分钟才能完成,如果线程数量增加一倍,处理时间将减少到 50 分钟。如果您启动第三个线程,处理时间也将减少,让我们到 37 分钟,使用第四个线程,处理时间将减少到 30 分钟,您可以看到时间的减少与线程数量有直接关系吗?【当然可以!].

常见的错误是假设“好的,那么…我将增加到 1000 个线程,时间将接近 0[零]!”。不是这样的,有一个极限,在某个时刻,无论你增加多少线程数,时间都不会减少,最有可能的是会增加

“好的,那么你是说没有办法把时间减少到接近 0[zero]?!"

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不,我不是那个意思!

我要说的是,你遇到了一个倒 U 型情景,为了打破拐点,无论你增加多少其他变量,你都开始失去一些东西,这就需要适应和改变你的方法,类似于我们在这里解释的,这正是云计算的用武之地。

就云而言,我们假设轴 B ,是性能、请求数量、数据量,以及与您的解决方案相关的东西。轴 A 是你使用多少服务来做这件事。如果您开始增加虚拟机的数量(在 AWS、EC2 机器的情况下),您的轴 B 也会增加,直到几乎无法管理数千台机器。然后你决定拿出一些机器,使用带有冗余、副本和其他东西的数据库服务( RDS )。现在你的 DB,会继续上升[耶!!】,但是【没有但是,加油!],没有更大的数据库可以使用,它变得太慢太贵,解决方案是添加不同类型的存储,非 SQL 数据库( Dynamo )和对象存储(像 S3 )。

你能看出这将把我们引向何方吗?

你已经从几个服务[服务器]开始,你必须进化以避开倒 U 形图形的拐点,在云计算的情况下,你必须进化你的架构,以便进化你的应用。只有通过改变,而不仅仅是增加 a,才有可能达到更高的 B。

这就像爬悬崖一样,你从海滩开始,你走了一点点,突然你开始向山上走,然后再走几米[ 也许几公里 ]后,你仍然在向上走,你对海洋的看法越来越好,在某个时候你意识到这是线的尽头,你会继续走下去,掉到海里吗?还是需要适应,坐直升机,继续旅程?我打赌直升机听起来不错,对吧?!

睁大眼睛,满怀信心地投资

原文:https://towardsdatascience.com/invest-with-confidence-with-your-eyes-wide-open-1b5f0d846922?source=collection_archive---------29-----------------------

知道自己的风险。在做出投资决定之前,一种有意义的看待风险的方式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当一个人在寻找共同基金或股票进行投资时,通常会看到评级、风险规模、绩效汇总统计数据,如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Taken from some popular Investment Portals

当试图比较不同的选择时,获得这种相对评级是非常好的。像“n”年的回报这样的汇总指标告诉我们一只基金在最近几年的表现如何,以及如果事情以同样的方式继续下去,人们可能期望获得什么样的回报。

但是,对于那些多年来一直关注金融市场和投资表现的人来说,很明显,事情很少以同样的方式继续下去!想想主要的市场变动事件或商业周期变化——衰退、繁荣期、政治变化、贸易战、真正的战争……你明白了!

考虑到所有这一切,人们可能想要以下问题的答案:

  1. 如果明年市场经历长期低迷,我会损失多少?

2.如果我在这次衰退中继续投资,需要多长时间才能收回我的损失?

3.如果像 2008 年次贷危机这样的事件现在再次重演会怎样?与正在进行的银行业NBFC 危机(及其对汽车行业可能的传染效应)有一些相似之处,因为它与资产质量有关。我的投资会下跌 20%还是 50%?

4.如果美联储可能宣布降息,会对我的投资有帮助吗?如果是,增加多少?

5.从短期来看,市场一周的糟糕表现会导致 2%或 10%的账面损失吗?我会因为这些动作失眠吗?

在本文的其余部分,让我们回顾一下看待风险的一种不同但有意义的方式,以及我们如何回答这些实际问题。

印度共同基金印度股票提供了直观的分析驱动工具。例如,请参见下图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

短期的紧张

为了评估典型的周/月/季度表现,资产的历史回报分布可能非常有帮助。它们不仅帮助我们衡量预期的范围,还显示了真正糟糕的一周会是什么样子,以及这样的一周有多频繁。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面让我们一起比较一下两只股票型共同基金的表现。如果我们仔细观察,左边的基金波动性更大,相对于右边的基金,它经历了更明显的季度收益和下跌。更高的 beta(对整体市场的敏感度)进一步验证了这一点。

因此,在其中一个季度,左侧基金在 2018 年经历了远超 16%的跌幅。对于上述提出的问题,如果有人选择了左侧基金,他们必须准备好忍受如此动荡的季度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

长期的市场萧条

经济衰退和市场低迷是投资金融市场不可避免的现实。最大提取额(MDD)是分析基金在此期间损失多少的好方法。

不同的资产类别经历不同程度的损失。因此,根据基金的构成,他们的 MDD 可能会有很大的不同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上述基金在 2014 年 11 月至 2016 年 2 月期间经历了约 30%的提款。达到底部大约需要 1.5 年,再次回到同样的水平又需要 1.5 年。总的来说,大概花了 3 年时间才扯平。

其他一些市场低迷持续的时间比这更长。更接近 7-8 年。我想起了奥马哈先知沃伦·巴菲特关于长期投资的名言——“只买那些如果市场关闭 10 年你也会非常乐意持有的东西”。

如果一个人的投资时间范围不允许这么长的时间,一个更平衡的基金将是一个更好的选择。低于基金,经历了仅 10%的最大下降,甚至在短时间内恢复。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

伪预测

现在,让我们进入一些假设,好吗?

比方说,如果我们决定在一只基金中投资 X 元。然后,我们忘记它,继续我们的主要业务。然后,我们会听到这样的新闻标题——油价在过去两个月上涨了 20%,或者印度市场指数 Sensex 在上个季度下跌了 10%。

这可能会促使我们去检查我们投资的现值,并想知道它的表现如何。如果我们能在决定购买之前提前分析这种情况会怎么样?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图是针对 Sensex 指数在未来 3 个月上涨约 8.9%的情景。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用历史数据、数学模拟和概率,我们可以估计初始投资为 10,000 卢比,最终在 9,300 卢比和 12,000 卢比之间,3 个月后的价值可能接近 10,960 卢比(上图中的天数是指交易日,不是日历日)。

一切都失控了!

继续假设,金融市场也有黑暗的一面。如果类似于 2007-2008 年美国次贷危机及其随后的全球蔓延现在突然发生,会怎样?

对印度市场而言,正在发生的 NBFC 违约及其基础资产质量问题似乎有些类似,但规模要小得多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以“ICICI 保诚蓝筹基金-股息”为例,如果现在发生类似 2008 年全球市场崩盘的情况,其资产净值在未来一年内可能会降至 9.5(约为其当前价值的 43%)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一种担忧可能是,如果在这样一场历史危机中,该基金从未存在过,那么如果这样的事件(或类似事件)现在发生,我们如何评估它的表现?事实上,上面的例子基金是 2009 年 4 月才开始的。

用于得出上述分析的方法允许我们为这种场景(压力事件)精确建模。适用于印度市场的四因素模型用于确定基金业绩对模型因素的敏感度。为基金生成的回归模型用于预测历史事件,即使该基金当时从未真正存在过。

包裹

果然,看待金融投资风险有多种方式。不同的性格和生活环境认为一种方式比其他方式更重要。但是,在我们睁大眼睛面对风险的情况下做出的投资决策应该会减轻很多焦虑和压力。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

研究用于科学数据集的可区分神经架构搜索

原文:https://towardsdatascience.com/investigating-differentiable-neural-architecture-search-for-scientific-datasets-62899be8714e?source=collection_archive---------28-----------------------

哈佛数据科学顶点项目,2019 年秋季

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

In partnership with Google AI.

**团队成员:**迪伦·兰德尔、朱利安·拉斯里、迈克尔·伊曼纽尔、庄嘉玮

免责声明:本博客中表达的观点和意见仅属于作者个人,并不代表哈佛或谷歌。

对高效神经结构搜索(NAS)的需求

深度学习把我们从特征工程中解放出来,却产生了一个“架构工程的新问题。已经发明了许多神经网络体系结构,但是体系结构的设计感觉上更像是一门艺术而不是科学。人们对通过神经架构搜索(NAS) 来自动化这种耗时的设计过程非常感兴趣,正如数量迅速增长的研究论文所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure from Best Practices for Scientific Research on Neural Architecture Search.

典型的 NAS 工作流包括(1)在预定义的搜索空间内提出候选体系结构,(2)评估所提出的体系结构的性能,以及(3)根据搜索策略提出下一个候选体系结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure from Neural Architecture Search: A Survey.

有许多搜索策略(在调查中回顾),包括强化学习、贝叶斯优化、进化算法、基于梯度的优化,甚至随机搜索。一些策略可能非常昂贵,消耗大量能源,并导致数百万美元的云计算账单:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure from Energy and Policy Considerations for Deep Learning in NLP; NAS cost is based on evolutionary architecture search on Transformer.

在这个项目中,我们研究了一种高效的基于梯度的搜索方法,称为 DARTS(可区分架构搜索),最近在 ICLR 2019 发表。据显示,DARTS 比以前的方法如 NASNetAmoebaNet 需要的 GPU 时间少 100 倍,并且与来自谷歌大脑的 ENAS 方法具有竞争力。我们将把 DARTS 与随机搜索(实际上相当不错,见下表)和最先进的手工设计的架构(如 ResNet )进行比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure from the DARTS paper.

科学数据集

大多数 NAS 研究,包括最初的 DARTS 论文,都使用标准图像数据集报告了实验结果,如 CIFARImageNet 。然而,我们认为深度学习显示出科学研究的前景,包括生物学医学化学各种物理科学。在这个项目中,我们想看看 DARTS 是否对科学数据集有用,以及神经结构如何在这些领域之间转移。

我们使用来自材料科学、天文学和医学成像的三个数据集,具体来说:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example data from the three datasets (left to right): Graphene Kirigami, Galaxy Zoo, and Chest X-Ray.

我们还以(一个众所周知的用于分类手写数字的图像数据集)作为非科学基线进行了实验。

可区分神经结构搜索(DARTS)

有 3 个关键的想法使飞镖有效:(1)只搜索小“细胞”,(2)重量共享,和(3)持续放松。每个想法都解决了传统搜索方法中的一个问题,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Issues with brute-force NAS and solutions proposed by DARTS.

DARTS 搜索小“单元”以减少搜索空间

为了避免搜索所有“任意架构”的巨大空间,DARTS 利用了一个重要的观察结果,即流行的 ConvNet 架构通常包含重复的块,按顺序堆叠。例如,ResNet 是残差块的序列:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figures from here and here.

遵循类似的思路,DARTS 只搜索最优的“块”或“单元”,而不是整个模型。一个单元通常由大约 5-10 个操作组成,用有向无环图(DAG)表示。所有单元按顺序堆叠以形成整个模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example of a reduction cell stacked to create a full model.

DARTS 中定义了两种类型的单元:(1)保持输出空间维度与输入空间维度相同的“正常单元”,以及(2)将输出空间维度减半同时使滤波器/通道数量加倍的“缩减单元”。所有正常细胞共享相同的架构(操作和连接),但具有独立的待训练权重——所有 reductions 细胞也是如此。

DARTS 使用“连续松弛”来实现建筑参数的梯度下降

下图总结了查找最佳单元的步骤:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Schematic of the DARTS continuous relaxation and discretization methods.

“找到最佳单元”等同于“在 DAG 的边上找到操作的最佳位置”。DARTS 不是独立评估各种布局(每种布局都需要从头开始训练),而是叠加所有候选操作(例如,Conv 3x3、最大池、身份等)。)上,因此它们的权重可以在单个过程中一起训练。edge (i,j)处的实际操作是所有候选操作 o(x)的平均值,用α加权:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Each edge is a linear combination of pre-defined operations weighted by the softmax output of the architecture parameters.

有了一定的架构权重α的选择,相应的架构原则上可以被训练收敛,导致最优的模型权重 w (α)和最终的验证 损失 L ( w (α),α)。 L w.r.t .到α的梯度给出了架构参数梯度下降的方向。

通过每次训练 w 收敛来计算真实损耗 L 代价太高。因此,DARTS 只训练 w 一个步骤来获得代理损失:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

DARTS utilizes a one-step approximation to avoid training weights to convergence at each architecture update step.

*其中最佳模型权重 w (α)通过一步训练来近似。

α和 w 的训练交替进行;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Bi-level optimization procedure for training regular model weights and architecture parameters.

实验结果

下面,我们总结了用 DARTS、随机搜索和 ResNet 得到的结果。我们报告了有和没有架构离散化(我们分别称之为“离散”和“连续”)的 DARTS 的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Results of DARTS (continuous & discrete), Random Search, and ResNet on each dataset.

MNIST

如前所述,我们首先用 MNIST 做实验。这立即让我们发现了超参数在训练中确保稳定性的重要作用。下面我们展示了适当调整学习率(常规权重和架构权重)的效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Learning curves of DARTS on the MNIST dataset demonstrate the important of appropriate hyperparameters.

在 MNIST,雷斯内特比飞镖表现更好。这并不奇怪,因为手工设计的架构通常专门针对 MNIST(以及 ImageNet、CIFAR 等)等数据集进行了优化。).考虑到这一点,我们继续前进到主要的科学数据集。

石墨烯 Kirigami

石墨烯 Kirigami 的任务是从石墨烯片的切割构型预测拉伸性能。这些数据来自于(计算成本很高的)数值模拟。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Overview of the Graphene Kirigami task.

我们发现,连续(非离散)飞镖和 ResNet 在这项任务中表现得差不多。但是,我们也发现,这个任务可能过于简单,无法评价飞镖。下面我们展示了 DARTS、ResNet 和“微小”ResNet 的结果。请注意,即使这个“微小”的模型也达到了大约 0.92 的最佳 R。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*Table showing that even tiny models can perform well on the Graphene Kirigami task. Time to run 30 epochs on a single GPU.

这让我们得出结论,石墨烯 Kirigami 任务对飞镖来说太简单了,没有用。我们通过查看 a)学习到的架构权重的分布,以及 b)随机搜索架构的性能分布,进一步研究了这一概念,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Graphene Kirigami architecture weights (left) and random search performance (right). Our conclusion is that simple problems admit many performant architectures, and that DARTS induces low sparsity in architecture weight space as a result.

特别值得注意的是,DARTS 学习的大部分架构权重几乎没有从它们的初始值 1/8 改变(在这个实验中我们有 8 个操作)。我们还看到,除了几个主要的异常值之外,来自随机搜索的架构都表现得非常相似。这使我们得出结论,石墨烯 Kirigami 问题允许许多高性能的架构,因此 DARTS 同样不会学习稀疏架构。

银河动物园

受到石墨烯任务中发现的明显缺乏难度的启发,我们寻求一个更复杂的科学兴趣问题。我们选定了银河动物园挑战赛。与典型的分类问题不同,由于目标标签是人类贴标机的平均预测,因此该任务基于均方根误差(RMSE)度量来评分。任务是将星系图像回归到人类标签员对 37 种不同属性的平均预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Summary of the Galaxy Zoo “decision tree”. It is a logical map over the various observed galaxy morphologies.

令人兴奋的是,我们发现飞镖(连续)表现最好。如果我们检查架构权重和随机搜索性能(如下),我们会看到 DARTS 学习了比石墨烯任务更稀疏的细胞。此外,随机架构性能的可变性(注意对数标度)非常大。这表明,对于星系动物园问题,确实有一些架构比其他架构好得多。看来飞镖在学习细胞中引起了一些稀疏,反映了这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Galaxy Zoo architecture weights (left) and random search performance (right). Large variance in architectures → sparse cell learned by DARTS.

虽然这些结果表明 DARTS 能够学习优于 ResNet 的单元,但是在离散化架构之后,性能严重下降。这突出了一些评审员对原始 DARTS 论文的评论中提出的观点,特别是:

从某种意义上说,如何从一次性模型转移到单一模型的最后一步是这项工作最有趣的方面,但也是留下最多问题的一个方面:为什么这样做?是否存在这样的情况,我们通过将解舍入到最接近的离散值而任意地损失惨重,或者性能损失是有限的?从放松到离散选择的其他方式是如何工作的?

我们的发现表明,离散化步骤是启发式的,我们表明,它可以在实践中失败。

胸部 x 光

为了看看我们在《银河动物园》上的结果是否可以应用到另一个困难的科学数据集上,我们研究了胸部 x 光成像数据集。任务是对来自胸部 X 射线图像的各种疾病(多种疾病可能存在或不存在)进行多标签(二元)分类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example chest X-rays (left) and disease proportions in the training set (right).

在这里,我们发现连续飞镖适度优于 ResNet。检查架构权重和随机搜索性能(如下所示),我们看到一个类似于银河动物园的故事。从随机搜索性能图来看,似乎有些架构的性能比其他架构好得多(再次注意对数标度)。我们看到 DARTS 似乎已经学会了一些体系结构权重的稀疏性,这反映了所有体系结构空间中的一些体系结构比其他体系结构更适合这个任务的概念。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Chest X-Ray architecture weights (left) and random search performance (right) distributions. Again, large variance in architectures → sparse cell learned by DARTS.

我们再次注意到,离散的飞镖模型表现明显不如连续的。

结论

总之,我们认为飞镖是一个有用的工具,但对于简单的任务来说,它是多余的。我们表明 ResNet 和 random search 的性能相当好,但是 DARTS 的性能稍好一些。我们注意到 DARTS 引入了许多额外的超参数,必须仔细调整以确保稳定的学习。最重要的是,我们表明 DARTS 的“离散化步骤”在实践中可能会失败,需要更好的技术来确保健壮性。

我们对任何考虑飞镖的人的最后建议是:如果性能的小幅度提高对你很重要(例如准确度提高 1%),飞镖可能是有帮助的,值得你花时间去研究。

未来的工作

我们对未来工作的建议一般来自结论。具体来说,我们建议:

  • 为超参数自动调整和/或设置更好的默认值
  • 通过以下方式修正离散化试探:a)用 sparsemax 代替 softmax 来鼓励稀疏性,或者对架构权重进行 Lp 正则化(用p1 ),或者 b)在训练期间动态修剪架构以移除组件,消除重新训练离散化模型的需要。

作为最后一点的替代,可以简单地取消离散化步骤(正如我们在这里报告连续结果时所做的)。但是,这将不再是真正的“架构搜索”,而可能被视为一种全新的架构类型(这并没有什么错,但也许有些人对坚持架构搜索的目标感兴趣)。

承认

我们要感谢 Pavlos Protopapas(哈佛)、Javier Zazo(哈佛)和 Dogus Cubuk(谷歌)在整个工作过程中给予的支持和指导。

**有关哈佛数据科学峰会的更多信息,请访问:【capstone.iacs.seas.harvard.edu **

代码可用性

我们处理各种科学数据集的定制 DARTS 代码可以在:https://github.com/capstone2019-neuralsearch/darts找到

运行代码的完整说明可以在这里找到:https://github . com/capstone 2019-neural search/AC 297 r _ 2019 _ NAS

基于 ICA 和层次聚类的章鱼伪装研究

原文:https://towardsdatascience.com/investigating-octopus-camouflage-with-ica-and-hierarchical-clustering-df0e9a4ffaf4?source=collection_archive---------18-----------------------

神经科学家如何用机器学习算法研究这种惊人的技能

头足类动物(章鱼、鱿鱼、乌贼)在伪装的技术上是天生的大师:它们可以在几秒钟内改变皮肤的颜色,以适应周围的环境,并完全消失在背景中。如果你从未看过这个,我邀请你花 5 分钟来欣赏这个 Ted 演讲。如果你真的赶时间,可以直接跳到最后一分钟,欣赏章鱼的以下表现:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hey there (from David Gallo’s Ted talk, at 4:19)

这种能力几十年来一直困扰着科学家和机器学习专家(没有必要坚持这种机制如果成功复制可能会对许多行业产生的结果……)。计算机视觉科学家目前需要在数千次试验中训练神经元网络,然后才能提取复制背景环境所需的特征。但是头足类动物有能力在几秒钟内完成这个动作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A cuttlefish

出于这个原因,德国的一组神经科学家,在 Gilles Laurent 博士的带领下,对乌贼的伪装行为进行了录像研究。这篇文章描述了他们的一个发现。

(原文可以在这里找到但是需要订阅《自然》杂志才能免费阅读…想了解更多信息,你还可以观看科学家们在 这个视频 中讲述他们的工作。)

首先,一点生物学知识:头足类动物的皮肤怎么会变色?他们的皮肤一点也不像我们的皮肤。它们的皮肤表面覆盖着充满色素的小“袋子”,这些小“袋子”被称为 色素细胞 。视内部的色素而定,色素细胞可以有不同的颜色。简单来说,一般有两种:深色的和浅色的(黄色的)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

a) Zoom on an adorable squid’s skin, with dark and light chromatophores. b) Muscle contraction streches the chromatophores and the pigment expands. Figure adapted from this paper in Nature Communications.

诀窍在于这些色素细胞的大小是由动物控制的!每个袋子都由几块肌肉环绕着:如果肌肉放松,袋子就会变小。但是如果动物收缩这些肌肉,袋子就会膨胀,色素就会扩散。这些肌肉由一些被称为“运动神经元”的神经元控制。这项研究的全部目标是调查神经元,即使是间接的!

为了更好地理解伪装技巧,科学家们认为他们必须非常注意这些色素细胞的大小。因此,他们设计了一个分析管道,在动物皮肤上追踪它们。

开发一个工具箱来跟踪成千上万的色素细胞并提取它们的大小当动物在水箱中移动时,这本身就是一个巨大的成就。然而,我选择在这篇文章中关注另一个结果。因此,我邀请你快速浏览一下我的第一篇帖子这里,它描述了另一个例子(检测神经元并从一个透明的鱼大脑视频中提取它们的活动)的预处理管道的原理。我将其简单总结为 3 个步骤:

  1. 首先,来自乌贼皮肤的每个图像被对齐(旋转或平移)以匹配参考图像的方向。
  2. 然后,定位色素细胞。
  3. 最后,提取每个色素细胞内的像素数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The (simplified) analysis pipeline to monitor the size of thousands of chromatophores in time. Have a look at this post for more detailed explanations. Image modified from Fig1 in the original publication.

这个预处理步骤从乌贼图像中创建了一个可利用的数据集:一个矩阵【色素细胞 x 时间】,其中每个元素是一个时间点上一个色素细胞的大小。然后,机器学习算法可以很容易地应用于深入了解这些成千上万个充满颜料的袋子的行为。

(例如,主成分分析可用于将该数据集的维度从几千个减少到 3 个,以便在 3D 中绘制该系统的时间演变。这将在另一篇文章中描述:“神经科学中的 PCA 和 tSNE:可视化的降维”)

让我们关注主要目标:通过研究色素细胞大小的进化,神经科学家实际上想评估控制肌肉的运动神经元的活动。尺寸只是一个间接的测量。然而,事情并非如此简单(总是在研究中),因为人们很快意识到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 一个运动神经元可以控制几个色素细胞。
  2. 一个色素细胞可以由几个神经元控制。

*这需要首先解决。这里的问题是**在不知道源信号或混合过程的情况下,从混合信号(色素细胞活性)*中推断源信号的值(运动神经元活性)。这是盲源分离的一种情况,在这种情况下使用的好算法是 ICA : 独立分量分析。ICA 的假设如下:

  1. 源信号在统计上是独立的
  2. 源信号是非高斯的

根据中心极限定理如果源信号是独立的(hyp1),那么它们的混合将趋向于高斯分布,即使源信号本身不是高斯(在维基百科页面* 这里 ) 很好的图解了这个定理。如果加上假设 2,这意味着混合信号的分布将总是比源信号的分布更加高斯。目标是找到一个新的空间,使分布尽可能远离高斯分布,如下图所示:*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

If the source signals are independent and non-gaussian : a) the ICA algorithm can recover them from the mixed signals. Adapted from an image found here. and b) a new space can be found where the distributions are as far away from gaussian as possible. Adapted from images found here.

实现 ICA 的方法有很多种,因此,在这篇文章中,我更愿意把直觉留给你,并邀请你查阅我们在 web 上可以找到的许多资源(比如来自法国神经科学家的这个* 网站 或者来自赫尔辛基大学的这个 网站*)。**

**让我们回到我们的乌贼:根据色素细胞的活动,ICA 允许我们评估运动神经元的活动。Hyp 2 很容易满足,因为我们在生物学中记录的大多数东西都没有高斯分布。但是 Hyp1 有点棘手:我们不能假设每个运动神经元都是相互独立的,但是我们可以接受 ICA 将几个不独立的运动神经元组合在一起)。因此,色素细胞将被归入“运动元件”: 同一“运动元件”中的所有色素细胞基本上由同一运动神经元 (或运动神经元群)控制。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Reprinted by permission from Springer Nature : Nature, Elucidating the control and development of skin patterning in cuttlefish, Reiter et al (2018), License nb 4486000735048.

结果可以用这个图来说明(来自原始出版物):红色圆圈内的色素细胞被发现由同一个运动神经元控制(我们可以注意到它们都是黑色的),蓝色圆圈内的由另一个控制(它们都是黄色的,除了一个)。第一个定义是,一个运动神经元本质上控制几个相同颜色的色素细胞**!左边的痕迹代表每个色素细胞在时间上的大小,我们称之为“活动”。在同一个运动元素内,活动看起来是同步的。然后使用平均活动来表征运动元素。**

基于这一结果,科学家们使用层次聚类将具有相似活动** 的运动元素分组在一起(一个运动元素=一组代表一个运动神经元的色素细胞。)。在另一篇“迈向数据科学”的文章中已经很好地描述了分层聚类,我邀请您在这里 阅读 。(你也可以观看 这段视频 来了解在生物学中如何使用等级聚类来对具有相似表达的基因进行分组。)**

简而言之,该算法计算每个运动元素之间的相似性,并创建一个 树状图 。然后,选择一个阈值,该阈值将创建聚类。在这里,研究人员使用“相关距离”作为相似性度量: d = 1 — r (r 为相关系数)。

  • 如果 2 个电机元件完全相关,r = 1,d = 0。它们之间的距离为零:它们在空间上非常接近,因为它们是相似的。
  • 如果没有相关性,r = 0,d = 1。它们之间的距离增加了。
  • 如果两个运动元素是反相关的,r = -1,d = 2。

结果可以在下图中看到:左上方是一张乌贼皮的照片。我们将重点关注由矩形界定的白色斑块。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Reprinted by permission from Springer Nature : Nature, Elucidating the control and development of skin patterning in cuttlefish, Reiter et al (2018), License nb 4486000735048.

右上方的图像显示了由 ICA 确定的在运动元素中分组的色素细胞,它们在彩色圆圈中,空的或填充的。这对应于阈值为 d = 0 (最大相关性 r = 1)的分层聚类。如果阈值取在 d = 0.4 (绿色箭头,下图)左右,我们可以看到一些运动元素被分组在十几个簇中。如果在 d = 2 附近取阈值(红色箭头,中间图片),我们可以清楚地看到 2 个反相关的簇:白色斑块和黑色边缘。

这表明

  • 黑色和黄色的色素细胞由不同的运动神经元控制。
  • 这些运动神经元的活动在时间上是反相关的。

这是有道理的:如果动物想要在黑暗的背景中消失,黑色的色素细胞需要扩散,而黄色的需要收缩。所以“黑色控制”的运动神经元会发出收缩肌肉的信息,而“黄色控制”的运动神经元会保持沉默。(如果你对肌肉收缩背后的生理学感到好奇,你可以看看这个视频来了解一下)。

当然,如果动物想要匹配浅色背景,反之亦然,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总之,利用独立分量分析和层次聚类,科学家们能够描述头足类动物如何在背景中伪装。这很鼓舞人心!

本研究由 萨姆·赖特菲利普·胡斯敦西奥多西娅·吴马塞尔·劳特巴赫杰西卡·s·埃伯勒 雅各布·迈耶-克雷多 弗里德里希·克雷奇默 朱利安·朗格 马蒂亚斯·卡舒贝 的监督下 所有数字均经 Springer Nature 许可复制,许可证号 nb 4486000735048,来自原始出版物“阐明乌贼皮肤图案的控制和发展”,Nature,Reiter 等人(2018)。****

用深度学习研究机器阅读理解问题

原文:https://towardsdatascience.com/investigating-the-machine-reading-comprehension-problem-with-deep-learning-af850dbec4c0?source=collection_archive---------6-----------------------

教机器如何做标准化的类似考试的阅读题。

这个项目和文章是由 约纳曼*罗汉梅内塞斯 和我共同完成的。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

仔细想想,阅读理解是人类思维的奇迹。我们可以拿一段文字,在几乎没有上下文的情况下,深入理解文字的目的,甚至推断出文字中没有的事实,这真的很难,也令人印象深刻。在人工智能和机器学习的世界里,研究人员花费了数年甚至数十年的时间试图教会机器阅读和理解。在过去的几周里,我们的团队致力于解决“阅读理解难题”中的一小部分。

这个任务是如何建模的?

为了有效地测量机器“理解文本”的程度,让我们回想一下人类是如何测试他们的理解能力的:通过标准化的阅读考试!

还记得这些看起来无害,但是非常难的考试题目吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A reading comprehension worksheet.

好吧,这些问题看起来很简单。但是,情况并不总是这样!任何参加过更高水平标准化考试的人都知道,阅读理解题会变得很难。现在,我们将重点转向“填空”式问题:给一台机器一篇阅读文章,以及一个多项选择填空问题,它所要做的就是选择最能填补空白的正确选项!听起来很简单,对吧?

事实证明,这个问题对机器来说很难学习。我们称这种“填空”式的问题为完形填空式阅读理解任务。这里面临着许多困难:

  • 首先,机器必须首先学习语言的结构和意义。不像人类那样,已经熟悉单词在句子中是如何组合在一起的,并且能够“理解”一个单词背后的真正含义,机器需要以某种方式被教会这一点。
  • 第二,在文章中寻找问题的答案可能并不明显。一个人可能会花很长时间在一段文字中寻找答案,而答案可能就在那一页上。对于机器来说,甚至更难;因为语言是高度灵活的,你要找的一系列单词可能不会在文章中逐字出现。

阅读理解如此困难,没有单一的方法可以让机器来解决这个问题。那么,现在我们该怎么办?

再补充一点……机器学习!

为什么我们不利用机器学习的力量来帮助我们解决这个问题呢?

机器学习已经成为阅读文本并从中提取重要概念的一种极其强大的技术;过去几年来,这一直是大多数计算语言学家的困扰。

所以让我们把这种困扰变成一种好的困扰,并把它用在我们的问题上!

首先,简单绕一下:我们将在这个项目中使用 CNN/Daily Mail 数据集。请看一个示例文档/查询:

(@entity1)就是那种你在电影里看到的,像@entity6 在“@entity7”或者@entity9 的“@entity8”里的角色但是,在现实生活中,很难接受一个人被困在海上几天,几周,甚至几个月,还能活着谈论这件事。然而,奇迹确实会发生,而且不仅仅发生在@entity17…

查询:一个@entity156 的人说他从@entity103 漂到@placeholder 一年多了

每个文档和查询都已经经历了实体识别和标记化。目标是猜测应该将哪个实体替换到“@placeholder”中,以使查询有意义。

我们现在的目标是将这个问题公式化为一个合适的机器学习问题,我们可以训练一个模型,并用它来正确预测单词。本着这种精神,我们实际上可以将我们的问题形成为一个二元分类问题;也就是说,给定一个新的文档和查询对,我们可以将其转换成一组新的“文档-查询”对,使得它们的某个子集对应于正确地猜测一个实体符合空白,而另一个子集对应于否定的例子,即正确地猜测一个实体不应该填充空白。

对于每个文档-查询对,我们还创建一些特征来与该对相关联,因为此时将整个对输入到机器学习模型中是不可行的。

我们采用了一个逻辑回归模型来实现这个问题。在训练模型之后,我们达到了 29%的准确率,这意味着 29%的文档正确地填写了空白。对于上下文,数据集中的大多数文档包含大约 25 个实体,因此为每个文档随机猜测一个单词的准确率大约为 4%。所以这个模型表现得相当不错!

逻辑回归模型表现不错,但如果我们诚实地说,29%的准确性并不完全“像人类一样”。那么,如何才能让我们的模型更有效地学习呢?

这就是深度学习发挥作用的地方。当人们阅读文本时,他们不只是学习一些关于文本的启发,然后根据这些启发进行猜测。相反,他们学会理解文本的潜在含义,并根据他们的理解做出有意义的推论。这也是我们在这个问题上的目标!深度学习将为我们提供真正教会机器阅读所需的工具。

新方法带来新目标。从现在开始,我们不想将这个问题局限于二元分类问题,而是更全面地看待这个问题——我们的模型将被允许选择文档中的任何单词作为正确的实体来“填充空白”。这比我们以前的公式更能代表实际的学习。

看…深度学习

使用这些机器学习技术很棒,但我们能做得比这更好吗?一方面,逻辑回归是使用的有效机器学习模型,并且是获得基线准确性的快速方法,但是它在几个方面存在不足。逻辑回归决定一个词是否应该填空的方式过于死板;也就是说,逻辑回归只能学习线性函数,不适用于大范围的问题。

这就是我们现在可以转向深度学习和神经网络的力量来解决我们的问题的地方。神经网络是机器学习中最近的一个热门发展,它允许我们学习比逻辑回归等正常模型更复杂的函数。

在本文中,我们将考虑一种特殊的神经网络,称为长短期记忆,或简称为 LSTM 。这是 LSTM 的样子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看似复杂,但如果我们一点一点分解,就能明白这个网络在做什么。想象阅读一个句子:当你阅读的时候,你的大脑一个字一个字地思考这个句子,一点一点地形成想法。LSTM 也是如此;它会取一个句子的每个单词,看到一个单词后生成一个隐藏状态。你可以把这种隐藏状态想象成 LSTM 在读到下一个单词时传递给下一个时间步骤的思想。

在我们的问题的上下文中,我们可以将问题后面的段落输入到我们的 LSTM 中,最后根据 LSTM 的最终输出猜测哪个单词最适合查询中的空白。(如果您想知道如何获得最终单词,我们获得的方法是从我们的 LSTM 中获取输出,并为每个可能填充空白单词的可能单词创建一个概率列表。然后我们选择概率最高的单词。)

LSTM 的特别之处(与其他具有类似结构的网络相比)在于,LSTM 能够“记住”句子中较长范围内的单词信息,并能够在必要时快速“忘记”信息。这使得 LSTM 人能够确定在看某个单词时什么是重要的,以及对于之前的单词需要记住什么。

你可能会问:“我们如何将单词输入网络?”我们可以将实际的字符串输入到网络中,但是神经网络很难解析原始的数据字符串。相反,我们使用嵌入来表示每个单词。这包括使用固定长度的向量来表示每个单词,这样 LSTM 就可以很容易地对单词进行计算。理想情况下,我们希望相互关联的单词在嵌入方面更加“接近”。

幸运的是,斯坦福大学 NLP 的优秀人才已经为我们完成了这项任务;他们有一个可下载的嵌入集,名为 GloVe(单词表示的全局向量),已经被证明在自然语言处理任务中非常有效。我们在我们的模型中使用这些,并实现了惊人的准确性提高:39%!这种对基础非深度模型的改进标志着深度学习在能够对这项任务进行建模方面的能力,以及 LSTM 的能力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性回归和 BiLSTM 损耗曲线。请注意 BiLSTM 损失率是如何下降的,这是奇妙学习的标志!

我们能做得更好吗?

但是现在我们再次问:我们能做得更好吗?对此的回答也是一个强有力的是!在高层次上,我们想要做的是让我们的模型更像人类一样思考。作为人类,当我们执行阅读理解任务时,我们不只是阅读文本,然后猜测应该在空白处写什么;相反,我们喜欢查看查询,寻找文档中哪些单词更相关,应该更仔细考虑的线索。同样,对于我们的模型,我们引入了注意力的概念。注意力的目标是生成一个矩阵,该矩阵的值表示模型应该给予每个文档单词的相对“注意力”。

为什么关注?

对注意力的直觉来自人类的思维方式。例如,当我们执行阅读理解任务时,我们使用查询来指导我们对文本的阅读。我们关注文本中与查询更相关的特定部分,忽略文本中不相关的部分。我们想对我们的模型做同样的事情。我们希望机器能够理解文本的哪些部分与查询相关,并关注这些部分。下面描述的架构试图做到这一点。

我们的架构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An example model architecture using attention (Cui et al., 2016). GRUs are basically just fancy LSTMs.

有许多方法可以实现注意力,但是我们选择了上面描述的“注意力总和”模型的一个变体。如上图所示,我们开始将我们的文档和查询放入单独的 GRU 模块中(gru 是带有一些附加功能的 LSTMs)。然后每个 GRU 的输出被如下处理(这是模型的注意力部分!).我们首先计算一下什么叫做“对文档注意力的查询”。这意味着该模型试图理解给定查询中的一个单词,哪些文档单词是最重要的。但是这为每个查询词返回不同的值,所以问题变成了:如果每个查询词对不同的文档词赋予不同的重要性,我们如何决定我们实际上应该听哪个查询词?

为此,我们的模型现在提出这样一个问题:给定一个特定的文档单词,这些查询单词中的每一个有多重要?这给了我们一个衡量每个查询词重要性的标准。然后,我们对每个查询词的重要性进行平均,以获得最终的重要性。然后,将该最终重要性与先前计算的不同文档单词的重要性相结合,以计算每个文档单词的最终加权平均关注度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The original “Attention over Attention” architecture. We want to improve the process by which the document and query are initially combined.

最后,我们实施了自己的创新,试图进一步改进这个模型。这个模型假设,如果一个文档单词和一个查询单词彼此非常重要,那么它们的表示将非常相似。然而,我们试图通过让模型学习文档和查询之间的重要性关系来改进这一点。类似于我们人类如何计算我们对文本的理解的权重以及文本与查询的联系的权重,我们也希望让机器学习这种关系。我们希望这能让机器对文本和所提问题有更细致的了解。

在撰写本文时,我们还没有设法为我们当前的架构获得好的结果。我们不认为这是因为我们的模型存在缺陷,而是因为一般情况下训练复杂的深度学习模型存在困难。我们从这个项目中得到的最重要的教训是,构建这些模型是极其困难的,测试和修复错误可能非常耗时。我们希望能够在未来进一步完善这个模型,并作为基础模型实现更好的准确性。

最后,我们从这个项目中获得的最重要的教训是深度学习教会机器解决复杂问题的有效性。我们用来建模我们的架构的最初的注意力超过注意力模型具有超过 70% 的最终测试准确性*。与 29%的非深度基线相比,这是一个巨大的进步!深度学习在这类问题上大放异彩,我们希望继续并支持这项任务的未来工作,以进一步推进机器理解领域。***

关于我们论文的链接,该论文讨论了更多的技术细节,参见 该链接

非常感谢Jeffrey ChengDavid RolnickKonrad Kording在宾夕法尼亚大学 2019 年春季推出 CIS 700(深度学习),以及他们在整个项目中不断的教学和指导。

为什么可解释的人工智能让风投们兴奋

原文:https://towardsdatascience.com/investor-view-explainable-ai-5ba66b31cd82?source=collection_archive---------16-----------------------

是什么推动了需求,现有公司如何应对,初创公司如何应对可解释性 2.0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: DARPA

可解释的人工智能

可解释的人工智能帮助用户理解机器的决策过程。而不是讨论可解释的人工智能的方法(例如,石灰,SHAP 等。),下面是一些维度来围绕这个概念。可解释的 AI 意味着什么,取决于用户、被解释的对象和底层数据。这是一个如此广阔和快速发展的领域,当深入讨论可解释的人工智能时,有一个它如何适应这些维度的心理框架是很好的。本文中的大多数例子都是为分析表格数据的业务决策者构建的产品。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这篇文章不会讨论分类和技术,但是这里有一本由 Christoph Molnar 写的关于分类和技术的很棒的书。未来的一篇文章将深入探讨帮助数据科学家解释、构建和部署模型的工具,如 DarwinAI 的平台,该平台在神经元和层级别探索深度学习模型,以帮助解释其工作原理(同时在相同的功能准确性下,使模型效率提高 4-10 倍)。

可解释人工智能的驱动因素

来自消费者

之前**:消费者一直有解释的需求。企业既没有义务也没有动机做出解释。有些人有,大多数人没有。那些这样做的人通常是因为规章制度。**

现在:这种情况在最近几年有所改变,大量媒体报道了为法庭( ProPublica )、招聘( Amazon )和贷款决策( Berkeley )开发的有偏见的模型。如果畅销书是消费者想要什么的指标,那么就有凯茜·奥尼尔的《数学毁灭武器》(2016 年 NYT 畅销书),萨拉·沃希特-博特彻的《技术上的错误》(2017 年快公司最佳书籍),以及弗吉尼亚·尤班克斯的《自动化不平等》(2018 年麦甘农图书奖)。虽然这些都集中在人工智能的危险上,但这本书重点介绍的一个常见解决方案是解释人工智能。

来自监管机构

很长一段时间以来,金融监管机构要求银行使用的模型是可以解释的。他们希望确保模型足够稳健,以防止可能反过来危及金融稳定的不良贷款决策。但重点是向监管者、数据科学家和决策者解释模型。《平等信贷机会法》是一个例外,它的重点是向消费者解释。监管机构要求银行提供消费者得不到贷款的主要原因。总体而言,重点是金融服务业。

现在:《GDPR》于 2018 年 5 月生效,是第一部广泛延伸“解释权”的法规。第 13(2)(f)条规定,控制者(决定处理目的和手段的实体)向数据主体提供进一步的必要信息,以确保公平和透明地处理

第二十二条第(1)款和第(4)款提及的自动决策的存在,包括特征分析,以及至少在这些情况下,关于所涉逻辑的有意义的信息,以及这种处理对数据主体的意义和预期后果。

旁注:这也有例外。就业是一个,根据我的阅读。因此,每年收到数百万份申请的公司不必解释每个决定,也不必处理异议或上诉,这是 GDPR 的另一项权利。

来自数据科学家和决策者

**以前:**没有监管者或用户的推动,对可解释性的需求主要集中在向同事、数据科学家和决策者解释。一个例外是脸书在 2014 年推出的“为什么我会看到这个广告”功能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Mashable

现在:企业对市场做出反应。随着用户和监管者越来越多地要求各种各样的解释,新的创业公司正在涌现以满足这种需求。推动需求的还有另一种趋势,一种更内在的趋势:工作性质的变化。

新的工作方式需要新的工具

回答“为什么”

在过去的几周里,我与几位数据科学家和分析师进行了交谈,以了解他们的工作情况。他们在解决什么样的问题?他们在想什么?一个共同的线索是,他们的工作是回答“为什么”。为什么销量有增无减?用户为什么会流失?服务器为什么关机?

数据分析师受雇挖掘数据来回答这类问题。有几种类型的分析师,下面选择了其中的一大部分。根据 BLS 的数据,2016 年有超过 200 万名分析师(数据录入员、科学家、IT 分析师除外)受雇,收入 1750 亿美元。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: McKinsey

分析师不会花大部分时间直接回答“为什么”的问题。80%花费在收集和清理数据上。10%在分析数据。10%从事沟通和其他行政工作。虽然 10%的时间花在分析数据以回答“为什么”上,但可以说价值超过了 10%。但即使上限为 10%,也至少值 180 亿美元。根据经验法则,一个新产品必须比它好 10 倍或者更便宜,那么这个价值就是 20 亿美元。

改变工作的性质

工作的性质已经改变了。体力和机械工作占据了我们大约 50%的时间,10 年后将减少到大约 40%。这可能看起来不像是一个大的变动,但这里有数据点来显示这是多么大。从 2000 年到 2015 年,互联网、个人电脑、云计算和大数据的普及。有了这些新技术,我们开始自动化工作。然而,从 2002 年到 2016 年,花费在身体和基本认知任务上的时间进一步增加了 2%。我们现在正处于一个转折点,自动化的步伐将会加快。在接下来的 15 年里,花费在机械工作上的工作时间预计将减少 12%。从过去来看,这是一个突然的转变。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: McKinsey

随着从死记硬背的工作中“节省”出来的时间转移到更高的认知和社交技能上,工作也将变得对脑力要求更高。根据经合组织的数据,美国员工每年的工作时间保持在 1800 小时左右。更多的时间将花在复杂的数据处理、人员管理和学习新技术上。更多的时间花在回答“为什么”和决定做什么上。这种新的工作方式将导致对有助于这类工作的工具的需求。在下面的章节中,我们展示了一些例子,说明成熟的产品是如何融入新的功能来跟上时代的,而初创公司已经在解决可解释性的下一个问题。

既定产品的可解释性

Mixpanel 的异常解释(2018 年 6 月)

去年,Mixpanel 向其自动异常检测产品添加了解释。一旦检测到异常,Mixpanel 将挖掘数据以找到任何关键驱动因素,这样您就可以节省时间并更快地采取行动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Mixpanel

Tableau 的解释数据(2019 年 9 月)

Tableau 最近推出了一项新功能“解释数据”,以了解数据点背后的“为什么”。该功能将评估数百种可能的解释,并给出一组有针对性的解释,这样你就可以避免花时间去寻找不存在的答案

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Tableau

可解释性的下一步是什么?

现任者已经在构建可解释的特性。但是下一步是什么呢?缺少的是对因果关系的明确关注。我们已经根深蒂固地接受了这样一句格言:“相关性并不意味着因果关系。”但是当我们问“为什么”时,我们真正想知道的是原因。建立因果关系的黄金标准是进行实验(如 A/B 测试)。但是创造和管理实验是昂贵的。因此,像 Optimizely 这样的产品变得有用。它使 A/B 测试变得更加容易。但是在很多用例中,实验是不可行的,或者进行起来仍然很昂贵。我们不能使用我们已经拥有的大量观测数据吗?

来自观察数据的因果关系是下一个可解释的。这不仅是学术研究中的一个活跃领域,也是创业公司中的一个活跃领域。这里有三家有趣的初创公司,它们正处于建立产品市场契合度的种子期和首轮融资阶段。

ClearBrain

一个营销优化平台,使用因果分析来提取用户行为的因果原因(例如,转化、搅动)。它通过自动确定原因,确定可能的行动,估计每种行动的好处,在某种程度上取代了你的分析师。

  • **目标用户:**营销、增长和产品团队,以发展业务
  • **对象:**结果
  • **数据类型:**表格
  • 最新融资:$ 2018 年 4 月由 Harrison Metal 领投的 2M 种子轮

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: ClearBrain

提琴手实验室

一个可解释的人工智能平台来理解模型预测和性能。UI 允许轻松访问可解释技术、行为可视化和审计。他们的团队正在积极研究解决从观察数据推断因果关系的陷阱的方法。

  • **目标用户:**数据科学家/分析师、决策者/模型用户和监管者
  • **对象:**结果和模型
  • **数据类型:**表格(目前)
  • **最新融资:**2019 年 9 月光速领投的 1000 万美元 A 轮

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Fiddler

Sisu 数据

一个运营分析平台,监控您的业务 KPI,并告诉您其变化的原因。插入您的数据库,选择您想要跟踪的 KPI,它将在几秒钟内自动分析大型数据集。它以一种不同的方式处理可解释性——通过将最相关的数据点联系起来。分析师被流数据淹没了。一些公司每秒处理数百万个事件。

  • **目标用户:**促进业务发展的营销、增长和产品团队
  • **对象:**结果
  • **数据类型:**表格
  • 最新融资:【2019 年 10 月 a16z 和 NEA 5250 万美元 B 轮

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Sisu Data

Kubit AI

专注于 KPI 的增强分析平台,可以处理(真正的)大数据。它能够快速识别异常和原因,同时允许您与您的团队在同一页面上工作。KPI 还针对您的行业(如社交)和使用案例(如参与)进行了优化。

  • **目标用户:**拓展业务的营销、成长和产品团队
  • **对象:**结果
  • **数据类型:**表格
  • **最新融资:**2019 年 10 月沙斯塔风投 450 万美元种子轮

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: Kubit AI

对于可解释性和因果关系,仍然有很多领域——文本和图像数据是研究的活跃领域。如果你在这个领域工作,我想请你喝杯酒聊聊天。

观点是我自己的。也可从 kenn.io 获得

看不见的颗粒物质云穿越欧洲

原文:https://towardsdatascience.com/invisible-clouds-of-particulate-matter-move-across-europe-6b39e2d57511?source=collection_archive---------21-----------------------

这些 PM10 和 PM2.5 的云是从哪里来的?

在之前的帖子中,我解释了我如何设置我的室外空气质量传感器,以及它如何产生作为公民科学项目一部分的开放数据。(https://medium . com/@ ignazw/air-quality-measurements-FCC 32d 59 DCA 7)

这是公开数据,任何人都可以分析。在这篇文章中,我将向你展示如何使用 Luftdaten.info 网站来寻找大规模的空气污染模式。

情况

Luftdaten.info 在地图上显示了世界各地所有传感器测量的快照(【http://deutschland.maps.luftdaten.info/#6/51.165/10.455】T2)。大多数传感器在欧洲,所以我将限制我对欧洲的看法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Sample image from Luftdaten.info

大约每五分钟拍摄一次快照,并更新地图。我想知道如果我们把这些快照拍成延时电影会是什么样子。我们能找到什么模式吗?

获取数据

为了制作延时电影,我们需要捕捉每个快照。Luftdaten.info 上没有维护旧地图,所以我们必须自己收集。

捕获快照需要每五分钟向 web 服务器执行一次 HTTP 请求。我在运行于 raspberry pi 3 上的一个小脚本的帮助下做到了这一点。我想为每张快照拍摄两张照片:一张是欧洲大部分地区的概览,另一张是我居住的比利时的更详细的照片。

在 raspberry pi 上,我在无头模式下使用 chromium web 浏览器,即没有显示。

#!/bin/bash
chromium-browser --headless --disable-gpu \
  --screenshot --window-size=1920x1080 \
  http://deutschland.maps.luftdaten.info/#7/50.958/8.218
mv screenshot.png ./data/new/de`date +”%Y%m%d%H%M%S”`.png

您可能需要在您的系统上安装或升级 chromium 浏览器。我用的是 72 版的浏览器。确保您运行它是无头的,并禁用 gpu 使用(以避免不必要的库加载到内存中)。

luftdaten.info 网站使用 javascript 呈现地图,但 chromium 浏览器默认执行 javascript。你截取一张截图,然后定义图片的大小。默认的图片名为“screenshot.png ”,因此可以将其重命名为一个独特的名称,比如拍摄的时间。

然后编辑 crontab 以每五分钟运行一次该脚本。

这种大小的一个图像的大小超过 3 MB,因此您需要确保它不会填满您的磁盘。我每天运行一个脚本,将所有图像复制到外部存储空间,我可以从那里提取图像以备将来使用。

我在 MacOS X 上做进一步的处理,包括给截图加注释,并把它变成电影。

我在每个截图上标注了拍摄的时间和数据。我用的是 ImageMagick 包,通过自制软件安装。

#!/bin/bash
for f in $(ls ./images/raw/*.png)
do
fn=${f##*/}
anno=${fn%.png}
magick ./images/raw/$fn -pointsize 72 -gravity southwest \
  -annotate +150+50 $anno ./images/annotated/$fn
mv ./images/raw/$fn ./images/tmp/$fn
done

这个脚本读取我在一个目录中准备的所有文件名,并且是 Pi 上收集的图像的副本。它在文件名中包含截图的日期和时间。

对于每个文件,我从文件名中获取日期和时间,并将其设置为图像上的注释。+150+50 定义了距离边缘的像素数。在这个位置,它非常易读。

我将注释后的原始图像移动到一个临时目录,在确定处理正常后,我可以删除它。

下一步是用带注释的图像制作一部电影。为此,我使用 ffmpeg 包,您可能需要像安装 ImageMagick 一样安装它。

以下脚本创建了电影。

#! /bin/bash
# create movie for Germany
ffmpeg -f image2 -pattern_type glob -framerate 5 \
  -i ‘images/annotated/de*.png’ -s 1920x1080 -f mp4 
  -vcodec libx264 -pix_fmt yuv420p germany.mp4

f 标志定义了图像格式。如果您想使用 globbing 来收集图像列表,您需要定义 globbing。你需要在 fps 中设置帧率,然后是实际的输入文件。接下来是输出电影的大小、格式和编解码器。像素格式定义是为了确保 quicktime 也可以播放电影。最后,您命名输出文件。

就这么简单。一旦准备好一些脚本,就很容易多次重新运行。

延时电影

这里有两部时间跨度为 2019 年 3 月 25 日至 31 日的延时电影。一个片段展示了欧洲的大部分,另一个片段放大了比利时。

PM clouds over Europe

PM clouds over Belgium

对结果的讨论

欧洲电影表明,高水平的 PM 是由于大规模的 PM 云在欧洲移动。毫无疑问和天气有关系,但是这些颗粒都是从哪里来的呢?

比利时电影聚焦布鲁塞尔。你可能会认为 PM 水平与交通高峰时间相关,但这在电影中并不清楚,需要进一步研究。也没有显示出与乡村露天壁炉的相关性。如果这种相关性存在,它们也远低于整个欧洲 PM 云的宏观运动水平。

没想到这种行为先验。我们似乎都把责任归咎于交通,毫无疑问,这是原因之一,但更重要的事情正在发生。我们将在以后的文章中深入探讨这个问题。

公民科学很酷!

6 行代码中的 iOS 自然语言处理

原文:https://towardsdatascience.com/ios-natural-language-processing-in-6-lines-of-code-36b08af7f440?source=collection_archive---------14-----------------------

从真实的推文中判断人们的感受

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Hannes Wolf on Unsplash

使用苹果的 CreateML 库和人们过去的推文中的文本,可以非常容易地实现和导出一个用于确定人们感受的 iOS 和 MacOS 自然语言处理模型。让我们下载数据并进行测试!

从上面的链接中解压数据后,拖放。csv 文件放在方便的地方。接下来,在 Xcode 上打开一个游乐场,选择 MacOS,选择一个空白文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Make sure to select Mac OS

完成后,导入所需的库:

接下来,从。csv 文件,请确保将文件 URL 路径更改为您下载数据的位置

接下来,我们需要将数据分成训练和测试两部分,可以随意试验分割比例

如果您想要设置种子以便以后跟踪随机分割,请将上面的行更改为:

如果你看一下数据,你会看到它分为两列:一列是标签(正面、负面或中性),另一列包含推文的文本

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A look at the csv data

现在我们可以用我们的训练数据来训练模型,

您的 Xcode 控制台现在应该开始解析数据了,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后它开始训练,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,我们可以测试一下它的表现。这超过了我们的 6 线限制,但模型已经完成,所以这不算😏

我把误差降低到了 28%,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你能进一步降低错误,让我知道你是怎么做的。就是这样!你做到了!如果您想使用该模型来测试一个随机的文本字符串,以查看它是正面的、负面的还是中性的,这里有一个示例:

当我运行时,我的模型能够正确地预测“pos”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Correctly identified “pos” on last line

最后,如果您想要导出模型,

像所有 CreateML 模型一样,它将保存为. mlmodel

结论和完整的源代码

所以我们学到了三件事:

  1. 如果我们有正确的数据,从人们的推文中判断他们的情绪是可能的
  2. 苹果的 CreateML 库让这变得超级简单
  3. 整个训练和测试可以在六行代码中完成

既然你知道了这个,你打算用它做什么?你要向你的朋友炫耀吗?你会试着让它更精确吗?或者,你是不是很大胆,打算建立一个股票预测器,利用人们在推特上的情绪来决定价格波动?最后一个可能很难,但我说你要去争取!祝你好运!完整的源代码如下。

有问题吗?你可以在 www.cggonzalez.com 的找到我

数据集介绍:多类道路车辆目标检测数据集 一、基础信息 数据集名称:多类道路车辆目标检测数据集 图片数量: - 训练集:7,325张图片 - 验证集:355张图片 - 测试集:184张图片 总计:7,864张道路场景图片 分类类别: - Bus(公交车):城市道路与高速场景中的大型公共交通工具 - Cars(小型汽车):涵盖轿车、SUV等常见乘用车型 - Motorbike(摩托车):两轮机动车辆,含不同骑行姿态样本 - Truck(卡车):包含中型货运车辆与重型运输卡车 标注格式: YOLO格式标注,包含归一化坐标的边界框与类别标签,适配主流目标检测框架。 数据特性: 覆盖多种光照条件与道路场景,包含车辆密集分布与复杂背景样本。 二、适用场景 自动驾驶感知系统开发: 用于训练车辆识别模块,提升自动驾驶系统对道路参与者的实时检测与分类能力。 交通流量监控分析: 支持构建智能交通管理系统,实现道路车辆类型统计与密度分析。 智慧城市应用: 集成至城市级交通管理平台,优化信号灯控制与道路资源分配。 学术研究领域: 为计算机视觉算法研究提供标准化评测基准,支持多目标检测模型优化。 三、数据集优势 高场景覆盖率: 包含城市道路、高速公路等多种驾驶环境,覆盖车辆静止、行驶、遮挡等现实场景。 精细化标注体系: 采用YOLO标准格式标注,每张图片均经过双重质检,确保边界框与类别标签的精准对应。 类别平衡设计: 四类车辆样本量经科学配比,避免模型训练时的类别偏向问题。 工程适配性强: 可直接应用于YOLO系列模型训练,支持快速迁移至车载计算平台部署。 现实应用价值: 专注自动驾驶核心检测需求,为车辆感知模块开发提供高质量数据支撑。
内容概要:本文介绍了DeepSeek与Mermaid结合实现可视化图表自动化生成的技术及其应用场景。DeepSeek是一款由杭州深度求索人工智能基础技术研究有限公司开发的大语言模型,具有强大的自然语言处理能力,能理解复杂的自然语言指令并生成对应的Mermaid代码。Mermaid是一款基于文本的开源图表绘制工具,能够将简洁的文本描述转化为精美的流程图、序列图、甘特图等。两者结合,通过DeepSeek将自然语言转化为Mermaid代码,再由Mermaid将代码渲染成直观的图表,极大提高了图表制作的效率和准确性。文章详细描述了DeepSeek的发展历程、技术架构及应用场景,Mermaid的基础语法和图表类型,并通过一个电商平台开发项目的实战演练展示了二者结合的具体应用过程。 适合人群:具备一定编程基础和技术理解能力的研发人员、项目经理、数据分析师等。 使用场景及目标:①需求分析阶段,快速生成业务流程图和功能关系图;②设计阶段,生成系统架构图和数据库设计图;③实现阶段,辅助代码编写,提高编码效率;④验证阶段,生成测试用例和测试报告图表,直观展示测试结果。 阅读建议:在学习和使用DeepSeek与Mermaid的过程中,建议读者结合具体项目需求,多实践生成图表和代码,熟悉两者的交互方式和使用技巧,充分利用官方文档和社区资源解决遇到的问题,逐步提高图表绘制和代码编写的准确性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值