向一个六岁的孩子解释大数据
爸爸,什么是大数据?
作为一名期待中的父母,我有一种难以言喻的恐惧,担心有一天我的孩子会说出他的第一个严重关切:“爸爸,什么是大数据?”。
这可能不会成为现实,但当我的孩子对他们父亲的职业感到好奇时,我该如何向他们解释大数据的概念?
快进到我宝宝的六岁生日。我最大的恐惧终究会成为现实。天真的头脑会开始好奇爸爸在工作中做什么。经过漫长的一天回到家,我最终将不得不告诉我的孩子我典型的一天是什么样子的。当我骄傲地给我的孩子一份亲手挑选的礼物时,最后的时刻就要到来了。
我小时候没有乐高玩具,所以我保证会给我的孩子补上。当我把孩子最喜欢的乐高积木拆成碎片时,我说 “我的孩子,听着,仔细听着,我将用这些乐高积木一劳永逸地解释大数据” 。
想象你有一堆乐高积木,上面有 100 块不同颜色和形状的积木,爸爸让你收集所有红色的积木。作为一个六岁的孩子,你可以在几分钟内完成。最简单的方法就是检查每一块,把红色的拿出来。迟早,你会把它们都握在你的小手里。
Fran Jacquier 在 Unsplash 上拍摄的照片
然而,爸爸想挑战一下。当你在数原来的那一堆的时候,爸爸会增加 200 、 300 ,甚至 1000 更多的砖块。一个六岁的孩子可能不知道 1000 块乐高积木有多大,但是随着你一遍又一遍地数,它永远也数不完。
奥马尔·弗洛雷斯在 Unsplash 上拍摄的照片
当爸爸在工作的时候,人们也让我拿出乐高积木。但是他们有比我们大得多的乐高积木。这些碎片可以堆积到的大小,一栋房子,一栋建筑,甚至一座山。
如果爸爸一直像你这样数数,他会累坏的,下班后就没有时间和你玩了。但是爸爸很聪明,他有一些秘密武器。他有两个朋友帮助他: RangO 和 StackO 。
兰戈所做的是他整理东西。当你有一个小小的乐高积木堆,每个人都在你的视线范围内时,选择一种特定的颜色似乎很简单。但是当事情变得越来越大的时候,爸爸不能独自处理所有的搜索和挑选。他让 RangO 按颜色组织乐高积木。爸爸可以有几个颜色相同的积木,而不是一堆五颜六色的。你看到爸爸现在捡红砖有多容易了吗?最酷的是 RangO 可以根据形状、颜色或者爸爸能想到的任何东西来准备食物。
StackO 怎么样?当爸爸不得不在兰戈准备的红色积木堆中捡起一个房子大小的红色乐高积木时,爸爸无法用手将它们捆起来。StackO 帮助爸爸将所有的部件连接在一起,形成一个单独的乐高玩具。StackO 最适合将许多小片段放入一个表单中。StackO 还可以连接不同种类的零件。爸爸可以有一个建筑大小的红色、蓝色和绿色的乐高积木。
在 RangO 和 StackO 的帮助下,爸爸不再害怕挑选乐高积木,这就是为什么爸爸总是很高兴回到你身边。
LEGO 集合表示具有数百个信息片段的大量数据。毫无疑问,这种搜索和挑选工作只在很小的体积上进行,但是它不能扩展。数据呈指数级增长,而运营仅呈线性发展。 RangO 和 StackO 不过是数据准备、数据清理和数据存储的技术工具。
现实生活中的大数据并不局限于这些简单的流程,但为了让好奇的访问者了解大数据,有必要展示其中一个核心概念。我们害怕我们无法理解的东西。大数据不是复杂的操作,而是大规模的简单操作。
大数据不是复杂的操作,而是大规模的简单操作
我叫 Nam Nguyen,我写关于大数据的文章。享受你的阅读?请在 Medium 和 Twitter 上关注我,了解更多更新。
为巴黎的一家广告技术巨头工作
towardsdatascience.com](/a-day-in-the-life-of-a-big-data-engineer-a286e4a5ae29) [## 阮怀南
阮怀南的最新推文(@namnguyen168)。热爱机器学习的技术极客。法国巴黎
twitter.com](https://twitter.com/namnguyen168)
向你奶奶解释深度学习神经网络
“除非你能向你的祖母解释,否则你不会真正理解某事”
不知道这句话最初是从哪里来的,它有时被部分归因于阿尔伯特·爱因斯坦。
无论如何,这篇文章是我的尝试(向我自己和其他人)解释神经网络(NN)算法如何以一种简单、新手、直接和高级的方式工作,没有任何公式、方程或代码。我完全知道下面的文字可能有些不准确,但是为了避免复杂的解释和保持简单,这是很自然的,否则你的奶奶不会明白…
在我们开始之前,我想感谢由杰瑞米·霍华德和雷切尔·托马斯创立的 fast.ai ,这是一个专注于深度学习和人工智能的非营利研究小组。我已经从他们的免费在线课程中学到了很多,而且我还在继续学习。
哦…我在最后写了这篇文章的摘要,以防你想直接看。
好吧,我假设如果你读了这篇文章,你至少对 NN 有所了解,所以我就不介绍 NN 是如何在最近几年变得流行起来的,以及它们如何帮助你解决问题了。
那么神经网络算法是如何工作的呢?
一个字:数学。
两个字:矩阵乘法。
如果你的祖母不理解这个解释,那么你可以告诉她我们从输入层开始,这是神经网络模型的输入数据。
输入图层形状为( 1,n) ,意为 1 行和 n 列。我们也可以称之为张量,把张量想象成一个可以容纳 N 维数据的容器。向量是 1D 张量,矩阵是 2D 张量。
一定要注意 NN 中张量的形状
如果我们的数据是表格形式的,那么这个输入层代表我们表格中的一行,这意味着一个具有 n 个特征的观测值。假设我们想用 NN 来预测房子的价格,那么 Xs 可以是房间数量、位置、是私人住宅还是大楼中的公寓、楼层数等。如果我们的数据是一个图像,那么输入层代表一个像素,其中x是该像素的波段/通道,例如,红色、贪婪和蓝色。
你猜怎么着让我们把它变得更具体,我会在示意图上加一个数字。所以现在我们有了这个:
正如你所看到的,在下面的例子中 n =6。顺便说一下,我刚刚做了这些数字,它们不属于特定的数据集。
接下来,我们将输入层乘以一个矩阵,这个矩阵可以称为权重矩阵。
为了使乘法有效,我们需要确保输入层中的列数等于权重矩阵中的行数。这里就是这样,输入层形状是 (1,n) 或 (1,6) ,权重矩阵形状是 (n,m) 或 (6,4) 。虽然我们不能控制权重矩阵中的行数(它必须等于输入层中的列数),但是我们可以将权重矩阵的列数设置为我们喜欢的任何数字。这里,为了简单起见,我将权重矩阵的列数设置为 4。权重矩阵中的数字是完全随机的(NN 就是这样开始的)。示意图中的字母 P 也是随机选择的,因为我需要示意性地表示数字,而 X 已经被输入层取了。
乘法运算结果是:
结果是一个形状为 (1,m) 或 (1,4) 的张量,矩阵乘法就是这样进行的……第一个张量的列数必须与第二个张量的行数相同,结果是一个张量的行数等于第一个张量的行数,列数等于第二个张量的列数。
换句话说: (n,m) @ (m,k) →(n,k)
现在我们把这个结果传递给一个叫做激活函数的函数。有各种各样的激活功能,但这里我们将使用一个常见的称为 ReLU。名字真的不重要。这个函数获取我们的结果(蓝色张量)中的数字,并根据一个非常简单的规则更改里面的数字:如果值大于 0,则保留该值,如果值小于 0,则将其更改为 0。数学上是这样写的: max(0,X)。
请注意,形状没有改变。我们刚刚做的叫做隐藏层。你想加多少都可以。例如,如果我们想添加另一个隐藏层,我们只需重复我们之前所做的。意思是,取(最右边的)蓝色张量,乘以一个 4 行和任意列数的权重矩阵(用随机数),然后在结果张量中将小于 0 的值改为 0,就这样。希望不要混淆,但是我在示意图中选择的蓝色张量中的字母值,只是为了让你知道数字是不同的。
一旦您添加了所有您想要的隐藏层,就该收敛到最终输出了,这意味着模型的预测或估计。为此,我们需要知道我们想要的输出是什么样的。如果是预测房价这样的回归问题,那么我们只需要一个数——shape*(1,1)* 。由此,我们知道我们要乘以的张量的形状应该是什么。如果是分类问题,我们需要一个形状为 *(m,how _ many _ categories _ we _ has)*的张量,在我们的例子中, m = 4 。
为了简单起见,假设我们有一个回归问题,那么:
再次注意形状,为了得到我们想要的形状 (1,1) 的预测,我们必须将我们的蓝色张量 (1,4) 乘以另一个形状为 (m,1) 的张量,这里的意思是 (4,1) 。现在我们得到了模型的预测,我们使用一个叫做损失函数的函数来比较预测值与真实值或实际值。这种比较将使我们了解我们的模型有多好。在我们对我们的模型精度进行第一次估计(通过损失函数)之后,我们(我指的是 NN 算法)改变权重矩阵中的数字(黄色的),以便模型精度会更好。我们不断重复这个过程,直到我们有我们想要的精度。
神经网络是如何工作的——摘要
1)我们获取输入数据
2)我们将它乘以一个带有随机数的矩阵
3)我们改变所有值< 0 to 0, and do not change when value> 0
4)我们根据需要重复步骤 2 和 3 多次
5)我们将结果乘以最终张量以获得模型预测
6)我们使用一个函数(称为损失函数)将模型预测值与真实值进行比较,这将给出模型准确度的值
7)我们改变第 2 步和第 5 步中矩阵中的所有数字,这样精确度会好一点
8)我们重复所有步骤,直到我们对精确度满意为止
嗯,就是这样。我希望这足够清楚和简单。如果你明白了,或者至少你认为你明白了,只有一种方法可以证明。试着向你的奶奶解释,或者随便找一个奶奶(但是要征得她的完全同意😊)
向六岁小孩解释 Hadoop MapReduce
好奇的头脑永远不知道自己的极限
在向我六岁的孩子解释大数据时,我履行了一个父亲的职责。尽管如此,我还是感觉到了对答案明显的不满。
我不确定原因。要么是我让我的孩子在拆他最喜欢的乐高玩具时心烦意乱,要么是我的解释不够有教育意义。无论如何,我必须想出另一个计划。
爸爸,什么是大数据?
towardsdatascience.com](/explain-big-data-to-a-six-year-old-71e341e5da45)
毫无疑问,我的孩子已经掌握了一两件关于大数据的事情,但大数据不仅仅是这些。我回忆了我成为大数据工程师的历程。我想到了我最初是如何理解它的每个核心概念的。MapReduce 这个词突然出现在我的脑海里。
在我职业道路的开端,Hadoop MapReduce 是我遇到的第一个关键想法。它帮助我获得了如何利用常见操作在大数据上执行大规模计算的概念。
我想这对于我六岁的孩子来说是另一个合适的概念。相比之下,我变得更加沮丧。
我不知道如何向我的孩子解释 MapReduce。
它没有任何关于计算机如何工作的线索。天真的头脑怎么可能理解 Hadoop MapReduce 的原理呢?
当我们进行这种对话时,一切都变了
- 爸爸,你最喜欢的食物是什么?
- 嗯,我喜欢披萨,你呢?
- 我喜欢冰淇淋。我太爱他们了,我长大后想娶一个冰淇淋。
就在那一刻,我的内心有了火花。我的孩子对这种喜爱的食物的热情可能是我的 MapReduce 去神秘化的关键。
那是一个炎热的夏日。我和我的宝宝站在一辆冰淇淋车前。卖冰淇淋的人友好地问我们想要什么样的冰淇淋。我不喜欢任何一个,所以我让我的孩子决定。
- “爸爸,我想吃三色冰淇淋——它在我耳边轻声说道
- 那就两筒三色冰淇淋吧——我向忙碌的冰淇淋小贩下了订单
卖冰淇淋的人做了三勺巧克力、香草和草莓口味的冰淇淋。然后,他把这些放在一个褐色的华夫饼干筒上。
照片由弗洛伦西亚·维亚达纳在 Unsplash 拍摄
我的宝宝对它的新鲜冰淇淋很满意,毫不犹豫地开始享用。突然,一个 MapReduce 的图像闪过我的脑海。我都想明白了。我让我的宝宝停下来吃第一口。我说:“我的宝贝,我用你的三色冰淇淋给你解释 Hadoop MapReduce”。
你看到那个带着巨大冰柜的卖冰淇淋的人了吗?那是成吨的冰淇淋。每天他都要处理顾客的冰淇淋需求。想象一下,每个人都和你一样喜欢三色冰淇淋。卖冰淇淋的人必须提供那种独特的冰淇淋。
但是制作合适的三色冰淇淋需要时间。卖冰淇淋的人必须先从冰淇淋容器里拿勺子。在那里,他必须把它们放在华夫饼干筒的正确位置上,然后把它们送到顾客手中。爸爸打赌他可以这样做一整天。
想象一下那些冰淇淋容器变成了一大堆冰淇淋。成堆的冰淇淋可以让卖冰淇淋的人站在它们的树荫下。冰淇淋车现在每小时吸引成千上万的顾客。不管卖冰淇淋的人有多熟练,他永远也赶不上节奏。
作为一名大数据工程师,爸爸伸出手来帮助卖冰淇淋的人。爸爸不知道如何制作一个漂亮的冰淇淋勺,但他知道如何快速制作。像往常一样,爸爸有一些朋友帮助他。这一次他将他们分成两组:映射器和减速器。
映射器是做什么的?他变了。一位制图师牺牲自己的生命来制作完美的冰淇淋勺。卖冰激淋的人的琐碎任务成了地图绘制者的生活目标。每一个都有三种口味的巧克力、香草和草莓。出色的制图者不能在组内竞争。每个制图者在不同的时间完成他的任务。它们都有助于还原剂使用的公共池。
手上拿着华夫饼干的减速器,正在等待制图者完成他们的任务。地图绘制者已经准备好了冰淇淋勺。减速器只需将它们从公共池中取出。每个减速器每分钟能够输送数千个三色冰淇淋。这种效率使得卖冰淇淋的人能够取悦他的顾客。
卖冰淇淋的人很满足,因为他想招待多少顾客就可以招待多少顾客。那些绘制者和缩减者总是关注他们唯一的可能性。他们从未让他失望。“我的孩子,你现在可以继续享用你最喜欢的三色冰淇淋了。请记住,一项简单的工作可能会因为大量的投入而变得不可能。在测绘员和减速器的帮助下,我们可以克服障碍”。
Hadoop MapReduce 的强大之处在于其组件定义明确的职责。它使我们能够将大量的工作分成单个工人就能完成的小块。
理解 Hadoop MapReduce 是每个大数据工程师的职责。它为其他大数据计算算法奠定了基础。这完全是利用平庸的计算机来获得计算能力。它激发了使用大数据的想法。
我叫 Nam Nguyen,我写关于大数据的文章。享受你的阅读?请在 Medium 和 Twitter 上关注我,了解更多更新。
大规模建立端到端系统
towardsdatascience.com](/how-to-build-a-scalable-big-data-analytics-pipeline-7de18f8be848)
用手工计算解释线性回归
这可能很疯狂,但这将帮助你从线性回归中了解更多。
在我看来,线性回归是数据科学中最简单的话题之一。使用线性回归,您可以获得两组变量(自变量和因变量)之间的相关性。我确信许多人已经熟悉了在不同的软件或编程工具中使用线性回归。比如在 Excel 中,你可以通过数据分析求解线性回归;在 Python 中,可以使用 statmodels 或 scikit-learn 模块。但在本文中,我将通过手动计算进行多元线性回归,并解释一些常见变量背后的意义。
我们开始吧。
(PS:在本文中,线性回归的所有基本假设都是有效的,例如,同方差,关系是线性的,没有多重共线性)
以下是本次演示的数据集:
线性回归的目的是创建一个模型,以方程的线性形式显示因变量(Y)与自变量(X)之间的关系。如果只有一个独立变量,这将被称为简单线性回归。如果超过一个,那么这将被称为多元线性回归。自变量和因变量之间的关系反映在系数上。系数的数学定义是因变量相对于自变量的偏导数。通俗地说,系数就是告诉你一个自变量增加 1,而其他自变量保持不变时,因变量的变化。除了这些变量,还有一个常数叫做截距,方程中还有一个误差。截距将不受独立变量的值的影响,而误差团队捕获模型无法解释的随机误差。
下面是线性回归的一般方程:
yᵢ代表第 I 次观察的因变量;xᵢₖ代表第 I 次观测的自变量,β₀代表截距,βₙ代表 xᵢₖ的系数;最后,εᵢ代表误差团队进行第 I 次观察。在我们的例子中,只有一个独立变量。因此,等式变成了
对于ε有一些假设。第一个假设是ε的均值为 0。第二个假设是ε有一个恒定的方差,并且是不相关的。更常见的是,ε也被假设为独立同分布(也称为 iid)。
为了得到β₀和β₁的值,最主要的两种估计方法是最小二乘估计和最大似然估计。今天我只解释最小二乘估计。
最小平方估计
定义:
- b₀和 b₁代表β₀和β₁的估计值
- ŷ代表 y 的估计值;ŷᵢ = b₀ + b₁ xᵢ
- eᵢ代表实际 yᵢ和估计ŷᵢ之间的残差
最小二乘估计的目标是估计β₀和β₁,使得残差平方和(SSE)最小。在数学表述中,SSE =σ(yᵢ-ŷ)=σ(yᵢ-(b₀+b₁xᵢ)。从等式中,你会明白为什么这种方法被称为最小二乘估计。
为了估计 b₀和 b₁的值,需要偏导数,我不会详细说明。b₀和 b₁的最终方程式如下:
所以在例子中,x̄=(1+3+5+8)/4 = 4.25;ȳ = (5+9+18+25)/4 = 14.25.sₓᵧ=(1–4.25)(5–14.25)+(3–4.25)(9–14.25)+(5–4.25)(18–14.25)+(8–4.25)(25–14.25)= 79.75;sₓₓ=(1–4.25)+(3–4.25)+(5–4.25)+(8–4.25)= 26.75。因此,b₁ = 79.75/26.75 = 2.98,而 b₀= 14.25–2.98 * 4.25 = 1.58。
稀有
评估线性回归性能的一个常用参数是 R 平方®。但在解释 R 之前,有必要先先解释两个多余的项,总平方和(SST),回归平方和(SSR)。SST、SSR 和 SSE 都显示了不同度量的变化。
SST 显示了观察到的因变量的变化;SSR 显示了回归解释的变异;SSE 显示了回归线周围的变化。通过简单的计算,可以发现 SST = SSR + SSE,aka 观察到的因变量的总变异是回归模型解释的变异和未解释的变异之和。
在示例中,SST =(5–14.25)+(9–14.25)+(18–14.25)+(25–14.25)= 242.75。SSE =(5-(1.58+1 * 2.98))+(9-(1.58+3 * 2.98))+(18-(1.58+5 * 2.98))+(25-(1.58+8 * 2.98))= 4.99。SSR = 237.76。
r 等于 SSR/SST 或 1-SSE/SST。因此,当 R 较高时,它表示回归可以捕捉观察到的因变量的大部分变化。这就是为什么我们可以说当 R 很高时回归模型表现很好。在示例中,R = 237.76/242.75 = 0.98
一旦我们计算了 R,我们就可以立即计算相关性®。相关值只是 r 的平方根,符号与 b₁.相同因此,本例中的相关性为 0.99。
在面试中,更常见的是被问及一个特定模型的不同变量的原理和解释。应用并不困难,因为已经有许多工具来执行计算。但是为了完全理解如何解释所获得的结果,理解背后的原理也是重要的。
我希望这篇文章能帮助你更多地了解线性回归,以及你应该如何解释回归中的一些常见变量。希望你喜欢。下次见。
我的其他文章
如果您是 Python 新手(尤其是自学 Python 的话),请将此加入书签
用数学细节解释支持向量机
数学中的超平面、最大边缘、硬边缘、软边缘
支持向量机(SVM)是一种监督机器学习算法,通常用于解决二分类问题。它还可以应用于多类分类问题和回归问题。这篇文章描述了二进制线性支持向量机背后的数学原理。理解数学有助于在实践中实现和调整模型。此外,您可以从头开始构建自己的支持向量机模型,并与 Scikit-Learn 中的模型进行比较。详细内容,你可以和我的另一篇文章一起阅读这篇文章。
具体来说,本报告解释了线性支持向量机的关键概念,包括硬边界和软边界情况下的原始形式及其对偶形式;支持向量的概念、最大间隔和泛化过程。
SVM 的核心概念
假设我们有 n 个训练点,每个观测值 I 有 p 个特征(即 x_i 有 p 维),并且在两个类 y_i=-1 或 y_i = 1 中。假设我们有两类线性可分的观测值。这意味着我们可以通过我们的特征空间画一个超平面,使得一个类的所有实例都在超平面的一边,而另一个类的所有实例都在另一边。(p 维的超平面是 p-1 维的子空间。在下面的二维例子中,超平面只是一条线。)我们将超平面定义为:
其中w是 p 向量,b 是实数。为了方便起见,我们要求\u w = 1,所以量x* \u w+\u b 是从点 x 到超平面的距离。
图片来自维基百科
因此,我们可以用 y = +1/-1 标记我们的类,并且超平面划分类的要求变成:
应该如何选择最佳超平面?
回答这个问题的方法是选择在两个类之间产生最大间隔 M 的平面,这被称为最大间隔分类器。
图片来自维基百科
从前面的图表中,我们可以看到 H1 并没有把这两个阶级分开;对于 H2 和 H3,我们将选择 H3,因为 H3 的利润率更高。数学上,我们选择\u b 和**\u w**来最大化 M,给定约束条件:
定义w = w/M和b = b/M,我们可以将其改写为:
和
支持向量
支持向量是距离分离超平面最近的数据点。它们是最难分类的数据点。此外,支持向量是训练集的元素,如果被移除,其将改变划分超平面的位置。生成权重的优化算法以这样的方式进行,即只有支持向量确定权重,从而确定边界。数学上支持向量被定义为:
硬利润 SVM
硬边界 SVM 对穿过超平面的支持向量非常严格。它不允许任何支持向量被分类到错误的类别中。为了最大化超平面的间隔,硬间隔支持向量机面临优化问题:
软边际 SVM 和超参数C
一般来说,类不是线性可分的。这可能是因为阶级边界不是线性的,但往往没有明确的边界。为了处理这种情况,支持向量机添加了一组“松弛变量”,这些变量允许几个点偏移到甚至跨越边距,如下图所示:
作者图片
我们希望在最大化利润宽度的同时最小化总松弛量,这被称为软利润支持向量机。这被更广泛地使用,并且目标函数变成:
对于某些常数 C 。这个优化问题被称为原始问题。常数 C 代表时差的“成本”。当 C 小时,允许更多的点进入余量以获得更大的余量是有效的。更大的 C 将产生具有更少支持向量的边界。通过增加支持向量的数量,SVM 减少了它的方差,因为它更少地依赖于任何单独的观察。减少方差使模型更一般化。因此,减少 C 将增加支持向量的数量并减少过拟合。
使用拉格朗日乘数:
两个限制
我们可以将约束优化问题重写为原始拉格朗日函数:
我们可以根据之前为 w 、 b 获得的关系,最大化乘数,而不是根据约束最小化 w 、 b 。这被称为对偶拉格朗日公式:
这现在是一个相当简单的二次规划问题,用序列最小化优化来解决。有很多编程工具可以用来解决优化问题。你可以使用 Matlab 中的 CVX 工具来解决这个问题。或者熟悉 python 的话,可以用 CVXOPT 包来解决。我有在 Medium 的另一篇文章讨论 CVXOPT 包的使用,以及如何应用它来解决对偶公式中的 SVM。一旦我们解决了这个问题,我们就可以很容易地计算出系数:
浏览支持向量机算法背后的数学知识肯定有助于理解模型的实现。它为正确的问题选择了正确的模型,并为超参数选择了正确的值。
希望这有所帮助。感谢大家的阅读!这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!
我快乐的地方
zzhu17.medium.com](https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3) [## 阅读朱(以及媒体上成千上万的其他作家)的每一个故事
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
zzhu17.medium.com](https://zzhu17.medium.com/membership)
自己解释!利用语言模型进行常识推理
活动讲座
Nazneen Rajani | TMLS2019
【https://torontomachinelearning.com/ 号
关于演讲者
Nazneen Fatema Rajani 是 Salesforce Research 的高级研究科学家。领英
关于谈话
深度学习模型在需要常识推理的任务上表现不佳,这通常需要某种形式的世界知识或对输入中不立即存在的信息进行推理。我们以自然语言序列的形式收集人类对常识推理的解释,并在一个名为常识解释(CoS-E)的新数据集中突出标注。
我们使用 CoS-E 来训练语言模型,以自动生成解释,这些解释可以在新颖的常识自动生成解释(CAGE)框架中的训练和推理期间使用。凯奇在具有挑战性的常识问答任务中提高了 10%的技术水平。我们进一步研究 DNNs 中的常识推理,使用人类和自动生成的解释,包括转移到域外任务。实证结果表明,我们可以有效地利用语言模型进行常识推理。
通过深度学习对新冠肺炎 X 射线分类器的可解释性和可见性
关键词:深度学习,Grad-CAM,X 射线,新冠肺炎
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
目的
在复活节的周末,我接触了一些用于新冠肺炎肺的深度学习分类器。演示结果看起来很好,似乎与当时关于这个主题的一些学术研究出版物相匹配。但是真的“没事”吗?
最近我碰巧听了一个关于“机器学习中的可解释性”的在线午餐网络研讨会,演讲者在最后谈到了这个分类结果:
上图也在这篇研究论文中呈现:“我为什么要相信你?”解释任何分类器的预测。我们可以看到,分类器实际上被训练为将背景像素(例如,雪等野生环境)作为主要输入来分类它是宠物狗还是野狼。
这唤起了我以前的兴趣,现在肯定激起了一点好奇心:
- 我们如何“研究”这些通常以“黑盒”形式出现的新冠肺炎分类器,以了解哪些像素实际上促成了“新冠肺炎肺”的结果?
- 在这种情况下,我们可以利用的最简单的方式或最简单的工具是什么?
这是旅途中另一个 10 分钟的笔记。
范围
幸运的是,在过去的几年里,出现了各种 CNN 衍生分类器的便利工具:
我们将使用 Grad-CAM 对我们之前的新冠肺炎肺分类器做一个快速演示。
**“tensor flow 2 . 2 . 0 RC+Jupyter”**Docker 用于搭载英伟达 T4 GPU 的 AWS Ubuntu 16.04 服务器上。Tensorflow 2 提供了一个简单的“梯度带”实现。
下面是我在 Ubuntu 服务器上启动它的快速提示:
docker run -itd — runtime=nvidia -v /zhong/tf/:/tf -p 8896 :8888 -p 6026 :6006 — name tf-gpu2 tensorflow/tensorflow: 2.2.0rc2-gpu-py3-jupyter
方法
你可以放心地忽略上面 Grad-CAM 研究出版物中引用的一点数学知识。
这里引用它只是为了我们对最初的提议(在第 4 页& 5) 与后来使用的 Python 代码进行持续的交叉检查,希望结果也有更好的透明度。
(1):为了获得任何类别 c 的宽度 u 和高度 v 的类别区别定位图,我们首先计算类别 c 的分数 yc(在 softmax 之前)相对于卷积层的特征图 Ak 的梯度。这些流回的梯度被全局平均汇集,以获得目标类的神经元重要性权重 ak。(2):在为目标类 c 计算 ak 之后,我们执行激活图的加权组合,并在其后跟随 ReLU。这会产生一个与卷积特征图大小相同的粗略热图。
试验
现在让我们尝试一下目前为止我们能找到的最简单的编码:
1。导入包
import tensorflow as tf;
print(tf.__version__)
2.2.0-rc2
import tensorflow as tf
import tensorflow.keras.backend as K
from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.inception_v3 import preprocess_input, decode_predictions
import numpy as np
import os
import imutils
import matplotlib.pyplot as plt
import cv2
2。加载我们之前训练并保存的 模型
new_model = tf.keras.models.load_model('saved_model/inceptionV3')
new_model.summary()
我们可以看到,在最终的全球平均池之前,我们模型中 4D 的最后一个 CNN 层被称为“ mixed10 ”。
3。计算 Grad-CAM 热图
下面是一个简单的热图,实现了上面的 Grad-CAM 方程(1)和(2)。在本帖中有解释。
with tf.GradientTape() as tape:
last_conv_layer = model.get_layer('mixed10')
iterate = tf.keras.models.Model([model.inputs], [model.output, last_conv_layer.output])
model_out, last_conv_layer = iterate(testX)
class_out = model_out[:, np.argmax(model_out[0])]
grads = tape.gradient(class_out, last_conv_layer)
pooled_grads = K.mean(grads, axis=(0, 1, 2))
heatmap = tf.reduce_mean(tf.multiply(pooled_grads, last_conv_layer), axis=-1)
在我们的例子中,它将生成一个(27,6,6)的 heatmap numpy 数组。然后,我们可以将它调整到原始 X 射线图像的大小,并将其覆盖在 X 射线图像的顶部——就这样。
然而,在这种情况下,我们将使用一个稍微更详细的版本,这个版本在本文中也有很好的解释。它使用 Grad-CAM 热图编写了一个函数,该热图的大小已经调整为原始 X 射线的大小:
# import the necessary packages
from tensorflow.keras.models import Model
import tensorflow as tf
import numpy as np
import cv2class GradCAM:
def __init__(self, model, classIdx, layerName=None):
self.model = model
self.classIdx = classIdx
self.layerName = layerName
if self.layerName is None:
self.layerName = self.find_target_layer()def find_target_layer(self):
for layer in reversed(self.model.layers):
# check to see if the layer has a 4D output
if len(layer.output_shape) == 4:
return layer.name
raise ValueError("Could not find 4D layer. Cannot apply GradCAM.")def compute_heatmap(self, image, eps=1e-8):
gradModel = Model(
inputs=[self.model.inputs],
outputs=[self.model.get_layer(self.layerName).output,
self.model.output])
# record operations for automatic differentiation
**with tf.GradientTape() as tape:
inputs = tf.cast(image, tf.float32)
(convOutputs, predictions) = gradModel(inputs)
loss = predictions[:, self.classIdx]**
**# use automatic differentiation to compute the gradients
grads = tape.gradient(loss, convOutputs)**
# compute the guided gradients
castConvOutputs = tf.cast(convOutputs > 0, "float32")
castGrads = tf.cast(grads > 0, "float32")
guidedGrads = castConvOutputs * castGrads * grads
convOutputs = convOutputs[0]
guidedGrads = guidedGrads[0]
weights = tf.reduce_mean(guidedGrads, axis=(0, 1))
cam = tf.reduce_sum(tf.multiply(weights, convOutputs), axis=-1)# resize the heatmap to oringnal X-Ray image size
(w, h) = (image.shape[2], image.shape[1])
heatmap = cv2.resize(cam.numpy(), (w, h))# normalize the heatmap
numer = heatmap - np.min(heatmap)
denom = (heatmap.max() - heatmap.min()) + eps
heatmap = numer / denom
heatmap = (heatmap * 255).astype("uint8")# return the resulting heatmap to the calling function
return heatmap
4。装一张新冠肺炎肺部 x 光片
现在,我们加载一个从未在模型训练和验证过程中使用过的测试 X 射线。(也上传到了之前的帖子里)
filename = ‘./test/nejmoa2001191_f1-PA.jpeg’
orignal = cv2.imread(filename)
plt.imshow(orignal)
plt.show()
然后调整大小为 256 x 256,并将其规范化为像素值在 0.0 和 1.0 之间的 numpy 数组“dataXG”。
orig = cv2.cvtColor(orignal, cv2.COLOR_BGR2RGB)
resized = cv2.resize(orig, (256, 256))
dataXG = np.array(resized) / 255.0
dataXG = np.expand_dims(dataXG, axis=0)
5。进行快速分类
现在我们可以调用上面新加载的模型来进行快速预测
preds = new_model.predict(dataXG)
i = np.argmax(preds[0])
print(i, preds)
0 [[0.9171522 0.06534185 0.01750595]]
所以被归类为 0 型——新冠肺炎肺,概率为 0.9171522。
6。计算 Grad-CAM 热图
# Compute the heatmap based on step 3
cam = GradCAM(model=new_model, classIdx=i, layerName='mixed10') # find the last 4d shape "mixed10" in this case
heatmap = cam.compute_heatmap(dataXG)#show the calculated heatmap
plt.imshow(heatmap)
plt.show()
7。在原始 x 光片上显示热图
# Old fashioned way to overlay a transparent heatmap onto original image, the same as above
heatmapY = cv2.resize(heatmap, (orig.shape[1], orig.shape[0]))
heatmapY = cv2.applyColorMap(heatmapY, cv2.COLORMAP_HOT) # COLORMAP_JET, COLORMAP_VIRIDIS, COLORMAP_HOT
imageY = cv2.addWeighted(heatmapY, 0.5, orignal, 1.0, 0)
print(heatmapY.shape, orig.shape)# draw the orignal x-ray, the heatmap, and the overlay together
output = np.hstack([orig, heatmapY, imageY])
fig, ax = plt.subplots(figsize=(20, 18))
ax.imshow(np.random.rand(1, 99), interpolation='nearest')
plt.imshow(output)
plt.show()
(842, 1090, 3) (842, 1090, 3)
这似乎表明我们的新冠肺炎演示分类器“相信”患者在“右气管旁条纹”周围有一点“不透明”问题?我真的不知道,除非我和真正的放射科医生核实一下。
好了,让我们再尝试一些从真实案例提交到 GitHub 存储库中的测试图片:
filename = ‘./test/1-s2.0-S0929664620300449-gr2_lrg-b.jpg’
[9.9799889 e-01 3.8319459 e-04 1.6178709 e-03]]
这似乎也是一个合理的新冠肺炎解释,表明问题更多发生在左心线区域?
让我们试试另一种随机测试 x 光:
filename = ‘../Covid_M/all/test/covid/radiol.2020200490.fig3.jpeg’
0 [[0.9317619 0.0169084 0.05132957]]
令人惊讶的是,这看起来并不完全正确,但再看看它似乎也不太离谱,对不对?它显示了两个问题区域——主要问题在左侧,一些问题在右侧,与人类放射科医师的标记有些一致?(同时希望它不是在人类标记上训练——这是另一个层次的可解释性问题)。
好了,我就说到这里,因为我不确定会有多少人对阅读这份 10 分钟的简短记录感兴趣。
好了,我就说到这里,因为我不确定是否有太多的人会对阅读 X 射线感兴趣。
为什么?
那么,我们为什么要为此烦恼呢?为什么我们要触及这个话题并记下来以备后用?
我个人深深体会到“可解释性”和“可解释性”的重要性,以及实现它们的任何技术方法。任何进入这个维度的微小尝试都是值得努力的,不管它们有多微小。最终,“数据公平”、“数据公正”和“数据信任”将建立在数字经济的过程透明性之上。此外,它现在开始变得可用。现在我们有越来越多的研究和工具,就在今天人工智能开发者的指尖。
最后但同样重要的是,具体到这个演示,我对这种工具的一个欣赏是,它甚至不需要像素级标记,它试图自动为您生成肺部病变区域,有点半自动标记。在真实作品中是有意义的。我确实记得去年我的一个放射科朋友帮助我为 U-Net 训练一次又一次地为一些骨折数据生成一些像素级标签——这种练习确实伤害了我们的眼睛。
然后
我现在有点走神了。得益于过去 10 多年来深度学习的快速发展,医学成像是人工智能领域中相对成熟的方向。它值得一些好时光。然而,接下来我希望我们可以在 NLP 方面做更多的尝试,如果我们有一点时间的话。
确认
所有的资料来源都已在需要的地方插入上述文本。如果需要,我会放入更多的参考资料。
免责声明:
同样,上面应该是一个快速笔记,以防如果我现在不记录它,几周后它就消失了。都是作为一个“开发者”的个人看法。内容和文本可以根据需要随时修改。以上更多的是展示想法和方法,而不是临床解释,这将需要专业的放射科医生在良好的数据数量和质量上建立黄金法则。
前贴:10 分钟内新冠肺炎肺部 X 线分类和 CT 检测演示
下一篇文章:将新冠肺炎模型部署到一个统一的人工智能演示平台上
【https://community.intersystems.com】最初发表于。
可解释的人工智能和人工智能的可解释性
苹果 | 谷歌 | SPOTIFY | 其他
Bahador Khaleghi 在 TDS 播客
编者按:迈向数据科学播客的“攀登数据科学阶梯”系列由 Jeremie Harris 主持。Jeremie 帮助运营一家名为sharpes minds的数据科学导师初创公司。可以听下面的播客:
如果我让你解释为什么你会读这篇博客,你可以用很多不同的方式来回答。
例如,你可以告诉我“这是因为我喜欢它”,或者“因为我的神经元以特定的方式激活,导致我点击了广告给我的链接”。或者你可以更进一步,把你的答案和量子物理的基本定律联系起来。
关键是,为了有效,解释需要针对一定的抽象层次。
在生活中确实如此,但在机器学习中也是如此,可解释的人工智能作为一种确保模型正常工作的方式,以对我们有意义的方式,受到了越来越多的关注。理解可解释性以及如何利用它变得越来越重要,这就是为什么我想与 H20.ai 的数据科学家 Bahador Khaleghi 交谈,他的技术重点是机器学习中的可解释性和可解释性。
我们的谈话涵盖了很多领域,但这里有一些我最喜欢的要点:
- 明确如何分解数据科学生命周期非常重要。尽管在数据探索和预处理之间,或者在特征工程和建模之间并不总是有明确的界限,但是将分析数据的过程分成定义明确的块会使您的工作更加模块化,并使协作更加容易。
- 最近,无论是行业还是监管机构,对可解释人工智能的兴趣都有了巨大的提升。这主要是因为我们使用的模型越来越复杂,因此其行为越来越难以解释。鉴于我们现在依赖机器学习来实现许多任务关键型应用,如无人驾驶汽车、贷款审批甚至医疗程序,可解释性将变得更加重要,作为确保模型不会表现出危险或意外行为的一种方式。
- 不太可能被输入中的微小变化所迷惑的模型被称为“稳健的”,事实证明,可解释的模型往往也更稳健。在某种程度上,这有点直观:对你的预测有一个连贯的解释意味着你的推理是合理的,而合理的推理不太可能被一点点噪音打乱。
- autoML 的出现使得可解释性变得更加重要,因为 autoML 本质上把整个数据管道变成了一个黑盒(而不仅仅是机器学习模型)。当您使用 autoML 时,您甚至没有明确地决定如何设计或选择您的功能,您将不会对您的模型的决策过程有太多的可见性,这就为问题和病态敞开了大门。
你可以在 Twitter 上关注巴哈多,在 Medium 上阅读他的一些帖子这里和这里。
你可以在推特上关注我。
订阅《走向数据科学》的月刊,直接在你的邮箱✨中接收我们最好的文章、视频和播客
可解释的人工智能:shapely 值在营销分析中的应用
直觉的介绍性指南,以及用 Python 实现营销分析的 SHAP
照片由 Artyom Kim 在 Unsplash 上拍摄
XAI:可解释的 AI 。来源:作者图片
最近,我偶然发现了一份白皮书,其中谈到了人工智能在营销分析中的最新应用。具体讲了 XAI(可解释 AI)在营销组合建模【白皮书】中的应用。这引起了我的注意,我开始探索三件事:XAI,营销分析的现状,以及 XAI 在营销分析中的潜在应用。在浏览了所有可用资源后,我意识到 XAI 在重塑营销分析方面有着巨大的潜力。
在本文中,首先我们将讨论与营销分析现状相关的具体挑战及其解决方案。其次,我们将尝试开发一个关于 XAI 的直觉,最后,我们将在一些公开可用的营销数据集上实现 XAI。
与营销分析现状相关的挑战及其可能的解决方案:
存在许多挑战,但与营销分析现状相关的三个重大挑战与所用模型(GLMs:广义线性模型)的准确性、渠道属性以及市场反应中固有的非线性相关。鉴于这些挑战,我们将讨论 XAI 如何解决与 GLMs、渠道归属相关的问题,以及与非线性相关的其他问题。作为介绍,我们将在本节非常简要地讨论一些挑战及其解决方案;然而,随着本文的深入,我们将详细讨论每一件事。
- GLMs
**现有挑战:**广义线性模型(GLMs)被广泛用于整个行业的营销组合建模。GLM 的附加性质有助于我们很容易地确定营销渠道对销售收入的贡献。与 GLMs 相比,现代算法要精确得多,但这些算法更像是黑盒模型,缺乏可解释性。因此,工业上广泛使用 GLM 的唯一原因是因为它易于解释。
可能的解决方案: XAI 为我们提供了一种解释任何黑箱模型的极好方法,因此它为我们使用高度精确的集合模型代替 GLMs 打开了大门。因此,现在在高精度集合模型的帮助下,我们不仅在精度上而且在可解释性上胜过 GLMs。
2。频道归属
**现有挑战:**这是营销人员最大的痛点之一。由于渠道之间存在相互作用,因此几乎不可能公平地将收益分配给不同的渠道。
**可能的解决方案:**来自合作博弈理论的匀称的价值观来拯救这里。*Shapley 值是一种将总增量收益公平分配给游戏中合作玩家的方法。*在我们的案例中,营销渠道是玩家相互合作以增加收入等指标;我们的目标是将增加的收入公平地分配给营销渠道。谷歌分析也在其数据驱动的归因方法中使用 shapely 值。【来源】
3。不同营销渠道的互动
**现有挑战:**有一些渠道,作为独立渠道,并不是重要的贡献者;然而,与其他渠道相结合可以发挥重要作用。因此,对于营销人员来说,了解互动渠道的不同组合是很重要的。随着通道数量的增加,相互作用的数量显著增加,并且在 GLMs 中包括所有这样的相互作用项变得非常麻烦。
**可能的解决方案:**为了应对这一挑战,我们将再次使用 shapely 值,但方式不同。我们将使用 SHAP 算法来研究大规模渠道的相互作用。【 SHAP 算法是机器学习中 shapely 值的实现,用来解释和诠释任何黑盒 ML 模型。因为,在我们的例子中,我们将用高度精确的基于树的集合模型代替 GLMs,因此我们将使用 SHAP 来解释和说明我们的模型中的通道相互作用。
4。正面影响阈值
**现有挑战:**例如,在电视广告方面,较低的支出可能不会产生任何收入;然而,在一定的最低消费后,电视广告开始显示其积极的影响。另一方面,数字渠道的市场反应函数通常是陡峭的,这意味着您在数字渠道上增加的支出越多,在达到饱和点之前,您看到的对您收入的影响就越大。由于市场固有的动态非线性性质,使用线性模型获得正面影响阈值变得非常具有挑战性。
**可能的解决方案:**我们可以使用非线性的、基于树的集成模型以及解释器模型,而不是使用线性模型。从 explainer 模型中,我们将获得 shapely 值(每个渠道单独的贡献),然后我们可以绘制这些 shapely 值,以获得每个渠道的积极影响阈值。下图显示了电视正面影响阈值的一个例子。
**显示电视广告正面影响阈值的图表:Y 轴是电视广告带来的增量收入(Shapely Value)。x 轴显示电视广告支出。**来源:作者图片
5。每个渠道的最佳支出
**现有挑战:**最佳支出取决于不同渠道的营销响应函数,通常这些营销响应函数本质上是非线性的。例如,如果我们不断增加在某个渠道上的支出,那么在某次支出后,增加的积极影响开始减少。增量影响开始饱和然后最终下降的点,就是我们在该渠道上实现最佳支出的点。
**可能的解决方案:**同样,解决方案与第 3 点相同,基于 shapely 值。然而,唯一的区别是,这里我们必须得到一个点,从这个点开始,我们的图变得渐近,或者在某些情况下开始下降。
鉴于所有这些挑战和解决方案,你可能很想知道与匀称的价值观相关的 5 个问题的答案:
- 为什么我们一直在使用 GLMs?
- 什么是匀称的价值观?
- shapely 值如何用于归因?
- 对于复杂的机器学习模型是如何实现的?
- 如何解释它,以获得可操作的见解?
接下来,本文将尝试回答上述问题。
目录
- 为什么选择营销分析中的 GLMs?
- 得体的价值观
- 匀称的价值观:直觉与实例
- 使用 Shapely 值的机器学习可解释性
- SHAP:营销分析中的一个用例
- 结束注释
- 更多阅读和参考资料
为什么选择营销分析中的 GLMs?
为了理解这一点,让我们将机器学习模型分为两类:一类是简单模型,另一类是复杂模型。简单模型是那些非常容易解释/说明并且准确性低的模型;然而,复杂的模型本质上是黑箱,几乎不可能解释,而且精确度非常高。
简单模型的例子是线性回归模型和决策树。线性模型很容易解释,例如:借助模型方程中特征权重的大小和符号,我们可以了解特征对输出的影响。在决策树的情况下,我们可以通过分裂(基于基尼系数、信息增益或熵)从根节点向下移动到叶节点,并解析树以容易地理解/解释模型。虽然这些模型是高度可解释的,但是这些模型有几个问题:线性模型不准确,因为它们不能解释特征的非线性行为,而决策树也不准确,并且有过拟合的问题。
随着模型复杂性和准确性的增加,模型的可解释性降低。来源:作者图片
与决策树相比,随机森林具有高准确性和非常低的方差/过拟合,但是随机森林具有非常大量的树,这些树不能以如此大的数量来解释。因此,这种模型的可解释性是一个大问题。
如果我有精确的模型,那我为什么要用不太精确的呢?
首先,我们应该理解正确解释模型输出的能力是非常重要的。它有助于建立利益相关者的信任。我们只是不能对我们的利益相关者说,我们应该实施某个模型,因为它非常准确,具有良好的 AUC/ ROC 数,或者具有非常低的均方误差。利益相关者总是对知道一个模型如何做决策感兴趣。
其次,模型中每个特征的可解释性在营销分析中起着非常重要的作用。我们应该知道所有重要特性影响模型结果的方向和程度。这可以通过 GLMs 容易地实现;然而,在复杂模型的情况下,我们确实获得了特征的相对重要性值,但是这些值不是很有帮助,因为它没有告诉我们关于对模型输出的影响的大小和方向的任何事情。
因此,在营销分析中,线性模型因其易于解释而受到青睐,即使不如复杂模型准确。
为了解决复杂模型的可解释性,有一些技术(LIME、Shapely 等)可以用来创建解释模型,这是一个简单的线性模型,可以非常容易地解释复杂模型。我们将在本文中讨论的方法使用合作博弈论中的 shapely 值来创建解释模型。
这里要注意的有趣的事情是,当这些复杂模型与解释模型相结合时,它们不仅在准确性上(很明显)而且在可解释性/可解释性上都优于 GLMs。
接下来,我们将试图通过它的定义和一个例子来发展一种关于匀称的价值观的直觉。然后,我们将继续使用一个非常简单的数据集来实现它的机器学习。
得体的价值观
沙普利值是由诺贝尔经济学奖获得者罗伊德·S·沙普利开发的,作为一种在团队成员中公平分配团队产出的方法。
我们将讨论 shapely value 的定义,但为了更好地理解这个概念,我建议你先跳到示例部分(Shapely Values:直觉和示例),然后再回到定义部分。
定义
形式上,联盟博弈被定义为:给定一个联盟博弈 G(N,ν) ,其中 N 是博弈中玩家的集合, ν 是一个函数(一个特征函数),当这个特征函数作为 **ν(S)应用于每个子集 S 时,它给每个子集 S 分配一个实数。**我们也称ν(S)为联盟 的价值。
如果有 2 个玩家(A,B),那么将有 4 个子集{Null,A,B,AB}。因此,对于子集 AB,我们有ν(AB)作为 A 和 b 的联合值。
ν(S)描述了 S 的成员通过合作可以获得的总期望收益。
Shapley 值是将总收益分配给参与者的一种方式,假设他们都合作。根据 Shapley 值,给定一个联盟博弈 G(N,ν),玩家I得到的金额为
这里, n 是 N 个玩家的总数,‘N \ { I }’表示不包括玩家‘I’的玩家集合。因此,这里的“S”包括可以从“N \ { 1 }”中的玩家中得到的所有子集。对于每个 S,’ |S|’ 表示每个子集中玩家的数量。
对于 S 中的每个子集,’ **|S|!'**表示排列的数目,可以从 S 中的玩家中创建。 (n-|S|-1) 表示除玩家 I 之外的剩余玩家的数目。 (n-|S|-1)!’代表除了玩家 I 之外的剩余玩家可以形成的排列总数
对于 S 中的每个子集, **|S|的乘积!**和 **(n-|S|-1)!**代表 S 和 S 之外的玩家可以形成的排列总数,使用这个乘法是因为对于这些(|S|!*(n-|S|-1)!)组合数参与人‘I’的边际贡献保持不变。
注意:公式考虑了排列,因为玩家的顺序在这里起着重要的作用。这里的事件不是独立的;因此,shapely 值计算考虑了所有可能的排列,然后最终取平均值来计算每个玩家的贡献。
喏, **n!**显示游戏中所有玩家的所有组合所能形成的排列总数,它用于计算可能形成联盟的不同排列的平均贡献。
这个公式乍一看似乎有点令人生畏,但是一旦我们借助一个例子来理解它,它就会变得非常容易理解。在下一节中,我们将通过一个示例计算来培养直觉。
注意:特性函数应满足某些最低属性:
- 单调性:如果联盟中玩家数量增加,收益应该不会减少。
- 超可加性:ν(S ∪ T) ≥ ν(S)+ν(T),若ν(s∪t)=∅;这意味着大联盟的收益最高。
匀称的价值观:直觉与实例
为了进一步简化和更好地理解 shapely 价值观,我们举一个非常简单的例子,一个虚构的新零售店,它只通过电视广告、平面广告和广播广告进行营销。这些营销媒介的结合有助于零售店获得顾客并产生收入。
零售店的老板观察到这些营销媒体的组合为商店带来了更高的收入,但是问题在于通过每种营销媒体获得的收入份额的归属。这些信息非常重要,因为拥有者可以利用这些信息优化营销预算。
这个问题(或游戏)可以借助 shapely 价值观来解决。为了推进这个过程,让我们看看“表 A”的内容,并在上面的 shapely 值的定义和游戏的实际数据之间画出一些平行关系。
“表 A”中的第一列显示了联盟( S,如上面定义中所表示的),其可以使用游戏的参与者(参与者是电视、广播、印刷品)来形成,包括空集(其中没有参与者)。第二列显示对应于第一列中每个联盟的符号。第三列( ν(S)或定义中的“联盟价值”)显示了与第一列中给出的每个子集/联盟相对应的收入。
换句话说,当只显示电视广告时,商店获得 3000 美元的收入,当只显示广播广告时,收入为 1000 美元,类似地,当只显示印刷广告时,收入为 1000 美元。然而,当广播或印刷与电视结合时,收入是其个人贡献总和的两倍,当三者结合时,收入为 10,000 美元。
**表 A:显示了联盟和联盟的价值。**来源:作者图片
我们将使用“表 A”中给出的信息,并使用这些值得出每台电视、收音机和印刷品的 shapely 值(平均边际贡献)。
下表 B 显示了电视、广播和印刷品的 shapely 值的计算。
表 B:显示每种营销媒体的平均边际贡献或匀称价值的计算。来源:作者图片
让我们看看“表 B”中给出的电视 shapely 值的计算方法。第一栏显示不包括电视的联盟。所以有 2 这样的组合包括一个空集 {} 。第二列显示没有电视的收入,即 v(S) 或没有电视的联盟对子集的价值。
第三列示出了包括电视和在表格中表示为’S ∨{ I }'的联盟。第四列显示包括电视在内的联盟收入或价值。第五列显示添加电视后的收入变化或电视的边际贡献,表示为“v(S ∨{ I })-v(S)”。第六列显示玩家总数( n )。
第七列显示了每个子集 S 中的玩家数量。第八列是对于 S 中子集的边际贡献的出现的可能排列总数以及进一步除以 n!对该贡献进行平均。最后一栏是电视机的平均边际贡献总和(6000 美元)。****
类似地,也计算了印刷品(2000 美元)和广播(2000 美元)的平均边际贡献或合理价值。我希望表 A 和表 B 以及它们的计算有助于发展对匀称的价值观的基本理解和直觉。
对 shapely 值的基本理解和直觉很重要,因为本文的下一部分是关于使用 shapely 值的机器学习可解释性。我们将讨论并了解这些匀称的值如何被用于机器学习,特别是在媒体混合建模中。
注 1: 定义联盟的特征功能或“价值”是一个关键步骤,应极其谨慎。在现实世界中,它的定义严重依赖于数据收集的方法。如果您有兴趣阅读在线广告活动归因模型中如何定义特征函数,请参考本文。
注 2: Shapely 值保证解中的唯一性。Shapley 值是唯一满足属性 效率对称性哑元 和的归属方法,这些属性合起来可以认为是一个公平支付的定义。 【出处】****
效率:所有玩家的 Shapley 值之和等于大联盟的值,这样所有的收益都在玩家之间分配。
对称:如果两个玩家对所有可能的联盟贡献相等,那么他们的贡献应该是相同的。
哑元:如果玩家 I 没有给任何联盟增加价值,那么玩家 I 将获得零的有形价值,或者换句话说,获得零奖励。
可加性:设‘a’是来自游戏‘x’的 shapely 值,‘b’是来自游戏‘y’的 shapely 值。那么游戏‘x+y’的 shapely 值就是‘a+b’。
关于公理的更多细节, 参见本书的这一节。
使用 Shapely 值的机器学习可解释性
现在,既然我们对 shapely 值有了基本的了解,那么接下来我们应该讨论如何在机器学习解释中使用 shapely 值,然后我们将讨论它在营销分析中的效用。
让我们看看合作/联盟博弈论中的 shapely 值计算和它在机器学习中的使用之间的并行性。
在机器学习模型的情况下,用作生成机器学习模型的数据的特征值的每个实例充当团队成员,并且机器学习模型的预测充当输出或回报。
为了更直观地理解它,让我们假设我们已经训练了一个机器学习模型,以根据在不同营销渠道上的花费来预测收入。在数据集中,我们有一个数据实例,其中电视等营销渠道的支出为 2000 美元,广播支出为 500 美元,印刷支出为 800 美元。该数据实例的收入预测值为 10 万美元;然而,来自所有数据实例的收入的平均预测值是$80k(基础值)。鉴于这种情况,我们想了解并解释电视、广播和印刷品是如何造成基础价值(8 万美元)和预测价值(10 万美元)之间的差异的。因此,在本例中,电视、广播和印刷品的实例值(支出)充当玩家,任何实例的预测收入充当产出或回报。在这种情况下,每个频道的归属收入可能类似于电视的归属收入为 1 万美元,而广播的归属收入为 6000 美元,印刷品的归属收入为 4000 美元。因此,每个营销渠道的这些归属值有助于我们了解不同营销渠道的支出如何影响我们的增量收入。
在上面的例子中,有两件事情是并行发生的:首先,我们使用了一些机器学习算法进行预测,其次,我们使用 shapely 值来理解数据行/实例的特征行为。因此,对于最准确的预测,我们可以使用任何黑盒复杂模型,同时我们可以使用非常简单的可解释/可解释的 shapely 值来解释特征行为。这种结合解决了复杂模型的可解释性/可解释性的主要问题。
现在,我们对 shapely 值如何适应复杂模型的可解释性有了更高层次的理解。因此,现在是时候更深入地研究和理解 shapely 值的算法实现了。
得体的附加解释(SHAP)
SHAP(SHapley Additive explaints)是一种解释任何机器学习模型输出的博弈论方法。它将最优信用分配与使用博弈论及其相关扩展的经典 Shapley 值的本地解释联系起来。【来源】
SHAP 是一个解释者模型,它有优化的功能,可以借助 shapely 值来解释任何黑盒模型。为了理解 SHAP,我们首先需要知道解释者模型的概念,然后我们将看到这个解释者模型如何适应任何黑盒模型的可解释性。
解释者模型
对于复杂的黑盒模型(如集成模型或深度学习模型),我们使用不同的模型来解释复杂的模型。这样的模型被称为解释者模型**,它是原始模型的一个可解释的近似。解释者模型是一个简单的线性加性归因模型,作用于二元变量。**
讲解器型号
这里,g(z′)是一个解释函数。∅o 是基础值,它代表所有输入关闭时的模型输出。∅i 是要素 I 的 shapely 值。z’要么为零(要素不存在时),要么为一(要素存在时)。m 是简化输入特征的数量。
我们还应该注意到,g(z′)的值与原始模型 f(x)的输出相匹配,它也被称为局部精度**。局部精度也是一个方法获得唯一解所需的三个属性之一。另外两个属性是缺失和一致性。这三个属性保证了博弈论中 Shapley 值的唯一性,因为它们适用于机器学习模型预测的局部解释。要了解更多关于这些属性的信息,请阅读这篇文章。**
为简单起见,让我们假设我们有一个数据集,其中有 3 个特征电视、广播、印刷作为预测变量,收入作为目标变量。我们有 100 行/实例的数据,对于每一行/实例,我们将计算 g(z′)。
对于特征变量(电视、收音机、印刷品)的任何数据实例“j”:
g(z′)等于特征值实例的模型预测值。对于电视、广播、印刷品,z’的值是 1,因为它们有一些实例值。如果有这样一个例子,电视花费了 x t v ,广播花费了 x_tv,广播花费了 xtv,广播花费了x_radio,但是印刷品没有花费,那么在这种情况下我们的 g(z′)将如下。
由于解释器模型在实例或行级别的特征数据上工作,因此它也被称为预测的局部解释**。这个解释模型以 shapely 值的形式直接测量局部特征重要性(也称为 SHAP 值 用于局部特征归属)。当我们组合每个预测的局部解释时,我们得到了全局解释的全局模型结构。**
我们将讨论局部和全局解释,当我们以 python 为例讨论 SHAP 库的用法时,这将变得更加清晰。
这个解释器模型如何与黑盒模型一起工作?
****流程图显示解释器模型将数据和预测值作为输入,并基于 shapely 值创建解释。资料来源——瑞典 PyCon:用拉维·辛格的 SHAP 解释 ML 模型
这个流程图让我们很好地了解了解释器模型如何与黑盒模型协同工作。
利用数据,我们训练黑盒模型,然后将训练好模型与数据一起传递给解释器模型。
该黑盒模型然后被用作预测函数,并且连同特征值一起,该函数被用于计算每个特征的特征重要性(SHAP 值)。SHAP 值是使用下述公式计算的,该公式与 shapely 值计算公式非常相似。
****计算特征 I 的 SHAP 值的公式,例如 x。来源:ML 解释能力的 SHAP 值- Adi Watzman
我们现在正在计算∅i,它是特征 I 在预测中的贡献,它分三步计算,如下所示。
- 首先,我们创建没有特征 i (表示为 S )的所有特征的子集,然后针对 S 中的每个子集,计算具有( f(S U {i}) )和没有( f(S) )特征 I 的预测值
- 其次,我们减去两个预测( f(S U {i})-f(S) ),以获得该特征对于每个子集的边际贡献。
- 最后,我们取上一步计算的所有边际贡献的平均值来得到特征 I 对预测的贡献。
上述 SHAP 值的计算与合作游戏的 shapely 值的计算非常相似。这里唯一的区别是特征函数被黑盒模型代替,这里我们计算的是特征 I 对预测的贡献,而不是对游戏的贡献。
一旦我们获得了所有特征实例的所有 SHAP 值,那么这些 SHAP 值将用于解释模型的局部和全局。
要获得关于 SHAP 价值观的详细信息,请阅读《SHAP 价值观》作者斯科特·M·伦德伯格的论文。
在下一节中,我们将看到如何局部和全局地解释模型,以获得可操作的见解。
SHAP 价值观:营销分析中的一个用例
了解了 SHAP 值后,现在让我们看看如何将它应用到一些营销数据集中。
我们的数据集包括电视广告支出、广播广告支出、报纸广告支出等特征,我们的目标变量是每周产生的销售收入。
我们可以假设这些数据是从营销组合的时间序列数据中创建的横截面数据。尽管这些数据与真实世界的营销组合数据集相差甚远,但即使如此,它也将为我们提供一个很好的想法,即当我们使用它进行营销组合建模时,SHAP 值如何帮助我们获得可操作的见解。
导入库并读取数据集。
这个数据集可以在 Kaggle 上找到。我对该数据集所做的唯一更改是将“销售”列乘以 100。以便它看起来更接近产生销售收入。
我没有关于这个数据集的太多细节,我只是用它来展示 SHAP 值在营销数据集中的应用。
创建训练测试分割,拟合随机森林回归方程,预测并检查误差。
创建解释器模型,然后从 shapely 值创建一个数据框架
有几种方法可以让我们使用 python 中的 shap 库创建解释器模型。我们有形状。 KernelExplainer ,它是模型不可知的,可以用来解释任何机器学习模型。我们也有 shap。 TreeExplainer ,针对基于树的机器学习模型进行了优化。在我们的例子中,我们使用随机森林算法,这是一个基于树的模型,所以我们将使用 TreeExplainer。
让我们仔细看看 SHAP 价值数据框架。
我们可以从上面的数据帧中清楚地看到,对应于测试或训练数据帧中的每个特征值,我们在测试和训练数据集的 shap 数据帧(df_shap_train,df_shap_test)中有一个 shap 值。因此,我们可以看到,对于每个要素的每个数据实例,我们都有一个 SHAP 值。
检查基础值
来源:作者图片
当我们在上面讨论解释者模型时,我们已经讨论了基本值。这个∅o 是基础值。
注意:TreeExplainer 的基值是训练数据集上模型输出的平均值。 [【源 】](http://24. https://github.com/slundberg/shap/issues/352)**
基本值
方法“base”为我们提供了每个数据实例的数组列表。每个数组的前 3 个元素包含要素的 SHAP 值,第 4 个值是基值。在我们的例子中,基础值是 1429.31875。
基础值+ SHAP 值=预测值
让我们比较(基础值+ SHAP 值)和预测值的值。
从该数据框中,我们可以很容易地看到,每个实例的要素的基础值+ SHAP 值等于预测值。
我们在讨论解释者模型的时候讨论过这个关系。因此,对于数据帧的每一行,我们可以看到这种关系是如何成立的。
模型解释
汇总图
汇总图旨在从全局层面解释模型。汇总图有两种类型:第一种显示所有要素的所有 SHAP 值,第二种显示所有要素的聚合值(绝对 SHAP 值的平均值)。我们会看到这些情节,然后讨论如何解读。
训练数据的汇总图:
显示特征平均绝对 SHAP 值的汇总图
上图显示了对应于每个要素的 SHAP 值的汇总视图。它显示了特性的重要性。上面的情节是不言自明的,我不认为它需要任何详细的解释;但是,下面的情节解读起来很有趣。
显示每个特征的所有 SHAP 值的汇总图
显示每个特征的所有 SHAP 值的汇总图
显示所有 SHAP 值的汇总图的组成部分:在 Y 轴上我们可以看到电视、广播、报纸。 X 轴显示 SHAP 值的范围。每个特征对应的个体点就是训练数据集中所有实例的 SHAP 值。右侧的垂直色阶显示特征值是偏高还是偏低。此外,要注意的是,特征以特征的聚合平均绝对 SHAP 值的降序排列。
释义:
****哪个功能的影响最大?由于 TV 具有最高的平均绝对 SHAP 值,因此它对模型输出的影响最大。在我们的例子中,模型输出是销售收入。因此,电视对销售收入的影响最大。同样,我们也可以说收音机和报纸。因为收音机一直排在第二位,所以它对销售收入的影响第二大。
****营销渠道的支出对销售收入有何影响?要回答这个问题,看一下分配给每个特征实例的 SHAP 值的颜色。对于电视来说,剧情右手边(正面)的大部分点都是红色的。这意味着更高的电视广告支出会带来更高的 SHAP 价值或增量销售收入。曲线图还显示,对于较低的电视广告支出(蓝色),我们有负的 SHAP 值。负 SHAP 值表明我们在电视广告上的低支出甚至不能产生与其在该渠道上的支出相等的销售收入。同样,我们可以解释其他渠道的影响。报纸对销售收入的影响不显著,这一点从汇总图中可以明显看出。
依赖图(无交互作用):
****我的电视广告和广播广告支出的市场反应如何?要回答这个问题,我们可以画出单个特征与其 SHAP 值之间的关系图。
广告支出和 SHAP 价值之间的关系是市场对广告支出反应的一个很好的指标。从上面的图中可以明显看出,随着我们增加电视广告支出,我们的 SHAP 价值增加,在特定的电视广告支出后,它开始变得停滞不前。
同样,我们可以为广播广告绘制图表,观察到随着广播广告支出的增加,SHAP 值也在增加。因为我们的计划中没有任何停滞点,所以我们需要继续增加广播广告的支出,直到我们到达任何停滞点。
****电视广告的正面影响阈值是多少?为了回答这个问题,我们将使用电视广告和 SHAP 值之间相同的相关性图,并查看 Y 轴上 SHAP 值为零的地方。对应于该点,我们将在 X 轴上得到一个点,该点是电视广告支出的阈值,从该点开始,电视广告开始对销售收入产生积极影响。
****电视广告的正面影响阈值。来源:作者图片
类似地,我们可以计算收音机的阈值。
广播广告的正面影响阈值。来源:作者图片
交互概要图:
这个图非常重要,它在一个视图中给出了不同频道之间的交互。
互动总结。来源:作者图片
上面的图显示了交互总结。我们可以看到对角线外的相互作用。我已经用红圈标出了可能的相互作用。我们在这里能看到的唯一重要的互动是电视广告和广播广告之间的互动。
既然我们现在知道电视广告和广播广告之间的互动是显著的,那么另一个问题应该是了解它们互动的本质。
依赖图(有交互作用):
****电视和广播之间互动的本质是什么?为了回答这个问题,我们将再次绘制一个依赖图,但这一次是通过交互作用。这是最有趣的情节之一,也有点难以理解。我们先把这个画出来,然后一步一步地去解读它。
每个点代表对应于特定电视广告支出实例的 SHAP 值。y 轴是 SHAP 价值观,X 轴是电视广告支出。颜色基于每个实例的广播广告支出。
****对于低于 150 英镑和高于 150 英镑的电视广告支出,电视和广播的互动性质正好相反。来源:作者图片
为了理解这个情节,让我们看看 150 到 300 之间的电视广告花费窗口。在电视广告花费窗口中,SHAP 值范围从较高到较低的 SHAP 值(0 到 600)。在该窗口中,我们假设电视广告支出约为 220 美元(显示为带黑边的矩形框),对于该特定支出,我们有不同的 SHAP 值,但较高的 SHAP 值也与较高的广播支出相关联。这意味着该窗口的广播广告支出和电视广告支出之间存在积极的互动关系(电视广告支出为 150-300 英镑)。
另一方面,在 0 到 150 的电视广告花费之间的电视广告花费窗口中存在负交互作用。
到目前为止,我们已经完成了对 SHAP 价值观的全球解读,但现在我们将看到对 SHAP 价值观的一些本地解读。可以使用力图进行局部解释。
局部解释力图:
局部解释是指实例级别的解释。我们的实例级别是周的粒度。因此,如果我们想解释营销渠道对特定一周的影响,那么我们应该使用这个图。
为数据实例强制绘图
在上图中,我们可以看到蓝色条和红色条显示了电视、广播和报纸的 SHAP 值。条形的长度代表 SHAP 值的大小。条形的颜色显示 SHAP 值的方向(正或负)。正的 SHAP 值为红色,负的为蓝色。预测值以黑色粗体显示。基准值也已经在线图上标出。每个渠道的实例价值或广告花费价值也会显示出来。我们可以将这些值与上一节中计算的值进行比较,如下所示。
TV SHAP 值是负的,并且条的长度在负方向上最长,显示-563.6 值。广播和报纸是积极的,但非常小,震级分别为 164.7 和 25.96。由于电视、广播和报纸的 SHAP 值之和为负,所以一旦将其加到基值上,我们就得到了预测值,在这种情况下,预测值低于基值。总之,本周业绩不佳的主要原因是电视广告支出低。
因此,到目前为止,我们已经看到了如何在 SHAP 的帮助下,有效地解释任何黑盒模型。还有许多其他变量,如价格、地区、季节性、趋势、广告库存、市场饱和度等;这可以通过一些特征工程包含在营销数据中。即使有这些额外的变量和更多,我们现在可以使用最准确的模型和 SHAP 来整体地解释它们,并获得大规模的可操作的见解。
结束注释
在这篇文章中,我们主要关注属性和媒体混合建模;然而,XAI 在营销和客户分析的其他领域也有巨大的应用,如流失预测、客户保持和决策支持。例如,在客户流失预测的情况下,XAI(本文中讨论的本地解释)可以帮助我们解释特定客户流失的原因或特定客户流失概率高的原因。根据这一解释,我们可以为特定客户量身定制保留策略。此外,XAI 还通过比较业务领域知识和模型行为来帮助我们调试模型。因此,总而言之,XAI 有可能成为分析行业的游戏规则改变者。
最后,我希望在读完这篇文章后,你对合作博弈理论中的价值以及它在营销分析中的高层次应用有一点了解。
请随时发表评论,提出修改建议,并在评论区分享您的观点。
进一步阅读和参考
- https://www.nature.com/articles/s42256-019-0138-9.epdf
- https://papers . nips . cc/paper/7062-a-unified-approach-to-interpretation-model-predictions . pdf
- 归因模型和合作博弈理论
- https://github.com/slundberg/shap
- https://www . H2O . ai/blog/the-benefits-of-budget-allocation-with-ai-driven-marketing-mix-models/
- 用于科学和医学的可解释人工智能
- https://edden-gerber.github.io/shapley-part-1/
- https://christophm . github . io/interpretable-ml-book/Shapley . html
- https://shap . readthe docs . io/en/latest/examples . html # tree-explainer
- *https://github.com/slundberg/shap/issues/352 ***
- PyData Tel Aviv Meetup:ML 可解释性的 SHAP 值— Adi Watzman
- 瑞典 PyCon:理解 ML 黑箱:使用 SHAP 解释 ML 模型
- https://medium . com/@ Gabriel Tseng/interpreting-complex-models-with-shap-values-1c 187 db 6 EC 83
- https://towards data science . com/explain-your-model-with-the-shap-values-BC 36 AAC 4 de 3d
可解释的人工智能:机器学习模型的可解释性
使用石灰的模型可解释性
你能信任你的机器学习模型吗?
安迪·凯利在 Unsplash 上的照片
W 我们为什么要盲目信任机器学习模型?如果我们能够更好地了解模型预测并改进我们的决策,这不是很好吗?随着莱姆和 SHAP 等可解释的人工智能技术的出现,这不再是一个挑战。如今,机器学习模型无处不在,比以往任何时候都更成为我们生活的一部分。这些模型本质上通常是一个黑箱,我们很难评估模型的行为。从内置对话代理的智能扬声器到个性化推荐系统,我们每天都在使用它们,但我们了解它们为什么以某种方式运行吗?鉴于他们能够影响我们的决定,我们应该能够信任他们,这是至关重要的。可解释的人工智能系统帮助我们理解这些模型的内部工作原理。
那么,什么是可解释的人工智能呢?
可解释的人工智能可以总结为理解 ML 模型预测的过程。中心思想是使模型尽可能具有可解释性,这在本质上有助于测试其可靠性和特征的因果关系。概括地说,可解释性有两个方面:
- 可解释性(为什么会这样?)
- 透明度(它是如何工作的?)
通常,可解释的人工智能系统提供对模型输入特征的评估,并识别作为模型驱动力的特征。它给了我们一种控制感,因为我们可以决定是否可以依赖这些模型的预测。例如,如果流感识别模型考虑了体温和咳嗽等比其他症状更重要的特征,我们可能会更信任它。
既然你有了可解释系统的概念,我们如何解释模型预测呢?
做那件事有不同的方法。酸橙就是其中之一。让我们挤压它。
LIME 代表:
L ocal:在被解释的预测的邻域内局部近似,
Iinterpretable:产生的解释是人类可读的,
M 模型不可知的:适用于任何模型,如 SVM、神经网络等Ex 解释:提供模型预测的解释。(模型行为的局部线性解释)
Lime 可用于获得对模型预测的更多见解,如解释模型为何针对单个观察做出特定决策。在不同型号之间进行选择时,它也非常有用。Lime 背后的中心思想是,它通过干扰不同的特征在被解释的实例附近进行局部解释,而不是在整个模型级别产生解释。这是通过在局部分散的、由噪声引起的数据集上拟合稀疏模型来实现的。这有助于将非线性问题转化为线性问题。然后将模型中系数最大的指标变量作为得分的驱动因素返回。
装置
你可以简单地 pip 安装它或者克隆 Github repo :
pip install limepip install . (Git version)
履行
我们将使用 Lime 来解释 sci-kit learn 中内置的糖尿病数据集上的随机森林回归模型的预测。这篇文章假设你已经掌握了一些 Python 和机器学习的知识。为了简单起见,我们不会涵盖我们通常在模型构建管道中遵循的所有步骤,如可视化和预处理。对于模型构建位,你可以在这里克隆回购。
所以,让我们切入正题,看看如何用石灰来解释某个实例。
理解 Lime 预测中的模型行为主要包括两个步骤:
- 初始化一个解释器
- 调用解释 _ 实例
解释模型预测的第一步是创建一个解释器。我们可以使用 Lime 表格解释器,它是用于表格数据的主要解释器。Lime 使用局部性缩放和生成新数据,并计算统计数据,如数字数据的平均值和分类数据的频率,因此我们需要将训练数据作为参数传递。
石灰解释器
在第二步中,我们只需要为需要解释的实例调用 explain_instance。如果您希望了解不同的实例,可以使用不同的’ i’ 。
最后,我们可以使用 explainer 来显示 Jupyter 笔记本中特定预测的解释。
解释实例的 Lime 输出(图片由作者提供)
当我们使模型变得复杂时,它的可解释性会降低,反之亦然。一个建议是注意模型复杂性和可解释性之间的权衡。
您可以选择将您的解释保存为 HTML 文件,这样更易于共享。
exp.save_to_file(“explanation.html”)
可供选择的事物
- Eli 5——模型可解释性的另一个库。我用它来处理文本数据,效果很好。你可以在这里阅读更多关于 Eli5 的内容。
- SHAP——Shapley Additive Explanations 顾名思义,告诉您它是如何以相加的方式获得实例的分数的。SHAP 不仅有适用于任何模型的通用解释器,还有适用于基于树的模型的树解释器。理论上保证一致性,比石灰慢。此外,探索所有可能的特征组合的计算需求在 SHAP 呈指数增长。
结论
Lime 提供了人类可读的解释,并且是分析每个特征的贡献的快速方法,因此有助于更好地了解机器学习模型行为。一旦我们理解了模型以某种方式预测的原因,我们就可以与模型建立信任,这对于与机器学习的交互来说是至关重要的。在这篇文章中,我们使用了一个随机森林回归模型来解释它对一个特定实例的预测。
有趣的是,Lime 还支持图像、文本数据和分类问题的解释器。您可以在更复杂的模型(如 Xgboost & LightGBM)中进一步探索 Lime 解释,并比较预测。点击这里阅读更多关于酸橙的内容。此外,这里有一个有趣的阅读关于人工智能透明度和可解释性的不同工具。
我很想在下面的评论中听到你对石灰、机器学习和可解释的人工智能的想法。如果你觉得这很有用,并且知道任何你认为会从中受益的人,请随时发送给他们。
可解释的人工智能需要更多的人
资料来源:Petr Kratochvil
在 LIME、Shap 等技术术语中,你可能会忘记目标是向一个人解释一些事情。
对于许多人来说,可解释或可解释的 AI 或 ML 意味着在一套旧算法的基础上叠加一套新算法,以更好地理解旧算法的输出。因此,围绕可解释 ML 的讨论有时会围绕着 LIME 或 Shapley 值,而不会涉及到任何可能会使用模型输出的人。
在创建新算法的热潮中,模型用户想知道算法如何做出决策的问题被遗忘了。我们甚至没有开始讨论最终用户是否是一种人,或者实际上是一群不同类型的人,他们可能有不同的需求。也就是说,对理解一组新算法的关注分散了对模型用户需求的理解。
这可能是有问题的,因为如果用户不理解问题域内潜在变量的意义或重要性,简单地知道哪些变量在特定方向上导致 x 单位效应直观上不是有用的解释。
回到不同类型用户的问题上,这就引出了一个问题:我们是否应该讨论用一种解释来制作一个模型,或者,我们是否真的需要多个模型来处理同一件事情,因为不同的用户群需要不同类型的解释?例如,当思考医疗 AI 时,对医疗专业人员的解释有可能被患者理解吗?或者,一个被病人理解的解释可能对医学专业人员有用吗?例如,它会有足够的细节吗?
Leo Breiman 的罗生门集(一组不同的模型,有不同的解释)表明,在某些时候,制作这种情景模型至少是可行的。用于患者解释和医生解释的模型可能不会给出完全相同的结果,但是如果它们给出大致相同的结果,则可以提供所需的两个层次的解释。
当然,并不是简单的教育水平决定了什么样的模型解释是合适的。冒着过度延伸医学类比的风险,与试图优化慢性健康疾病治疗的医生相比,急诊室医生可能需要更快理解的解释。
一个数据科学家不可能知道并应用所有关于 UI/ UX 设计的知识,但是从这个领域考虑一个有用的概念是“用户角色”。这基本上是对将要使用你的产品的人的一个虚构的描述。以这种方式理解产品的用户应该是构建可解释模型的首要任务之一,因为要解释你的模型的人是一个特定的人,如果他们要理解你的模型及其输出,就需要理解他们的能力、约束和愿望。
罗伯特·德格拉夫的书《管理你的数据科学项目》》已经通过出版社出版。
可解释人工智能:健康数据用例
图片来源:Research @ Infosys Labs (Infosys 博客)
免责声明:为了更好地理解这篇文章的背景,阅读我之前关于可解释人工智能的文章会很有帮助。如果您以前用 Python 编写过逻辑回归代码,这也会很有帮助,因为我在代码中提到过它。
在我之前关于可解释人工智能的文章中,我提到过高级监督学习算法,如逻辑回归和神经网络(及其变体,如卷积神经网络和递归神经网络),很难解释。特别是神经网络,深度学习的一部分,可以产生惊人的准确性,但是程序员和用户对算法如何产生分类知之甚少。部分原因是神经网络和逻辑回归努力创建与其预测的直接关系,但这是有代价的:可解释性。
我之前提到过,理解分类问题的另一种方式是使用贝叶斯定理来推断我们的两个假设——H1(类别标签 1)和 H2(类别标签 0)。作为参考,下面是等式:
两个假设的贝叶斯推断
在今天的用例中,我将把这个推理框架应用于加州大学欧文分校的机器学习知识库中的肝细胞癌数据集。该数据集包括在马德里大学接受治疗的 165 名患者,以及每个患者的近 50 个个体特征/测量值。类别标签表明患者是否从癌症中存活(1)或是否不幸不能存活(0)。
我们开始吧!首先,我们需要导入相关的包。随着代码的进展,我们将导入更多的库。由于数据集和代码较长,这是我的 GitHub repo,完整代码。我将在这里张贴片段。
*# First, we read in the file and import packages
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix as cmatrix hcc_data = pd.read_csv('/Users/rabeya/Carcinoma_Classification_data/hcc.csv')*
加载到 HCC 数据集中。
接下来,在我们加载数据后,我们使用 Miriam Santos 在 HCC 数据集上的原始论文中的算法,利用“HEOM-distance”填充所有标有“?”的缺失值。这种“HEOM-distance”算法采用每个患者记录,并根据与其“最接近”的患者记录来填充缺失值;正如你所猜测的,“近”的概念是基于超远距离的。因为这个算法有很多行,所以我把你引向我的 Github repo。填充的数据集被命名为 new_df 。
一旦我填充完缺失的值,我需要平衡标签。标签不平衡是机器学习中的一个大问题,由于收集中的偏差或缺失值,标签 1 与标签 2 的记录比率可能不是 50%:50%。事实上,在 HCC 数据集中,患者生命记录与患者死亡记录的比率是 62%:38%,因此我们需要平衡这些记录。一种方法被称为“人工过采样”,我们为更小的类人工创建新的数据记录,这些记录与原始记录接近。这种过采样方法叫做“SMOTE”,代码如下。
***from** **imblearn.over_sampling** **import** SMOTE
sme = SMOTE(random_state=10)
*#features*
features = new_df.columns
*# transform the dataset*
X_matrix = new_df[features[:-1]].values
y_matrix = new_df[features[-1]].values
X_trans, y_trans = sme.fit_resample(X_matrix, y_matrix)transformed_df = pd.DataFrame(X_trans, columns=features[:-1])
transformed_df['Class'] = y_trans*
现在我们已经转换了数据集并平衡了类(有 102 个病人-生命和病人-死亡样本),我们准备好构建我们的生成分类器了!(我们的平衡 HCC 数据集在接下来的部分中被称为转换 _df* 。)*
在创建任何模型之前,我们减少了数据集中的要素数量。最初的一个有 49 个单独的特征/对于每个病人,那是太多要考虑的了!因此,相反,我们使用统计学中所谓的 互信息 将它削减到“最佳”10 个特征。
首先,我将逻辑回归作为测试模型案例应用于训练和测试数据。我将训练集和测试集分成:65%给训练集,35%给测试集。这不是标准的,但是我这样做了,因为我们的整个集合只有 200 条记录,所以必须节约使用数据。
***from** **sklearn.feature_selection** **import** SelectKBest
**from** **sklearn.feature_selection** **import** mutual_info_classifK = 10
selector = SelectKBest(mutual_info_classif, k=K)
X = transformed_df.iloc[:, :-1]
y = transformed_df.iloc[:, -1]
X_reduced = selector.fit_transform(X,y)*# use logistic regression as a test case model*
logreg = LogisticRegression(C=1.5, max_iter=1000, solver='lbfgs')
logreg.fit(X_train, y_train)*
对看不见的数据使用逻辑回归,预测准确度是:真阳性-36%;真阴性——30%;假阳性——22%;假阴性——12%。逻辑回归在预测如此小的数据集方面做得不太好,22%的 FPR 用于未来预测是危险的,因为五分之一的未来新 HCC 患者将被预测存活,而他们的实际存活机会将很低。这种糟糕的预测能力并不令人惊讶,因为我们只给出了大约 130 条记录供模型训练。
这里有许多解决方案:1)收集更多的数据并将其转储,但 HCC 的数据来之不易。2)使用更多的参数/权重,例如用于小数据的神经网络模型。但是正如我们之前讨论的,神经网络很难解释。我采取的解决方案是完全改变预测的视角,并使用生成模型来代替。正如我提到的,生成模型可以帮助我们计算可能的数据在属于不同类别的假设下如何指向,这种概率视角对于小数据尤其有用。
密度估计模型。图片来源:machinelearningmastery.com
最后,我们可以创建我们的生成模型。第一种类型称为 高斯混合模型 (GMM),其中一堆单独的高斯模型(称为“组件”)被捆绑在一起,以创建一个大的生成模型。我们根据患者是死于癌症还是幸存来分离我们的训练数据,然后拟合模型。为了适应模型,我们不能只选择一个#的组件。相反,我训练了 64 个模型(计算机可以比你想象的更快地执行这个操作),并使用期望最大化* (EM)算法优化了这些模型。EM 算法已有几十年的历史,但经常用于寻找高斯混合。*
高斯混合(EM)在工作。图片来源:维基百科
然后,我根据一种叫做 阿凯克信息标准 (AIC) 的统计方法,挑选出了最佳数字 22 和 21。它基本上比较了密度模型的精确程度和复杂程度,并试图在模型过拟合和欠拟合之间寻找平衡。
***from** **sklearn.mixture** **import** GaussianMixture **as** GMM
M = 64
*# so M models to train*
n_components = np.arange(2, M, 1)
life_models = [GMM(n, covariance_type='full', random_state=5) **for** n **in** n_components]death_models = [GMM(n, covariance_type='full', random_state=7) **for** n **in** n_components]life_aics = [model.fit(X_train_life).aic(X_train_life) **for** model **in** life_models]death_aics = [model.fit(X_train_death).aic(X_train_death) **for** model **in** death_models]gmm_life = GMM(22, covariance_type='tied',tol=1e-4, random_state=5)
gmm_life.fit(X_train_life)gmm_death = GMM(21, covariance_type='tied',tol=1e-4, random_state=7)
gmm_death.fit(X_train_death)*
对看不见的数据使用高斯混合模型的准确度是:35%真阴性、12%假阳性、15%假阴性和 37%真阳性。与逻辑回归相比,假阳性率有了多大的提高!我们实际上可以通过使用类固醇上的高斯混合模型的变体在假阳性率上做得更好: 核密度估计 (KDE) 。这听起来肯定像是人工智能科幻小说中的东西,但它的工作原理是一样的!
***from** **sklearn.neighbors** **import** KernelDensitykde_life = KernelDensity(bandwidth=0.1).fit(X_train_life)
kde_death = KernelDensity(bandwidth=0.1).fit(X_train_death)
log_density_life = kde_life.score_samples(X_test)
log_density_death = kde_death.score_samples(X_test)*
当我们对看不见的数据使用 KDE 方法时,我们的预测精度是:44%真阴性,8%假阳性,2%假阴性和 46%真阳性。只在 130 张唱片上接受过训练的 KDE 在预测能力上做得非常出色。(顺便说一句,GMM 和 KDE 需要记住的是,让密度模型过度适应训练数据。我将在以后的文章中探讨这个问题。)
好的,这一切都很好,但是我们如何解释密度模型呢?可解释性很重要。好吧,如果来自测试集的一个新的数据点病人 Y 进来,机器可以这样解释它的预测:“因为类别标签(1 =生存,0 =死亡)是平衡的,我的先验比率等于 1。因此,我的决定只基于我根据之前的 130 条训练记录计算出的密度似然模型。根据我的生存可能性模型,如果我假设 Y 属于 1 类,它的对数可能性是 p1。根据我的死亡可能性模型,如果我假设 Y 属于 0 类,它的对数可能性是 p2。因为我计算出,比如说,(p1-p2) > 0,这意味着病人 Y 的数据记录被生成的概率——假设它属于类 1——大于类 0。因此,我根据他们的 10 个‘最佳’计算特征对癌症存活患者 Y 进行分类。”这是代码的实际样子:
*delta = np.subtract(log_density_life, log_density_death)
# this is the difference in likelihoods under the hypothesis assumptions (H1: label=1, H2: label=0)kde_predictions = np.asarray([1 **if** x > 0 **else** 0 **for** x **in** delta])*
当然,机器不能和我们说话,但我相信这就是我们如何理解机器学习模型的决策。看看这比使用神经网络或逻辑回归更有解释力?
但不仅仅如此。假设我们有一个更大的像这样的不平衡的数据集。我们可以在贝叶斯推理公式的先验比中考虑生存和死亡标签的比例。如果我们计算 sam 似然密度模型,并发现对新测试点的预测是错误的,我们可以潜在地* 修改模型。要么我们可以修改我们的类标签的先验概率,要么我们可以修改似然模型。怎么会?通过在*可能性模型本身上使用贝叶斯框架。例如,这可以用概率编程语言如 PYMC3 来动态完成。**
我希望这些用于医疗保健数据的结果提供了一种途径,不仅可以将密度估计用于聚类客户模式,还可以像我们在这个项目中所做的那样,将它们用于预测能力。我将指出,实验者没有考虑的一个特征是种族/民族。我可以理解,因为数据集是在西班牙收集的,所以种族会相当单一。但是在数据收集中忽略种族,不批判性地思考其他因素,如社会经济阶层和获得医疗保健的机会,是一件非常冒险和危险的事情。但是希望我能找到更多的 HCC 数据集(或类似的),这些数据集也考虑了这些因素。
一会儿见!😃
可解释的人工智能
发现机器学习和人工智能的最大趋势之一
图片来自 Unsplash
可讲解 AI 是机器学习领域最热门的话题之一。机器学习模型通常被认为是不可能解释的黑盒。最终,这些模型被需要信任它们、理解它们所犯的错误以及它们的预测背后的推理的人类所使用。在这篇文章中,我们将探索什么是可解释的人工智能,为什么它很重要,并看看我们如何使用真实数据实现它的一些例子。
在我们开始之前,这里有一些额外的资源可以让你的机器学习生涯突飞猛进
*Awesome Machine Learning Resources:**- For* ***learning resources*** *go to* [***How to Learn Machine Learning***](https://howtolearnmachinelearning.com/books/machine-learning-books/)*!
- For* ***professional******resources*** *(jobs, events, skill tests) go to* [***AIgents.co — A career community for Data Scientists & Machine Learning Engineers***](https://aigents.co/)***.***
订阅我的专属列表!获得所有你喜欢的新鲜文章<3! By signing up, you will create a Medium…
z-ai.medium.com](https://z-ai.medium.com/subscribe)
好了,让我们开始吧😋
那么,什么是可解释的人工智能?
机器学习工作流的当前结构,从培训到在生产环境中的部署,大致如下:
图 1: ML 工作流程。(自制图片。来自平面图标的图标)
**这个图像的解释如下:**我们通过特定的学习过程,使用一些数据来训练一个模型。这个学习过程会产生一个已学习的函数,然后可以输入该函数,并在特定的界面中输出预测,这是最终用户看到的并与之交互的内容。
在前面的例子中,我们使用住房数据来训练一个模型,它最终是一个人工神经网络,但也可以是任何其他东西:从决策树,到 SVM 或 boosting 模型。
在学习了这个函数之后,我们可以给它输入新的输入,在我们的例子中是新房子,它返回关于输入房子价格的预测。最后,一个用户,在这个例子中是一个真实的公司的所有者,看到输出并做出决定或开始某些行动。
正如我们从用户的疑虑中看到的,这里的问题是预测没有正当理由。
在部署任何机器学习模型之前,我们或多或少会意识到它的错误(因为这是我们的学习过程试图减少的),但这只能给我们损失规模中的某个数字,或者量化数据中的标签和部署之前预测的标签之间的某个数字距离。我们能相信这个错误高于一切吗?
我们的模型可以有很低的误差,仍然有一定的偏差,或者时不时做出耐人寻味的预测。从商业角度来看,理解这些奇怪的预测可能是一个好主意,因为它们可能会告诉我们一些我们不知道的事情。它们也可能意味着模型有问题,需要更换。
即使预测没有实际问题,我们也希望**理解为什么模型会说出它所说的话。**你可以在测试数据上得到很好的结果,并得到相当准确的预测,但有时这还不够。
所有这些之前的问题是让可解释的人工智能如此受欢迎的原因。我们将通过查看它在前面的例子中的位置来了解它是什么。
图 2:可解释的人工智能融入到工作流程中。(自制图片。来自平面图标的图标
让我们看看这里发生了什么。这一次,我们使用了一个新的不同的学习过程来学习一个与可解释模型相关的函数。这意味着这个函数不仅能给我们一个预测,还能解释为什么它会做出这个预测。新的解释界面显示了额外的信息,可以让我们的用户对为什么做出这样的预测有所了解。在本文的后面,我们将通过一些真实的例子来看看这是如何实现的。
为什么可解释的人工智能如此重要?
当我们用我们应用变换的大量参数训练 ai 时,我们最终将预处理和模型构建的整个过程变成了非常难以解释的黑盒模型。也许构建模型的数据科学家或机器学习工程师知道数据经历的转换和操作,但对于最终用户来说,这些完全是神奇的。
图 3:被视为黑盒的机器学习模型。(自制图片。来自平面图标的图标)
他只是给模型一个输入,然后得到一个他应该相信的预测。在不知道引擎盖下发生了什么,也没有任何进一步解释的情况下,这可能吗?
自从人工智能的主流采用之路开始以来,用黑盒方法训练机器学习模型是没问题的——只要它们给我们带来好的结果,如果我们无法解释它们也没关系。现在,焦点正慢慢转向这些模型的透明性和可解释性。我们想知道他们为什么会得出他们输出的预测。这种转变的到来有多种原因:
- 理解当机器学习模型做出预测时会发生什么可以帮助加速这些系统的广泛采用。新技术总是需要时间变得成熟,但如果它们被理解了,肯定会有所帮助。
- 它让用户变得越来越适应这项技术,并去除了似乎包围着人工智能的神奇面纱。让用户信任他们正在使用的系统是最重要的。
- 对于保险或银行等行业,有时会有公司层面甚至的法律限制,这使得这些公司使用的模型必须是可解释的。
- 在其他一些关键领域、比如医学,人工智能可以产生如此巨大的影响,并令人惊讶地改善我们的生活质量,最基本的是,所使用的模型可以毫无疑问地被信任。拥有一个有时会输出奇怪预测的网飞推荐系统可能不会产生很大的影响,但在医疗诊断的情况下,不寻常的预测可能是致命的。提供比预测本身更多的信息允许用户决定他们是否信任预测。
- 可解释的模型可以帮助他们的用户更好地利用这种模型给出的输出,使他们在商业/研究或决策中有更大的影响力。我们应该永远记住,像任何其他技术一样,人工智能的目标是提高我们的生活质量,因此我们从中获得的好处越多越好。
原因肯定不止这 5 个;可解释的人工智能的主题是广泛而多样的,但在看到为什么拥有可解释的机器学习模型是如此令人向往之后,让我们看看通常会发生什么。
一般来说,正常的心态是上面提到的那种——我们想要结果,所以我们的机器学习模型必须有很好的性能。一些机器学习模型通常比其他模型表现更好,同时也具有不同的可解释性。
随机森林模型通常优于决策树,但前者比后者更难解释。下图显示了这种趋势:**随着绩效的提高,可解释性趋于降低。**我们想要的是从 X 到 O,也就是说,在不太损害模型性能的情况下增加可解释性。
图 4:不同机器学习模型的可解释性与性能。实际和期望的情况。(自制图片)
最后,让我们来看一些例子,看看我们如何构建一个可解释的人工智能系统,以及我们将从中获得的信息。
可解释人工智能的例子
如前所述,机器学习模型的可解释性是其固有的。虽然人工神经网络很难解释,但决策树允许简单的解释。然而,神经网络要强大得多。
如果我们想要实现可解释的人工智能,我们可以做几件事:
- 使用一个可解释的模型,比如决策树。
- 在一个更难解释的模型上增加一层可解释性,就像一个随机森林。
让我们看一个使用住房数据集的例子,继续上面例子的主题。数据集将如下:
房价:来自 Kaggle 的高级回归技术数据集。
其描述如下:
有 79 个解释变量描述了(几乎)爱荷华州埃姆斯住宅的每个方面,这个比赛挑战你预测每个家庭的最终价格。
由于这篇文章的目标是详细说明如何应用可解释的人工智能,这些数据已经大大简化了,我们只保留了数字变量,进行了非常简单的预处理步骤,模型使用了默认的超参数,没有进一步优化。
1)使用决策树
正如我们之前提到的,决策树是最容易解释机器学习模型的一种。实现这一点的方法非常简单,如果我们知道决策树是如何构建的,那就更好理解了:通过递归将数据分割成越来越小的组,这些组最终到达我们的 leave 节点。
如果你不确定决策树是如何工作的,你可以在这里了解它们。
当使用决策树进行预测时,从根节点开始,直到到达离开节点,(并经过必要的中间节点),在每个节点评估数据的某个变量,我们的数据样本根据它为该变量提供的值向左或向右移动。
下图描述了一个这样的例子,在一些住房数据上构建的树只使用了两个变量。首先,它查看变量 LSTAT 的值,然后查看 *RM,*的值,以在最终的 leave 节点中结束。
图 5:输入数据样本如何通过只有两个特征的决策树的例子。(自制数字)
注: 这是为另一个项目构建的随机树,不是为我们的实际数据。
我们如何用树来解释一个预测?简单,我们只需跟随样本在树中的路径,这使得样本最终到达叶子节点。
对于我们的实际数据集,我们构建了深度为 8 的决策树,并为其提供了一个预测。它通过树的路径,直到它到达其对应的离开节点(在那里进行预测)是下面的:
图 6:随机输入测试数据的决策树路径
类似这样的事情是数据科学家可以从决策树模型中得到的,以及预测本身,在本例中是 212542$ 。
现在,如果我们知道每个变量的含义,并且我们与一个领域专家合作,我们就可以创造出更强大的东西,因为从这些信息中可能可以提取更深刻的见解。
从前面的路径中,我们可以看到这是一个高质量的房子(在总质量变量的 6.5 和 7.5 之间),地下室、地面和第一层的尺寸限制(从地下室- TotalBsmtSF ,第一层- 1stFlrSF ,地面面积-GrLivArea)并且它还有一个大车库,它在 1978 年后被改造(从
有了所有这些知识,领域专家可以为每个变量构建一个文本,并将它们连接在一起,就像这样:
**“高品质建筑,地面居住面积小于 1941 平方英尺,地下室小于 1469 平方英尺,车库大于 407 平方英尺,一楼大于 767 平方英尺。1978 年后,它也被改造过。因此,其预测价格为 212542 美元。”
从广义上讲,这将是支持价格数字预测的原因。关于进一步的信息,这些变量的实际值以及其他值可以包括在文本中。
有了所有这些信息*,我们可以给用户两件事**:首先,使用路径,我们可以给他一个模型给出的预测背后的一般推理。此外,可以精心制作一个比上面更复杂的解释,因为在上面的例子中,我们只是列出了从变量及其值中获得的原始信息,然而,可以构建一个涉及业务推理的连贯和更精细的文本。*
想象一个例子,我们有前面的路径,还有像邮政编码这样的变量。我们可以编写一个类似于的文本:
"高质量的改建房屋,位于一个好社区,有车库和三层楼,这些房屋的售价略高于正常市场价格。因此,预测价格为 212542 美元"
使用这种方法,我们还可以包括不在决策树路径中但我们认为在单独文本中相关的其他变量的值,例如供暖类型、空调可用性和电气系统。
***酷吧?*最后,让我们来看一个更复杂的解释方法。
2)增加了一层可解释性:Shapley 值
然而,决策树有一个关键的弱点:它们在可解释性上获得的东西在预测能力上失去了。它们是简单的模型,通常不会得到最好的结果。
如果我们使用相同的数据训练一个随机森林模型,并比较误差(表示绝对概率误差或 MAPE),我们会看到以下结果:
图 7:两种模型的 MAPE 比较。(自制图像,图标来自 Flaticon )
决策树的误差几乎是随机森林模型的两倍。通过比较两个模型的预测价格和房屋的实际价格,我们也可以看到这一点:决策树预测价格为 212542 ∗ ,我们的随机森林预测价格为 ∗ 206049 * ,我们的随机森林预测价格为 *206049 ∗,我们的随机森林预测价格为∗206049 ,房屋的实际价格为 208500$ 。随机森林比孤独的树做得更好。
那么,我们如何解释一个更复杂的模型,比如随机森林?我们所做的是使用我们的复杂模型进行预测,然后在其上添加一层可解释性,如下图所示:
图 8:在黑盒模型上添加一个可解释性层(自制的图,来自 Flaticon 的图标)
从相同的输入中,我们使用一个复杂的模型生成一个准确的预测,并使用可解释层或可解释层生成一个好的解释。这一层是什么?这可能是各种各样的事情:我们可以使用决策树,就像前面的例子一样来生成解释,然而,这将是最简单的事情,我们正在寻找更强大和准确的东西。
在这个例子中,我们将使用 Shapley 值。 Shapley 值来自博弈论,我不会过多讨论它们是如何计算的。基本上,他们所做的是反映每个参与者(在我们的机器学习案例中的特征)在特定合作游戏中的贡献的重要性(在我们的机器学习案例中进行预测)。
我们可以为特征集中的所有变量计算这些值,并为每个预测获取与该特定预测最相关的特征。
在 Python 中, SHAP 库允许我们轻松计算特定输入的更复杂版本的 Shapley 值。为此,我们只需使用我们用来训练模型的相同训练数据来训练 Shapley 解释器,并指定我们使用哪种模型,在我们的情况下是随机森林。让我们看看解释器对我们用于决策树的相同观察的输出:
图 Shapley 值的输出
我们如何解读这个数字?非常容易。这些变量与具有特定大小和两种颜色之一的条形相关联:粉色或蓝色。在这两种颜色相遇的地方,我们可以通过随机森林模型看到房子的预测价格( 206049$ 如前所述)。最接近粉色和蓝色交汇处的变量是对特定预测影响最大的变量。
粉红色的变量及其相应的值有助于提高房价,而蓝色的变量及其相应的值有助于降低房价。正如我们在这里看到的,对房价上涨贡献最大的变量/值串联是值为 7 的总体相等变量。
在这种情况下,房子的质量和建造年份(2003 年)是房子最相关的积极特征。地下室和一楼面积的小值是最相关的负面特征。所有这些变量及其值共同证明了预测的正确性。
可以以纯文本的形式提取这些信息,并且可以采取一些方法来进行清晰的解释,就像在决策树示例中一样,但是这一次使用了一个更准确和复杂的模型,因为树中的解释受到我们获得的叶子节点和它们中结束的路径的限制。
注: 在这两种情况下(决策树和 Shapley 值),解释都是针对数据的一个单独的寄存器。我们没有使用像模型的整体特征重要性这样的东西,这也为我们的模型如何表现提供了非常有价值的见解,但这是模型特定的,并没有下降到个体预测水平。
还有其他增加可解释性层的技术,如 排列重要性或石灰, ,但它们不会在这篇文章中讨论,因为我认为我们的目标是强调可解释人工智能的重要性,详细说明它是什么,并展示一些例子,这已经完成了。
订阅我的专属列表!获取你喜欢的所有新鲜文章<3! By signing up, you will create a Medium…
z-ai.medium.com](https://z-ai.medium.com/subscribe)
Conclusion
我们已经看到了什么是可解释的人工智能,为什么它如此重要,并且看到了我们可以实现更接近我们正在寻找的东西的两种方法。
如果你想要这篇文章的任何部分的代码,请随时留下评论,我会发给你。
就这些,我希望你喜欢这个帖子。请随时在 Twitter 上关注我。还有,你可以在这里 看看我关于数据科学、统计学、机器学习的帖子。好好读!
有关机器学习和数据科学的更多资源,请查看以下资源库: 如何学习机器学习 !有关职业资源(工作、事件、技能测试),请访问 AIgents.co——一个数据科学家&机器学习工程师 的职业社区。
干杯!*
可解释的、数据高效的文本分类
以正确的方式改善 ULMFiT
在这篇文章中你可以找到:
- 介绍迁移学习的核心思想、历史和应用,
- 对自然语言处理的近期发展的回顾,包括 ULMFiT 算法(利用基于递归神经网络的预训练语言模型),
- 一种新颖的网络架构——对 ULMFiT **的修改——能够实现更准确的文本分类,尤其是在小数据集上训练的情况下;**在几个场景中评估其性能;它在自动网络欺凌检测比赛中获得第三名(pole val 2019 Task 6–1)
- 一种训练极轻量级组的方法(<100KB) classifiers meant to process documents from similar domains, as well as a way to deploy them efficiently,
- 注意力可视化的交互式演示,不仅显示文本的哪些部分对分类器重要,还显示它如何理解它们。
行动中的注意力可视化——阅读下面的工作原理, 自己试试
目录:
实用深度学习的关键——迁移学习
在计算机视觉中
将深度神经网络应用于非结构化数据,最常见的是图像,可以产生令人印象深刻的结果。撇开学术论文和原型不谈,大众汽车通过分析视频反馈实时了解周围环境。在某些地区,汽车完全自主驾驶。在这些情况下,以及许多其他情况下,深度学习被用于将图像的单个像素的原始数据转换为对场景的某种理解。
图 1:实时对象检测的开源示例:神经网络返回所有检测到的对象的边界框和类。来源: YOLO v3 物体探测
虽然理解图像是人类的天性,但对计算机来说却绝非易事。教一台机器如何看待世界需要大量的计算和大量的数据,有点类似于人类看待世界的方式。实际上,这也需要花费大量的时间和金钱。上面的例子?它使用超过 1400 万张人工注释的图像进行训练( ImageNet ,然后是 COCO )。然而,在各种各样的领域都有许多实际的应用——无数的工业领域,许多被非政府组织使用——例如通过照片来识别鲸鱼个体或者使用卫星图像来探测森林砍伐。
在没有庞大数据集和预算的情况下使用深度学习的关键?重新规划已经训练好的模型及其包含的知识;更正式的说法:迁移学习。计算机视觉经历了一场革命,在 2010 年代中期,使用 ImageNet 上预先训练好的模型用于各种应用成为了标准做法。
预训练任务很简单:对于每幅图像,通过选择(20,000+)预定义类别中的一个来决定其中的主要对象。为了解决这个问题,神经网络学习如何从原始像素数据中提取有意义的图像表示。首先,卷积层学会检测简单的特征,例如边缘和拐角。下一层使用这些信息来识别更复杂的形状——当观察鸟类图像时,可能是翅膀和喙。最终层可以识别特定类型的对象,例如各种类型的鸟、汽车或飞机。
我们可以使用预先训练的网络来计算图像的表示,并训练我们的模型使用这些表示。或者,我们可以删除预训练网络的最后几层,用新的、随机初始化的层来替换它们,并训练整个网络来执行手头的任务。这样就有可能使用只有几千或几百张标记图像的数据集快速构建原型系统。例如,400 个训练样本足以在视网膜的 OCT 图像中出现的 4 类疾病分类中实现 85%的准确性——这是一种与原始网络训练的动物和车辆图片非常不同的图像。通过一些额外的努力,例如对于分类任务,可以进一步降低数据要求。更极端地说,在看不到图像的任何例子的情况下将图像分类也是可能的(零镜头学习,例如设计)。
在自然语言处理中
自然语言的自动处理是一个具有挑战性的问题。在这个领域中执行各种任务的系统已经存在了几十年,但是直到最近它们还主要是基于规则的。这些系统可以很好地执行(例如:以 97.2%的准确率将问题分为 50 类),并且它们的行为可以很容易地被理解和调试。不幸的是,因为它们是基于人工开发的规则和知识库系统,所以它们的开发是劳动密集型的。随着预期功能的增加,它们的复杂性会大大增加,因此它们通常只适用于定义明确、范围狭窄的任务。此外,打字错误或语法错误可能会干扰它们的运行。
开发统计的、数据驱动的 NLP 系统的动机是明确的。在许多情况下,收集与手头任务相关的数据集比开发一套庞大的规则更容易。这意味着更低的成本和更短的系统开发时间。此外,随着时间的推移,随着收集的数据越来越多,它为系统提供了更好的性能。此外,许多文本数据可以免费获得——以书籍、在线出版物等形式。——可以说包含了人类的大部分知识。直接利用它作为知识库,可以构建新的、非常强大的系统。
建立一个能够完全理解自然语言的系统是一个极其困难的、尚未解决的问题。解决语言歧义通常需要语境、习语知识、发现讽刺,甚至常识和人类“常识”(见威诺格拉图式挑战)。尽管如此,这个问题还是很值得研究的——因为它有直接的应用价值,也有可能更接近理解一般智力。
NLP 中的第一个统计方法开始时要简单得多。他们将文本文档表示为它们所包含的单词数(这种表示称为单词包)。这种方法的改进建议使用频率而不是计数,并且频率通常与给定单词的常见程度相关( TF-IDF )。这些方法完全不考虑词序,所以只使用一小部分可用信息。使用 n-grams 个单词的序列)代替单个单词,进行类似的进一步处理,是一种合并词序信息的可行方法。不幸的是,使用高 n 值是不可行的,因为可能的单词组合的数量随着 n 呈指数增长。
上述基于计数的表示在很长一段时间内一直是最先进的统计解决方案的基础。由于其简单性和计算效率,对于某些应用来说,它们仍然是重要的基线。例如,对于主题分类和情感分析,尝试基于词袋或双字母特征的朴素贝叶斯或 SVM 分类器,可能是一个好主意(在下面描述的完整 IMDB 任务的情况下,它实现了 90–91%的准确率,相比之下,ULMFiT 的准确率为 95%,但速度要快几个数量级)。
第一波变化发生在 2013 年,随着 Word2Vec 的出现。这一类别的模型为其词汇表中的每个单词生成一个数字表示(称为“单词向量”,或“嵌入”)。它们是作为浅层神经网络构建的,根据来自大量免费文本的短序列进行训练。每个单词的表示都基于其通常的上下文,并且已经捕获了大量的语言语义。众所周知,词语之间的类比对应于其向量之间的算术关系,例如king — man + woman ~= queen
。
图 2:单词嵌入空间中的语义关系。标有“女王”、“女人”、“男人”和“国王”的点的坐标是单词向量/嵌入。来源:走向理解线性词语类比,博文
词汇表中的每个单词都被表示为一个固定长度的向量(例如 300 个数字)——嵌入空间中一个点的坐标集。由于词汇表的大小(唯一单词的数量)通常高几个数量级,所以表示是分布式的——单词和概念由特定的坐标组合表示,而不是向量的单个元素。
作为一个完整系统的一部分,单词嵌入将用于对文档中的每个单词进行编码,产生一个可变长度的向量序列(长度对应于单词的数量)。开发了许多使用这些表示的算法——从平均所有的单词向量并根据结果训练 SVM 分类器,到通过递归或卷积网络传递序列。
单词嵌入有一个中心问题。当用于对文档中的单词进行编码时,它们会单独对每个单词进行编码——忽略上下文。代表根的向量在下式中是相同的:
- 一棵树的根
- 二的平方根号
对于 NLP 的大多数实际应用来说,具有一个以上可能含义的单词是一个问题。对于某些应用,例如情感分析,也必须解决句法歧义。这可以从简单的问题(一个短语被否定了吗?)变得非常复杂,有时甚至是不可能的(这个短语是讽刺性的吗?).
让我们考虑一个实际的情况。我们希望建立一个系统,通过将关于品牌的推文分类为正面或负面,来评估公众对品牌的情绪,然后计算正面的分数。我们需要训练数据——我们可能会下载一些关于各种品牌的相关推文,然后手动给它们贴上标签(或者众包这项任务)。
如果我们使用单词嵌入并将编码文本输入神经网络,我们将能够训练它执行分类任务——区分积极信息和消极信息。但是因为单词嵌入并不捕捉上下文,只是单个的单词,我们的网络必须同时学习语言的整个结构,甚至更高层次的概念,如讽刺或挖苦!所有这些都是基于我们珍贵的,人工标注的数据。这显然是低效的。
语境化的词汇表征
为了帮助神经网络“理解”语言的结构,研究人员开发了几种网络架构和训练算法,它们计算单词的上下文化表示。与基于单词嵌入的方法相比,关键的区别是:这种对上下文的理解是在来自给定语言(或多种语言)的未标记的、可自由获得的文本上训练的。数据通常来自维基百科、T2、公共领域的书籍,或者只是从互联网上搜集。
在 2018-2019 年,他们开始了一场类似于几年前计算机视觉的“革命”。深度神经网络通常用于计算丰富的、上下文化的文本表示——与上下文无关的单词向量相反。这些表示然后可以被另一个神经网络使用(例如 ELMO )。更常见的是,预训练网络的最后一层被一组不同的层取代,这些层是为手头的任务设计的(通常称为下游任务)。新层的权重被随机初始化,并使用标记的数据进行训练以执行下游任务。这个过程要容易得多,因为最难的部分——语言理解——已经大部分完成了。
最初的训练,旨在训练网络对文本的“理解”,是基于未标记的数据。标签——模型要预测的东西——是从数据本身自动生成的。使用这种标签的训练通常被称为无监督的预训练。
目前的技术水平
最常见的无监督预培训方法有:
- 屏蔽语言建模 —从剩余的上下文中预测一些删除的单词(例如 BERT
- 语言建模——给定前一个单词预测下一个单词(例如 GPT-2 、乌尔姆菲特
- 替换标记检测 —最近的,但非常有前景的策略,其中一些单词被由单独的辅助语言模型生成的单词替换,预训练任务是识别它们(例如 ELECTRA
图 3:两个最受欢迎的培训前目标
标记化——将文本分割成基本的块——的方法也各不相同。最简单但次优的策略是在每次遇到空格字符时将它们分开。在某些情况下使用基于单词的标记化,但通常包括特定于每种语言的规则(例如,将“不”分为“做”和“不”)。子词标记化(例如 SentencePiece )可能是最常见的——它是基于特定字符序列的频率从数据中导出的,通常将空白视为另一个字符。同样值得注意的是,字符级语言模型有时也会在实践中使用(例如 FLAIR )。
两组网络架构主导着这个领域:
-
变形金刚网络**——基于自我关注机制
变形金刚网络最著名的例子包括谷歌的伯特 (+其众多变种)和 OpenAI 的 GPT-2 。他们帮助在许多(如果不是大多数)NLP 问题中实现了最先进的结果。训练非常容易并行化,当解释一个令牌时,他们可以在被解释的令牌之前和之后使用这两个令牌。
注意机制有许多变种,这里概括了;它们通常将来自输入的不同部分的信息聚合为这些部分的加权平均值,由各种可训练模块计算权重。要找到许多架构的实现、预训练模型、教程等等,请参见拥抱脸变形金刚。**
-
**递归网络(以及递归+其他架构的混合体)。
乌尔姆菲特或许是这个群体中最受欢迎的,其他值得一提的还有多菲特、沙-RNN 以及最近开源的莫格里菲耶 LSTM 。
虽然训练更难并行化,但正是因为这个原因,模型往往更小,训练更有效——没有办法通过增加问题的计算来加速训练。上面提到的所有递归网络都可以在具有单个 GPU 的台式计算机上从头开始训练。他们应该相对快速地为下游任务进行微调。如果标记数据很少,它们也往往表现得更好(参见 MultiFiT )。与基于 Transformer 的模型相比,另一个优势是:它们可以处理任意长的输入,而 Transformer 只能处理它们被设计和训练的长度的数据块(有一些技巧可以用来一部分一部分地处理更长的文档并汇总结果)。Fast.ai 包含一个 ULMFiT 的实现,以及一个预先训练好的英语语言模型。多功能库包含其他几种语言的预训练模型,如果需要另一种语言,还有预训练脚本。**
提议的架构
本文描述了一种用于处理文本文档的分类模型的新型网络架构——对 ULMFiT 的修改。使用该论文的命名法,提出了不同的分类头。
ul fit—概述
从头开始训练一个 ULMFiT 型号包括 3 个步骤:
- 语言模型预训练 —在大型通用文本语料库(例如维基百科)上训练语言模型
- 语言模型微调 —对来自分类任务领域的文本继续训练语言模型(想要对推文进行分类?在同一种语言的大量推文上训练)
- 分类器微调 —语言模型的最后一层被替换为分类器头(如下所述)。剩下的预训练部分称为编码器。
首先,只训练分类器头的随机初始化参数。之后,编码器的各层逐渐开始优化,从最后到第一。**
ULMFiT 论文中使用的网络架构如下所示。它包含:
图 4: ULMFiT 分类——处理一个示例输入序列
分类器头**执行串联池,然后将其结果通过一个完全连接的层和输出层。
****串联轮询是 3 个元素的简单串联:
- average-pooling——沿序列维度对元素进行平均(对代表每个单词的向量进行平均),
- max-pooling —沿序列维度的元素最大值,
- 编码器的最后一个输出向量。
转移注意力——建议的分类器头
所描述的体系结构旨在直接解决使用平均池和/或最大池来聚集由递归语言模型生成的文本表示的两个主要问题。
- 按位置统计(平均池和最大池)对序列中的所有标记进行同等加权,即使通常只有一部分与分类任务相关。在电影评论中进行情感分析的情况下——评论者可能会写一部伟大电影中讲述的悲伤、悲惨的故事。虽然大部分文本可能有负面情绪,但我们只想专注于描述电影的部分,而不是其情节的内容。
- 只有当感兴趣的文本特征与表示空间的坐标系的轴对齐时,平均池和最大池才有语义意义。对于情感分析,我们希望看到一个神经元(表示空间的一维)准确表达文本中的积极或消极情感,而不是其他。虽然对于像情感这样的简单概念来说,它可能近似为真,但对于更复杂的特征来说,它不太可能成立,甚至是近似成立。如果条件不成立,对长序列(数百或数千个令牌)求平均值很可能会破坏存储的信息。
因此,分类器头包含两个“分支”,每个分支回答一个问题:
- ATT 分公司:“哪些部分是相关的”,我们应该注意什么?****
- AGG branch:“我们想要 agg regate 的特性是什么?”
两者都被实现为简单的、完全连接的神经网络。层的数量和大小是额外的超参数,其选择在“结果”一节中讨论。网络独立地应用于每个序列元素。ATT 分支返回的值(每个序列元素的标量(eⱼ))然后通过 Softmax 函数传递,以获得加权平均值的正确权重(aⱼ)。AGG 返回的向量的加权平均值( bⱼ )成为序列 © 的最终表示。
分支注意力结构方程。非线性函数 f 和 g 由神经网络 ATT 和 AGG 实现。粗体向量。
“分支注意力”分类器头部示意图:
图 5:分支注意力分类器头
注意:如果 AGG 分支被跳过,并且 ATT 只有输出层,那么整个聚合减少到点积关注,只有一个可训练的查询。它不会产生特别好的结果,这将在下一节中讨论。
实验和结果
大多数实验都是使用流行的情感分类数据集 IMDB T1 进行的。它包含 5 万条影评,由 imdb.com 网站的用户撰写。如果用户对电影的评分为 7 分或以上,它们将被标记为正面,4 分或以下,它们将被标记为负面。等级是平衡的,每部电影正面和负面的评论数量相等。每部电影评论不超过 30 条。文件长度差异很大——许多相对较短,但有 2%超过 1000 字。同样值得注意的是,这些标签有些“嘈杂”,例如,有些正面评论被标记为负面。
IMDB 示例
为了模拟小数据集的情况,同时在体系结构之间进行具有统计意义的比较,实验以如下方式进行:在 IMDB 训练数据集的 1000 个元素样本上训练模型,并在整个测试集上进行评估。对于每个架构和超参数集,这重复了 20 次。与训练相关的超参数和单个漏失乘数(由乌尔姆菲特作者推荐)分别针对分支注意力和串联池头部进行了调整。
下面,将所提出的架构(分支注意力)的结果与基线(串联池)进行比较。作为最小消融研究,提供了两种额外的变体:
- 移除了 AGG 分支(并且用来自 ATT 分支的权重对编码器输出进行平均),
- ATT 分支被移除,并且 AGG 提取的特征被统一加权。
表 1:不同分类器头的分类性能,平均来自 20 个 1000 元素数据集的训练。优化整个网络的参数(逐步解冻)
虽然这绝不是突破性的,但上述结果似乎令人鼓舞。在不改变编码器(该模型最重要的部分)的情况下,错误分类的样本数量减少了 10%以上。所提出的架构似乎更好地利用了编码器的文本表示。
****在上述最佳配置中,分支注意力头的参数比原始 ULMFiT 架构少 30%。在其他配置中,性能稍差,参数数量最多减少 85%。
值得注意的是,移除分支注意力头的任何一个分支都会导致表现的显著下降——甚至低于基线水平。虽然为了简洁起见没有在这里显示,但是减少任一分支的深度(到一个层)也会导致性能小幅但持续下降。结果支持使用具有两个分支的完整网络架构,如前所述。
单个实验运行的准确度分数的分布如下所示,为箱线图。它旨在可视化每个配置的结果差异,这些差异是由不同的训练数据集采样和不同的随机初始化产生的。
值得注意的是:所有四个体系结构中存在的单个负异常值(表示为点)来自于对训练数据集的相同样本的训练——可能质量较差。很可能,如果每次都用相同的数据集重复训练(只改变随机种子),每个配置的精确度的方差将会低得多。然而,使用不同的数据集样本是为了确保任何结论都更具普遍性,而不是特定于特定的数据集。总体来说,均值精度的提高不能合理解释为随机噪声。
仅头部训练
使用带有可训练集合的分类器头,而不是固定的,我们还能得到什么好处?我们可能根本不需要修改编码器的参数。根据 ULMFiT 的说法,我们应该首先优化分类器头部,然后逐渐将编码器的层添加到优化器的范围内——这种方法在上一节中有所描述。然而,专门训练分类器的头部具有重要的实际好处,这将在下一节中讨论。下表总结了通过这种方式获得的结果——仅优化了分级机机头的参数。
表 2:不同分类器头的分类性能,平均来自 20 个 1000 元素数据集的训练。仅优化分类器头部的参数
有点令人惊讶的是,对于完全分支注意力的头部,结果一点也没有恶化。以这种方式训练分类器可能是一种可行、实用的方法,尤其是对于相对较小的数据集。正如预期的那样,提议的架构和 Concat 池之间的差距已经增大。
没有 AGG 分支的变体的性能高于预期,优于整个网络优化时的性能(上一节)。这可能表明优化整个网络时的训练过程可以改进,但这种尝试并不成功。
纯头部训练的好处
为什么当只训练分类器头时,所提出的架构比基线执行得更好是重要的?以这种方式构建系统有几个实际优势。训练速度更快,需要的内存更少。一个不太明显的好处在于,被训练的模型所特有的参数数量很少。
新的用例出现在许多分类器对同一领域的文本进行操作的场景中,例如给定语言的“tweets”或“news articles”。培训、存储和运行新模型变得非常便宜:
- 训练不到一分钟(在现代 GPU 上)
- 存储的分类器头占用约 100kB 的磁盘空间(大概数字,某些配置会更少)
- 在推理时,所有模型的文档可以一起批处理,并在同一个 GPU/TPU 上有效编码;特定型号的推理部分很小,可以在 CPU 上快速运行。
能在哪里有用?有许多可能的情况,例如:
- AutoML 平台 —一个不熟悉 ML 的用户提供一个带标签的数据集,并期望一个 API 给一个执行分类的模型。
- 推荐系统—冷启动问题的“产品”一半。例如,当一篇新文章发布在 Medium 上时,没有人与之互动。传统的(协同过滤)算法基于具有相似品味的人的意见来推荐东西。这种方法不适用于新内容。我们可以根据一组活跃用户过去的活动,为他们训练“鼓掌预测”(评级预测)模型。然后,我们可以在任何人有机会阅读新文章之前,对它们进行人工评级。
- 个性化,有足够的数据可用。基于内容推荐社交媒体帖子,而不是其他人与它的互动,标签等。以 Twitter 为例,虽然根据所有用户的偏好模型运行所有新推文是不可行的,但可以使用这样的偏好模型作为当前系统之上的最终过滤层。
注意力可视化
通过分析神经网络中的注意力权重,我们可以更好地理解它——我们可以看到输入的哪些部分与手头的任务相关。有趣的可视化技术已经在机器翻译和图像字幕生成中得到演示。
有了分支注意力,在某些情况下,我们可以更进一步。如果分类问题是二进制的,我们可以通过将 AGG 分支的最后(或唯一)维度设置为 1 来获得相当好的结果。实际上,对于每个输入令牌,我们将获得单个标量值,最终的决策将是这些值的加权平均值(经过简单的转换)。在情感分析的情况下,我们可以在处理每个标记之后显示“本地”情感,以及文档特定部分的重要性分数。
**请看下面的例子,并查看 互动演示 **。在演示中,可以同时显示权重和情绪(如示例所示),也可以只显示权重或情绪。也可以在不同的文本上测试模型。
图 6:示例电影回顾——注意力可视化
****每个标记后面颜色的不透明度表示与其相关的注意力权重。色调表示为该标记计算的特征(情感)的值,考虑其左上下文,以红到绿的比例。
一些观察结果:
- ****该模型在大多数情况下正确识别情感,并“关注”相关部分(尽管“故事中开始出现漏洞”未被识别为相关)。
- 否定,即使放在离其对象几个字以外的地方,也被正确解读(“我不认为这是一部好电影”)。
- 大的权重分配给句号字符。正如“什么不起作用”一节中所述,对这一事实的几种可能的解释进行了探讨。剩下的,工作假设:当遇到句号时,模型已经处理了一个完整的语句,后续的单词不太可能改变它的含义。模型在处理完句号后,通过编码器的状态学习访问整个句子的内容。
完整的 IMDB,其他数据集
为了验证所提出的架构是在总体上表现良好,还是仅针对特定的数据集类型和大小表现良好,进行了几个其他实验。
完整的 IMDB 数据集
表 3:完整 IMDB 数据集上的分类性能
当在完整的 IMDB 数据集上训练时,在其默认的训练/测试分割中,结果大约等于基于 Concat 池的分类器的结果(尽管分支注意力似乎对训练相关的超参数的选择不太敏感)。直观上,大型训练数据集可能包含足够的信息来修改编码器,其输出将通过平均池和最大池进行有意义的聚合。
完整的 IMDB 数据集,仅头部训练
表 4:完整 IMDB 数据集上的分类性能,仅优化分类器头
当在完整的 IMDB 数据集上进行训练,但仅优化分类器头部时,分支注意力的表现明显好于基线。正如所料,它的性能比整个网络优化时更差。尽管如此,这种方法在某些情况下还是有用的,正如“纯头部训练的好处”一节中所讨论的。
自动网络欺凌检测— PolEval 2019 任务 6
使用一个旧版本的代码,一个基于分支注意力的系统进入了 PolEval 2019 竞赛——任务 6。它的目标是准备一个系统来评估哪些用波兰语写的推文可能包含网络欺凌内容。提供了大约 10,000 条示例推文的人群标签训练集。这是非常不平衡的——绝大多数例子不包含网络欺凌。
该系统使用了一种子词标记化机制——sentence piece——来处理 Twitter 上常见的拼写错误。这种标记化通常对波兰语有利,因为它是一种融合语言。它丰富的前置和后置修复大大增加了独特单词的数量,这是传统的基于单词的标记化方法的一个问题。该语言模型在波兰语维基百科上进行训练,然后在一个大型的未标记的波兰语推特数据集上进行微调。
在竞赛中,该系统获得了第三名 ( proceedings ,第 106 页),落后于一个ulm fit——类似于一个更大的、改进的语言模型的系统(类似于并由 MultiFiT 的合著者)。然而,它的排名仅在基于 BERT 的系统之前。
分支注意力和串联池的性能随后以与“IMDB 样本”实验相同的方式进行了比较,并在 IMDB 数据集上调整了超参数。两个模型都被训练了 20 次,每次都在训练数据集的不同子样本上进行,并且具有不同的随机初始化。为了直接比较模型的性能并避免设置检测阈值的问题,选择了平均精度度量。
表 5:网络欺凌检测任务的平均精度,20 次重复,1000 个元素的训练数据集样本
在完全不同的环境中——不同的语言、标记化策略、不同的(更复杂的)任务、没有进一步的超参数优化,分支注意力提供了适度但明显的性能改善。可以认为这是对所提议的体系结构的成功测试。
问题分类— SemEval-2019 任务 8A
使用事实核查问题数据集对该方法的结果进行了另一次验证。该数据集摘自“卡塔尔生活”——一个社区问答论坛。每个文档(主题中的第一篇文章)由类别、主题行和文章内容组成。这些字段用分隔符连接在一起。任务:给每个问题分配一个类别:“事实”、“观点/建议”或“社会”。
在与上述相同的实验设置中,使用相同的超参数,获得的结果为:****
表 5:问题分类任务的准确性,20 次重复,1000 个元素的训练数据集样本
再一次,使用分支注意力的网络表现明显更好——尽管两个网络共享相同的预训练编码器。
什么没有起作用,可能的改进
为提高网络性能,进行了几次尝试:
- 双向编码器。编码器的输出与第二个编码器的输出连接在一起,第二个编码器被训练来反向处理文本。它为文档提供了更丰富的表示,每一点都以文档的整体内容为条件。GPU 内存需求增加了大约 2 倍,但性能并没有明显提高。然而,由于内存限制,其他参数必须更改,这可能会降低性能。利用具有更多内存(理想情况下为 16GB 以上)的 GPU 的进一步实验可能会改变这一结论。前向和后向语言模型的联合训练可以改善结果,并且节省一些内存——通过在嵌入/softmax 层中的权重共享。
ul mfit 的作者报道了类似的结果。然而,值得注意的是,分支注意力聚合应该能够更好地利用附加信息——对于每个序列元素,计算相关特征,然后对它们进行平均。总的来说,虽然最初的结果是负面的,但这个想法似乎仍然值得进一步研究。 - ****使用较早的编码器层。在 ELMO 之后,编码器前几层的输出被用作分类器头的附加输入(图 4 中的 LSTM-1 和 LSTM-2)。它没有改善结果,但是——根据最初的作者——最佳层或层的组合可能会因任务而异。
- 使用最后一个令牌的表示。其中一个假设,即模型为什么学习给句号字符分配高权重,是:它寻找文档的结尾。最后一个标记的表示取决于整个文档,所以假设它包含所有相关信息。然而,以各种方式直接结合最后一个记号的表示并没有改善分类结果。
- ****运用 LSTM 的“细胞”价值观。对于输入序列的每个元素,LSTM 层产生两个向量:“单元”状态值 c 和输出/隐藏值 h 。虽然 c 值旨在更长时间地存储信息,但输出值是作为 c 的门控版本产生的,并且输出门由本地上下文参数化。正常情况下,只有 h 值被传递到下一层(参见图 4 )。
另一个为什么句号字符的表示可能被赋予更大权重的想法是:在语言模型设置中,它们被用来预测新句子的第一个单词。要做到这一点,他们必须访问更多的文档上下文,这可能会导致输出门更加开放。
这一假设激发了在分类器头部直接使用非门控 c 值的想法。然而,分类结果并没有改善(计算效率降低,因为优化的 cuDNN 实现无法使用)。
在对几个示例中的相应的 c 和 h 向量进行更仔细的检查后, h 值不像 c 的门控版本(在某种意义上近似于硬二进制门控)。似乎选通操作只是提供了一个额外的、可训练的非线性变换,有点类似于大小为 1 的卷积。进一步分析 LSTM 网络的输出门发生了什么,以及它如何与正在处理的文本的语法相对应,这本身似乎是一个有趣的话题,但超出了本文的范围。
结论
- 在几项任务中,提出的解决方案优于原始的 ULMFiT 架构,或者表现同样出色。
- 基于“分支注意力”的分类器头在相对小的数据集的情况下具有优势,并且如果只是分类器头被优化。
- 如果标记的训练数据稀少和/或需要许多分类器在相似的文档上操作,则在预训练的语言模型之上仅优化分类器头可能是可行的策略。在后一种情况下,如果只是分类器头的参数不同,则可能实现更高效的部署,并且需要更少的磁盘空间。
- 分支注意力架构的所有变体都为分类器增加了某种程度的可解释性。我们不仅可以发现哪些部分被认为是重要的,而且在某种程度上还可以发现它们是如何被理解的(见演示)。
- 在其推荐的配置中,与基线相比,建议的架构具有更少的参数,并且需要更少的计算。由于其性能似乎大多优于或等于基线,因此可将其视为使用原始 ULMFiT 配置的分类器的替代产品。
提供了重现本文结果所需的代码和微调后的语言模型。
乳腺癌预测中的可解释深度学习
了解医疗保健中的卷积神经网络预测结果
高级机器学习模型(例如随机森林、深度学习模型等。)通常被认为是不可解释的[1][2]。如[1][2][3][4]中所述,这些模型在很大程度上仍然是黑盒,如果医生计划根据预测结果采取措施治疗疾病(如癌症),那么理解其医疗保健预测结果背后的原因对于评估信任度非常重要。在[2]中,我使用了威斯康星州乳腺癌诊断(WBCD)表格数据集来介绍如何使用局部可解释模型不可知解释(LIME)方法来解释随机森林模型在乳腺癌诊断中的预测结果。
在本文中,我使用 Kaggle 乳腺癌组织学图像(BCHI)数据集[5]来演示如何使用 LIME 来解释用于浸润性导管癌(IDC)乳腺癌诊断的 2D 卷积神经网络(ConvNet) 的图像预测结果。
1.准备乳腺癌组织学图像数据集
BCHI 数据集[5]可以从 Kaggle 下载。如[5]中所述,数据集由 5,547 个 50x50 像素的 H & E 染色乳腺组织病理学样本的 RGB 数字图像组成。这些图像被标记为 IDC 或非 IDC。有 2,788 个 IDC 图像和 2,759 个非 IDC 图像。这些图像已经被转换成 Numpy 数组,并存储在文件 X.npy 中。类似地,相应的标签以 Numpy 数组格式存储在文件 Y.npy 中。
1.1 加载数据
将 X.npy 和 Y.npy 文件下载到本地计算机后,它们可以作为 Numpy 数组加载到内存中,如下所示:
X = np.load('./data/X.npy') # images
Y = np.load('./data/Y.npy') # labels (0 = Non IDC, 1 = IDC)
以下是其中两个数据样本,左边的图像标记为 0(非 IDC),右边的图像标记为 1 (IDC)。
图一。两个样本:左边的标为 0(非 IDC),右边的标为 1 (IDC)。
1.2 混洗数据
在原始数据集文件中,所有标记为 0(非 IDC)的数据样本都放在标记为 1 (IDC)的数据样本之前。为了避免人为的数据模式,数据集被随机打乱如下:
indices = np.arange(Y.shape[0])
np.random.shuffle(indices)
indices = list(indices)
X = X[indices]
Y = Y[indices]
1.3 转换数据集
IDC 图像中的像素值在[0,255]的范围内,而当输入数据的值在[0,1]或[-1,1]的范围内时,典型的深度学习模型工作得最好。下面的类 Scale 是将 IDC 图像的像素值转换到[0,1]的范围内。
class Scale(BaseEstimator, TransformerMixin):
def __init__(self):
pass
def fit(self, X, y):
return self
def transform(self, X):
X1 = X.copy()
X1 = X1 / 255.0
return X1
1.4 划分数据集用于模型训练和测试
数据集分为三部分,80%用于模型训练和验证(1,000 用于验证,其余 80%用于训练),20%用于模型测试。
X_train_raw, X_test_raw, y_train_raw, y_test_raw = train_test_split(X, Y, test_size=0.2)X_train = X_train_raw.copy()
X_val = X_train[:1000]
X_train = X_train[1000:]
X_test = X_test_raw.copy()y_train = y_train_raw.copy()
y_val = y_train[:1000]
y_train = y_train[1000:]
y_test = y_test_raw.copy()
2.训练 2D ConvNet 模型
BCHI 数据集[5]由图像组成,因此选择 2D ConvNet 模型进行 IDC 预测。
2.1 创建 2D 通信网
与[5]类似,下面的函数 getKerasCNNModel ()为 IDC 图像分类创建 2D ConvNet。
def getKerasCNNModel():
batch_size = BATCH_SIZE
epochs = EPOCH_SIZE
img_rows, img_cols = X_train.shape[1], X_train.shape[2]
input_shape = (img_rows, img_cols, 3)
model = Sequential()
model.add(Conv2D(16, kernel_size=(3,3), activation='relu', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(32, (3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss= keras.losses.binary_crossentropy,
optimizer=keras.optimizers.rmsprop(),
metrics=['accuracy'])
return model
2.2 创建管道组件
类 KerasCNN 是将 2D ConvNet 模型包装成一个 sklearn 管道组件,这样它就可以与其他数据预处理组件如 Scale 组合成一个管道。
class KerasCNN(BaseEstimator, TransformerMixin):
def __init__(self, X_val=None, y_val=None):
self._model = getKerasCNNModel()
self._batch_size = BATCH_SIZE
self._epochs = EPOCH_SIZE
self._X_val = X_val / 255.0
self._y_val = y_val
def fit(self, X, y):
self.history = self._model.fit(X, y,
batch_size=self._batch_size,
verbose=1,
epochs=self._epochs,
validation_data=(self._X_val, self._y_val))
return self
def transform(self, X):
return X def predict_proba(self, X):
y_pred = self._model.predict(X)
return y_pred
def evaluate(self, X, y):
return self._model.evaluate(X,y)
3.解释模型预测结果
如前所述,我在本文中使用 LIME 来解释 ConvNet 模型预测结果。
3.1 设置管道
与[1][2]类似,我制作了一个管道来包装 ConvNet 模型,以便与 LIME API 集成。
from sklearn.pipeline import Pipelinesimple_cnn_pipeline = Pipeline([
('scale', Scale()),
('CNN', KerasCNN(X_val=X_val, y_val=y_val))
])
3.2 训练 ConvNet 模型
ConvNet 模型的训练如下,以便它可以被 LIME 调用,用于以后的模型预测。
simple_cnn_pipeline.fit(X_train, y_train)
3.3 选择石灰解释器
如[1][2]所述,LIME 方法支持不同类型的机器学习模型解释器,用于不同类型的数据集,如图像、文本、表格数据等。本文选择了 LIME image 解释器,因为数据集由图像组成。
2D 图像分割算法quick shift用于生成石灰超像素(即片段)[1]。
*from lime import lime_image
from lime.wrappers.scikit_image import SegmentationAlgorithmexplainer = lime_image.LimeImageExplainer() segmenter = SegmentationAlgorithm(‘quickshift’, kernel_size=1, max_dist=200, ratio=0.2)*
3.4 解释模型预测
一旦训练了 ConvNet 模型,给定一个新的 IDC 图像,就可以调用 LIME 图像解释器的 explain_instance ()方法来生成模型预测的解释。
图像预测的说明由模板图像和相应的掩模图像组成。这些图像可用于以不同方式解释 ConvNet 模型预测结果。
图二。将解释上述两个样本的预测。ConvNet 模型预测左图像为负(IDC: 0),右图像为正(IDC: 0)。
说明 1:正 IDC 的预测(IDC: 1)
图 3 显示了用于解释通过石灰的模型预测的正 IDC 图像。
图 3。IDC_1_sample:待解释的正 IDC 样本的预测
下面的代码是为图 3 中的图像 IDC_1_sample (IDC: 1)生成模型预测的解释对象explain _ 1。**
在本说明中,白色用于指示支持模型预测的图像部分( IDC: 1) 。
*explanation_1 = explainer.explain_instance(IDC_1_sample,
classifier_fn = simple_cnn_pipeline.predict_proba,
top_labels=2,
hide_color=0,
num_samples=10000,
segmentation_fn=segmenter)*
一旦得到模型预测的解释,就可以调用它的方法 get_image_and_mask ()来得到模板图像和对应的掩膜图像(超像素):
*from skimage.segmentation import mark_boundariestemp, mask = explanation_1.get_image_and_mask(explanation_1.top_labels[0],
positive_only=True,
num_features=20,
hide_rest=True)
plt.imshow(mark_boundaries(temp, mask))*
图 4 以灰色显示了给定 IDC 图像的隐藏部分。图像的白色部分表示给定 IDC 图像中支持正 IDC 模型预测的区域。
图 4:通过隐藏原始图像细节来解释图 3 中的正 IDC 的模型预测。白色表示支持模型预测的区域。灰色部分不支持或与模型预测无关。
下面的代码以黄色显示 IDC 图像区域的边界,支持正 IDC 的模型预测(见图 5)。
*temp, mask = explanation_1.get_image_and_mask(explanation_1.top_labels[0],
positive_only=True,
num_features=20,
hide_rest=False)
plt.imshow(mark_boundaries(temp, mask))*
图 5:用原始图像细节解释图 3 中的正 IDC 的模型预测。黄色表示图 4 中支持模型预测的白色区域的边界。灰色区域要么不支持,要么与预测无关。
说明 2:非 IDC (IDC: 0)的预测
图 6 示出了用于解释经由石灰的模型预测的非 IDC 图像。
图六。IDC_0_sample:要解释的负 IDC 样本的预测
下面的代码是为图 6 中的图像 IDC_0_sample 生成模型预测的解释对象explain _ 2。在本说明中,白色用于表示支持非 IDC 的模型预测的图像部分。
*explanation_2 = explainer.explain_instance(IDC_0_sample,
classifier_fn = simple_cnn_pipeline.predict_proba,
top_labels=2,
hide_color=0,
num_samples=10000,
segmentation_fn=segmenter
)*
一旦获得了模型预测的解释,就可以调用其方法 get_image_and_mask ()来获得模板图像和对应的掩膜图像(超像素):
*temp, mask = explanation_2.get_image_and_mask(explanation_2.top_labels[0],
positive_only=True,
num_features=20,
hide_rest=True)
plt.imshow(mark_boundaries(temp, mask))*
图 7 以灰色显示了非 IDC 图像的隐藏区域。图像的白色部分表示给定非 IDC 图像中支持非 IDC 模型预测的区域。
图 7:通过隐藏原始图像细节对图 6 的负 IDC (IDC: 0)的模型预测的解释。白色表示支持模型预测的区域。灰色部分不支持或与模型预测无关。
下面的代码以黄色显示 IDC 图像区域的边界,支持非 IDC 的模型预测(参见图 8)。
*temp, mask = explanation_2.get_image_and_mask(explanation_2.top_labels[0],
positive_only=True,
num_features=20,
hide_rest=False)
plt.imshow(mark_boundaries(temp, mask))*
图 8。用原始图像细节解释图 6 的非 IDC(IDC:0)的模型预测。黄色表示图 7 中支持模型预测的白色区域的边界。灰色区域要么不支持,要么与预测无关。
结论
在本文中,我使用 Kaggle BCHI 数据集[5]来展示如何使用石灰图像解释器[3]来解释 IDC 乳腺癌诊断中 2D 康文内特模型的 IDC 图像预测结果。通过将超像素/特征的数量(即方法 get_image_and_mask ())中的 num_features 参数)设置为 20,提供了对 IDC 和非 IDC 的模型预测的解释。
我观察到解释结果对超级像素/特征的数量的选择很敏感。需要领域知识来调整该参数,以实现适当的模型预测解释。输入数据(在这种情况下是图像)的质量对于合理的结果也非常重要。增加更多的样本可以提高精确度。
Github [6]中提供了一个 Jupyter 笔记本,其中包含了本文中使用的所有源代码。
参考
[1] M. T. Ribeiro,S. Singh,C. Guestrin,“我为什么要相信你?”解释任何分类器的预测
[2] Y. Huang,面向医疗保健的可解释机器学习
[3] 关于图像分类的石灰教程
[5] 预测乳腺癌组织学图像中的 IDC
[6] Y .黄,朱庇特笔记本
披露声明:2020 年。本文中表达的观点仅代表作者的观点,不代表阿贡国家实验室的观点。
知识图中可解释、高效和准确的节点分类
用 MINDWALC 挖掘区别性行走
1.用(知识)图表示更丰富的数据
图形是一种数据结构,可用于表示无处不在的现象,如社交网络、化学分子和推荐系统。它们的优势之一在于,它们显式地对单个单元(即节点)之间的关系(即边)进行建模,这为数据增加了额外的维度。我们可以用 Cora 引用网络来说明这种数据的丰富。这是一个数据集,包含了几百篇论文的单词包表示以及这些论文之间的引用关系。如果我们应用降维(t-SNE)来创建单词袋表示的 2D 图,我们可以看到(相似研究主题的)聚类出现,但它们重叠。如果我们生成一个嵌入图网络,考虑到引用信息,我们可以看到聚类被更好地分离。
左图:每篇论文的单词袋表示的 t-SNE 嵌入。右:图网络产生的嵌入,考虑了论文之间的引用。来源:Velickovic 等人的“Deep Graph Infomax”。
知识图是一种特殊类型的图。它们是多关系的(即不同类型的关系有不同的边)和有向的(即关系有主体和客体)。幸运的是,我们可以将知识图转换为正则有向图,这便于进一步的分析。
将多关系有向知识图转换为正则有向图。
2.(知识)图中的节点分类
图形越来越多地被用于各种机器学习任务。例如,可以在社交网络中向用户推荐新朋友,预测一个人在协作网络中的角色,或者在生物交互图中对蛋白质的角色进行分类。在这篇文章中,我们将重点关注节点分类的任务:我们在一个图中获得了一组标记节点,需要创建一个模型来预测未标记节点的类别。
在本帖中,我们将使用一个运行示例,目标是将研究人员分类到正确的机构中。下面我描绘了 5 名研究人员。他们的颜色与他们的机构相对应。我们可以检索这些节点的邻居来扩展我们的图。可以看出,图表的大小增长很快。经过 2 次迭代的扩展,我们不再能直观地看到我们的图形。
通过检索节点的邻居来扩展我们的图。经过 2 次迭代后,很难将图形可视化。
3.遍历和通配符
我们的目标是挖掘对某一类非常有区别的行走(或图中的路径)。我们可以按如下方式记录一次行走:
一个 n 跳行走的例子。
如果它有向“v0”的方向,则可以在“根”的邻域中找到这个行走**。从那里,“v0”和“v1”之间必须存在有向边,如此类推,直到我们到达“vn”。如果突然我们不能再穿过一条边到达下一跳,我们就说找不到**了。****
此外,我们在遍历中引入了通配符(" * ")。这个通配符的语义是任何顶点都可以在那个位置匹配:
在我们的行走中引入通配符。
现在,如果它具有到节点的有向边,该节点具有到 v1 的有向边,则可以在根的邻域中找到该行走。中间节点上的标签无关紧要。
4.MINDWALC:有效挖掘歧视性行走
MINDWALC(MiningInexpertable,Dis criminativeWalks forCclassification of Nodes In a Knowledge Graph)是一种允许高效地挖掘特定格式的遍历的技术。一次 l 跳的遍历必须由 l-1 个通配符组成,最后跟一个顶点:
如果 x 可以在 l 次跳跃中到达,则可以在根的邻域中找到这种行走。由于这种走查的格式,我们可以引入一个数据结构,该数据结构将允许测试是否可以在恒定时间内在一个邻域中找到这样的走查。数据结构是一个集合列表。列表中索引 I 上的每个集合包含可以在恰好 I 跳中到达的节点。下面显示了如何构建该数据结构的代码片段:
构建一个数据结构,允许在恒定时间内测试行走的存在
MINDWALC 的目标是找到能最大限度获取信息的行走方式。信息增益可以被定义为由数据划分导致的熵的减少。熵是对不确定性的一种度量,如下所示:
熵是不确定性的度量。不确定性越多,熵就越高。
由于我们可以在恒定时间内测试这些特定行走的存在,我们可以对所有可能的**(深度,顶点)候选**进行强力搜索。深度定义了我们遍历中的跳数(因此我们将使用深度为 1 的通配符),顶点是我们最后一跳的标签。
MINDWALC 允许快速计算所有可能行走的信息增益。
5.将挖掘算法与分类技术相结合
我们的挖掘算法可以与几种分类技术相结合。首先,我们可以递归地应用该算法,以便归纳出一个决策树。最终的模型是完全可解释的,因为我们可以很容易地将整个树可视化,或者在我们的决策树中突出显示所采用的路径以形成预测。在这篇文章中,我们将通过检查和讨论一个归纳决策树来进一步证明这一点。第二,我们可以归纳出多个决策树,每个决策树都有训练实体和可能的子结构的子样本,以便形成一个森林。这种集成技术通常导致更好的预测性能,但代价是较低的可解释性和较长的训练时间。最后,我们可以通过对数据执行一次遍历来分离建模和挖掘,以挖掘信息丰富的行走集合。然后,这些遍历可以用于创建高维二进制特征向量(特征变换),这些向量可以被传递给任何分类算法。
6.可解释的和最先进的分类结果
我们使用四个基准数据集将我们的技术与两个黑盒替代方案进行了比较。黑盒替代品是 RDF2Vec 和 R-GCN 。下表列出了四个基准数据集的属性:
我们研究中使用的四个基准数据集的属性。AIFB 数据集对应于本文中使用的运行示例。
对于每个数据集,我们运行了 10 次。在测试集上获得的平均准确度分数及其相应的标准偏差总结如下:
两种黑盒方案和我们的算法的分类精度。
这些结果清楚地表明,对于 KGs 中的节点分类,所有三种提出的技术至少与当前最先进的技术相竞争。最后,我们检查了在 AIFB 数据集上归纳的决策树,这是我们对不同研究人员进行分类的运行示例:
在 AIFB 数据集上诱导的决策树。
在根节点中,我们找到了行走root->->->->->->viewProjektOWL/id68 instance*。当这个遍历可以在一个实例的附近找到时,它就不再属于研究机构 id4instance ,因为这个叶子没有出现在右边的子树中。此外,通过在我们的遍历中使用通配符,这种类型的遍历已经展示了具有固定深度的附加值。事实上,从一个实例到一个类型为项目的实体,只需要两次跳跃(例如root->->viewProjektOWL/id68 instance*)就可以结束,但是这导致的信息增益比需要六次跳跃时少得多。当检查原始 KG 时,似乎只有两个人直接参与了项目**id68 实例,或者换句话说,只有两跳的路径可以匹配。另一方面,这两个人似乎与他们所属的其他研究人员一起写了相当多的论文。因此,首先从某个人(根)跳转到他或她的一篇论文,并通过作者谓词从那里转到前面提到的两个人中的一个,可以找到来自从属关系ID3 实例的 45 个人、来自id2 实例的 3 个人和来自id1 实例的 2 个人。从根开始的右边子树中的剩余节点信息较少,因为这些节点试图将来自两个附属关系 id2instance 和 id1instance 的 5 个人与其他 45 个人分开。
7.结论
这篇关于 MINDWALC 的博文到此结束。MINDWALC 是一种算法,它允许在知识图的节点分类的上下文中挖掘特定类型的行走,这些行走对于某些类(组)是有信息的。此外,我们表明,这种算法是一个很好的预测模型的基础,当结合使用在这项工作中提出的三种不同技术之一。在四个 KG 基准数据集上的实验表明,我们提出的方法优于当前最先进的技术,同时,与这些技术相比,是完全可解释的。这对于关键领域的应用非常重要。
参考
- Velič ković,Petar 等人,《深度图 infomax》 arXiv 预印本 arXiv:1809.10341 (2018)。
- 用图卷积网络建模关系数据。欧洲语义网大会。施普林格,查姆,2018。
- 《RDF2Vec: RDF 图嵌入及其应用》语义网10.4(2019):721–752。
- 引导一棵有区别路径的决策树来分类知识图中的实体。 SEPDA2019,第四届语义驱动的数据挖掘与分析国际研讨会。2019.
- https://github.com/IBCNServices/MINDWALC
可解释的 MNIST 分类:对一个网络的剖析
解释在 MNIST 图像分类中一个 ConvNet 的决定。
神经网络怎么把图像分类的这么好?尽管在准确性方面取得了很大进展,但我们还无法解释神经网络的内部工作方式。
卷积神经网络(ConvNet)只是简单数学函数的组合——构建块(BB)。这些论坛本身更容易理解,我们可以通过仔细查看它们的参数(权重)和观察它们如何转换输入来了解它们在做什么。
由于每个 BB(大部分)都可以自己解释,而 ConvNet 只是这些 BB 的组合,我们应该能够组合 BBs 的所有小解释,并建立对 ConvNet 如何工作的整个机制的理解,对吗?
这是我想探究的问题。举个简单的例子,我想了解在 MNIST 训练过的 ConvNet 如何对数字图像进行分类,并受训练过的 ConvNet 的启发,基于更简单的 BBs 手工构建一个 ConvNet(没有训练),它将模仿原始 ConvNet 的 BBs,但它们会更受约束,因此有望更容易解释。
我从剖析一个在 MNIST 上训练的 ConvNet 开始(我称之为 SimpleConvNet ),我发现其中一个卷积层可以完全省略,因为它只是复制了前一个卷积层的输出。我还发现了 BBs 的双重性,即 BBs 既被用来检测模式,又被用来检测那些模式的位置。在理解了 SimpleConvNet 的 BBs 之后,我开始用手构建一个 ConvNet(我将称之为 HandNet)包含更多约束(因此比使用 backprop 更容易调整)的 BBs。我发现手工制作的 ConvNet 性能要差得多,但经过微调后,它的精度与 SimpleConvNet 不相上下。HandNet 相对于 SimpleConvNet 的优势在于,理解和解释其内部工作方式要容易得多。
在本文中,我将详细解释 SimpleConvNet 的剖析。在第 2 部分中,我将展示我如何使用更多的受限 BBs 来构建 HandNet。
如果您想跟随代码,调整代码,或者对您的网络进行类似的剖析,本文有一个 Colab 笔记本。
这是文章其余部分的大纲
术语
首先,我将在本文的其余部分使用一些术语:
我用 PyTorch 符号表示卷积层:输入是形状的( N 、 C in、 H 、 W )。输出的形状为( N 、 C out、 H out、 W out)。卷积将被说成有 Cin 内层 通道和 Cout 外层 通道。
我将在整篇文章中使用基于 1 的索引,因为它使图表更容易理解。
剖析网络
培养
我首先用一个相当简单的架构训练了一个 ConvNet,如下所示。
(con v1+relu+max pool)→(con v2+relu+max pool)→(con v3+relu+max pool)→扁平化→ fc4 → fc5 → log_softmax。使用此工具生成的图像。
我主要对剖析卷积层感兴趣,因为全连接层非常简单,因为它们只是实现了线性组合。以卷积为例,我们看到 conv2 权重(形状为[64,32,5,5])将由 64x32=2048 个大小为 5x5 的网格组成。手动标注的网格数量相当大,所以我决定缩小网络的规模。
我反复修剪了 conv 的外通道(见术语部分关于外通道的解释)。基于下述标准的层:
- 那些活化变异小的。
- 看起来像噪声的那些(与看起来像模式检测器(如 Gabor 滤波器)的那些相对)。
conv1 中看起来像噪声的网格示例(左)与模式检测器示例(右)
简单超级刺激(左)与具有清晰模式的超级刺激(右)的示例
- 外部通道不会选择性地响应来自 MNIST 的输入或策划的合成输入。
选择性反应的例子。左图:MNIST 数字——conv。选择性地响应数字 9 的对角线部分。右图:策划合成输入——conv。选择性地响应垂直线。
***我修剪了整个外部通道,而不仅仅是一些内部通道,因为在给定的外部通道中只移除一些内部通道会使卷积运算不规则并且有点难看😬。
在每一次剪枝迭代后,ConvNet 的精度略有下降,但重新训练网络很快恢复到剪枝前的精度,这表明许多权重是无用的。修剪去除了无用的权重,这些权重本质上是噪声,并且它使分类的本质更接近表面。希望只有少量的路径用于分类,其余的都是噪音。
在每一次修剪迭代后重新训练 ConvNet 会恢复修剪前的精度
最终架构(7 次修剪迭代后)如下所示。正如你所看到的,每一层的深度都明显减少了。
修剪后的最终架构。使用此工具生成的图像。
我们有 3 个 conv 层,接着是扁平化,然后是 2 个全连接(fc)层。(con v1+relu+max pool)→(con v2+relu+max pool)→(con v3+relu+max pool)→扁平化→ fc4 → fc5 → log_softmax
解剖
Conv1
让我们先来看看形状为[8,1,5,5] (8 个外通道,1 个内通道,5×5 网格)的 conv1 的权重:
以及它们对 MNIST 随机输入的激活:
以及它们在合成输入上的激活(在图中,我用一条线代表每个方向:水平、垂直和 2 条对角线):
上面的 3 幅图像强烈表明,conv1 中的第一个滤波器检测斜率= 45°的线(从权重可以看出,该模式类似于斜率= 45°的线)。用于角度的坐标框架如下所示:
类似地,第二和第三滤波器检测垂直线。不过两者的区别在于第二个滤镜检测的是垂直线的左侧,第三个滤镜检测的是右侧。如果我们对所有过滤器都做这个练习,我们可以从过滤器的索引(从 1 开始)到它检测的模式得到以下映射:
conv1 滤波器说明—从滤波器索引到其检测模式的映射
我们可以看到一些模式是重复的:索引=3 和 6 的过滤器检测相同的“垂直线的右侧”,索引= 4 和 7 的过滤器检测相同的“水平线的下侧”。还要注意,这些过滤器作为一个集合似乎跨越了线方向的整个空间,尽管是一个非常离散的方向(增量为 45 度)。(由以下角度组成的空间:[0,45,90,135])
请记住,conv2 不会直接看到 conv1 的输出。中间有 ReLU 和 MaxPool。因此,当 conv2 发现时,负值和大部分低正值将从 conv1 的输出中消失。
Conv2
Conv2 形状为[16,8,5,5] (16 个外通道,8 个内通道,5x5 网格)。现在,我们不能只看 conv2 的权重,因为这需要可视化 168=128 个大小为 5x5 的滤波器,这有点太多了。此外,conv2 外部通道(有关外部通道的定义,请参见“术语”部分)不仅仅是滤波器与图像的卷积(conv1 就是这种情况),而是这种卷积的线性组合(因为与 conv1 不同,conv2 内部通道不等于 1),这使得仅通过查看 128 个滤波器很难想象 conv2 的机制。因此,现在,我们将跳过直接可视化权重。相反,让我们开始为 conv2 的每个外部通道(共有 16 个)可视化超级模拟(参见特征可视化了解超级模拟*的定义)。
conv2 外部通道的超级模拟
superstimuli 可以提示 conv2 的每个外部通道试图检测的内容。例如,它表示索引=3 的外部通道(我们称之为 conv2_3)正在检测斜率=135 的对角模式。
conv2_3 的超刺激
来自 MNIST 的随机输入激活 conv2 外部通道;
让我们看看 conv2_3 的激活情况。我们已经从它的超刺激中看到,它试图检测斜率= 135°的对角线模式。上面的激活似乎证实了这个假设——只有斜率=135 的数字 0 的对角线部分被这个外部通道突出显示:
让我们更仔细地看看 conv2_3 是如何实现的:
conv2_3 的切割激活
让我解释一下这个庞大的图表。
- 第一列:conv2 的总输入(即 max pool(relu(con v1 的输出))。我们将用 x_j. 来表示该列中的行 j
- 第二列:我们在上一节中发现的 conv1 的每个外部通道的描述。这个专栏应该描述第一个专栏(尽管它并不完美)。
- 第三列:conv2_3 内部通道的索引(从 1 开始)。
- 第四列:conv2_2 的每个内部通道的权重。我们将用 w_j. 来表示该列中的 j
- 第五列:该列第行 j 是 x_j 与 w_j 的卷积,即a _ j= x _ j∫w _ j。( a 为激活)
- 第六列:该列第行 j 是所有 a_j 的累加,即c _ j=σa _ k 从 k=1 到 k=j* (c 为累加)。而最后一行是c _ 8 = Bias+σa _ k 从 k=1 到 k=8 (bias 从第四列最后一行开始)。*
- 第七列是 conv2_3 的输出。只是复制了第六列的最后一行。我们将把它表示为 y 。本质上,conv2_3 只是对其内部通道的各个卷积求和(x _ j∫w _ j)
***为了便于比较,每列内的色标都进行了重新标准化。(因此,第五列和第六列的第一行实际上具有相同的值,但它们看起来不同,因为对它们应用了不同的颜色标准化)。
让我们开始分析每一行。
- **a _ 1 = x _ 1∫w _ 1没有传达任何意义,通过查看conv2_3 的总输出,即 y ,,看起来 a_1 对 y 没有任何影响。这很有可能是由于 a_1 被其他 a _j 的淹没,所以我们忽略这一行。
- w_2 好像检测到斜率=135 的线。通过查看a2我们看到这是真的,但是a2非常弱,因此我们看不到a2对总产量 y 的贡献。我们也将忽略这一行。**
- 通过查看 a_3 ,似乎索引=3 的行正好否定其输入 x_3 ,即“垂直线的右侧”。它通过在其权重网格(第 4 列,第 3 行)的中心附近有一条强负垂直线来实现这种否定。所以我们将 a_3 的描述表示为 neg(“垂直线右侧”)。
- *a_4 是对 y 的第一次重大贡献。你可以看到从C4开始,它下面的所有东西都有两个亮点,它们出现在 y (斜率=135 的数字 0 的部分)。w_4 只寻找斜率为 135 的线,这与其输入 *x_4,*重叠,因此斜率为 135 的线在 *a_4 中高亮显示。所以我们只是在 a_4 中看到更多的“坡度为 135 度的线”。
**** ( x_4 的描述是*“水平线的下侧”但是在这个特定的图像中,conv1_4 似乎检测对角线——你永远无法用神经网络_(ツ)_/ 100%确定。实际上,如果您仔细观察 conv1_4 的权重(如下所示),它有一个非常模糊的提示,即它正在检测斜率为 135 的线(下图中突出显示)。我把这些类型的模式称为 conv 的次要功能。过滤器。我将主要省略这些,只关注主要的,因为它们通常比次要的更强。但我们必须时刻牢记,除了 conv,可能还有第二种,甚至更多的模式。过滤器检测)。**
conv1_4 的辅助功能
我们已经完成了 conv2_3 的一半。我将复制 conv2_3 解剖图,以便您可以少滚动一点:)
conv2_3 的切割激活
- 第 5 行: w_5 通过在 w_5 网格中有一条与 x_5 (即“水平线的上侧”)匹配的强负水平线来否定 x_5 。我们将 a_5 的描述称为 neg(“水平线的上侧”)。
- w_6 看起来像是检测竖线,但是不明确。a6看起来也不是很强,因此它对 y 没有显著贡献,因此我们也将忽略这一行。
- w_7 有一条水平亮线,因此很可能检测到再次与其输入 x_7 (“水平线的下侧”)匹配的水平线。净贡献 a_7 是复制的 x_7 ,但与其他*a _ j相比,此贡献较弱,这可以从第 5 列中其褪色的颜色看出。因此,我们将该行标记为弱行(“水平线的下侧”)。*
- 最后一行是迄今为止最重要的贡献,您可以从剖析的激活列中看到。它对净输出 y 的影响最大。A8的大小比其他A8的大得多,因为w8的大小(和对比度)比其他w8的大得多。从w8的网格中可以看到(如下所示),它在负值和正值之间具有非常高的对比度(周围有非常亮和非常暗的斑点),因此它有非常强的趋势更重要的是, w_8 试图检测的模式与其输入匹配(再次!) x_8 即“坡度为 135 度的线”。这只是加强了由 x_8 检测到的模式,并且我们在 a_8 中看到对斜率为 135 的线的非常强的选择性。
w_8。正值用红色圈出,负值用蓝色圈出。正负数值的排列形成一条斜率=135 的线。因此,该滤波器强烈响应斜率=135 的线。
我们已经分析完了每一行。现在让我们把它们放在一起。
- 我们忽略了第 1、2 和 6 行
- 第 3 行是 neg(“垂直线右侧”)
- 第 4 行是“斜率为 135 度线”
- 第 5 行是负数(“水平线的上边”)
- 第 7 行弱(“水平线的下侧”)
- 而第 8 排是强(“坡度为 135 度的线”)
y 变成 y = 0 + 0 + neg(“垂直线右侧”)+ “坡度 135 度的线”+ neg(“水平线上侧”)+ 0 +弱(“水平线下侧”)+ 强(“坡度 135 度的线”)+偏
其中 0 表示行 1、2 和 6 的贡献可以忽略。让我们简化一下:
y = neg(“垂直线的右边”)+ neg(“水平线的上边”)+ weak(“水平线的下边”)+ strong (“斜率为 135 度的线”)
其中来自第 4 行的贡献被归入第 8 行的贡献,我们忽略偏差,因为它只是将所有值移动了某个常数。如果我们看一下 y
左:y,右:A8
我们看到每行都有一些贡献,但它们的大小都不同。到目前为止,A8的相对大小是最强的,所以它最终支配了对 y 的其他贡献。并且 y 最终看起来很像 a_8 。ReLU 和 MaxPool 应用于 conv2 后, y 和 a_8 会更加相似。所有负值在 ReLU 之后都会消失,所以我们不会看到 y 中的黑点。
从剖析 conv2_3 中我们发现了什么?两件事:
- 许多内部通道试图复制它们的输入,即 w_j 的模式通常与 x_j 的模式相似。当 w_j 检测到的模式与 x_j 的描述非常匹配时,我们在第 4、5、7 和 8 行看到了这种情况。
- 对总产量的强贡献只有一个。基本上所有其他行都是噪音,我们可以只处理最后一行。
*conv2_3 只是一个例子。我们可以分析 conv2 在不同输入上的其他外部通道,您可以在 Colab 笔记本中完成。在解剖了其中一些之后,我发现这些 *2 的发现在其他 conv2 外部通道中也基本成立。例如,参见 conv2_6 和 conv2_9 的 Colab 中检测水平线的解剖;以及检测垂直线的 conv2_13。
关于 conv2,我们一般能得出什么结论?基于这两个发现,只有一个来自内部通道的强贡献,并且该贡献模仿 conv1 的输出之一(因为内部通道复制其输入)。这意味着 conv2 的外部通道大部分时间的功能只是放大 conv1 的一个输出,conv2 的总输出最终只是一串放大的 conv1 输出。
我们可以完全省略 conv2 吗?我认为是的,因为 conv2 并没有在 conv1 的基础上增加任何新的东西。当然,有一个额外的冗余层可能是有益的,也许 conv2 层可以检测到我们无法从上面的分析中推断出的某些高频模式,但我认为对于像 MNIST 分类这样简单的任务来说,没有必要。
Conv3
现在,我们将剖析最终的卷积层。让我们比较一下 conv3 和 conv2 的权重分布。下图左侧是 conv2 权重的随机样本,右侧是 conv3 权重的随机样本。
左:conv2 砝码,右:conv3 砝码
如果你仔细观察权重,你可以看到 conv2 有很多权重(网格),形成类似 Gabor 滤波器的模式。其中一些如下所示
然而,conv3 的这类滤波器相对较少。相反,conv3 的大多数网格都有*“像素爆发”**,在灰色网格值中有一两个非常亮或非常暗的像素。这些过滤器类似于椒盐噪声。下面是一些例子*
这种像素突发滤波器的目的是什么?理论上,当卷积的输入在相同位置具有类似突发时,在网格中的特定位置具有小突发的滤波器应该最大程度地激活。这可能意味着 conv3 像素突发滤波器在网格内的特定位置寻找来自 conv2 的激活。
爆发的位置可以用[ α,d] 来描述,其中 α 是角度(下方时钟指针的方向) d 是距中心的距离。此外,我们可以使用+或-符号来表示脉冲是正的还是负的。例如,上面的第二个过滤器查找 7:30 的激活。使用上面描述的符号,上面的过滤器寻找+[7:30,2√2],这意味着它在角度=7:30 点和距离 2√2 处寻找正激活。
conv3 输入(7x7)几乎与 conv3 权重滤波器(5x5)大小相同(conv3 输出大小为 3x3),这一事实支持了我们关于突发用于选择激活位置的假设。让我来解释一下。
在最常见的卷积情况下,卷积运算的输入维数比滤波器的维数大得多。例如,输入可能是 28x28,过滤器可能是 5x5。在这种情况下,滤波器只看到输入的一小部分,并且滤波器充当等变模式检测器。然而,对于我们的 conv3,输入大小(7x7)与滤波器大小(5x5)几乎相同。因此,滤波器具有几乎 100%的感受野,当您将滤波器覆盖在输入上,并考虑滤波器将对该输入做什么时,滤波器会在滤波器具有高值的位置寻找激活,这有点道理。
因此,当输入尺寸近似等于滤波器尺寸时,滤波器的功能从模式检测变为位置检测。这就是我们 SimpleConvNet 中卷积滤波器的双重性()——卷积用于检测模式及其位置。
*此外,请注意 conv3 之后有 ReLU 和 MaxPool (3x3 ),之后 MaxPool (1x1)的输出被传递到完全连接的层。因此,conv3 输出的重要之处在于 3x3 网格内的最大值。最大值和其他负值的位置被忽略。虽然在执行加法c _ j =σx _ k∫w _ k的中间步骤中,最大值和负值的位置很重要。
为了对 conv3 滤波器的位置选择性而非模式选择性进行某种确认,我们来看看几个合成输入的激活情况。
各种合成输入上的 conv3_21 输出
左边是合成输入,右边是 conv3 的第 21 个外部通道的输出。相同的图案(水平线)呈现在相同外部通道的不同位置。外部通道对水平线的响应不一致。这个外部通道的激活取决于图案的位置。当水平线在图像中间时,激活度最高。另一方面,conv3 的第 6 个外部通道检测图像顶部的水平线:
各种合成输入上的 conv3_6 输出
我们现在将重点关注 conv3_6。一些支持证据表明 conv3_6 在图像顶部寻找水平线:
- 下图显示了 MNIST 最大程度激活 conv3_6(应用 ReLU 和 MaxPool 后)的前 20 个输入。
最大程度激活 conv3_6 的前 20 个输入
- 下面也是来自 MNIST 的随机输入和它们相应的 conv3_6 激活。数字 9、6 和 5 的激活很强。但是对数字 7 的激活不是很强。我们将在后面看到,conv3_6 不仅在顶部寻找水平线,而且 conv3_6 还是其他检测器的组合。其中,有一些抑制其激活的“反模式”。数字 7 的对角线部分可能是抑制因素之一。当我们分析 conv3_6 如何处理数字 7 时,我们将对此进行验证。
- conv3_6 的超级模拟如下所示。这不是 100%的结论,但至少有一个轻微的暗示,它正在寻找图片顶部的水平线
conv3_6 超级刺激
现在我们已经看到了一些证据,表明 conv3_6 在图像顶部寻找水平线,让我们分析一下外部通道是如何实现这种位置选择性的。我们将首先剖析数字 5,因为这是 MNIST 数据集中最大程度激活 conv3_6 的数字。下面是输入和分解的 conv3_6。
**
我们将查看每一行的权重(使用索引作为标识符),并使用前面定义的时钟符号
- 索引 1 是不明确的,所以我们将跳过它。
- 指数 2 寻找+[10,2√2]和-[8,√5]的模式。它的输入看起来像是数字 5 的垂直部分,所以这个内部通道喜欢 10 点钟方向的垂直线,但不喜欢 8 点钟方向的垂直线。
- 索引 3 的输入有点模糊,所以我们将跳过这一个。
- 指数 4 是对总产出的最大贡献之一。它有+[1,√5],+[9,2]和-[3,1]。它的输入是水平线检测器的输出,所以索引 4 喜欢 1 点和 9 点位置的水平线,不喜欢 3 点位置的水平线。我认为这解释了 conv3_6 如何检测顶部的水平线:1 点钟位置的水平线激励这个内部通道,9 点钟和 3 点钟位置的水平线分别激励和抑制激活,从而相互抵消。请注意,索引 7 与索引 4 有些相似之处。
- 对于其他行,您可以遵循这个分析,因此我将跳过无聊的行,专注于最强的贡献。
- 指数 9 在 12 点钟方向有一个巨大而明亮的斑点。它的输入也是水平线,所以我们看到顶部水平线的大贡献。
- 指数 12 在中心附近有一个巨大的黑色斑点。它的输入也是水平线,因此我们看到来自中间水平线的**大负贡献**。
总的来说,顶部的水平线有很大的贡献,中间的水平线有很大的不喜欢,不同位置的其他图案有一些小的贡献。
让我们快速地对数字 7 做同样的剖析。
**
上图中的亮点:
- 索引 4 和 9 通过检测顶部水平位置再次起作用。
- 指数 12 不喜欢靠近中心的水平部分,但在这个特定的图像中,这是一个错误的不喜欢,因为更靠近顶部的数字 7 的水平部分最终与权重中的负斑点重叠。
- 索引 13 对数字 7 的对角线部分有一点贡献——它喜欢中心的对角线,不喜欢 1 点和 9 点位置的对角线。
我希望上面的 2 个剖析至少在某种程度上让您相信 conv3_6 更喜欢图像顶部的水平线,它通过在检测水平线的输入顶部叠加“像素突发”样式的过滤器(突发靠近网格顶部)来实现这种选择性。
**conv3 结论:解剖了很多 conv3 外通道,我学到了什么?一个 conv3 外部滤波器不仅仅代表某个位置的一种模式,而是不同位置选择的组合,不一定是同一模式。例如,conv3_i 可以在+[12,2],-[6,2]处寻找水平方向的组合;以及在中心具有 45°斜率的线和在+[3,2]处的垂直线。
我们在上面对 conv3_6 的两次剖析中也看到了这一点——除了顶部水平线的主要贡献之外,还有其他贡献,如 10 点钟方向的垂直线。conv3_6 总结了所有这些贡献。所以 conv3_6 是对各种模式的各种位置选择性的混合。
我们已经学完了卷积层,现在我们来看看全连接(fc)层。
完全连接的层
我们的 SimpleConvNet 在 conv3 之后有两个完全连接的层:fc4 和 fc5。
我们看到每个 conv3 神经元在不同位置检测不同模式的组合。我们希望 fc4 和 fc5 层以某种方式使用这些信息对图像进行分类。他们可能会组合这些特性,或者将每个组合分解成更有用的特性。
FC 层非常简单,只是一个矩阵乘法,但是很难理解。本质上,一个 FC 层只接受一个向量并产生另一个向量,其中输出向量中的条目是输入向量中条目的线性组合。此操作的二次方复杂性正好压倒了理解一个 FC 层的内部工作的任何尝试。
鉴于 FC 层包含太多参数,我没有尝试进一步分析它们。我的直觉是,conv3 层输出已经很好地将高维空间中的图像划分为不同的类别。FC 层只是扩大了类别之间的界限,这样就更容易对图像进行分类。
考虑 FC 层的另一种方式是,它们只是从 conv3 转换位置选择性的基础。也就是说,它们将位置选择性的交织组合转换为“标准”基础,其中有用的要素位于正交轴上。
如果我们在 FC 和 conv3 层上使用 PCA 和 t-SNE 等可视化技术,您可以看到 conv3 层确实已经很好地将数据集分成了不同的类,FC 层进一步改善了这种分离。以下是 PCA 和 t-SNE (3D)投影的屏幕截图:
- 原始 28x28 输入图像。
原始投入预测
- 1x1x24 conv3 输出。
conv3 预测
- 1x1x16 fc4 输出
fc4 预测
- 以及 1x1x10 fc5 输出,这是网络的最后一层(在 softmax 之前)。
fc5 预测
你可以在 Colab 笔记本中找到投影的互动 3D 版本。
解剖结论
我们看到 conv1 只是实现了一个非常简单的模式(线)检测器。它只检测不同角度的线条。Conv2 试图放大 conv1 的输出,因此它实际上没有增加任何新内容,我们可以忽略它。Conv3 为 conv1 检测到的模式选择位置。这是通过使用权重过滤器的双重性相当优雅地实现的。在 conv3 之后,我们能够在图像的不同位置检测不同角度的线条。但是这些检测并没有分开,也就是说,我们没有一个神经元(来自 conv3)只检测图像顶部的水平线,相反,它们是交织在一起的——con v3 的每个神经元都检测这种位置选择性的混合。
全连接(FC)层的工作是解开和/或组合这些混合物,以便将纠缠的混合物转换成用于分类的有用特征(如顶部、中间和底部的水平+10 点和 4 点的垂直组成数字 5)。FC 层可能使用某些组合/纠缠之间的相关性来对数字进行分类。
我相信我们 SimpleConvNet 的黑盒性质(无法解释决策)来自于 conv3 中位置选择的纠缠。如果我们能够解开位置选择性(就像 FC 层那样,但它们本身并不太容易理解),我们将会得到一个完全可以解释的网络。我在第二部分的目标是从零开始建立这样一个完全可解释的网络。
从某种意义上来说,conv3 在向量不佳的地方选择了错误的基(它们是交织在一起的),我们的工作是通过选择我们感兴趣的方向变得正交的基向量来使 conv3 变得可解释,以便位置选择性变得完全交织在一起——孤立而不是位置选择性的混合。有没有一个矩阵可以将 conv3 原始输出转换成一个很好的基?这是一个我还没有探索过的问题。
手动构建网络
我们将在第二部分中建立手动检测 MNIST 数字的网络。在这里,我将简要概述第 2 部分的内容。
第 2 部分的一点小味道。
我们制作了一个手工分类器。我们可以省略 conv2,因此我们只需在手工分类器中用 conv3 构成 conv1。为了使这里的讨论与解剖讨论保持一致,我将继续使用相同的卷积数。也就是说,conv3 会直接跟在 conv1 后面(我不把 conv3 重命名为 conv2)。
更受约束的积木。我们用非常有限的版本模拟 conv1 和 conv3,这将使解释它们的决策变得容易。它们实际上可以自动化——不需要人工检查!受约束的版本将是权重的参数化栅格,即在栅格上绘制的参数化曲线。
例如,下图显示了具有各种斜率和西格玛参数的参数线。我们使用这些网格作为 conv1 层的权重。当我们训练 conv1 时,我们只允许调整 slope 和 sigma 等参数,而不是在通常的训练中对整个网格进行自由形式的调整。这样我们就可以使用参数自动解释con v1 的决策。
用作 conv1 权重的参数线。左:斜率=1.5,西格玛=0.3。右图:斜率=-0.5,西格玛=0.6
我们使用“参数突发”作为 conv3 的权重,con v3 也用几个参数进行参数化。训练时只允许调整参数。
参数突发用作 conv3 的权重。左:mean_x=0.6,mean=-0.7,sigma_x=0.7,sigma_y=0.7。右:mean_x=-0.4,mean_y-0.7,sigma_x=0.3,sigma_y=0.7。
使用这些权重的约束版本,我们首先构建一组 conv1 检测器,用于检测我选择的各种线。然后,我们在 conv1 之上构建 conv3 层,用于检测 conv1 模式的位置。然后,我们将 conv3 输出组合成一个数字。例如,要检测数字 5:
- 使用参数线为水平线和垂直线构建 conv1 检测器。
- 使用参数突发为图像顶部、图像中部、图像底部、图像 10 点钟位置和图像 4 点钟位置构建 conv3 检测器。
- 将 conv1 检测器输入 conv3 检测器,并按如下方式合并结果
数字 5 =顶部(横线)+中部(横线)+底部(横线)+ 10 点(竖线)+ 4 点(竖线)。
这只是第 2 部分的一个预览。我正在撰写第 2 部分,敬请关注。如果您想在第 2 部分准备就绪时得到通知,您可以提供您的电子邮件。
试试吧!
如果你想重现文章中的人物,这里有一个笔记本。您还可以调整代码或对您的网络进行类似的剖析。