TowardsDataScience 博客中文翻译 2019(八十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

波士顿 Airbnb 分析

原文:https://towardsdatascience.com/boston-airbnb-analysis-f46bcda1713a?source=collection_archive---------16-----------------------

波士顿到处都是历史名胜和古迹,充满了爱国主义精神。让自由之声响起来!下面简单分析一下波士顿 Airbnb。为了更详细的分析,这里是我的笔记本Github 库以及所有需要的代码。

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

Original photo by Anthony Delanoix on Unsplash

介绍

答 irbnb 已经成为许多旅行者的首选,不仅是在世界各地寻找住宿的时候,也是在到达一个城市之前探索这个城市的时候。当考虑在目的地过夜时,人们会想要一个“家外之家”。因此,Airbnb 为市场重塑了一个独特的、鼓舞人心的蓝海,“蓝海战略是同时追求差异化和低成本以开辟新的市场空间和创造新的需求。”在蓝海,需求是创造出来的,而不是争夺出来的。Airbnb 为顾客和主人提供了双赢的局面;虽然顾客可以以较低的价格获得住宿,但主人可以通过出租他们的房产来赚钱。

为了进一步了解波士顿如何利用 Airbnb,我分析了波士顿 Airbnb 从 2019 年 2 月到 2020 年 2 月的房源。本分析中使用的数据集是根据*Creative Commons CC0 1.0 Universal(CC0 1.0)“公共领域专用”*许可证从 Airbnb 数据库内部获取的。该数据集报告了波士顿寄宿家庭的列表活动。该数据集包含超过 6150 个物业列表,包括但不限于主机信息,价格,邻里,设施,取消政策和评论。

分析及其结果只是观察性的,不是正式研究的结果。下面列出了一些常见的业务问题,引导我们通过分析来创建一个模型,该模型可以根据一些特征来预测租赁价格。

商业问题

1.波士顿所有 Airbnb 的价格在 2019 年全年如何波动?
2。波士顿 Airbnb 租赁价格的高峰/非高峰时间是什么时候?
3。Airbnb 房源最多的主机是谁?
4。波士顿哪些社区的挂牌数量最多?
5。波士顿最贵的社区是哪些?
6。哪些是基于平均评论数的热门社区
7。波士顿 Airbnb 的房源大部分是哪种类型的房间?
8。波士顿 Airbnb 有哪些影响价格的功能?我们可以根据预测模型预测新房源的租赁价格吗?

数据准备和探索

B 在深入研究数据集之前,应该清理数据,并为探索和建模做好准备。因此,删除了几个特征,以确保最终的数据集只包含为我们的分析增值的特征(变量)。以下质量和整洁问题已得到解决;例如,价格列中有美元符号($)和逗号(,)的地方被清理了。另外,日期列被转换为日期时间,并且删除了许多缺少值的列。虽然删除了一些有缺失值的行,但是cleaning _ fee特性只有少量的空值;因此,这些字段被赋予了最常见的值。

  1. 质量问题
    -某些功能
    中的数据缺失-中的数据类型错误日期 功能
    -便利设施 中的源类型,其中字段与符号错综复杂
  2. 整洁问题
    -具有多个表示的特征: 房间类型、便利设施和邻里清洁
    -注释reviewer _ name中的源类型,其中有些字段用符号表示,有些用不同的语言编写。

接下来,我们将调查价格分布,以确保我们删除离群值,或主机,他们列出了每晚的合理价格。

根据显示所有列表中价格分布的直方图,每晚 500 美元的最高价格是合理的。每晚超过 500 美元的列表是异常值。虽然我们可能认为 500 美元很高,没有反映 Airbnb 的概念,但在波士顿的一些社区,这是可以接受的。

如上所述,虽然 500 美元是一个合理的租金价格,但该地块表明,大多数房源价格在每晚 50 美元至 200 美元之间,这比 500 美元更有意义。然而,出于更广泛的分析目的,每晚 500 美元将是我们进一步分析中每晚最高房价的分界点。

波士顿所有 airbnb 的价格在 2019 年全年如何波动?

时间序列图显示了 Airbnb 房源价格迅速上涨的两个时期。阴影区域显示价格上涨的日期。水平线代表全年的平均租金

  • 从 2019 年 4 月 8 日到 2019 年 4 月 21 日的期间,平均价格的增长高于整体平均价格。经过进一步的调查,这种增长是由于波士顿马拉松,世界上最古老和最具挑战性的比赛之一。马拉松比赛于 4 月 15 日星期一举行。
  • 2019 年 12 月 25 日至 2020 年 2 月 7 日期间,价格有所上涨,这是意料之中的,因为它将迎来圣诞节和新年前夜。
  • 2019 年 2 月和 2020 年 2 月之间平均价格的显著差异。虽然 2019 年是房价最低的时期,价格范围在每晚 136 美元至 200 美元之间,但 2020 年的价格从每晚 234 美元开始。
  • 总体而言,波士顿 Airbnb 的非高峰期出现在 2019 年 2 月和 3 月,高峰期出现在 2019 年 4 月至 10 月。价格在 11 月份下降,直到 12 月份趋势再次上升。

波士顿 airbnb 租赁价格的高峰/非高峰月份有哪些?

每月价格趋势图显示了波士顿 Airbnb 房源价格的高峰和非高峰月份。红色区域表示每晚平均价格高于每晚所有列表的总体平均价格的月份,而绿色区域表示每晚平均价格低于每晚所有列表的总体平均价格的非高峰月份。

  • 2019 年的 2 月、3 月、4 月初、11 月和 12 月的大部分时间是价格低于每晚 215 美元的非高峰月。
  • 2019 年 4 月下半月、5 月、7 月、8 月、9 月、10 月上半月、12 月底以及 2010 年 1 月和 2 月是价格高于每晚 215 美元的高峰月份。

波士顿 airbnb 的房源大部分是哪种类型的房间?

Airbnb 房东可以列出这些房间类型中的一种或全部:整个家庭/公寓、私人房间或共享房间。该图显示,整个住宅/公寓占波士顿周围 3775 个列表中的 63.91%。其次是有 2061 个房源的包房和只有 71 个房源的合租房,仅占 1.2%

airbnb 房源最多的主机是谁?

正如我们从条形图中看到的,Sonder 在 6140 个列表中占有大约 10%的份额,其次是 Kara,155 个,Bluebird,154 个,Mike,142 个。这四个主机约占全部列表的 25%。其他主机的列表数量范围从 1 到 89 个列表。

根据 Inside Airbnb 的说法,注意到“主人可能会列出同一公寓中的独立房间,或者多个公寓或住宅的整体情况”是至关重要的。拥有多个房源的房东更有可能在经营一家企业,不太可能住在该房产内,而且违反了旨在保护住宅的大多数短期租赁法律。”

波士顿哪些社区的挂牌数量最多?波士顿哪些社区被认为是最贵的?
根据平均评论数,哪些是热门街区?

下面生成的热图将进一步阐述这些数字,因为它不仅显示了每晚房价较高的区域,还显示了大多数房源所在的区域。

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

Heat Map of Boston airbnb properties based on price

虽然条形图显示多切斯特和牙买加平原是数据集中房源数量最多的两个街区,但箱线图显示了最昂贵的两个街区之间的完整比较,其中不包括提到的前两个街区。

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

Art by Carrie Wagner on Etsy

  • 唐人街的平均房价最高,约为 226 美元,而在六个最贵的社区中,“芬威”的平均房价为 200 美元。
  • 大多数房源的价格在每晚 289 美元到 131 美元之间,这表明了这些社区的合理价格。

此外,根据平均评论数得出的热门街区的结果用下面生成的热图进行了修饰,因为它显示虽然 North End 不占房源的最高数量,但它在 2019 年对波士顿 Airbnb 房源的平均评论数最高。

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

Heat Map of Boston airbnb properties based on number of review

数据建模

C 创建一个预测租金价格的模型需要更多的数据准备和清理工作,以确保数据集不包含任何分类变量和缺失值。由于缺失值已经被丢弃或估算,这里最重要的步骤是评估分类特征:哪些是二元的,哪些是多层次的。然后,通过为每个唯一值获取虚拟对象来重新编码这些特征。便利设施栏需要对其领域进行更多的评估,将所有的便利设施分成单独的栏。

该模型旨在说明波士顿 Airbnb 租赁价格的驱动因素。*波士顿 Airbnb 中有哪些影响价格的功能?此外,我们能否根据预测模型来预测新房源的价格?*因此,数据集被分为解释变量和响应变量,其中价格作为目标,所有其他特征作为独立变量。在预测和获得普通最小二乘法的概要之前,数据集被分成 80%训练和 20%测试,包括具有 4725 个样本的训练集和具有 1182 个样本的测试集。

评估和结论

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

Complete results can be found here.

根据回归结果,调整后的 R(选择调整后的 R 而不是 R,因为它考虑了功能的数量)表明,列出的功能可以解释波士顿 Airbnb 价格中 61%的可变性。接下来,我们将了解哪些功能比其他功能具有更大的权重和影响,然后确定模型中的功能之间是否存在显著的关系。如果每个特征的 p 值小于 0.05,我们得出结论,有足够的证据表明,我们有 95%的信心认为价格和特征之间存在显著的线性关系。

波士顿 Airbnb 有哪些影响价格的功能?
我们能否根据预测模型来预测新房源的价格?

条形图细化了价格和最有影响的功能之间的关系。我们可以得出结论,一些特征与波士顿 Airbnb 的租赁价格呈强正相关,而其他特征则呈负相关。此外,该模型验证了我们之前关于最广阔、最受欢迎的社区的发现。

根据之前的调查,我们得出结论,以下列出的功能通过提高或降低租赁价格,对预测波士顿 Airbnb 房源的价格具有更大的影响:

  1. 便利设施:
    —电动仿形床
    —楼梯门
    —洗衣机/烘干机
    —热水壶
    —卫生间固定扶手
    —私人浴室
    —房间遮光帘
  2. 物业类型:
    —平房
    —酒店式公寓
    —小房子
    —酒店
    —房子
  3. 街区:
    —后湾
    —皮革区
    —南波士顿海滨
    —唐人街
    —市区
    —马特潘
    —海德公园
  4. 其他房屋规则和特点:
    —取消政策:严格
    —房型:全屋/公寓

精神食粮

  • 回归结果具有调整后的 R,表明列出的特征可以解释波士顿 Airbnb 价格中 61%的可变性。

我们能找到更好的模型,有更高的准确度和更高的 R 来解释大部分的变异吗?

  • 根据 OLS 回归结果,某些要素不具有统计显著性,因为它们的 p 值(用于确定模型中要素之间是否存在显著关系)高于 0.005。牢记在心;线性关系可能具有统计显著性(p 值低),但是,它不能解释因变量的大部分可变性(调整后的 R 值不高)。

这是否意味着移除这些独立变量会改善我们的模型?

参考

  1. 价值创新|蓝海工具和框架。【https://www.blueoceanstrategy.com/tools/value-innovation/】

波士顿数据分析师和科学家就业市场:2019 年 8 月更新

原文:https://towardsdatascience.com/boston-job-market-for-data-analysts-and-scientists-august-2019-update-1e057bb7bca?source=collection_archive---------27-----------------------

大多数招聘公司、顶级工具和技术等

介绍

这是我的原始项目的 2019 年 8 月更新,我的目标只是探索大波士顿地区数据分析师和数据科学家的就业市场。

这些图片仅来自在 Indeed 上发布的职位列表,搜索条件为“数据分析师”或“数据科学”,因此仅代表选择在 Indeed 上发布的公司。因为这是上一篇文章的更新,所以我在这里只展示视觉效果。要详细了解所采取的步骤和所做的假设,请查看我在的原始项目中的完整演示。

最受欢迎的职位

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

这里我们简单列出了 10 个最常见的职位。当然,最普通的头衔在最上面,比如“数据科学家”和“数据分析师”。这里需要注意的一点是,波士顿市场上有大量的“高级”图书。

波士顿招聘数据分析师和科学家最多的公司

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

这是波士顿就业市场的一个有趣的代表。总部位于波士顿的 Liberty Mutual 在数据科学领域占据了 8 个不同的领先位置。而大多数工作是在医疗保健和制药行业,这更符合波士顿的情况。

最低工作经验年限

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

这大概是你所期望的最常见的最低工作经验年限在 1-3 年的范围内。有趣的是,在 4 中看到同样的下降(这是我在我的原始帖子中看到的)表明人们宁愿使用漂亮的 round 5+而不是 4。分析师职位和科学职位之间似乎没有太大的区别。

最低教育水平

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

这就是你所期望的。然而,我认为数据科学岗位更需要硕士学位,甚至学士和硕士学位也是如此。

最受欢迎的工具和技术

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

超过 60%的职位列表中仍然需要(或提到)Excel。当然,python 和 sql 紧随 excel 之后,R 比我预期的(希望的)多一点,只在四分之一的清单中被提及。

感谢阅读!

同样,要详细了解所采取的步骤和所做的假设,请查看我在的原始项目中的完整演示。我真的很想对这里的一些描述数据做更多的工作,所以如果你有任何我可以问的更多问题的想法,或者要添加到列表中的工具/技术,请在下面评论。

Ubuntu 18.04 上的机器人实时物体检测

原文:https://towardsdatascience.com/bot-realtime-object-detection-in-overwatch-on-ubuntu-18-04-5571c4c85ec6?source=collection_archive---------17-----------------------

在本教程中,我会告诉你,如何安装 Overwatch,从你的实际游戏中收集图像数据,在上面训练模型,并将这个模型应用于实时物体检测。

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

为此,请确保您已经安装了 Tensorflow。最好有 GPU 支持,以获得更快的速度。没有它,你将会有更小的 fps,训练模型将会花费相当多的时间,并且实时性能可能无法实现。

Part1:在 Ubuntu 18.04 上安装 Overwatch

在几次使用 Wine 和 DXVK 安装 Overwatch 的失败尝试后,我开始使用 Flatpak,它似乎很容易在 Linux 上运行 Windows 应用程序。事实也的确如此,除了驱动程序版本的特殊时刻。稍后将详细介绍。

在已安装的 Flatpak 和 Battle.net 启动器上运行这些命令:

sudo apt install flatpak gnome-software-plugin-flatpak
sudo flatpak remote-add --if-not-exists flathub https:**//**dl.flathub.org**/**repo**/**flathub.flatpakrepo
sudo flatpak remote-add --if-not-exists winepak https:**//**dl.winepak.org**/**repo**/**winepak.flatpakrepo
sudo flatpak install winepak com.blizzard.Overwatch

重新启动电脑后,键入:

sudo flatpak run com.blizzard.Overwatch

你会看到:

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

Niiiice, aren’t?

为了更多的 FPS 和流畅的体验,你需要安装额外的 nvidia 驱动程序(因为现在游戏使用 OpenGL 引擎)。在少数情况下,没有图形驱动,游戏根本无法运行。

**重要提示:**您当前从 nvidia-smi 命令输出的版本和 flatpak 版本必须相同。否则,你会得到错误时,点击播放在看守部分在 Battle.net 发射器。请注意,你需要两个版本的 Flatpak 驱动程序。

例如,目前我有这个版本的 nvidia 驱动程序:

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

Version of drivers: 410.104

下一步:我检查 Flatpak 中是否有该版本的驱动程序:

flatpak remote-ls flathub | grep nvidia

是的,在 FlatHub 有 410-104 版本的 Nvidia 运行时包(不要在这里放屏幕,因为输出很大)。

这样我就可以使用这些命令在 Flatpak 中安装 32 位和 64 位版本(提醒,您需要这两个版本!):

flatpak install flathub org.freedesktop.Platform.GL32.nvidia-410–104
flatpak install flathub org.freedesktop.Platform.GL.nvidia-410-104

如果一切顺利,你就可以开始游戏了!

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

Yeaaah!

最后:为了录制和获得更舒适的 fps,进入选项-视频,选择窗口模式,1280*720 分辨率,30 fps 锁定和低设置。当你在玩警戒时,当模型一起工作时,这允许你在游戏中达到大约 30/3 = 10 fps 性能。是的,运行模型是一个详尽的过程,你的 GPU 会 100%的工作。实际上取决于你的 GPU。但在我的 1060 上这是真的。

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

在本教程的下一部分,我将向你展示如何为你的模型获取训练数据,训练模型(如果你想的话),并在游戏时进行实时检测。

**附言:**如果你坚持选择正确的驱动程序,请查看这篇小文章(你也可以找到更多解释)如何克服这个问题:

[## 如何让使用 OpenGL 构建的 Flatpak 应用和游戏与专有的 Nvidia 显卡一起工作…

一些用 OpenGL 支持构建并打包成 Flatpak 的应用程序和游戏无法用专有的 Nvidia 启动…

www.linuxuprising.com](https://www.linuxuprising.com/2018/06/how-to-get-flatpak-apps-and-games-built.html)

第二部分:记录游戏过程并准备训练图像

让我们安装这些库,它允许我们捕获游戏:

pip3 install --user pyscreenshot
pip3 install --user mss

安装 Overwatch 后,你可以使用 simplestream.py 实时记录游戏过程(大约 80-100 fps)

请看第 17 行:在这里您选择屏幕的一部分来捕获。你需要用显示器字典中的值来适应你的窗口游戏。请随意用值替换这一行代码,这样您会感觉最舒服。例如,我对它们进行了硬编码,并在屏幕中央设置了监视窗口;你可能更喜欢把窗口放在左上角等等。花几分钟在上面;你只能做一次。

只需在控制台中键入:

python3 simplestream.py

回到游戏中。当你完成后,点击窗口框架,并按下 q。脚本完成,你可以在这里看到输出. avi 文件。那是你的玩法,会在哪个模型上训练。

**重要提示:**您第一次可以使用 my repo 中的训练模型,不要制作图像、训练模型等(请跳过这一步,进入下一部分)。如果你会从结果中得到启发,欢迎使用你自己的数据来训练你自己的模型。

获取图像

为了从 output.avi 中提取帧,你需要 ffmpeg:所以让我们安装它吧!

pip3 install --user ffmpeg

使用 ffmpeg 从创建的视频中获取帧(首先创建文件夹/图像!):

ffmpeg -i output.avi -vf fps=10 images/thumb%04d.jpg -hide_banner

这让我们每秒钟从视频输出. avi 中获得 10 帧,并将这些帧(图像)保存在图像文件夹中。

用 python3 resizer.py 调整大小

你可以用 now resizer.py 让图片比现在更小。

python3 resizer.py

我评论了第 20 行,因为发现,分辨率 960540 最适合初始分辨率在 1280720 左右的图片。嘶!第 20 行和第 21 行做的东西一样,所以你可以用你最喜欢的那一行)。但是不要忘记评论另一行——否则你会破坏你的图像!(开个玩笑——在这种情况下,你将每张图片的大小调整两次,结果会非常糟糕)。

用标签标注

我们来注释图像。为此,我建议使用标签。

git clone [https://github.com/tzutalin/labelImg.git](https://github.com/tzutalin/labelImg.git)
cd labelImg
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py

pip3 为什么不装 labelImg?因为我已经试过了,不能启动这个程序。所以从源代码安装只是一种方式,对我来说很有效。你可以试着从 pip3 安装,也许你可以启动它并节省几分钟。

我使用一个类“bot”来注释图像,因为我想检测 bot(显然,不是吗?).如果你想检测很多类,这部分消耗的时间会增加很多,因为你出错和选择错误类的机会很高(特别是当你在帧上有很多对象的时候)。

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

因此,现在您需要注释 images/train 和 images/test 文件夹中的每个图像。这是耗时的部分,所以要冷静,专心,不要动作太快。

**重要:**删除至少没有一个类的坏帧。如果您丢失了至少一个文件,您将无法为此图像创建注释。而且模型训练还没有开始,因为你将没有等量的图像和 xml 文件(注释)!

创建测试和训练目录

为此,使用 split.py:

python3 split.py

此脚本中的代码:

Place this script in place, where exists images as subdirectory

之后,将 images 文件夹放在 object_detection 文件夹中,进入 tensorflow 部分(第 3 部分)。

第三部分:张量流部分

你可以跳过这一部分,第一次使用我训练过的模型(我在一个 github repo 上提供了所有文件)。在这两种情况下,您都需要安装这些库:

pip3 install pillow
pip3 install lxml
pip3 install jupyter
pip3 install matplotlib
pip3 install opencv-python opencv-contrib-python
sudo apt install protobuf-compiler

这部分是最费时间的,在这个过程中你会遇到很多问题。我的指南基于来自的精彩教程。它适用于 windows 10,但区别并不太大。只有当你想用你自己的数据训练你自己的模型时(比如从 quickplay match 中检测 Hanzo ),你才可以做下面所有的步骤。

下载模型,重新加载原型,重新加载变量(别忘了把/home/Dmitry 改成/home/your_username/):

git clone [https://github.com/tensorflow/models.git](https://github.com/tensorflow/models.git)
cd models-master/research
protoc object_detection/protos/*.proto — python_out=.
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
sudo gedit ~/.bashrc 
export PYTHONPATH=$PYTHONPATH=/home/dmitriy/models/research:/home/dmitriy/models/research/slim
source ~/.bashrc

来自研究目录:

sudo python3 setup.py build
sudo python3 setup.py install

然后运行(在注释完所有图像后):

python3 xml_to_csv.py

这将在\object_detection\images 文件夹中创建一个 train_labels.csv 和 test_labels.csv 文件。在 generate_tfrecord.py 中进行更改。例如,我的文件:

如您所见,您需要在第 30–35 行修改所有的类(在我的例子中是“bot”)。其他的你都不需要改变。之后(从 object_detection 文件夹):

python3 generate_tfrecord.py --csv_input=images/train_labels.csv --image_dir=images/train --output_path=train.record
python3 generate_tfrecord.py --csv_input=images/test_labels.csv --image_dir=images/test --output_path=test.record

它们在\object_detection 中生成一个 train.record 和一个 test.record 文件。这些将用于训练新的对象检测分类器。

从 tensorflow zoo 下载模型作为配置,并放入 object_detection/training 文件夹:

wget [http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz](http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz)
tar xvzf faster_rcnn_inception_v2_coco_2018_01_28.tar.gz

在 labelmap.pbtxt 中进行更改。例如,我的文件:

所以,比如你想检测半藏类,就把 bot 改名为半藏。

然后在 fast _ rcnn _ inception _ v2 _ pets . config 中进行更改。

代码:

我们开始吧:

将第 9 行的 num_classes 更改为您的类的总数。例如,如果我只想检测一个机器人,它将是 1;

在第 106 行将 fine_tune_checkpoint 更改为放置 fast _ rcnn _ inception _ v2 _ pets . config 的路径;

在第 112 行 nums_steps 更改为你想要训练模型的多少(通常 10–20k 就够了);

在第 122 行 input_path 处切换到您的 train.record 所在的位置;

在第 124 行 label_map_path 更改为您的 labelmap.pbtxt 所在的位置;

将第 128 行的 num_examples 更改为\images\test 目录中的图像数;

在第 136 行 input_path 处切换到您的 train.record 所在的位置;

在第 138 行 label_map_path 更改为 labelmap.pbtxt 所在的位置。

请注意正确地更改这些路径!

并将这些文件(labelmap.pbtxt 和 faster _ rcnn _ inception _ v2 _ pets . config)放在 training 文件夹中。

将 train.py 从旧文件夹移到主文件夹。

之后,你可以开始训练:

python3 train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config tensorboard --logdir=’training’

请确保 inference_graph 为空或未创建。

python3 export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-10000 --output_directory inference_graph

请随意将 model.ckpt-number_of_epochs 更改为您的号码。因此,如果您训练了 1000 个历元,请将 trained _ check point _ prefix training/model . ckpt-10000 更改为 trained _ check point _ prefix training/model . ckpt-1000。

这将在\ object _ detection \ inference _ graph 文件夹中创建一个 freezed _ inference _ graph . Pb 文件。的。pb 文件包含对象检测分类器。

对于教程的下一部分,您需要来自\object_detection\training 文件夹的 freezed _ inference _ graph 和 labelmap.pbtxt。还有 fast _ rcnn _ inception _ v2 _ pets . config,文件夹 protos,utils,training 和 core。

因此,在某个地方创建 object_detection 文件夹,并将其全部移入其中。现在,您已经准备好了最后一部分(第 4 部分:实时检测)。

第四部分:运行实时检测

经过上述所有的艰苦工作,这一步成为最容易的一步。

如果你只是想测试训练模型,然后下载我的回购使用以下命令:

git clone [https://github.com/Oysiyl/Bot-object-detection-in-Overwatch.git](https://github.com/Oysiyl/Bot-object-detection-in-Overwatch.git)

然后将此文件夹重命名为 object_detection,并移动到此文件夹。

我建议你第一次运行 Object_detection_image.py,以确保一切正常。所以运行这些:

python3 Object_detection_image.py

在等待初始化 Tensorflow 并将模型加载到 GPU 内存中大约 5-10 秒后,您将看到此图片,其中包含两个已识别的框(按 Q 退出):

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

I think, we might customize text on boxes later

以及检测到的箱子的坐标:

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

So, bots are successfully detected. Niiice!

我们将在(realtime_detect_stream.py)之后运行的脚本代码:

运行 realtime_detect_stream.py(要退出,请单击框架窗口并按 Q 键):

python3 realtime_detect_stream.py

如果你有超宽显示器或者只有第二台显示器,体验会更舒服。你会看到实时对象检测!我不能在这里显示一个漂亮的屏幕,因为我只有一个全高清显示器,实际上游戏窗口和识别游戏的窗口都不合适。

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

Such that

小提示:您可以将 123 行更改为 cv2.resize(img,(300,300))并获得更健壮的图片(或选择更多少量的像素):

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

You are almost see the whole picture

退出后,您会看到 output2.avi 文件已经创建。在这里,您可以观看视频,了解模型的表现:

额外部分:使用训练过的模型击败机器人

嘶!确定谁是你的敌人后,你就可以打败他。所以,opencv 可以用机器人检测盒子的坐标。您可以使用 pyautogui 来击败他们!

pip3 install --user pyautogui
sudo apt-get install python3-tk python3-dev

不同的距离对精确度有很大的影响。请看这个演示:

这是从更大的距离(我使用 WASD 接近目标):

我在鳏夫制造者身上测试过。所以,一秒钟的延迟让她可以毫无延迟地瞄准并打出有力的一击,而不是无力的一击。你只要向机器人走去,opencv 就会检测到机器人,并在他周围建一个盒子,然后程序就会尝试投篮。我用盒子中头部的可能位置来表示这一点,所以程序将继续移动相机到这一点,并在达到这一点后单击。

请注意,使用 time.sleep(1.0)会导致在录制视频时损失 1 秒,因为程序暂停了 1 秒(10 fps)。你可以用 time.sleep(1.0)把这一行改成 pyautogui。PAUSE=1.0 并在单击返回到默认 pyautogui 设置后添加(通过以下方式— pyautogui。暂停=0.01)。我不建议你这么做,因为 programm accuracy 会做出一些奇怪的动作(比如向目标点移动时开枪)。使用这些方法的好处——当你瞄准时,你记录的视频将是完整的,不会丢失 10 fps (1 秒)。

**重要提示:**要从 pyautogui 中获得正确的操作,您需要在游戏选项-视频-显示模式中进行更改,并设置为“无边框窗口”。如果没有这个程序,每次都不能正确的点击和移动你的相机到任意的位置。不要忘记,如果你想记录这个,你需要改变显示器字典(看第 116 行),因为你的游戏窗口现在将是无边框窗口,而不是之前的窗口。

这段代码插入 realtime_detect_stream.py 中的名称定义之后。如果你不知道在哪里添加,看看这个完整的例子:

重要代码行的简短说明:

在行 152 中,我们仅选择通过 90%极限检测的盒子;第 167–181 行—找到盒子的坐标;使用 if 语句(第 183-185 行)每帧只需要选择和跟踪一个框。这很重要,因为如果模型检测到两个或更多的盒子,她会从一个跳到另一个,没有任何动作(但它的工作并不完美,有些问题)。

然后我们找到了中心 x 和中心 y 坐标——我们的模型将移动到这一点。用于移动计算的 moveX 和 moveY。如果移动得很大(第 191-194 行),我们将使这个移动变得更小——提高移动精度(第 195-198 行):如果模型接近目标(5 px 或更小),使下一个移动等于 0(因此不允许在这个轴上移动,在大于 5 的另一个轴上移动)。如果我们达到了“中心”,模型将执行我们假设的一组动作(第 204-212 行)。在这里你可以尝试使用 pyautogui。没有时间的暂停。睡眠(1.0)。如果我们还没有到达“中心”,那么根据当前摄像机位置的坐标执行移动(第 214-226 行)。

在每一帧的下一行画一个圆(我们要移动的点),并输出许多文本,直接放在你的帧上以便进一步监控(这非常非常有用,当出错时)。例如,当 defeat_bots.py 移动不是你无法理解的时候,那些监视输出可以帮助你看到,在下一帧中什么模型将做,哪些移动选择,接下来在哪个方向移动,多少像素…您可以注释这些输出(第 232–237 行)。

在第 240 行,opencv 将给定的帧保存到视频中,然后向您展示这一帧(第 241 行)。像往常一样,按键盘上的 Q 将停止程序,保存视频(第 250 行)后,opencv 将关闭(第 251 行)。

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

Monitoring outputs in upper left corner

正如你从下面的图像中看到的,模型在中心射击机器人,并开始向下一个目标移动。这是我激活的 ult,程序现在不能这样做。我只是好奇 ult 是否在模型准确性上有所努力(但没有发现任何努力)。我用 WASD 组合按角色表演所有的动作。

运行 defeat_bots.py:

python3 defeat_bots.py

像往常一样,去训练室值班。如果 opencv 检测到至少一个机器人——程序将使用鼠标移动相机到这个识别的边界框,并点击直到框消失(机器人被击败)。耶希!

**加成:**在训练室其他英雄 vs bots 上测试并不难。例如,将第(204–212)行的动作更改为仅 pyautogui.click()允许您使用这样的字符,其主要攻击是左键单击:

Such as bastion (Beep-beep!)

正如你所看到的,侦查并不依赖于所选的英雄,考虑到英雄的游戏性和他/她拥有的能力的差异,你可以为几乎任何你想要的英雄采用脚本。

**重要:**本文中的所有内容,尤其是额外部分,都是出于科学目的和我的好奇心。我不建议你用模型对抗其他玩家,因为:

零:当物体远离或者英雄只看到物体的一部分时,模型无法检测到。你需要训练模型理解效果(比如每个英雄的莱因哈特盾或者最后通牒能力)。

第一:因为你需要在大约一千个(!!!)类认每个英雄(现在 30 左右)每个皮肤(不知道多少)。

第二:你需要在许多不同的地图上训练(因为不同的环境,在绿洲上训练的模型在南极洲几乎不工作)。

第三:我的数据集有近 600 张图片,经过 1000 步训练,应该足以在一张没有任何皮肤的地图上检测一个类(机器人)(但你看这种检测远远不够理想)。想象一下,你需要创建和注释多少图像才能达到好的效果。以及训练时需要多少计算能力才能得到好的结果并达到至少每秒 60 帧的实时速度。

第四:模特不能动!我不知道逻辑如何实现这一点。

此外,因为这是作弊,你可能应该被禁止,当与真人,而不是机器人玩。

希望你成功,这项工作将激励你从这个游戏或另一个(你最喜欢的)更有趣的模型。

祝你愉快,这是你应得的!

机器人罗斯:教电脑画画

原文:https://towardsdatascience.com/bot-ross-teaching-a-computer-to-paint-f5a9c9ef908?source=collection_archive---------12-----------------------

我承认,我不是一个非常好的艺术家。至少不用刷子和颜料。我可以用钢笔或铅笔做出可信的努力,前提是你不是在寻找像人手或马这样棘手的东西。但是打开油彩,一切都结束了——我能做的最好的就是用花哨的颜色画出一些难以辨认的斑点。尽管,或者可能是因为完全没有绘画能力,我发现电视名人画家鲍勃·罗斯非常迷人。他温和的表达和轻松的方式是忙碌世界中的安慰。罗斯的演讲更迷人的一面是他保证,只要有足够的练习,任何人都可以学会画画。

“天赋是一种追求的兴趣。任何你愿意练习的事情,你都可以做到。”— 鲍勃·罗斯

这是一个非常吸引人的想法,也是我想要分享的观点。我坚信努力工作和实践会超越一些模糊的“天赋”概念。罗斯在绘画时看起来如此平静,如此沉浸在他在画布上创造的阿拉斯加小乡村荒野中。我也想探索那片荒野。但是我很忙。我有很多工作要做,还有很多论文要写。我能走捷径吗?鲍勃·罗斯说如果我愿意练习,我可以画得像他一样。但是我能找到一个算法来帮我做这个练习吗?我可以教电脑画画吗?

这对人工智能来说是个棘手的问题。我们能不能把这个问题组织成计算机可以解决的形式?教电脑画画是什么意思?我想要实现的是一个系统,在这个系统中,我可以用最少的投入,用最少的努力创作出一幅新颖的画。我想缩短练习的过程。我想要的是能把我花哨的斑点变成类似鲍勃·罗斯画作的东西,而不用自己去学。

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

I call it “Toothpaste Mountain”

在很大程度上,人工智能算法的工作原理是预测。给定一个输入,他们预测一个最有可能满足一些期望标准的输出,以最小化误差。在这种情况下,我们需要一种算法,给定我的一个 blobby 创作,它可以预测(并显示)这幅画是鲍勃·罗斯自己画的会是什么样子。它需要在我半无能的输入和鲍勃·罗斯式的输出之间有效地转换

我们越来越接近把这个问题变成一个可解决的问题。我们需要的是一组训练数据——一组与真正的鲍勃·罗斯对等物配对的 blobby 绘画。为了实现这一点,我们需要经历一个艰苦的逆向工程过程——获取完整的鲍勃·罗斯画作,并为每一幅画创建一个 blobby 等价物。我们将鲍勃·罗斯绘画中的所有元素——雄伟的山脉、安静的河流、舒适的小屋、飘动的云彩和快乐的小树——用模糊的正确形状将它们渲染成简单的彩色斑点。我称这种风格为“Blob Ross”。

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

(The original is on the left)

在一个好朋友的帮助下,我制作了 250 多幅 Blob Ross 画作,并与鲍勃·罗斯原作配对,这是一个很小但希望足够的训练数据集。这是计算机将学习的数据,例如,推断一片皇家蓝色应该被渲染为一些戏剧性的阿拉斯加山脉,而一条青色应该成为一条蜿蜒的河流。

现在我们只需要一个可以学习解决这个问题的算法。在这种情况下,我在过去几篇文章中介绍的神经网络不会成功。正如我们所了解的,这些算法(像大多数机器学习算法一样),基于最小化错误的原则工作。他们产生的结果将是整个训练集中错误最少的,平均*。但这是个问题。我来解释一下原因。*

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

So majestic

这是一些鲍勃·罗斯画作中的山脉。虽然他们都是他的风格,但他们也有很大的不同——他们有不同的颜色,他们有不同的明暗图案,他们的形状也非常不同。试图预测这一点的传统算法会试图分割差异——它会试图准确地在所有罗斯山脉的中间找到颜色和形状。很可能会产生卡其色污迹。但是有更好的方法。

相对而言,人工智能中使用的大多数技术和算法都非常古老。神经网络,比如我用来识别中世纪杆臂的神经网络,(可以说)是在 20 世纪 40 年代首次描述的。现代机器学习中使用的许多其他技术甚至更古老。但我们在这篇文章中使用的技术是一个真正的新发明:“生成对抗网络”或“GAN”。

GAN 仅在几年前的 2014 年首次提出。GANs 负责一些最令人兴奋和最令人恐惧的计算机生成图像的最新创新,包括“deepfake”技术,它可以无缝地将一张新面孔粘贴到演员的身体上(通常是裸体的)。

虽然 GANs 建立在神经网络的概念上,但他们也引入了一个非常有趣的创新。GAN 不仅仅使用一个神经网络,而是使用两个,以一种相互竞争的方式工作。

第一个网络是“发电机”。对于给定的输入数据——在我们的例子中是我们的 Blob Ross 画作——它会产生一个预测图像——它认为鲍勃·罗斯会从该输入中得到什么。我叫它“机器人罗斯”。像其他神经网络一样,生成器开始随机做出选择,随着时间的推移,通过获得成功的反馈,学习做出更好的选择。但是它的不同之处在于它从哪里得到反馈。

第二个网络是一个“鉴别器”,它是发电机网络的反馈源。鉴别器被给予生成器的预测图像和真实的鲍勃·罗斯画作,并被要求猜测哪个图像是哪个。换句话说,它学会了区分由生成器生成的“假”鲍勃·罗斯画作和真品。

在鉴别器正确地检测到假货的情况下,这作为负反馈被提供给生成器,并且它调整它的过程,直到它能够更成功地欺骗鉴别器。通过以这种方式训练,生成器学会避免“卡其色污迹”问题。虽然它的第一次尝试非常模糊,但它很快就知道鉴别器可以很容易地检测到这一点。它变得更加狡猾,产生更清晰的图像,试图模仿真正的鲍勃·罗斯画作中的形状。结果是,经过足够长时间的训练后,生成器可以生成一幅有点令人信服的鲍勃·罗斯画作的复制品。

让我们看看实际情况是怎样的。

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

上面是一个输入图像(Blob Ross),它所基于的真实绘画(鲍勃·罗斯),以及生成器第一次尝试从该输入进行预测(Bot Ross)。在这个例子中,生成器从未见过真正的鲍勃·罗斯的画——它必须从它见过的其他画中进行归纳。不出所料,我们到处都是卡其色污迹。没有明确的细节,通过取每个区域的平均颜色,我们得到了一个模糊的中间地带。但是就像原来鲍勃·罗斯说的,通过练习,它可以做得更好!随着时间的推移,有了鉴别者的反馈,机器人罗斯学会了做得更好。

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

上面的图片是在训练过程中从这个模型的更高级版本中截取的。您可以看到生成器正在学习添加更多细节。树干得到了一些阴影,天空呈现出更多的纹理,松树开始形成它们特有的锯齿状边缘。但是我们也看到了其他一些有趣的发展。图像中有奇怪的线条和重复的斑点。这些是生成器的人工制品——它努力为大面积的空白空间创造细节,并倾向于重复相同的模式。

最终,经过数百轮训练后,生成器学会了避开这些赝像中最糟糕的部分,其结果即使人眼无法分辨,至少也变得可信得多。

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

它在绘画的某些区域比其他区域表现得更好。罗斯几乎在他的每一幅画中都用几笔娴熟的笔触描绘了标志性的松树,这些松树被精细地再现出来——斑点被赋予了锯齿状的松针边缘和锋利的尖端。因为松树出现在许多训练数据中,每次看起来都或多或少相同,所以 Bot Ross 能够很好地复制它们。这幅画的天空是令人愉悦的云彩和阳光的模糊——因为这里没有太多的细节,Bot Ross 已经知道他可以用任何他喜欢的模糊污迹填充天空,而鉴别者不会知道。

但是这个舒适的小木屋有点乱。这对机器人罗斯来说是一场完美的挑战风暴。在训练数据中,小木屋远不如山脉或松树常见。更糟糕的是,每幅画中的小屋看起来都非常不同。因此,机器人罗斯努力学习如何画它们。他提出了一个被雪覆盖的屋顶的建议,但大部分仍然只是一个斑点。

有意思的是,Bot Ross 把这个渲染成了雪景。他不是简单地平均训练画的颜色,而是根据构图——可能是光秃秃的树木等等——决定这应该是一个白雪皑皑的场景还是郁郁葱葱的场景,并给画适当地着色。看看其他例子,可以看出 Bot Ross 做出的一些有趣的选择。

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

你可以看到他有时很好,有时很坏。更多约定俗成的元素表现得相当好,但任何不寻常的东西都变成了模糊形状的混乱。

然而,对博特·罗斯来说,真正的挑战是看他如何与我的一件原创作品交易。这是我早期的画,“牙膏山”,旁边是它的“机器人罗斯”解释。

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

还不错!虽然没有完全达到原版鲍勃·罗斯的标准,但只要练习几个小时,肯定比我能做到的要好。现在没有必要让任何人浪费无数的时间在画架前埋头苦干,把刷子上的魔鬼打出来,或者寻找更多的酞青。有了这个机器人罗斯模型,任何人都可以立即像鲍勃·罗斯一样画画!

对我来说,Bot Ross 和 GANs 最有趣的一点是“假装”做某事和实际做那件事是一样的。我们的模型通过学习假装绘画来学习绘画,通过学习使自己的输出与真实的东西无法区分。这与图灵在 1950 年的论文《计算机械与智能》中提出的“模仿游戏”有明显的相似之处,这也是“图灵测试”概念的起源。简而言之,这个想法不是试图回答“机器能思考吗?”,这导致了毫无意义的哲学思考,我们应该解决一个更实际的问题:“一台机器能假装以一种足以说服人类观察者的方式思考吗?”换句话说,不要问“机器能思考吗?”,问“如果我分不清,又有什么关系?”

图灵写得比我在这里的篇幅更详细,说明了为什么这是一条富有成效的探究路线。但我认为机器人罗斯为这一论点提供了耐人寻味的支持。在图灵发表关于这个主题的论文半个多世纪后,我们继续了解学习和模仿之间复杂而密切的关系,以及假装做某事和实际上能够做某事之间微小的、可能不存在的差异。正如鲍勃·罗斯所描述的,博特·罗斯从未体验过绘画的快乐。它从未想象过自己行走在自己创造的微小景观中。但是看它的画,能看出区别吗?有关系吗?

感谢阅读!本系列上一篇文章,关于文本生成,可用 此处 。这个系列的结论将于下个月出版。

瓶颈:加速边缘智能的可学习特征压缩

原文:https://towardsdatascience.com/bottlenet-1d93b9393dd8?source=collection_archive---------38-----------------------

仅将 316 字节的数据上传到云中用于 ImageNet 分类

神经网络要么部署在本地设备上,要么部署在云服务器上。如果它非常大,那么唯一的选择就是云服务器。使用云服务的缺点是你需要上传一个比较大的输入的通信成本。将有价值的原始数据交给云所有者也会损害隐私。所以问题是为什么不卸载特性而不是原始输入呢?特征通常是稀疏的,我们可以在特征空间中实现更高的压缩比。BottleNet 是一篇介绍特征压缩方法的论文,该方法只需要将 316 字节的数据卸载到云服务器,以便在 ImageNet 数据集上进行推理。

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

BottleNet adds two extra units into an existing neural network. 1. A convolutional layer for reducing the channel/spatial dimensions 2. A lossy compressor (e.g. JPEG). Photo by author.

给定一个深度神经网络(DNN),我们插入一个减少空间和信道维度的卷积层。然后,我们将卷积的简化特征传递给 JPEG 压缩。这导致平均大小为 316 字节的数据需要上传到云中,以便进行其余的推理!比 JPEG 压缩的 224x224 图像少很多(平均 26667 字节)!在云上使用卷积层来恢复原始特征尺寸,然后进行 JPEG 解压缩。

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

Learnable dimension reduction and restoration units along the (a) channel and (b) spatial dimension of features. Photo by author.

但是如何训练一个中间有不可微层(JPEG)的神经网络呢?近似!因为一对压缩器和解压缩器可以用一个恒等函数来近似,所以我们简单地把它导数设为 1。

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

Embedding non-differentiable compression (e.g., JPEG) in DNN architecture. We approximate the pair of JPEG compressor and decompressor units by identity function to make the model differentiable in backpropagation. Photo by author.

因此,总之,我们在神经网络中添加了一组层(瓶颈单元),以减少将原始输入图像传输到云服务器的通信成本。如果我们有一个边缘设备,最好在初始层中插入瓶颈单元,以避免边缘设备的高计算成本:

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

Bottleneck Unit — all the reduction, compression, decompression, restorations units altogether. Photo by author.

如果我们简单地在中间特性上应用 JPEG 压缩,并将其卸载到云上用于下游层的其余计算,会发生什么?巨大的精度损失!但是如果在训练神经网络的同时意识到中间存在 JPEG 压缩单元,那么精度损失会变得更小。下图显示了这两种方法之间的精确度差距:

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

Accuracy loss will be much lower if the network is aware of the presence of JPEG compression on its features. RB1 in this figure refers to the first residual block of the ResNet-50 model. Photo by author.

在 https://arxiv.org/abs/1902.01000 找到更多关于 BottleNet 的信息。

这项工作已发表在 2019 年低功耗电子与设计国际研讨会(ISLPED)上。https://ieeexplore.ieee.org/document/8824955/

有界聚类

原文:https://towardsdatascience.com/bounded-clustering-7ac02128c893?source=collection_archive---------23-----------------------

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

一种适用于有限规模聚类的聚类算法

想象一个非常现实的场景,你所在城镇的几个家庭计划一起去旅行。

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

为了节省运输费用,他们想租几辆小型公共汽车。当然,越少越好。为了使交通安排高效和愉快,他们希望每个家庭都呆在同一辆小巴上,并根据地理位置将这些家庭分开,以避免多余的弯路。

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

Our input data of families, each pin indicates location and number of people who want to join the roadtrip.

用数学的方法来说,我们有n个家庭,每个家庭f的家庭成员数量是s(f),每辆小型货车的座位数量是mnk小巴中家庭的有效划分是指每辆小巴中家庭成员的总数不超过小巴的载客量。一个好的隔断是指每辆小型货车经过的距离最小。一个大的分区,是一个在最小化小客车数量和最小化每辆小客车行驶距离之间进行权衡的优化分区。

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

本帖包含伪代码。对于真正的代码你可以去 这里

听起来相当困难,是吗?

确实如此。一辆小型公共汽车的情况可以很容易地简化为背包,使得手头的问题在计算上是 NP 困难的(更准确地说,是 NP 完全的,但是谁在计算)。因此,很明显,如果我们想大规模解决这个问题,我们并不是在寻找一个精确的解决方案。

我们能做什么?

让我们把它分成两步:

  1. 给定一个常数k,找到一个k小型公共汽车家庭的(启发式)最佳划分。
  2. 找最好的k

步骤(1)将为我们构建好的分区,而步骤(2)将帮助我们找到一个好的分区。

步骤 I -有界 K-均值聚类

顾名思义,要为给定的k找到一个分区,我们将使用著名的 K-Means 聚类算法的一个变体,该算法受本文中的启发。

类似于 K-Means,我们将实现迭代算法,该算法在寻找每个聚类的质心(更新步骤)和将点分配到最近的质心(分配步骤)之间交替。在这个变体中,分配步骤也将确保集群保持它们的有界大小。

让我们更精确些,从头开始。经典的 K 均值算法大致是这样的:

1    centroids <- random *k* points
2    do *n_iter* times:
2.1     clusters <- each point assigned to closest centroid
2.2     centroids <- point closest to center in each cluster
3    return clusters

现在,考虑到有界簇的变化,我们将以如下方式修改步骤2.1,即分配步骤:

(2.1).1   points <- sort points by weight, in descending order
(2.1).2   for each point in points:
(2.1).2.1    centroids <- sort centroids by distance from point
(2.1).2.2    centroid <- first centroid in centroids for which total
                         weight + point's weight does not exceed *m*
(2.1).2.3    add point to cluster corresponding to centroid

你可以在这里看到代码。

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

Iterative process of updating clusters, starting from random guess of centroids.

K-Means 需要记住的另一件事是,这个过程容易不稳定,它可能终止的局部最小值高度依赖于第一次随机猜测。
因此,习惯上要重复执行几次算法,并选择最佳结果。根据 sklearn.cluster.KMeans默认是 10 次重复,我们也跟着做。

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

Example of 4 different repetitions of the algorithm, with 4 different random initial centroids. In bold is the best outcome. Circled are areas where clusters are not well separated, indicating the suboptimality of the outcome.

第二步-选择最佳 K 值的肘法

好了,现在我们知道了如何为固定数量的小巴k找到一个好的分区,那么我们如何才能找到“最好的”k

在最小化小公共汽车的数量和最小化每辆小公共汽车行驶的距离之间做出适当的权衡并不容易。

幸运的是,有些聪明人已经想了很多,常见的做法是用肘法,大致是这样的:

1   min_k <- sum(weights) / max cluster size
2   max_k <- min_k + number of sizes to try
3   for each k between min_k and max_k:
3.1    cost_k, clustrs_k <- Bounded K-Means Clustering
4   l <- line between (min_k, kcost_min_k) and (max_k, cost_max_k)
5   opt_k <- (k, cost_k) of maximal distance from l

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

Elbow Method: (i) perform K-Means Clustering for a range of different values of k, (ii) draw line between edge values, (iii) find value of k that its cost is furthest from the line.

让我们看看我们的家庭旅行数据是什么样的:

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

Partitioning our input data into the optimal number of clusters, k=8. In our input we had 45 families, with total 82 people, and minibuses of size 12.

复杂性分析

让我们分析我们的有界 K 均值聚类的一次迭代。记住我们表示:n家庭数量,m小型公共汽车最大尺寸,k小型公共汽车数量。

  • 在每个赋值步骤中,我们有:
    ➪按权重排序点:n*log(n)
    ➪对于每个点:排序质心k*log(k),添加到第一个有效质心k
    ➪总计O(n*log(n) + n*(k*log(k) + k)) = O(n*log(n)*k*log(k))
  • 在每个更新步骤中:
    每个聚类中的最大点数为n,或者当权重为整数时为m
    所以,对于每个集群我们需要:
    ➪计算集群的中心:n
    ➪找到离中心最近的点:n
    所以对于所有集群:O(k*n)
  • 因此,每次迭代都有O(n*log(n)*k*log(k))复杂度

如果我们在每次聚类运行中执行x迭代直到收敛,并且y以不同的随机初始状态运行,我们得到O(x*y*n*log(n)*k*log(k))

现在记住,我们要对不同数量的k进行此操作。让我们将K表示为我们想要尝试的最大值,将z表示为不同k的数量,然后我们得到总数O(x*y*z*n*log(n)*K*log(K))

肘方法在K中具有线性复杂度,这不会改变我们的最终结果😅。

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

收场白

我个人在这个问题上的经历是,我真的不得不在工作中解决类似的问题。我的第一反应是使用贪婪的局部搜索,我知道这在类似的几何问题中非常有效。

然而,我挑战自己走出自己的舒适区,并向一些同事和同行寻求建议。很高兴, Orian Sharoni 很快作出回应,向我推荐了两篇论文(有界 K 均值聚类+肘方法),这两篇论文总结了所有内容。比我想象的多花了几个小时,但是我设计的解决方案更优雅,而且很可能更接近最优(没有测试过,但是我的直觉告诉我)。

总之,作为一名算法开发人员,尤其是在快节奏的初创企业中工作的人,当我只想完成某件事时,使用 go-to-methods 会有所帮助。但是,偶尔,它甚至更有助于探索新的想法,学习新的方法,并扩大我的大脑“去算法”库。

希望你喜欢和我一起踏上这段旅程,也希望你今天拓展了你的心智图书馆🤓

向伯特鞠躬

原文:https://towardsdatascience.com/bow-to-bert-2695cdb19787?source=collection_archive---------36-----------------------

单词向量经过多年的发展,已经知道了“记录剧本”和“播放唱片”之间的区别。它们已经从一个每个单词都与其他每个单词正交的世界,发展到一个单词向量根据上下文变化的地方。给单词向量打上蝴蝶结是为分类等任务构建文档向量的常用方式。但是伯特不需要弓,因为从顶部[CLS]记号射出的向量已经为特定的分类目标准备好了…

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

自然语言处理(NLP)在过去十年中经历了一次复兴。人们对能够像人一样理解和处理语音/文本的嵌入、变形和语言模型感到非常兴奋。这种进步是不折不扣的。像总结文档、机器翻译、完成句子和对话这样的功能,现在正在尝试并取得了一些成功。事实上,这是一个从自然语言处理到 NLU(自然语言理解)的演变过程。伯特(来自变压器的双向编码器表示)模型归因于德夫林等人。艾尔。恰好是这个领域目前的领导者。

传统的自然语言处理毫不犹豫地让理解它正在处理的单词/文本。它甚至没有尝试。但这并不意味着它完全无用。事实上,在对通用文档进行分类时,一个热词向量用一个蝴蝶结(词袋)绑在一起,这些年来做得还不错。当然,理解单词的语义/上下文并相应地对文档进行分类会更好。这就是像 BERT 这样的新语言模型带来的东西——尽管有一些花费。

这篇文章的目的是看看单词向量从一个热点到上下文的演变。我们从没有朋友的单词开始,作为一个热点向量,它是一个正交单词空间的基础,其大小与词汇表的大小一样。我们转到单词嵌入,它结合了同现统计,使单词有一个固定的朋友圈。最后是考虑到上下文的 BERT 嵌入,从而根据情况让单词交新朋友或解除当前朋友的好友关系。友谊是用余弦相似度来衡量的。我们从不同的句子/上下文中提取相同和相似的单词,并查看它们对应的单词向量的余弦相似性是否与我们对这些单词在这些句子中的含义的理解相吻合。这基本上是这篇文章的主旨。

最后,这里的重点是单词嵌入的这些进步对我们意味着什么,我们如何应用它们并从中受益,而不是这些进步如何实现的技术细节。我们在这里浏览一些代码片段,但是完整的代码可以在 github 上重现结果。

在讨论单词向量之前,我们先简要回顾一下 BoW。在即将发布的帖子中,我们也需要它来从 one-hot 和 fastText 单词向量构建文档向量。在本系列的下一篇文章中,我们将针对几个分类任务,针对伯特[CLS]令牌向量来评估这样的文档向量。

1.一袋单词

在单词袋(BoW)方法中,文档向量是组成文档的单词的数字向量的加权和。权重可以简单地是该单词在该文档中的频率计数、一个 tf-idf 值或其他变化。

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

Equation 1: The BoW vector for a document is a weighted sum of word-vectors When w_i is one-hot then p = N. When w_i is obtained from fastText, Glove, BERT etc… p << N

弓形向量的一个明显缺点是文档中单词的顺序没有区别,如下图所示。

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

Figure 1. source

2.词向量

等式 1 中有字向量 w_i 的选项。传统的 NLP 从使用一个热点向量开始,而最近(从 2003 年开始)的参与者使用其他向量进行实验,以解决这些一个热点向量的缺点。

2.1 长而一热

在传统的 NLP 中,每个单词都是一个与其他单词正交的向量。单词向量长度 p 等于 N ,即单词空间的维数。第字的向量在第位置为 1,在其他位置为 0。因此得名一热矢量。简单来说,第字向量是第个维度的字空间中第个维度的基向量。

那么文档就是这个 n 维单词空间中的一个点/向量,坐标是{ W^j_i }。实际上,等式 1 中的 W^j_i 可以是 jth 文档中带字的的频数,也可以是类似 tf-idf 的变体。下图演示了 shred-bag-tag 操作,该操作将文档转换为单词空间中的向量。

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

Figure 2. In word space, a BoW vector for a document is a point. It is a weighted (the word count in this case) sum of the one-hot word vectors making up the document.

一键词向量的一些问题

  1. 太长:和正在处理的文本语料库中的词汇量一样长。这是一个计算上的缺点
  2. 无意义的记号:单词被当作只是没有意义的记号,与其他单词没有关系。您可以将语料库中的单词 good 替换为一些垃圾单词,如gobbeek和 BoW care——只要这个新单词gobbeek还没有出现在语料库中。事实上,您可以将语料库中的每一个 N- 单词替换为一些随机的不冲突的单词,BoW 将为您提供相同的文档向量。
  3. 没有上下文/位置感知:每个单词只有一个向量,并且每个单词向量都与所有其他向量正交。因此不存在上下文/位置相关单词向量或与其他单词的关系的问题。但在现实中,我们知道文字是复杂的存在。
  • 一个给定的词有不同程度的同义词和反义词。好/更好/最好 & 好/不好/更差例如
  • 句子中同一个词的位置相关意义。记录播放vs播放记录播放记录的含义随着位置的转换而变化
  • 多义——明亮的可以表示闪亮的,或者例如智能的
  • 谐音— run 可以是棒球中的名词 run ,也可以是动词 run

2.2 短、密、固定

对更好的单词数字向量的努力始于 2013 年的 word2vec ,随后是 GlovefastText 。我们在这里的例子中使用了 fastText 单词嵌入,但是结论同样适用于其他例子。所有这些单词嵌入都是基于分布假设得出的,该假设陈述:

语义相关的单词将具有与其他单词相似的共现模式

根据这一假设,如果两个词通常保持相同的公司(其他词),那么这两个词是语义相关的。这些算法利用维基百科等大量文本来计算每个单词与所有其他单词的共现模式。这样获得的单词的数字向量表示作为优化过程的一部分对此进行编码。这里获得的字向量在两个方面比一键向量有所改进。

2.2.1 词向量现在更短了

这里得到的单词向量的长度 pN 小很多很多。虽然 N (一个热词向量的长度)可以达到几十万,但是 p 更像是 50 或者 100 或者 300。这是一个巨大的计算优势。

2.2.2 单词现在有朋友了

在这个一热的世界里,所有的单词都是相互独立的——这不是一个有用的场景。单词好的坏的更好的都正交。在分布假设下获得的单词向量在某种程度上弥补了这一点。它们使单词能够相互联系,在某种程度上模仿对文本的理解。

假期休假论文这些词为例。单词假日休假与其他单词如旅行海滩等一起出现。它们拥有相似的单词组合——因此它们与其他单词有相似的共现模式。所以他们的词向量通过更加相似/平行来反映这一点。超过什么?比他们更相似/平行的是一个像一样的词。这也符合我们对这些词的自然理解。从 fastText 中读取 300 维( p = 300)单词向量,我们可以很容易地计算这些单词的余弦相似度。运行fast text _ word _ similarity . py

pipenv run python ./fasttext_word_similarity.py holiday vacation paper

显示出假期假期之间的相似性比预期的大得多。

Cosine Similarity: holiday & vacation : 0.7388389
Cosine Similarity: holiday & paper : 0.2716892
Cosine Similarity: vacation & paper : 0.27176374

从诸如文档分类的更大任务的角度来看,使所有的词向量都正交是没有帮助的。BoW 文档向量是从等式 1 中的单词向量构建的。当使用一个热门单词向量时,具有相似但不同单词的两个句子将表现出零余弦相似性。而是与快速文本单词向量的非零相似度。例如,与类似于“研究论文”的句子相比,句子“享受假期”将具有更类似于“享受你的假期”的弓形向量。运行fast text _ sentence _ similarity . py我们看到前两个句子的余弦相似度更大。

pipenv run python ./fasttext_sentence_similarity.py

# words not found in fasttext.. 0
Cosine Similarity: enjoy your holiday & have a fun vacation : 0.72311985
Cosine Similarity: enjoy your holiday & study the paper : 0.5743288
Cosine Similarity: have a fun vacation & study the paper : 0.51478416

2.2.3 但是仍然没有上下文意识

与单词的上下文和位置相关的问题没有通过分布假设来解决。这是我们在 2.1 节中列出的唯一热门词向量的最后一个缺点。即使一个单词已经有利地获得了与其他单词的一些关系,一个单词仍然由单个**相同的向量表示,无论它出现在文本中的什么地方。

例如,板球中的音高与音乐中的音高不同。与音乐中的 pitch 相比,板球中的 pitch 这个词与众不同。所以他们真的没有很多共同的朋友,所以应该有不同的表现。如果板球球场的训练语料来自体育部门,音乐球场的训练语料来自艺术部门,他们会的。但事实并非如此,考虑到上下文和词汇的多样性,这种方法也无法扩展。这里为一个单词获得的嵌入是它出现的所有上下文的平均值,因此失去了上下文…这导致了 BERT 所属的最新一批语言模型。

3.简短、密集且上下文敏感

诸如 ELMOGPT-2伯特的语言建模工具允许获得知道它们的位置和环境而变形的词向量。请参考杰·阿拉姆马的优秀系列文章、插图伯特、ELMO 等人的文章(NLP 如何破解迁移学习注释转换器等……了解这是如何实现的。我们直接跳到使用 BERT 来观察它生成的上下文,以及有意义的单词的位置感知向量。

预先训练好的 BERT 模型可以下载,它们有运行 BERT 的脚本,并从任何和所有层获取单词向量。我们在这里使用的基本情况 BERT 模型采用了 12 层(变换器块),并且产生具有 p = 768 的字向量。下面的脚本getbertwodvectors . sh读入一些句子,为每个句子中的每个单词生成单词嵌入,并且从 12 层中的每一层生成。

Script to obtain BERT embeddings

我们从第 11 层提取嵌入(为什么是第 11 层?你也可以试试其他的。 Bert As a Service 使用第 11 层:)用于我们的工作并计算余弦相似度。

Process BERT embeddings and compute cosine similarity

我们的目标是展示 BERT 单词向量是基于上下文变化的。以下面三句话为例。

  • 录制播放**
  • 播放 记录
  • 游戏

第二句话里的这个词应该和第三句话里的比较像,和第一句话里的比较不像。我们可以想出任何数量的像上面这样的三元组来测试 BERT 嵌入做得有多好。这里有一堆这样的三元组,结果显示伯特能够找出这个单词的上下文。

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

Figure 3. BERT embeddings are contextual. Each row show three sentences. The sentence in the middle expresses the same context as the sentence on its right, but different from the one on its left. All three sentences in the row have a word in common. The numbers show the computed cosine-similarity between the indicated word pairs. BERT embedding for the word in the middle is more similar to the same word on the right than the one on the left.

当分类是更大的目标时,不需要从 BERT 嵌入中构建 BoW 句子/文档向量。文档开头的[CLS]标记包含一个为特定分类目标而微调的表示。但是对于一个聚类任务,我们确实需要处理单个的 BERT 单词嵌入,并且可能在顶部使用 BoW 来产生我们可以使用的文档向量。我们将在以后的文章中讨论这些问题。

3.结论

我们跟踪了词向量从长/稀疏/一键到短/密集/动态的演变。这是一个从一个单词没有朋友的地方(one-hot,orthogonal),到有朋友圈的地方(例如 fastText),以及目前可以适应和找到朋友的地方(例如 BERT)的旅程。这些进步逐步提高了我们对文本建模的能力。

就这样,我们结束了这篇文章。在下一篇文章中,我们将继续评估这些词向量,以完成几个分类任务。

BPDR:一种新的降维技术

原文:https://towardsdatascience.com/bpdr-a-new-dimensionality-reduction-technique-f570eea3fc65?source=collection_archive---------14-----------------------

一种新的降维方法介绍。

介绍

LDA、PCA 或 t-SNE 等降维算法是分析未标记(或标记)数据并获得更多有关其结构和模式信息的强大工具。降维使我们能够可视化高维数据集,这对模型选择非常有帮助。我认为,机器学习的这一子集——称之为数据探索——与其对手(如监督学习或深度学习)相比,还远远不够发达。

我的观点: 如果有人开始一个新的机器学习项目,他们做的第一件事将是对数据进行探索性分析。不同的研究人员对这一步应该有多深入有他们自己的想法,然而,数据探索的结果是关于手边的数据集获得的知识。当研究人员遇到各种问题,如模型选择和超参数调整时,这些知识被证明是非常有价值的。

通过从根源开始,开发漂亮的数据探索算法,为用户提供关于数据集底层模式的质量信息,我们可以从整体上开发更好的机器学习管道。

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

Some binary numbers. (Photo Credit: Fotomay/Shutterstock)

BPDR 背后的想法是受我在大学里为一个班级写的图像压缩器的启发。这个想法就是位打包:将不同的数据点编码成一个长二进制字符串。

我将省略算法是如何构造的许多细节。对于那些对这个算法的“幕后”感兴趣的人来说,代码可以在我的 GitHub 这里查看。

该算法

该算法的概述如下:原始数据列(必须都是数字)首先按重要性排序。然后将数据归一化,以 0 为中心。接下来,构建了 N 个 128 位的字符串来表示我们试图减少到的 N 个组件。规范化数据按照其功能重要性的顺序被二进制打包成 128 位字符串。最后,我们剩下的是可以转换回整数的压缩二进制数。

对于将减少到 2 列的 4 列数据集,二进制打包如下所示:

binary string 1 -> 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0  (128-bits)
                  | most important  |2nd important col|
                   -----------------------------------binary string 2 -> 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0  (128-bits)
                  |3rd important col|4th important col|
                   ------------------------------------> repeat this packing for each row

再一次,这部分是作为算法如何工作的一般概述,然而,它不是很深入。

如何使用 BPDR

我构建了 BPDR 模块,以便它模仿 Scikit-Learn 包中其他维度算法的工作方式。下面是它在 iris 数据集上的一个使用示例。

首先, BPDR 仓库需要从 GitHub 中克隆出来。导航到 BPDR 目录后,运行pip install -r requirements.txt以获得运行算法的正确包。现在,我们终于准备好打开一个新文件,并开始探索数据。

首先,我们必须将所需的包导入到我们的模块中:显然,我们将使用 BPDR,以及所有流行的 iris 数据集和 matplotlib 进行一些可视化:

from bitpack import BPDR
from sklearn import datasets
import matplotlib.pyplot as plt

接下来,我们加载数据集:

iris = datasets.load_iris()
iris_data = iris.data
iris_targets = iris.target>>> iris_data[0]
[5.1 3.5 1.4 0.2]

我们看到有 4 列(都是数字)。让我们将这个数据集减少到 2 列,以便我们可以用图形显示减少的组件。我们首先需要创建一个 reduction 对象的实例,并初始化它的参数。

bpdr = BPDR(n_components=2)

接下来,通过调用 fit_transform 函数,传入的数据将被减少并返回到一个新数组中:

bpdr_data = bpdr.fit_transform(iris_data, iris_targets)>>> bpdr_data[0]
[7.686143364045647e+17, 4.0992764608243425e+18]

因为我们传入了标签,所以我们可以查看一些方差度量,这些度量评估缩减的数据对原始数据的解释程度:

>>> print(bpdr.variances)
[3.476833771196913e+36, 4.83034889579370e+36, 9.75667133492751e+36]>>> print(bpdr.scaled_variances)
[0.5774239158754918, 0.8022123454852088, 1.6203637386392993]>>> print(bpdr.mean_variance)
6.021284667306044e+36

有关如何计算这些差异的更多信息,请访问存储库的文档。

最后,我们现在有了一个 2 列宽的数据集,可以用图表显示出来。当组件 1 绘制在 X 轴上,组件 2 绘制在 Y 轴上时,图形如下所示:

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

Iris dataset after BPDR reduction

图中不同的颜色代表了花的不同标签。很明显,每个标记组都有不同的聚类。这种结构表明该算法很好地在较低的维度中表示了完整的数据。作为比较,我们看同样的图,但是使用主成分分析:

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

Iris dataset after PCA reduction

BPDR 归约实际上创建了一个比 PCA 更具线性可分性的数据集。这并不意味着 BPDR 算法对所有数据都是更好的算法,它只是意味着它值得研究,尤其是在执行线性回归类型的模型时。

本文的所有代码都可以在 GitHub 库的 Jupyter 笔记本中找到。

大脑:一个谜

原文:https://towardsdatascience.com/brain-a-mystery-5b1511e56f88?source=collection_archive---------34-----------------------

“我们能拥有的最美丽的经历是神秘的。”——阿尔伯特·爱因斯坦

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

介绍

人类拥有最密集的神经元(860 亿)。这赋予了我们所拥有的智慧,我们辨别抽象概念、做出跨领域决策和进行天马行空式思考的能力。如果你只是观察自己每天的行为,很有可能你会感到惊讶。最棒的是,当你试图对大脑实际上是如何工作的提出自己的假设,并审视这些预先存在的框架时,这不亚于欣赏一件宁静的艺术品。在这篇文章中,我将试图展示是什么让大脑如此强大,以及理解大脑的一些框架和方法,以及它是如何学习的。

是什么让大脑如此特别

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

Picture taken from https://commons.wikimedia.org/wiki/File:Neuron.jpg

  1. 根据神经元学说,神经元是大脑的基本结构和功能单位。
  2. 神经元通过细胞体将信息以电脉冲的形式从树突传递到轴突。这需要维持体内和体外之间的离子电势差,这占据了身体每日葡萄糖消耗的大约 20 %。
  3. 髓鞘通过缠绕轴突来辅助电脉冲尖峰的快速无损长距离通信。这是通过一种称为跳跃传导的机制发生的,在这种机制中,尖峰从 Ranvier(髓鞘间隙)的一个节点跳跃到另一个节点。这表明大脑是如何完美地包含了无损信号传输的概念。
  4. 两个神经元之间的连接被称为突触,它可以具有电和化学性质。电用于反射等功能的快速传输,化学用于学习和记忆。
  5. 激发神经元是一个能量密集型过程,因此所有神经元不会同时激发。这表明大脑中可能有一种惊人的能量优化调度算法。
  6. 神经网络中权重的概念可能是受赫比可塑性概念的启发,赫比可塑性通常被理解为一起放电的细胞
  7. 大脑有各种各样的重要组成部分,并且每一个都是相互联系的。对我来说最有趣的是丘脑,它就像一个基站,从我们的感觉器官接收输入信号,然后将其传递到大脑皮层,大脑皮层通常被称为这场表演的明星。
  8. 说到资源管理,大脑是很棒的。大脑执行的许多任务都是无意识完成的,因此我们可以进行多任务处理,如大规模并行计算。
  9. 有许多神经元的子网络,它们也构成了一个更大网络的一部分,并与更小的网络相连。
  10. 说到学习和记忆,大脑有不同的方式。
  • 短期或工作记忆是我们有意识的、动态的记忆。
  • 长期记忆或情景记忆是我们能够回忆起的过去的记忆。有趣的是,它是有偏见的,这在跟踪相关信息而不是所有信息时非常有用。
  • 操作性条件反射是一类学习,其中奖励或惩罚会影响学习过程。这可能启发了强化学习领域。
  • 我们记忆和学习的本质是语义的。它不仅仅是基于过去经验存储的纯粹信息,而且在形成概念的各种记忆片段之间也存在相互依赖。

惊人的想法和作品

虽然有许多伟大的作品旨在模拟大脑的活动,但这些是我最喜欢的。

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

人工神经网络

这些网络受到神经元生物网络的启发。每个节点代表一个神经元,权重表示来自该节点的信号有多重要。有一个激活函数作为信号通过的阈值,并且通过相对于真实标签反向传播损耗来进行学习。神经网络的许多伟大的变种有 CNN,RNN,甘,自动编码器等等。

神经图灵机

图灵机是一个杰出的数学模型,由艾伦·图灵发明,由程序、磁带和寄存器组成。本文由 DeepMind

神经图灵机

使用类似于图灵机的架构,但保持一切差异,以便学习可以通过梯度下降进行,但附加了一个附加的内存组件,可以使用注意机制进行交互。这是数字计算机设计和生物学结合的一个独特的交叉点。

持续学习

如果我们从某个发行版中学到一些概念,我们实际上可以在不同的发行版中使用这些概念。这就好像一个人学会了如何在特定的环境中用特定的菜肴吃饭,也可以在别的地方吃不同的菜肴。因此,任务保持不变,但分布发生了变化。在这种情况下,神经网络需要在整个数据集上再次训练。这是由 Friedemann Zenke 等人在本文中提出的

通过突触智能不断学习

如该文件所述

“在这项研究中,我们引入了智能突触,将这种生物复杂性引入人工神经网络。“每个突触都会随着时间的推移积累与任务相关的信息,并利用这些信息快速存储新的记忆,而不会忘记旧的记忆。”

迁移学习

原则是通过执行特定任务获得的知识被用来解决不同的问题,而这些问题在某种程度上是相似的。这在计算机视觉和自然语言处理中非常流行,其中使用预先训练的模型,然后进行微调以执行特定的任务,通常会产生很好的结果。谈到计算机视觉,有 ResNet、InceptionNet,对于 NLP,有 BERT、GPT-2 等等。

深度强化学习

AlphaGo、AlphaStar、MuZero 都是令人震惊的创新,它们使用不同味道的深度强化学习来展示特定任务中的超人智能,如玩星际争霸、围棋、象棋、雅达利游戏等,主要使用基于深度神经网络架构的奖励机制来优化奖励功能。强化学习的主要变体是基于模型的、基于价值学习的和基于策略梯度的。

使用统计不变量的学习

这是由 Vladmir Vapnik 等人在论文中提出的。

重新思考统计学习理论:使用统计不变量学习。

如该文件所述

‘在 LUSI 范式中,为了构造期望的分类函数,学习机计算特定于问题的统计不变量,然后以保持这些不变量的方式最小化期望误差;因此,这既是数据驱动的学习,也是不变量驱动的学习。

‘在这个新的范例中,首先选择(使用不变量)一个包含所需解决方案的容许函数子集,然后使用标准训练程序选择解决方案

‘LUSI 方法可用于提高所得解的精度,并减少必要的训练样本数量。’

蛋白质折叠分析和基因组编辑

虽然这并不直接模拟人脑或其任何活动,但旨在利用先进技术更深入地分析构成大脑的生物成分。像 AlphaFold 这样的最新创新可以预测体内特定蛋白质的结构,这可以帮助科学家了解它在体内的作用。由于蛋白质是每个细胞的重要组成部分,对它的深入了解可以解开许多关于大脑行为方式的秘密。

同样,基因组编辑也被科学家普遍用于研究细胞和理解它们的基本工作,最著名的技术是 CRISPR-Cas9。对基因序列的更深入了解可以回答许多关于我们的大脑如何世代进化的问题。

大脑器官样

这是一个在实验室环境中使用人体干细胞人工开发的迷你大脑。这对于理解大脑发展的不同阶段非常有用,并可能提供关于大脑的更深入的见解。

结论

作为人类,我们发展概念,从更少的数据中学习。这可能是由于嵌入我们基因中的进化信息。尽管如此,每次我遇到一个新想法时,模拟大脑活动的工作量都让我震惊。对我来说,理解大脑的动机不是人工智能,而是欣赏这样一个奇妙的创造。更令我惊讶的是,计算机科学、数学、生物学、心理学和其他领域是如何走到一起,用一种共同的语言进行交流,试图解释自然。

这个难题可能会有缺失的部分,也许将大脑建模为一个独立的单元可能不是一个好主意,因为大脑的功能在很大程度上取决于感觉器官如何感知环境以及各种内部器官作为一个整体系统如何立即行动。

然而,正如艾伦·图灵所说

“发明一台可以用来计算任何可计算序列的机器是可能的。”

也许我们已经有了那台机器。

基于金字塔场景分析的脑肿瘤分割

原文:https://towardsdatascience.com/brain-tumour-segmentation-using-pyramid-scene-parsing-pspnet-198168d22235?source=collection_archive---------17-----------------------

用数据做酷事!

简介

癌症是自古以来人类面临的最致命的疾病之一。全世界每年有近 30%的人口死于癌症。如果肿瘤在早期被发现,存活的机会会大大增加。深度学习(CNN)已经改变了计算机视觉,包括对医学图像的诊断。在这篇文章中,我们将利用 CNN 的力量从脑 MRI 图像中检测和分割肿瘤。

见下图中带有肿瘤的脑部 MRI 图像示例和分割结果。左图是绿色肿瘤的脑部核磁共振扫描。右图用红色显示了肿瘤的机器预测。这是惊人的准确!

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

Tumor prediction example

我们已经与初创公司合作,使用语义分割构建各种应用程序。请联系我们,了解更多信息。

语义分割

语义分割是将图像中的像素标记为一类。在上图中,我们将图像中的所有像素标记为肿瘤或背景类。已经公布了许多基于深度学习的高效语义分割方法,例如(按时间顺序) :

  1. FCN
  2. UNet
  3. SegNet
  4. 扩张的回旋
  5. 深度实验室(v1 和 v2)
  6. 精制网
  7. 金字塔场景解析网络
  8. DeepLab v3

对于这个博客,我们选择了 PSP-Net,因为它非常有效,并且比许多先进的方法如 U-net,FCN,DeepLab (v1,v2)和扩张卷积等都要好。

DeepLabV3 是另一个流行且强大的模型。我最近写了一篇关于如何使用 DeepLabV3 以 30 FPS 进行语义分割的博客

要了解以上列出的不同分段架构的更多信息,请参考这篇帖子

金字塔场景解析网

最新的场景解析框架大多基于全卷积网络(FCN)。基于深度卷积神经网络(CNN)的方法促进了动态对象理解,但仍然面临着考虑不同场景和无限制词汇的挑战。一个例子是船被误认为汽车。这些错误是由于对象的相似外观造成的。但是当查看关于场景被描述为河边的船屋之前的上下文的图像时,应该产生正确的预测。

准确的场景分类依赖于对全局场景类别的先验知识。金字塔池模块通过应用具有大内核的池层来帮助捕获这些信息。使用膨胀卷积(参考:膨胀卷积论文)对 Resnet 进行修改,并增加了一个金字塔池模块。该模块将来自 ResNet 的特征映射与并行池层的上采样输出连接起来,其中内核覆盖整个图像、图像的一半和一小部分。

下图描述了 PSPNet 架构。你可以在他们的论文这里中读到更多关于 PSPNet 的内容。

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

PSPNet Architecture

利用 PSPNet 建立脑图像分割模型

数据集

数据集是从 Kaggle 获得的。之所以选择这种方法,是因为标记的数据是二进制掩模图像的形式,易于处理并用于训练和测试。或者,这款来自 VGG 集团的基于网络的注释工具可以用来标记自定义数据集。

数据集遵循以下文件夹层次结构:

资料组

| _ images—png 格式的 RGB 图像

| _ masks 屏蔽 png 格式的 RGB 图像,其中区域填充有各自的标签值。

我们的标签是:1 代表肿瘤,0 代表其他

例如:

假设像素(10,10)属于肿瘤,它包含值 1。

培训框架

虽然存在许多令人惊叹的框架来使用 Keras 培训和评估语义分割模型,但以下 repo 因其易用性、支持的不同模型数量以及最新的文档而脱颖而出:

https://github.com/divamgupta/image-segmentation-keras

我们选择了“vgg_pspnet”,这是一个在预训练的 vgg 主干网上实现的 pspnet。

要遵循的步骤是:

  • https://github.com/divamgupta/image-segmentation-keras.git
  • 按照 repo 自述文件中的说明进行安装

一旦安装了回购,就可以开始培训了!

# Navigate to the **Semantic_segmentation/image-segmentation-keras** folder**import keras****from keras.models import model_from_json****import keras_segmentation as ks**# Initialise the pretrained model .# Note that the input height and width need not be same as image height and width since the network takes care of the input sizes.**model = ks.models.pspnet.vgg_pspnet( n_classes=2,****input_height=384,****input_width=384)**# Training**model.train(****train_images = “datasets/brain/images”,****train_annotations = “datasets/brain/masks”,****checkpoints_path = “ckpts/brain” , epochs=50 ,****auto_resume_checkpoint = True,****steps_per_epoch = 50****)**

通过训练好的模型运行推理

# Load Neural Network**model = ks.predict.model_from_checkpoint_path(‘ckpts/brain’)**# Predicted output will be a mask image similar to the mask images specified in the input**pred_mask = ks.predict.predict( model = model , inp = ‘image.png’ )**

下面是我们在数据集的一个小子集上获得的结果。虽然数据集很容易过拟合,但高精度的结果显示了这种方法的潜力。

图像顺序:原始图像(左)、预测遮罩(中)、覆盖遮罩边界(右)

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

结论

希望你喜欢这个博客,并尝试自己的代码。这个博客表明,我们可以使用预训练的模型在半天的工作中获得良好的分割结果!它真正展示了基于深度学习的计算机视觉的力量。

我们可以将该代码扩展到任何具有待分割特征的医学图像。例子包括不同种类的癌症肿瘤、微生物、骨折、洞等。

我有自己的深度学习咨询公司,喜欢研究有趣的问题。我已经帮助许多初创公司部署了基于人工智能的创新解决方案。在 http://deeplearninganalytics.org/的入住我们的酒店。如果你有一个我们可以合作的项目,那么请通过我的网站或者在info@deeplearninganalytics.org联系我

你也可以在https://medium.com/@priya.dwivedi看到我的其他作品

参考文献:

大脑 1:0 人工智能

原文:https://towardsdatascience.com/brains-1-0-ai-190091808760?source=collection_archive---------16-----------------------

为什么生物大脑仍然领先于任何已经建立的人工智能…或者未来许多年将要建立的人工智能。

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

Brains are still way ahead of any AI available today

当阿尔伯特·爱因斯坦说“深入观察自然,然后你会更好地理解一切”时,他脑海中没有人工智能(AI)。他提醒我们,每一种理论都需要与它应该解释的现实“保持联系”。人工智能也是如此,这是一项基于脑科学的数十年科学研究产生的技术,从基础神经科学到其计算神经科学表弟,经过数学,物理和计算机科学。

如果我们遵循爱因斯坦的建议,并像他建议的那样“研究自然”,我们将会被生物智能如何将当前(和可预见的未来)的人工智能甩在身后而震惊。

自然智能充满了计算杰作,使学习和适应不断变化的世界变得如此流畅和无缝,以至于对机器的所有者,我们人类来说,它实际上是不可见的。

据说*“科技在看不见的时候处于最佳状态”*。

只有揭开这个难以看到的生物技术及其奇迹的面纱,我们才能真正与人工智能进行有意义的比较,并真正认识到它的局限性。

我们大脑中不断发生而我们却没有意识到的事情是什么?

让我们更仔细地看看我们的大脑每天都在发生什么。

自然智能的“计算核心”是神经元,在典型的大脑中,人类平均拥有大约 100 个神经元。

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

Humans have around 500 trillion learning synapses

神经元通过尖峰信号(低压电流的小脉冲)相互通信,其中神经元尖峰信号可以参与表示图像特征的存在(例如,苹果中的“红色”)。当神经元倾向于被一起激活时,它们之间的连接,称为突触,倾向于得到加强。这就是为什么“红色”往往与“苹果”联系在一起:它们的重复出现导致编码这些特征和物体的神经元之间的突触联系在一起——这是一种解释我们倾向于统计的大脑如何工作的机械基底:它帮助我们在我们原本混乱的世界中找到规律性。

这些“连线”——或学习——事件从形成的那一刻起,就一直在我们的大脑中发生。让我们估计一下这些个体学习事件在人的一生中会发生多少次。

假设一个典型的人平均有 1000 亿个神经元,500 万亿个突触,平均 20 亿秒的寿命,并假设大脑中的每个神经元每秒发出一个尖峰信号(这是一个较低的估计…我们的神经元比这更活跃!),它使大脑中能够改变突触(阅读:引起学习)的棘波总数达到惊人的 700 亿次!

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

There are as many learning episodes in a typical brain life as there are stars in the universe

也就是说,我们大脑中一个学习片段的次数至少等于,或者多于 1 后面跟着 24 个 0……巧合的是这也是宇宙中恒星的估计数量。

这意味着当你读完这篇文章时,你的大脑已经学习了数千次。

为什么?如果不是这样,请想一想!以技能学习为例,技能学习被定义为通过训练获得和提高感知、认知或运动能力的能力。技能学习是所有动物生存的一种基本能力,这一事实证明了人类可以通过实践来提高迄今为止认知和行为心理学测试的几乎每一项任务。

虽然学习发生的时间尺度在几分钟到更长的时间尺度之间变化,但是上面概述的基本神经和突触机制是潜在学习机制的基础。我们的神经元不停地激活和重组我们大脑中的突触。

让我们举一个平凡的例子:学习个体的视觉身份。一个人可能会错误地认为,你所需要做的就是看和学习一张脸的图片,你就完成了。但是,不出所料,人会随着时间而改变(见图)。

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

Face are not only learned once….

在这个例子中,如果你遇到了 30 出头的唐纳德·特朗普,而不是在他担任美国总统的日子里,你可能会有片刻的停顿和不和谐,但你的大脑会迅速适应并“封装”这个新的、进化的唐纳德·特朗普形象,以你个人的名义描绘美国总统。

这个不断调整一个人的表象的例子——这些表象是感性的,但也是运动的和认知的——在我们的大脑和生活中是规律而不是例外。我们的家、工作场所、我们交往的人、我们需要使用和更新的技能,都在随着时间而变化:没有什么是真正稳定的。

虽然生物进化已经想出了如何设计我们的自然智能来应对现实,但今天的人工智能肯定没有。

设计可以展示这种“持续”(或终身,或持续)学习的人工智能是一个未解决的问题,其中人工智能可以在预定数据集的情况下被训练以实现高水平的性能,但不能在人类居住的典型世界中持续学习。在我们的世界中,来到我们面前的数据并不是整齐地准备在数据集中,而是出乎意料地、毫无预警地来到我们面前。没有人告诉我们‘听着,鲍勃,我将向你展示 300 幅西红柿的图片,学会它’。西红柿会毫无预兆地来来去去……我们需要把它们都学会!

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

No AI will be successful without lifelong (continual) learning

最终,需要在具有挑战性的部署场景中与人类共存的机器以及更多通用人工智能系统,将需要展现出与人类相同的惊人学习能力。

目前,传统设计的人工智能无法做到这一点,这不仅限制了机器与人类一起工作的能力,还限制了机器挑战人类智能最高台阶的能力。

基于统计分析的脸书品牌营销

原文:https://towardsdatascience.com/brand-marketing-on-facebook-using-statistical-analysis-7ec4210999b0?source=collection_archive---------19-----------------------

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

Photo by Carlos Muza on Unsplash

推广品牌和从数据中获取洞察力的技巧和诀窍

假设有一天你想开一家公司。在这个时代,最重要的事情之一就是你公司的影响力。如果公司是基于人们日常生活中使用的某些产品而成立的,那么很可能你在市场上已经有很多竞争对手了。现在,重要的是战胜激烈的竞争。所以,现在人们可以接触到你的公司的地方不仅仅是广告牌。这是一个社交媒体,人们一天要浏览三次他们的新闻。平均而言,一个美国人每年在社交媒体上花费 705 个小时。失败的几率微乎其微,即使你真的失败了,你也没什么可失去的。

所以,让我们假设你的公司正式参与社交媒体上的品牌营销。你已经建立了一个脸书或 Instagram 页面,因为要营销的品牌是一个化妆品品牌(不是化妆品的大粉丝,但使用的数据集是化妆品品牌的)。您回复客户问题,关注粉丝,发布重要新闻,并感谢您的支持者的支持。除此之外,你是否采取了足够的行动来监控和分析你的工作结果?如果你从事社交媒体,那么你当然应该衡量这些活动。有没有更好的了解方式?说起来容易做起来难,听起来很讽刺,是吧?

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

Source:https://infigosoftware.in/facebook-as-a-marketing-platform/

社交媒体指标是让你深入了解你的社交媒体营销表现的数据和统计。下面的博客解释了其中的一些指标。

为了满足本博客的目的,我们将指标分为四个不同的类别:

  • 知名度:这些指标阐明了你当前和潜在的受众。
  • 参与度:这些指标显示了受众如何与你的内容互动。
  • 转化:这些指标展示了你社交参与的有效性。
  • 消费者:这些指标反映了活跃客户对你的品牌的想法和感受。

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

Source: https://www.slideshare.net/SidharthGuleria/boost-your-business-using-facebook-instagram

我将概括地介绍所有类别,而不会深入每个类别的具体细节。因此,为了更好地理解整个事情,以下是你需要知道的一些指标:

到达:帖子到达的不同人群或用户总数。

浏览量:一个帖子被用户看到的次数。一个帖子可以被 n 个人看到 m 次。因此,总浏览量变成了 m*n。一篇文章在你的新闻订阅源中显示的次数,不考虑这篇文章被点击的次数。人们可能会看到同一帖子的多个印象。例如,某人可能会在新闻订阅源中看到一次页面更新,如果他的朋友分享了它,就会看到第二次。

**页面点赞总数:**点赞显示你在脸书的受众规模。随着时间的推移,这个数字应该会增加。如果你几个月来一直有相同数量的喜欢,这意味着两种情况之一:
1)你失去的喜欢和你得到的一样多。新朋友没有关注你

参与度:表示用户在帖子上执行一个动作的次数。敬业度是你可以追踪的最重要的脸书指标之一。主观上,参与是人们确实喜欢你分享的内容的标志。但参与度如此重要的另一个原因是,它可能会让你的帖子更多地暴露给你的受众。这包括喜欢、评论、分享以及观看过你的视频或点击过你的链接和照片的人。它还包括点击评论者姓名、喜欢某条评论、点击你的页面名称,甚至通过举报你的帖子给出负面反馈的人。

消耗:这一指标类似于参与度,但消耗并不一定会产生故事 消费=链接点击量+照片浏览量+视频播放量+其他点击量(其中一些确实会产生故事)

**总交互:**正如我们所知,主要动机是增加查看帖子的人数,并增加与帖子的交互(如,评论,分享)次数,以便创建一个故事,它会自动出现在查看者的朋友的新闻提要中。总互动量是根据终身后参与用户(故事已创建)和终身后消费者(故事未创建)执行的操作计算的。请注意这些指标,稍后会用到它们。
总互动=喜欢+评论+分享

帖子类型:脸书上有四种类型的帖子:视频、照片、状态、链接。人类的普遍倾向是看图像,阅读和分享它们。状态通常较长,人们不愿意阅读。因此,人们自然倾向于观看视频、图片和状态,并对其做出反应。

去年(2018 年),脸书承认在其算法中优先考虑视频,特别强调直播视频。如果你能创建视频内容,你就有更好的机会获得新闻源。所以,你会看到后来的可视化有点偏向视频帖子。

付费点赞:通过脸书的广告活动,有多少人喜欢你的页面。

脸书页面分析提供了与这些指标相关的数据和统计信息。所以,我所做的是我有一个名为 Morto 等人的数据集,它给出了脸书特定化妆品匿名品牌的广告指标。数据集总共有 500 条记录,其中有 19 列定义了这样的指标值。现在,回到这个博客的下一部分,开始 R 编程。

R 是一种统计编程语言。R 拥有大量的统计和图表方法。它包括机器学习算法,线性回归,时间序列,统计推断。R 中有各种各样的包,可以轻松地完成数据科学领域的任务。关于 R 理论上的详细信息,请访问https://en . Wikipedia . org/wiki/R _(programming _ languagehttps://www.tutorialspoint.com/r/index.htm获得 R 编程语言语法的帮助。
我在项目中绘制了各种数据可视化,这将有助于任何外行做出决定,即什么实际上有助于将广告拉近最终用户。
:以下观察和数据分析是凭直觉完成的,然后做了一些修改以从中获得最佳结果。

  1. 首先,页面总点赞数取决于以下脸书邮报指标 :
    总浏览量
    总浏览量
    帖子类型(照片、状态、视频、链接)
    工作日
    一天中的某个小时

在多元回归分析的帮助下,我们获得了所有上述指标的系数,这将帮助我们确定每个指标的重要性,这有助于增加我们的页面喜欢。

**为什么要多元回归?**多元回归是线性回归在两个以上变量之间关系的延伸。在简单线性关系中,我们有一个预测变量和一个响应变量,但在多元回归中,我们有不止一个预测变量和一个响应变量。

我们使用 r 中的 lm() 函数创建回归模型。该模型使用输入数据确定系数的值。接下来,我们可以使用这些系数预测一组给定预测变量的响应变量的值。

data<-read.csv("Morto_Et_Al.csv")input<-read.csv(file = "facebook.csv", sep = ",")[ ,c('PTL','LPTReach','LPTImpressions','Type','Weekday','Hour')]model<-lm(PTL~LPTReach+LPTImpressions+Type+Weekday+Hour,data=input)a <- coef(model)[1]
XLPTReach <- coef(model)[2]
XLPTImpressions <- coef(model)[3]
XTypePhoto <- coef(model)[4]
XTypeStatus <- coef(model)[5]
XTypeVideo <- coef(model)[6]
XWeekday <- coef(model)[7]
Xhour <- coef(model)[8]

2。
预测分析:这里,使用通过多元回归分析获得的系数来生成一个方程,其中,将变量的值代入该方程,根据帖子的类型来预测喜欢的数量。

x1 <- readline("What is the total reach?")
x1 <- as.numeric(x1)
x2 <- readline("What is the value for total impressions?")
x2 <- as.numeric(x2)
x6 <- readline("What is weekday?")
x6 <- as.numeric(x6)
x7 <- readline("Which is the hour of the day?")
x7 <- as.numeric(x7)x<-c("Photo","Status","Video")
type<-readline("What is the type of post?")if("Photo" %in% type) {
Y = a + XLPTReach*x1+XLPTImpressions*x2+XTypePhoto*2.5+XWeekday*x6+Xhour*x7Z = a + XLPTReach*x1+XLPTImpressions*x2+XTypePhoto*3+XWeekday*x6+Xhour*x7} 
else if ("Status" %in% x) {
Y = a + XLPTReach*x1+XLPTImpressions*x2+XTypeStatus*1.4+XWeekday*x6+Xhour*x7
Z = a + XLPTReach*x1+XLPTImpressions*x2+XTypeStatus*2+XWeekday*x6+Xhour*x7} 
else if ("Video" %in% x) {
Y = a + XLPTReach*x1+XLPTImpressions*x2+XTypeVideo*4+XWeekday*x6+Xhour*x7
Z = a + XLPTReach*x1+XLPTImpressions*x2+XTypeVideo*5+XWeekday*x6+Xhour*x7
}

3.后工作日 v/s 总到达量,后工作日 v/s 总展示量:
这里,我绘制了一个线形图来显示后工作日如何影响总到达量和展示量的关系。结果显示,在工作日 3 发布的帖子在 reach 上给出了最好的结果,并且同一帖子在第二天有最大的展示次数。有道理,不是吗?

day1<- subset(data,Weekday==1)
mean1R <- mean(day1$LPTReach)
mean1I <- mean(day1$LPTImpressions)day2<- subset(data,Weekday==2)
mean2R <- mean(day2$LPTReach)
mean2I <- mean(day2$LPTImpressions)day3<- subset(data,Weekday==3)
mean3R <- mean(day3$LPTReach)
mean3I <- mean(day3$LPTImpressions)day4<- subset(data,Weekday==4)
mean4R <- mean(day4$LPTReach)
mean4I <- mean(day4$LPTImpressions)day5<- subset(data,Weekday==5)
mean5R <- mean(day5$LPTReach)
mean5I <- mean(day5$LPTImpressions)day6<- subset(data,Weekday==6)
mean6R <- mean(day6$LPTReach)
mean6I <- mean(day6$LPTImpressions)day7<- subset(data,Weekday==7)
mean7R <- mean(day7$LPTReach)
mean7I <- mean(day7$LPTImpressions)v<-c(mean1R,mean2R,mean3R,mean4R,mean5R,mean6R,mean7R)
t<-c(mean1I,mean2I,mean3I,mean4I,mean5I,mean6I,mean7I)png(file = “Weekday_TotalReach.png”)
plot(v,type = “o”,col = “red”, xlab = “Weekday”, ylab = “Total Reach”,
main = “Chart for analysis of total reach”)
dev.off()png(file = “Weekday_TotalImpressions.png”)
plot(t,type = “o”,col = “blue”, xlab = “Weekday”, ylab = “Total Impressions”,
main = “Chart for analysis of total impressions”)
dev.off()

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

4。帖子类型总浏览量,帖子类型总浏览量
这里用一个条形图来表示帖子类型和浏览量、浏览量之间的关系。它有助于比较每种文章类型的影响。结果显示,“视频”比其他类型的帖子更能提升你的品牌。

photodf <- subset(data,Type=="Photo")
meanPR <- mean(photodf$LPTReach)
meanPI <- mean(photodf$LPTImpressions)
#meanPLikesP <- mean(photodf$PTL)statusdf <- subset(data,Type=="Status")
meanSR <- mean(statusdf$LPTReach)
meanSI <- mean(statusdf$LPTImpressions)
#meanPLikesS <- mean(statusdf$PTL)videodf <- subset(data,Type=="Video")
meanVR <- mean(videodf$LPTReach)
meanVI <- mean(videodf$LPTImpressions)
#meanPLikesV <- mean(videodf$PTL)linkdf <- subset(data,Type=="Link")
meanLR <- mean(linkdf$LPTReach)
meanLI <- mean(linkdf$LPTImpressions)
#meanPLikesL <- mean(linkdf$PTL)ValueR <- c(meanPR,meanSR,meanVR,meanLR)
ValueI <- c(meanPI,meanSI,meanVI,meanLI)Post <- c("Photo","Status","Video","Link")png(file = "barchart_reach&postType.png")
barplot(ValueR,names.arg = Post,xlab = "Post Type",ylab = "Total Reach",col = "blue", main = "Total Reach v/s Post Type",border = "red")
dev.off()png(file = "barchart_Impressions&postType.png")
barplot(ValueI,names.arg = Post,xlab = "Post Type",ylab = "Total Impressions",col = "red", main = "Total Impressions v/s Post Type",border = "blue")
dev.off()

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

5。总交互 v/s 总到达次数,总交互 v/s 总印象数
使用线性回归,绘制一个图表,显示总交互对总到达次数、印象数的依赖性,这反过来实际上会允许许多观众访问页面。

ReachInt<-data$LPTReach
ImpressionInt<-data$LPTImpressions
LikesInt<-data$PTL
TotalInt<-data$Total.Interactionsrelation <- lm(TotalInt~ReachInt)
png(file = "linearregression(ReachvsInteractions.png")
plot(ReachInt,TotalInt,col = "blue",main = "Reach v/s Interactions",cex = 1.3,pch = 16,ylab = "Total Interactions",xlab = "Total Reach")
dev.off()relation <- lm(TotalInt~ImpressionInt)
png(file = "linearregression(ImpressionsvsInteractions.png")
plot(ImpressionInt,TotalInt,col = "red",main = "Impressions v/s Interactions",cex = 1.3,pch = 16,ylab = "Total Interactions",xlab = "Total Impressions")
dev.off()relation <- lm(LikesInt~TotalInt)
png(file = "linearregression(LikesvsInteractions.png")
plot(TotalInt,LikesInt,col = "violet",main = "Likes v/s Interactions",cex = 1.3,pch = 16,xlab = "Total Interactions",ylab = "Total Page Likes")
dev.off()

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

6。付费帖子总影响力:
当你付钱给脸书来提升一个帖子时,该帖子的总影响力会增加。因此,为了确定一个帖子是否有报酬,我们使用了一个决策树,该决策树显示如果总数达到> 10470,则该帖子是一个有报酬的帖子。因此,根据目前的数据集,如果你必须让帖子达到大约 1 万人,你需要为此付费,脸书最终会推广它。

data1<-read.csv(“facebook.csv”)
library(party)
png(file = “Paid(FullData).png”)
output.tree <- ctree(Paid[1:100] ~ ReachInt[1:100] +                          ReachInt[1:100],data = data1)
plot(output.tree)
dev.off()

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

7.有多少参与帖子的用户已经喜欢上了该页面?我绘制了饼图来显示分布情况。结果显示,70%参与帖子的人是已经喜欢该页面的人。现在,这个统计有助于在他们的朋友中传播帖子,也激发他们喜欢帖子或者页面。

LPEuser1<-data$LPEuser
LEngaged1<-data$LEngaged
divi.result <- (LPEuser1/LEngaged1)*100
LPEuser1mean<-mean(divi.result)
LEngaged1mean=100-LPEuser1mean
x<-c(LPEuser1mean,LEngaged1mean)
piepercent<- round(100*x/sum(x), 1)png(file = “Engaged_users.png”)
pie(x,labels=piepercent, main = “Engaged users %”, col = rainbow(length(x)))
legend(“topright”, c(“Users already liked the page”,”Others”), cex = 0.8,fill = rainbow(length(x)))
dev.off()

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

8。参与用户,消费占印象的比例:
到目前为止,我们一直专注于直接影响页面总点赞的参数。现在,间接影响总页面喜好的因素,即参与用户、消费者、消费被考虑在内。这里,统计数据被绘制在一个饼状图上,这有助于确定每种类型帖子的消费者百分比、总覆盖范围中的参与用户百分比以及总印象中的消费百分比和参与用户百分比。

这有助于显示特定的帖子类型是否适合增加互动次数和推广帖子。

LPConsumptions<-photodf$LPConsumptions
LPTimpressions<-photodf$LPTImpressions
LEngaged2<-photodf$LEngaged
divi.result<-(LPConsumptions/LPTimpressions)*100
divi.result2<-(LEngaged2/LPTimpressions)*100
LEngaged2mean<-mean(divi.result)
LPConsumptionsmean<-mean(divi.result2)
others<-100-(LEngaged2mean + LPConsumptionsmean)
x<-c(LEngaged2mean,LPConsumptionsmean,others)
piepercent<- round(100*x/sum(x), 1)
png(file = "Impressions_Engaged_Consumptions(photo).png")
pie(x,labels=piepercent, main = "Engaged Users,Consumptions from total impressions(photo)%", col = rainbow(length(x)))
legend("topright", c("Engaged users%","Lifetime Post Consumptions%","Others%"), cex = 0.8,fill = rainbow(length(x)))
dev.off()LPConsumptions<-statusdf$LPConsumptions
LPTimpressions<-statusdf$LPTImpressions
LEngaged2<-statusdf$LEngaged
divi.result<-(LPConsumptions/LPTimpressions)*100
divi.result2<-(LEngaged2/LPTimpressions)*100
LEngaged2mean<-mean(divi.result)
LPConsumptionsmean<-mean(divi.result2)
others<-100-(LEngaged2mean + LPConsumptionsmean)
x<-c(LEngaged2mean,LPConsumptionsmean,others)
piepercent<- round(100*x/sum(x), 1)
png(file = "Impressions_Engaged_Consumptions(status).png")
pie(x,labels=piepercent, main = "Engaged Users,Consumptions from total impressions(status)%", col = rainbow(length(x)))
legend("topright", c("Engaged users%","Lifetime Post Consumptions%","Others%"), cex = 0.8,fill = rainbow(length(x)))
dev.off()LPConsumptions<-videodf$LPConsumptions
LPTimpressions<-videodf$LPTImpressions
LEngaged2<-videodf$LEngaged
divi.result<-(LPConsumptions/LPTimpressions)*100
divi.result2<-(LEngaged2/LPTimpressions)*100
LEngaged2mean<-mean(divi.result)
LPConsumptionsmean<-mean(divi.result2)
others<-100-(LEngaged2mean + LPConsumptionsmean)
x<-c(LEngaged2mean,LPConsumptionsmean,others)
piepercent<- round(100*x/sum(x), 1)
png(file = "Impressions_Engaged_Consumptions(video).png")
pie(x,labels=piepercent, main = "Engaged Users,Consumptions from total impressions(video)%", col = rainbow(length(x)))
legend("topright", c("Engaged users%","Lifetime Post Consumptions%","Others%"), cex = 0.8,fill = rainbow(length(x)))
dev.off()LPConsumptions<-linkdf$LPConsumptions
LPTimpressions<-linkdf$LPTImpressions
LEngaged2<-linkdf$LEngaged
divi.result<-(LPConsumptions/LPTimpressions)*100
divi.result2<-(LEngaged2/LPTimpressions)*100
LEngaged2mean<-mean(divi.result)
LPConsumptionsmean<-mean(divi.result2)
others<-100-(LEngaged2mean + LPConsumptionsmean)
x<-c(LEngaged2mean,LPConsumptionsmean,others)
piepercent<- round(100*x/sum(x), 1)png(file = "Impressions_Engaged_Consumptions(link).png")
pie(x,labels=piepercent, main = "Engaged Users,Consumptions from total impressions(link)%", col = rainbow(length(x)))
legend("topright", c("Engaged users%","Lifetime Post Consumptions%","Others%"), cex = 0.8,fill = rainbow(length(x)))
dev.off()

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

因此,以上是作为一名业余爱好者在 R 中完成的统计数据分析,以获得对真实世界数据集的实际操作经验。所以,下次你开始营销你的品牌时,在脸书上做,看着它像野火一样蔓延。此外,一定要检查这些指标,它们会帮助你评定你的营销技巧😊

巴西重金属:使用 NLP 和 LDA 的探索性数据分析

原文:https://towardsdatascience.com/brazilian-heavy-metal-an-exploratory-data-analysis-using-nlp-and-lda-f92324d0381e?source=collection_archive---------21-----------------------

对巴西两大重金属乐队歌词的分析:Angra 和塞普尔图拉

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

Let’s see how to get there

动机

在我的大部分时间里,我习惯于试验一些 NLP 技术,我注意到即使有过多的可用资源,也很难找到一些与数据分析相关的 NLP 技术内容,与文本挖掘等数据的一般知识相关。

在 Github 中有很多脚本、应用博客文章、带代码的存储库是非常酷的,但至少对我来说,分析是这项技术最出彩的地方,因为任何人都可以编写脚本,但只有少数人可以提取数据知识。

这里的想法是得到我喜欢的两个乐队的歌词,检查他们的文学特征,并试图找到他们之间的一些联系或区别。

对于关于 NLP、LDA 等非常深入和技术性的帖子,请随意直接跳到这篇帖子的末尾,并选择许多关于这些主题的非常好的参考资料。

这就是这篇文章的内容,它深深地启发了机器学习加的伟大工作。

为什么是 Angra 和坟墓?

重金属是世界上最无国界的音乐风格之一,我想用 Python、LDA、NLP 和一些想象力以简单的方式展示我的国家最具标志性的两个乐队及其文学特征(你会在主题的“解读”中看到。

关于乐队

坟墓

Sepultura 是一支来自贝洛奥里藏特的巴西重金属乐队。该乐队于 1984 年由兄弟马克斯和伊戈尔·卡瓦拉组建,是 20 世纪 80 年代末和 90 年代初凹槽金属、鞭挞金属和死亡金属流派的主要力量。Sepultura 也被认为是 20 世纪 80 年代末和 90 年代初至中期的第二波重金属乐队之一。

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

Source: Jamie Martinez

官方网站Spotify 中的坟墓

Angra

Angra 是一支成立于 1991 年的巴西重金属乐队,自成立以来经历了一些阵容变化。在 Rafael Bittencourt 的带领下,这支乐队在日本和欧洲获得了一定程度的知名度。

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

Source: sztachetki

Angra 官方网站——Spotify 中的 Angra

问题

我一直对这些乐队有一些私人问题,我将尝试用这个笔记本来回答:

  • 1)Angra 和《坟墓》的文学特征是什么?
  • 2)他们谈论的是哪种类型的主题?
  • 3)谁的话题更具多样性?

一些限制

应用技术

自然语言处理

自然语言处理(NLP) 是计算机科学、信息工程和人工智能的一个子领域,涉及计算机和人类(自然)语言之间的交互,特别是如何对计算机进行编程以处理和分析大量自然语言数据。

主题建模

在机器学习和自然语言处理中,主题模型是一种统计模型,用于发现文档集合中出现的抽象“主题”。主题建模是一种常用的文本挖掘工具,用于发现文本中隐藏的语义结构。主题模型也被称为概率主题模型,它指的是用于发现大量文本主体的潜在语义结构的统计算法。

潜在狄利克雷分配

在自然语言处理中,潜在狄利克雷分配 (LDA)是一种生成统计模型,它允许通过未观察到的组来解释观察集,从而解释为什么数据的某些部分是相似的。例如,如果观察是收集到文档中的单词,那么它假设每个文档是少量主题的混合物,并且每个单词的出现都归因于文档的一个主题。LDA 是主题模型的一个例子。

代码和数据

所有代码、数据集和图像都存储在 这个 Github repo 中。

数据提取和加载

为了提取歌词,我使用了[PyLyrics](https://github.com/geekpradd/PyLyrics)库和脚本。重要提示:自去年以来,本库没有任何更新/错误修复。下面我们可以导入一些库,并开始对我们的数据进行小的预处理。

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

包装器获取了 325 首歌曲,包括艺术家、歌词和专辑。

一个主要的挑战是,这些乐队通常用多种语言(英语和葡萄牙语)创作歌曲。为了简单起见,我们将只关注英语。

为了过滤 PT-BR 歌曲,我将使用使用 Google API 检查语言的textblob库。主要的警告是,如果你重新运行很多次,你可能会收到代码HTTP Error 429: Too Many Requests

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

这里我们可以看到,在 325 首歌词中,38%来自 Angra,62%来自坟墓。Angra 有 96% (119) 的歌词在 EN 中,而 Sepultura 有 96% (194) 的歌词在 EN 中。

来自 Angra 的 PT-BR 中最出色的歌曲是CAA e caador专辑《猎人与祈祷》中的一首歌。在阴影之殿专辑中的歌曲迟到的救赎是 EN/PT-BR 中的一首好歌。

Sepultura 在 PT-BR 中有一些歌曲,如《野蛮的毁灭》中的 Filhos do Mundo ,and 中的 Prenuncio 和《遗骸》专辑中的 A Hora E A Vez Do Cabelo Nascer ,这是 Mutantes 的一首翻唱歌曲。PT-BR 中最引人注目的Policia 宋。

删除了所有 PT-BR 歌词后,让我们快速检查一下这些乐队的所有专辑。

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

乍一看,考虑到我们的数据框架,我们可以看到这两个乐队之间的第一个区别,Sepultura 有一个更大的唱片集和更多的歌曲。

这可以用这样一个事实来解释,即使两个乐队在更换他们的主要歌手时都面临着中断(Angra 的安德烈·马托斯edu·法拉斯基和塞普尔图拉的马克斯·卡瓦拉拉)塞普尔图拉在中断后发行了 8 张专辑(都是与德里克·格林一起发行的),同时 Angra 发行了 6 张;而 Sepultura 是一支多产的乐队。

让我们记住这个信息,因为也许在这个分析的第二个瞬间,它可以被解释。

我们来看看每张专辑的平均歌曲数。

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

当我们目测 Sepultura 甚至没有更多的专辑,但每张专辑有更多的歌曲。

开始我们的分析文本分析的一个重要方面是 数据预处理 。在这里,我们实际上可以忽略所有的分析,因为预处理负责去除数据中的所有噪声,并对所有数据进行归一化,以获得有意义的结果。卡维塔·加内桑对这个话题做了很好的分析,我强烈推荐这本书。

第一步将是删除所有歌词的所有英文停用词。

PS:我个人不喜欢使用现成的停用词表,因为每个领域都需要特定的词子集来定义某个词是否重要。但是为了简单起见,让我们保持这种方式。马蒂娜·普列塞的这篇好文章详细解释了这一点。就实现而言,ML 专家的这篇文章可能是互联网上最好的资源。

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

在停用词移除之后,让我们对这两个带使用的最频繁的词进行快速的视觉检查。换句话说:他们作文中用得最多的词是什么?

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

如果我可以在这里进行一些分类,根据最常见的表达方式来定义 Angra 歌词,将会是这样的:

  • 时间关系:TimeDayWaitNight
  • 感受:LikeHeartSoulLie
  • 移动和距离:ComeWayAwayCarry
  • 生活与心灵:LifeLetKnowDreamMindLiveinsideLeave
  • 世界的绝对状态:Die
  • 典型的重金属陈词滥调:Oh

现在,快速验证一下《坟墓》的歌词:

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

现代世界的状态:DeathWarHateDieLiePainLoseFearBloodWorld

动作、距离、时间:WayComeStopMakeRiseTimeThinkHearKnow

思想问题:LiveMindFeelWantLookInside

潜在的差异

《坟墓》和《Angra》讨论的主题存在一些潜在的差异,如:

  • Sepultura 的创作文学轴集中于与死亡相关的事物/情感主题、痛苦、战争、仇恨(如果你已经不知道,Sepultura 在 PT-BR 中的意思是“坟墓”)相关的主题,这些主题被认为是最具攻击性/沉重的主题;
  • Angra 有一个更轻松的主题,更多地谈论涉及时间流逝的存在主义问题,以及一些与梦有关的感觉和与内部冲突有关的感觉的歌曲

我们来看一下相对于两个乐队最常用词的词云,只根据乐队使用的所有词汇做一个小对比。

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

主要词汇 Angra:

  • lifetimeknowheartdayawayknowdream

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

主要词汇 Sepultura:

  • waylifedeathworldmind

词汇多样性

根据 Johansson (2009)的说法,词汇多样性是在一篇文章中使用了多少不同单词的一种度量。词汇多样性的实际应用由 McCarthy 和 Jarvis (2010)给出。他们说 LD 是文本中使用的不同单词的范围,范围越大表明多样性越高

这里需要特别考虑的是,重金属歌曲不应该包含太多不同的词,*也就是说,*词汇丰富。这是因为在大多数情况下,每个乐队可以遵循一个单一的艺术概念,并针对一些主题形成他们的创作努力,当然也因为大多数时候这种歌曲有许多合唱。

例如(关于乐队概念) Avatasia 这是一个重金属的超级组合,谈论小说、幻想和宗教;而在另一边梦幻剧场谈论从宗教现代政治的几乎一切。

有了这个免责声明,让我们检查这个乐队的词汇多样性。

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

这两个乐队在词汇多样性上几乎没有差异,即使使用不同的词汇来塑造他们的主题,他们在主题出现的频率上也没有实质性的词汇差异。

单词 N-Grams

根据维基百科, n-gram 是来自给定文本或语音样本的 n 个项目的连续序列。根据应用,项目可以是音素、音节、字母、单词或碱基对。

在其他情况下,n-gram 是包含 n 个单词的序列,可以用来模拟某个序列出现在语料库中的概率,在我们的情况下,n-gram(s)可以在他们的文学词典中检查 n 个单词的最频繁组合。

为了简单起见,我们将集中讨论二元模型和三元模型的组合。

N-Grams Angra

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

在这里我们可以看到一些东西:

  • 你是”是n=2中的顶级组合。这表明,除了 Angra 的全部歌曲外,还有一些歌词包含了传递给另一个人的某种信息。
  • 最常见的二元模型之一是carry on,但这是有数据原因的:在这个数据集中,我们有包含歌曲 Carry OnAngels CryHoly Live磁盘,这导致了重复计数
  • me cathycathy come重唱背后的原因似乎是因为来自凯特·布什的一首名为 呼啸山庄 的翻唱歌曲大量重复了这一合唱;
  • 我们有传统的重金属歌曲合唱填料陈词滥调oh oh出现

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

  • carry on timeon time forgetremains past carry中再次出现进位,
  • Cathy这个词出现在三字组:heathcliff me cathyme cathy comecathy come home
  • 一些类似ha ha ha的奇怪模式,可能是因为数据清理

N-Grams 坟墓

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

在这些双图中,我们已经可以看到更多关于《坟墓》的主题,和我之前提到的残忍相关的主题。一些提及:

  • 歌曲“ Choke ”有一个非常重复的合唱,这有助于这个双字母组合的组成。
  • 经典的“T29”词根“T30”也是如此,它有一个非常引人注目的合唱

让我们来看看三个字母:

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

在这里,我们看到基本相同的模式,部分三元组面对一些非常惊人的合唱。

现在我们对这两个乐队的主题有了一些了解,然而,随之而来的一个问题是:在这个主题中,每首作品背后潜在的主题是什么?,也就是说,乐队理念中的主题具有多样性?,如果我们能把这些歌曲按照它们的文学成分分组会怎么样?

这里是我们要使用 LDA 的地方。

皱胃向左移

首先,我们将在各自的数据框架内过滤每位艺术家:

为了区分主题,我会为每个艺术家任意选择 7 个主题(可以多一点或少一点),这只是为了教学和保持简单。

换句话说:给定所有 Angra 和 Sepultura 的歌词,他们通常写得最多的前 7 个主题是什么?

主题 Angra

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

话题坟墓

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

主题分布

主题分布 Angra

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

我们可以看到,Angra 的大部分主题都集中在主题 4,0,2 上,我称之为主题随着时间的推移观察和了解世界(#4)随着时间的推移面对痛苦(#0)在生活中梦想来来去去(#2)

  • Topic #4: eyes time life ive world love say inside know got
  • Topic #0: time dont day away way youre face pain just cause
  • Topic #2: let come like away day life wont wonder cold dreams

现在让我们检查一下墓地:

主题分布图

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

《坟墓》聚焦于一些主题,如生命与恐惧时光流逝(#3)活在痛苦与死亡的世界(#5),活在战争与流血的世界

  • Topic #3: dont just away time fear youre know life right look
  • Topic #5: end theres dead world death feel eyes pain left alive
  • Topic #0: war live world hear trust feel walk believe blood kill

每个主题的字数

这里只是一个表格,供我们查看这两个乐队的文学部分渗透的主题中的单词顺序。

这里特别强调的是,在这个数据框架中,还考虑了该词在主题中的频率和普通性。

Angra 每主题字数

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

每个主题的字数

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

带单词分布的主题绘图

这里有了pyLDAvis库,我们可以通过视觉检查来看看主题是如何分布的。由pyLDAvis展示的图表被称为主题间距离图,它存在于一个二维平面中,其中心通过计算主题间的距离来确定,然后通过使用多维缩放将主题间距离投影到二维平面上

这样,我们就能够解释每个主题的组成,以及哪些术语在某个主题中最有用。

关于 LDAVis 最全面的介绍可以在 c .Sievert、& Shirley,K. (2014)中找到。LDAvis:一种可视化和解释主题的方法。交互式语言学习、可视化和界面研讨会论文集(第 63-70 页)

Angra 所有主题的 LDA 图

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

所有坟墓主题的 LDA 图

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

结论

最初,我脑子里有 3 个问题,关于使用 NLP 和 LDA 的整个旅行,我个人认为我有一些答案。

1)Angra 和坟墓有什么文学特征?

Sepultura 有一个更具侵略性的文学作品,他们谈论死亡、战争和痛苦,他们唱了几次面对死亡的歌词。他们大部分时间都在抗议一个失落或病态的世界。

他们谈论的是哪种类型的主题?
答案 : Angra: 时间,灵魂,命运。死亡、战争和痛苦的世界。

谁的话题更具多样性?
回答:使用任意数量的 7 个话题我们可以看到,Sepultura 在话题分布方面更具多样性。

更多想法和待办事项

  • 包括曲目名称
  • 比较墓地时代(马克斯—德里克)
  • 比较 Angra 时代(马托斯—法拉斯基—廖尼)
  • 曲目之间的相似性(基于内容)
  • Angra·LSTM 音乐歌词生成器
  • 话题演变
  • 每张专辑的主题
  • 使用 LSTM 的歌词生成

参考资料和有用的链接

机器学习加——Python 中的 LDA 如何网格搜索最佳主题模型?

Susan Li为西雅图的酒店建立一个基于内容的推荐系统

Susan Li自动生成与的酒店描述

Shashank kapa diaPython 中的端到端主题建模:潜在狄利克雷分配(LDA)

Meghana Bhange——数据增强的北极猴子歌词生成器

格雷格·拉弗蒂——LDA 关于哈利·波特的文本

代码学院——利用机器学习分析泰勒·斯威夫特的歌词

亚历山大·贝尔音乐歌词分析:利用自然语言处理创建基于歌词的音乐推荐器

卡车和啤酒——令人惊叹的项目与歌词刮刀

安德斯·奥尔森-斯旺森——自然语言处理和说唱歌词

布兰登·彭图罗——德雷克——利用自然语言处理理解他的歌词

简并态重金属与自然语言处理—第一部分

简并态重金属与自然语言处理—第二部分

简并态重金属与自然语言处理—第三部分

Packt _ Pub——使用深度(多层)LSTM 生成歌词

穆罕默德·马阿马里——人工智能生成泰勒·斯威夫特的歌词

笔记本泰勒·斯威夫特的歌词——Colab 中的链接

恩里克 a.单词级 LSTM 文本生成器。用神经网络创建自动歌词

Ivan Liljeqvist利用人工智能生成歌词

Sarthak Anand音乐发生器

富兰克林王——作词生成

托尼·贝尔特拉梅利——深度歌词

打破假设

原文:https://towardsdatascience.com/breaking-assumptions-8c5198459fd4?source=collection_archive---------33-----------------------

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

Photo by Martin Olsen on Unsplash

本周在机器学习课程中,我们讨论了戴维斯-波尔丁指数 (DBI)。与大多数(如果不是全部)聚类有效性度量一样,DBI 要求您至少有两个聚类。

为什么?

这是一个边界条件。公式本身要求这样做,因为作者使用了需要两个集群的指标。他们认为你至少想要两个。毕竟,为什么会有人想要单个集群呢?

输入集群能力。不是研究最多的领域。但是如果你要聚集数据,你应该能够证明你的数据应该被聚集。有一些数据,只是没有足够好的聚类来证明该方法。就像我最近处理的一个学生成绩数据集,其中的聚类没有任何关于数据的有用信息。我花了太多时间得出结论,应该只有一个集群。

如果我能够像比较其他所有星团一样,比较一个星团的 DBI,那该有多好,多奇妙。换句话说,我想要一个包含可聚集性概念的有效性度量。

这具有内在的意义。如果我们要判断数据应该分成多少个簇,为什么一个不是有效的数字呢?因此,我有了一个新的宠物研究项目:DBX-Davies-Bouldin Extended。这是找到研究领域的一个不错的方法。

你的假设是你观察世界的窗口。每隔一段时间就把它们擦掉,否则光线就照不进来了。~艾萨克·阿西莫夫

根据我的经验,人们会做出三种假设。

  • 经验
  • 传统
  • 简单

让我们更深入地看看这些假设以及它们的动机。

经验

你看过苹果新的 测试不可能的 广告吗?我不得不承认,我觉得这种风格和信息有点刺耳。然而,广告中有一个有用的信息。你不知道你不知道什么。

人是被自己的经历和理解所限制的。一个在美国生活了一辈子的 10 岁孩子,可能从来没有遇到过汽车在马路对面行驶的国家。这超出了他们的经验。同样,如果你被困在一个山洞里看着影子,这就是你所知道的一切。一个世界引起阴影的可能性可能超出了你的理解。

我们这些学者同样受到经验的限制。无论你是穿着有护肘的夹克还是穿着扎克伯格风格的帽衫,你的学术经历都和你的同事们大同小异。这个“把人们放进盒子里”有着促进思维过程一致性的不幸效果。当你把范围限制在某一特定领域的研究人员时,尤其如此。

打破经验窠臼的方法就是多经历。和另一个部门的研究员喝咖啡。参加一个全新领域的课程。或者,如果可以的话,去一个新的地方。我的妹夫,来自饲养航海家,这样说。

旅行是独特的,它打开你的世界观,迫使你面对你的假设,因为你面对的是现实。没有什么能比走出你的舒适区,体验真实的世界,而不是别人描绘的世界,更快地改变你的视角。这里没有任何过错。走出去,亲身体验这个世界。~ 布雷迪@养航海家

传统

另一个常见的假设类别是传统。学术界当然热爱它的传统。看在上帝的份上,每次毕业典礼我们都戴上帽子,穿上长袍,扮演中世纪的僧侣。但是传统并不局限于服饰和礼仪,它也渗透到我们的研究中。

传统意味着投票给所有阶层中最不起眼的人,我们的祖先。这是死人的民主。传统拒绝屈服于那些碰巧四处走动的小而傲慢的寡头政治。~ GK 切斯特顿

明确一点,我不是说传统不好。对于 2d 图形来说,X 轴总是水平的,Y 轴总是垂直的,这是非常有用的。但是每个领域、子领域和专业都有自己的假设。

例如,K-Means 假设大致各向同性的集群。一想到那些没有经过预处理就盲目聚集名义数据的好心人,我就不寒而栗。如果那些天真的聚类者知道这个假设,他们可能会质疑它,并在这样做的过程中发现了聚类的层次方法。

简单

这可能是我们最常见的假设。当我们可以假设某些事情是固定的时,事情就简单多了。在基础物理学中,我们假设引力、光速和时间都是常数。事实上,所有这些都可能有所不同。上面戴维斯-波尔丁的例子就属于这一类。考虑到所使用的度量标准,使用多个集群会更简单。

人生来不是为了解决宇宙的问题,而是为了发现自己要做什么;并把自己限制在自己理解的范围内。~歌德

就像传统一样,简单也可能是一件好事。一个简单的模型通常比一个复杂的模型表现得更好,一个简单的问题解决方案几乎总是更可取的。

然而,有时需要额外的复杂性。如果一旦发现了线性和逻辑回归,我们就撒手不管,到此为止,我们可能永远也不会发现我们今天使用的大量技术。

最后的想法

仅此而已。我们都有自己的假设。和大多数事情一样,这些假设可以是正面的,也可以是负面的。理解这些假设会让我们成为更好的研究者……老实说,会让我们成为更好的人。

当我们坐下来阅读一篇新论文时,我们应该问这些问题来指导我们的分析。

  • 从经验中可以做出什么样的假设?
  • 这个领域的传统假设是什么?
  • 做了哪些简化来减少问题?

回答这些问题将提高我们对论文的理解,并开辟新的研究领域。

明智地假设!

你知道当你假设… ~一个我们都忘记了的人会发生什么

让伯特崩溃

原文:https://towardsdatascience.com/breaking-bert-down-430461f60efb?source=collection_archive---------2-----------------------

NLP 中最新里程碑的完全分解

伯特是什么?

BERT 是来自变压器的双向编码器表示的缩写。它是谷歌在 2018 年末开发并发布的一种新型语言模型。像 BERT 这样的预训练语言模型在许多自然语言处理任务中起着重要的作用,如问题回答、命名实体识别、自然语言推理、文本分类等。

BERT 是基于微调的多层双向变压器编码器。在这一点上,引入变压器架构是很重要的。

什么是变压器?

2017 年,谷歌发表了一篇题为《注意力就是你所需要的一切》的论文,提出了一种基于注意力的结构来处理序列模型相关问题,比如机器翻译。传统的神经机器翻译大多使用 RNN 或 CNN 作为编解码的模型库。然而,谷歌基于注意力的变压器模型抛弃了传统的 RNN 和 CNN 公式。该模型高度并行工作,因此在提高翻译性能的同时,训练速度也极快。

让我们退一步理解注意力。

什么是注意力?

注意机制可以被视为模糊记忆的一种形式。内存由模型的隐藏状态组成,模型选择从内存中检索内容。在我们深入研究注意力之前,让我们简单回顾一下 Seq2Seq 模型。传统的机器翻译基本上是基于 Seq2Seq 模型。该模型分为编码器层和解码器层,由 RNN 或 RNN 变体(LSTM、GRU 等)组成。).编码器向量是从模型的编码器部分产生的最终隐藏状态。该向量旨在封装所有输入元素的信息,以帮助解码器做出准确的预测。它充当模型解码器部分的初始隐藏状态。Seq2Seq 模型的主要瓶颈是需要将源序列的全部内容压缩到一个固定大小的向量中。如果文本稍长,很容易丢失文本的一些信息。为了解决这个问题,注意力应运而生。注意机制通过允许解码器回顾源序列隐藏状态,然后将其加权平均值作为附加输入提供给解码器,从而缓解了这个问题。顾名思义,使用注意力,该模型在解码阶段选择最适合当前节点的上下文作为输入。注意力和传统的 Seq2Seq 模型主要有两个区别。第一,编码器向解码器提供更多的数据,编码器会向解码器提供所有节点的隐藏状态,而不仅仅是编码器最后一个节点的隐藏状态。

https://jalammar.github.io/images/seq2seq_7.mp4

第二,解码器不直接使用所有编码器提供的隐藏状态作为输入,而是采用一种选择机制来选择与当前位置最匹配的隐藏状态。为此,它试图通过计算每个隐藏状态的得分值并对得分进行 softmax 计算来确定哪个隐藏状态与当前节点最密切相关,这允许隐藏状态的较高相关性具有较大的分数值,而较不相关的隐藏状态具有较低的分数值。然后,它将每个隐藏状态乘以其 softmaxed 分数,从而放大分数高的隐藏状态,淹没分数低的隐藏状态。这种评分练习在解码器端的每个时间步进行。

https://jalammar.github.io/images/attention_process.mp4

现在让我们把整个事情放在一起,在下面的视觉化中,看看注意力过程是如何工作的:

  1. 注意力解码器 RNN 接受令牌的嵌入,以及一个初始的解码器隐藏状态。
  2. RNN 处理它的输入,产生一个输出和一个新的隐藏状态向量(h4)。输出被丢弃。
  3. 注意步骤:我们使用编码器隐藏状态和 h4 向量来计算这个时间步骤的上下文向量(C4)。
  4. 我们将 h4 和 C4 连接成一个向量。
  5. 我们将这个向量通过一个前馈神经网络(一个与模型联合训练的网络)。
  6. 前馈神经网络的输出表示该时间步长的输出字。
  7. 重复接下来的时间步骤

https://jalammar . github . io/images/attention _ tensor _ dance . MP4

回到变形金刚

变压器模型使用编码器-解码器架构。在 Google 公布的论文中,编码器层由 6 个编码器堆叠而成,解码器层也是如此。每个编码器和解码器的内部结构如下-

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

该编码器由两层组成,一个自注意层和一个前馈神经网络。自我关注帮助当前节点不仅关注当前单词,而且获得上下文的语义。解码器也包含了编码器提到的两层网络,但在两层中间还有一个关注层,帮助当前节点获取需要关注的关键内容。

以下是变压器架构的详细结构-

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

让我们来分解一下各个组件。

自我关注

自我关注是 Transformer 把对其他相关词的“理解”转化为我们正在处理的词的一种方式。

首先,自我关注计算出三个新的向量。在本文中,向量的维数是 512 维。我们分别称这三个向量为查询、键和值。这三个向量是通过将字嵌入向量与一个随机初始化的矩阵(在该论文中维数是(64,512))相乘而产生的,该矩阵的值在反向传播过程中被更新。

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

接下来,我们计算自我注意的分数值,它决定了当我们在某个位置对一个单词进行编码时,对输入句子的其余部分的注意程度。该小数值的计算方法使用查询和键向量。然后我们把结果除以一个常数。这里我们除以 8。这个值一般是上面提到的矩阵第一维的平方根,也就是 64 的平方根 8。然后我们对所有分数进行 softmax 计算。结果是每个单词与当前位置的单词的相关性。自然,当前职位的词相关度肯定会大。最后一步是将值向量与 softmax 结果相乘并相加。结果是当前节点的自我关注值。

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

这种通过查询和关键字之间的相似度来确定值的权重分布的方法被称为比例点积注意力。

多头注意力

这篇论文更强大的部分是在自我关注中添加了另一种机制,称为“多头”关注,它不只是初始化一组 Q,K,V 矩阵。而是多组初始化,transformer 用了 8 组,所以最后结果是 8 个矩阵。

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

前馈神经网络不能接受 8 个矩阵,所以我们需要一种方法将 8 个矩阵减少到 1 个。为此,我们首先将 8 个矩阵连接在一起,得到一个大矩阵,然后将这个组合的矩阵乘以一个随机初始化的矩阵,得到一个最终的矩阵。我们来看一下整个过程。

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

变压器以三种不同的方式使用多头注意力:

  1. 在“编码器-解码器注意”层中,查询来自前一个解码器层,存储器键和值来自编码器的输出。这允许解码器中的每一个位置关注输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意机制。
  2. 编码器包含自我关注层。在自关注层中,所有的键、值和查询都来自同一个地方,在这种情况下,是编码器中前一层的输出。编码器中的每个位置可以关注编码器的前一层中的所有位置。
  3. 类似地,解码器中的自关注层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。我们需要防止解码器中的向左信息流,以保持自回归特性。我们通过屏蔽(设置为 softmax 输入中与非法连接相对应的所有值,在比例点积注意中实现这一点。这将在解码器部分更详细地讨论,我们将讨论掩蔽。

位置编码

到目前为止,我们还没有办法解释 transformer 模型中输入序列中单词的顺序。为了解决这个问题,转换器向编码器和解码器层的输入添加了一个额外的矢量位置编码。尺寸与嵌入尺寸相同。这个位置编码的值被加到嵌入的值上,并作为输入发送到下一层。位置编码有很多选项,既有学习的,也有固定的。

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

剩余连接和层标准化

在编码器和解码器中,在两个子层的每一个周围使用残差连接,随后进行层归一化。跳过连接或剩余连接用于允许梯度直接流过网络,而不经过非线性激活函数。非线性激活函数本质上是非线性的,导致梯度爆炸或消失(取决于权重)。跳跃连接在概念上形成了一条“总线”,它直接穿过网络,反过来,梯度也可以沿着它反向流动。标准化有助于解决称为内部协变量移位的问题。内部协变量移位是指在神经网络内发生的协变量移位,即从(比方说)第 2 层到第 3 层。这是因为,随着网络的学习和权重的更新,网络中特定层的输出分布会发生变化。这迫使更高层适应这种漂移,从而减慢学习速度。在神经网络中对输入进行归一化处理后,我们就不必担心输入特征的规模会有很大差异。为了理解层规范化,将其与批规范化进行对比是很有用的。小批量由具有相同数量特征的多个实例组成。小批量是矩阵,如果每个输入是多维的,则是张量,其中一个轴对应于批量,另一个轴对应于特征尺寸。批量归一化将输入要素跨批量维度进行归一化。图层归一化的关键特征在于它对要素间的输入进行归一化。在批次规范化中,统计数据是跨批次计算的,并且对于批次中的每个示例都是相同的。相比之下,在图层规范化中,统计数据是跨每个要素计算的,并且独立于其他示例。

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

将剩余连接和层规范化结合在一起。

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

解码器

回到 Transformer 架构图,我们可以看到解码器部分和编码器部分类似,只是底部有一个被屏蔽的多头注意力。Mask 表示屏蔽某些值的掩码,以便它们在参数更新时不会产生影响。Transformer 模型中有两种遮罩—填充遮罩和序列遮罩。填充掩码用于所有缩放的点积关注,而序列掩码仅用于解码器的自关注。

填充掩码解决了输入序列长度可变的问题。具体来说,我们在一个较短的序列后填充 0。但是如果输入序列太长,左边的内容被截取,多余的直接丢弃。因为这些填充的位置其实是没有意义的,我们的注意机制不应该聚焦在这些位置上,所以需要做一些处理。具体做法是在这些位置的值上加一个非常大的负数(负无穷大),这样 softmax 之后这些位置的概率就会接近 0!填充掩码实际上是一个张量,每个值都是一个布尔值,false 的值就是我们要处理的地方。

序列掩码被设计成确保解码器看不到未来的信息。也就是说,对于一个序列,在 time_step t,我们的解码输出应该只取决于 t 之前的输出,而不是 t 之后的输出,这是特定于变压器架构的,因为我们没有 rnn 可以顺序输入序列。这里,我们一起输入所有内容,如果没有掩码,多头注意力将考虑每个位置的整个解码器输入序列。我们通过生成一个上三角矩阵来实现这一点,其中上三角的值全部为零,并将该矩阵应用于每个序列。

对于解码器的自关注,使用缩放的点积关注,并且添加填充掩码和序列掩码作为 attn_mask。在其他情况下,attn_mask 等于填充掩码。

另一个细节是解码器输入将向右移动一个位置。这样做的一个原因是,我们不希望我们的模型学习如何在训练期间复制我们的解码器输入,但是我们希望学习给定编码器序列和特定的解码器序列,这已经被模型看到,我们预测下一个单词/字符。如果我们不移动解码器序列,模型学习简单地“复制”解码器输入,因为位置 i 的目标单词/字符将是解码器输入中的单词/字符 i 。因此,通过将解码器输入移动一个位置,我们的模型需要预测位置 i 的目标单词/字符,在解码器序列中只看到单词/字符 1,…,i-1 。这阻止了我们的模型学习复制/粘贴任务。我们用句首标记填充解码器输入的第一个位置,因为这个位置会因为右移而为空。类似地,我们将一个句子结束标记附加到解码器输入序列,以标记该序列的结束,它也被附加到目标输出句子。

输出层

在完全执行解码器层之后,为了将结果向量映射到词汇表中的单词,在末尾添加了完全连接层和 softmax 层。

线性层是一个简单的完全连接的神经网络,它将解码器堆栈产生的矢量投影到一个更大的矢量中,称为 logits 矢量。让我们假设我们的模型知道 10,000 个独特的英语单词(我们模型的“输出词汇”),这些单词是从它的训练数据集学习来的。这将使 logits 向量有 10,000 个像元宽,每个像元对应一个唯一单词的分数。这就是我们如何解释线性层之后的模型输出。然后,softmax 层将这些分数转化为概率(全部为正数,总和为 1.0)。选择概率最高的像元,并产生与之相关的单词作为该时间步长的输出。

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

回到伯特

BERT 基于变压器架构。它是一个深度的、双向的深度神经网络模型。BERT 的关键技术创新是将 Transformer 的双向训练应用于语言建模。这与以前从左到右或者结合从左到右和从右到左训练来查看文本序列的努力形成对比。BERT 采用了一种叫做屏蔽语言建模的新技术(我们将在后面看到),这种技术允许在模型中进行双向训练,这在以前是不可能的。一般来说,Transformer 包括两个独立的机制——一个读取文本输入的编码器和一个为任务生成预测的解码器。由于 BERT 的目标是生成一个语言模型,所以只有编码器机制是必要的。

谷歌最初发布了两个版本,如下图所示。这里 L 代表变压器的层数,H 代表输出的维度,A 代表多头关注的数量。在这两个版本中,前馈尺寸被设置为 4 层。

BERTBASE: L=12,H=768,A=12,总参数=110M

伯特拉奇:L=24,H=1024,A=16,总参数= 340 米

使用 BERT 有两个阶段:预训练和微调。在预训练期间,模型在不同的预训练任务中在未标记的数据上被训练。对于微调,首先用预先训练的参数初始化 BERT 模型,并且使用来自下游任务的标记数据微调所有参数。每个下游任务都有单独的微调模型,即使它们是用相同的预训练参数初始化的。BERT 的一个显著特征是跨不同任务的统一架构。预训练架构和最终的下游架构之间的差异很小。在微调过程中,所有参数都会被微调。

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

BERT 预培训流程

BERT 预训练阶段由两个无监督的预测任务组成,一个是掩蔽语言模型,另一个是下一句预测。

掩蔽语言模型——由于 BERT 使用的双向功能(双向)和多层自我注意机制的影响,为了训练深度双向表示,输入标记的某个百分比(论文中为 15%)被简单地随机掩蔽,然后预测那些被掩蔽的标记。与标准 LM 中一样,对应于掩码标记的最终隐藏向量被馈送到词汇表上的输出 softmax 中。与从左到右的语言模型预训练不同,MLM 目标允许表示融合的左侧和右侧的上下文,这使得预训练深度双向变换器成为可能。虽然这允许获得双向预训练模型,但缺点是预训练和微调之间存在不匹配,因为[MASK]标记在微调期间不会出现。为了减轻这一点,作者并不总是用实际的[MASK]标记替换“被屏蔽”的单词。训练数据生成器随机选择 15%的标记位置进行预测。如果选择了第 I 个令牌,则它被替换为(1)80%时间的[掩码]令牌(2)10%时间的随机令牌(3)10%时间的未改变的第 I 个令牌。BERT 损失函数只考虑屏蔽值的预测,而忽略非屏蔽字的预测。因此,该模型比方向模型收敛得更慢,这一特性被其增强的上下文感知所抵消。

下一句预测–。为了训练理解句子关系以及单词之间的语义关系的模型,BERT 还为二进制化的下一句预测任务进行了预训练,该任务可以非常容易地从任何文本语料库中生成。为 A 和 B 选取一些句子,其中 50%的数据 B 是 A 的下一句,剩下 50%的数据 B 在语料库中随机选取,学习相关性。增加这种预训练的目的是很多自然语言处理任务如问答和 NLI 需要理解两个句子之间的关系,这样预训练的模型才能更好地适应这类任务。

为了帮助模型在训练中区分这两个句子,输入在进入模型之前以下列方式处理:

  1. 在第一个句子的开头插入一个[CLS]标记,在每个句子的结尾插入一个[SEP]标记。
  2. 指示句子 A 或句子 B 的句子嵌入被添加到每个记号。句子嵌入在概念上类似于词汇为 2 的标记嵌入。
  3. 向每个标记添加位置嵌入,以指示其在序列中的位置。Transformer 论文中介绍了位置嵌入的概念和实现。

为了预测第二个句子是否确实与第一个句子相关联,执行以下步骤:

  1. 整个输入序列经过变压器模型。
  2. 使用简单的分类层(权重和偏差的学习矩阵),将[CLS]令牌的输出转换成 2×1 形状的向量。
  3. 用 softmax 计算 IsNextSequence 的概率。

在训练 BERT 模型时,屏蔽 LM 和下一句预测一起训练,目标是最小化两种策略的组合损失函数。

记号化——BERT 不把单词看作记号。相反,它着眼于单词块。这意味着一个单词可以分解成多个子单词。这种标记化在处理词汇之外的单词时是有益的,并且它可以帮助更好地表示复杂的单词。

伯特模型输入

BERT 的输入可以是单个句子,也可以是单词序列中的一对句子(例如,[问题,答案])。对于给定的单词,其输入表示可以由三部分嵌入求和组成。嵌入的可视化表示如下所示:

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

令牌嵌入表示单词向量。第一个词是 CLS 标志,可用于后续分类任务。对于非分类任务,可以忽略 CLS 标志。片段嵌入用于区分两个句子,因为预训练不仅是一个语言模型,而且是一个以两个句子作为输入的分类任务。位置嵌入编码词序。

针对下游 NLP 任务的 BERT 微调

对于每个下游 NLP 任务,我们只需将任务特定的输入和输出插入到 BERT 中,并端到端地微调所有参数。在输入端,来自预训练的句子 A 和句子 B 可以类似于释义中的句子对、蕴涵中的假设-前提对、问题回答中的问题-段落对等。在输出端,记号表示被馈送到输出层用于记号级任务,例如序列标记或问题回答,而[CLS]表示被馈送到输出层用于分类,例如蕴涵或情感分析。相比于前期训练,微调相对便宜。

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

BERT 可以用于各种各样的语言任务,同时只在核心模型中增加了一个小的层:

  1. 通过在[CLS]令牌的转换器输出之上添加分类层,类似于下一句分类来完成诸如情感分析的分类任务。
  2. 在问题回答任务中(例如,SQuAD v1.1),软件接收关于文本序列的问题,并被要求在序列中标记答案。使用 BERT,可以通过学习标记答案开始和结束的两个额外向量来训练问答模型。
  3. 在命名实体识别(NER)中,软件接收文本序列,并被要求标记文本中出现的各种类型的实体(人、组织、日期等)。使用 BERT,可以通过将每个令牌的输出向量馈送到预测 NER 标签的分类层来训练 NER 模型。

用于特征提取的 BERT

微调方法并不是使用 BERT 的唯一方法。您可以使用预先训练的 BERT 来创建上下文化的单词嵌入。然后,您可以将这些嵌入内容添加到您现有的模型中——本文展示的这个过程产生的结果与在诸如命名实体识别等任务上微调 BERT 相差不远。

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

哪一种向量最适合作为情境化嵌入?这取决于任务。该文件检查了六个选项(与得分为 96.4 的微调模型相比):

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

希望你喜欢读这篇文章,就像我喜欢写它一样!我要承认并感谢网上一些非常惊人的资源(列在参考文献中),它们帮助我提炼了 BERT 背后的概念,我在编写这篇文章时广泛借鉴了这些资源。

参考

[## 可视化神经机器翻译模型(Seq2seq 模型的机制,注意)

翻译:中文(简体),韩文观察:麻省理工学院的深度学习艺术讲座引用此贴…

jalammar.github.io](https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/) [## 图示的变压器

讨论:黑客新闻(65 分,4 条评论),Reddit r/MachineLearning (29 分,3 条评论)翻译…

jalammar.github.io](https://jalammar.github.io/illustrated-transformer/)

分解相关性

原文:https://towardsdatascience.com/breaking-down-correlation-2067628e29a0?source=collection_archive---------18-----------------------

相关性是发现数量关系的第一步,值得注意。相关性被定义为数量之间的关联,例如,当人们的收入增加时,销售额可能会增加

在我们深入研究数学之前,我们需要理解协方差。协方差是变量之间关联的统计度量

Cov(x,y)= E[(x—E[x])(y—E[y])]]

上面的等式是协方差的等式,让我们来分解它

e 表示一个变量的期望值,这个值就是平均值。x-E[x]只不过是从平均值中减去 x 值,最终得到平均值的偏差。我们对 y 做同样的事情,乘以 x 和 y 相对于各自平均值的偏差。这可以被认为是一堆像这样的矩形

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

对于 x 和 y 的每个值,我们得到这样的矩形,平均矩形的对角向量给出了这样的关系,如果数据点沿着相同的方向,它可以是大的和正的,如果它们沿着相反的方向,我们得到一个大的和负的对角向量

如果变量是不相关的,对角线向量应该平均抵消,我们得到的量值是 0

这和相关性有什么关系?协方差值仍然与 x 和 y 处于相同的范围内,例如,cov(x,y) = 7.8 和 cov(a,b) = 6.4,我们可以看到两者正相关,但不能说哪一个强相关。相关性通过测量可变性来标准化该值,以便在一致的范围内获得值

皮尔逊相关系数

皮尔逊方法是使用最广泛的相关系数,它涉及用 x 和 y 的单个标准偏差的乘积来标准化协方差。这导致变量之间的线性关联,这意味着它用一条线来描述关系,听起来熟悉吗?是的,这听起来像是最合适的路线。让我们回到这一部分

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

可以看出,分子是协方差,分母使用标准偏差将值从-1 标准化到 1,这使得解释更容易。

如果变量 x 和 y 是独立的,系数接近于 0,而不是相反,让我们来看看为什么

回归线和相关系数之间有明显的相似性。通过最小化点之间的距离来计算最佳拟合线,这在数学上等同于相关方程分子中的偏差。所以相关性可以安全地写成

ρ = b (sx/sy)

其中 b =斜率

说了这么多,相关性并不等同于斜率。通过可变性测量标准化的斜率给出了相关系数!瞧啊。。换句话说,因为最佳拟合线没有考虑变量的可变性,所以我们可以得到具有高相关系数的较小斜率

所以下次当你遇到这两种方法的相似之处时,请注意这一点。使用相关性的缺点是它对异常值很敏感,因为它使用平均值,标准差来计算关系

另一种解释相关系数的方法是,把它平方,我们得到的是 x 变量解释的 y 的方差比例,听起来很熟悉吧?是的,这是用于衡量线性 ML 模型性能的 R2 指标

对于 eg,相关的平方= (-0.85)给出大约 72%

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

这是因为在最小二乘法中,我们从总数中计算误差平方和的比例,并减去 1,以获得正确解释的可变性,这在数学上等同于相关系数的平方,这也解释了数据的可变性

这些是看待相关性的一些方式,事实上,还有 13 种方式,所以下次我们学习一个指标时,作为数据科学家,我们应该愿意以多种方式看待它们,因为每个指标都以某种方式与其他指标相关联

干杯!

在《PyTorch》中分解莱昂·加蒂斯的神经风格转移

原文:https://towardsdatascience.com/breaking-down-leon-gatys-neural-style-transfer-in-pytorch-faf9f0eb79db?source=collection_archive---------13-----------------------

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

Neural Style Transfer performed on an image of a cat.

2015 年 Leon Gatys 等人在他们的论文“艺术风格的神经算法”(arXiv:1508.06576v2)中提出了一种神经风格转移的方法。我总是着迷于神经网络模型能够进行风格转移,当时结果对我来说就像魔术一样。在这篇短文中,我想详细介绍使用 PyTorch 实现原始的神经类型转换算法。

我知道网上有很多教程。然而,我发现它们都很令人困惑,而且对于这项任务来说过于复杂。在有些沮丧之后,我决定自己实现原始论文中的方法,试图将技术分解到最小的部分,而不使用任何花哨的东西。这个实验的目标更多的是理解这个方法的理论,而不是在产品中实现这个模型,我希望这篇文章对你理解神经风格转移模型有所帮助。

首先,我想回顾一下 NST 方法的基础——特征提取。卷积神经网络享有完全连接或递归神经网络都无法享有的东西——可解释的提取特征。如果你熟悉卷积层如何传播信号,你最有可能看到激活图和滤波器可视化。如果没有,Francois Chollet 的《用 Python 进行深度学习》5.4 节是很好的参考。另外,Ian Goodfellow 等人的《深度学习》中的图 1.2 是一个很好的参考。

为什么这很重要?我们知道更深层次的神经网络提取更多的一般特征。在卷积神经网络的情况下,网络的较低层提取非常局部的特征,例如边、角和颜色。在更深的层中,这些边和角被组合在一起以表示越来越多的全局特征,例如形状、面部,有时甚至是整个物体,例如计算机键盘。

Gatys 等人的方法基于卷积网络的独特能力,能够在网络的不同层提取不同尺度的特征。他们认为,网络较低层的混合可以提取纹理和配色方案,而较深层的一层可以提取图像的整体结构,我们可以在一幅图像中以某种方式组合这些特征,以实现风格转移。他们在实验中表明这确实是可能的,为进一步研究打开了神经类型转移的整个领域。

我希望你在这一点上不要太迷茫(如果有的话),因为神经类型转移的方法论一开始有点混乱,但是,最终,非常简单明了。

我们从 2 个图像开始:第一个图像是我们希望提取内容的图像。我用的是在网上找到的一只猫的图片,所以想把猫的内容提取出来。

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

The image of a cat I wish to stylize.

第二个图像是我们希望提取样式的图像。通常情况下,我们希望使用具有强烈风格的图像,这样风格的转换将在美学上令人愉快。实验表明艺术品的效果最好。但是,您可以从任何图像中提取您想要的样式。我确信如果我们想的话,我们可以提取上面这张图片的风格。

以下是我用于神经风格转移模型的一些作品:

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

The style images we are going to transfer the style from.

实现

我们将使用 VGG19 模型进行风格转换。VGG19 常用于原始风格转换实现,但这不是必需的。有可能许多其他较新的模型可以提供更好的特征提取结果,但是社区将它们留给实验。VGG19 是一个简洁、紧凑的模型,在原始论文中也使用了它。因此,我们也将使用它,试图获得尽可能接近原始论文的结果。

Gatys 等人提出使用 VGG19 模型提取 2 组特征。使用模型的“block4_conv2”层,从内容图像中提取第一组特征,即内容特征。第二组特征,即风格特征,使用“block1_conv1”、“block2_conv1”、“block3_conv1”、“block4_conv1”、“block5_conv1”层从风格图像中提取。

为什么我们从 5 层而不是 1 层中提取样式?本文中的图 1 很好地比较了使用 VGG19 模型不同层的样式和内容重建。所以,答案是:从经验上来说,如果我们使用这五层,这种风格看起来更有吸引力。层数和其他因素的实验会产生特定的结果,我们会根据经验选择最佳结果,就像神经机器学习中的任何其他模型一样。请注意,如果我们使用不同的模型而不是 VGG19,几乎可以肯定的是,我们将不得不为内容和样式提取选择一些其他的图层集。

因此,我定义了自定义 VGG 导数,如下所示:

现在,当我们定义了 VGG 特征提取器网络后,我们就可以继续了。

Gatys 等人提到,为了获得更好的结果,他们将最大汇集层替换为平均汇集层:

Replacing the Max Pooling layers with the AVG Pooling layers.

理解我们的 VGG19 网络作为静态特征提取器执行,并且*权重在训练过程中不会改变,这一点很重要。*因此,让我们把梯度计算锁定在网络参数上:

Turn off the gradient computation in the VGG parameters.

好了,现在,当我们的网络被锁定时,我们可以从内容和样式图像中提取内容和样式特征。

我们可以通过 VGG 网络传递内容图像并收集“block4_conv2”层的输出来提取内容特征。现在,产生的激活是 CxHxW 尺寸。Gatys 建议将激活图展开成二维张量 CxH*W,因此我们也将这样做:

Extracting the content features and unrolling them.

请注意,我们必须将激活从计算图中分离出来,因为我们不希望梯度流过它们。让我们先把内容特性放在一边,我们稍后会用到它们。

现在,我们需要从样式图像中提取样式。我们通过我们的 VGG 网络传递样式图像,并采集“block1_conv1”、“block2_conv1”、“block3_conv1”、“block4_conv1”、“block5_conv1”层的输出来实现这一点。然后,我们将“展开”它们,就像我们处理内容激活一样。

有一个额外的步骤涉及到从样式图像中提取样式。特征本身不足以提取图像的风格。然而,Gatys 等人提出计算每一层激活的空间相关性。我们可以通过计算每层的格拉米矩阵来做到这一点。格拉米矩阵是输入张量的列和这些列的转置的点积。在格拉米矩阵中,我们可以看到哪些空间特征支配着其他空间特征:

Gram matrix calculation.

将样式提取放在一起会产生:

我们分离激活的原因与我们分离内容图像的激活的原因相同:我们将在损失计算中使用它们作为目标值。因此,我们不希望梯度流过它们。

这是该方法的关键思想。我们将从高斯噪声中定义一个图像,然后我们将在图像空间中执行参数搜索,其中参数是这个噪声图像的像素。当我们在我们的假设空间中找到一个图像,并且这个图像在内容图像的激活和风格图像的激活的 Gram 矩阵中具有最小的损失时,我们将会感到满意。结果图像将具有内容图像的内容和样式图像的样式。

也就是说,原始论文中的等式(1)和(4–5)定义了损耗。我使用 Adam optimizer 在图像空间中执行搜索。我们可以按照以下方式定义噪声图像和优化器:

The noise image and the optimizer definition.

注意,许多实现建议使用 L-BFGS 优化算法。然而,为了使事情更容易理解,并表明我们使用哪个优化器并不重要,我使用 Adam 优化器。

现在,我们开始优化循环。该过程可总结如下:

  1. 从 VGG 中获取噪声图像的内容激活
  2. “展开”噪声图像的内容激活
  3. 计算内容图像的内容激活和噪声图像的内容激活之间的内容损失:SSE
  4. 从 VGG 中获取噪声图像的样式激活
  5. “展开”噪声图像的样式激活
  6. 计算噪声图像的风格激活的每一层的 Gram 矩阵
  7. 将每个图层的加权样式损失相加
  8. 将加权的风格和内容损失加在一起
  9. 反向传播

10.更新噪声图像的像素

11.重复 1–10

基本上,在每次迭代中,我们都要提取噪声图像的内容和风格。然后,我们将通过计算损失来比较噪声图像的内容和风格与内容图像的内容和风格图像的风格。然后,我们将这些损失加在一起,但我们将在此之前对它们进行加权,以引入一种风格-内容平衡机制。该损失将为我们提供当前噪声图像在内容上离内容图像有多远以及在风格上离风格图像有多远的估计。然后,当我们执行反向传播时,我们计算总损失相对于图像像素的梯度,因此我们知道应该在哪个方向上调整当前噪声图像中的像素,以在内容和风格上更接近参考图像。

这是模型的训练循环,请注意,我省略了一些通过阅读本文可以容易理解的次要细节。:

The main training loop for the Neural Transfer Model.

添加变化损失是为了使图像看起来更好,其定义如下:

值得一提的是,内容、风格和变化损失之间的平衡非常重要。每一次风格转换都需要你调整每一次损失的贡献,这可以根据经验来衡量。

结果

以下是我通过运行原始的神经类型转移模型获得的一些结果。

样式提取

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

Style (right) extracted out of the original image (left).

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

Style (right) extracted out of the original image (left).

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

Style (right) extracted out of the original image (left).

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

Style (right) extracted out of the original image (left).

风格转移

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

Style transferred to the cat image.

最初的方法有一个主要缺点:每次我们想要执行样式转换时,我们都必须运行优化算法。此外,使用原始方法执行样式转换在计算上非常昂贵(至少对于 Adam 优化器来说是这样),因此它不太适合在线使用或生产。

存在一些使用神经网络参数搜索代替图像参数(像素)搜索的其他神经类型转移方法。这些模型允许为每种想要提取的样式训练一个单独的网络,然后许多内容图像可以在一次转发中被风格化。这样的车型更适合生产。事实上,我正计划研究一些这样的模型,并希望在不久的将来写下它们,这样我们就可以将结果与 Leon Gatys 等人的原始论文进行比较。

我在本文中使用的代码可以在这里免费获得。回购还包括打包模型,您可以在 2 个图像上运行,以执行神经风格转移。

感谢您的阅读!

编辑 :下面是我在训练中记录的一些形成噪音的有趣 gif:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值