UCB CS182 深度学习笔记(二)
就在今天讲座的最后一部分,我们要稍微换档,我们将从如何获得神经网络,为了更好地优化,谈论如何让他们更好地概括,为此,我们将讨论合奏和辍学,在最后,我们还将简要讨论如何选择所有这些超参数。这就是我们在进行机器学习时通常担心的问题,我们担心我们的模型会不会出错,以及如何让它少犯错误,所以问题是神经网络我们会有很多很多的参数,事实上,我们将使用的一些最大的网络。
P22:CS 182- Lecture 7- Part 3- Initialization, Batch Normalization - 爱可可-爱生活 - BV1PK4y1U751
就在今天讲座的最后一部分,我们要稍微换档,我们将从如何获得神经网络,为了更好地优化,谈论如何让他们更好地概括,为此,我们将讨论合奏和辍学,在最后,我们还将简要讨论如何选择所有这些超参数。
这就是我们在进行机器学习时通常担心的问题,我们担心我们的模型会不会出错,以及如何让它少犯错误,所以问题是神经网络我们会有很多很多的参数,事实上,我们将使用的一些最大的网络。
就像我们上次讨论过的这些巨大的大陆,实际上可能有比数据点更多的参数,这意味着它们确实有很高的方差,现在它们的方差远没有我们从基础学习理论中预期的那么高,所以基本学习理论,经典地告诉我们。
这种过度参数化的模型应该做得很差,但事实上他们做得不太好,至少当他们获得大数据集时,所以他们的过度适应往往不是灾难性的,如果你有足够的数据,但它们仍然有差异。
这意味着如果你在来自同一分布的不同数据集上训练它们,你会得到非常不同的解决方案,所以这里有一个有趣的想法,如果我们有多个高方差学习者,基本上,而不是训练一个神经网络,我们可以以某种方式训练许多神经网络。
也许这些多个神经网络都会同意正确的答案,但他们会在错误的答案上意见不一,这是另一种说法,错误的方式比正确的方式多得多,所以如果你在对有一千个可能类的imagenet进行分类。
只有一个类对任何图像都是正确的,但是九百九十九是错的,所以你希望如果你有很高的方差,你以某种独立的方式训练多个不同的模型,然后他们就会犯独立的错误,这意味着当其中一个模型出错时,另一个可能会。
但他们可能会以不同的方式犯错误,也许你可以利用这一点来获得更好的解决方案,通过寻找模型都能同意的答案,忽略他们意见不一致的地方,这就是合奏背后的基本直觉,我们接下来将讨论,所以让我用图形来说明这个直觉。
假设我们正在解决一个回归问题,假设绿色曲线代表真实函数,蓝点是我的训练套装,我训练了一个大型神经网络模型,也许它的解决方案是用这条橙色的线表示的,所以橙色线在我的训练数据附近很好。
但离开训练数据就很糟糕了,也许我可以用一个非常不同的初始化来训练另一个模型,也许非常不同,你知道随机梯度下降中的随机性,现在就得到解,这两个模型在训练集上都很好,他们两个在测试集上都很糟糕。
也许我会再试一次,然而,如果我看看这三个模型的平均值,也许他们的平均水平实际上会很好,意思是呃,他们都会不同意,但总的来说,他们的错误将集中在正确的答案上,当然这张照片有点理想化,但这是基本的直觉。
基本上,如果你训练足够多的模型,这些模型在不同的方式上都不一致,也许他们的平均水平实际上是一个很好的解决方案。
接近真实功能,所以我接下来要描述的是,构建所谓引导程序集合的理论上有原则的方法,然后我将讨论在实践中是如何做到的,在深度学习中,而且经常在深度学习中,实践与理论有些偏离,基于我们看到的工作良好。
方差是量化的,正如我们在课程前面讨论的那样,作为模型之间差值的期望值,我们从一些数据集的训练中得到的,d和训练分布中所有可能数据集的模型平均值,所以这里的f。
平均值只是我们从训练中得到的所有数据集的期望值,我们从对该数据集的训练中得到的函数的分布,正如我们在课程前面讨论过的,如果方差很大,您会期望您的误差很高,然而我们可以问,也许我们可以估计这个f巴。
因为如果我们能估计f巴,那么我们应该能够消除很多我们的差异,因为如果我们能估计f巴,你知道在酒吧会靠近F酒吧,因为这就是方差的定义,然后这个就会变成零,那么我们真的能估计这个期望值吗,比如说。
我们能不能,在每一个上面训练一个不同的模型,然后把这些模型加起来平均,本质上构造了一个基于样本的对这个期望值的近似值,那么我们就会期望,如果所有这些不同的FD模型不一致,在测试点上犯不同的错误。
那么也许他们的平均水平会被迫同意一些接近正确答案的事情,所以如果我们以某种方式得到许多不同的数据集,我们可以很容易地做到这一点,但是我们从哪里得到这些数据集,对呀,如果我们真的有20个不同的数据集。
我们最好把它们汇集到一个巨大的数据集中,只是训练而不是把它们分开,那么我们能从一个数据集中生成多个独立的数据集吗,不用喜欢,实际上数据较少,所以一个简单的,幼稚的方法是使用一个大数据集。
把它切成不重叠的部分,但那太浪费了,因为这样你基本上是在用更少的数据量训练每个模型,在这一点上,你可能会更好,只是训练一个大模特什么的,然后尝试将数据集切割成小部分,所以那不是,那可不好。
那不会给我们想要的,但也许我们不需要那些,m个数据集实际上不重叠,也许我们可以从一个大数据集中构造独立的数据集,那些独立的日子实际上和原来的一样大,但只是彼此不同,这似乎有点神秘。
但事实证明这实际上是可能的,所以我们要做的是,我们将构造多个重叠但独立采样的数据集,所以如果我们的原始数据集d,它由元组x组成,假设我们在d中有n个数据点,然后我们将构造n个不同的数据集。
他们每个人都叫DJ,每个也包含n个点,其中每一个点对应于原始数据集中的指数,从一到n中随机选择的,所以我们基本上会生成n个随机整数,它们中的每一个都在1到N之间,这些将是数据集DJ中点的索引。
所以我们会得到这些指数,i,j一,i,j二,i等,一直到我,约恩,然后我们将构造数据集DJ,你知道,j一,y i,j一,j二,y i,j二,等等,约恩,y i,约恩。
其中这些ij索引中的每一个都只是一个随机整数,介于1和,所以我们基本上是从原始数据集中重新采样数据点。
所以让我们呃,如果这个索引方案有点不清楚,让我们来看看这是如何工作的,这叫做替换取样,假设我们的原始数据集有三点,所以n等于3,当然在现实中你会有更多,但是为了在幻灯片上画这个。
我不得不用一个相当小的数字,假设我们正在构建我们的第一个重采样数据集,我们会把一个三面的模具,假设我们得到的随机数是2,这意味着我们选择x 2作为d 1中的第一个元素,然后我们再卷一个三面的模具。
我们得到了一个三,这意味着我们选择x3作为d1中的第二个元素,我们又得到了三个,然后我们选择x3作为第三个元素,您会注意到原始数据集中的一些数据点被多次选择,有些根本没有被选中,这没关系。
但数据点总数完全相同,然后我们会构造两个,同样的事情,我们会在1和n之间生成一个随机整数,这决定了,呃,第一个数据点,另一个随机整数,第二个数据点,另一个随机整数,第三个数据点,我们又有了一个。
我们得到了另一个与原始大小相同的数据集,但又不一样,因为我们用来构造这些数据集的过程,见,我们知道原始数据集中的数据点是在IDI中采样的,从培训分配中,因此,如果我们从原始训练集中采样新的数据点IID。
它们也将是原始训练分布的iID样本,因为它们是独立取样的,因为我们为每个人生成了一个独立的随机索引,它们实际上最终是来自相同原始分布的iID样本,所以这些数据集实际上最终在统计上是独立的,这很好。
因为我们可以用它来构造多个不同的函数,看起来很像F巴,所以我们要训练一个单独的模型,每个DJ上都有一个完全独立的神经网络,如果我们在做分类,这些模型,我们可以把它们称为Pθ1,pθ2,pθ3,等等。
一直到他们,所以这些模型之间的区别在于它们有不同的参数向量,因为他们是相互独立训练的,关于不同但密切相关的数据集,一旦我们有了这些不同的模型。
然后我们必须以某种方式结合他们的预测来对一个新的测试点进行分类,那么我们如何预测,我们如何从他们那里得到一个预测,原则性的方法是将它们的概率平均在一起,所以你把这些模型向前运行。
从他们的软最大值中提取概率,然后你把概率加起来平均,得到集合的预测,这可以很好地工作,稍微简单一点的,但一个非常有效的方法是简单地进行多数投票,所以不是看这些网络的实际概率。
我们也可以让他们预测他们认为正确的答案是什么,然后输出与网络多数票相对应的答案,现在,花点时间想想为什么多数票的方法,可能比平均概率要糟糕一点,在某些情况下,当我们只是,呃,使用多数票。
如果我们有大量的类,比如,例如,Imagenet中的一千个不同类别,那么网络认为最有可能是错误的类很有可能是错误的,但也许网络仍然分配了一个很高的概率,第二个最有可能的类别,那个可能是对的。
所以也许一个网络可能会认为一个特定的图像是五个,一个可能是狼,百分之四九的可能性是狗,也许狗是正确的答案,但如果你投多数票,那么所有这些不同的网络,呃你知道,也许他们都给狗分配了四九概率。
所以狗狗最终可能会输,但是如果你把它们的概率加起来平均,那么事实上,他们都在最有可能的事情上意见不一,但同意狗是第二好的,可能会导致狗实际上是最有可能的阶级,所以多数票的问题很像第一个过去的问题。
对如果你,如果只有对候选人的投票,你最喜欢的被认为是,也没人问你第二喜欢谁,那么你可能会出现分裂投票的情况,在你知道的地方,不同的人群有不同的第一名偏好,不可能获胜,但他们对第二名的偏好实际上是匹配的。
所以多数票很简单,但是得到概率的平均值可以更好地工作,这在理论上和理论上都是合奏的,我描述的这种自举集成方法允许我们获得方差估计,来实际估计f巴,并在实践中得到这些重新采样的几乎独立的数据集。
虽然当我们做深度学习的时候,我们实际上很少使用这种带有替换的重采样,实际上有一个更简单的方法,非常常用的,这在实践中似乎同样有效,见,用替换过程重新取样的目的,就是在不同的模型之间获得足够的可变性。
如此直观,我们只是不希望所有的模特,用同样不正确的解,我们希望它们以某种方式区分开来,用替换的数据重新采样是让它们区分,然而,我们通常用于训练深度网络的方法已经有了很大的随机性,比如说。
它们有不同的随机初始化,即使我们使用相同的初始化方案,我们得到的实际初始化数字将是不同的,也许洗牌得到迷你批次会有所不同,这个随机梯度下降会导致,不同训练跑之间的可变性等等,所以基本上没有两次训练。
即使是同样精确的模型和同样精确的数据也会看到同样的,因为所有这些随机性的来源,所以在实践中正因为如此,我们从合奏中得到了同样的好处,甚至不生成这些单独的数据集,所以如果我们拿不同的模型。
我们在完全相同的训练集上训练他们,我们在实践中会得到足够不同的模型,这通常足够好,所以这种重采样业务是人们通常不会费心的,尽管理论上这应该是非常有益的,从深度网络中构造集合的实际方法是简单地训练M。
不同型号P,θ,j,y,给定同一训练集d上的x,然后你可以把他们的概率加起来平均,或者进行多数票投票。
它非常,非常简单,它可以很好地工作,现在有一种更快的方法来获得一种快速而肮脏的组合,到目前为止,我们谈到了在同一个训练集上训练不同的网络,但这些网络可能非常大,训练它们可能非常昂贵。
记住深度学习实际上是学习表征,所以我们预计这些网络在内部做的大部分事情,实际上是获得输入的良好表示,所以如果你有一个非常深的大陆,比如说,呃,这是VGG,你可能会认为大多数卷积层实际上代表了,你知道的。
有点任务不可知论,但无论你接下来做什么,或多或少都有相同的功能,这是训练最昂贵的部分,因为那是你有的地方,那些非常大的激活地图,那是你使用很多很多内存的地方,然后可能顶部完全连接的层,这些都是任务。
真正试图弄清楚,图像中的东西是什么,所以如果真的是最后几个完全连接的层,他们正在做所有艰苦的工作来分类,其余的层大多只是拉出表示,也许你能尝试做的只是合奏,最后这几层。
所以也许你可以训练多个不同的网络,但让他们共享真正执行特征提取的主干,这样您就可以共享集合中所有模型的功能,本质上,这是同一模型的一部分,但他们有不同的头,每一个都有一组不同的完全连接的层。
所以这看起来是,你基本上只需初始化这个多,不同全连通层的头部模型,多组完全连接的层,而是一个卷积的树干,然后仅仅因为随机初始化,不同的完全连接层会以不同的方式初始化,然后你用随机梯度下降训练它们。
但是随机初始化会区分头部,以至于他们可能会做出稍微不同的预测,那不如真正的合奏好,但训练要快得多,通常更容易设置,可以获得一些好处。
现在你可以走得更远,如果你,如果你真的关心构建你的集合的计算成本,所以更快的合奏也许可以通过简单地抓住合奏中的模型来获得,作为单一训练的不同检查点,所以你可以查看的报纸之一。
在幻灯片的底部引用了描述这个想法的内容,称为快照集合,火车一号免费得到M,所以这里的想法是这样的,呃,我们将保存参数快照,在神经网络训练过程中,我们也许每隔几百年就会拯救他们一次。
然后我们的最后一组将从所有这些快照中构建出来,把他们当作一个整体中的单个模型,所以这是一个数字描述,从洪在所有的纸上,呃,所以上面的图显示了一个标准的神经网络训练,试图通过遵循梯度来获得全局最优。
然后第二个图显示了他们的方法,它基本上保存了周期性的快照,现在在这篇特别的论文中,他们还提出了一个特殊的周期性学习率计划,这个想法是你保存你的快照,在学习率最低的点,因为它迫使模型陷入局部最优。
然后当它再次增加的时候,等它下来,保存另一个检查点,这是一个设计选择,有不同种类的学习速度时间表,你可以用高阶位,你可以在训练时保存快照,并将它们组合成一个合奏,这样做的好处是你不需要。
你不需要有一堆单独的训练跑步,你基本上从一次运行中得到这些模型,但你需要仔细安排,这样快照实际上是不同的,这样你就可以从这些不同的模型中得到不同的行为,比如说,你要确保你不会经常把它们救出来。
也许你需要更长时间的训练,比如周期性的学习速度,或者做一些其他的,仔细选择,以确保快照实际上彼此不同,当你把这种集合的预测结合起来,你可以做和我们以前做的一样的事情,你可以把他们的概率平均起来。
或者做多数票,而是因为他们实际上来自同样的训练,运行另一个非常简单的技巧,你可以做,实际上效果惊人的是简单地将它们的参数平均在一起,这似乎令人惊讶,但它实际上在实践中产生了相当不错的结果。
所以这里有一些关于,这是一个VGG上,我相信Cr ten,基准,呃只是一个单一的模型,训练了一段时间,然后得到点八三七的精度,然后有一种经典的合奏,这是没有重新采样的,但有十个独立的。
有两种使用集合的方法,合计平均,概率和投票,你可以看到平均要好一点,然后是,接下来的三行使用快照方法,这里的合奏更大,它有两个五,嗯,它的表现更好,它可能表现得更好,主要是因为它更大,所以。
这并不是说快照本身就更好,只是一个更大的合奏更好,参数平均实际上做得很好,没有平均值那么好得到概率,但现在练习得很好,你的里程可能会根据合奏对你的效果而有所不同,一般来说,一些合奏非常一致,帮助过去。
没有合奏,它到底有多大帮助,这些技巧中哪一种帮助最大可能在一定程度上取决于你的问题。
现在我们在这张桌子上得到了一个暗示,在上一张幻灯片中,合奏团越大效果越好,所以合奏越大,它通常工作得越好,但是做大型合奏真的很贵,尤其是如果你真的在训练独立模特,它基本上要贵100万倍。
你想要一百个模特的合奏,你要多花一百倍的计算才能得到它,现在计算很容易并行化,但它仍然会让你付出一些代价,有时候真的要花很多钱,因为你需要为那台电脑付费,所以这里有一个有趣的问题。
我们能用一个网络做一个巨大的集合吗,我们能不能把一个网络分成几个部分,并从中得到一个巨大的合奏,所以这本质上是一种叫做辍学的技术试图做的,辍学背后的想法是,你要把你的神经网络,你会随机杀死一些激活。
所以你会进入每一个隐藏的层和一些概率,比如说百分之五十,你只需要删除一些单元,将它们设置为零,所以也许第一个线性层输出一些激活,那些要经过重新审查,他们有一些数字,然后你随机选择其中的一半。
把它们设置为零,现在你可能想知道这和合奏有什么关系,嗯,你可以想象这个过程杀死了一些激活,在旧的网络中构建一个不同的网络,本质上,每组激活对应于不同的网络,通过选择不同的随机激活组来删除。
你本质上是在构建新的网络,但你不是,但这些网络没有单独的权重,当然,它们实际上都有共同的重量。
他们只是有不同的,呃,拓扑,不同的,不同的体系结构,所以我们实现这一点的方法是在每次向前传递的过程中,每次我们到了某个层,假设我们来到第I层,我们计算激活,所以ai j是第i层激活向量中的第j个条目。
我们将它设置为aij乘以mi j,j是一个伯努利随机变量,其概率为零点五,所以伯努利随机变量,这意味着它有50%的机会是1,50%的机会是零,所以这只是另一种说法,对于网络中的每一次激活,概率为50%。
你把它归零,你在向前传球时这样做,然后向后传球的工作方式完全相同,但请记住,渐变是与,所以如果导数是,如果激活设置为零,那么它的导数也会设为零,所以实际上,当你这样做的时候。
您基本上可以从网络中删除该激活,下面是Python中的一个示例实现,这是安德烈·卡尔皮的,所以嗯,嗯嗯,这是三层网络中的向前传递,所以你可以看到评论后面的行,最大零np点w 1 x加b 1。
所以np点w 1逗号x加b 1,这只是一个线性层,权重矩阵为w-1,偏置为b-1,这是一个非常正确的最大值,这是整流的线性单位,所以说,哈一,基本上计算第一个线性层后的激活及其相应的值。
然后您想要的下一行创建一个随机掩码,所以它本质上创建了一个随机数向量,其维度与h 1相同,但是这些数字中的每一个都是1或0,概率为p,选择零点五,然后它简单地执行逐点乘法。
所以它将h中的每个条目乘以相应的零,或者U中的一个条目,基本上清零了一半的激活,然后它又做同样的事情,好的,所以这是辍学的实际实现。
好了现在,这怎么可能行得通,就像,好像我们只是做了这个非常特别的事情,我们只是进去杀死一半的激活,就像你知道的,如果有人进入你的大脑删除一半的神经元,你可能很难集中注意力。
我们正在对我们的神经网络这样做,就像这怎么可能是好的,嗯,辍学为什么有效背后的直觉,它迫使神经网络建立冗余的表示,所以如果你把这些激活的单元看作是基本的特征。
神经网络被训练来处理没有任何特征是可靠的事实,每个特性都有被删除的概率,所以它不能只根据一个特征做出预测,它真的需要有各种各样的功能,并真正关注所有这些功能,以防其中一些被随机删除。
所以这是一个卡通插图,但如果你想象,你有一堆从动物照片中提取的特征,它有耳朵吗,它有尾巴吗,它有调皮的样子吗,如果你不能依赖任何一个功能总是存在,如果每个特征都有可能被删除,然后你需要预测它是不是猫。
通过真正观察组合,你可以说好,就因为它没有尾巴,不代表它不是猫,因为也许尾巴功能只是被随机删除了,所以它迫使网络变得更强大更可靠,因此,你最终会得到更有效的培训和表现更好的网络。
所以你可以把每个退出掩码看作本质上定义了一个不同的模型,一个以前存在的一些特征现在不存在的模型,所以说,有效,当你这样训练的时候,你得到的东西看起来像一个真正的,真的很大的合奏。
因为每一个特征删除的组合都可以被认为是一个不同的模型,现在作为一个快速测试你的理解,这个组合有多大,基本上,你可以从一个神经网络中创建多少不同的模型,假设你有M层,其中每一个都有,嗯,每个单元。
每个维度,每个激活向量都可以打开或关闭,所以可能的映射的数量实际上是指数级的,在K乘以n的激活总数中,所以它是2的k次方m次方,那是大量不同的型号,所以你得到的不同预测之间有很大的差异。
当您取样不同的退出掩码时。
现在,我们必须解决的最后一件事是真正能够使用辍学生,是测试时发生什么的问题,所以在训练过程中,在向前传球的过程中,我们矢量中的每一个激活,我们以百分之五十的概率把它设为零,在测试时间。
我们想把所有这些不同的模型结合起来,所以我们可以做一些很像普通合奏的事情,我们基本上可以生成许多随机的丢失掩码,并将它们平均在一起,但那很贵,因为你必须为每个退出掩码做一个单独的前传。
如果我们真的停止退出测试时间呢,对呀,如果我们只是使用退出作为一种方法来训练我们的模型是健壮的,但是在测试的时候,我们不太像参数平均那样做,我们用于快照集合,在我们能做的是。
我们基本上可以把所有这些不同模型的参数平均在一起,参数已经一样了,模型之间的唯一区别是给定的激活是否被归零,现在归零,这种激活可以被认为是等价的,将该激活的所有传入权重设置为零。
所以对于每个权重矩阵中的每一行,你套装里一半的模特都激活了,有实际行中的数字,另一半模型将整行设置为零,这意味着如果你把重量加起来平均,你所要做的就是把所有的重量除以二,因为在你巨大的指数级集合中。
一半的模型将把这些权重设置为它们的原始值,一半将它们设置为零,所以如果你把这些零和原值加起来平均,你只得到原值的一半,另一个思考为什么这是一个好主意的方法是,平均来说,一半的维度被迫为零,而在测试时。
他们都不是,因为在考试的时候,我们不会辍学,所以激活会大两倍左右,这意味着我们可以把重量缩小两倍来补偿,它们会回到原来的规模,所以这是两个,思考为什么你需要将权重除以二的两种方法。
如果你想避免退出测试时间,一种思考的方式是,你们在一起真的很平均,在这个指数级的大集合中,所有不同模型的权重,一半是原来的重量,一半是零,另一种思考方式是,你只想让你的激活保持在相同的规模。
它们现在会大两倍,因为你不会杀死他们中的任何一个,所以你需要除以2,这里有一个特别优雅的实现这个想法,这又是,呃,来自安德里亚·卡帕蒂,他在考试时实际上什么也没变,所以在测试时。
你像往常一样向前运行网络,但相反,你实际上,嗯,将所有激活减半,按训练时的辍学概率计算,所以基本上在训练的时候,所有的重量都有效地增加了两倍,然后在测试时间他们保持原样,所以你可以在测试时间进去。
把所有的重量除以二或在训练时,把所有的重量乘以2,这已经,当然啦,同样的效果,所以这里唯一的变化是,当我们在这里计算的时候,他实际上折叠成辍学面具,所以当我们计算你一个,我们得到这些数字,要么是零。
要么是一,然后我们把这些数字除以p,也就是退出概率,也就是零点五除以零,点5表示数字现在是零或二,所以被杀死的激活,它们乘以零,剩下的激活乘以2,基本上弥补了其中一半缺失的事实,然后在测试时。
我们只需移除退出掩码,但重量保持不变,但这在数学上与幻灯片底部描述的等价。
这就是合奏和辍学,今天这节课我要讲的最后一件事,是关于我们如何调整超参数的一点评论,所以有了我们所说的所有这些技巧,我们最终会有很多超参数,其中一些影响优化,那就是它们影响训练过程,比如学习率。
动量初始化,批量归一化,等等,其中一些会影响泛化,这意味着这个网络在验证集上的性能如何,像合奏,退出体系结构,层数,那些层的大小等等,那么我们如何选择所有这些超参数,嗯。
要做的一件非常重要的事情是识别哪种类型的参数应该影响什么,例如,不良学习率,动量初始化,它们主要会影响训练过程,所以如果他们选得不好,他们会在训练中很早就出现。
所以你可以调整这些超参数的方法之一就是调整它们,开始训练网络,看看训练错误,看看训练误差在最初的几个时代是如何演变的,而其他一些超参数,比如改变层数等等,将主要影响您的验证性能。
它们的效果只有在现在晚些时候才会显现出来,如果你调整优化参数,如学习速度和动量,您仍然可以使用验证错误,如果你不是太合身,验证错误和训练错误看起来很相似,但如果你在调整退出之类的事情,使用合奏。
改变那里的建筑,您真的需要查看验证错误,因为这些事情中的大多数实际上会使训练错误变得更糟,当调整超参数以,做一个寻找搜索的课程,所以你能做的就是,你可以从一个非常广泛的扫描超参数开始,只训练一会儿。
看看表现如何,训练基本上是如何进行的,再次调整超参数,缩小他们的范围。
然后重复,所以这里有一个想法的草图,这要归功于安德里亚·卡帕蒂,这里的示例是一个短的五历元对数空间,学习速率和权重衰减扫描,所以这个例子所做的是调整两种类型的参数,学习速度和呃,reg。
也就是这里的重量在L2上衰减,在权重上的正则化,这两个参数都是通过在日志空间中扫描来选择的,所以这套制服只是给你一个数字向量,负五,负四,负三等,然后十的次方,嗯,你知道的。
使用随机选择的参数作为外显子,所以你在负5和5之间选一个,加十到那个次方,这就是你的正规化,在负3和负6之间选一个,加十到那个次方,这就是你的学习速度,为什么日志空间好,因为你真的想得到一个粗略的想法。
了解这个超参数如何影响事物,所以选择,你知道的,对数空间中的均匀随机学习速率意味着,你有很好的机会得到跨越非常广泛范围的数字,从10到负3到10到负6,注意这是一个随机的超参数扫描。
所以这些学习速率是随机选择的,然后进行多次训练看看哪一种效果最好,我们很快就会回到这一点,嗯,然后底部的结果显示,在这种情况下发生了什么,他正在考虑运行100个不同的验证准确性,呃,五个,纪元训练跑。
有了这些随机学习率和规则化,你可以看到其中一些最终工作得很好,仅仅从看哪些工作得很好,你可以大致地测量好的超参数值的范围是多少,所以这里,看起来好的学习率往往在,呃,你知道的,十到负四。
可能从一点到四倍不等,负四到四点的十,三个,十到负四,所以它会说它在十负四的某个地方,十到负三个范围和良好的正则化似乎是,它们到处都是,所以有些是负的十,他们中的一些人是10的负4。
所以也许超参数并不那么重要,那么我们要做的是,我们要把范围调整得更细一点,所以也许我们在确定我们的学习速度方面做得很好,所以现在我们把范围改成负3到负4,记住那是日志空间,但正规化似乎无处不在。
所以我们就把它放在范围内,负4到零,记住区域日志空间,然后我们又运行同样的事情,你也可以看看实际的学习曲线,来衡量他们的工作情况,所以呃,如果呃,你知道你的训练损失下降了,然后又回升了。
也许你的学习速度太高了,这就是我们之前讨论过的所有东西,为什么要进行随机超参数搜索,你可以做一个网格搜索,在网格搜索中,你基本上有规则间隔的参数是非常方便的,呃,如果你想要一些非常可解释的东西。
但是随机超参数搜索实际上在实践中更有效,嗯,它的原因很好地说明了这一点,呃,图来自伯克斯特兰德·本吉奥的一篇论文,这表明如果你有两个超参数,其中一个很敏感,另一个很麻木不仁,所以画在横轴上的那个。
一个非常重要的超参数对性能有巨大的影响,你可以看到在一个地方有一个很大的山峰,而另一个超参数对性能的影响相对较小,这实际上是这样的,在上面的例子中,学习率和正规化,因为在那个例子中。
学习速度有巨大的影响,我们真的想把它选在负3和负4之间,而正则化似乎对广泛的值都很有效,从负一到负四,所以使用随机的,随机选择超参数而不是网格是,如果你有一个不重要的参数,你最终不会为此浪费额外的样本。
因为请注意网格中重要类型参数的每个值,这个值在三个不同的时间估值,不重要参数的不同设置,所以实际上,你只能从那个重要的超参数中得到三个不同的样本,而不是九个,而如果你随机放置你的身高参数。
然后你在重要的一个上得到九个样本,在不重要的那个上有九个样本,如果不重要的真的没有效果,你仍然可以从相同的运行次数中获得很多信息,重要超参数的影响如何影响它们,这张照片,当然啦,是有意选择的。
所以在重要的超参数中有一个小峰值,这在网格盒里是完全没有的,但你实际上会在随机案例中找到它,仅仅因为你以同样的成本有效地放置了更多的样品,所以在这两种情况下都只有九次运行。
但是重要类型的参数有更多不同的值。
P23:CS 182- Lecture 8- Part 1- Computer Vision - 爱可可-爱生活 - BV1PK4y1U751
欢迎来到第八讲,到目前为止在这门课程中,我们已经讨论了深度学习的核心思想,卷积,反向传播,优化的基础,今天的讲座以此类推,我们将更多地关注应用程序,今天,我们要讨论。
深度学习方法如何应用于计算机视觉中许多广泛研究的问题,特别是,结果,讲座将分为几个部分,研究不同的计算机视觉问题,会比到目前为止的讲座水平高一点,但对于每一节,我也会参考一些著名的研究论文,你可以看看。
如果你想了解更多关于这些东西是如何工作的细节,嗯,所以说,让我们开始吧,到目前为止,当我们讨论卷积神经网络时,我们已经讨论了可以将图像映射到单个输出值的网络,到目前为止,它是一个表示类的分类变量。
基本上是图像中对象的语义范畴,就像一辆自行车,一只猫或一只狗,这是计算机视觉中一个研究非常广泛的问题,也在深度学习中,这就是分类问题,为什么这很有意义的部分原因是,但如果我们真的想解决计算机视觉问题。
可能还有其他我们关心的问题设置,除了分类,比如说,如果你想要你的自动驾驶汽车,能够找出路上其他物体的位置,你不只是想分类,是否有行人或坑洞,你想弄清楚他们在图像中的位置。
您甚至可能需要一个更细粒度的检测器,您可能想知道图像中的每个像素,该位置存在哪个对象,这些问题不太适合,我们之前讨论过的分类范式,但只要稍加努力,它们就可以被深度学习方法攻击。
所以我们今天要讨论的标准计算机视觉问题,将是以下,我们有对象分类,我们已经讨论过了,所以我不会详细讨论这个,但我们将看到的许多方法,其他问题是基于我们引入的对象分类思想,但正式声明。
对象分类问题是指输出一个分类变量,意思是离散变量,指示图像中存在的对象类型,现在这个问题设置,如果我们稍微想想,是有点奇怪的,因为我们不仅要为图像输出一个标签,我们这样做不考虑对象在哪里。
所以在某些情况下,这是非常明显的,所以如果你看到一张周围什么都没有的树的照片,那么你就知道这个类是一棵树,但如果你看到一张照片,其中一个角落可能有一棵树,另一个角落里有一朵花,你管那叫树吗。
你管那叫花吗?你被迫只做一件事,有时这与世界的实际运作方式并不完全一致,一个稍微细致入微的计算机视觉问题是物体定位问题,或者更常见的是,同步分类定位,所以钢处理一个有一个物体的设置。
模型的目标是输出对象是什么以及它在哪里,以及我们指定的方式,其中通常有一个边界框,具有x的轴对齐矩形,Y位置,宽度和高度,现在这有点武断,因为,当然啦,真实的物体不是盒子,真实的物体有形状,他们有方向。
但为了简单起见,计算机视觉的一种常用表示是边界框,它只是一个X,图像中的Y位置,宽度和高度,一个更复杂的问题设置是对象检测,它只类似于对象定位,它处理世界的组合性质。
对象检测的目标是为每个对象输出边界框,你知道如何在图像中识别,所以你仍然会得到一个类列表,就像对象分类一样,但现在,而不是为每个图像预测一个类和一个边界框,你必须为每个图像预测许多类和许多边界框。
对应于存在的所有对象,在某种意义上,这个问题设置实际上更有意义,因为它实际上反映了现实世界是组合的,在大多数图像中,有许多物体存在。
我们可以把这个想法更进一步,并发展有时被称为语义分割或场景理解的东西,这不仅仅是为每个对象输出一个边界框的问题,出现在图像中的,但实际上标记图像中的每一个像素,与位于该像素的对象的语义类别。
虽然对象检测问题语句可能没有说明对象的特定形状,语义分割问题语句确实解释了这一点,所以在今天的讲座中,我们将讨论对象定位,然后检测,然后按照这个顺序进行语义分割。
从最小的细节到最大的细节,所以让我们来谈谈对象本地化,因为它是,你知道吗,相当直截了当,而且很合身,更整齐地进入我们到目前为止讨论过的范例,然后我们将扩展到对象检测,所以在我们做常规分类之前。
我们的数据集由元组x组成,i,y i,数据集中的第1张图像,y i是i,第标签,这是一个分类变量,现在我们仍然有一个x的数据集,i y i元组,但为什么我现在更复杂,为什么我现在是它自己。
由标签Li组成的小列表,包围盒的x和y位置,边框的宽度和高度,所以图像是像素数组,该图像的相应标签包含五件事,语义范畴,猫狗,公共汽车或自行车,它的包围盒的x和y位置,以及它的边框的宽度和高度。
所以你知道x和y可能是左上角的位置,经常也是,人们实际上使用边界框中心的位置,宽度和高度,或者以像素为单位的宽度和高度,顺便说一句,这些都是基于图像的,所以到目前为止,我们实际上还没有考虑到现场是三个。
d,我们也可以这样做,这是一个相当不同的问题设置,但目前一切都在图像空间,这意味着所有的坐标,宽度和高度用像素表示。
在我们真正讨论方法之前,呃,我们应该谈谈如何测量定位的准确性,当我们做对象分类的时候,测量精度很容易,因为我们可以说,嗯好吧,你,如果你上对了课,你就对了,如果你上错了课,你就错了。
你想知道你得到正确答案的图像的百分比是多少,当我们在做本地化的时候,我们当然需要更详细地说明这一点,因为我们不只是想知道我们是否得到了正确的班级,我们想知道我们把边界盒放在正确的地方。
但当然不一定要完全正确,就像如果它偏离了几个像素,也许这已经足够好了,所以在高水平上,我们的本地化模型将是一些学习的模型,会拍到一张照片,它将输出一个语义类别和边界框,所以可能这个模型不是很好。
它输出了这个紫色的边框,它把课弄对了,它说这是一只猫,好的,所以它输出五件事,一个班,a x a y a w和a h,所有的权利,所以呃,通常,该类与分数相关联,比如概率,然后我们想说好。
这是正确的定位吗,或者不是,现在回答这个问题实际上是个惯例问题,因为你知道如果你真的把这个系统用于一些下游应用程序,就像你真的想让一辆自动驾驶汽车驾驶一样,最终,你不太关心边框是否在,恰到好处的地方。
你关心的是这辆车是否成功地行驶而没有发生事故,所以在某种意义上,在这里量化准确性实际上更多的是一种度量,方便和惯例的问题,但是有一些约定是很重要的,所以如果我告诉你我的模特这么好。
你就会明白那是什么意思,因此,对象本地化中的一个常见约定,以及目标检测是使用一个叫做并上交集的度量,这里的直觉是这样的,我们想说定位是正确的,如果有很高的重叠,在红色的真实边界框和紫色的预测边界框之间。
如果物体较大,重叠的面积总是比较大,即使你的边框放错了地方,所以如果物体很小,也许你把边框放在了几乎正确的地方,但是有点偏,而是因为它太小了,重叠的实际面积很小,但如果猫像这里一样占据了大部分图像。
如果你只是得到计数,你知道左耳上方,也许重叠实际上就像你有一个微小的物体一样大,但你当然不想只是到那里,你想把整只猫,所以说,相交于联合的想法是基本上量化盒子重叠的程度,同时控制它们的绝对大小。
所以交集指的是两个边界盒的交集面积,和并是指两个边界框的面积之和,在联合上的交集实际上只是我被你除以,所以这个想法是并集上的交集总是在0和1之间,因为交集永远不能大于并集,它接近一个。
如果交集接近两个边界框的总面积,如果交点可以忽略不计,它就接近于零,但不受边界框实际绝对大小的影响,所以它们可能很小,或者它们可能很大,那不会有什么不同,通常我们会计算并集上的交集。
然后我们会说本地化是正确的如果我们得到了正确的类,并集上的交集大于某个阈值,一个常见的阈值是说它现在大于零点五,一般来说,如果你在做标准的计算机视觉基准测试。
您正在使用的特定数据集将具有与之相关联的一些协议,所以它会说你知道,获取我们的数据集,如果IU大于零点五,你应该报告正确,或者如果你用的是可可之类的东西,也许他们实际上要求你报告不同iou值的准确性。
所以你可能会在零点五报告你的准确性,在零点七,以此类推,所有的权利,所以这是基本的想法,也输出类标签,通常情况下,如果IU大于零点五,我们就会说我们是正确的,班级现在是正确的,至关重要的是。
这不是损失函数,我们实际上并没有就iou对我们的网络进行培训,这只是一个评价标准,这是社区中的一个惯例,人们用来评估他们的模型,我们实际上不和IU一起训练,因为iou很难通过优化,我们用其他指标训练。
P24:CS 182- Lecture 8- Part 2- Computer Vision - 爱可可-爱生活 - BV1PK4y1U751
所以第一个问题陈述将讨论对象本地化,我们能想到的最简单的方法之一,对象定位是一种回归问题,所以让我们用一个传统的图像分类器,就像我们在前面的讲座中谈到的,我们可以做的是,我们可以简单地把它的卷积层。
我们可以在它们之后添加另一组完全连接的层,它们的工作是输出,不是语义范畴,但是只有边界框的xyw和h坐标,有各种各样的方法来训练这个,你知道你可以想象联合训练这个,呃,从字面上计算一个损失函数。
这是猫的分类损失,和X的某种回归损失,Y W和H并向后将两个损失传播到这个网络中,因此,您将使用交叉熵损失作为类标签,和某种回归损失,就像高斯原木,边界框位置的似然或均方误差,实际上有一点细微差别。
如何正确地设置这些多任务目标,这节课我没有时间讨论这个问题,但如果你想了解更多,一定要看看我要参考的一些论文,尤其是我以后会讲到的Yolo纸,A是这方面的一个很好的例子。
您可以阅读所使用的损失函数的类型,并确保你用这些想法让你的东西发挥作用,但为了理解这些技术是如何设置的,你可以想象一下这个,高斯对数似然,或者均方误差损失,我在之前的偏差和方差课上描述过。
不同的方法之间也有一点不同,至于这两个头,所以这些完全连接的小层被称为头,如果这些头部与卷积层一起训练,或者另一种常用的设置是分类器训练的设置,就像上一节课一样,然后这个,这个新的回归头。
只是在该类的卷积层之上训练的,而不改变那些卷积层,所以说,这有时被称为,只是在现有的conv堆栈上训练一个新的头,或者将分类和回归首尾相连地一起训练,两者都是合理的选择。
取决于你使用的是哪一个取决于你的系统是如何设置的细节,现在这是一个非常简单的设计,可以联合多任务训练,也可以先分类训练,然后训练一个回归头,作品种类,效果还可以,而是自己,通常。
这不是大多数真正有效的本地化方法所使用的方法,我们一会儿就会讨论为什么,所以我想说的是如果你只想要一个快速而肮脏的物体,定位系统,也许是为了你的最后一个项目什么的,这是个不错的开始。
但如果你想要最好的结果,要把它做好需要很多小细节,我们接下来会讨论这些,所有的权利,所以你可以采用另一种方法,而不是试图训练一个单独的头部,实际预测边界盒的位置,你可以做的是使用一种叫做滑动窗口的东西。
你可以这样想,让我们把伯爵的原始图像,然后呃,我们可以问,如果我们对图像中的每个补丁进行分类,会怎么样,所以不只是拍摄整个图像,我们可以裁剪出一小块图像并将其分类,看看那是不是一只猫。
我们基本上可以把每一种可能的作物,我们的分类器预测猫的最大概率,表示猫的边框,所以我们可以把这个小补丁,我们可以通过分类器运行它,我们的分类器说是的,这是零点二百分之一的可能性是一只猫,好的。
所以这可能不是正确的边界框,我们可以拿着这个补丁在分类器里运行,也许对于这一个,我们得到零点八分之一的猫的概率,所以也许这是正确的边界框,现在你可能想知道为什么猫笨拙地伸展成这样,请记住。
我们的分类器容纳固定大小的图像,所以不管我们剪出什么补丁,我们必须调整它的大小,使其与分类器期望的大小相同,这可能会导致一些尴尬,um各向异性标度,所以它可能需要用不同的方式拉伸或压扁图像。
这其实没关系,如果你训练你的分类器来处理这种压扁和拉伸,所以如果你训练你的分类器在不同的作物上,不同的长宽比,它实际上可以计算出这是一个计数,即使它已经被拉长了,所以这其实没关系,所有的权利,所以现在。
当然我们接下来要问的问题是我们种植哪些作物,我们将在下一节讨论对象检测时看到,这个问题实际上有一些相当微妙的答案,但就目前而言,我们实际上会考虑一个非常简单的解决方案,在一定范围内种植所有可能的作物。
所以我们可以这样做,我们首先要考虑不同的尺度,所以最大的比例是你把整个图像,所以如果你把整个图像,那么唯一可以使用整个图像的裁剪,那是一种作物,然后你可以放大图像你可以通过不同的因素来放大它。
我用二的幂做这件事,但在实践中,您可能会比这更细粒度,你也许你把它放大20%,百分之五十,百分之七十五,类似的东西,但假设你把它放大两倍,如果你现在抓住同样大小的补丁,你可以像这样把它们铺在图像上。
所以现在你有多少你有九个不同的边界盒在这个比例下,在现实中,你会铺得更细,你甚至可以偏移一个像素增量,所以在每一个尺度上,你都会有比这个更多的包围盒,但只是为了让它更容易形象化,我说你有九个。
现在您还将考虑具有不同宽高比的缩放,所以再一次,如果我们做二的幂,也许我把这个图像垂直拉伸了2的幂,现在我有多个边界框,现在这些边框是长方形的,想象一下他们在原始图像中会是什么样子。
你觉得在最初的图像中这些边框会是宽的和短的吗,还是又高又瘦,又宽又矮又高又瘦,想象一下在右边重新缩放的图像中取一个矩形,想象矩形在原始图像中覆盖了哪些像素,它实际上是一个又宽又短的长方形,例如。
上面的长方形正好是猫的头,和背景中的草,所以如果你垂直拉伸图像,你在伸展的图像中取出等大小的盒子,它们对应于原始图像中的宽框和短框,同样地,你可以用另一种方式拉伸图像,并将其平铺,呃。
包围框并对每个框进行分类。
然后你可以把图像放大一些,平铺它,等等,所以在实践中你会有很多,更多的鳞片和更细的瓷砖,甚至可能和每一个像素一样精细。
一旦你有了所有这些分类,你该怎么办,你可以选择类概率最高的边框,顺便说一句,看着我在这张幻灯片上的边框,哪一个是正确的,哪个框代表猫周围正确的边界框,嗯,实际上是这个,因为这里的图像被水平拉伸。
这意味着当投影回原始图像时,边界框会很高,瘦骨嶙峋,也就是猫的这个方面,更一般地,你不必选择概率最高的点,你可以使用更复杂的技术,有时被称为非,最大抑制,当我们谈论物体检测时,我们将更多地重温这些。
但是对于这个本地化问题,因为你知道图像中只有一个正确的边界框,简单地拿最大值可能很好,性能最好的方法通常会做比这更聪明的事情,但这并不是一个糟糕的启发式,只是采取最高概率的盒子,现在。
让我们来讨论文献中进行本地化的一种实际可行的方法,本质上是把这两个原则结合起来,这是基于Pierre Sermonet的一篇论文,名为Overfeed,现在你可能会问,为什么我们要把这些原则结合起来。
我们可以输出一个边界盒的连续坐标,或者我们可以用滑动窗口,两个看起来都很好,你可能想把它们组合在一起的原因,是因为它们实际上弥补了彼此的弱点,滑动窗口的方法非常简单优雅,它不需要预测连续的坐标。
问题是覆盖每一个像素可能非常昂贵,你可能没有得到非常正确的边界框,除非你真的通过一个像素偏移量,所以它可以很有帮助,即使您有一个滑动窗口来输出框的连续坐标,基本上允许分类器稍微修补一下盒子。
所以你可能会给它一个窗口,里面有猫,然后说是的,里面有一只猫,但这有点离谱,就像那边的几个像素,你也不必在每一个可能的宽高比中考虑每一个可能的缩放,因为模型微调的能力。
那个边界盒的精确坐标可以很大程度上补偿这一点,如果你想考虑所有可能的各向异性缩放,有很多对吧,因为如果你的形象是,比如说两百乘两百像素,可能的呃,你可以有200乘200的分组。
因为你可以沿着每个维度缩小一个像素,所以那是非常非常大的,我们希望减少天花板,并使用这些连续的坐标输出来微调边界框,所以我们要做的是,我们要采取不同的补丁,为什么,滑动窗口方法。
对于每个补丁将输出猫出现在该补丁中的概率,以及边界框相对于该补丁的坐标,如果补丁正好在猫的中心,也许坐标会覆盖整个补丁,这没关系,但如果他们有点不对劲,我们没有非常正确的宽高比,他们可能会把它修补一点。
所以本质上,连续的取值输出对滑动窗口提供了一点校正,过馈模型训练的特殊方式,在这一点上,这可能有点过时,因为这是七年前的,但论文中训练它的特殊方式是预先,对网络进行公正分类培训。
然后在分类特征之上训练回归头,然后你把这个模型以不同的比例传递到不同的地区,对于每一个,你得到一个类和一个边界框位置,在这一点上,你可以拿着,呃,类概率最大的窗口,实际的纸张所做的是。
它实际上结合了来自不同补丁的预测,你可以把它看作是一种加权平均风格的方法,但这是一种设计决定,所以特定的纸张平均从不同的盒子,按概率加权的窗口,大致上比那要复杂一点,但这是基本思想。
但你也可以以最高的概率使用补丁。
嗯,所以这里有一些报纸上的实际照片,举例说明,滑动窗口加边界框回归在实践中是什么样子的,所以你在顶部看到的是不同的鳞片,对于每一个尺度,模型只预测阶级,所以你在顶部看到的只是班级。
不同的窗口在这里用颜色编码,所以你可以看到它们都是相互重叠的,它们的颜色编码,所以那里有很多不同的班级,所以看看黄色的盒子,黄色的盒子是那些标记为裸的,你可以看到,对于更大的范围,对于第四个图像,呃。
最右边的,许多雄鹿没有被贴上熊的标签,左边的许多只有水的地方,没有熊被贴上别的标签,我不知道别的东西是什么,可能是鲑鱼,也可能是水什么的,在中间的一排,什么,呃,他们显示的是预测的x y w和h。
或者每个位置刻度的边界框,这样你就可以看到,比如说,在最左边,你知道补丁几乎覆盖了整个图像,但在熊的周围,边界盒被预测得更紧,所以实际上x,y,w,h是好的,经常调整那个窗口,现在你还可以看到。
边界框并不完全一致,所以每个窗口都有一个稍微不同的边界框,他们中的一些人比其他的更正确,他们中的一些人认为熊的概率比其他人高,但是一旦这些包围盒结合在一起,然后在底部。
最后的组合边界框预测实际上很好地将熊居中,如果你想知道这种热图看起来像什么,在底部,它对应着,这只是可视化图像中每个位置的熊的概率,在每个窗口,更黄色的颜色对应于更高的概率,你可以看到。
尤其是在更大的尺度上,最大的可能性往往集中在窗户周围,窗户很好地覆盖了熊,好的,这就是对象定位,我们可以回归,呃,到边界框位置,我们也可以做滑动窗,我们可以把两者结合起来,我们可以有一个滑动窗口。
其中对于每个位置,我们输出一个边界框。
然后以某种方式把它们结合起来,现在,你现在可能在想的一件事,滑动窗口方法在计算上相当昂贵,比如说,如果你有三个六个窗口,如果你在每个维度上有六个,你天真地,你会付三个,计算成本的六倍。
如果你在做一些更像过喂纸实际上在做的事情,您可能有数百个窗口沿着图像,并支付数百倍的费用,幸运的是,我们可以让这种方法便宜得多,通过利用卷积网络的一个特殊性质,对此建立一些直觉,让我们回到这个,呃。
三乘三给猫铺瓷砖,这看起来很像一个卷积,在卷积中的右,我们在图像上传递过滤器,现在我们把整个修道院都传给了这张照片,所以也许我们可以跨窗口重用一些计算,就在那些窗户重叠很多的时候。
也许我们不必重新计算卷积层,从头开始激活每个窗口,也许我们可以重用到目前为止的计算,所以这里有一个想法可以帮助我们思考这个问题,假设我们在一个非常大的图像上有一个卷积网络。
可能是原始图像大小的两倍的图像,所以我们计算卷积激活,就像我们以前做的那样,所以这些都在这里,假设我们表示一个两层卷积网络,然后我们在最后有分类器,我们把最后一个卷积图压扁成一个完全连通的向量。
然后用普通的线性层连接它们,现在我们不打算使用整个卷积图,我们就用左上角,所以这就是我们正在做的,比如说,如果我们在这个图像上传递一个窗口,那是图像的一半大小,我们只想评估左上角,这样左上角的红框。
这样我们就可以把猫分类在左上角,如果我们也想把上中分类,然后我们会在那里放一个小过滤器,我们会我们会拿出一大块激活地图,把它压平,穿过一些完全连接的层,右上角,我们会拿出一些大块,压平。
穿过那些完全连接的层,最重要的是你拉出来的大块,它们实际上是重叠的,因为如果你还记得我通过过滤器的时候,对不起,当我通过那个分类器时,不是图像顶部的分类器,实际区域,我拉出的窗户只有图像的一半大。
但我有三个这样的窗户沿着顶部,所以它们每个都有大约50%的重叠,这就是我们现在正在做的,一种方法是建立一个修道院,呃,图像大小的一半,然后当我们把整个卷积较小的层压平时,但正如你从这张照片中看到的。
你也可以把整个图像,运行整个图像的所有卷积层,然后在最后当你想分类的时候,你只要拉出最后一张卷积图的一大块,但实际上,如果我们看看这个,我们可以认识到这些分类器,完全连接的位,本身只是卷积层吗。
并且可以这样实现,所以我们实际上不需要编写任何特殊的代码来做到这一点,我们实际上可以实现分类层,那些完全连接的层作为卷积,同时通过向前传球,这种新的卷积分类器得到了猫的概率,每一扇窗户,在这种情况下。
有九个窗口,我们将得到九个输出,我们对每个类都有一个对应的概率,在我们有两个完全连接的层之前,我们如何很好地实现这一点,在我们的卷曲之后,他们每个人都有四千九十六个单位,但我们想评估每个位置的卷积层。
很抱歉每个位置的那些完全连接的层,这基本上是一个卷积,只是一个接一个的卷积,所以每一个完全连接的层只接受前一个完全连接的层作为输入,除了第一个,第一个是卷积响应图的整个补丁。
但之后的一个只接受前一个的输出,所以这实际上是一个接一个的卷积层,有四千九十六个过滤器,一个接一个只是意味着它只访问前一个位置,所以如果你先把左上角分类,你必须把整个反应图弄平。
这将成为您的第一个完全连接的层,第二层连接层只看第一层的输出,这样它就不会偷看邻居了,这正是你用一个接一个的卷积得到的,所以具体来说,为了使这一点非常精确,第一次手术,压平,它进入第一个完全连接的层。
现在变成了一个规则的卷积,步幅相当大,下一个完全连接的层是一个接一个的卷积,以一个的步幅,然后最后一层,软麦克斯,还有一个步幅一个一个的卷积,所以如果你,如果你不确定这是如何工作的。
我鼓励你把它写在一张纸上,画出在这九个位置中的每一个位置都有一个单独的分类器的样子,然后思考如何用卷积对其进行编码,由此产生的网络将是完全卷积的,根本没有完全连接的层,在这种情况下。
它的输出实际上是三乘三乘,比如说一千,如果你有一千个不同的类,所以这实际上是过度喂纸的基本作用,但他们的情况除外,输入,呃,呃,每个位置都要大得多,所以他们在这里说明的是如何。
如果你对你的修道院有十四乘十四的投入,输出一个类,你可以把它变成一个修道院接受16乘16的输入,左上角类的概率的二乘二输出,右上角,左下角,底部现在在这里,有更多的重叠比在我的小简单的图表。
但想法完全一样,你只是把那些非卷积的,顶部完全连接的层变成一个接一个的卷曲,这允许你在每个位置产生一个类标签,这是一个非常重要的想法,我们将看到,当我们谈论检测和分割时,一次又一次地出现,这种想法。
卷积网络可以在图像的不同位置产生预测,同时重用卷积层中的激活,所以这种计算在大陆的定位问题上是非常强大的,我们会在其他部分看到它的变体,所以总结一下我们本地化系统的构建块,是输出类和边界框坐标的大陆。
我们可以在多个尺度上评估这个网络,对于许多不同的作物,每一个都产生一个概率和一个边界框,我们可以把滑动窗口作为另一个卷积来实现,而不必重新计算每个位置的所有激活。
P25:CS 182- Lecture 8- Part 3- Computer Vision - 爱可可-爱生活 - BV1PK4y1U751
接下来我们来谈谈对象检测,所以在设置问题之前,我们在图像中有一个物体,我们必须输出一个类和一个边界框,现在如果我们在图像中有多个对象怎么办,我们必须为每个输出一个单独的类和边界框,现在我们有了一个图像。
我们有第一个对象的类,和x x i 1 y i 1,w i 1和h i 1作为包围盒,对于第一个对象,和a类c i 2 x i 2 y i 2 w i 2,第二个物体的h i 2。
对于图像中可能有n个不同的对象,以此类推,每个图像的对象数量可能不同,好的,所以马上,呃,我们可能会有一个问题,我们需要我们的模型输出可变数量的东西,所以我们可以想象就像以前有一个网络接收图像一样。
并输出一个类别和一个边界框,但是我们如何在多个边界框中输出多个类别,尤其是当数字是可变的,这似乎有点棘手,所有的权利,嗯,我们可以观察到的一件事是如果我们使用滑动窗口方法。
每个窗口实际上可以是不同的对象,所以就像上一节一样,我们看到了如何在图像的每个位置输出分类,而不是选择概率最高的窗口或合并窗口,我们可以在每个窗口中输出一个对象,其中某类的概率高于某个阈值。
所以如果你有一个窗口,你认为,好的,就像,你知道,百分之三十的猫,百分之三十的狗,百分之三十的松鼠,等好,也许这些课程都不够高,所以你不把任何东西,但如果你有一个窗户,它像80%的猫,那你就养了一只猫。
好的,那是,这实际上是一个非常明智的想法,我现在就告诉你,这不是大多数性能良好的方法实际工作的方式,但这是一个合理的想法,然而它本身就有一个大问题,问题是高分窗口可能是,到其他高分窗口。
所以如果你在这里输出熊的高概率,你把它移到一个像素上,你可能也会输出一只熊的高概率,所以如果你只是门槛,然后输出边界框,如果概率高于某个阈值,你会有很多,许多这些重叠的边界框,就像你在这张照片中看到的。
所以我们可以用来缓解的一种方法,这就是所谓的非最大抑制,非正式,非最大抑制意味着你杀死了任何检测,如果你附近有其他得分更高的检测,所以即使你在这个位置熊的概率是98%。
如果你旁边有另一个窗户有百分之九十九,然后你让他们领先,自己不输出分数,所以这个位置,比如说,有很高的概率,但它不是最大值,因为概率较高的邻居,而这一个在现实中可能是最大的,非最大抑制比这更复杂一点。
因为你也不想让高频变化把你搞砸,我不打算详细讨论非最大抑制在实践中是如何工作的,因为这不是一种真正的深度学习,它实际上更多的是一个核心的计算机视觉的东西,但如果你想真正实现它,我建议看看非最大抑制。
这样就能得到细节,现在,另一种与滑动窗口非常不同的方法,就是有一个输出多种东西的模型,实际上,让你的模型输出一个边界框列表,所以您输出的不仅仅是一个分类,不仅仅是一个边界框,也许你输出两三个。
你挑一个固定的数字,然后你声明它是一个真正的边界盒,如果相应类的概率足够高,否则你说它不在那里,现在就像对象定位一样,这两种观点本身都是合理的,但实际上并不那么有效。
所以输出多个东西的明显问题是你需要选择一些数字,通常你会选择一个相当小的数字,因为你知道,用大量的输出来训练你的模型有点困难,所以这本身就不好,滑动窗本身也不是很好,因为你真的得把窗户弄对。
但就像本地化一样,如果这两个想法结合在一起,效果很好。
所以这里有一个结合这两种想法的方法的案例研究,是一个叫Yolo的模特,你只看一次,这个名字有点误导人,你其实看了好几次,四,准确地说是九次,但他们这样称呼它的原因是,与以前的方法相比。
以前的方法涉及更复杂和多阶段的管道,所以你可以想到Yolo,作为对象检测的overfeed版本,你把输入的图像分成,呃,变成单元格网格,在特定的论文中,他们实际上是用七乘七的网格。
所以上面写着S by S在这里,但现在实际上是七乘七,至关重要的是,你是,你不是说每个细胞,你将只看单元格中的像素,你真的看着图像的其余部分,但是每个单元格都要输出一组不同的边界框。
所以七乘七的网格单元中的每一个都有不同的输出,有点像滑动窗,但并不完全是因为他们实际实施的方式是,你不能只看单元格内的像素,他们也可以做多尺度的事情,比如过度喂食,但他们发现这种更简单的方法效果更好。
然后对于每个细胞,对于这四个九个单元格中的每一个,它们输出一个边界框位置x,y,w和h,他们输出一个信心分数,你可以粗略地把它看作是指示一个物体是否存在,正式,信心得分,对借据的估计。
重聚与现实对象的交集,它们输出类标签,他们没有,他们不只输出其中一个,对于每个细胞,它们实际上输出单独的边界框,iOS,和类标签,执行中的作用,他们用b等于2。
所以你基本上可以把每个网格单元看作是两个边界框,每个人都有档次和信心,这张图说明了在左边你有你的输入,你把它分成七乘七的网格,对于网格中的每个单元格,您输出一个类概率,它显示在底部,输出一个边界框。
如顶部所示,然后呃,如果没有对象,置信度为零,如果你期望看到一个物体,它会更大,然后决定输出哪些边界框的方式,你基本上是他们基于信心的门槛,所以您只输出置信度边界框,你可以用和以前一样的技巧。
用这个卷积重用计算,所以成本实际上不是四个,高出九倍,现在,一些细节,呃让这个真正起作用,当然啦,如果你想知道所有的细节,我强烈建议阅读这份报纸,这是一个非常容易接近的,清楚书写的纸张。
你需要在训练中分配,哪个输出负责每个真对象,所以当你得到你的训练数据,你只有一个图像和一个类和边界框的列表,它们不会告诉你在哪个细胞中的哪个边界框,所以在训练的每一步。
您必须为图像中的每个边界框分配责任,到其中一个单元格,他们在报纸上做的方式是,他们只是使用目前最适合的细胞,所以每个细胞都做出一些预测,然后他们把责任分配给当前最接近含义的细胞。
那个盒子里有最高借条的那个,所以这是非常合理的,然后每一个不对任何真正的边界盒负责的细胞,只是被告知预测置信度为零,所以这是一个相当简单的方法,你可以认为这是过度喂养的基本食谱,到一个对象检测器中。
它实际上可以输出多个边界框,在细节上有一些不同,就像你现在表现出的自信,你有这些七乘七的单元格,而不是真正的滑动窗口,现在这个东西可以输出多少对象是有限制的,因为你只有四个九个细胞。
每个单元格只能输出两个对象,所以如果图像中有超过98个物体,发生了什么没什么,你只是错过了那些物体,但这没关系,因为谁需要超过98个对象呢,所以在实践中,这东西实际上工作得相当好。
这取决于您查看的方法的哪个版本。
并不总是表现最好的,但它往往很好,至少从历史上看,往往在目标检测上得到很好的性能,但要复杂一点,但值得商榷,这是一类叫做r cnn的方法,即具有区域建议的卷积神经网络,我在这里要描述的是更高级的版本。
有时被称为快速我们的CNN,嗯,所以基本的想法是你想要一个更智能的滑动窗口,你不想只考虑所有的补丁,现在在计算机视觉文献中有很多方法被开发出来,在深度学习之前,深度学习本质上不专注于检测物体。
但我只是建议给定的补丁是否可能包含一个对象,这些有时被称为目标建议或感兴趣区域建议,我们的CNN基本上把这些作为一个积木,所以我们CNN的基本版本实际上使用了一些现有的。
从图像中提取区域的现成计算机视觉方法,然后通过卷积神经网络分类器将每个区域馈送,很像一个滑动的窗户。
所以你基本上可以把它想象成一个智能滑动窗口,现在他们还预测了一个边界盒坐标,就像过脚一样,也像上课一样,这很好,稍微调整一下区域,但现在基本上有了同样的想法,这当然是非常昂贵的,我不建议实际上这样做。
它实际上是一种奇怪的设计,它是在2014年很早就发展起来的,基本上在计算机视觉社区真正知道如何很好地处理深度学习之前,嗯,这些天我们实际上不会这样做,所以一个更好的方法是使用我们已经学到的东西。
当我们谈到在不同的位置共享卷积特征时,当我们谈论过度喂养时,因此,实际上不是通过卷积网络独立地运行每个区域,你可以做的是你可以有一个卷积网络。
处理整个图像,并生成卷积响应图,然后你可以把你感兴趣的地区的建议,你可以不把它们投射到图像中,而是投射到卷积图中,所以你的CON Conv层产生一个响应图,你可以把它想象成一个图像,但它包含了。
然后你把你感兴趣的区域,把它放进去,呃,卷积反应图,然后你把那个区域内的所有特征,你把它们拉在一起,在他们的情况下,他们使用最大池,然后你得到一个描述该区域的向量,你把它输入到一些完全连接的层中。
这些完全连接的层将产生一个类和一个边界盒,现在至关重要的是,你可以首尾相接地训练这整件事,你实际上可以后退,传播类标签和真正的边界框位置,进了这个被汇集的修道院,它实际上会训练这些骗子来产生。
当最大值根据区域汇集时,产生正确的类和边界框,这就是快速r cnn背后的基本思想,这实际上是一个非常实用的方法,你可以相当有效地使用,所以在很多方面,这与我们现在才在《过度喂养》中看到的想法相似。
而不是与这些滑动窗口相对应的作物,它们实际上对应于这些感兴趣的区域建议。
嗯,您可以采用相同的卷积响应图,在你能预测的每一个位置,呃,是否有以该位置为中心的物体,它的空间延伸是什么,这现在很像即将到来的过度喂食,在其中,您为每个窗口做出不同的类和边界框预测。
除了这里他们不用这个,实际预测具有特定类的对象的边界框,他们只是用它来预测一个物体是否存在,然后对于在场的人,这些被汇集并馈送到随后的完全连接的层中,所以这和我们之前看到的设计很相似。
用过量饲料和YOLO,但这只是做对象提议的部分,当然,你获取训练数据的方式,你拿着有对象的数据,你弃课,只要把这个边框,然后对于卷积图中的每个位置,你有一个小脑袋,试图预测是否有任何物体存在。
如果是这样,它的边界盒是什么,然后对于那些信心很高的,物体存在的高概率,然后将这些区域用作裁剪出最大池的区域,并将其传递到网络的语义组件中,它试图预测哪个类实际上存在于那里,如果有。
所以我们的CNN有点复杂,因为这些区域,嗯陪审团,我想还没有,这种方法是否比Yolo这样更简单的方法更好或更差,这种倾向于来来回回,取决于你知道,哪个队改进了他们的方法,更多,在过去的几年里。
他们一直并驾齐驱,它稍微复杂一点,但有人可能会争辩说,明确地列出这些区域可能会让它工作得更好一点,在某些情况下,我个人的喜好,我认为更简单的方法更好,所以我认为像Yolo这样更直接的方法,从长远来看。
可能会更有效,但我不是一个真正的计算机视觉研究员,所以如果你想了解更多关于这个的信息,我会鼓励你,阅读文献,了解这些方法的相对性能,看看基准,你知道跨越基准,通常,RCN方法的性能会更好一点。
然后自己决定,哪种方法更适合你,所以如果你想了解更多关于这个的信息,一些建议的阅读,这是黄纸,你只看一次,嗯,所以这里,这个想法基本上只是回归到每个细胞中不同的边界框,还有一些后续。
所以最初的论文发表于2015年,而且已经改进了很多次,所以有Yolo版本三,版本四,版本五等等,显著提高了性能,用一些技术,我们的CNN有三篇论文是核心,我们的CNN接近原始的R cnn论文。
快点我们的CNN,快点我们的CNN,更现代的不同之处在于它们重用激活,就像过度喂食一样,他们在学习感兴趣的区域建议方面有一些改进,他们自己,还有一些其他的方法,比如说,呃,这是Leit的一篇经典论文。
全称为SSD单发多盒探测器,这是一种,在某些方面,它实际上比Yolo更简单,嗯设计实际上看起来很像感兴趣的区域建议和更快我们的CNN,但实际上输出语义类别,所以这很酷。
所以我认为从这些文件开始可能是最好的方法,如果您想了解有关对象检测的更多信息。
P26:CS 182- Lecture 8- Part 4- Computer Vision - 爱可可-爱生活 - BV1PK4y1U751
今天这堂课我们要讨论的最后一个话题,是语义分割,到目前为止,我们已经讨论了输出类别的方法,标签,和边框,现在我们要讨论的方法实际上是试图标记每一个像素,如果你想准确地知道物体的位置,这可能会很有帮助。
它们的空间特征是什么,在某些方面,它实际上更简单一点,因为,不像现在的物体检测,您实际上不再有可变数量的输出,因为每个像素都有单独的输出,每个像素都保证有标签,所以在某种意义上,语义分割可以简单一点。
因为您不必担心对象存在或不存在,或者有多少之类的东西,但它更复杂一点,因为你现在的输出要大得多,您的输出与原始图像的分辨率相同,所以一个非常简单的,思考语义分割的概念起点。
就是把它看作是一个按像素分类的分类器,所以你可以想象用一个完整的卷积神经网络分类器,并将其集中在图像中的每个像素,用零填充之类的东西来计算角,这或多或少就是语义分割方法试图做的。
但要做到这一点有一些技术挑战,在我们有这个观点之前,当我们谈到在每个位置有一个不同的分类器时,但这仍然适用于位置数量为,你知道的,小于图像中的像素数,你利用一种传统的神经网络架构。
这降低了每一个卷积层的分辨率,但现在的问题是我们希望输出具有与输入相同的分辨率,我们真的希望每个像素都有一个类,不仅仅是每一个滑动窗口位置,如果我们不减少样品,这并不难做到,所以如果我们总是有零填充。
大步,一个没有池,然后呢,我们所有的卷积响应图都将与原始图像具有相同的分辨率,然后在最后,我们将为图像中的每个位置输出一个类标签,你绝对可以做到这一点,这在计算上非常昂贵,因为你有这些巨大的卷积反应图。
你将需要相当多的层,因为你想要一个广泛的上下文,所以你要么,你有巨大的过滤器或很多层。
这两种都非常昂贵。
的,我们在语义分割中面临的问题,我们想给每个像素分配一个语义类,现在不要担心实例,所以我们有两头相邻的牛,它只是一个牛团,那就是,我猜,好的,因为某种原因,计算机视觉的人似乎并不担心这一点,嗯。
一个非常简单的方法,就是使用多层卷积来保持分辨率,如果我们能实现这一点,如果这在计算上是可处理的,我们可能会这么做,顺便说一句,在某些情况下,它可能会起作用,有一些方法可以进行实例级分割。
这些方法更加细致入微,但基本问题陈述并不关心这一点,所以说,我们将要关心的大部分,在实际中实现这类语义分割方法的方法是,如何避免维护这些巨大的卷积响应图,同时仍然有深度网络可以有意义地分类每个像素。
所以挑战是设计一个网络架构,这使得每个像素的分类问题在计算上变得容易处理好了。
所以我们能想象的,在概念上,我们将有一个卷积堆栈,很像我们以前的那些,当我们谈论分类时,像vgg或者resnet之类的,这会降低分辨率,一旦我们降低了分辨率,然后我们需要再次提高分辨率。
所以首先我们降低分辨率,就像一个普通的大陆一样,然后我们在中间得到一些低分辨率但高深度的处理,基本上集成了整个图像,所以中间的那个,网络知道图像中的所有东西在哪里,但是分辨率太低。
无法为每个像素输出标签,然后我们需要向上采样恢复到图像的全部分辨率,然后在上面我们可以为每个像素输出一个标签,所有的权利,所以从概念上来说,这里的一切都很简单,问题是我们如何进行向上采样。
所以我们学习了卷积,它要么保持分辨率,要么降低分辨率,现在我们需要了解,是某种不卷积或向上采样操作,它的分辨率较低,分辨率较高。
好的,所以我们可以称之为采样或转置卷积,它有时也被称为反褶积,从技术上讲,这个术语有点不正确,因为反褶积在信号处理中确实有非常精确的含义,和这个不一样,所以最好称之为采样或转置卷积。
所以让我们先谈谈这是如何工作的,让我再描述一次,正则卷积如何降低分辨率,所以如果你有一个正常的卷积,用两步的步幅,所以这将映射,呃,如果我们不做填充,在这个例子中,五乘五的图像变成了二乘二的图像。
所以你把这个过滤器变成左上角,这里的输入是hf乘wf,过滤器次数的高度和宽度,输入通道数,输出是一个接一个的,输出通道数,所以整个过滤器是一个厨师由WF由C由C,然后你拿一个补丁,s两步。
所以你把两个像素,取右上角的补丁,这就变成了右上角的像素,转置卷积基本上与此相反,你可以考虑的一个方法是,这是一个步幅很小的卷积,所以这个步幅是两步,这意味着你要超过两个像素,如果你有一个大步,呃。
二分之一,然后你想把半个像素,呃,现在你真的可以这么做,你实际上可以插值这些像素,你可以做的另一种方法,也很简单的就是,您可以简单地在多个位置输出值,从数学上来说,这些几乎是一样的。
这里有一个二乘二的输入和一个五乘五的输出,所以你可以做的一个方法是,你可以有你的投入,一个接一个,你的输出是h f乘w f乘c out,过滤器现在又,它是一个四维张量,那是c/n/h/w/c/out。
所以它对三乘三的每个位置都有一个值,让我们说,输出补丁,补丁中的每一个通道和输入中的每一个通道,它将相应的通道输入乘以某个数字,并写入该位置,它仍然是一个线性的方法,你可能会遇到的一个小陷阱是那口井。
这个位置的过滤器会输出这个三乘三的区域,这个位置的过滤器会输出这个三乘三的区域,但它们在中间重叠,所以中间有两组值,你在那里用什么好,一个非常简单的选择是将它们平均。
所以更大的响应图中的每个位置都会得到多个,来自不同过滤器的不同值,它得到的所有值平均在一起,例如,中间的那个像素实际上会从相当多的人那里得到预测,从四个独立的过滤器,所以它们加起来是平均的。
这不是转置卷积的唯一方法,还有其他方法,你可以迈出这一步,等于概念的一半在较小的响应图中做线性插值,这是一个合理的选择,我也是,这就是你如何通过转置来提高分辨率,卷积运算,但还有另一个问题。
那就是我们最初的网络也有池,所以汇集是我们降低分辨率的另一种方式,这意味着如果我们想在之后增加样本,我们必须以某种方式撤销池,这样你就可以,您实际上可以进行一个解池操作,有许多不同的方法可以做到这一点。
一个简单的方法是复制值,所以如果你有一个二乘二的输入,你想把它变成一个四乘四的输入,你只要把左上角两个两个地铺,你把右上角两个两个地铺,但你可以使用的另一个技巧,它实际上工作得很好,而且有点聪明。
是每次执行池操作时,您保存哪个索引,实际上有最大值,所以在这个例子中,在分辨率降低阶段的池期间,在左上角的二乘二区域,那五个价值最大,所以我们保存索引,那五个人的位置,所以当我们稍后执行解池时。
我们将该值写入相应的索引中,所以在那个二乘二的区域,右下角有最大值,所以当我们稍后解池时,右下角是要得到值的,其他一切都将为零,好的,看看这张照片思考一下这个操作,如果你不完全清楚,每次你泳池。
保存值最大的索引,然后后来在网络上,当你有相应的向上采样时,你拿那个索引,并且将低分辨率映射中的值保存到相应的索引中,在高分辨率地图中,现在这个,当然啦,要求您的网络是对称的。
这意味着每次你在另一边有一个池子,当你回去的时候,您必须有相应的解池,一般来说,这些网络不一定是对称的,如果他们只是用这些转置卷积,但是如果您使用池和解池,然后你必须对称,我猜,这没关系,对称是可以的。
好的,所以现在你基本上可以在向上取样阶段,您可以用这些转置卷积替换卷积,您可以用这些解池操作替换池。
所以一种非常简单的架构,这是一种瓶颈架构,您通常使用传统的卷积网络,如VGG或Resnet,作为第一部分,获取图像并将其置于瓶颈中的部分,然后你会把它翻过来,产生转置卷积,并解池以使其恢复到原始分辨率。
这是论文中使用的基本设计,称为完全卷积网络,用于长语义分割,一点都不,所以他们说明的方式是,他们说,嗯,让我们以一些标准的现有网络为例,比如VGG,例如。
你可以把这个原始网络想象成产生一个低分辨率分类器,然后你把所有的池图层都取下来,把它们变成解池层,把你所有的卷曲,把它们变成这些转置卷积,所以他们在这里所说的采样是转置卷积。
然后他们把这个和池中的索引结合起来。
现在,您可能会想到这种方法的一个问题是,也许一些空间信息实际上丢失了,我是说,池层用于丢失空间信息,如果之后有一些解池和转置卷积,他们会让你的决心恢复的,但他们可能无法恢复精细的空间细节。
所以这里的一个想法是,也许你可以把多种分辨率结合起来,样品备份,也许你可以把低分辨率的东西,对它进行采样,并将其与以前通过跳过连接获得的更高分辨率地图结合起来,跳过连接很像剩余连接。
这就是一个叫做单元的设计背后的想法,基本单元设计已应用于许多不同的领域,包括语义分割,而且像甘斯这样的生成模型也很受欢迎,我们以后再谈这个,这是一个潜在的单元设计的图表,实际的体系结构。
你可以把它想象成和VGG很相似,但是有跳过连接,所以你可以看到有两个卷积层,呃,在开始的时候,所以在左上角,然后是一个下降两倍的采样,然后再增加两个卷积层,然后再向下采样两倍,以此类推。
然后当我们开始取样时,我们实际上要做的是向上取样前一层,然后我们取原始修道院中分辨率相同的层,我们连接它的激活,所以基本上在每一个向上的采样层,激活由两半组成,前一个较低分辨率层的向上采样并连接到它。
具有该分辨率的原始层,这是由这些灰色箭头指示的,所以灰色箭头基本上就是把你之前的激活,在这个分辨率下,把它们放在你当前的向上采样层上,这是由白框指示的,所以你可以看到每次我们取样,我们有一点蓝色的部分。
这是在池和转置卷积上得到的,然后我们有白色的部分,这只是我们在输入中对该决议的先前激活,只要把它连接到那个,这就是为什么当我们下样品时,你可以看到我们有64 1 2 2 2 5 6 5 12。
当我们开始取样时,现在,我们第一次有样品,我们总是有两倍的过滤器数量,所以当我们取样到呃的分辨率时,一零四在那里,你可以看到有一个,有一块蓝色的和一块白色的,频道总数是五个,十二,那是因为二百五十。
其中六个来自之前的高分辨率地图,另外两个五六从上面来,取样前五个二乘五二图,所以嗯,这基本上是一个有点复杂的画面,但这是一个非常简单的想法,它只是复制你之前对该分辨率的激活,到当前向上采样阶段。
这可以更好地保存更高分辨率的细节,因为虽然这些更高分辨率的地图可能没有语义上的意义,它们可能会编码有用的高频细节,如边缘和边界的位置,这样当您实际输出分段时,你会让它与牛的实际边缘完美地对齐,好的。
所以总结一下,在这一点上,我们讨论了四个标准的计算机视觉问题,对象分类,我们在上一节课中讨论过,对象定位,其中有一个对象和一个边界框。
对象检测,其中有许多对象和许多边界框,现在是语义分割,其中您实际上需要每个像素输出一个标签,你可以看到这些有很多共同的主题,呃,呃,像这样的话题,比如说,你可以分享的概念,大家可以看到。
我们使用滑动窗口的方式有很多相似之处,在对象定位中,目标检测,以及我们如何用语义分割进行每像素分类,但也有一些区别,比如,比如说,回归到边界框的需要,诸如此类的事情好吧。
所以希望这能给你一点计算机视觉的背景知识,尤其是如果你想做这样的事情,呃,在你的最后一个项目中,嗯,希望这能给你一些东西,如果你想了解更多,我强烈建议阅读一些参考的论文。
P27:CS 182- Lecture 9- Part 1- Visualization and Style Transfer - 爱可可-爱生活 - BV1PK4y1U751
欢迎收看第八十二节第九课,今天我们要谈谈如何理解,卷积神经网络在做什么,以及如何实际使用它们来生成图片,在我们进入卷积网络的细节之前,让我们简单地谈谈一些实验。
Torus、Wisel和David在神经科学中做的一些非常著名的实验,胡贝尔,研究真正的哺乳动物大脑如何处理视觉图像,当我们讨论修道院时,我们会看到很多类似的地方,所以说,胡贝尔和威塞尔。
最著名的是他们对哺乳动物大脑视觉处理的研究,他们最著名的实验是向猫展示不同的视觉刺激,记录猫大脑神经元的激活,他们发现的是,那个,猫脑中的单个神经细胞,负责识别不同方向的边缘,这是他们进行的实验的图表。
屏幕上显示了猫不同方向的边缘,从这里,他们能够重建,猫大脑中的不同神经元是如何对不同方向的边缘做出反应的,这很有道理,因为视觉世界中的物体是由边缘勾勒出来的,所以说。
如果你能很好地检测不同方向的定向边缘,在不同的地方,然后你会有很好的视觉处理,事实上,这些天你知道这些实验被广泛复制,我们知道哺乳动物大脑的早期视觉处理倾向于识别,定向义齿和这些神经元的感受野。
基本上它们最积极回应的模式看起来是这样的,它们有点小边缘,一边是光明,另一边是黑暗。
这告诉你那里有一个边缘,所以我们可以同样地问,嗯,卷积神经网络看到的是什么,他们是否也以类似于大脑的方式看待事物,事实上,这些卷积神经网络的早期层,倾向于。
实际上非常像我们在古巴鼹鼠实验中看到的定向边缘,但当然,我们可以征求我们的意见,嗯,这就是早期发生的事情,后面的层发生了什么,嗯,我们为什么对这个问题感兴趣?它可以让我们解释神经网络实际上关注的是什么。
他们是否在识别图像,在某种意义上,出于正确的原因,这可以帮助我们了解我们的大陆何时会工作,当它们可能不起作用时,它允许我们比较不同的模型和架构,非常相似的概念也可以帮助我们操纵图像。
基于卷积神经网络响应的,夸大这些图像的某些特征,例如,你可以问一个大陆,它是否在蒙娜丽莎的画中看到了不同种类的动物,然后夸大那些特征,或者你甚至可以让它产生幻觉,如果蒙娜丽莎是由不同的艺术家画的。
以不同的视觉风格,我们将看到我们用来分析反应的相同技术是如何,卷积网络实际上可以使用,以这些创造性和艺术性的方式修改图像。
但首先,让我们来谈谈将反应形象化,和卷积神经网络滤波器,首先我们需要好好问问,我们应该想象的是什么,我们有两个选择,一种选择是可视化筛选器本身,所以说,让我们不要担心激活或不激活的图像,目录。
让我们看看过滤器本身,看看,如果这能给我们一些关于它所接收到的东西的直觉,对于第一个卷积层,这是相对简单的,因为对于第一个卷积层,我展示的这张照片实际上不是哺乳动物的大脑,实际上来自一个大陆。
我们可以很容易地想象这些滤镜会捕捉到什么样的视觉特征,所以你可以这样想,这些是一堆不同滤镜的图片,我们可以说好,每个过滤器对应于什么图像特征,我们把我们的形象像这只狗,然后拿一个过滤器。
想象一下把它覆盖在图像的一个补丁上,现在问问自己,如果你用点积,的,如果你能把这个过滤器和图像像素相乘,然后把它们都加起来,那个点积是一个大的正数还是一个大的负数,还是会接近零。
所以如果它是一个大的正数或一个大的负数,这意味着过滤器对补丁的响应非常强烈,但如果是一个很小的数字,接近于零,然后它对那个补丁没有反应,所以这里,你可以看到狗耳朵的边缘一边有一种颜色。
另一边是不同的颜色,所以这些定向边缘过滤器中的一个可能会对此做出非常强烈的反应,在这种情况下,实际上,因为背景比狗轻,过滤器在往另一个方向走,它实际上会有很大的负面反应,但你可以想象。
也许在网络的某个地方有这个过滤器的底片,或者另一方面可能会有很大的积极反应,如果你把这个过滤器覆盖在另一边,边缘不对齐的地方,所以这里的边缘是从左下角到右下角,但是狗零从左上角到底部,就在这里。
因为它们没有对齐,这些之间的点积实际上不会很大,因此过滤器不会在此位置开火,这就是你如何获得一些直觉,过滤器真正代表的是什么,不幸的是,这真的只适用于第一层过滤器,因为第二层滤波器不是用图像像素表示的。
它们用第一层过滤器的激活来表示,这些对我们来说几乎是不可解释的,所以我们有的另一个选择是尝试将刺激形象化,激活特定的神经元,修道院里的神经元是什么,嗯,神经元是特定过滤器的特征。
通常当我们对视觉刺激激活的问题感兴趣时,哪个神经元,我们真的在问所有图像位置的问题,所以我们可以问是什么激活了第三个功能,7在坐标2处,五层两个十七,但通常我们不太关心坐标。
所以我们更关心的问题是什么激活了功能二,五层七层,所有地点平均,所以我们有我们的修道院,我们可以把中间的一层,我们可以在中间层要求一些过滤器,什么图像补丁会使这个过滤器的输出变大,我向你道歉。
视频中的文字就会被剪掉,但它说是什么图像补丁使这个过滤器的输出变大。
我们实际上可以尝试生成图像补丁,特定层中的特定过滤器输出大量的,然后我们可以看看那个补丁是什么样子的,我们会找到一些能接受人脸的过滤器,一些能让狗接受的过滤器,和一些过滤器,可以接受更抽象的东西。
比如圆形的形状,这种探测卷积网络的方式在概念上是,实际上与我前面提到的Huber和Zell实验非常相似,就像他们在猫的大脑里放了一个电极,测量哪些视觉刺激最大限度地激活,这里的哪个神经元。
我们正在对我们的大陆进行探测,试图理解哪些视觉刺激最大限度地激活,那个过滤器,所以让我们呃。
让我们试着做到这一点,呃,可视化过滤器,这很简单,你只需直接打印出过滤器中的数字,所以如果你有,假设在VGG的第一层有64个过滤器,你可以把它们放在一个有64个单元格的网格里,每一个对应于不同的过滤器。
你可以猜到其中一些是在看边缘,其中一些着眼于不同的频率,这几乎是你所期望的,事实上,这有点引人注目,可能一开始,我们看到的过滤器,在大多数卷积网络的第一层,看起来与人类卑鄙的接受场极其相似。
在哺乳动物大脑中观察到的,这其实不是意外,事实上,虽然最初有点,这对计算机视觉研究人员来说有些震惊,看看卷积网络现在获得了这些类型的过滤器,我们实际上知道几乎任何合理的学习算法当应用于真实的图像补丁时。
实际上会发现这些定向边缘滤波器,在独立分量分析中包括K均值,稀疏编码,和许多其他人,而这其中的原因并不是,因为所有这些算法的工作方式与大脑的工作方式相同,实际上是因为这些是自然图像中的主要特征。
自然图像不仅仅是像素的随机排列,他们是,你知道的,向我们呈现物体和场景,主要由边缘组成,所以这些网络学习边缘作为第一层过滤器是有意义的,非常,非常始终如一,但又一次,我们很不幸。
不能以一种有意义的方式可视化更高的层。
所以对于更高的层,我们必须使用选项二,那么我们如何可视化神经元的反应,这是选项二,一个想法是寻找能最大限度地激发特定单位的图像,所以收集大量的图像,评估每个层中的每个过滤器,对于这些图像中的每一个。
然后为每个过滤器对它们进行排序,他们激活过滤器的程度,然后我们可以看到最大限度地令人兴奋的图像,所以对于一些层,选择一些过滤器,说什么,问什么图像补丁使这个过滤器的输出大,让我给你们举一个小例子。
假设我在看,你知道的,第7层中的12个过滤器,作为一个例子,假设红框代表过滤器的接收场,然后呃,你知道这里的感受场覆盖了大约四分之一的图像,我要在图像上滑动这个接收场,这个数字将表示过滤器的激活。
所以这里是十二点三,这里是三,七点四,这里是17点1分,这里是两个,一点四,这里是四十二点一,所有的权利,嗯,我再重播一遍,十二点三七点四,十七点一,211。4,四十二点一。
所以我向你们提出的问题是基于这些数字,你认为这个过滤器实际上在关注什么,你认为它在图中寻找什么?一次又一次,这个补丁是四十二点一,这个是21。4,这个是十七点一,这是37。4,这是十二点三。
所以你可能会注意到,过滤器的反应往往更强烈,当窗户盖在狗的眼睛上时,它的左眼或者右眼,所以您可能会由此得出结论,这个过滤器正在寻找,我喜欢特征和图像。
事实上,如果我们真的做这个实验,如果我们真的试着用一个真正的网络,和,查看特定单元的顶部区域,这是在看,呃,五层池中的单元,我相信这是为了VGG网络,虽然可能是为了亚历克斯·内特,我不太记得了。
这是来自R cnn的原始论文,你可以看到有过滤器显然可以接受特定的,通常语义上有意义的事情,到人们的脸和上半身,第二个过滤器似乎主要对狗有反应,虽然它也能捕捉到有圆圈的东西,所以可能它对狗有反应。
因为它真的在寻找,就像两只眼睛和一个鼻子,像三个黑眼圈,还有这些上面有圆孔的木板,你知道的,上面有多个圆形特征的表面,所以狗和圆圈的田野,嗯,第三排似乎收了玫瑰,你知道吗,斑点的排列,斑点红色的东西。
它似乎最能捕捉玫瑰和面条,第四行似乎接收了一些文本,经常乘以文本两千零六年,因为某种原因,嗯,第五栋房子,第六个圆形闪亮的形状,包括左边一个秃顶男人闪亮的额头,和抛光的木制。
第六集布景中的一件家具的尖端,从左边开始的柱子,所以你知道,不是,都是语义上超级有意义的,就像,你知道的,把闪亮的额头和抛光的木头聚集在一起,呃,那个帖子,也许这并不完全合理,但从视觉上看。
它们是相似的,所以也许这是有道理的,这将是一个大陆的中等水平特征,我们可以做一些不同的事情,而不是只是,这应该说,想法二,而不仅仅是寻找已经激发修道院特定过滤器的现有图像。
我们可以试着找出哪些特定的像素,最大限度地影响某单位的值,这可能会让我们更清楚地了解这个单元到底在做什么,顺便说一句,当我说单位、神经元或过滤器时,这些都是同义词,所以神经元是一个更古老的术语。
在神经网络的激活中引用特定的数字,那些是最近的,这些被称为单位,但在一个大陆上,它们也被称为过滤器,所有这些都意味着相同的时间,好吧,所以我们想找到在某个过滤器上对值影响最大的像素,影响力意味着什么。
影响意味着如果你有一些像素,在l层,在mn位置有一个单位,它是过滤器P,所以a l m和p,如果x i j影响该单位,j应反映为单位的重大变动,是什么量化了这一点。
什么量化了一个值随着另一个值的变化而变化的程度,这正是导数所做的,如果我们拿一些像素,我们取一些激活和一些过滤器,该单元的激活相对于该像素的偏导数,直接量化那个像素对那个单元的影响有多大。
所以如果我们关心一层一层的m和p,j,然后d a m和p l/d,J直接量化了这种影响,顺便提一下,通常我们不关心过滤器在特定位置的激活,我们更关心过滤器在所有位置的平均激活,在这种情况下,我们会。
我们会在激活图上的位置上求和,然后看看通道,但这里只是为了简单,我不会那么做的,那么我们如何得到这个偏导数,结果是我们可以用同样精确的方法计算这些偏导数,我们用反向传播计算了关于参数的导数。
其实也没那么难,这是我们之前看到的反向传播的伪代码,你有一个向前传递,在那里你计算神经网络中的所有激活,然后你有一个向后传球,其中初始化delta,作为您相对于最后一层激活的损失的导数。
然后从最后到开始的每一层,你计算关于该层参数的导数,我们不会在乎的,因为现在我们不关心参数,然后计算前一层的增量,把左边的旧三角洲相乘,被那一层的雅各比人,当你到了最开始的时候,当你到达第一层。
更新增量时,用这种方式,Delta实际上最终会成为你的损失相对于原始输入的导数,也就是图像,所以我们要做的就是让传播回来,量化这种影响是以稍微不同的方式初始化delta,而不是在最后一层放一个损失函数。
我们将在L层初始化Delta,我们想要的单位相对于该层的值的导数,初始化有一个非常特殊的结构,到处都是零,除了我们想要的单位np,因为d,a,m,and,p,over,a,d,a,m,and,p。
只是一个,所以您只需将delta初始化为与L层的激活映射相同的大小,除了你想要的位置,到处都是零,您将其设置为1,所以这就像你的专业,就像古巴和巴西一样,有一个电极,他们把它放在猫的大脑里。
你要对修道院进行一点调查,就像一张到处都是零的激活图,除了你想探测的地方有一个,如果你想探测一些单位的和,比如说,如果您想探测特定筛选器在所有位置上的一些激活,然后在过滤器的所有位置都放一个。
然后在所有其他过滤器的所有位置为零,因此,该过程将delta设置为与l相同的大小,并将其设置为单元的一个,你想为其他人探测和归零,然后从L层跑回道具,一直跑回图像,然后读出你想要的数量。
你得到输入图像的最后一个图像,这样它的大小就和图像一样了,其中的数值将代表,图像中的每个像素对您关心的单元有多大影响,在实际实施方面,其实很简单,你可以用一模一样的背面,用于训练神经网络的传播实现。
只是现在,你要训练它计算这些激活的导数。
关于图像,所以让我们看看这在实践中是如何工作的,假设你在这里有一个看起来像亚历克斯·内特的网络,你在一张猫的照片里喂食,如果你真的去计算中间层激活的导数,相对于输入图像中的每个位置,你会得到这样的东西。
好的,不是很好,你可以看出它或多或少是猫形的,虽然到处都是噪音,我们真的不知道发生了什么,但是,如果您稍微修改反向传播,你实际上可以得到这张照片,所以我马上告诉你这个修改是什么,但在这张修改后的照片中。
它实际上清晰多了,这个单位在找什么,你可以看到背景中的大部分草都没有出现,这个单元主要是强调猫的脸,所以它更多地看着猫,大眼睛大鼻子等等,它没有那么关注其他一切,事实上,即使是眼睛,那个呃。
特定的颜色通道本身实际上是有意义的,所以你可以在这张渐变图像中看到,眼睛其实是蓝色的,这意味着如果你把这只猫的眼睛弄得更蓝,这会更激活那个单位,所以这是一个寻找蓝色大眼睛的单位,好的。
那也许是件明智的事,如果你想找到可爱的小猫和照片,那么修改是什么,嗯,这里的修改叫做引导反向传播,这是本文介绍的一个技巧,叫做追求简单,全卷积网,这有点像黑客,我也没有一个很好的解释,这太重要了。
但它似乎大大提高了你得到的图像质量,通过分析这些梯度,所以引导反向传播背后的想法是这样的,嗯,普通的背部道具不是很容易解释,因为网络中的许多其他单位,将为给定单位贡献正梯度和负梯度。
所以这个单位A和P可能会受到其他单位和前面层的积极影响,它也可能会被抑制,它可能会受到很多其他单位的负面影响,这些消极的抑制往往非常复杂,而阳性抑制,而积极的贡献往往更简单一点,不完全清楚为什么是这样。
但似乎就是这样,所以也许如果我们只保持正的梯度,我们将避免一些复杂的负面贡献,并获得一个更干净的信号,所以引导反向传播的作用,每次你回来的时候,它都会引入一个启发式的变化,通过relu传播。
通常当你通过Relu反向传播时,如果Relu之前的激活为阳性,然后你只需将你的增量乘以一,如果是阴性,这意味着杀死激活的导轨,你乘以零,你在引导反向传播中所做的是你也把,这个渐变,如果输入梯度为负。
所以如果增量中有负值,负值变成零,呃,当它向后穿过一条实际上不应该发生的射线时,因为在常规的反向传播中,如果激活进入真正的阳性,那么relu的Jacobian是一个,所以即使回来的梯度是负的。
该梯度应该通过循环返回传播,而这个方法只是说不,不要做那个零没有,这几乎就像在向后传球时加上一个relu,还有前传,那么为什么这个能起作用呢,这并不完全明显,直觉是它消除了这些负梯度,这些抑制性梯度。
和抑制梯度,往往比支持特定单元的渐变复杂得多,所以通过只保持正梯度,只有让单位开火更多的梯度,去掉那些让它着火更少的,看来我们能恢复得更多,对一个特定单位正在寻找的东西的可解释的印象,但这有点启发式的。
好的,所以如果引导反向传播的工作方式还不完全清楚,也许报纸上的这张照片会有助于说明它,所以这里f fi是在relu l加1之前的单位的激活,i是那一层之后的三角洲,你可以看到的是。
常规的反向传播只是设置,层的导数,作为下一层的导数,乘以单位是否为正的指标,这是因为导轨的导数是1,如果它是正的和零的,如果是负数,然后引导反向传播,就是最下面一行的东西,也把它归零了,此外。
如果导数本身为负,所以只有正导数会重新传播,有点启发式。
但这就是它的工作原理,所以事情是这样的,嗯那个,这篇论文的作者和我们一起想出了,六层和九层不同单元的一些可视化,我相信这是给VGG的,但我不确定,所以他们生成这些可视化的方式是。
他们首先发现了最大限度地激活不同单位的补丁,然后他们用这种渐变方法来计算哪些特定的像素,在这些补丁中负责激活,所以你可以看到CON V6,这些是一些较低级别的功能,激活它们的补丁似乎是,你知道。
我说第一排,主要代表狗鼻子的圆圈,但并不总是,特定的像素实际上是鼻子本身,在九号,这在网络中更高,所以感受野更大,特征比较复杂,在这里你可以开始看到一些更有趣的模式。
你可以看到对第二排人的脸有明显的偏好,对第三行圆圈的明显偏好,你也会注意到在每个图像中你知道有些东西实际上被删除了,比如说,在底部图像中,在最下面的一行,这是一个似乎有偏好的单位,也适用于圆形的东西。
所以对于左边的牛仔来说,给那个戴牛仔帽的人,牛仔帽非常强调,而衬衫相对不那么强调,特别是对着图像的底部,所以这真的是在研究这些补丁的特殊性质。
P28:CS 182- Lecture 9- Part 2- Visualization and Style Transfer - 爱可可-爱生活 - BV1PK4y1U751
所有的权利,在下一节中,让我们更多地讨论如何可视化特性,甚至可能是带有反向传播的整个类,所以我们要讨论的下一个想法是超越,只是想把渐变形象化,导数,如果我们试着优化图像呢,呃。
完全从零开始最大限度地激活一个特定的单位,所以在我们试图找到激活一个单元的图像补丁之前,然后找出这些补丁中的哪些像素实际上负责激活,现在我们要试着生成整个补丁,甚至可能是完全来自网络的整个图像。
所以在我们想计算哪个像素会影响一个特定的单元之前,对于给定的图像,现在我们要做的是,我们要计算一个特定单位的导数,相对于图像,然后我们实际上会修改图像来激活那个单元,这是非常好的。
因为我们实际上不需要任何特定的图像来开始,它可以生成一个完全随机的图像,就像随机噪声一样,然后以这种方式迭代修改以优化它,以便它最大限度地激活一个特定的单元,这可能更好,因为它提供了一些废话。
对一个单位正在做的事情进行更公正的调查,这不是找到一个激活你的现有图像,它实际上是关于产生一个全新的,现在不幸的是,如果我们只是天真地使用这个程序,它可能不会很好地工作,好的。
那么这个很好地解决了什么优化问题呢,这是试图找到x,也就是激活的arg最大值,激活是x的函数,所以我们可以把m和p写成x的函数,更一般地,我们可以把这想象成找到一个x,它使x的一些客观s最大化。
其中x的s可以指单位或类标签的任何组合,如,比如说,我们可能希望在图像的所有位置最大化特定过滤器的激活,或者我们想要,我们可能想最大化一个特定类的概率,试图找到什么是网络,被认为是该类别的原型图像。
所以这本身不太好用的原因,是它有点太容易产生真正疯狂的图像,如果你只是天真地这样做,所以回想一下这张猫神经衍生物的图片,如果我们想优化一个图像,更好地发射这个单元,你可以看到这个单位有一个正导数。
当我们把猫的眼睛弄得更蓝的时候,所以如果我们把蓝色频道设置为十亿或其他非常,非常强烈地激活那个单位,它会像一只超级猫一样创造出巨大的,无限明亮的蓝眼睛,单位会对此印象深刻,会说好,这肯定是只猫。
但我们不想那样,我们不想要疯狂的图像,我们想以某种方式限制这个过程,这样产生的图像就像一种可感知的图像,所以我们需要某种调节器来防止疯狂的图像产生,对这些可视化技术的大量研究。
实际上处理了不同的方法来规则化图像,以防止这些非常疯狂的解决方案,一个非常简单的选择,往往有效,一种好的方法是简单地正则化像素激活的平方之和,本质上是我们之前看到的平方范数正则化器,这很有道理。
因为如果我们有可能产生一只拥有无限光明的超级猫,无限蓝眼睛,嗯,这将有一个非常大的标准,这个规整者会对此非常不满意,所以这个正则化器会阻止这个解决方案,还有一些其他的解决方案,它不会阻止。
但总的来说,它实际上是一个明智的规则化器,好的,所以如果我们加上这个正则化器,然后我们优化,嗯,我们可能需要问一下哪个单元,我们是否应该最大化x的s应该是什么,让我们从选择x中的s作为类标签开始。
所以这将更容易理解,说得很好,这是我们得到的简历,但我们也会在一秒钟内做Conv Six的事情,但现在让我们从类标签开始,所以这就像问网络,嗯,你认为是什么,是最大值是最大化火烈鸟标签的图像,例如。
使其工作的一个重要细节是不是最大化类概率,您实际上希望在SoftMax之前最大化激活,所以这意味着最后一层,你在末端有一些线性层,它将进入一个软最大值,你想把这个部分最大化,不是这个部分。
原因是在软马克斯,除以所有其他类的激活,如果你最大化,假设你的班级是火烈鸟,校车和河马,你想要最大限度的火烈鸟形象,相反,你会得到的是最小的图像,校车和河马对吧。
因为你可以通过让它更像火烈鸟来增加火烈鸟的可能性,或者让它少坐公共汽车或河马湖,因为概率是归一化的,所以实际上,如果你最大化概率,你可能会得到一些非常疯狂的东西,你可能会得到一个疯狂的图像。
那不太可能是河马或公共汽车,因此更有可能是火烈鸟,但是如果你在软最大值之前最大化东西,然后呢,你实际上会对最相似的东西进行适当的优化。
那个特定的阶级,这些是这篇论文的一些结果,叫做卷积网络的深处,图像分类模型和显著性图的可视化,你知道的,当然啦,这些图像不太逼真,因为它们不是从任何真实的照片开始的,他们从一些基本的噪音开始。
然后用这个正则化器运行这个梯度下降过程,生成在网络中最大限度地激活该类的映像,但是如果你仔细观察这些照片,你可以看到有一些明智的事情在发生,所以在左上角你有一个哑铃,绝对不像哑铃。
但它看起来确实像两个庞然大物的许多副本,中间夹着某种棍子,如果你看杯顶中间,绝对不像杯子,但它有那些,这种轮廓,看起来有点像这些老式茶杯,斑点狗绝对不像斑点狗,但里面肯定有一些斑点,如此清晰。
这个模型要找的东西,当它试图将某物归类为斑点狗时,就是它有没有斑点,如果你看电脑键盘第三行第二列,那里有一些矩形网格看起来有点像按钮,基特狐狸,第三列第三排肯定有狐狸年的形状。
左下角的鹅也明显有一些鹅的轮廓,但又一次,很明显不仅仅是一只鹅,这可能会让我们对这些网络寻找的东西有一点了解,例如,它暗示如果图片中有一只鹅,你要把那只鹅繁殖二十倍,会更像鹅,所以鹅越多越好。
越鹅越像鹅,也让它有一点,很明显这个网络不太关心形状的特定轮廓,就网络而言,斑点狗真的是一个斑点,这不是它有没有耳朵或眼睛的问题,它真的是关于质地的,好的,所以说,这可以让我们了解网络可能擅长什么。
它可能不太擅长的是什么。
以下是Zynski的另一篇论文中的一些可视化,这叫做通过深度可视化来理解神经网络,这是一个相似的原则,但它使用了一个更细致入微的规则化器,所以他们使用的正则化器有点难表达为一个函数,但程序如下。
使用渐变更新图像,然后你实际上模糊了图像一点点,直觉上,它的作用是,它防止优化器产生真正疯狂的,基本上愚弄分类器的高频细节,所以模糊会让它有点,它倾向于强调低频的重要性,因此使它产生更连贯的形状。
这可以防止微小的噪音扰乱网络,然后你重复这个过程,所以用渐变模糊更新,将真正小的激活降至零并重复。
这是他们为特定课程提出的,这些可视化现在开始看起来更容易解释,所以你可以看到上面的火烈鸟,左,图像实际上有看起来像火烈鸟的东西的轮廓,所以对于火烈鸟来说,至少这个特定的网络确实寻找特定的形状,心兽。
不管第一行第三列是什么,你可以从这个中猜到,那是一种长着鹿角的动物,因为虽然这些照片中有很多复杂的形状,一个反复出现的主题似乎是这种长着大鹿角的鹿一样的头,所以不管心兽是什么,我不知道那是什么。
但我猜它是某种长着鹿角的动物,嗯台球桌,肯定有桌子,喜欢它和旅行车的味道,如果你仔细看,你几乎可以看到一些窗户,偶尔也会有一两个轮子,好的,所以一些明智的事情正在发生,并利用这一切。
应用同样的方法也分析哪些补丁,最大限度地激活特定层,所以在这里他们选了一个班,然后他们在该类的特定层最大化激活,你可以看到在海盗船的第八层,比如说,它往往有一个更全面的,一个实际上。
你实际上可以看出有一些带桅杆的帆船,而在第七层,它看到了一些更精细的细节,似乎类似于温莎领带,你可以看到一些看起来有点,就像第八层的领子和领带,而对于第七层来说,形状更抽象一点,当我们进入较低的层。
事情变得,你知道,明显较小,因为这些层的感受野更小,也更抽象一点,当你下到第四层的时候,它实际上是在看基本的几何基元,像圆圈和旋转的东西而不是整个物体,如果你现在进入第二层或第一层。
P29:CS 182- Lecture 9- Part 3- Visualization and Style Transfer - 爱可可-爱生活 - BV1PK4y1U751
所有的权利,所以在今天讲座的最后一部分,我们要稍微换档,而不是谈论可视化过滤器,我们将讨论使用一些类似的技术来修改图像,所以在我们想问这个问题之前,给定一张特定的图片,五层的十七频道是什么。
在这张照片中看着,或者一般情况下,什么是17频道和5层,对…有反应,而现在我们要提出一个稍微不同的问题,我们要说,给了这张照片,如果它是一幅莫奈的画,它会是什么样子,好的。
现在你可能会说这些是完全不同的东西,为什么这甚至在同一张幻灯片上,直觉是莫奈的画有特殊的特征分布,这些特征的分布反映在修道院中单位的激活上,所以我们可以以某种方式将这些分布传输到其他图像上。
也许我们可以把一个像照片一样的图像,变成一个看起来像莫奈画的图像,通过夸大它激活的程度,在莫奈绘画中也被激活的特征,所以我们用来优化图像的技术,关于我们将要使用的类和特性的激活。
修改图像使其与其他图像相似。
我要讲的第一个技巧,沿着这些路线做一些事情是一种叫做深梦的技术,直觉上,你可以想象深梦所做的是在云中寻找图案,如果你曾经在阴天出去过,你抬头看天空,你看到云飘过,你可能会说嗯,那边的云。
也许它看起来有点像狗,那边的云像一条鱼,让我们看看我们是否能得到一个内容来做,基本上,我们要问我们的大陆是否在图像中看到了什么,然后夸大那个特征,让它看到更多,所以也许我们的大陆会看到这张照片,会说好。
我真的不知道是什么,这与我见过的任何课程都不一致,但看起来有点像狗,我的狗概率比我的其他概率高一点,那么我可以修改图像吗,为了增加这种可能性,来增加这种激活,狗在哪里,评论能告诉你它在哪里吗。
所以回想起这张猫的照片,眼睛在这里,你可以想象让眼睛更蓝,会让这只猫更像,但是,让我们应用它,到一个没有容易识别类的图像。
就像这张云的照片,嗯,这是深树会做的,程序基本上是这样的,在你的大陆上挑一层,运行向前传递以计算该层的激活,将后道具的增量设置为等于该层的激活,然后向后撑起,应用渐变。
所以本质上它是说在那一层激活的任何单元,更多激活它们,这是一种有趣的程序,但结果实际上相当惊人,所以如果我们仔细观察右边的图像,你知道吗,从远处看,只是看起来左边的云是一样的,但如果你近距离观察。
你开始看到一些物体在云中弹出,所以这里是那些放大的物体,你可以看到你知道,可能有些看起来有点像河豚,或者是蜗牛,所以它试图从本质上产生幻觉,它已经在那些云中看到了一点,基本上更强调它们。
这样它们就更明显了,所以实现这一点的过程实际上非常,非常简单,这是一些代码,这是安德烈的幻灯片,阿帕蒂和,代码基本上在做什么,是不是,呃,首先将目标设定为,图层的激活。
所以这就是用红色突出显示的部分所说的,就是向前跑,通行证,找出激活,并将损失的导数设置为这些激活,因此,这与将目标设置为激活的总和是相同的,然后当它实际应用渐变步长时,它要做的是。
它会对图像施加一点抖动,这就是用蓝色突出显示的部分,然后它会向前传球,计算主观,设置delta为激活的,然后向后传球,所以这只是反向传播,然后它会将渐变应用到图像上,有一点点正常化,呃。
只是为了避免由于整体规模而产生的任何问题,它将把它应用到图像上,然后它会产生更多的,所以直觉上抖动在做什么,只是防止这个优化器对特定的像素做疯狂的事情,它的作用与以前x的r相同。
它本质上是一个规范者来促进这一点,看起来像一个自然的图像,如果你不用这种抖音,会发生的是你基本上会得到一个疯狂的图像,像素得到微小而荒谬的修改,基本上愚弄了网络,让它最大限度地激活了这个垃圾的一些类。
它所做的是稍微改变图像,应用梯度,然后把它移回来,所以这是一个非常简单的程序,它基本上在做我们以前做的同样的事情,现在只有x的s是基本上在那一点上的平方激活,因为平方激活的导数就是激活本身。
所以这里有一些图像实际上是由深梦产生的,当然,这从特定的图片开始,然后修改这些图片,你可以猜到这些照片是什么所以在右上角,右下角是梵高的《星夜》,这是一张羊在田里的照片。
但网络显然对这些图像做了一些相当大的修改,比如说,你可以看到左边的图像,实际上插了一些眼睛,相当多的眼睛一开始就不在那里,在右下角的绵羊图像中,它做了一些有点疯狂的事情,比如给羊增加很多腿。
因为我猜羊的一些底部看起来有点像动物,所以它在里面放了更多的动物,它还把羊的鼻子变成了狗的鼻子,以适应星夜,它似乎投入了大量的挥舞,进入画面,所以它做得有点疯狂,所以幻觉的东西,你可以自己玩。
如果你现在转到幻灯片上的URL,你可以在这一点上问,就像这有什么好处好吧,主要是娱乐,主要是一点点艺术许可,你可以从大陆上得到一些疯狂的图像,但你实际上可以重新利用其中的一些想法,做一些更多的事情,呃。
可能有用,更务实一点,所以这里有另一个密切相关的想法,而不是夸大单个图像中的特征,如果我们让一个图像的特征看起来更像另一个图像的特征呢,比如说,如果我们拿一幅画,我们以某种方式提取它的风格。
通过观察那幅画中特征的统计数据,也许这种风格是由特征之间的关系来代表的,比如哪些特征倾向于紧密地出现在一起,可能有很多角度和很多直线,但不是很多曲线的东西对吧,这可能是图片的一个风格方面。
然后我们再拍一张像照片一样的照片,我们把它的内容拉出来,也许内容更多的是通过特征在空间中的特定位置来反映的,事物在图片中的位置,比如说,曲线在哪里,这个角,或者边缘,或者曲线。
如果你把这种由风格表示的关系和由内容表示的空间位置结合起来,也许你会得到照片的修改版本,反映了画中的风格,所以说,也许,你会得到一幅甘道夫的现代绘画风格的画,这真的很好用吗,令人惊讶的是,是呀。
谈谈如何让它发挥作用,我们要讨论的最重要的事情是如何量化风格,事实证明,实际上有一个相当简单的方法来做到这一点。
呃,就大陆激活而言,所以让我们假设我们有这幅画,我们通过像VGG这样的卷积网络运行它,我们看PPG中的一个特定层,我们实际上要看许多不同的层,但让我们从一层开始,那层的不同滤镜反映了特定的视觉模式。
较低级别的过滤器可能会反映简单的模式,如边缘,更高级别的过滤器可能反映更复杂的模式,像旋转的东西曲线直线和角度,等等,当我们试图量化风格时,我们将尝试丢弃空间信息。
我们不太关心特定的曲线和角度发生在哪里,我们更关心哪些发生了,以及它们之间的关系,所以我们能做的就是,我们可以在一个特定的位置拔出所有不同的过滤器,每一个过滤器,假设他们有五个人,它们会对应不同的模式。
也许其中一个对应于圆圈,另一个对应于这些螺旋的东西,以此类推,一般来说我们有,这里可能有64或256个过滤器,我有五个,只是为了更容易画,然后我们要问这个问题,哪些特征倾向于同时出现,比如说。
我们能在一个特定的地方用这种特殊的风格说些什么吗,如果你看到一个圆形的东西,你也可能会看到一些旋转的东西,所以这是一种接近漩涡的圆圈风格,所以每次我们看到一条直线,我们也看到了这个特殊的质地。
或者每次我们看到一条曲线,我们总是得到平坦的阴影,或者每次我们看到一个漩涡,我们也看到四分之一,好的,这些都是文体属性,与它们在图像中的位置无关,那么我们能量化这种关系吗。
我们可以量化它的方法之一是通过建立特征协方差,对于两个特性k和m,所以这里的特性是两个不同滤镜K和M的滤镜,在某一层,你可以计算他们产品的期望值,期望被接管到图像中的不同位置,所以这是一个单一的图像。
为了一幅画,检查激活地图中的每个位置,总的来说,职位加起来平均,这两个特征的乘积,如果这些特征倾向于一起出现,如果它们很少同时出现,那么它们的产品就会非常大,这意味着如果其中一个非零,另一个通常为零。
那么他们的产品就会很小,它们将接近于零,因此,同时出现的特性将有大的产品,不同时出现的功能将有非常小的产品,你可以建立一个叫做克矩阵的矩阵,其中矩阵中的入口km只是滤波器k的协方差,过滤掉,事实证明。
这个克矩阵是量化风格的一个非常有效的方法,在图片中,现在你得到每一层的一个矩阵,矩阵的维数就是通道数的维数,所以这是一个接一个的渠道,它与激活映射的分辨率无关,因为记住你在所有的x上平均,Y职位,因此。
这抛弃了所有的空间信息,并保留了共同出现的特征概念,就像每次有一条直线,你也可以看到这个质感,如果有直线的特征和纹理的特征,如果它们同时出现,你会期望它们的产品很大,如果它们很少一起发生,就很小。
所以如果特征有这个协方差,然后我们就有了,在某种意义上正确的风格,这似乎令人惊讶,但它实际上是有效的,如果你对选择哪些层有点小心,这个克矩阵将为源图像计算,对于表示样式的图像。
然后我们要通过优化两个目标来构建一个新的图像,风格目标和内容目标,所以这个风格目标将基于这个克矩阵,假设GL是L层的源图像图矩阵,x的l是新图像在l层的基础矩阵,它是x的函数,因为当你改变图像时。
你改变相应的克矩阵,那我们就可以把损失记下来,所有层的样式损失,然后对该层的所有对特征进行求和,这只是以g为单位的L的条目之间的平方差,和x的l中的a项,每一层都由一个重量WL加权。
这个重量必须小心选择因为,你必须优先考虑对所需风格的相对贡献,不同抽象层次的,记得吗,记得当我们在不同的层上可视化过滤器时,你可以看到更高层的过滤器往往更整体,它们倾向于反射完整的物体。
而低层滤波器对应于更多的几何细节,所以说,取决于您是否要转移样式,以更高阶的方式挑选出看起来相似的物体,或者以低阶的方式通过挑选出类似的更精细的几何细节,这应该会影响你如何选择你的体重,当然还有。
在实践中,适当地选择这些重量是有一点艺术性的,但如果你选择得当,然后你可以得到x的l样式,实际量化图像风格x之间的相似程度,以及用来形成原始克矩阵的图像的风格,好的,所以现在要实例化这个。
我们必须为内容和内容设计一个目标,在某些方面应该是相反的,它应该主要关注于保持空间位置比如这些特征所在的位置,而不是看特征之间的关系,所以说,原来,量化内容的一个非常简单的方法是只匹配内容图像中的特征。
所以呃,如果f i j k是L层ij位置滤波器k的值,然后你可以对所有位置和所有过滤器和,取这些激活之间的平方差,现在请注意关于l内容的一些与l样式非常不同的事情,l内容用于特定层,它不是所有层的东西。
所以在这里你会选择一个你认为可以反映内容的层,同样,这种选择实际上是相当微妙的,然后保存位置信息,因此,您实际上将ij位置的功能与内容图像匹配,同一位置的特征,所以你希望位置对齐。
而第一种风格你想要相反的,你想把位置扔掉,所以将此与风格损失进行比较,风格损失没有IJ在里面,一点都没有,ij已经总结出来了,当我们计算源图像和目标图像的克矩阵时,然后用L反向传播就形成了完整的图像。
风格和内容,所以这基本上是程序,这是我们可以用来拍摄两张图像的程序,一种代表风格,一个表示内容,我们将克矩阵与样式图像的大矩阵匹配,我们匹配特定位置的功能激活,到它们在内容图像中的相应激活。
所以让我们看看这是干什么的,这实际上是相当了不起的,呃,你可以用这种方法得到的保真度。
所以在顶部,我有基本方程,只是想提醒你,这是Eddies的论文,被称为艺术风格的神经算法,他们要拍左上角的照片,呃,这种运河边的城市景观,然后他们会拿不同的画,他们正在拍的画被展示出来,左下角的小插图。
更大的图景显示了发生的事情,如果你把照片中的内容和画中的风格,你可以看到它实际上做了一些非常了不起的事情,例如图像C中的星夜图片,它实际上会形成那些小漩涡,甚至在原始照片中都不存在,但总的来说。
它保留了建筑物的一般几何形状,运河边等等,有趣的是,它甚至风格化了运河中房屋的倒影,对于屏幕,第二排,第二栏,i,它实际上引入了一些额外的细节,所以背景中更远的建筑。
我应该用原画中这种漩涡状的天景来代替,但在右边,建筑还在那里,所以它变成了绘画的一种融合,和原始照片,运河,比如说,似乎被拆除了,取而代之的是一座桥,因为桥在原画中是如此突出的特征。
几何细节不一定要保留,所以在呃的情况下,底部有更多的抽象画,许多几何细节实际上被消除了,那是因为那些画的风格,就是没有保留太多细节,所以这种简单的量化风格的方法是非常了不起的。
根据修道院的克矩阵特征实际上产生了一些有意义的结果。
你可以自己玩这个,那个呃,有一个叫D part io的网站,它允许您将样式应用于照片,这些是一些真实的照片,以不同的方式风格化,这是安德里亚带来的幻灯片,所以总结一下,我们讨论了如何将。
什么不同的过滤器和公寓使用他们的梯度,我们可以进一步使用这些渐变来优化特性,实际上最大限度地强调,那些,呃,那些过滤器,当我们优化图像以最大限度地强调这些特征时,我们可以把它变成生成新图片的算法。
并生成具有,你知道吗,一些艺术属性。
P3:CS 182- Lecture 1, Part 3- Introduction - 爱可可-爱生活 - BV1PK4y1U751
所以你知道,如果你在这个班,你可能听说过深度学习,在你可能听说之前,你知道这是一个相当好的主意,你可能听说过它工作得很好,也许你听说过这是一个每年数十亿美元的行业,也许你听说过它可以让机器解决。
对认知和计算要求很高的任务,以前是不可能解决的,是什么让深度学习真正运转良好,让我们从一个非常粗糙的,以这样或那样的方式发展的非常简单的时间表,与深度学习高度相关,我们可以从二十世纪五十年代开始,嗯。
艾伦图灵首先描述了学习是如何,在他的开创性论文中提出了通往机器智能的道路,事实上,他描述的一些方法看起来很糟糕,就像我们今天在1957年认识到的人工神经网络,提出了一种实用的罗森布拉特感知器学习方法。
感知器基本上是这样做的,它做的,两类的线性分离,有一段时间,人们对此非常兴奋,因为这里有一个实际的学习算法,嗯,你知道的,与那些神经网络有关的一些元素,它似乎起作用了,它似乎把阶级分开了。
至少在两个D平面上似乎是一个非常好的主意在1969年,minsky和pepper出版了一本关于学习像感知器这样的算法的书,这本书描述的一件事是神经网络的一些基本局限性,我们今天实际上很熟悉这些限制。
比如,比如说,事实上,很难找到一个全局最优的神经网络,对于给定问题的最佳神经网络,还有很多其他的限制,但在当时这引起了很多关注,因为人们在这本书之前没有意识到,这个基本想法有多少限制,事实上。
这本书出版后,虽然有,你知道的,在神经网络和我们今天称之为深度学习的东西上做了相当多的工作,以前更简单的学习方法,呃,建立在手工设计的功能之上,但尽管如此,在1986年还是有了相当大的进步,呃。
提出了一种训练深度神经网络的实用方法——反向传播法,在一九八九年,有工作,你知道的,开发手写数字识别神经网络的实验室,得到非常好的效果,识别邮政编码,写信封之类的东西,嗯。
但这在某种程度上是在背景中在前景中,90年代到2000年初,ML社区对概率方法产生了巨大的兴趣,凸优化,但大多是浅模型模型,在那里学习过程可以很好地理解,相对简单,并导致,你知道的,大量好的理论分析。
然后一些,不知何故,大约有两千六个深度神经网络开始获得更多的关注,事实上,它们开始引起人们的注意就像以前疾驰的货运列车引起你的注意一样,你知道的,它就在你面前,发表亚历克斯网论文。
它突然击败了Imagenet基准上的所有其他方法,当时计算机视觉中最难的图像识别任务,那么是怎么回事,中间到底发生了什么,好像1969年事情有点走下坡路,有一些早期的杂音,在2006年。
在所有的一千在二千一十二,有一篇论文出来了,在最难的一篇文章中击败了其他人,呃,计算机感知问题,呃,目前正在研究一点。
令人惊讶,那么是什么让深度学习发挥作用呢。
也许如果我们理解这些因素,这个时间表对我们来说会更有意义。
对于深度学习来说,真正重要的事情之一是大模型,有很多,很多层,这很重要,因为,深度学习有效性的很大一部分原因是,它学习表征的能力,但好的表现是高级的表现,它们是抽象的,它们不受滋扰,它们捕捉到有意义的。
更高级别的特性,对象,概念,语义意义,获得如此高级别的概念需要许多层的处理,每一层处理都很简单,记住,为了得到复杂的东西,你需要把很多层叠起来,您还需要大型数据集,这些大型数据集需要有许多示例。
这很重要,因为当你有这么多层的时候,你会有很多参数,并训练这么多参数,你需要大的数据集,但这并不是您需要大型数据集的唯一原因,需要大型数据集的另一个原因,是因为你所学的东西真的很复杂。
想象一下一个人类孩子在他们生命的头三年里看到了多少不同的东西,而我们的视觉系统极其复杂,并且非常善于概括和避免错误,我们实际上从相当多的数据中了解到,所以它应该来了,对我们来说。
有效的机器学习系统也应该需要大量的数据集,这并不奇怪,最后,为了训练有很多模型的模型,非常大的数据集上的许多层,你需要足够的计算机来处理所有这些,你需要足够的计算能力才能在那些大数据集上训练你的模型。
训练所有这些参数,你知道的,在你老死之前,本质上是对的,你不能等你的模特多年来训练,世界将继续前进,所以你需要足够强大的计算机来在大数据集上训练这些巨大的模型,快到有用,现在这三件事都是,你知道的。
不是很有争议,今天他们广为人知,但我想这三件事情中的每一件都是主要的。
你知道的,为这一差距提供了很大一部分解释,为了这里发生的一切。
所以呃,让我们来谈谈层数,我们来谈谈模型的尺寸,这是勒奈特的图表,这是1989年手写数字识别的网络,现在这个网络有七层,但它们是相当小的层,所以我们将了解这些词的意思,我们很快就会了解卷积和全连通层。
在几堂课上,但它本质上是一个有七层处理的网络,七层意味着有七个操作,每一个都将以前的表示转换为另一个更抽象的表示,一个,alex strachesky的imagenet模型,该书于2012年出版。
有八层,只是多了一点点,但它们的层要大得多,所以呃,你可以告诉你只是为了给你一些想法,这对你来说可能还不太重要,因为我们还没有真正了解神经网络是如何工作的,但是你看红雀的F六层有84个单位。
亚历克斯网中最后一个完全连接的层,它实际上有四千九十六个单元,就像两个街区的248,所以它相当大一点,这些天,这已经过时了,这是二十五岁的,但假设在过去的五年里,最先进的图像识别模型有152层。
这是一个共振一五二,有更大的型号,在这一点上有超过一千层的模型,他们工作得更好,所以更多的层真的很有帮助,下面是他们工作得有多好的情节,所以这里的每个条代表IVRC上的错误,映像,大规模视觉识别挑战。
这是一个大规模的识别图像中物体的问题,你可以在这里看到,亚历克斯网,那是16。4的第三小节误差,八层快进,二十四Vgg,非常经典的网络错误率,百分之七点三,十九层快进,甚至更远,二万零一万五。
一百五十二层,错误率三点五,百分之七,所以现在更多的层是有帮助的,你们中那些用更挑剔的眼光看这个的人可能会说嘿,你在那里得到了一些递减的回报。
我们会回到数据集的大小,也是机器学习历史上最流行的数据集之一,尤其是在深度学习中,是MNIST手写字符,广泛使用的数据集,从二十世纪九十年代的今天,这是一组手写数字,零一,两个,三个,四,五个,六,七。
八和九,它有六万,呃,训练图像,你可能会说6万是加州理工学院的一个很多,零一大约二十三,呃,九千幅图像看得很远,一万二千九,现在我们进入了一种,呃,深度学习转型的早期阶段,六万张图像。
好的,有点像,I’我好一点了,ivrc,这是通常被称为imagenet的训练集,图像本身实际上要大得多,但是IVRC有点小,发展于二零零九年一个点,五百万张图像。
像Facebook这样的大公司商业使用的数据集,谷歌,微软等更大,但要大一两个数量级,这些是人们在互联网上对物体进行分类时使用的模型,当你把你的照片上传到Facebook时,Facebook认识到。
通过一个训练有素的模型,可能在一到两个数量级,比这更多的图像,所以这个,这是深度学习在如此复杂的情况下工作所需的数据量,所以说,当然啦,如果在二十世纪九十年代,每个人都在测试他们的网络。
用6万张图像训练的模型,你知道事情直到很久以后才发生变化,这也许并不奇怪。
计算机怎么样?嗯,这是一个情节,需要一点时间来消化,这张图显示了许多不同的神经网络,在这种情况下是为了计算机视觉,垂直轴是ImageNet上的精度,所以在我们看错误之前,现在它的准确性,所以越高越好。
横轴是千兆浮点运算的操作数,每秒千兆浮点操作运行神经网络,所以这大致是衡量它需要多少计算,评估网络,不是训练它去评估它,每个圆的大小表示参数数,所以一般来说你会期望,当你往右边走的时候。
圆圈的大小应该会变大,但实际上不是一对一的通信,因为操作的数量可能比参数的数量大得多,因为卷积是如何工作的,我们稍后会学习卷积,所以说,操作的数量真的是,神经网络计算成本的度量,而参数数是它的大小。
所以如果我们说的是计算,我们真正关心的是操作–横轴,亚历克斯·内特在那边,在左下角,它坐在,呃,你知道的,在零点的棒球场的某个地方,六个千兆失败,它的准确性在当时是相当革命性的,但最近不太好。
在中间的某个地方闲逛,大约12千兆次失败,所以你可以看到顶部图片中间的一组圆圈,那些是不同的,谐振腔,比亚历克斯网贵一点,如果你想获得最好的性能,你在右上角有这些东西,呃,它需要,你知道更多的新。
按数量级,比亚历克斯·内特更计算,所以计算很贵,自然语言处理呢,有很多呃,最近关于最先进的计算成本的讨论,nlp系统,我找不到这样的语言模型图,所以我在谷歌上打了一个问题。
因为我确信谷歌图像搜索会通过使用语言模型来解释我的问题,所以语言模型肯定能告诉我训练花了多长时间,我输入了,训练需要多长时间,伯特,我不是说芝麻街的角色,我指的是叫做bert的语言模型。
这是最广泛使用的语言模型之一,我在搜索框中输入的字符串很可能是由bert处理的,在我收到答复之前,大约五四个小时,好的,但是嗯,五四个小时,当我查的时候,在这上面要五四个小时,五个。
四个小时吃16个汤匙,这张照片诚然显示了几千个TPU,所以TPU在每个盒子里都有一根红色的小电线,其中16个,嗯五四个小时,什么是TPU,TPU是专门为训练大型神经网络而开发的定制硬件。
所以16个TPU会比16个GPU更强大,所以你可以想到,如你所知,可能有几十台电脑,几十台好电脑,五四小时,这是一种很多,所以我不得不建立定制硬件来实现这一切,所以也许我想告诉你的是,这东西真的。
真的很贵,这真的是真的吗,如果是这样,为什么一个观点是,也许这不是个好主意,因为你需要这些巨大的模型,这些海量的数据和海量的计算,我们到底为什么要这么做,但另一个观点是,这实际上说明了深度学习的力量。
深度学习很棒,因为随着我们添加更多的数据,当我们添加更多的层,随着我们增加更多的计算,我们的模型越来越好,虽然数据很贵,计算也很贵,添加更多数据可能要容易得多,比发明新算法更有计算能力。
所以如果你能把一个东西做得更大,它会更好地工作,那太好了,如果我们回到这张照片,在ImageNet上显示精度的提高,随着层数的增加,我们可以在上面再加一行,也就是人类的表演。
人类性能ISVRC现在的错误率约为5%,你们中的那些,呃,观众中的怀疑者可能在想哪个人类,这个人类,所以这是SVC的人类基准,安德烈·卡帕蒂,他有一篇很棒的博客文章,叫做《我从中学到的东西》。
在Imagenet上与修道院竞争,他不是通过创造一个更好的漫画来竞争的,他通过自己对一个任务进行分类来竞争,所以安德烈的表现是5%,也许你可以做得更好,安德烈花了一段时间练习,尽管他花了不止五个。
四个小时。
有哪些潜在的主题我们会在本课程中反复看到,主题,意思是,对我们来说很重要的事情来使我们的深度学习系统正常工作,深度学习系统通过使用高容量模型和大量数据来获取表示,不需要手工设计特征或表示。
所以这里的一个主要主题是模型容量,模型容量非正式地表示一个特定的模型可以如此表示多少不同的功能,比如说,你能表示所有可能的线性决策边界吗,或者大多数模型的所有可能的非线性决策边界。
字面意义上的函数数是无限的,但你知道无穷大有不同的大小,拥有高容量非常重要的一点是,如果你有非常大容量的型号,意味着可以表示许多不同功能的模型,你得到了高度的自动化,你不需要事先知道什么是好的功能。
你不需要事先知道,一个好的功能集是什么因为你可以给它一个非常大的功能集,并让它自己弄清楚,你会得到更好的性能,因为如果你能表示更多不同的函数,那么这个较大的可能函数集可能包含一个比小函数集更好的函数。
另一个主要主题,这在课程中会出现几次,学习的区别是,呃,在学习和归纳偏见中建立一些东西,这是机器学习的等价物,相当于先天与后天,是内置的还是在深度学习中获得的,通常,在数据中获得大部分性能的模型。
而不是来自设计师的洞察力往往工作得最好,所以这里有一个特殊的术语是归纳偏差,归纳偏差是你在模型中构建的东西,以使它有效地学习,我们永远无法完全摆脱这个,有一个众所周知的定理叫做没有免费的午餐定理。
本质上说需要内置一些东西。
它建立在一个模型中的知识或偏见中,这些知识或偏见旨在帮助它学习,用机器学习的说法,从某种意义上说,所有的知识都是偏见,为什么偏好,因为它使一些解决方案更有可能,而一些更不可能。
深度学习的一个关键是创建模型,其中归纳偏差非常普遍,非常广泛适用,这样它就不会降低你找到正确答案的能力,有关实际问题的报告,当然啦,深度学习研究中经常出现的一个主要问题是,我们应该建立知识吗。
还是我们应该建立更好的学习和规模机制,这两件事经常不一致,将更多的知识放入模型中进一步约束它,这干扰了它从数据中学习更多的能力,而这些事情往往需要找到一个很好的平衡,最后一个主题是缩放算法,经常。
这指的是随着我们添加更多数据而变得越来越好的方法。
更多的代表能力和更多的计算能力,因此,非正式地伸缩意味着算法能够更好地作为更多的数据工作,所有的容量都增加了,这真的真的很重要,所以呃,为什么我们称它们为神经网络,早期。
神经网络实际上是作为大脑神经元的基本模型提出的,这是一个神经元的图,呃,它有树突和树突,你可以把它们看作是接收来自其他神经元的信号,所以神经元发送电信号,然后这些信号通过突触传播,使用,你知道的。
各种化学物质和树突,他们有点,那是你的收件箱,它们接收来自所有上游神经元的信号,然后细胞体里发生了一些事情,神经元根据传入的信号决定是否发射,你知道的,大概是因为它是一个细胞,它决定的方式,没那么复杂。
它自己不做任何思考,但不知何故,它进行了计算并决定,如果它决定发送一个传出信号沿着轴突传播,它被发送到下游神经元,所以轴突就像发件箱,树突是收件箱,神经网络是这个过程的一个粗略简化的模型。
人工神经元接收来自上游神经元的传入信号,有时我们把这些称为单位,所以它接收来自上游单元的信号,它对它们执行一个非常简单的数学运算,通常这只是一个总和,所以它会把所有传入的信号加起来。
所以从所有来源发送的东西越多,它的呃越大,激活值将为,然后它会根据传入的信号来决定发射多少,现在对于现代神经网络,此决策通常不是二元决策,喜欢火还是不火,这实际上是一个真正的价值决定。
你可以把它看作是发射率,就像你解雇了多少人,你是非常快还是非常慢,通常这个操作是激活的一个简单函数,所以你取那个和z,然后你对它应用一些非线性变换,它通常被称为激活函数,它是一个将,呃,这个。
这些传入信号的激活程度,这些功能有多种选择,有些,你知道的,通常这些函数都是非线性的,因为,否则你会得到一个完全线性的模型,它们有某种门槛或饱和的味道,比如说。
一个整流的线性单元将所有小于零的数字发送到零,然后保持所有正数的原样,如果你有一个正和,然后你就把它发出去,如果你有一个负和,然后你发送零,但是有很多选择,我们将在课程中详细讨论它们。
然后这个结果被传送到下游单元,这是神经元的好模型吗,在一个非常抽象的意义上,是呀,但是很多生理细节,当然不见了,你知道吗,神经元不只是总结它们的激活,呃,他们有复杂的,你知道电信号。
有许多不同的神经递质,所以真正的神经元,当然比这个简化的模型复杂得多,嗯和,当然啦,当我们实际训练神经网络时,我们不仅仅有一个神经元,我们有数百万甚至数十亿的它们排列成一个网络,典型的一层一层地分层。
那么它是真实神经元的好模型吗,它粗略地模拟了一些神经元功能缺失,许多其他重要的解剖细节,所以不要太认真,在神经科学中,实际上有一项严肃的工作使用神经网络,但你必须,你知道的,就像生物系统的任何模型一样。
你必须接受,在某些方面,这将是合理的,在其他方面,这将是非常不合理的,我们在深度学习中所做的大部分与大脑建模关系不大,更多的是解决机器学习问题。
但深度学习确实与大脑有关,在某种意义上,在大脑中观察到的一些现象也在深度神经网络中观察到,所以我会告诉你一点,你知道,把这个和通常的半信半疑,我给你一些忠告,但我认为值得了解,值得了解的是。
过去人们是如何看待这些问题的,所以我给你们看几个例子,来自一篇名为初级皮层无监督学习模型的论文,感受野与感受野可塑性,这篇论文是二十年代初发表的,在深度学习转型的早期阶段。
这篇论文想研究的是生物大脑学习的特征是如何与特征相似的,学习深度神经网络,例如,你可以拍摄图像,所以这些都是非常特别的图像,他们代表,定向边,这些通常被用来探测神经活动。
在哺乳动物大脑的早期视觉处理水平中,你能做的是你可以把像猫这样的动物,你可以给它看这些特殊的图像,选择性地激发特定的方向,然后你可以在大脑中有一个电极,并测量不同神经元的激活。
试图找到他们或多或少能接受的方向,然后你可以在神经网络上做同样的实验,你会发现对于深度神经网络,就像这篇论文测试的那些,以下方面的统计数字,呃,的,你知道吗。
有多少特征可以接受不同的方向看起来惊人地相似,这并不意味着它的工作方式是一样的,意思是它在关注类似的事情,如此相似的故事,学习到的特征的音频统计类似于我们在大脑中观察到的特征的统计。
这篇论文做的一个特别创新的实验是,他们还研究了触摸感知,所以他们实际上用了手套,他们让一个人处理一个沾满灰尘的物体,这样他们就可以测量他们接触的东西,这被用来训练神经网络,然后是一只猴子的动物数据。
他的手放在一个有不同凹痕的旋转滚筒上,这样他们就可以测量猴子神经元的激活,对不同触觉刺激的反应,他们也发现了类似的模式,呃,这些特征的统计数据彼此相似,这是否意味着大脑进行深度学习。
不一定所有这些都表明这些深度神经网络关注的是,类似于大脑关注的事情,所以说,也许,这实际上意味着任何足够强大的学习机或多或少都会得到类似的解决方案,可能相似之处不在机制上,相似性在数据中。
相似之处在于正在解决的问题,我们应该很熟悉这个想法,如果你曾经坐过飞机,你知道飞机采用了一种在某些方面类似于鸟类的解决方案,它们都有翅膀,但他们继续飞翔,你知道的,有些不同的原则,为什么它们都有翅膀。
因为翅膀很好地解决了它们都面临的问题,也许以同样的方式,这些统计数据的特征是解决大脑问题的最佳方案,神经网络面临着,这真的是关于有一个足够强大的机制。
P30:CS 182- Lecture 10- Part 1- Recurrent Neural Networks - 爱可可-爱生活 - BV1PK4y1U751
欢迎收看今天的第十节课,我们将开始讨论递归神经网络,然后它将过渡到一个关于序列模型和自然语言处理冒险的单元,这将跨越接下来的几周,所以我想在这节课开始的问题是,如果我们有一个可变大小的输入,到目前为止。
我们讨论了有一个输入的情况,就像一个图像,它们可能由许多像素组成,但它仍然是一个固定的尺寸,单输入,然后我们有一个输出,比如,比如说,该图像中对象的语义类的分类标签,像一只猫。
现在让我们假设我们有一些序列输入,这些序列可以是可变长度的,例如,他们可能是,呃,英语句子,所以也许第一个序列有四个元素,x一x一,x一二x一三和x一四,第二个可能有三个元素,第三个可能有五个元素。
所以这可能涉及,比如说,短语的情感分类问题,这是一个非常常见的NLP问题,我们必须解决这样的问题,例如,如果你在网上有评论,你有亚马逊书评的文本,你想猜一下,这是正面还是负面的评论。
也就是所谓的情绪分类,从声音中识别音素,所以你有一系列的声音,你想弄清楚这对应于哪个音素,这样你就可以做语音到文本,或者你有一个视频,你想分类视频中发生的活动,这是人们打篮球的视频吗,还是赛车录像?
所以你可能会有视频帧序列,在所有这些情况下,对于不同的示例,输入的数量实际上是变化的,所以你需要一个不仅能容纳多个输入的网络,而且还有多个不同数量的输入,现在你可以采取一种非常简单和天真的方法。
你基本上可以说嗯,我的最大序列长度是五个,所以我要做的是,我要把我所有的序列,如果他们短于五个,我只是替换呃,剩下的输入,缺少默认值的,像零一样,所以我会把它们归零,现在我所有的输入都是相同的大小。
我可以把它们输入我选择的神经网络,不管是完全连接的网络还是卷积网络,这其实不是一个可怕的想法,对于短序列,这实际上可以很好地工作,不幸的是,它不能很好地缩放到非常长的序列中,随着序列变得很长,本质上。
发生的事情是,为了填充到最长序列的长度,你最终会有非常大的输入,然后不清楚如何处理它们,所以我们可以用的另一个想法,这构成了递归神经网络的基础而是考虑它,有点滑稽的设计,但后来会证明是非常合乎逻辑的。
每个图层都有一个单独的输入,假设我们有四个层,我们有一个长度为四的序列,然后我们将发送x 1 1作为第一层的输入,x 1 2输入到第二层,x 1 3输入到第三层,和x 1 4作为第四层的输入。
如果我们有一个长度为3的序列,那我们现在就只有三层了,当然你们中的一些人可能会问,你能有一个层数可变的网络吗,所以我们很快就会讨论这个问题,但基本的想法是,在每一层我们都有一个输入。
因此层数将等于输入数,这似乎是一个奇怪的选择,但你很快就会看到,这个选择实际上很有意义,所以在每一层,我们现在有两个输入,除了第一层,所以大多数层我们有两个输入,前一层和新输入x的激活。
所以如果我们考虑层um x和层l,那么我们可以做的是我们可以构造这个向量,我们称之为l减1的小节,也就是上一层的激活,a l减1,和那一步的输入,我们称之为x i l或x i t。
然后我们对它进行常规的线性操作,所以我们有一个权重矩阵WL和一个偏置向量BL,我们要乘一个酒吧艾尔玛,减去1乘以w l再加上bl,这就给出了那个层的zl矢量,然后像往常一样,我们应用我们的非线性。
比如一个relu来获得一个好的,所以这很像我们之前看到的标准线性层,唯一的区别就是,而不是只将线性层应用于前一层激活-1,现在您将新输入连接到以前的层激活,然后通过线性操作,然后非线性,好的。
到目前为止,一切似乎,你知道的,相当直截了当,我要说这种特殊的设计实际上并不很好地在实践中工作,我们将在第二部分讨论,为什么会这样,但是现在当我们讨论标准RNN时,这基本上是我们要建立的设计。
所以我们每层有一个输入,在每一层,我们连接以前的层激活和新的输入,通过线性操作,然后应用一个非线性,好的,所以显而易见的问题是,丢失的图层会发生什么,对呀,因为如果你有一个长度为5的序列。
然后你会有五层,如果你有一个长度为3的序列,然后你有三层。
那么这些缺失的层到底是怎么回事,嗯,这里有一个有趣的把戏,我们将使用,这可能看起来有点奇怪,但它实际上会很好地工作,如果我们有一个更短的序列,我们要做的是,我们将假设在第一次输入之前层的激活。
基本上不存在的图层都是零,事实上,不管序列的长度如何,我们都要这样做,所以即使是最长的序列,我们仍然会有一个虚拟的前一层,那里的激活都是零,所以在每一层,我们将执行幻灯片右侧所示的操作,在第一层。
我们将把输入连接到一个由零组成的大向量上,所以现在我们实际上可以实例化这个东西,我们可以对每一步都有不同的权重向量,在序列的第一次输入之前的步骤中的激活将为零,然后之前的任何事情都无关紧要。
所以只要我们有至少同样多的权重矩阵,因为我们有最大可能的输入,我们可以把这个设计,这比总是零填充最大值更有效,呃,最大长度,因为每一层都比我们需要的第一层要小得多,如果我们把整个最大长度序列。
所以每一层的输入大小都很小,它只是序列中一步的大小,可以是一个单词或一个字符,此外,计算这个要高效得多,因为对于较短的字符串,对于较短的序列,你必须评估更少的层,所以你只需要评估大量的层。
如果你真的有一个巨大的序列,所以序列越短,我们要评估的层就越少,这个设计的一个大问题,到目前为止,我已经讨论过了,我们在每一层都有一个不同的权重矩阵,特别是很长的序列最终会需要很多权重矩阵。
这些权重矩阵不会被训练得那么多,因为最后几层将为所有序列训练,而第一层只使用过,对于最长的序列可能很少训练,所以这是一个问题,我们需要解决这个问题,权重矩阵的总数随最大序列长度的增加而增加。
最初的几个权重矩阵可能很少被训练,所以我们需要把这个设计变成一个完整的,成熟的递归神经网络是共享权重矩阵,所以这意味着所有这些层的WL实际上都是一样的,现在,你如何评估这个网络的一切实际上并没有改变。
因为那个,所以这只会影响训练,训练期间,我们只需要迫使矩阵WL对所有层都是相同的,在测试时,这实际上是非常简单的,在测试时间一切都完全一样,我们只需初始化这个,这个虚拟的,呃,第一层到零。
然后我们在滑梯的右侧进行操作,但是在训练的时候,我们需要确保对于所有i和j,wi等于w j,同样,对于所有i和j,bl i等于b j,所以所有这些层的重量和偏差都是一样的,那将是非常好的,因为现在。
即使是很长的序列,他们可能需要在早期层的重量,我们只在很长的序列中看到,但这些重量和后面几层使用的重量是一样的,所以他们已经训练得很好了,事实上,如果我们强迫权重矩阵在每一层都完全相同。
我们实际上可以有我们想要的多少层,事实上,我们可以在测试时间有更多的层,我们在训练时,因为重量都是一样的,所以我们可以创造更多的副本,让整个事情变得像,或者只要我们想,这就是我们递归神经网络的基本设计。
基本的设计是你有一个非常深的网络,其深度等于序列的长度,每一层都有不同的输入,所以每一层基本上都将前一层的激活与输入连接起来,在那个时候的步骤,通过线性层,然后一个非线性,然后进入下一层。
作为来自虚拟上一层的输入,第一层获得一个零,权重矩阵在所有层共享,这意味着我们不需要大量的权重矩阵,等于最长序列的长度,我们只有一个权重矩阵,现在,当然,在这个基本的RNN设计上有许多变体。
我们将在讲座的后面部分讨论其中的许多变体,但这是基本的设计,所以花点时间考虑一下这个设计,确保你真的很清楚,呃,为什么要这样做,如果你对某事不确定,你可以考虑在这个视频下面的评论中问一个问题。
或者在课堂上询问,所以整个设计被称为递归神经网络,我们可以,当然啦,也称它为可变深度网络,所以反复出现这个词,反映了序列有时有时间解释的事实,因此,序列中的不同步骤可以被视为不同的时间步骤。
然后一个递归神经网络可以看作是一个时间过程,但我们也可以称之为可变深度网络,层数随输入数的变化而变化,参数数实际上没有变化,因为所有的层都共享参数,好的,现在作为一个旁白。
对递归神经网络有一种不同的思考方式,这是你经常看到的呈现方式,如教科书或其他课程,所以我们刚刚学到的是我们学会了观察神经网络,作为一种递归神经网络,因为这些可变深度的网络,你在课本上或课堂上经常看到的。
是一个递归神经网络会这样画,在那一层上有一个有趣的小圆形箭头,这个有趣的循环错误所代表的是这一层也得到了它自己以前的值,作为输入,现在,上一次,呃,带有一定的时间内涵,所以说上一次,序列中的前一步。
这是观察模型的等效方式,完全一样的型号,所以你可以把每一层都想象成,上一层作为输入和序列中的当前值,然后所有的层都是一样的,同样的重量,但你可以等价地把它看作是一个时间过程,只有一层的地方。
在时间的每一步,它获得以前的值作为输入,以及新的XT,这些是完全一样的,所以你可能会看到的常见的副歌是有人可能会说好,递归神经网络沿时间维扩展标准神经网络,这就是那个小圆形箭头所代表的。
或者这种句子的其他变体,我想这是真的,依我看,这对真正理解rns是如何工作的有些帮助,这让它们看起来比实际更神秘,所以说,如果这种时间过程视图对您更有意义,那你一定要跟着你的直觉走,我觉得,其实。
可变深度图实际上有助于解释,递归神经网络做得更好,所以对我来说,考虑递归神经网络更有意义,不一定是一个时间过程,但就像一个普通的神经网络,碰巧在每一层都得到额外的输入,层都共享相同的参数。
所以RNN只是跨多层共享权重的神经网络,在每一层接受输入,并且有可变数量的层,虽然其中一些决定可能看起来有点奇怪,事实证明,它们实际上真的很方便,如果您有可变大小的输入。
所以现在最大的问题是我们如何训练这个东西,在RNN培训时,我们必须处理许多问题,我们将一个一个地讨论这些问题,希望能很好地理解这一点,所以简短的版本是,我们将使用反向传播。
我们必须通过几种方式修改反向传播,使它真正为我们的递归神经网络工作,这些修改,它们实际上是标准反向传播算法的一种推广,所以我之前在课堂上提出的标准反向传播算法真的写出来了。
以一种使其适用于传统前馈神经网络的方式,像Tensorflow和PI torch实际上是这个基本设计的推广,这也适用于更复杂的网络,如RNNS,所以第一个问题是参数,这些W和。
B W矩阵和B向量不是特定层所独有的,它们实际上是由多层共享的,所以当我们返回传播时,呃,基本设计是一样的,我们向前传球,计算每一步的所有a和z,所以我们得到了一个1,一个2,一个3,一个4。
z 1和z 2是3和以前一样,然后是后传,我们也以同样的方式进行,我们将delta初始化为最终损失的导数,相对于最后一层或输出,然后每一层,对于每一个relu和每一个线性层,我们计算关于它的参数的导数。
和关于其输入的导数,就是上一层,所有的工作方式都是一样的,问题是现在所有这些层的参数都是相同的,这意味着第四层的θf,与第三层的θf相同,所以如果我们像这张幻灯片上描述的那样运行这个算法。
想象一下会发生什么,所以在这个长度的四个序列中,我们把delta作为损失的导数,相对于第四层的输出,然后在第四层,我们要计算损失对w的导数。和关于b,然后我们会计算新的增量,然后我们会回到第三层。
在第三层,我们将用W的梯度覆盖梯度,和B在第三层,所以照字面意思,l层的梯度,负1实际上会覆盖层L的渐变,我们不想那样,因为我们要损失对w的导数,和损失的衍生物b,来解释W和B对每一层的影响。
不仅仅是第一层,结果是非常,解决这个问题非常简单,事实上,大多数图书馆都没有这个问题,因为他们这样做有点不同,你要做的就是,而不是将导数dl dθf设置为df,dθf乘以delta,你只需要加上df。
dθf乘以delta到导数的值,所以在反向传播的开始,初始化所有渐变,你所有的导数都为零,然后在反向传播的每一步,您将新的df dθ乘以delta添加到旧的,这将在所有层积累这些梯度。
这实际上是允许反向传播所需的唯一更改,像这样处理共享重量,只要将新的dfdθ乘以delta添加到旧的,呃,渐变并清零所有的渐变,当然是在步骤之间,所以你必须把渐变归零,在反向传播开始时。
那么这实际上就会做你想要的事情,所以梯度下降的每一步,从清零所有的渐变开始,然后返回传播,为每一层添加DF,dθf乘以delta到导数的当前值,所以在最后一层,dl dθf等于零,所以当你加上,乘以Δ。
这与将其设置为该值相同,但在前一层,它是非零的,所以你实际上给它增加了一个新的价值,如果他使用这个程序,普通的神经网络会很好地工作,因为在那里你永远不会添加任何东西超过一次,所有的导数都是零。
它们在一层中被使用一次,所以他们把一些东西加到零,而不是只是重写它是完全一样的,好的,所以你基本上在向后传递的过程中积累了这些梯度,在每一层,您添加了额外的贡献,从该层到导数的梯度对w的贡献。
和对b的导数,好的,稍微靠边一点,只是为了解释这背后的数学,让我们考虑一个更简单的例子,假设你有一个x的函数f,它等于x的g,x的逗号h,所以g有两个输入,x本身和x的h,这和RNS有什么关系。
想象一下,这是一个有两个步骤的RNN,x的f是整个rnn,g是第二步,H是第一步,所以第一步取决于一些东西和参数x,第二步取决于第一步的输出和相同的参数x,所以如果我们能计算出关于x的导数。
这个小函数会给我们直觉,我们需要弄清楚如何计算RNN中的导数,那么这与w在rnn井中的角色如何相似呢,如果你只是,呃,假装x是w,其他的都是,在所有其他输入中被省略,这正是RNN使用两个步骤的工作方式。
所以让我们计算x的f对x的导数,现在x的f等于一个有两个输入的函数g,这两个输入都依赖于x,所以当你遇到这种情况时,根据微积分的规则,导数只是两项之和,通过第一输入的导数加上通过第二输入的导数。
所以我们得到DG DX,那是g对第一个参数的导数,x对第二个参数的导数,也就是dh dx乘以dg d d h,所以我们使用链式法则,因为我们有第二个函数h,这是通过链式法则计算的第二个参数的导数。
所以从这个,您可以看到,如果您有相同的变量通过多个参数进入一个函数,你想对这个变量求导,然后你只需把通过每个参数的导数求和在一起,这就是为什么我们最终将每一层的所有渐变相加,所以说。
这就是如何修改反向传播来处理这种类型的RNN,具有可变长度输入。
现在我们还要处理另一个问题,如果我们有可变大小的输出呢,因此,一些示例可能会为图像生成文本标题,有一些生成文本的图像示例,所以这里有一个单一的输入,即图像,而是一个可变长度的输出,即文本。
当你预测未来的视频帧序列时也是如此,所以底部的动画显示了,完成视频的附加视频帧,用黄色突出显示的帧实际上是假帧,由RNA生成,也可能产生音频序列等等,所以在我们每一层都有输入之前。
现在我们将在每一层都有一个输出,所以我们要有一个这样的建筑,一些输入进去,然后我们将在每一层产生不同的输出y帽,输出的数量可能因特定数据点而异。
所以让我们来谈谈这个设计,一个立即出现的问题是每一个输出都有自己的损失,所以我们希望每一步的输出都是正确的,这意味着在每一步我们都有一个单独的损失函数,所以每一步都像之前一样,我们将执行我们的线性操作。
如果我们在每个时间步长都有输入,然后我们就用和之前一样的方法,在这个简化的版本中,我只是说我们一开始只有一个输入,所以我们只有一个规则的标准线性层,然后呃,我们应用非线性来得到该层的激活,就像以前一样。
现在你的帽子在那一层,l将是应用于,那是某种读出功能,它有时被称为解码器,它可能会非常,非常简单,f可以只是一个线性层,后面跟着一个软最大值,所以如果你只是想要更具体的东西,如果这有点太抽象了。
把f想象成一个线性层,后面跟着一个软最大值,但它可能是任何东西,你知道的,五个完全连接的层,然后是一个软最大值,可能是一些卷积层,你想要什么都可以,但就目前而言,这么说吧,它是一个线性层。
后面跟着一个软最大值,所以这有时被称为解码器,再次,就像线性层的参数一样,现在我们每顶帽子都要赔钱,比如说,也许我们在每一步都有交叉熵损失,所以我们有一个基本的事实,在每一步,我们都有我们预测的y。
我们将使用交叉熵损失,如果y代表,分类变量,所以我们的总损失只是每一步损失的总和,因此,特定输出序列的总损失,就是当时损失步数的总和,所以这是一个非常简单的方法来合并损失,记住,损失总是要按标量估值的。
所以我们必须把所有这些不同的损失变成一个数字,为了做到这一点,我们只是把它们加起来。
现在我们的问题是,在这一点上,如何使用反向传播并不完全明显,因为当我们以前了解到反向传播时,我们总是处于一种情况,你的神经网络是一个链,你总是从下一层得到你的三角洲,然后向后传播到上一层。
现在我们所处的情况是,神经网络实际上有分支,所以每一步,我们会有一个三角洲从那一步的损失中进来,我们会有另一个信号从下一步进来,我们需要产生一个三角形,回到前一步,如何做到这一点并不完全明显。
所以我们没有学会如何做到这一点,当我们谈到反向传播时,对于那些去上课的人来说,我确实在课堂上经历了这个广义版本,但讲座里没有,所以我们要做的是,我们要画这个过程的计算图。
所以我上面的图片并不是一个真正的计算图,这只是神经网络的图表,完整的计算图如下所示,你有x你的输入,然后进入线性层,让我们称之为第一个进入非线性的线性层,就像一个Relu,从那里我们有了第一个读出功能。
f一,可能只是一个线性层,然后是软麦克斯,这在第一次就造成了损失,第一步,现在第一个非线性西格玛一,它也进入了第二个线性层,所以西格玛一产生一个值,它就会产生一个,同样,一个1被两个下游函数使用。
如果一个和呃,林二,林二进入西格玛二,这就是,第二个非线性,然后进入F2,第二次损失,然后三个,以此类推,以此类推,所以说,然后把损失加起来,所以所有不同时间步长的损失都加在一起。
这就是最终产生最终损失价值的原因,所以要记住,当我们画这样的计算图时,圆表示函数,它们不代表变量,所以变量是函数之间的箭头,圆是函数,所以这些圆圈中的每一个都是一个数学运算,它有输入和输出。
它的工作是计算输出的导数,关于其投入的意见,所以让我们呃,现在描述一下我们之前学过的规则反向传播算法,而是基于这种计算图形图像,所以与其看伪代码,我们要看图节点,所以如果我们放大图中的每个节点。
反向传播,也叫反向模式自动差分,在每一层中执行以下操作,所以我们可以把每一层看作一个函数f,它以x f为输入,并产生输出y f,我们总是在最后一个函数开始反向传播,其中初始delta只是一个。
我们的功能是这样的,那是图中的一个节点,它是一个圆,它接受输入x f并产生alpha y,例如,函数可以是relu函数,在这种情况下x f只是zl,y f是一个,它可能是一个线性层,在这种情况下。
x f是负一,y f是z,不管是什么,它有一个输入x f和一个输出y f,它也有一些参数θf和在反向传播过程中,在向后传球的时候,这个节点从下一层得到一个增量,在我调用这些增量之前,现在我要说明的是。
这是Δy,因为进入那个节点的增量,在反向传播期间表示损失的导数,相对于这一层的输出,所以它是dl d f,这就是为什么我要叫它δy f,这种区别很重要,因为反向传播循环将在这一层计算一个新的增量。
新的Delta将是导数,相对于该层的输入,所以首先它会计算损失的导数,根据参数的规格,用链式法则乘以左边的Δy f,由df dθf,然后它会计算新的增量,它现在是损失相对于这一层输入的导数。
所以我叫它delta x f,这是dl dx f,它是通过对这个函数的输出求导而形成的,相对于它的输入所以df dx f,乘以Δy f,所以这只是一种图形方法来绘制我们以前的算法。
所以之前的算法只是一个循环,从最后一层开始,向后进行,在每一层中从最后一直到开始,它会计算这些delta y fs,用它们来计算delta x f,也用它们来计算dl dθf。
这只是我们以前的常规反向传播算法,现在我们要稍微概括一下,我们必须处理的问题,当我们有这些输出数量可变的RNN时,现在我们有一些节点,它们的输出y f变成多个,下游节点,所以我们看到的一些节点。
比如西格玛节点,它进入F一,它也一分为二,所以那个节点上的y f进入两个不同的地方,这意味着在反向传播过程中,会有一个三角洲从其中一个输出中进来,另一个三角洲来自另一个输出。
所以我们可以调用第一个delta y f,第二个是两个的一个三角形y,我们所做的就是把它们加在一起,所以当,当一个节点的输出被多个下游节点使用时,你所要做的就是把这些三角形加在一起。
然后你只需将它们插入完全相同的算法,你把它们加在一起的原因和,我们积累关于参数的梯度的方式,就是把它加在一起,所以对换图中有多个后代的每个节点的非常简单的规则,简单地把来自所有后代的增量向量加起来。
所以如果我们有这样的计算图,这是我们在上一张幻灯片上看到的,我们总是从损失中开始,三角洲只是一个,然后我们往回走,我们有西格玛和,当时所有损失的总和,我们计算它的delta xf,现在和的导数只是1。
所以Δx f只是,然后它被传递到所有对此做出贡献的节点,一二三,你可以想象它们都将被并行处理,在现实中会计算拓扑顺序,但这并不重要,所以任何一种合理的递归算法都会做到这一点,所以我们计算在l 1。
一二一三,为每一个计算相应的增量x f,然后我们在f 1处计算相应的delta x f,f2和f3,现在如果我们看看他们的每一个祖先,西格玛一号和西格玛二号,西格玛三号实际上还没有准备好评估。
西格玛一号和西格玛二号,因为西格玛一和西格玛二,还没有收到他们所有后代的三角洲,但是西格玛三号已经准备好了,因为西格玛3有F3的三角洲,没有其他三角洲,然后我们计算△x f和sigma 3。
并向后繁殖成林三,现在我们有f2和f3的三角洲,所以我们可以计算西格玛二,然后我们可以计算两个,然后我们有f1和f2的增量,所以我们可以在sigma 1处计算三角洲,然后林一,然后我们就这样做了。
我们只是往回走,把所有的箭头反转,和,每次我们有三角洲,为节点上的所有传出箭头计算,然后我们就可以计算那个节点的增量了,当我们有多个进入的三角洲,我们只是把它们加在一起,就是这样,和,当然啦。
如果有多个东西进入一个节点,然后你只需计算对每一个输入的导数。
所以这是我们之前学过的反向传播算法的推广,这有时也被称为反向模式自动差分。
现在,我想总结的最后一种基本的RNN概念,在每一步都有多个输入和多个输出的情况,这实际上是RNN最常见的设计之一,我们得到这个的方法就是把我们之前看到的两个概念放在一起,所以每一步。
我们将上一层的激活与新输入连接起来,应用我们的线性层和我们的非线性,就像以前一样,当我们谈到多个输入时,就像在多输出部分一样,我们有一些读出功能,它可以只是一个线性层和一个软最大值。
在那一步产生输出Y帽,因此,这方面的例子可以包括生成,为图像生成文本标题,现在你可能会说,等一下,你已经告诉我们了这其实有点微妙,为什么事实上,图像的一般文本标题是一个多输入多输出问题。
我们稍后会讨论这个问题,将某些文本翻译成具有多个输入和多个输出的不同语言,其实有比这张幻灯片上的设计更好的方法,我们以后再谈。
P31:CS 182- Lecture 10- Part 2- Recurrent Neural Networks - 爱可可-爱生活 - BV1PK4y1U751
现在我们已经讨论了rnns如何工作的基本知识,让我们来谈谈我们如何有效地训练他们。
所以RNN在最基本的层面上是非常非常深的网络,事实上,你知道吗,我在这些幻灯片中使用的很多例子都有长度序列,你知道三到五个,在实践中,我们可以使用长度序列为100甚至1000的RNN,所以在这一点上。
他们变成了非常非常深的网络,以及参数与不同层共享的事实,也使计算更具挑战性,你可以把它看作是一个参数,第一步的参数对下游的东西有巨大的影响,因为这些影响叠加在一起。
而最后一次步骤的参数可能有相对较低的影响,这就产生了一些数字问题,所以想象一下我们的序列长度,那是一千多英镑,就像背部通过一千多层传播一样,我们之前看到,如果我们应用链式法则,这和乘法是一样的。
一大堆不同的矩阵,如果我们乘以许多,许多数字加在一起,如果有足够的数字,我们只能得到两样东西,如果数字都小于1,然后我们得到零,如果他们都大于一个,然后我们得到h无穷大,所以我们只得到合理的答案。
如果我们乘的所有数字都接近1,我们在乘以什么,当我们把所有这些层的雅各比人倍增的时候,所以我们希望这些雅可比的特征值接近1,如果他们不接近一个,那我们就有麻烦了,如果他们很低,如果他们少于一个。
然后我们得到所谓的消失梯度,这意味着梯度的大小呈指数下降,用层数,如果它们大于一个,然后我们得到所谓的爆炸梯度,这意味着梯度的大小随着层的数量呈指数增长,为什么是指数级的。
或者是因为我们把所有这些数字相乘在一起,所以如果我们有五层,他们每个人都有,你知道的,c阶特征值,那么就系数而言,这是C的五分之一,所以它的步数是指数级的,所以我们真的想得到这些雅各布人的特征值。
接近一个,如果我们能做到的话,现在,爆炸的梯度并不太难处理,因为我们总是可以剪辑渐变来防止它们爆炸,rnn最大的挑战来自渐变的消失,这些现在是一个很大的问题。
在我们的RNN中消失的渐变实际上有一个相当简单的,直观的解释直观的,如果你的渐变消失了,这意味着来自后面步骤的梯度信号永远不会到达前面的步骤,所以你在时间上有一些损失。
这种损失对网络在第三步时的工作几乎没有影响,当这种情况发生时,你的神经网络变得无法维持记忆,所以也许你在第三步看到了一些东西,这是非常非常重要的,以便在第900步得到正确的答案。
但如果时间步长900的梯度信号,永远不会回到时间第三步,那么网络就永远不会知道它需要在第三步的时候记住那件事,这样他们就可以在900步的时候使用它,这是非常糟糕的。
这阻止了RNN基本上从一开始就记住事情,所以我们真的真的想解决这个问题,不知何故。
那么我们可以做些什么来促进通过RNN井的更好的梯度流动,与我们以前看到的相似的基本思想,我们真的希望现在的梯度接近一个,我们特别讨论的是哪个梯度,在每一层,我们要做手术,我们要串联以前的激活。
注意这里我用ts替换了所有的l,只是为了保持惯例,所以我们要把x和t减1连接起来,应用我们的线性运算,然后应用我们的非线性,我们可以称之为RNN动力学函数,让我们用字母Q来表示它,Y Q井。
因为我的信很快就用完了,我需要用F做其他事情,所以我要叫它Q,所以这个运算可以说这是a t等于q,应用到t减一和x t,这是RNN动力学基本上是控制,上一个激活如何变成下一个激活,当我们谈论消失梯度时。
我们关心的特殊导数,是RNN动力学的雅各比,也就是dq d a t减去1,q相对于以前激活的导数,我们会,你知道的,如果我们只关心良好的梯度流动,我们真的希望这个导数接近同一性。
或者至少有接近1的特征值,因为如果是这样的话,那么梯度既不会消失也不会爆炸,因为把一堆单位矩阵相乘,给你另一个矩阵,那就是单位,把一堆有特征值的矩阵相乘在一起,一个会给你一个接近于1的特征值矩阵。
所以最好的梯度流动是,如果这个雅可比的特征值为1,如果现在接近身份,甚至更好,当然我们不只是想强迫,呃,总是a的导数正好是恒等式,因为有时候我们确实想忘记事情,有时我们想以各种有趣的方式改变它们。
所以仅仅强迫这是身份是行不通的,你只想让它接近身份,当你真的想记住,所以在某些时候,你真的只是想说好,至少像第一次一样,呃,你知道吗,可能对于激活向量中的坐标1,7和8。
我们只需要记住那些就让他们一个人呆着吧,别换,也许对其他人来说,您希望合并新的输入,但对他们中的一些人来说,就让他们一个人呆着吧,让他们去吧,因为这就是我们从一开始就记住信息的方式。
但你并不总是希望这样,有时您确实希望修改这些激活中的信息,甚至扔掉,也许一旦你用完了,你将来根本不需要它,然后你想把它扔掉,所以不要强迫我们成为身份,但你想要一些设计,网络可以决定它想记住一些东西。
当它决定要记住它的时候,那么这个导数确实应该接近恒等式,但其他时候你可能想忘记,在这种情况下,您可能希望将其设置为零,这里有一个有趣的RNN设计,或多或少地完成了这一点,所以直觉是你想。
d a t i t减去一个逗号i近于零,如果你选择记住一个t减一个逗号,这里是向量中的索引,所以t减1是一个向量,如果你想记住向量中的第i项,那么您需要ith条目的动力学导数,接近一个,如果你想忘记它。
然后你希望它接近于零,所以我们要做的是,我们要为每个单元设计一个小神经回路,决定是记住还是忘记,所以如果你还记得,您只需按原样复制以前的激活,而不更改它,如果你忘了,然后用其他东西覆盖它。
所以我们将有一个我们称之为细胞状态的东西,我将继续使用字母a-t-1,有时人们用字母C来表示这个,我要继续用一个,我们要将细胞状态相乘,t减去1乘以某个数f,它是一个介于零到一之间的数字。
这被称为遗忘门,直觉上,它被称为遗忘门的原因是如果它,如果它被设置为零,那你就忘了你曾经拥有过什么,如果设置为1,那你就会记住它,所以它将是一个介于零到一之间的数字,包括,然后我们要修改它。
我们要通过添加一些东西来修改它,所以我们有这个修改,把gt和gt加到t-1,在门之后,所以一个T减一个得到门,然后我们在里面加一些东西,所以直觉上你可以这样想,如果ft t接近于零。
然后用gt代替单元格状态,如果ft接近于1而gt接近于零,然后保持细胞状态,如果ft接近1,而gt不为零,然后以附加的方式修改细胞状态,这就变成了我们新的细胞状态,所以现在对t减1的修改是非常结构化的。
它不只是随意地被一些武断的东西所取代,呃,非线性运算,它乘以零到一之间的一个数字,如果这个数字接近1,然后你就会想起,如果接近于零,那你就忘了,然后你向它添加一些东西来修改。
现在当然关键是我们在哪里得到这个f和gt,我们也得把它们弄到某个地方,这就是下一张幻灯片中一些更复杂的设计将出现的地方,但只是简单地总结一下T会发生什么,新的T只是旧的,t减1,乘以ft加gt。
ft在0和1之间,所以用t减去1乘以ft,基本上就像一个忘记的软化版本,记住决定,所以FT可以像零点五,但是呃,你可以粗略地把它想象成一个二进制门,它只是连续的,但你可以粗略地认为它几乎是二进制的。
导数dq,i,d,a,t,减去1,我只是,它是一个介于零到一之间的数字,如果我们想让RNN记住。
那么这个数字可能接近1,这就是我们想要的,那么fd和gt是从哪里来的呢,所以在这里我要描述一个叫做长的东西的完整设计,短期记忆细胞或LSTM细胞,你马上就会明白为什么它被称为长短期记忆,所以这个设计是。
会显得有点武断,但实际上所有的碎片都有一个很好的理由,所以我们决定是记住还是忘记的方式,是基于另一个时间信号,现在一个t减去1来自前一个,HT减一也来自前一步,你会知道最后你怎么知道它是从哪里来的。
但现在我们只能说我们的前一层,我们之前的时间步给了我们两件事,它给了我们一个t减1和ht减1,所以它是上一个时间步长的RNN输出,然后我们在这个时候有我们的输入步骤,x t,所以这就像。
我们必须在一个中处理的新词,比如说翻译任务,我们要做什么,减去1和xt和我们用t做的是一样的,减去1和x t,在我们把它们连接起来之前,所以我们要形成一个新的向量,它有h t-1,与x c相连。
我们要给它们涂一个线性层,然后我们会做各种各样的非线性,现在,这个线性层实际上会产生一个输出,这比我们以前的产量大了四倍,所以说,之前,RNN中线性层的输出与H T大小相同,减一,现在它会大四倍。
所以矩阵的行数是矩阵的四倍,每个部分都有不同的功能,其中一个部分将是FT T,另一个会是GT,然后我们会有另外两个叫做i和ot的东西,所以输出是原来的四倍,输出的维数是原来的四倍。
比我们以前有的普通天真的孩子,这些东西中的每一个本身都是一个向量,维数与h相同,减去一,所以我要描述的所有其他操作都是逐点的,所有其他操作都应用于这些向量中的每个条目,所以门控a-t乘以f-t是明智的。
对这些向量中的每个元素都做了,所以我们要做的第一件事是把FT分量,该线性运算输出的第一部分,我们把它穿过乙状结肠,这使得它在零一的范围内,那就成了遗忘之门,所以它进去,乘以t减1,然后我们把第二部分。
这是我,t,我们也通过乙状结肠,这就是所谓的输入门,输入门控制对单元状态的修改,然后我们拿第三部分GT,我们通过一些非线性,这种非线性实际上是我们可以做出的选择,嗯,传统上。
人们使用所谓的tan h非线性,这使得它在负一比一的范围内,虽然你也可以在这里使用像Ray Loose这样的东西,如果你想要这个,这是一种设计选择,由您决定,这给了我们呃,太喜欢了。
当我写f t bar it t bar gt bar,指线性运算的输出,然后在非线性之后,它们变成f t,所以gt逐点乘以,直觉上,它确定是否要修改单元格状态,所以这是一个介于0和1之间的数字。
如果你想要一个修改应该是一个,如果你不想修改,应该是零,gt确定修改内容,这是非常好的,因为这允许网络独立地选择是否修改,并分别选择如何修改,事实证明这是一个很好的主意,然后你把这两个向量点相乘。
然后将产品添加到忘记门之后的单元格状态,然后是第四个,矢量OT,这是一个叫做输出门的东西,它也通过乙状结肠,它也进入了零到一的范围,它要做的是控制下一个隐藏状态,它将控制下一个HT。
所以我们要做的是把我们的细胞状态,我们通过一个非线性,这也可能是任何东西,但传统上我们会使用10小时,虽然我们也可以用RA,我们逐点乘以OT,这基本上是它的大门,所以如果ot为零。
那么就没有OT的输出是1,然后输出被保留,这就变成了新的HT,这个新的HT也是我们用的,如果我们想在那个时间步长输出,所以如果我们想要某种读出功能,我们会用某种解码器,所以说,嗯。
这可能看起来有点复杂的设计,但有一种方法可以让你对正在发生的事情有一些直觉,在这里,我们试图保持A作为一个主要线性信号的作用,所以我们实际上没有对T应用任何非线性,应用于T的所有运算都是线性的。
它要么乘以零到一之间的数字,或者添加一些东西,或者所有的非线性都应用于h,结果,T上的渐变将非常简单,所以a t对a t的导数,减一等于f,FT在该层直接确定,所以没有任何非线性函数。
影响A T使它的导数表现得很好,同时,通过GT和非线性读出进行修改,现在你可能会说,在这一点上,这是不是有点武断,就像那里,就像我们编的这个疯狂的电路,答案是肯定的,但它在实践中实际上工作得很好。
比一个天真的RNN好多了,因为a t的导数,就一个T减一个来说,他们现在表现得很好,这里的一些选择有点武断,比如,比如说,我们真的需要输出门吗,我们真的需要输入门吗,就像也许我们可以逃脱FT和GT。
而不去打扰其他部分,你实际上可以用各种方式简化基本的LSTM单元,我很快就会谈到的,在这种情况下,它几乎可以工作得一样好,但这是典型的LSTM细胞,这是大多数人最终使用的。
那么为什么这些LSTM细胞实际上工作得更好呢,最简单的原因是A在每一步都以非常简单的方式被修改,它变化很小,它的变化有多大完全由FT决定,现在,你可能会抱怨,在我说之前,我们真的希望导数是一个。
FT绝对不是一个,它是一个介于零到一之间的数字,事实上,通常会少于一个,但在许多情况下,这仍然足够好,所以你可以把at t看作是长期记忆,循环状态的另一部分一直在变化。
您可以看到ht本质上被线性运算w覆盖,所以这是一种短期记忆,ht执行更复杂的非线性处理,但它很难长时间保留东西,A T有一个相对简单得多的线性处理,但它会在很长一段时间内保留信息。
所有的权利,关于这个东西在实践中的一些实用笔记,rnns几乎总是在每个步骤都有一个输入和一个输出,我们将在下一节中在实践中看到为什么这如此重要,像第一部分中那样幼稚的rnns在实践中几乎不起作用。
如果你想要一个RNN,你现在可能会使用类似LSTM细胞的东西,LSTM细胞工作,好的,它们有点复杂,他们有点武断,但他们比天真的RNS要好得多,所以如果你只是想要一些默认,去做某事让你的RNN工作。
可能使用LSTM细胞是你现在想做的,它们仍然需要比标准更多的超参数调优,全连通或卷积网络,你要小心像渐变这样的东西,裁剪,学习率,等等,它们通常比标准的更难选择,朴素神经网络。
也有一些RNN的替代方案来处理序列,这些序列可以,在实践中可以更好地工作,我们以后会了解他们的,这些是像时间卷积和变压器这样的东西,它们是时间注意模型。
所以我们将了解那些后来的LSTM细胞也是令人恼火的复杂,但是一旦你实现了它们,它们可以和任何其他类型的层一样使用,所以通常是为了摆脱LSTM单元中的所有复杂性,你只需编写一段代码,将其抽象出来。
LSTM只是另一层,然后你就用那一层,就像你使用卷积层或线性层一样,所以基本上这就是抽象之美,一旦你把它们抽象成一个函数,你有点不在乎它有多复杂,如果LSTM细胞的任意性和复杂性困扰着你。
LSTM有一些更简单的变体,工作也一样,比如说,一种非常流行的变体叫做门控循环单元,门控循环单元基本上就像LSTM,但没有输出门,所以没有输出门,ht总是设置为一些非线性,就像十个小时应用于一个T。
这也很有效,事实上,GRUS在LSTM不太受欢迎的原因,gr用户是最近才出现的,你可以想象你可以修改LSTM,在其他方面,LSTM真正重要的部分基本上是忘记门,输入门也可以移除。
可能在一些似乎效果更糟的实验中,但这是一个非常合理的选择,如果你移除输入门和输出门。
P32:CS 182- Lecture 10- Part 3- Recurrent Neural Networks - 爱可可-爱生活 - BV1PK4y1U751
在今天讲座的最后一部分,我们将利用我们在,第一部分和第二部分,实际上谈论如何,我们可以使用RNNS来建立解决实际问题的实用模型,我们要讨论的第一件事实际上很重要,是自回归模型和结构化预测。
所以我简单地提到了,在上一部分的末尾,我们在实践中实际使用的大多数rns都有多个输入和多个输出,一开始这可能有点令人困惑,因为,我们想要解决的许多问题,实际上要么有单个输入和多个输出。
要么有多个输入的单个输出,那么为什么我们通常使用rnns,具有多个输出和多个输入,嗯,这是因为大多数需要多个输出的问题,这些输出之间有很强的依赖关系,这似乎是一个有点神秘的语句。
所以让我们试着让它更直观一点,这类问题有时被称为结构化预测,他们指的是结构化预测,因为你预测的事情,输出序列具有结构,与标签之类的东西形成对比,标签没有结构,标签只是单个离散变量的值。
如果你输出像文本这样的东西,文本具有内部结构,基本上与文本输出的答案是否正确分开,单词和文本之间的关系决定了它是否是有效的文本,所以基本上如果我问你一些问题,如果我问你,比如说,你知道你周末做了什么吗?
你可以告诉我,你会告诉我一些句子,你可以告诉我,我驾驶宇宙飞船去月球,现在,这不是正确的答案,那是那不是真的,那是假的,但这是一个有效的英语句子,你可以说,你知道我胡言乱语,紫色木琴,对呀。
那既不是事实也不是有效的句子,所以我们想要真实的输出,但我们也想要有效的输出,服从内部结构的,这就是为什么我们称之为结构化预测,所以一个经典的例子,这是文本生成,假设你有一个由三句话组成的训练集。
我想所以我是我喜欢机器学习,我不仅仅是一个神经网络,让我们暂时假设你不关心概括,你只想让你的模型基本上记住这三句话,我们将把单词看作范畴变量,所以每一步都会有不同的词,它只是,你知道的。
n个可能的单词中的一个,所以你的神经网络会读作输入,也许我们会提示,它会用句子中的第一个单词提示它,所以我们给它输入,然后我们要求它完成句子,它可以用三种不同的方式完成它,所以也许这是一个非常好的网络。
在第一次步骤,它知道基本上有三个词可以跟随,跟随这个词,我和他们的可能性差不多,像AM一样思考,这是每个句子中的第二个单词,然后我们在这些上有一个软最大值分布,所以软最大值把这些变成概率。
我们有零点三的概率思考,点赞零点三,m的零点四,然后我们将从这个Softmax分布中随机采样到,实际上选择第二个词,所以也许我们随机选择这个词,这么想现在网络正在完成句子,正如我所想的。
然后我们进行下一个时间步骤,所以我们计算,呃,你知道吗,我们有一个线性层,它使用以前的激活,计算新的激活,我们在第二步有输出,这又经历了一个SoftMax发行版,问题是网络不知道。
从那个软最大值中随机抽取了哪个单词,所以网络认为它产生了30%的输出,三成喜欢,和百分之四十的上午,不知道你在下一个时间步骤中取样了什么,它仍然会在这种可能的句子的叠加中,所以它会说,嗯,我告诉过你。
句子中第二个词的分布是什么,现在你问我,句子中第三个词的分布是什么,第三个词同样有可能,因此机器而不是对的,因为这是这些句子中的第三个词,所以网络正在做你要求它做的事情。
问题是你试图独立地对这些词进行取样,所以在第二步中,你要随机取样,或者你随机得到机器,然后第三个时间步,同样的,它给出了句子中四个单词的分布,你可能会取样,现在您的网络正在正确地执行所有操作。
你的网络实际上通过这三句话了解了分布,但你得到的完成度是,我想机器,只是为了让你们这一代人毫无意义,尽管网络实际上在学习这种分布方面做得很好,所以我们得到一个无意义的输出。
即使网络在每个时间点上都有完全正确的概率,这是因为在这项任务中,单词之间的协方差很重要,就像得到正确单词的概率一样,所以我们可以做些什么来解决这个问题,和。
这就是为什么拥有接收可变长度输入的网络如此重要,和可变长度输出,当我们实际运行这个网络来完成一个句子时,我们要做什么,我们要在第一步从SoftMax中取样,然后我们将在第二步输入我们的样本。
这基本上会告诉网络我们取样的是什么,所以现在网络知道它是,它不仅仅是预测任何句子中的第三个单词,它是在预测一个句子中的第三个单词,其中第一个单词是,我觉得,现在它会正确地预测,如果前两个字是。
我想第三个词可能是,它会对那个词进行采样,把它作为输入输入,然后完成第四个单词,最有可能的是我,所以说,然后它就会正确地生成,我觉得,所以我是,如果在第一步,它随机取样,然后在第二次台阶上。
它会给机器分配更高的概率,所以关键的思想是过去的产出应该影响未来的产出,和,你获得过去输出以影响未来输出的方式,就是把昨天的产出当作今天的投入,和,这个基本设计几乎用于所有的RN,必须输出结构化序列。
像图像字幕模型这样的东西,视频预测模型,他们都会使用这种模型,所以基本上你很少有多个输出没有多个输入,因为您希望过去的输出影响未来的输出。
现在我们怎么把这个东西训练好,最简单的训练方法,最明显的是将输入设置为整个训练序列,和地面真相输出是相同的序列,但偏移一步,所以基本上不是让神经网络在训练中想象一个句子。
你真的在要求它完成你在时间步上说的一个句子,把时间的所有单词从第一步到T,并在时间步t加一输出单词,所以你的X将是,句子中的所有令牌,除了最后一个,我想因此我很抱歉,句子中的所有令牌。
你的基本真相输出将是所有的标记向后移动一个,然后最后一个将被停止令牌替换,所以基本上这个网络被教导,如果它看到i,它应该输出,我想如果它看到了,我想它应该输出,因此,如果它看到。
我想因此我是它应该输出一个停止令牌,表示句子已经完成,这样在测试的时候,当你用这个来预测一个句子时,然后你最终会得到一个停止令牌,然后你知道网络用那句话结束了,所以这教会了网络,比如说,输出单词am。
如果它看到,我觉得。
因此,i,这是自动回归模型的基本设计,这个有点问题,我在上一张幻灯片上的基本设计,如果你用它来训练一个网络,很有可能,会很好用的,但如果你用它来训练非常复杂的网络,以适应非常长的序列。
你可能会开始看到一些问题,你可能开始看到的问题是由于一种叫做分布转移的东西,所以麻烦来了,假设你有和以前一样的例子,但是网络犯了一些小错误,所以也许对于第一个令牌。
它分配了60%的概率来思考30%的概率,比如,百分之十的概率是一些随机的词,让我们说这个词是驱动,为什么它做得那么好,也许它只是训练得不太好,可能会犯一些错误,你知道所有的模型都会在很小的概率上犯错误。
通常你不会担心这个,因为最有可能的代币实际上是一个非常合理的代币,但假设你在解码,你运气不好,你取样了这个词在实践中驱动的10%的东西,实际上可能发生的是你可能会得到一些输入,这和你以前看到的很相似。
但不完全一样,但在这个例子中你知道在这个例子中你现在有一个很低的概率,但这也是一个潜在的问题,现在您将在下一个时间步骤中使用此作为输入,在这种情况下发生的问题,网络以前从未见过此令牌用作输入。
只是一些随机的信物,它真的不属于这个句子,你在第一步上犯了个小错误,你还是可以恢复的,你仍然可以把这个变成一些合理的句子,问题是,您现在正在向这个网络提供一个令牌,这与我所看到的句子的完成是如此不同。
你知道的,也许您在另一个上下文中看到了这个令牌,但在这种情况下从未见过,这将是完全混乱的,所以在第二步,它会输出一些完全疯狂的东西,一些彻头彻尾的胡说八道,当它从那些完全胡说八道中取样时。
它基本上它是它为它做,它不会产生任何合理的东西,所以它会产生完全的胡说八道,因为它以前从未见过这样的输入,它不知道该拿它们怎么办,它没有产生合理的结果,这背后的问题是训练和测试之间的差异。
因为在训练过程中,网络总是把真实的序列视为输入,但在测试时,它突然得到了自己的输入,这可能是不正确的,问题不在于它一开始犯了一个小错误,那个小错误的问题使问题复杂化了,但到那时就变成了模型的错误输入。
如果我们不给它输入,它可能还会恢复它,可能,你知道吗,它仍然可能产生一个不完美的句子,它可能会说你知道,我开车,所以我是,但这至少是一个理智的判决,就像大部分句子都是合理的,但一旦它得到这个疯狂的输入。
它现在会产生完全的垃圾,因为它只是不习惯看到如此疯狂的输入,这就是所谓的分布转移,因为输入分布在训练时从真弦转移到测试时的合成弦,本质上,真字符串与假字符串的分布不同,网络被训练成以真字符串作为输入。
现在它正在假弦上测试,这不是它不习惯,因此它不能正确地处理,这是个大问题因为即使是在一个时间步骤中的一个随机错误,可以完全扰乱整个输出。
所以一个被提出来处理的解决方案,这实际上是受到一个用于训练RNN的强化学习的老把戏的启发,和嗯,至少在RNN世界中的方法称为强化学习中的计划抽样,它还有其他名字,当我们以后讨论模仿学习时。
我们会真正了解到这一点,这是预定取样纸上的图表,说明了训练中的基本思想,通常我们希望输入真实的字符串作为输入,但我们要做的是定期取样,我们将在时间的每一步都有一定的概率做出随机的决定。
我们会在那个时候给网络真实的输入步骤,用1减去这个概率,我们现在实际上会把它以前的输出作为输入,关键是我们不能通过这条边缘区分,所以网络不知道它得到了自己的输出作为输入,这非常重要。
因为通过随机抽样来区分是非常非常困难的,所以你基本上可以把这看作是随机的,在上一个时间步用网络自己的输出替换真实输入,有一定的概率,这真的很有帮助,因为现在在训练的时候,网络将自己的输出视为输入,因此。
当它在测试时看到,它现在不是完全糊涂了,它还是不知道怎么改句,所以基本上这会教会它说,我开车,所以我现在是我开车吗,所以我是一个合理的判决,嗯,可能不是,如果它训练得很好,它最终会停止说驱动。
开始说东西,但它仍然有助于弥补许多错误,它基本上会让它恢复,它不会以非常优雅的方式恢复,但总比完全失败要好,所以现在这里有一个思想练习,我们要如何选择这个概率,用于用模型自己以前的输出替换真实输入。
所以如果我们总是用模型以前的输出替换真实的输入,这个模型可能真的很难训练,因为在早期,该模型主要产生垃圾,所以在第一个步骤中,它会得到一个真正的单词作为输入,然后在未来的时间台阶上有一堆垃圾。
我们可能会学会忽略输入,只是生成任意的单词,所以这不好,那不是我们想要的直觉上我们想要的是,我们希望在开始时主要输入真正的输入,一旦网络变得很好,这样它的输出在最后实际上是有意义的。
我们希望主要提供模型自己的预测,以减轻这种分布转移,那么本文作者推荐的,这就是为什么他们称之为预定,抽样是对这个概率制定一个时间表,在这种情况下,使用真实输入的概率开始很高,然后逐渐下降。
由于使用模型输出的概率为1,减去这一点,这意味着随着时间的推移,你逐渐减少使用真正的输入,模型的输出更多,他们提出了许多不同的时间表,你可以尝试,像线性时间表或指数时间表,但它们的味道都是一样的。
使用真实输入的概率一开始就很高,然后在训练快结束时下降到零,在训练结束时,您主要是在训练网络自己以前的输出,当然除了,对于第一个输入,它总是来自数据。
嗯,所以这是一个简短的旁白,并在实践中,呃,你不必使用计划抽样,特别是对于较短的序列或较容易的模型,你经常可以通过定期训练逃脱惩罚,但是计划采样确实有助于更复杂的模型。
现在我们可以以多种方式在a中使用rnns,RNN的一大优势,它们提供了很大的灵活性,所以有了常规的前馈网络,你基本上有一对一的映射,所以一个输入,一个带有RNN的输出,您可以有一个输入到多个输出。
多个输入到一个输出,多输入多输出,您首先读取所有输入的地方,然后产生所有的输出,以此类推,所以这第一个一个对很多,那是,你知道的,也许很适合像图像字幕这样的东西,其中输入是图像,输出是文本序列。
许多对一个可能很适合像活动识别这样的东西,其中输入是视频中的帧,输出是对该活动进行分类的标签,你知道,打篮球或赛车,许多对许多,呃,您首先读取所有输入的地方,然后产生所有的输出。
这可能是机器翻译之类的好设计,因为您可能希望用英语读取整个字符串,然后用法语制作整个弦,你不想逐字逐句地把英语翻译成法语,你想在整个句子中读到,然后翻译它的意思,而且这种很多,太多太多的设计。
我很抱歉德克萨斯将切断,对一些人来说,这可能是一个很好的设计,可能是帧级注释,因此输入是视频中的单个帧,你想用现在帧中发生的事情来注释每一帧,正如我之前在实践中提到的,如果你有很多输出。
你实际上会有很多输入,所以在现实中,一对多和多对多可能会像这样实现,因为你想有一个自动回归的过程来产生这些输出,这实际上是我们在现实中看到的。
现在让我们简要地讨论一些实现细节,我们经常用RNN做的事情之一,我们的模型中有一个RNN主干,在中间的某个地方,然后我们使用一个非循环编码器,如果你有像视频这样的图像输入,这尤其常见。
所以你可能有一个规则的卷积网络,然后馈入RNN,因此卷积编码器被放置在RNN层之前,这在图像输入中是非常常见的,现在你也可以有某种复杂的解码器,因此,您可以将RNN或LSTM单元的输出,并将其送入多层。
在产生输出之前,可能有多个完全连接的层,那也是,你知道的,有时做,这有点不常见,因为您可以使用更多的rnn层,这样前馈编码器,使用卷积层之类的东西是很常见的,特别是对于图像,有时使用多层解码器。
但有点不常见,现在您还可以有多个RNN层,这是完全合理的,所以基本上你可以在特定的时间步长获得rnn层的输出,馈入另一个RNN层,然后最终进入软麦克斯,因此很容易根据需要堆叠尽可能多的RNN层。
您甚至可以实现循环或LSTM卷积层,所以如果你真的想让你的网络在每一层都完全循环,你真的可以做到,你实际上可以使你的卷积循环,我也是,在计算上有点贵,但概念上很简单,基本上你对LSTM有这个操作。
这是LSTM中唯一使用学习参数的操作,你只要用卷积代替这个,所以我把它放在幻灯片上,这是一个矩阵乘法,但你会做一个卷积,这基本上意味着每个过滤器都变成了一个小的LSTM单元,因此。
每个滤波器都接受其当前的接收场作为输入,和之前的HT减一,你可以把它们想象成。
现在,您可以使用rnns的另一个技巧是称为双向模型的东西,让我们用一个像语音识别这样的例子,所以在语音识别中你的输入是声音序列,你想产生相应的单词,现在,大多数情况下。
在特定的时间步骤中的单词将取决于顶部的,在萨拉特上,那个时间步,但不完全是因为有时声音的其余部分会影响单词,你觉得,这是因为你知道演讲往往是含糊不清的,它不仅仅是在时间上整齐地排列。
所以问题是这个词在特定的时间步长,如果不看整个话语,可能很难猜到,所以你真的想要未来时间步骤的声音来通知你的猜测,关于当前时间步长下的单词,比如说,你可能无法判断一个单词是否完成,直到你听到帧的结尾。
这是一个比机器翻译更大的问题,现在我们可能会使用稍微不同类型的模型,但这种双向模型可能工作得太对了,因为在机器翻译中,你不想逐字逐句地翻译,你想看到整个话语,然后翻译它,所以双向模型基本上是一个RNN。
其中首先有一层循环连接向前运行,然后你在它上面有另一层向后运行,这意味着在每一步你都有来自过去和未来的信息,然后你,然后你有一个软最大层,输出答案,所以你向前传球的方式。
在这个双向RNN中实际上是这样的,所以在你可以在第二步产生输出之前,您必须通过步骤三运行底部RNN,四和五,这样您就可以通过步骤5开始向后运行rnn,四,三和二,现在你有了处理当时答案所需的一切步骤。
所以实现明智,这真的很简单,呃,从底部的RNN服务输出y帽,作为输入到顶部RNN和反向传播的工作方式完全相同,使用我在第二部分中描述的反向模式自动差分,所以实现明智,其实实现起来很简单,在概念上。
可能需要一点时间来把你的头缠在一起,这东西到底在做什么,但它真正做的是,它允许你整合过去和未来的信息,当你想在一个特定的时间步骤做决定时,所以这实际上是一个更强大的模型。
尤其是在你想要未来的信息来做出更明智的决定的环境中。
在现在,这是讲座的技术部分,现在我想通过几个例子,你知道RN在实践中做很酷的事情的生动例子,这些是安德烈·卡帕蒂的一些例子,他使用lstms学习生成,对于各种不同的数据类型,所以在这里你训练一个RNN。
莎士比亚文集,所以他只是拿了一堆莎士比亚戏剧的文本,等。
用他们在这里训练RNN,呃,这实际上是我认为来自其他一些文献,但原理相似,在这里,他展示了模型在训练的不同阶段的输出,所以在训练的早期,它只是产生了一些垃圾字符,后来,它开始产生看起来更像文字的东西。
然后它就开始了,你知道,主要是说合理的话,有几个拼写错误,然后最终一个人得到了整个短语,甚至看起来合理的句子。
然后他用这个来生成一种假的,假莎士比亚,基本上,如果你仔细观察,你可以看出这显然不是一部真正的戏剧,它确实放入了角色的名字,但名字并不完全合理,也许这就是从朱利叶斯·凯撒身上学到的东西,嗯。
然后你有像公爵文森托,现在,那真的说不通,不同时间段,但在高水平上,呃,这是一种明智的游戏,喜欢看文本,现在。
这是几年前,这是在二十六年左右,呃安德烈,我也做了一些,你知道,更多愚蠢的实验,在那里他下载了代数几何教科书的LX源代码,他让他的RNN基本上生成假法律技术。
那个假拿铁实际上可以编译成一个真正的PDF文件,就像,假定理和假引理之类的,等等,现在如果你愿意,如果你真的关闭这些引理,在其中一些证明上,他们没有意义,就像,比如说,引理零点三表示情况问号。
因此我们可以假设q素数等于零,那是无效的限制语句,但在高水平上,它实际上看起来有点,你知道的。
像一个像一个明智的逻辑这些天,呃,这些类型的生成模型变得更加复杂,这是一个叫做GPT Two的模型中的一些例子,这实际上不是一个RNN,它实际上是一种不同类型的模式来改变谷歌发明的A,但在这里。
它被以类似的方式使用,有一个输入提示符,呃,这些文本是由一个提供给模型的人写的,上面写着,在令人震惊的发现中科学家们发现一群独角兽生活在一个偏远的地方,安第斯山脉中以前未被探索过的山谷。
更让研究人员惊讶的是,独角兽能说一口流利的英语,这是一个人类写的文本,然后告诉模型,看这篇课文,然后完成它,基本上生成更多的文本,这些文本似乎是遵循这个提示的文本,其余的由模型生成。
上面说科学家们以他们独特的角命名了这个种群,奥维德独角兽,这四只有角的银白色独角兽以前不为科学所知,现在在将近两个世纪后,引发这一奇怪现象的谜团终于解开了,豪尔赫·佩雷斯博士,拉巴斯大学的进化生物学家。
和几个同伴在安第斯山脉探险,当他们发现一个没有其他动物或人类的小山谷时,等,所以你可以看到模型实际上在做一些非常明智的事情,在语法和结构方面,也许更令人惊讶的是,它实际上得到了一些语义细节。
一些非常微妙的细节,比如,比如说,生物学家有一个似是而非的名字,拉巴斯大学一位科学家的名字,谁会在安第斯山脉工作,对呀,所以它没有像一些,你知道的,听起来像南亚人或东亚人的名字,或者欧洲的或者西欧的。
或者盎格鲁撒克逊人产生的,对某人来说听起来似是而非的名字,呃,你知道吗,一所大学将暂停,所以即使是像这样微妙的细节也被捕捉到了,所以我们将讨论这些类型的模型,在后面的课程中,当我们谈论NLP时。
我们会有更多。
所有的权利,简单总结一下递归神经网络的要点,这些是可以处理可变长度输入和输出的神经网络,你可以把它们想象成每一层都有输入和输出的网络,你可以把它们看作是基本上可变深度的网络,或相当。
你可以把它们看作是有时间概念的网络,非常努力地训练rnis,你有消失和爆炸的渐变,但是您可以使用特殊类型的RNN设计,如LSTM和GRU,在一定程度上普遍解决这些问题,虽然。
您仍然需要花大量时间调优超参数,让他们好好训练,在实践中,我们几乎总是在每一步都有输入和输出,这是因为我们通常想要结构化预测,所以如果你想要可变长度的输出,您希望将以前的输出作为输入。
允许网络捕获时间依赖关系,然后可以使用计划采样来处理结果的分布移位,有许多用于各种目的的RNN变体,序列到序列模型,通过方向模型等,你甚至可以清除一个卷积层。
如果你想这样rnare一个非常灵活的基本设计,这是我们要建立的基本基础。
P33:CS 182- Lecture 11- Part 1- Sequence to Sequence - 爱可可-爱生活 - BV1PK4y1U751
欢迎来到今天的第十一讲,我们将讨论如何使用递归神经网络,我们上次学过的,实际上解决了一些有趣的问题,然后呃,今天讲座的结合将是,我们如何训练和利用序列到序列模型。
这是我们当前神经网络模型中非常强大的一类,可以将一个序列转换为另一个序列,比如说,一种语言文本,用另一种语言检测,表示问题的文本,以及表示它的测试文本,答案。
等等,所以上一次,当我们谈到RNNS时,快结束的时候,我们看到了递归神经网络是如何非常灵活的,它们可用于解决各种不同类型的序列处理问题,例如获取一些单个输入并将其转化为序列,例如用于图像字幕。
其中输入是图像,输出是表示文本描述的序列,他们可以把一个序列变成一个输出,比如说,活动识别,在那里你可以拍摄一系列视频帧并产生一个标签,表示视频中描绘的活动,他们可以把序列变成其他序列。
例如在机器翻译中,然后呃,他们可以一步一步地把序列变成其他序列,例如用于帧级视频注释,当然还有,输出序列的RNNS的应用,它们通常还输入完整的序列来处理序列之间的相关性,呃,代币。
正如我们在上一节课结束时看到的,所以在今天的讲座中,我们将主要关注这些很多很多的转导问题,特别是序列到序列模型。
但在我们这样做之前,让我们首先讨论如何建立一个基本的神经语言模型,好的,那么什么是语言模型呢,语言模型是为表示文本的序列分配概率的模型,和,语言模型对于我们将要讨论的许多内容都是一个非常重要的概念。
因为它们不仅可以分配概率,但它们也经常产生,下面是一个例子,从呃,从上次生成短语的神经网络模型,为此的训练数据将是大量自然语言句子的集合,所以这里我只展示了三个,当然啦,在现实中。
真实的语言模型可能会在数百万个这样的模型上训练,他们是如何表现得很好的,这里有几个选择,我们会更深入地讨论,在下一次讲座中,现在有两节课,但一个非常简单的选择是标记每个句子。
这意味着每个单词都变成了一个单独的时间步长,然后以某种方式对这个词进行编码,编码这个词的一个非常简单的方法是所谓的一个热向量,所以一个热向量只是一个长度向量,等于可能的字数,字典里的词数。
向量中的每个元素都为零,与单词索引相对应的元素除外,设置为1,所以这意味着在句子中,我觉得,所以我有五个字,所以会有五个时间步,在这些时间步中的每一个都将由一个非常大的向量表示,可能有数千英尺长。
到处都是零,除了代表单词的单个位置,有更复杂的方法来表示单词,一种更复杂的方法是使用所谓的单词嵌入,它是一个连续的向量,单词的有价值表示,旨在反映它们的语义相似性,这样意思相似的词就会靠得更近。
就它们的欧几里得距离而言,有一些方法可以实际构建这些单词嵌入,我们将讨论,呃,很有可能,下周,但就目前而言,这么说吧,文字是一个热门载体,这意味着我们的自然语言训练数据只是由这些热向量的序列组成。
这是一个非常简单的语言模型视图,我们以后会更多地讨论真正的语言模型,但就目前而言,我只想介绍RNN语言模型的基本思想,因为我们要在此基础上再接再厉,开发序列到序列模型。
我们必须处理好的几个细节,到目前为止我们看到,其实,一种关于句子的RN火车的卡通视图,让这一切真正发挥作用,我们需要一些小细节,我们需要的一个细节是我们需要理解当模型输出一个句子时,例如。
我们如何使用这样的模型来输出一个完整的句子,呃,比如说,如果你给它,我和你想用,我觉得,所以我是,你怎么知道你应该停在,I’我喜欢,也许我不是最后一句话,也许它会说,我觉得,所以我是河马。
那也是一个有效的句子,所以我们要做的是,我们要加一个特殊的令牌,我们将在培训日期中包括培训中的这个令牌,在我们所有句子的末尾,也就是序列令牌的结尾,有时也被称为句末标记,所以这是一个特殊的词。
它将出现在字典的末尾,它并不代表任何实际的单词,它只是代表了模型已经完成的事实,训练数据中的每个序列都将以这个令牌结束,因此,模型将了解到,当它完成一个句子时,它应该在最后一步。
输出这个句子结束或序列结束标记,它会在最后一步这样做,好的,这将帮助我们理解当模型用一个句子完成时,现在,我们面临的另一个问题是,我们是否希望这样的模型生成一个句子,你需要以某种方式把它踢开。
所以第二步,它将使用第一时间步长的输出作为输入,这就是我们在上一节课结束时所学到的,但是我们在第一步用什么,你知道的,我们可以给它一个完全随机的词,这是合理的。
但并不是所有的单词都有同样的可能性开始一个句子,所以我们可以做的一件事实际上是有效的,我们可以简单地计算频率,每个句子从随机的单词样本开始,然后把它作为第一个步骤输入模型,这实际上是一个合理的解决方案。
稍微优雅一点的解决方案,它不需要我们有一个特殊的组件是,就像我们引入句末标记一样,我们可以引入一个句子的开始标记,所以我们可以在第一个时间步长之前添加一个额外的时间步长,其中输入是一个特殊的开始令牌。
然后模型将在训练数据中的哪里进行训练,每个句子都以开始令牌开始,模型会,然后呢,它应该输出一个随机的单词,概率与其实际开始一个句子的概率成正比,所以如果我们想出一个全新的序列,从一个特殊的开始令牌开始。
让模型生成这个,这里有一个小测验,只是为了呃,让你们所有人测试一下你们对发生了什么的理解,现在我们已经了解了这些开始标记和句子结束标记,我们知道如何让RNN生成完全随机的句子。
如果我们想让一个rn完成一个句子呢,如果你想问RNN怎么办,这里有一个以,因此我想,我想让你完成它,我想让你用一句随意但合理的句子来结束它,比如,比如说,我可以说我认为因此我真的很聪明。
或者我可以说我思故我在,或者我可以说我认为,因此,我是一位著名哲学家的名言,对呀,这些都是有效的英语句子,它们可能很好地代表了训练数据中的内容,那么我们能让网络以各种方式完成这些句子吗,总是以…开始。
我觉得,我们该怎么做,作为一个暗示,这样做根本不需要改变培训程序,模型的训练方式与我们在上一节课中讨论的完全相同,所以让一个语言模型来完成一个句子实际上是相当简单的,你还在喂代币,一次一个。
所以你开始喂食,你让它做一个预测,但你没有从预测中取样,相反,你只需要直接输入下一个单词,你的条件是我,然后你让它做一些预测,但你忽略了它,然后你为下一步的时间,如果你不认为。
然后我们会对第三步做出一些预测,然后你实际上从中取样并将其输入到第四步的输入中,等等等等,所以你所要做的,为了让你的一代有一个特定的开始片段,你只要强迫最初的几个输入与那个片段一致,不管网络输出什么。
就是这样,这是让rnn完成一个句子的一个非常简单的方法,因此,如果您从一个开始令牌开始,以一个EOS令牌结束,你可以让它生成完全随机的句子,而不需要任何条件,除了开始,或者你可以让它完成很长的句子。
只要在最后放几个字,作为一个小,呃,在家做的一种思想练习,你甚至可以考虑如何,你可以得到一个神经网络语言模型来填补句子中缺失的单词,所以也许我想要的是我想要的是,我已经开始了,我想空白,我是。
我想填补那个缺失的单词,我能找一个语言模型来做这件事吗,如果是这样答案其实有点微妙,嗯和嗯,实际上在今天的讲座结束时,你应该有足够的信息来猜测答案。
我们可以在课堂上谈论它,但回到主要话题,到目前为止,我们讨论了无条件语言模型,现在我将讨论如何建立条件语言模型,这里是这些条件语言模型,文本是模型的输出,这就是为什么我改用Y来表示它。
你要把这个模型建立在一些输入上,它会告诉它你想生成什么文本,比如说,您可以想象一个用于图像字幕的条件语言模型,在那里嗯,你让模型,比如说一张照片,对呀,所以你展示一张照片。
模型的工作是生成描述图片中内容的文本,所以我们可以做到这一点的方法是,我们可以在条件反射信息中读取某种编码器模型,例如,在小狗的照片中读到,这是一张照片,所以我们会用,例如卷积网络。
但这个卷积网络不会产生标签,它实际上会产生表示R初始状态的向量,所以在我们用一个很大的零向量开始rnn之前,对呀,这是我们上次学过的RNN,现在,我们实际上要设置RNN的初始状态。
是由我们的卷积网络输出的东西,这整件事将首尾相接地训练,所以卷积网络,和RNN一起接受训练,以产生正确的文本,所以这方面的培训程序是,呃,与我们在第十课中看到的rnns非常相似。
现在的主要区别是它本质上是一个修道院,末端有一个RNN订书钉,修道院的工作是输出RNN的初始状态,所以在某种意义上,RNN的这个初始状态,是对图片中正在发生的事情的一种表示。
所以它需要包含RNN生成正确句子所需的所有信息,RN在内部理解什么是有效的句子和无效的句子,但是这个向量需要包含你需要弄清楚的所有信息,这里哪个有效句子合适,如此直观,你可以把这个想成零,作为某种。
你知道矢量表示有一只可爱的小狗,然后RN的工作是将这种想法转化为有效的英语文本,所以再总结一下,因为了解这是如何工作的是非常重要的,这是一个由几个卷积层组成的大神经网络,然后可能是一些完全连接的层。
最后一个完全连接的层进入RNN,你可以想象卷积网络和随后的完全连接层,产生一个零,RNN的初始隐藏状态,所以如果RNN只是一个香草RNN,那么这就是一个向量,如果是LSTM。
那么这基本上是细胞的初始状态和初始h,所以我们把RNN部分称为RNN解码器,因为它的工作是解码E中包含的思想,零到英文文本,我们称卷积部分为CNN,或者一般是神经网络编码器,因为它的工作是将输入。
在这种情况下,并将其编码为零,零是这个向量,初始,呃,rnn,图片中发生了什么,它基本上代表了RNN需要知道的关于输入的一切,为了产生权利,现在只是为了检查你对这里发生的事情的理解,快速突击测验。
我们希望训练数据是什么样子的,所以如果我们想训练这个东西首尾相连为图片生成文本,我们需要我们的训练数据是什么样的,我们的训练数据显然会包含图片,它会有标签,这些标签不再是,呃,你知道的,职类。
它们实际上是文本,所以它只是图片和英语句子的元组,我们如何告诉RNN需要生成什么,呃,这是由进入向量零的东西决定的,所以基本上RNN内部知道英语是如何工作的,但它需要正确的信息包含在零。
为了知道实际制作哪种英语。
现在我们不必以照片为条件,我们实际上可以把我们的语言模型限制在任何东西上,所以我们甚至可以把它放在另一个序列上,所以与其有一张照片和一个修道院,你可以有一个编码器,这是另一个RNN。
假设你想把法语翻译成英语,嗯,你可以有一个用法语文本阅读的RNN,并为另一个生成英文文本的rnn生成初始隐藏状态激活,所以第一个用法语读取的rnn产生一个零,第二个rnn取一个零并生成英文文本。
你可以用这个,例如训练一个把法语翻译成英语的模型,所以现在不是CNN编码器,你有一个RNN编码器,这是一个零的东西,这是一种,有点虚拟,所以从某种意义上说,你可以把这看作是一个大的RNN对吗。
法语句子的最后一步发生了什么,直接到英语句子的第一步,所以其实,你甚至可以这样训练它,你可以拿一个巨大的RNN,他的工作是读一个法语句子,然后读一个英语句子,在英语句子的每一步。
它应该产生那个英语句子的下一个单词,这将是将法语翻译成英语的有效模式,在实践中,更常见的是有两个独立的RNN,意思是说,法语部分和英语部分的重量实际上是不同的,但是法国部分的时间步之间的重量都是一样的。
英语部分不同时间步之间的权重都是一样的,但这两种语言之间是不同的,但你不必这样做,你可以只有一个巨大的RNN,这在技术上是正确的,虽然训练可能会有点难,如果你把这看作是一个巨大的RNN,然后呢。
英语句子的开始标记,实际上也是法语句子的结尾符号,所以本质上看到那个令牌实际上并不重要,它是一个星星和结束,它的工作原理是一样的,启动该令牌,看到那个令牌会告诉他们网络现在,是时候开始用法语停止阅读了。
开始生成英语,现在有一些细节可以得到这个,去做人们有时会做的一个小细节,虽然并不总是实际读取输入序列中的反向右,而不是从句子的开头开始,然后回到开始,你实际上是从句子的末尾开始的,然后往回走。
你不必这样做,但这是一个常见的选择,作为一个小小的思考练习,这对以后很重要,你为什么认为那是,为什么倒着读法语句子会更好,然后产生英语句子,前锋,嗯,原因是,这可能更好,就是,英语句子的开头。
可能更多地与法语句子的开头有关,比法语句子的结尾,所以通过反转输入句子,第一部分排在最后,这使得它最接近输出句子的第一部分,所以本质上依赖关系要短一点,现在你可以争辩说,也许那不好。
因为句子末尾的长度更长,但在实践中,这有时会更好一点,虽然并不总是,这不是唯一的方法,这个长期依赖的概念将在讲座结束时再次提出,当我们谈论注意力的时候。
所以正如我提到的,我们倾向于对输入和输出使用不同的RNN,所以编码器和解码器实际上有不同的重量,编码器基本上为解码器产生初始隐藏状态激活,顺便说一句,当我说一个隐藏的状态,那只是激活的另一个词。
所以通常它们是两个不同重量的独立RN,但他们仍然首尾相接地训练,所以你的训练数据现在将由配对的句子组成,基本上是元组,其中有一个法语句子及其相应的英文翻译,你会用同样的方式训练它。
就像你训练上一节课中的所有RNN一样。
好的,嗯,这里有一个序列到序列模型的更现实的示例,所以这里我做了一些修改,我倒着读输入的句子,我还加了多层,所以这类设计使用LSTM细胞是非常常见的,并将多个LSTM单元格堆叠在一起。
这有时被称为堆叠的RNN或堆叠的LSTM,您将为此使用的层数,您将堆叠的数字通常比您将使用的数字低一点,为了一个很大的信心,所以大陆可能有几十个甚至数百个LCMS层,通常会在两到四个的范围内,也许五个。
嗯,后来,我们将讨论另一种叫做变压器的模型,它往往要深得多,但LSTMS往往是,你知道的,两到四层深,这部分是因为他们使用了十个h h非线性,不太容易踩到,部分原因也是。
LSTM的顺序性大大增加了它的代表性,所以它有深度,两者都是,呃,你知道的,在这里垂直和水平,所以不需要叠太多的层,两到四个往往很好,所以我们有多个RNN层,每个rnn层通常使用一个lstm单元。
或者LSTM的某种变体,像格鲁细胞,它是在成对的序列上首尾相连地训练的,序列可以是不同的长度,输入和输出可以是不同的长度,也可以跨元组,当然它们可以是不同的长度,这种序列到序列的模型非常灵活。
它们可以用来做各种各样不同的事情,不仅仅是给可爱的小狗的照片贴标签,或者翻译关于小狗的句子,它们可以用来,当然啦,把一种语言翻译成另一种语言,它们也可以用来把长句总结成短句,所以说,例如。
输入可以是一个长句,输出可以是一个短句,它们可以用来用答案来回答问题,所以在这种情况下,输入将是问题,输出将是答案的文本,它们甚至可以用于一些异国情调的应用,例如,输入可以是一段代码的文本描述。
输出可以是实现该描述的Python代码,一般来说,任何你可以表述为序列对的东西,让我们说,少于一百,呃,长度标记,你可以建立一个序列来寻找模型,序列到序列模型,尝试这样做。
如果您想阅读更多关于序列到序列模型的信息,我推荐Elias的这篇论文,苏扎里奥,用神经网络进行序列到序列学习,虽然有许多后续扩展到这个基本食谱,以许多不同的方式,所以这是基本的,呃,寻求模式。
然后剩下的讲座。
P34:CS 182- Lecture 11- Part 2- Sequence to Sequence - 爱可可-爱生活 - BV1PK4y1U751
所以有一件事我们还没有详细讨论,但这对各种RNN都很重要,尤其是序列到序列模型和语言模型是如何实际执行解码。
到目前为止,显而易见的,呃,从这些rnis中得到一个句子来做这件事的方法,一步一个脚印,在解码的第一步,这意味着我们实际上必须输出一些东西的第一步,这里我做了正确的事情,我颠倒了输入序列。
您得到一个软最大值分布,这意味着你得到了一些长度向量,等于可能的单词数,你对它应用一个软麦克斯,这就把它变成了概率向量,这是解码句子中第一个单词的概率分布,在这一点上。
显而易见的事情可能是选择最有可能的词,概率最大的一个,然后就像我们讨论过的,在上一节课的最后一次,您在下一个时间步骤中输入一个选定的单词作为输入,所以在下一步,您从上一步获得隐藏状态,你得到一个输入词。
该输入单词是您在前一步中选择的单词,所以现在的条件是,你可以在句子的第二个单词上产生一个新的分布,同样,这个分布的长度等于可能的单词数,但我只在这里展示了两个最有可能的。
你可能会选择最有可能的一个并继续,但请注意,网络在第一步犯了一个小错误,它有几个可能的词,正确的词应该是,但一个人的话有一个,你知道的,类似的概率稍微大一点,你知道法语单词on的意思可能是。
也可能意味着一个,所以这里只显示了一个好的,合理选择,但这个选择最终会扔掉其余的解码,所以它为第二个选择了小狗这个词,一只可爱的小狗有点奇怪,那不是正确的英语语法,所以虽然小狗是GEO的正确翻译,嗯。
一只小狗可爱不是一个正确的英语短语,所以语言模型可能会说,第三个词不太可能是可爱的,因为它不是有效的英语,你可以终止判决,比如如果你说一只小狗,这是一个有效的句子,或者你说一只小狗是。
这也是一个有效的句子,所以也许它会选择,但现在它已经偏离了轨道,就像它一样,你知道它正在生成一些有效的英语句子,一只小狗,你知道的,在草地上跑来跑去,或者类似的东西,那将不是一个有效的判决。
但这不是编码句子的正确翻译,那么这里出了什么问题,发生了什么很好,我们应该做的,在我们看到其余的解码之前,不会承诺选择一个,所以基本上是第一个错误把一切都搞砸了,如果不是第一次选择一个。
所以我们选择了一个,然后我们会看到我们后来得到了一个相当合理的一代,所以如果我们选择了一个,我们在第一次步骤中选择单词的概率会稍微低一点,但在随后的时间步长中,我们实际上会得到更高的概率,所以在第三步。
我们实际上很困惑该怎么办。
我们真的没有很好的选择,而这里会有一个很可能的词,就是一只小狗,有95%的可能性,所以这些词的累积概率实际上会更高,如果我们从一些不太可能的事情开始,所以这是一种直觉,但让我们在数学上更正式一点。
让我们试着从数学上理解,为什么会发生这种事情,为什么我们可以得到更好的解码,如果我们不总是选择最有可能的第一个词,我们要做的是,我们想最大化所有概率的乘积,为了最大化所有概率的乘积。
我们不应该在第一步就贪婪地选择概率最高的,为什么我们要最大化所有概率的乘积,好吧,我们需要首先理解这些概率实际上意味着什么,所以在一个常规的convnet中,我们的输出是标签上的SoftMax分布。
很清楚这意味着什么,它是给定输入图像的标签的概率,但是RNN每一步的单词分布意味着什么,就像在修道院里一样,输出分布,输出的概率取决于输入中的所有内容,用同样的方式,安RNN。
在时间上的单词分布步骤一表示在时间上的分布步骤一,以已经输入神经网络的一切为条件的词,基本上以它之前的一切为条件,一般来说,Y T的概率,时间步T处输出的概率取决于整个输入序列,所以x 1到t。
它取决于我们为输出序列生成的所有前面的单词,也就是y零到t减1,例如,可爱这个词是在第二步产生的,它取决于x 1,x2,x 3以及y 0和y 1,所以这意味着在第二步。
RNN解码器实际上产生了一个概率分布,给定x 1到3,逗号y零到一,我知道我有点草率,因为我是零索引y和一个索引x,这只是为了让开始令牌更清楚一点,因为开始标记是零字。
如果你想知道为什么上面写着y i逗号t,那只是为了说明这一点,指数据集中的第i个序列,所以你可以忽略Y,如果这很麻烦的话,好的,从概率的角度来看,这就是每一个时间步长的概率。
现在我们实际上想从解码器中得到什么,我们想要的是我们想要最有可能的输出序列,我们想要最有可能的y零到t,更具体地说,Y 1到T,因为零号令牌永远不会生成,所以P的Y一个通过,我要用t y,只是为了说明。
我指的是输出的长度,不是输入,所以y的p,1到t给定x,1到t,这才是我们真正想要的,这就是我们想要最大化的,根据概率链式法则,我们知道y的p到t,从x到t的y是由所有这些条件的乘积给出的。
如果是y的p,1到1,2给定x,1到3,等于py1给定x1到3次,y 2的p给y 1,逗号x一到三,所以这就是为什么如果我们想得到完整序列的概率,你只需将单个单词的条件概率相乘,因为当时这个词。
步骤t是把所有的单词调理成步骤t减去一,所以所以,这正是我们想要的,以便应用概率链式法则,并得到整个序列的概率,这意味着当我们解码时,我们的目标是产生一系列单词,使它们的概率乘积最大化。
这意味着我们可能会在早期选择一个词,概率略低,为了以后得到一个词,这个词的概率要高得多,所以贪婪地选择最有可能的词并不总是最佳的,在每一步,你可能想选一个可能性稍微小一点的词。
这样你以后就会看到一个更有可能的词。
那么有多少可能的解码,嗯,假设我们每一步只有四个代币,一个字一个字,两个字,三和刑期结束,所以这是一种虚构的语言,只有三个有效的词,原则上,我们可以在第一步选择这四个令牌中的任何一个。
第二步的这四个令牌中的任何一个,第三步的这四个令牌中的任何一个,等等等等,所以我们可以产生的可能序列的数量是非常大的,事实上,它在序列的长度上是指数级的,所以总的来说,如果你有可能的话。
长度为t的可能序列的次方为m,那现在很大了,当然啦,这些序列中的大多数都会有非常,极低概率,大部分都是无意义的序列,但原则上,他们中的任何一个都可能是最佳的,从根本上解码是一个树搜索问题。
这是一个树搜索问题,则为其对数概率的负值,为什么它是对数概率的负数,因为在树搜索中,你边走边汇总成本,所以说,如果你想把乘法变成求和,取对数,但不用太担心,此树搜索期间的后继项数是可能的令牌数。
词典中可能的单词数,所以搜索路径的数量随着你的去呈指数级增加,所以树以M的分枝因子生长,其中m是可能的单词数,直到t的深度,但这只是一个搜索问题,所以我们知道你知道这是指数级的糟糕,但原则上。
如果天真地处理,所有的搜索问题都是指数级的糟糕,幸运的是,有很多很好的方法来解决搜索问题,我们可以使用任何树搜索算法来解决这个问题,但在这种情况下,精确搜索是非常昂贵的,因为这个问题没有一个很好的结构。
这使得广度优先搜索和深度优先搜索非常有效,幸运的是,这个问题的结构使得一些简单的近似搜索方法非常有效,所以当我们解码时,我们实际上会使用,不是精确的搜索算法,比如深度优先搜索或广度优先搜索。
但我们实际上要用一种近似的方法,不能保证产生最佳序列的方法,但在实践中,当用于这种解码任务时,往往会产生相当好的序列。
所以基本的直觉是,而在第一步选择授予的最高概率可能不是最优的,选择一个概率很低的词不太可能导致好的结果,这在搜索中并不总是正确的,所以在一些搜索问题中,你可能不知道你是否走在正确的道路上。
直到你到达你的树叶,但是在这个搜索问题中,你每一步都有这些概率,它们确实提供了很好的指导,所以概率最高的词不能保证在最佳路径上,你知道吗,概率最高的单词之和,就像三四个概率最高的词。
他们中的一个可能走在正确的道路上,不能保证,但情况往往如此,所以这并不是普遍正确的,对于这类序列解码问题,这通常是正确的,如此等价,我们不能贪心,但我们可以有点贪婪,所以总的来说不是真的,这是猜测。
基于我们对序列解码的了解,并不是每个搜索问题都是这样,所以我们将要使用的算法背后的直觉,这被称为波束搜索,它不是贪婪地解码最好的词,每一步我们都会存储到目前为止最好的k个序列,然后更新每一个。
所以在每一步中,我们实际上找不到最好的词,但最好的K个词,将k设置为1的特殊情况只是贪婪的解码,因为你总是用最有可能的词,在实践中经常用于实际的序列到序列模型,你会使用k的值,大约5到10。
这里有一个光束搜索的例子,我要走过,然后我会描述实际的算法,所以记住我们的目标是最大化序列的概率,我们通过t产生y的p,y给定x,1至T,我们看到的因式分解,作为每一步单个软极大概率的乘积。
因为要处理大量的产品,很多概率是有点烦人的,因为它们会下溢,我们更喜欢用对数空间和对数空间来表示它们,求和变成乘积变成求和,如此等价,最大化序列的概率,我们可以最大化序列的对数概率。
这只是所有时间步长的总和,你知道吗,y的对数p,一个给定的x,对2的log p,一个逗号x以此类推,等等,这里有一个光束搜索的例子,我将带你浏览,这是从斯坦福大学的克里斯托弗·曼宁的一次演讲中借用的。
所以法语里有个句子,我们要翻译成英语,它被故意选择为一个有点不平凡的翻译,所以法语的句子是教的,当他打圆周率时,翻译成英语,这里有点奇怪,因为没有一个英语单词和Antart完全等同。
它大致的意思是用圆周率或坑打,所以说,事实上,没有一个确切的逐字翻译使这种困难,你实际上可以用不同顺序的单词生成一个英语句子,而且用词略有不同,我会带你看一个k等于2的光束搜索的例子。
这意味着我们追踪两个最有可能的假设的每一步,所以我们从一个开始令牌开始,然后呃,我们产生SoftMax分布,基本上运行我们的RNN向前一步,在第一个单词上生成软最大值分布,我们将追踪两个最有可能的假设。
所以在第一步,我们知道两个最有可能的假设必须从,最有可能的两个词,在这种情况下,最有可能的两个词是他,我看起来很通情达理,那么我们要做的就是,我们实际上会把RNN向前推进,条件是他这个词。
然后我们将分别向前推进RNN,对i字的条件,所以我们在一开始就有一些隐藏的激活,我们要复印两份,为了一份副本,我们将向前一步,对于另一份,我们将向前一步,我和这两个前进的步骤。
我们将在第二个单词上有两个不同的SoftMax发行版,现在,我们知道我们不可能有两个最好的假设之一,及时利用第三个最好的词,第二步向右,因为不管你是对他还是对我,你只会使用其中每一个的前两个词。
所以我们不关心他的第三个最好的词条件,也不是I上第三个最好的词条件,所以我们会为他产生软最大输出,和I的SoftMax输出,他和我的对数概率显示在这里,虽然还有很多其他带有较低日志提示符的单词。
然后在第二步,前两个将是最少的,然后我们要计算的是前两个单词,当我们和他一起走的时候,第一个单词和第二个单词的对数概率之和是多少,所以他的对数概率是负的,零点七,然后我们要把它。
我们要加上给定开始的命中概率的对数,他,然后也许我们会给我们负面的,一点七,这些数字都是负数的原因,是因为它们是数字的对数,少于一个对数的概率总是负的,好的,所以我们有一些分数。
所以他的打击率是负1分7,他的打击率是负2。9分。我的得分为负1。6分,我得到了负一点八的分数,现在我们还有第三个最有可能的词,比如他通过什么的,但那三分之一。
最可能的词不可能参与两个最有可能的假设之一,所以我们不在乎,好的,现在我们来看看这些分数,我们要选出两个最好的,所以最好的两个是,我是,他打了,这些是我们将继续进一步扩展的,什么进一步扩展。
mean进一步展开意味着您使用实际产生hit这个词的rnn隐藏状态,例如,你在那个状态下再向前一步,命中作为下一个输入,好的,所以你终止了链得到了,因为他们不在前两名,你把另外两个展开,所以每次我说。
扩展它的意思是无论产生这个词的隐藏状态是什么,你把那个词,将其作为下一个输入馈送,馈送该隐藏状态,然后在下面的单词上生成一个softmax,你再一次对它们进行排序,你把两个最有可能的作为一个,呃,前缀。
再一次计算到目前为止的总分,意思是现在的对数概率之和,这三个字,他撞到了一个,他打了我,我被击中了,我被击中了,等等,再对它们进行排序,取两个最有可能的,现在这里发生了一些不同的事情。
一根树枝被完全修剪了,所以他打了一个,他打我的可能性都比我被打的可能性大我被打了,这没关系,好吧呃,那只是意味着我们要做完全一样的事情,我们将在一个,而我,我们要复印两份,我们会让他们每个人都向前走。
但条件是对这个词的不同选择,其中一个条件是他打了一个,另一个条件是他打了我,另一个条件是他又打了我一次,我们将为每一个人获得不同的奖励分配,我们会给他们都打分,选择两个最有可能的,然后继续。
这就是波束搜索工作的例子。
在每一步T中,对此的总结如下,对于我们追踪的每一个假设,所以我要把这些假设编入索引,用i so y 1到t减去1,从y到t减去1,二等分到一到一减去一,对于这些有k个假设中的每一个,我们要找到顶部。
K个时间代币,步T,基本上前K个完成,这很容易,因为我们直接从对数概率中得到这个,所以现在我们基本上有了k的平方可能的长度序列,Don’不对,因为我们有k个初始序列。
每一个都可以用k种可能的方式之一完成,所以有k平方的可能组合,它们中的每一个都有不同的总对数概率,所以我们将计算它们的总对数概率,然后我们将保持其中的前K,然后你把剩下的前k个假设推进两步t加一。
这就是光束搜索背后的基本思想,这是我们通常用来从RNN解码的。
我们需要一些细节才能把它变成一个完整的算法,一个细节是我们什么时候停止解码,或者当我们击中序列结束的标记之一时会发生什么,所以说,这么说吧,得分最高的假设之一以s的e结尾,我在这里用了一个不同的词。
并建立了一个s的e,你所做的,那么是你保存这个序列,你只是喜欢把它和它的分数一起储存,但你不能再扩张了,因为没有什么可以扩展的了,然后你继续扩展剩余的k个最佳假设,所以如果我们要,呃,画出这棵树。
圆周率扔得更远,也许在最后你,您将获得一个可能解码的E令牌,所以解码他用皮涅亚EOS打了我,这是一个完整的序列,所以在这一点上,序列将被保存,但它不会被选为前K之一,不管它的分数,因为它已经完成了。
或者你可以把它保存下来,在剩下的序列中,所以也许他用圆周率打我的序列概率非常低,所以那个可能会被拒绝,然后你就会得分,你会储存,还是你,你就会,你会作为你的顶级K之一,他用美味的馅饼打我。
他用美味的馅饼打我,对呀,然后你会继续进一步扩展这些,你会一直持续到某个截止长度t,意思是,直到序列太长,或者直到您有一些预定义的完成序列。
你可以选择你想要的,或者你可以拿任何一个,或者这样做是一个合理的启发式,嗯。
我们在最后选择哪个序列,假设我们已经运行了这个,我们有,你知道的,假设我们想要n等于四个完整的序列,我们得到了四个完整的序列,所以我们决定了这四个中我们到底要返回哪一个。
所以在最后,我们将查看所有保存的序列,因为所有这些都是击中EOS令牌的,也许我们有这些,我们有像,他用圆周率打我,总对数概率为负4。5,他抛出了一个圆周率,总对数概率为负3。2,我被他扔的圆周率击中。
它的总对数概率为负7。2,所以我们有这三个保存的序列,显而易见的是,我们可以做的是,我们可能会选择对数概率最高的一个,对呀,就是这个等一下,这其实不是一个很好的翻译,所以要记住。
这些分数中的每一个都是每一步的对数概率的总和,但是每个句子的步数都不一样,所有的数字都是负数,因为对数概率总是负的,因为概率小于1,小于1的数的对数是负数,所以刑期越长,我们加的负数越多。
这意味着一般来说,较长的句子往往具有较低的对数概率,所以序列越长,它的总分就越低,因为有更多的负数加在一起,那其实很烦人,因为这意味着简短但糟糕的翻译可能有更高的日志概率,比现在非常好的更长的翻译。
当然啦,这并不总是意味着较长的翻译总是好的,就像我被圆周率击中一样,有点合理,但这不如他用馅饼打我好,所以我们可以用一个非常简单的修复,有点启发式的,就是把分数定义为总对数概率除以步数。
所以基本上句子中标记的平均对数概率,这实际上倾向于做基本上正确的事情,所以如果你把这些分数除以相应序列的长度,你实际上会得到非常合理的解码。
所以完整的波束搜索程序的总结,那么在您跟踪的每个假设的每一个时间步长都是这样的,查找下一步的前k个令牌,t,这些k的平方总长度,通过附加你的每个假设形成D序列,每个可能的下一个令牌的总对数概率。
保存在EOS中结束的任何序列和其余序列中的任何序列,保持顶部K,然后在时间t加1时推进每个假设,如果t小于所需的最大长度,如果您保存了n个以上的序列,或者t等于h,意思是你不能再前进了。
然后返回得分最高的状态序列,其中分数由幻灯片顶部的方程决定,所有步骤的对数概率之和,除以该序列中的总步数,这就是光束搜索,这实际上会很好地解码最有可能的句子,大多数时候,事实上,通常非常小的光束宽度。
很小的k值实际上可以很好地工作,所以五到十岁是很典型的。
P35:CS 182- Lecture 11- Part 3- Sequence to Sequence - 爱可可-爱生活 - BV1PK4y1U751
今天这堂课我要讨论的最后一个话题,将作为下节课的一个过渡,所以呃,下一节课,我们将更多地讨论注意力,但我只想介绍寻求模型的注意力概念。
所以序列到序列模型有一个问题,这限制了您可以处理的序列的最大长度,这就是我们可以称之为瓶颈问题,基本上所有关于源序列的信息都必须包含在激活中,在解码开始的时候,解码器对源序列一无所知。
除了编码器放入第一个隐藏状态的内容,解码器什么都不知道,当输入序列很长时,这可能是一个大问题,所以这形成了一种瓶颈,基本上编码器需要真的,非常小心地把正确的信息,进入解码器的第一个隐藏状态。
所以解码器会解码正确的东西,所以也许我们可以放松一点,如果我们以某种方式允许解码器窥视输入序列,在解码的时候再多一点,也许这样会更好,如果本质上编码器,只要把正在发生的事情的一般摘要放入隐藏状态。
和解码器,但仍然引用输入序列来拔出单个疣,显然,当您的输入长度为3时,这并不重要,但是想象一下你的输入是,呃,你知道的,整个段落的权利,也许这一段包含了某一特定年份发生的历史事件的一些事实。
编码器对段落的一般要旨进行编码,关于它的结构,但它不想存储特定的年份,当那件事发生时,所以当解码器到达那个点,它可以引用回输入序列,然后取出令牌,所以也许当我们解码的时候,我们想以某种方式有一个小捷径。
说好,当你谈到句子的主题时,如果你忘了主题是什么,你可以回头看编码句子中的主题,然后把它拉回来,把它拉到适当的时间步长,并将其包含在您的输入中,我们怎么能做到这一点,如果我们能做到这一点。
我们将大大降低瓶颈的重要性,对编码器来说就不那么重要了,处理很长的序列会容易得多,在那里很难做到这一点。
我们怎么能做到这一点,我们如何在解码时偷看输入,所以这里是基本的想法,我要概述一下这个想法,会显得有点武断,但随着我越来越多地描述它,希望,就会明白为什么它是这样设计的,在编码时。
我们将有编码器的每一步,rnn生成一小段信息,描述当时步骤中存在的内容,那条信息对我们来说没有语义上的意义,就像一个小矢量激活,孤立地并不意味着什么,但以后会很有用的,所以我们称之为钥匙,直觉上。
它表示在此步骤中存在什么类型的信息,但我们不会手动指定密钥,它实际上是作为学习过程的一部分来学习的,所以从输入隐藏状态到滑雪的映射是某种函数,一些学过的函数,就像在实践中的线性层,通常只是一个线性层。
只要一个基本上的线性变换就足够了,然后在我们解码的每一步,我们要输出一个小向量,与我们调用查询的长度相同,因此查询向量直观地表示我们想要的信息类型,在这个时候一步,然后我们将查询向量与每个键进行比较。
找到最相似的一个,这将告诉我们输入的哪个时间步骤是最相关的,对于解码过程中的这个时间步骤,然后我们会把这些信息发送到解码器,所以这里可能第二个时间步进键与查询最相似,所以我们就选那个。
我们将把它相应的隐藏状态发送到解码器,所以一些粗鲁的直觉,因为这可能会做的是关键可能会编码一些概念,我想知道句子的主语是什么,或者对不起,密钥可能会编码,像这个词是句子的主语,然后查询可能会编码。
我想要句子的主语,然后其他部分可能会说我想要句子的宾语,或者我想要一个动词,或者我想要一个形容词,对呀,或者它会编码,我想要on这个词后面的词,对那里发生了什么的一些概念,在句子和查询中编码您想要的位。
然后找到与查询最相似的键,并采取相应的时间步长,获取它的隐藏状态并将其输入解码器,所以这是对什么的高级直觉,我们将要做的,我还没有从数学上把它做得很精确,那是以后的事,但这是高层的想法,现在关键的是。
我们不必手动指定这些东西,整个网络仍然会首尾相接地训练,键和查询的实际内容将由神经网络确定,就像修道院里的过滤器,它们有某种直观的含义,但它们不是手工指定的,他们是作为这里培训过程的一部分学习的。
我也是,关键查询将作为培训过程的一部分学习,所以在现实中,键和查询的含义是学习的,我们没有选定的手册,这种直觉,我只是在这里给它,只是为了帮助你理解我们为什么要这么做。
好的,所以这就是现在的关键,让我们来谈谈这在实践中是如何工作的,我要用字母h,表示编码器的隐藏状态,这就是RNN激活,我以前用字母A来指代他们,我现在要用h,因为我要用a做别的事,注意这个词以一个。
所以这将被称为,RNN的状态现在被称为H,我会用不同的字母,s表示解码器的状态,只是为了不让我们混淆,编码器状态从解码器状态,它们都是隐藏状态,他们都是RNN激活,但我要用h作为编码器,解码器的S。
只是为了让我们更容易把它们分开,对于钥匙,我将用字母K,每一步都有一个单独的键,键是HT的某个功能键K,所以它在每一个时间步长都是相同的函数,它只是我们应用于RNN隐藏状态的一些函数。
所以您在步骤T中进行RNN编码器激活,并应用函数k,可能是,比如说,只是一个线性层,然后是一个非线性,一次又一次,在实践中经常,函数k只是一个线性变换,所以就像W乘以HT,但如果你愿意。
它也可以是非线性的,查询,同样地,我将用字母q来表示它,我将用下标l代替t,所以我将用t来索引编码器中的时间步长,和L在解码器中索引时间步长,所以Q l,比如说,应用于解码器状态的函数。
在那个时候的步骤,这是一种分数,表示一个键与,KT和QL之间的点积将给出一个查询,所以我要用e下标t,逗号l,表示时间步t键之间的点积,和时间步骤l中的查询,直觉上,我们要拉出时间步T的隐藏状态。
其中e t逗号l最大,意味着点积是最大的,所以我们可以称之为编码器步骤T的注意力得分,进入解码器步骤L,所以我的每一个解码器步骤,当然啦,不同的故意得分,因为它有不同的查询,直觉上,我们要做的是。
我们想在时间步骤l将HT发送到解码器,其中e t逗号l最大化,所以我们要求arg max相对于t{\displaystyle t}的最大值,逗号l,我们将在步骤l的时间将相应的ht发送到解码器。
现在这里的问题是arg max不是一个可微操作,所以如果我们真的用Arc Max,我们就不能训练这个东西,所以我们要用的是软麦克斯,因为软最大值是可微的,所以我们要创建一个向量。
我们称之为alpha l,这将通过对E T应用软最大值来获得,t的所有值的逗号l,所以这意味着alpha t逗号l是e t的指数,逗号l,除以T的指数的所有其他T的和,E T素逗号L,所以E越大。
这个软最大值变得越接近硬最大值,所以这是一种软化的最大值近似值,然后如果我们想发送大致对应于最大,E T逗号l,那么我们要送的,我们把这称为一个引起注意的问题,我们要把αT的和,逗号l乘以h t。
所以直觉上这些阿尔法,呃,所有时间的步数都会很小,除了E T逗号最大的那个,所以HT的加权和将由HT主导,对应于e t逗号l相对于t的arg最大值,所以这将创建一个向量a,这只是不同HTS的线性组合。
可能最接近与最大et come l的时间步长相对应的ht,然后我们会采取铝,我们会把它交给解码器使用,帮助它解码正确的单词,所以这个加权和用alpha加权近似于弧度最大值的h t,关于t的e t逗号l。
幻灯片上有一堆数学,这是相当简单的数学,但直觉是我们正试图拔出编码器,当时的RNN州,步骤t对应于键和查询之间最大的点积,我们引起这种关注的原因是,因为网络正试图关注最相关的部分,好的,现在。
发送是什么意思,向解码器发送一个L是什么意思,嗯,它实际上可能意味着许多不同的事情,解码器可以以不同的方式使用这些,所以使用它的一种方法是把它交给实际产生输出的函数。
所以在我们的RNN通过使用SL来产生输出y帽子之前,所以y hat l是sl的函数,现在我可以是sl和a的函数,如果你想知道在第二步要生产什么作品,您使用第二步时的解码器状态,也就是S 2。
和您使用的编码器状态对应的最高注意力,理想情况下是H2,但软版本是,你可以利用这种关注的另一种方式,你可以把它交给下一个RNN层,如果您使用多层或堆叠RNN,所以你可以在第一层有张力。
然后把它作为第二层的附加输入,你可以使用它的另一种方式是你可以把它交给下一个解码器步骤,所以在这里你要抬头看台阶的注意力,和你的手进入下一步,所以在下一个解码器步骤,记住在一个普通的RNN中。
我们将rnn的隐藏状态为a-l-1,我们将添加输入单元格,现在我们可以添加输入和注意力向量,所以本质上,在这种情况下,注意向量a l作为附加输入,所以你给它一个新词,你给它关注。
前一个r和激活将它们组合在一起获得下一个激活,所以这也是一个非常合理的方法,所以这些都是合理的选择。
所以让我们来看看注意力在一个具体的例子中是如何工作的,所以我们有之前关于小狗的简短句子,编码器的每一个时间步长都会产生一个密钥,我们将从解码器的第一步开始,它生成一个查询,所以我们接受这个查询。
并将其与每个键相乘,这样就为每个输入的时间步长产生一个数字,我们称这些为E,所以E,E二,E三,然后我们通过一个软最大值,所以这就确保了它们都是正的,和为一,这就产生了阿尔法一号,阿尔法2和阿尔法3。
也许第三个步骤是最大的,然后我们取这些alpha,取所有输入的隐藏状态,哈一,氢二和氢三,我们构造一个H的加权组合,所以这给了我们一个长度等于h的向量,然后我们以某种方式使用这个向量来改进解码器。
我们可以使用它的方法之一是,我们可以将其包含在生成y hat的函数中,我们可以使用它的另一种方式是,我们可以把它交给下一个解码器的时候,步骤,然后当我们进入时间第二步时,我们再次生成一个查询。
我们再次用每个键计算该查询的点积,我们再次通过一个软最大值,然后我们再次构造这个加权组合,然后我们以某种方式使用它来产生输出,或者我们把它交给解码器的下一个时间步骤,第三步同样的事情。
这基本上就是注意力的工作原理,现在让我们在编码过程中更精确地用方程来写出来,我们必须建造这些KT,每个kt是解码器上ht的某个函数k,我们生成一个查询QL,它是应用于SL的函数Q。
我们构建我们的注意力得分,E T逗号l,通过取kt和每t取一个带有ql的库存产品,你把它通过一个软最大值来得到alpha t逗号l,然后你把注意力向量A构造为隐藏状态的加权组合。
每个时间步长的ht由相应的alpha加权,然后你可以用各种方式来使用它,您可以将其连接到隐藏状态,给解码器的下一个时间步骤,你可以用它来读数,所以你有一些函数,根据st和。
或者您可以将其连接为下一个RNN层的输入,如果使用堆叠的RNN,像这样寻求有三层堆叠的例子,所以这些都是合理的选择。
现在这个注意食谱有许多变体,一些值得了解的特殊情况,一个非常简单的选择是使用k,uh和q作为恒等函数,所以在这种情况下,kt就是h,t,ql就是s,l,所以在这种情况下,当你解码你的注意力。
分数只是输入隐藏状态和,和解码器隐藏状态,所以直觉上,这就像是在说,找到最接近这个的时间步长,解码输入中的时间步长,其他一切都以同样的方式工作,那是一个相当合理的选择,很容易实现,但它的表现力可能有限。
因为那样你就不能把一些东西放进你隐藏的状态,不必参与关注,另一个非常简单的选择,这是一个非常常见的选择是使用线性乘法注意,其中kt和ql只是隐状态的线性函数,这其实很合理。
因为记住RNN隐态是通过应用非线性函数形成的,所以说,对RNN来说,塞满一些信息并不太难,进入它的隐藏状态,可以直接用作键或查询,所以这并没有真正削弱我们的代表能力,因为RNN已经是非线性的。
所以对RNN来说,很容易让它隐藏状态的一部分,对应于键或查询,然后你可以把这个权重矩阵看作是选择那些条目,这是一个非常方便的实现,因为当你计算你的注意力得分时,您必须使用QL实现KT数据。
用ql表示的kt数据就是kt转置乘以ql,如果我们在方程中替换对应于ht的kt和ql,转置w k转置乘以w q乘以sl,这意味着你可以组合矩阵w,k和w q变成一个矩阵w e,它是由W K给出的。
转置w q,所以实际上不是分开学习w k和w q,你可以只学习一个矩阵,这可能会更容易实现,更有效,然后其余的工作方式完全相同,你通过取Softmax来计算alpha。
并通过取H的加权组合来计算注意向量,最后一个,呃,我要描述的变体,实际上比最初的要复杂一点,这和我的基本注意力是一样的,呃解释到目前为止,所以它有一些关键函数和一些查询函数,只有一个区别,也就是说。
在最后,当你实际构造你的注意力向量时,你不构造HTS的加权组合,但相反,你构造了一个加权组合,HT被一些学习的函数转换,这里的v和v代表值,所以这有一种吸引人的解释。
因为现在您在编码过程中的注意力产生了键值对,所以H的K是关键,HT的V是值,然后当你解码的时候,你在k和q之间找到最大乘积的时间步长,然后取它的值,这可以增加一点灵活性。
好的,所以注意的总结,每一个编码器步骤T产生一个键kt,每个解码器步骤l产生一个查询ql,解码器被发送,与产品的最大值相对应的编码器激活HT,kt和ql,但实际上取最大值是不可微的。
所以你实际上得到了一个以alpha t加权的加权组合,它是用软最大值得到的,为什么注意力很好,注意力其实很强大,因为现在所有解码器步骤最终都连接到所有编码器步骤,所以RN本身它的连接。
在每对时间步长之间,该连接的长度为O的n,这意味着梯度需要平均传播,你知道平均n步,但与注意力的联系总是一体的,总是有一个步骤连接到每一个编码器步骤,所以连接从O到O,这意味着渐变的路径非常短。
这意味着渐变会表现得更好,你会有更容易的训练,对吧,渐变表现得更好,因为你有一个传播长度的O或者用另一种方式,繁殖在一起的雅各比的数量,沿着注意路线是一个,它仍然沿着RNN路线,但你有另一条路。
那条路会训练得很好,这对于非常长的序列变得非常重要,将梯度推过RNN主干,一路,在输入句子的开头和输出句子的结尾之间,会变得令人望而却步,基本上即使有LSTM细胞这样的东西。
消失梯度问题可能无法完全避免,但只要注意,它们不需要完全避免,因为注意力有一个联系,所以这是一个非常强大的概念,在下一节课中,我们将在这个概念的基础上做更多的阐述。
当我们谈论如何开发只使用注意力的模型时,所以在实践中,虽然,即使您只是想对序列模型进行排序。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)