我们来看一下损失函数,损失函数对模型的训练直观重要,所以我们在机器学习的系列视频中,分别在先进回归和逻辑回归中,就给大家详细的介绍了损失函数, 但是呢,可能有些同学跳过了机器学习,直接从深度学习起手,所以说呢,再给大家介绍一下。首先看一下损失函数到底在干什么? 如果说模型训练之后呢,我们需要用一个数字告诉模型你这次训练错的有多离谱,并且呢,你怎么改就能错的更少一点。那么这个数字其实就是由损失函数来给算出来的,它在整个模型的训练过程中,实际是有三个角色, 第一个就是度量误差,他要告诉模型你这次训练之后呢,你预测的结果和数据的标签,也就是真实指之间差距是有多大的。我们对损失函数进行求导,这个算出来的就是梯度,这也是反向传播的起点。 最后呢,它还是一个任务目标设定的作用。如果说我告诉模型我要做分类,模型是听不懂的,但如果说我转成我要最小化交叉商,这个就行了,我这个损失呢,是把人类的意图翻译给优化器,也就是梯度下降的唯一的通道了,这样梯度下降就知道该怎么办了, 我们就来看看这个过程是怎么做的。我们先来看一下回归任务的损失函数,普遍都用 mse m i c, 就是 军方误差啊,他的计算公式大概是这样子的,其实就军方差呢,代表了三个运算,第一个呢,我要算一下误差,就是让预测值减去标签的真实值,再对这个误差求平方,最后呢给他加和,之后呢再求平均,所以说呢,就叫军 军方差,每一步都是一个运算,倒过来看了,很多人会在里面是二分之一,就多乘了一个二分之一, 其实这个只是为了算导数更方便,并不影响优化结果。都行,那为什么我们是平方呢?首先说是为了消除正负号,如果有的,这是比如说这条红线是我们预测的一个限性的模型嘛,而这个点是真实的值。可能每一个预测呢,都具真实值,是有一点差距的,有的大,有的小, 如果你不求平方的话,大的加小的,可能会互相正负抵消,好像它没有错误一样,但实际上它是有的大,有的小。 很多同学可能问了,那你用绝对值不也行吗?接下来就是,为什么不用绝对值啊?用平方呢,他可以放大误差,比如说啊,我们肯定是希望误差是零,但有的时候我误差算出来是三, 我一平均就是九,他其实这个值是变大了,但如果有的时候我算出来误差是零点四,其实差距已经很小了,那么我一求平方呢,就是零,零点一六,他会让他更小一点,这样呢,我们就会让模型对于大的错误更加敏感,就是抓大放小可以让他。 当然呢,求了平方之后还带来一个好处啊,它的导数呢,特别的简单,是二乘以,就是预测值减真实值。所以一看到这个大家就明白,为什么很多人上来给它乘个二分之一了,就直接就是残差了。 这样呢,它是一个过圆点的直线,你离着越远呢,其实越大吗?越大越接近圆点就越小,这样就能自适应的补偿了。但如果用 m a、 e 的 话,它其实永远是不变的,你没法算导数了。 好,当然 mse 呢,其实它是隐藏着一个假设的,它就认为我们的数据呢,实际上是符合高斯分布,也就是正态分布的。 这种时候呢,大部分呢,还是就离着零很近的,离着零越远的呢,越少见,在这种情况下呢, mse 就 等价于最大自然估计了。所以 mse 真正擅长的是误差是对称的,有的预测的大,有的预测的小, 同时呢,集中在零附近,越接近零的时候就越多,而且呢,没有一些很偏离很远的任务,这种时候呢,实际上用 mse 是 特别合适的, 但是呢,很多时候呢,有一些离群点,它实际上就是它错的呢,特别的离谱,这种时候呢,我们一平方之后,它就会更严重了。所以说呢,很多时候,如果离离群点特别多的时候,用 mse 就 不太合适了,我们就可以用绝对值,就是 mae 了。 再一个呢,假设目标呢,是连续可比的,就是叉二呢,比叉一严重四倍,在军方,差价,对于房价、温度这些是成立的,但是呢, 如果你是连续的值,其实这就是回归任务的意思。但如果你是预测的是一些分类,比如说把猫预测成狗了, 把狗呢,预测成飞机了,这种呢,其实对于分类来来看呢,这些你要么就是对,要么就是错,它不存在什么放倍数的问题,它这种时候呢,所以 mse 呢,它对于分类任务确实是不太适合的。其实分类任务它还有更大的问题啊,梯度会消失,导致它用不了。 我们来看一下啊,就是它 mse 这么好用,我们在二分类的时候,都用 c 来输出一个概率,来看看它是正类还是负类。 如果说呢,我们 sigma 的 大概就是这么写,算,呃,损失函数呢?就这样,如果我们反向传播来算一下, l 对 z 的 l 对 于 z 对 于 z 就是 l 对 于 y 乘上 y 就是 y 对 z 的 导数,它大概的写出来是这样子的。当然呢, sigma 的 函数,它的导数就是这样, y 乘以一减 y 就 行了。 比如说我们今天得到的是一,要么是一,要么就是零啊,它分类正确的值呢,应该是一,但是我们把它给预测成零了, 这时候我们一算啊,它的导数应该是多少呢?它的导数应该特别大才对呢,让我们赶紧修复参数嘛,但其实你把零的时候带进去呢,会发现整个的导数呢,算出来是零了。其实也就是说 sigma 的 在零端引被压平了,你就没法更新了,因为你的导数为零。 我们在反向传播的时候是讲过的,每次呢都是学习率乘导数嘛,对于参数进行调整,那导数都为零了,它就不动了。比如说我预测的赢是最离谱的错误了,应该是一,我预测成零了,结果呢,反而训练不动了。所以说呢,用 mse 呢,是做不了分类任务的。那分类任务的损失函数应该长什么样呢? 其实到分类的时候,我们应该目标变成什么了?就模型给真实类别打的概率 p 有 多高? 比如说呢,我预测的应该是一个小狗,它的这张图片,你应该认为它是狗的概率是一,这种时候是最好的。 如果你预测它是狗的概率为零,那就是最差的。如果预测它是零点五,那就跟瞎猜是一样的,所以我们肯定是希望它预测的那个 p 越高越好。所以说呢,我们输入的是概率,这种时候就不再是一个数值了,是一个零到一之间的概率嘛。模型对真实类别进行打分,而不是差几个类号这种东西。 所以说呢,我们希望他单调递减一 p, 也就是说 p 的 越大,损失就越小,对不对啊?当 p 为一的时候,损失就为零了吗?他就预测的就完全是对的了,但错的越 越多呢,就是惩罚就应该越严重。如果他的预测为零,对于正类就是预测 p 应该是一,预测为零的时候,损失就应该无穷大。给了模型一个强烈的纠错的信号,不能跟错完全错和错一点的惩罚是一样的,这不行, 多样本可加,因为我们知道,对于那个 n 个独立的样本,总的损失呢,最好是一个加和。如果是你是连续的相乘的话,大家知道,因为它是处于在零到一之间的, 你即使是零点九,乘上四次就变成了零点六了,如果再乘上十次,它就变成着,乘着就变成零了,这种时候又求不了导数了。 所以说呢,最好是符合这四个特点的,我们符合这四个特点的一般有两个,一个呢,一减屁就是你的概率用一,一减,其实就是你错了多少吗?如果你预测是一的话,就完全没错,预测是零的话,就错了是一,另外一个呢,就是负的 log 屁,大家可以看一下他俩的函数图像啊, 实际上比如说一减屁,就是这条,它整体呢还是我们说的那四个点呢?基本都是复合的,但是呢,其实它三是不复合的。三是什么?说错的越多呢,就应该惩罚越大,但是它的它的值呢?其实它最大的一减屁吗?它的最大值就是一,我错的再离谱,我预测成零了,你的惩罚也就是一而已, 这个是不行的,是吧?这一点上不太好。我们看一下负的 log 屁,看它到零到一之间的是什么,其实它是几个呢?都是满足的,当你预测的错的时候,它的损失是无穷大的, 当你预测为一的对的时候呢,损失就为零了。而且呢,它还有一个好处,我们知道 log a 乘 d 就 等于 log a 加 log b, 那 么我们在计算的时候,其实它是这一系列概率的连乘嘛, 最后这样我们就可以把它转成加法,这种时候就不会让它变变成零了。所以说呢,我们一般用负的 log p 来做损失函数的,要来做分类任务的损失函数,当然损失函数写成负的 log p 呢,并不是大家凭空猜出来或者偶然得到的,其实它是来自于信息论啊,这么写就叫做交叉商。 商这个词在物理学中啊,或者在信息论中代表的含义都是类似的。当一件事情有非常多的可能性,它是一个不确定的事情,那么我们想把它给确定下来,需要多少额外的信息呢?需要的这个信息就叫做商, 当一个事情的是一个非常确定的事情的时候,你需要的信息就非常少吗?这样就伤特别小的。比如说有一个作弊的硬币,一扔呢,百分之九十九的概率都朝上,那么我一扔问你,他朝上还是朝下呢?你需要的信息量特别少,直接就说朝上就行。 当如果说你两面都是正的时候,那么直接问你的话,两面都是人头,那需要的信息量就为零了,说明他是一个百分之百确定的事情,无论怎么扔,都是人头朝上。 好,那所谓交叉商呢,写起来就是 c e 啊,大家看到这两个字母缩写后面就知道了,是指两个分布的差异。哪两个分布呢?在分类任务中啊,我们这两个分布就是指模型预测的概率分布和真实的标签的分布。 c e 损失呢,就算是算的就是他们两个之间的差距,当然呢,这两个之间的差距越小,我们就是商越小,那么模型预测的就越靠谱。我们首先来看一下二分类的任务,就是二分类的交叉商呢,可以这么写说不对啊,你刚才不还是一个负的 log p 呢,怎么写起来这么复杂了呢? 其实呢,因为我们在二分二分类的任务中呢,实际上是有两种可能的,要么其实在原始的数据中呢,要么就是正的啊,要么就是负的。 我们其实这么写,它对应的公式呢,实际上是有两种写法的,但是呢,我们为了强行把它写成一个公式呢,就用了点小技巧,自动把另外一个给关掉。比如说呢,我们的真实的标签是正样本 y 等于一的时候呢,你会发现后面这一项就是零,你可以忽略它一减 y, 一 减一就是零了嘛,那么 y 乘以 y 呢,就乘以 log y 了,其实这种时候就是负的 log p 的 意思了,如果我们的样本是负样本,那么它本来就是零,那么前面这一项就是零了,那只有后面这一项有用了,而且一减 y 就是 一,所以也可以不看,就是 log, 一 减 y y hat, 这个就是预测的意思, 那么其实它又会变成了坍塌成这样子了。所以说呢,这样写只是为了我们在算的时候呢,用一个公式来表达 它的梯度计算呢,实际上是在结合上 sigma mod 啊,我们知道损失函数对 sigma mod 啊进行求导的时候,但是它的推导特别的 复杂,就不给大家演示了,但是呢,算出来的结果却是惊人的。简单的,大家一看,预测值减真实值,这是概率啊,因为经经过 sigma mod 之后就变成概率了, 怎么跟 mse 特别的像呢?这其实并不是巧合, sigma 的 和交叉商本来在数学设计上就是一对的,他们的计算它的导数就这么简单啊,就是这样,其实也是它的一个好处,为什么它应用的这么广泛,求导简单,反向传播的时候就简单了,数学推导就不带着大家看了,大家记住这个结果就行了。 同样呢,还有多分类的时候,我们用 softmax 再加交叉商也是一样的,大家看一下,如果说我们的神经网络给出来计算呢,是三分类的任务,其中呢,一个是二,一个是一,一个是零点一, 它的得分是最高的,但这个并不代表着概率。是不是啊,我们要怎么样交叉商是怎么在 softmax 上组织呢?首先呢,我们就要用 softmax 把这三个值给带进去,让它们变成一个,加起来 总数是一,因为一个事情发生可能有三种可能,每种可能就是零点六六,零点二四,零点一,他们加起来得等于一是吧?其实 softmax 最主要就是干这个事情的,把他们三个的值呢给转成了一个和等于一的一个,而且永远是正数,这种时候就变成概率了,变成概率之后呢,我们就套入公式就行了, 可以看到呢,大概套进来它也就是这样,一乘以它,再加上零乘以它的。我们假设啊,我们预测的地址真实,真实的是一,真实值在第一个里面的剩下的这两个对应的真实的标签就应该零,因为三个只有一个能发生吗?这也是我努力分布讲的,只有一个能发生的时候, 那么其他的发生的概率就是零,真实值只有他是一,在一成的时候呢,可以看到损失就是这么大,这样,而且呢,他在计算导数的时候呢,也是一样的,算出来呢也是预测值减真实值就行了,非常的简单。正因为他交叉商呢,既符合我们前面讲的那四个特征,非常适合分类任务, 同时呢,它的在反向传播的时候,既跟让它无论是跟二分类,跟的 sigma 还是多分类跟 softmax 在 算导数的时候呢,都非常的简单,算出来呢特别运算效率极高,所以说呢,它几乎交叉商呢,几乎就是无论是各种各样分类任务的不二之选了。 最后呢,我们来给大家做一下总结,大概在怎么选呢?其实如果是回归任务,很多时候呢,我们就直接先用 mse, 二分类呢,其实就是用交叉商加 sigma 嘛,对于多分类呢,套上 self max 再加上交叉商就行了, 它们的损失的公式呢,大概就是这这样子的,看起来非常的复杂,但是它们的梯度算起来都是很简单的, 底层呢,他们对于数据分布也是有一些假设的。对于 m i c 呢,我们认为它是符合高四分布,也就是正态分布的。对于就二分类呢,认为它符合不努力分布,其实就是它们两个是互相冲突的一件事情,要么发生要么不发生,你不能两个同时发生。 如果对于多分类呢,其实就是多项式分布,就是不努力分布的进一步演化,在排靠尺中呢,就会有对应的 api 了都,其实也不用我们单独的去做实现了。 看一下,对于回归任务呢,其实我们在用排套尺的时候,引进 n n 之后呢,就可以看到它就是 m s e 罗斯就行了, 把损失函数给它,把预测值和把真正的值呢给带进去就行了。对于二分类的任务呢,其实我们用这个就是 b c e binary 嘛,二分类为此就是逻辑回归就好了。然后对于多分类的时候呢,我们就用就是交叉上损失就行了,这种时候就非常的简单, 但是它有一个隐藏的坑啊,我们知道啊,就是我们在写在定义模型的时候,我们知道我们用这一个呢,就可以把一堆就神经元呢都给,就把每一层呢都给定义下来了。最后呢,最后一层出一下 softmax, 但我们会发现啊,它的准精准率呢,永远卡在随机的水平,没法训练,这是为什么呢? 是因为我们这一步啊,他自己就去做 softmax 了。所以说你在在写模型的时候啊,在写我们定义我们的网络的时候,不要写这个 softmax 这一层了, 在损失函数里面,他会自己来做的,所以说呢,他希望你输出的就是直接出的那个结果,他自己会来做 softmax, 所以 说这种时候呢,就会训练的就会加速了。 最后做一个总结就是优化器呢,是决定怎么走,损失函数决定的是走向哪里,所以说损失函数呢,有三个身份, mse 呢,几乎就是来做回归任务的,而交叉商呢,就可以做分类任务, 所以它们三个呢,在于排靠尺。在写代码的时候,我们后面下节课呢,就给大家介绍一些代码,看一个最简单的神经神经网络是怎么工作的,那种时候我们在看这种代码的时候呢,就能看明白什么意思了, 而且在工程上,记住,永远不要自己去写这个 so max 这一层的时候。好吧,好,关于损失函数呢,就快速给大家介绍到这里。
粉丝6.9万获赞20.0万

想象一下,你在一个陌生的城市里,要去一个地方,你手上没有地图,也不知道具体路线。但你有一个指南针,他能告诉你你现在走的方向对不对,目标在你哪个方向。 指南针不会告诉你这条路堵不堵,要走多少步,但他会持续给你反馈,方向偏了,往左转一点,方向对了,继续往前走。神经网络面临的也是同样的问题。 模型做完一次预测之后,比如预测一张图是不是猫,或者预测明天的气温,它怎么知道自己做的怎么样? 它需要一个客观的衡量标准,这个标准就是损失函数。损失函数英文叫 loss function, 虽然名字叫损失,但它的作用非常正面,它像一个指南针,给模型指出你离正确答案还有多远。具体来说,模型预测的结果和真实答案之间肯定有差距, 损失函数就把这个差距算成一个数字,这个数字越小,说明模型的预测越接近正确答案。数字越大,说明偏差越大。 模型的训练目标就是通过不断调整自己的参数,让这个损失值越来越小,越来越接近零。那损失函数具体怎么算?不同类型的任务需要不同的指南针。先说分类任务, 比如让模型判断一张图片是猫、狗还是兔子,有多个类别可选,最常用的是交叉商。损失交叉商的算法是这样的,模型对每个类别会输出一个概率,我觉得是猫的概率是零点七,狗是零点二,兔子是零点一。 如果正确答案是猫,损失函数就会把猫对应的概率零点七拿来算。模型对正确答案越有把握,比如猫的概率零点九五,损失就越小。越没把握,比如猫的概率只有零点四,损失就越大。他不涉及猜对,猜错的评价,就是客观的算出一个数值。 而且他有一个很巧妙的特点,如果模型不仅没猜对,还对错误答案非常自信,交叉商会给一个极大的惩罚值,这让模型对那些自信的犯错的情况印象格外深刻。所以交叉商的作用是让模型不仅要把答案做对,还要对正确答案越来越有把握。 再说回归任务,比如预测房价,预测温度输出是一个具体数值,最常用的是军方误差,也叫 mse。 军方误差的算法更直观,把预测价格和真实价格相减,得到一个差值,然后平方一下。 为什么要平方?因为这样不管预测高了还是低了,差值都是正的。而且差一块损失是一差一百块,损失是一万,差了一万倍。 所以 mse 的 作用是让模型优先去修正那些偏差特别大的预测,而不是在小偏差上纠结。除了这两个,最常用的还有一些特殊的损失函数, 比如平均绝对误差 may, 它直接取差值的绝对值不平方,所以对大偏差和小偏差的乘法是现行的。 如果数据中有一些异常的离群点, may 比 mse 更稳定,不会因为一个异常值就剧烈调整模型。 再比如 huber 损失,它是 mse 和 me 的 混合体,偏差小的时候像 mse 一 样平滑,偏差大的时候像 me 一 样对立群点不敏感。很多实际场景中, huber 损失比单纯用 mse 效果更好。 不同的损失函数就像不同的指南针,有的偏重把握度,有的偏重纠正大错,有的更稳健。选哪个取决于你面对的任务和数据特点。你可能会问,知道损失值之后呢? 模型怎么利用这个数值来调整自己?这就要说到反向传播了。模型从输出端往回走,一层一层的计算每个参数应该朝哪个方向调,调多少,不过那是下一集的内容。今天我们只需要记住,损失函数是模型进步的指南针, 不同的任务用不同的指南针,他们各有侧重,但目标一致。客观的告诉模型,你离目标还有多远。这个反馈信号是整个学习过程的起点。小莫说 ai, 带你听懂 ai!

ok, 小 伙伴们,那本期要进行一期优乐二六的周末更新,对损失函数进行一个改进,然后我想跟大家说一点呢,就是大家改进有效果以后,你最好过来看一下我的视频,因为视频里面有很多的细节,你对佑着看,不要遗漏。 好,那我们开始今天的干货啊,那么本期给这个优乐二六系列的更新呢?呃,是这样的,是一个 c 普 i o u 更新,它对于我们来说能有哪些写舵点呢? 我先给大家来讲一下啊,本期视频啊,三个点吧,第一个写舵点,第二个呢,就是我给大家跑一下,怎么来跑,怎么来用,对吧?你拿到代码以后你怎么来用,这也是一个关键。还有一个就是我给大家来说一下,就是这个你在用的时候一些小技巧,好吧, 好用的时候怎么把它搞出更多的工作量来,是不是?好,那我们来看一下啊,这六个点吧,六个点,这六个点呢,大家结合着来看,然后你取其中两三个,我觉得够用就够用,然后那这个点我举一个例子,举一个例子大家学会怎么来用,你看回归机理的认知革新, 传统损失只考虑距离、角度、宽、高比,完全忽略框的自身长短、形状、目标尺度对回归的影响。那么 step i o u 呢?首次重视同偏差同熊状象 框的形状会直接影响它的敏感度,敏感性,对吧?短方向偏差啊,或者说是各种方向什么的,宽啊时要尺度宽啊,对误差来说呢,它会更敏感。因此,那么你用这一个 损失函数改进的原因之一是啥?就是传统它仅考虑这些,而忽视了你的 a 方向,什么什么什么什么特点,一定要把你的方向和这个改进给结合起来,这样你才能紧扣主题,不然你写着写着就容易写成排列组合,就容易写成这种,就是缝合。 实际上呢,你不要把它给搞的就给人一看就是缝合就会拿过来用,而是你结合当前的痛点才过来用的。那当前的痛点是什么? 当前的痛点是啥?就是这个对不对?考虑框接膜,就是它的不足膜,当前的不足膜,同样的下面也是一样的。那你这对于航拍敏感这些物这个小目标来说呢?将形状加权融入小目标,专用度量,解决 i o u 没有重叠,低重叠时 提督消失的痛点,对不对?那么传统 i o u 他 传在这些痛点,所以我要改进,所以我改进后长点,然后形成闭环,是不是就这样来进行的?好,接下来我给大家演示一下,我们拿到代码以后怎么样啊?大家拿到代码以后是这样的,看 ctrl s 里面,在这里面有一个 这个 i t s, 然后在这里面大家找到什么?你看 c i o u, 你 需要做的啊,很简单,把这一个跟着我的节奏走啊,千万不要有遗漏,不然你会容易冒错的啊,你把这个给它随便起个名字,怎么不叫 i 呃, rose 就 行。然后呢? 在这个地方,你比如说这个是 set rose, 对, 这不是我们要的,我们要的是 sip sip rose, 那 给它改名之前改过的小伙伴应该都知道啊,这个就直接就是这样, rose 其实 对吧? ok, 这就 list 改完还有一个,还有一个是这一个参数,这一个参数我们也要给它改一下,给它改成原来的名字,就相当于替换,大家明白这个操作吗?就我已经改好了,然后你去替换一下就行,这要是最简单,对所有的小白来说都不会出错的,这是最简洁的一种方法,它在这,然后给它 创建名 zip, 然后重构, ok, 那 然后我们来跑一下啊, 这就可以了,这就可以了。好,这是第二点,就是怎么来用它,这样的话你再去改其他的模块损失函数,它不在网络里面体现出来,你看不到,网络里面看不到,但是结果里面会体现出来,大家明白吗?你的结果才是不同的, ok, 然后还有就是小伙伴们在写这个大论文,靠,先让它跑完,先让它跑 ok, 跑通,没有任何问题啊,这就 ok 了,这就 ok 了。行, 好,然后让他去跑,去吧,然后给他 ctrl ctrl 加 c 终止它, ok, 就是 这样,这就是如何来用它,然后呢?我给大家拿到的时候会把这个带给改回来的啊,这个还是改成 shift i o u 是 吧?到时候大家如果用的话,你就用这个,否则的话你就用杵死的 sleep loss, sleep loss, 好 吧,待会我再给大家改吧。然后在这里面我跟大家来说一下这个,在这里个地方,我们改的 loss 里面, loss 里面大家可以看一下这个,我们用了 sleep l u, 然后再啊 matrix 在这里,在这里我找到这个地方,对,这就是我们的这个代码啊,代码在这里面有一个参数,大家可以看一下,在这个参数你如何来用它,它默认是内容,你可以设置不同的参数,那因此呢,当你设置不同的参数,你可以做一个什么实验, 做一个参数的对比实验,你调优相当于参数调优,但是你在写大论文的时候,根据这个参数,你可以列出一个表格,然后进行一个分析。就说很多小伙伴说写大论文或者小论文, 你写着写着感觉天赋不够,我写不了那么多字数,为啥?因为你没实验,因为你没东西,那你把这个也加进去,这不就满满当当对不对?小伙伴们, ok, 本期视频就是这个啊,这个损失函数非常的优秀,然后具体啊,大家可以来看一下我这个四 s 店里面这个有一个详细的介绍,大家可以大概看一下答案。最重要的是啥?最重要的是 跑出来有效果,以后除了看这个,看我视频,还要仔细去研究原文,把它里面的图表公式搞到自己的里面去,就这样,那本期的视频就是这些,也祝愿所有的小伙伴们呢,能够遥遥领先。对了,还有一个是再跟大家说一下吧,就是寸 训练,那训练呢?实际上呢,我给大家推荐你可以用这一个油化器啊,可以试一下,你必须指定,不然的话它默认就是自动可以用一下这个油化器试一下,如果你把这个 m u 删掉的话,那就是普通的 s g d 优化器,可以试一下啊,这个也是优罗二六自己提出来一个新的优化器。好, 那本期的视频呢,就这些,祝愿所有的小伙伴们能够为我们的科研呢贡献新的力量,加油吧小伙伴们,有好消息别忘了反馈给我哦!

每天一个大模型知识点,今天是损失函数深度讲解。好吧,现在面试开始,请坐 一个机器学习模型,他到底是怎么学会的?他凭什么知道自己哪里做的好,哪里做的不好呢?就像一个学生在学校里一样,老师给学生布置作业,学生做完以后,老师给了一个分数,比如说八十分、九十分或者一百分, 学生就通过这个分数来判断自己有哪些地方做的不够好。然后呢,学生就会根据这个反馈去调整自己的学习策略,下次考试尽量考的更好。机器学习模型有没有这样的反馈机制呢?有,他就是损失函数。今天这堂课,我们就来深入讲解损失函数,我可以告诉你们,损失函数是深度学习的心脏, 如果你不理解损失函数,那么你就很难理解为什么你的模型能够学习。所以,如果你想真正掌握深度学习的精髓,损失函数是必须要理解透彻的一个概念。我先给大家一个最直白的定义,损失函数,它就是衡量模型预测值和真实值之间差异的一个数学函数。 你们想象一下,我是一个天气预报员,我预报明天温度是二十摄氏度,但实际上是二十二摄氏度,那么这个预报和真实情况之间的差异是多少?最简单的办法就是二十减二十二等于负,二,差异是二十摄氏度。 问题来了,如果我有一百个这样的预测,我怎么把所有这些差异加起来呢?我不能简单的把正的差和负的差加在一起,因为正负可能相互抵消,所以呢,我们就用平方的方法,这样的产物变成正数了,这个平均值就叫正方的差,也就是因为 e, 所以 你看 损失函数,说穿了就是一个差异度量,他告诉你的模型,你预测的不准,差这么多呢,要好好改进啊,这个反馈有什么用呢? 他能让模型改进吗?是啊,他不仅能反馈,他还能告诉模型应该往哪个方向改进,这是通过什么呢?通过梯度,在数学上我们可以求损失函数对模型参数的导数,这个导数就叫梯度。梯度告诉模型参数应该增加还是减少,应该增加多少, 然后模型就根据这个梯度来调整自己的参数,不断的让损失函数的值变小,这个过程呢就叫梯度下降。这里面最核心的是什么? 就是损失函数的梯度,没有梯度,没有梯度,模型就不知道往哪个方向改进。所以说 损失函数是模型学习的灵魂。一个好的损失函数应该具有哪些特性啊?第一个,可导性,你的损失函数必须是可导的,必须能求导数, 如果某个地方不可导的,那个梯度就无法计算,模型就无法学习。第二个,单调性,你的损失函数应该满足这样的性质,模型预测的越准,损失值就越小,预测的越不准,损失值就越大,这样才能引导模型往正确的方向学习。 第三个,有唯一的最小值。理想情况下,你的损失函数应该是一个阙形的曲线,底部是最小值点,这样模型就能够找到最优解。第四个,计算高效, 你的损失函数在大规模数据上应该能快速计算,如果一个 bug 有 几千万个样本,你的损失函数计算的还很慢的话,那就太浪费时间了。 这四个特性,前两个是必须的,后两个是最好友,这就是关于损失函数最基础的概念,现在我们就来看具体的损失函数长什么样。 mse, 它的全名是 mean squared error, 中文翻译叫均方误差,我来给大家解释一下这个名字为什么这么起。 mean 就是 平均的意思, square 是 平方的意思, error 是 误差的意思, 所以均方误差等于误差的平方的平均值。公式呢,就是这样的,说白了就四个步骤,第一,计算每一个预测值和真实值的差,也就是误差。第二,把每个误差都平方。第三,把所有的平方误差加起来。第四,除以样本的总数 n 得到平均值,就这么简单。 为什么我们不直接用误差本身而要加一个平方呢?我给大家说几个理由。第一个理由,处理负数,想象一下,模型对样本 a 预测高了五,对样本 b 预测低了五,如果你直接加五加负五,结果等于零,好像没有任何误差一样, 但实际上模型两侧都预测错了,所以通过平方,我们就把所有的负数都转成正数了。负五的平方等于二十五,五的平方等于二十五,现在就都是正数了。第二个理由,放大较大的误差,这很重要啊,假设我预测错误分别是一、二、三,如果我不平方,误差较和就是六, 但如果平方的话,一的平方加上二的平方加上三的平方等于一加四,再加九,结果是十四,你看那个三的误差被放大的特别厉害,这样做的好处是什么呢?模型就会特别关注那些预测的特别离谱的样本,努力避免大错误,这通常是我们想要的。第三个理由, 数学上容易求导,这对优化很重要。平方函数它是处处可导的,而且导数计算很简单,这样梯度下降就能够顺利进行。第四个理由, 统计学 e m i c e 在 统计学上有很深的理论基础,它与最大自然估计有很深的联系,所以它不只是随便想出来的,它是有坚实的理论基础的,所以这个平方可不是多余的,它很关键。 m i c e 作为一个损失函数,它有什么优点和缺点? m i c e 的 优点,首先,它很简单, 计算起来也很快,不需要任何复杂的数学运算,就是简单的减平方加除,所以即使你有百万级甚至一级的样本,也能快速计算。其次, 他处处可导,没有任何地方不能求导,这对梯度下降非常友好,而且导出形式也很简洁,很容易计算。再次,他的数学性质很好,容易分析,很多优化理论都是基于 m i c e 这样的函数来建立的。 m i c e 的 缺点,最大的缺点就是他对异常值特别敏感。为什么呢?就是因为那个平方, 如果数据里面有一个特别离谱的异常值,它的平方会特别大,就会主导整个损失函数的值。比方说,如果我有十个预测都错一,一个预测错十,那这个错十的就会对总损失贡献一百,而其他十个值贡献十。这样呢,模型就可能过度追求解决这个异常样本,而忽略了其他大多数样本。 第二个缺点, mce 的 量纲和原数据不一样,如果你原数据的范围是零到一百,那 mce 的 范围就是零到一万。这样有时候会让人困惑,到底损失一百是大还是小呢?你得知道数据的范围才能判断。现在我问大家什么样的问题,我们应该用 mce 呢?答案是 几乎所有的回归问题。只要你的任务是预测连续的数值,比如说预测房价,预测温度,预测股票价格,你就应该用 mce, 不是 最好的选择。这时候你可以考虑用 ma 平均绝对误差或者 turbo loss 这些对异常值更加鲁棒。现在这就是最关键的部分了,我们要用 i、 n、 c、 e 的 梯度来指导模型的参数更新。我们进行五十次迭代,每一次迭代 我们都做四件事,第一,前向传播,用当前参数去做预测。第二,计算损失,用单个 c、 e 计算预测和真实之间的差异。第三,反向传播, 计算 n、 n、 c 对 每个参数的梯度。这告诉我们参数应该往哪个方向调整。第四,参数更新,沿着梯度的反方向更新参数。如果梯度是正的,我们就减小参数。如果梯度是负的,我们就增大参数。现在咱们讲第二个损失函数交叉商。这个特别适用于分类问题。我先给大家一个问题,假设我现在有一张图片, 我要判断这是猫还是狗还是鸟,这是一个分类问题。有人可能会说,简单,模型输出一个数字就行,零表示猫,一表示狗,二表示鸟,然后取最大值对应的类别。这个逻辑上可以,但是我问你这样输出的模型,他对自己的答案有多自信呢?有多确定呢? 我们根本不知道啊,更好的方法是什么呢?模型不是输出一个类别,而是输出三个概率。比如说,这是猫的概率是零点七,是狗的概率是零点二,是鸟的概率是零点一,这三个概率加起来等于一。这样的输出形式,我们叫概率分布。为什么这样更好呢? 因为我们不仅知道模型的答案这是猫,还知道模型对这个答案有多自信,而且这个信息在实际应用中特别重要。比如模型 a 说这是猫,概率只有零点五一。 这两个模型虽然答案一样,但它们其实是有很大区别的。模型 a 非常确定,模型 b 几乎不确定,只是稍微倾向于猫。在医疗诊断中,这个区别就特别重要了。 医生需要知道 ai 的 确定度来决定是否要进一步检查。如果模型特别确定,医生就可以直接采取行动。如果模型不太确定,医生就要更谨慎,可能要再检查一下。现在的问题就来了,怎么衡量模型输出的概率分布和真实答案之间的差异?换句话说, 怎么衡量模型预测的这个概率分布离正确答案有多远?这就是交叉商要做的事情。现在我给大家做一个完整对比, mc 和交叉商到底有什么不同? mc 是 为回归问题设计的预测连续值,交叉商是为分类问题设计的预测类别。数据格式不同, mse 的 预测值是实数,比如三点五,负二点一这样的。交叉商的预测值是概率必须在零到一之间梯度形式不同, mse 特别敏感,因为有平方交叉商相对鲁棒一些,收敛速度不同, msei 在 回归问题上收敛的不错,交叉商在分类问题上收敛的更快。现在我教大家一个很简单的决策方法。 第一步,判断问题类型。这是回归还是分类问题?如果你在预测连续的数值,就是回归,如果在预测类别,就是分类。第二步,如果是回归,检查数据质量,数据里异常值多不多,如果多用 m a e 或 hub, 如果少就用 m a c e。 第三步,如果是分类,看类别数量只有两个类别吗?用 binary 或 centripetal, 超过两个类别用开了锅扣块散制品,就这么简单。我现在要告诉大家初学者最常犯的三个错误,希望你们以后千万别犯错误一,分类问题用 mse, 这是最常见的,很多初学者不明白,为什么 这盲目的拿 mse 去做分类问题,结果呢?模型收敛的特别慢,甚至收敛不了。错误二,回归问题用交叉商,这比较少见,因为通常框架会不支持,但如果有人真的这样做了,结果就是模型根本学不了。错误三,只看训练损失,不看验证损失。 很多人训练的时候只关注训练级上的损失在不在下降,但这很容易导致过。你和你应该同时监控验证级上的损失, 当验证损失开始增加的时候,即使训练盛世还在下降,你也应该停止训练。最后,当你已经掌握了这些基础之后,你可以去深入研究更高级的主题,比如说多任务学习中的损失函数加权,比如说对抗性损失函数,比如说用强化学习来设计损失函数,这些都是前沿的方向。我是大鱼,点关注,期待下。


现在我们看纸上这两个同心圆,里面一圈是 a 类数据,外面一圈是 b 类数据,这里藏着一个二维平面的致命难题,不管你怎么画直线、画斜线,永远不可能把这两圈数据分开。那传统算法怎么解决?靠非限性升维, 我们给这组同心圆数据额外增加维度,完成非限性空间变换。我们拿具体样本举例,内元 a 类样本点、 外圆 b 类样本点,把这两个点带入高斯和公式做特征变换。高斯和升维的效果特别神奇,它会自动根据样本距离圆心的远近拉开特征差距。内圆 a 类离圆心近,算出的特征值就高。外环 b 类离圆心远,算出的特征值就低。 这里大家要分清一个关键区别,高斯和是原生非限性升维,升维的同时自带空间扭曲,自动解纠缠,而神经网络靠的是一套组合权限性扩维加激活函数非限性重构,强行模拟高斯和的和函数变换, 等效实现高维空间的分离效果。我们继续拿具体样本举例,内元 a 类样本点零点二、零点八、零点八 经过宪性变换后带入激活函数,简单说就是用简单的宪性堆叠加非宪性激活,硬生生解开了宪性网络永远解不开的嵌套数据,完成样本拆分,具类分层。但神经网论刚始化的时候,根本不知道什么是最 u w、 最 u b, 那 我们到底怎么自动求出这组能完美分割数据的最佳 w 和 b? 首先讲损失函数,它的身份特别好理解,就是神经网络的专属阅卷老师, 唯一的工作就是衡量模型预测结果和真实结果的差距,差距多大,分数就多,低误差全靠它量化。我们先讲 mse 军方误差损失,用现行举一个简单的例子,输入样本坐标特征 x, 搭配当前的 w 和 b 网络,会算出一个连续预测值。这个值本质是样本相对于分割直线的距离,距离越小越接近最优解。但是 mse 有 一个天生短板, 它只盯着数值距离,误差优化只适合回归任务。如果我们做离散的分类任务, mse 就 变得非常拉胯, 很难精准找到最优分类边界。所以专门针对分类任务,我们有专属王牌。交叉伤损失,我们继续用同心圆案例实操,设定内圆 a 类标签为零,外环 b 类标签为一,这是标准的二分类任务 对于神经网络的输出结果,先 sigmod 归一,画出概率,再用交叉商评判概率对错,这是二分类的标准完整流程。举个直观的例子,如果真实样本是 a 类网络预测零点一贴合真值损失几乎等于零,不用怎么修正。 但如果网络学跑偏了,误判成 b 类,预测值给到零点九,交叉商损失会直接暴涨数倍,狠狠扣分,强制参数修正。其实不管是咱们刚刚提到的全连接网络,还是之前讲到的卷积网络,底层运算逻辑压根没变。 卷积网络中权重化身成了一个个卷积核,本质依旧是做加权叠加再加偏置运算。实际应用里,损失函数的种类十分丰富,会根据不同任务量身定制。 比如做目标检测时,我们会用到 i o u 损失来评判框选定位的精准度。今天咱们只是敲开了损失函数的入门大门,简单认识了基础类型与核心作用。关注我,用白话讲 ai, 后面更精彩!

你有没有想过, ai 怎么知道自己学得好不好?就像开车要看仪表盘, ai 也需要一个东西来告诉他,你现在的预测错得有多离谱。这个东西叫做损失函数,今天我们就来搞清楚它到底是什么想象。你蒙着眼睛开车, 没有仪表盘,不知道油还剩多少,速度多快,温度高不高,随时可能出事。 ai 也一样,没有损失函数,它就像个瞎子,不知道自己学得怎么样。损失函数就是 ai 的 仪表盘, 时时告诉他你的预测偏了多远。损失函数是一个数学公式,干的事很简单,拿 ai 的 预测值和正确答案作对比, 算出差距有多大。比如模型说这是猫,但其实是狗,损失就很大。损失越大,说明错的越离谱,损失越小,说明预测越准, 它就是 ai 的 错误指示灯。不同的任务需要用不同的损失函数预测房价,这种数值型任务用均方误,差,错得越远,惩罚越重。分类任务用交叉商衡量预测分布和真实分布的差距。人脸识别用对比损失, 让同一个人更近,不同人更远。选对损失函数就选对了优化方向。训练过程中,我们会画一条损失曲线, 损失随时间的变化。理想情况是初期损失很高,然后快速下降,中期稳固下降,后期趋于平稳。通过看这条曲线,我们能诊断出很多问题, 比如损失不下降,说明模型或数据有问题,波动太大,可能是学习率设置不对。损失函数虽然重要,但别迷信它,损失小不一定表现好。比如模型可能只是记住了训练数据,也不要只看损失,要同时关注准确率 这些真实指标。更关键的是,再好的损失函数也救不了垃圾数据,所以损失函数只是工具,不是目的。最后回顾一下损失函数衡量预测值和真实值的差距,损失越大,错得越离谱, 损失越小,预测越准。不同任务用不同损失函数损失曲线帮我们监控训练,别只看损失,要结合业务指标。最后,损失函数只是工具,不是目的。

残差连接改了三百,注意力机制换了四种,损失函数调了五组,折腾了两周一跑,实验精度纹丝不动。师兄过来看了一眼,没说话,打开代码改了三个地方再跑,精度直接上去了。你问他改了什么,他说没动结构给内核做了三处微创手术, 第一刀,疏通梯度瘤。很多模型精度上不去,根本原因是梯度传不到前层,你加了十层残差,但梯度在中间,某层就消失了。微创手术的做法是,在梯度消失的位置插入一条梯度高速通道, 比如修改某层归一化的位置,或者在反向传播时对梯度做裁剪与放大的平衡,不动结构只改梯度流动的路径。第二刀,稳定特征分布。训练过程中,浅层特征的分布一直在变,深层网络永远在追着浅层跑, 你加了再多的注意力,他也抓不稳。微创手术的做法是在特征进入深层之前做一次软对齐,不是简单粗暴的归一化,而是根据当前 batch 的 数据分布动态调整特征的均值和方差,让深层网络看到的输入始终稳定在一个可控范围内。 第三刀,重塑优化空间。损失函数的设计决定了模型往哪个方向优化,很多人只会加权求和,把几个 loss 加起来设个系数。 微创手术的做法是在梯度回传时,对不同 loss 的 梯度做动态平衡,哪个 loss 的 梯度太大就压一压,哪个 loss 学的太慢就推一推,让多个任务在优化过程中真正协调,而不是互相打架。三、为什么神稿人吃这一套?因为这种微创手术证明你真的懂模型,你改的不是有没有加注意力,而是梯度怎么留,特征怎么稳,优化怎么平衡, 这些是模型的底层机制,是决定模型智商的根本。审稿人看到这种工作,第一反应是这个人不是在堆模块,而是在理解模型。不过你也想给自己的模型做微创手术,但不知道从哪下刀,不知道梯度怎么疏通,特征怎么稳定,优化空间怎么重塑。强烈建议看看我整理的顶会顶刊论文缝合信法评论扣涨点,七哥安排。

大家好,接下来学习大模型训练自学的第一期,损失函数与那个最小二乘法, ok, 先回顾一下之前那个 transformer 学习的整期学了啥? transformer 学了大概是九期是吧?我学了之前自学了九期,回顾一下,主要是 transformer 做了一件什么事情?假设以猫 吃,你输入的是猫吃这个文本是吧?反方做事事情做预测这个鱼这个字是吧? ok, 一 到九期,第一期就学那个 in bending 是 吧?把猫吃这两个字转化为它的特征是吧? 特征,因为 ar 是 不理解这些所有的文本是吧?他只有把它转化成特征的这个向量矩阵是不是他才能?这应该只理解这个数字是不是? ok, 第二步就第二期就学了,理解了猫和鱼这两个位置是不是? ok, 第二步就学了,理解了猫和鱼这两个位置, 吃在第一个位置是吧? ok, 所以 要把那个位置也得加进来是吧?这是那个 in code 这里做的事情。第三期就学了那个 q k v, 因为他要预测这个鱼呢,所以说他要把那个相对相对鱼的这个语料给引进来,是吧?所以说这就是 q k v, 你 可以列为就是训练的数据。然后第四期就学了那一个 softmax, 这里 softmax 主要做的就是那一个 e x 这类的运算。 ok, 然后第五期就学了那一个,嗯, 算注意力分数是吧?也就是也有多头注意力是吧?多头挺身注意力。第六期就学了那一个 fnn 前向传播,主要他主要做了一个升维,降维。对,第七期就学了那一个残差 连接,再加上那一个 linna 这期的内容其实很像那个训练的过程的开始 g 八七,就是说其实八,最后八到九的最终结束之后,整体就说得到了这一个 lemme 的 结果,再做一次那个骚特曼,然后最后再乘以那个 wup, 就 得到了那个预测的下一个 预测了一个概率吧,你可以列为是一个概率,假设这个最大的概率值是零点八八,这个得到了这个矩阵是吧?这个零点八八就是概率最大的那个值,是不是得到了这个值,就可以去那个他那个字典表去查是不是这个字典表,你可以列为是一个有五万个汉字的 k v 表,这个 k 就是 这个零点八八,这个 v 就是 这个汉字这个余 ok, 这整个闭环起来,是吧?就是算的范围整个过程预测了下一个词,是吧? 回归到我们的这个模型训练,这为什么要做训练?像你整个传输的过程,你的你的输入,输入的变量只有这个特 s 特征是吧?然后加上那个 w q w v 是 吧?这四个值,是不是? 为什么这些值经过一系列的矩阵的乘法,各种预算能得到最终的预测到下一个词呢?就是如果你去想,按理说最开始这些值都是出场都是随机值的, 为什么这些随机子经过不断的训练,最终能拟合到一个结果愈合到这个词呢?这就是那个模型训练引入到这就要学到最小二乘法,你可以也叫最小那个方差方差法,这样比较好理解, 这里溯源你一下,这里这个最小二乘法法,也就是那个模大模型训练用到的那个损失函数的来源,损失函数溯源一下啊,虽然大约是那个一八零零年左右, 因为有很多查理有很多争议,也有说是法国的什么数学家,还有德国的高斯,但是用高斯来来举例吧,高斯比较有名啊,高斯在那个时代他们去很多人就说去观测那个星轨,是吧?星星的运动的轨迹,是吧?假设你有一个 x 轴,再有一个 y 轴, x 轴,这是时间,比如说一点两点三点 y 轴,就是就是星星的位置是吧?这是二四六, 因为星星是这种,就说他是这种,不是一个线性的,不是像直线运动的,是吧?他是这个曲线的吧,就这种,大概是这种点,是吧?因为古代人他只能记录这些位置是吧?他只有时间跟位置,是不是假设这样举例大概是星星的运动轨迹,是这样,是吧? 你这样通过摸索出他的运动轨迹,你你你在下一个时间点,你就可以在这个 y 轴得到这个星星的距离,是吧?举一个实际的例子啊,假设这个 y 等于个二 x, 我 们假设是二 x, 但是,但是以前的人他不知道这个参数是二,是吧? 他只能去猜是不是。假设我们这个是 x, 这是 y 一 二三,我们看到的它是二,是吧?就说这个是真实的,是吧?这个就说是那个二四六,是吧? 假设就是以前人测预测那个星星的轨迹,先猜一个,比如说再猜一个是 y, 等于个一点五 x 是 不是这一个就是猜的那个解 y 值,是吧?假设时间是一的,这就是一点五,是吧?二的话就是三,是吧?三的话就是那个四点五,是吧?这个这个二四六就是它观测到的那个位置啊?我们来算那一个方差, 然后这个就是零点五,然后这个就是一,这个就是那个一点五,可以,然后算平方差。他为什么要算平方差呢?因为他有负数,是吧?他可能他两个相点可能有负数吧,这不管正负数,你一算平方差,是不是都把它变为正数了,是吧?这零点二五,这是一,这个是, 嗯,二减二五,是吧?把这三个数加起来,然后这是那个一点二,五加那个 三减三点五,是吧?好, ok, 得到了这个结果,就是三点五,是吧?这样算一次三点五,是吧?你现在开始就调大一点五的值,是吧? 你再猜一个,比如说一点六、一点七、一点八、一点九,再猜到二,猜到二的时候,你是不是这里的 y 的 值都变成跟这个真实的 y 是 一样的?是不是?你这斜方叉跟平方叉是不全都等于零了,是吧? 零的值, ok, 这就算对了,是不是就认为这个是误差最小的,是吧?因为误差已经是零了,是不是就认为是 y 等于得出这个 y, y 的 二 x 这个心形运动的这个运,那个运行规律,是不是? 但是如果你再调大一点,比如说你调上个 y, 等于个二点一, x 这个值,这个方向差又会大了,是吧?又变成那个正数了,是吧?又变成比如说零减二、零减三,就变大了,是吧? 所以说这样就对你和到这个这个 y 到 y 等二的时候,是最接近那个行星的运动的轨迹,是不是?这个大模型?其实它也是一样的原理,因为你最初的所有的,就说所有的参数都是随机画的数值是吧?你有的只是一个最大的一个五,比如说五万个汉字的这个指板字典表。 所以说模型训练的过程也是不断的一步步走这个 transform 的 这个过程,它通过不断的你中间的过程都是矩阵的运算,是吧?比如说你这这是零点一乘以这个零点二,你不断的调整零点一,不断的调整零点二一这这几个参数,是吧?不断的经过一次次调整, 这里面用到的这个损失函数,损失函数就是这个最小二乘法,其实他也是算方差,他通过算这个方差与那个字典的这个值对照,是吧?把他把这个方差缩到最小,是吧?你和到这个,当然你不能你和到零,是吧?你只能你和到最小是吧?因为你初中有很多噪音是吧? 就跟你那个星轨一样是吧?你星轨的因为受到各种的因因因素影响是吧?他也不是个运行轨迹,也不是个现象是吧? ok, 你 这样不断你和到一个最小最小方差,是吧?最小方差得到你这样就可以得到概率最大的那个词,是吧?包括你中间用到的气度下降,还有 各种的预算,你的目的就是说让这个,让这个最终这个方差变成最小方差最小也就是跟你跟你字典里要预测的那个词的目标性目标距离最小,是不是也就是达到你的最终的结果,是吧? ok, 所以 那个模型训练其实也跟喘气泡沫的过程,只是他经过一轮轮的喘气泡沫的过程,所以你这样仔细去想所谓的大模型,你不管是这个推理步骤,还是加最终加中间的训练过程,他本质都是那个矩阵运行, ok, 结束。

今天我们来聊一聊如何通过在损失函数中添加梯度乘法项来让判别器的梯度的二泛数接近于一,从而使得我们在训练 wasserstanden 的 时候能够更加的稳定,并且避免梯度消失。 这个话题还是很有意思的,那我们就开始吧。我们先来说一下,就是 wasserstanden 和原始的杆相比,它的价值函数有什么优势?就是 wasserstanden, 它其实用的是 wasserstanden 距离来构建它的价值函数的。 对,那这个就比原始干里面用的那个 j s 散度啊,在理论上面是要更优越的,因为 wasserstein 距离它是可以就算两个分布没有什么重叠的部分,它也可以给出一个比较有意义的梯度, 然后也可以让这个训练过程变得更加的平滑。为什么在 w g n a 里面要对判别器做这个 e lipsearch 约束,然后这个东西具体是怎么实现的?会带来什么问题?其实在 w g n n 里面,为了让这个判别器也就是 critic 满足 e lipsearch 约束, 最初的那篇论文里面用的是权重裁剪,就是把判别器的所有的参数都强行的限制在一个很小的范围里面。嗯,但是这个东西其实会导致一些问题,比如说会让你的模型很难去收敛,尤其是你的网络很深的时候,会出现很多很奇怪的现象。 哦,原来是这样,那 w g a n gp 是 怎么解决这个 w g a n 训练不稳定的问题的?就是 w g a n gp 它其实就不再用权重裁剪了,它是在损失函数里面加入了一个梯度惩罚项, 然后这个惩罚项会让判别器的梯度的二泛数接近于一哦,这样的话就可以保证我们在训练的过程当中是比较平稳的,同时也可以避免梯度消失或者爆炸, 也不需要去担心模型不收敛的问题。好的,那在我们开始实现 w g a n g p 之前,要先做哪些准备工作呢?首先我们要先 import 一 些必要的库, 比如说要把 os 库 import 进来,然后要把 kras back end 设置成 tsa flow, 对 接着要 import kras 和 tsa flow, 还有 kras 里面的 layers, 这些都是我们后面会用到的。明白了,我们接下来就要准备这个 fashion ms 的 数据了,那这个数据集它本身有什么特点?然后我们在把它喂进模型之前要做哪些处理呢? fashion ms 这个数据集它其实就是 呃由二十八乘二十八的灰度图组成的,然后它一共有十类,像什么裤子啊,套头衫啊,运动鞋这种。 对接着我们会把它 reshape 成二十八二十八一的形式,然后同时我们要把它的像素值都缩放到负一到一之间。那接下来咱们具体说说这个判别器的模型架构啊。 为什么我们在判别器里面要先对输入进行一个零填充,因为我们这个数据它是二十八乘二十八的嘛。然后我们又用这种不长为二的卷积,如果直接用的话,就会出现比如说像七到三这种基数的维度。嗯,那我们在生成器那边上彩样的时候,就很难恢复到原始的图片大小, 所以我们就先把它零填充成三十二乘三十二,这样的话我们在整个卷积的过程当中就可以保持一个偶数的维度, 最后就会比较好跟生成器那边去对齐。那我们这个判别器里面用到的这个 combo block, 它里面都包含了哪些操作? combo block 其实就是一个卷基层,后面跟上一个可选的批量归一化,然后一个激活函数,最后再加上一个可选的 drop out, 对, 就这些层按照顺序堆叠起来,这就是一个 convo block。 所以 说这个判别器它整个是怎么搭建起来的啊?它就是首先有一个 input layer, 就是 接收我们的这个图片嘛,图片是二十八二十八一的, 然后后面跟了一个 zero padding 二 d, 把它变成三十二、三十二一,接下来就是一堆 convo block, 每经过一个 convo block, 我 们的通道数就会翻倍,然后空间分辨率就会缩小一半。 对,最后我们再把它 flatten 展平,然后经过一个 drop out, 最后用一个全连接层输出一个值, 就完成了整个判别器的搭建。了解了解,那你能具体说一下这个判别器它总共有多少参数吗?然后有多少是可训练的?当然可以,判别器它总共有四千三百零五万四千零九个参数,然后全部都是可训练的参数。 对,然后我们要讨论的是生成器的模型架构,你能先给我们讲一讲你这个 up sample block 里面都包含了哪些主要的层?可以啊,这个 up sample block 它首先是一个 up sampling 二 d, 就是 把我们的特征图进行上彩样, 然后面接了一个卷基层,再后面是一个可选的批量归一化,一个激活函数,最后还有一个可选的 drop out, 就是 这样的一个结构。听起来这个生成器的结构和判别器的结构还挺不一样的。对,完全不一样。这个生成器它是首先从一个噪声向量开始,这个噪声向量它会经过一个全连接层, 然后经过批量归一化和 linkeyrealu 激活函数之后把它 reshape 成一个高维的张量,接着后面接了一连串的 up sample block, 最后我们用一个 cropping 二 d 把它裁成二十八,二十八一, 这样就跟我们的输入的图片的尺寸是一致的了。明白了,那这个生成器它总共有多少参数?然后有多少是需要训练的?这个生成器它是一共有九十一万零六百六十个参数,其中可训练的参数有九十万两千零八十二, 然后有八千五百七十八个参数是不需要训练的。那我们接下来要深入到这个 w g a n gp 模型的核心的部分了,就是它这个模型的类的实现。 对,就是这个 w g a n 这个类,它在出场的时候都做了哪些事情?然后它的这些参数都分别是什么作用?呃,这个 w g n n 类它在出场的时候是需要你传入判别器和生成器的模型,还有就是这个引空间的维度, 然后另外两个比较关键的参数就是 discriminator express steps 和 g p wait。 啊,那这个 discriminator express steps 其实就是我们的 k, 就是 每次更新生成器之前要先更新 case 判别器,然后这个 g p wait 就是 梯度惩罚向前面的那个系数。 原来是这样,那我们再来讲讲这个模型的变异和训练,就是在 compile 这个函数里面我们都配置了哪些东西? compile 里面就是要分别给判别器和生成器设置它们的优化器,然后还要指定它们各自的损失函数, 嗯,就这些东西都是要单独设置的,因为它们两个的更新方式是不一样的。没错没错,那我们下面要讲的就是这个梯度惩罚的实现。对,这是 wjngp 里面非常有特点的一个地方, 那你能不能详细的说一下这个梯度乘法它到底是怎么计算的?这个梯度乘法它其实是首先要在我们的真实样本和生成的样本之间去做一个限性差值哦,然后得到一个差值后的样本, 接着我们把这个差值后的样本喂到我们的判别器里面,再计算判别器对它的梯度。最后我们要把这个梯度的 l 二泛数和一的差的平方 去做一个平均,就得到了这个梯度乘法项。这里面有一个细节啊,就是为什么我们要对这个差值后的样本去计算梯度乘法,而不是直接对真实样本或者生成样本去计算。因为我们的目标是要让判别器的这个梯度的泛数在整个数据空间上面都能够接近于一。 嗯,所以我们要在真实样本和生成样本连成的这个线段上面的每一个点都去做这个约束,而不仅仅是在这两个端点。 ok, 那 这个 train step 里面到底都发生了什么?它是怎么去协调这个判别器和生成器的训练的?然后这个梯度惩罚又是在哪个环节被引入的?在每一个训练的 step 里面,它首先会根据我们的这个 step 去决定要先更新几次判别器 哦,然后在每一次更新判别器的时候,它会先从我们的引空间里面去采纳一些随机的项链,然后用生成器去生成一些假的图片, 之后把这些假的图片和真实的图片都喂到我们的判别器里面去,得到他们的 logits。 听起来很复杂啊,那这个时候损失是怎么算的呢?这个判别器的损失就是真实图片的 logits 的 均值减去假的图片的 logits 的 均值,然后再加上我们这个梯度惩罚项 哦,这个梯度惩罚项是要乘上一个权重的。对,最后我们再用这个损失对判别器的参数去求梯度,然后做一次更新。我大致明白了,那生成器的训练和损失计算又是怎么做的呢?生成器的话,它其实也是一样的,要先从引空间里面去采纳随机向量, 然后生成假的图片,之后把这个假的图片喂到我们的判别器里面去得到一个分数,嗯,那他的损失就是这个分数的均值的相反数。对,然后也是对这个生成器的参数去求梯度,最后做更新, 这样的话就完成了一个 step 的 训练,最后它会返回判别器和生成器的损失。那么接下来要讲的就是怎么去自定义一个回调函数,对,来保存我们生成的图片。那这个 game monitor 这个回调类它都做了哪些事情?就是这个 game monitor, 它其实继承了 clears, callbacks, call back, 然后它在出场的时候会去指定我们要生成多少张图片,还有就是这个影像量的维度,嗯,然后它会在每一个 epoch 结束的时候去随机的采集一些影像量,然后用我们的生成器去生成图片, 最后把这些图片保存到本地。好的,那我们现在就要进入到这个模型训练的环节了。对,你能说一下我们在训练 wga gp 的 时候用到了哪些关键的超参数吗?在这个训练的过程当中,我们的生成器和判别器都是用的 adam 优化器, 然后学习率是零点零零零二, beta 一 是零点五, beta 二是零点九,嗯,然后判别器的损失我们用的是假的图片的分数的均值减去真实图片的分数的均值, 生成器的话就是假的图片的分数的均值的相反数。听起来很专业啊,那我们这个训练的过程当中有没有什么特别要注意的?这个训练的 epec 我 们设置的是二十,然后 batch size 是 五百一十二,同时我们还会用到一个自定义的回调函数,就是每一个 epec 结束之后会帮我们保存三张生成的图片 哦,然后整个的训练过程就是调用这个 fit 函数就可以了。明白了,那我们这个训练过程当中损失值有什么样的变化?我们可以看到在第一个 epec 的 时候,判别器的损失是负的七点九五, 然后生成器的损失是负的十五点一六。对,然后到了第二十个 epec 的 时候,判别器的损失变成了负的二点七九,生成器的损失变成了负的二点九四,嗯,就是它们整体都是在上升的,然后也慢慢的收敛了。 嗯,所以说我们这个训练出来的这个生成器,它最后生成的这些图片,视觉上看起来效果怎么样?你可以直接看到最后一个 epop 生成的三张图片,就是它已经能够很清晰地生成一些 fashion minister 里面的这些衣物的样式了。对,就虽然它还不是完美的,但是它已经能够抓住很多这个数据集中的一些细节和特征了。 好的,今天我们从原理到代码完整的实现了一个 w g n n g p, 然后用它来生成了一些 fashion amnes 的 图片,然后也看到了它是怎么通过这个梯度惩罚来让这个训练变得更稳定的。 那这就是这一期播课的全部内容了,然后感谢大家的收听,然后我们下次再见吧,拜拜。拜拜。

你是不是每天都在自我怀疑,觉得代码跑不通,损失函数乱跳,甚至觉得导师看你的眼神里都写着,这学生没救了?你觉得自己是个科研废物,甚至想过退学?记住,读博读研不是拜师学艺,很多导师自己都三年没敲过一行代码了,他们比你还虚。面对这种环境,你指望导师良心发现,手把手带你的 bug? 别做梦了, 你要做的是认知重构。下面三条生存法则,把你的科研从师徒模式切换成自救模式。第一条,把导师从审判者降级为资源提供者,他提供服务器,虽然卡的要死,提供数据虽然很脏,提供那个能让你毕业的签字。至于技术,他可能还没见面上的回答靠谱。不要因为他一句你这个实验没意义就否定自己, 你要做的不是讨好他,而是利用他的资源完成你自己的毕业目标。记住,你跟他之间,是你用劳动换文凭,不是你用灵魂换认可。第二条,别在硬科原创学会拿来主义, 你导师给你挖的坑,大概率是没人能填上的废坑,你还傻傻往里跳。正确的做法是去 get, 找一份高质量的开源代码,跑通它,然后把它的模型拿到一个没人做过的小众应用场景上,改改输入输出,跑通对比实验,这叫降维打击,不叫抄袭。你的目标是快速产出一篇能毕业的论文,而不是给那个不回你消息的老板攻克十几难题。第三条,守护你的心理能量,别让实验室吃掉你, 你的核心资产不是那几行破烂代码,也不是导师的脸色。在实验室里学的是抗压,但职场上人家看的是你解决问题的能力。我见过一个被导师 pua 到想退学的学生,我告诉他,别再跟导师磨,直接用缝合大法 两周搭好框架,一个月跑通实验,录用通知到手那天有了成果,才是他口中的得意门生。如果你现在正深陷实验死循环,不知道方向怎么选,不知道怎么结合自己课题落地,别在自己瞎琢磨了,大瓶打自救,七哥陪你少走弯路,直接弯道超车。记住,实验是冰冷的,但你的前途是滚烫的。别让一张聚稿信毁了你对科研的所有热情。

揭秘 ai 大 脑第四集,损失函数反向传播与梯度下降,误差逆向喷涌与迁移为盲人下山。 前三集,我们完整目睹了数据在大模型身体里的前向传播史诗。从此像亮的空间安家,到自助毅力的动态染色,再到前馈网络的高维折叠, 但整个数学机器有一个一直被隐瞒的终极前提,那些控制空间怎么升维,光束怎么连线,空间怎么扭曲的万亿级参数,最初不过是一堆完全随机生成的毫无意义的数字造声。如果把初始的大模型直接推上战场,它吐出来的只会是乱码。 那么硅基大脑是如何在暗无天日的虚拟炼丹炉里萃炼成智能体的?模型的进化始于对失败的觉察。 大模型采用自监督次词预测为给他一句话的前半句,让他猜下一个字。假设训练集里写着床前明月光,疑是地上,正确答案是双,但由于参数全是乱的,模型算出的概率分布是写百分之七十注,百分之二十双百分之一。 为了用数学量化这种愚蠢,我们引入交叉商损失函数 l 等于负的求和 e x 以 log y h i 真实标签霜的概率为一,模型预测只有零点零一,那么损失值 l 就是 负的 log, 零点零一产生一个巨大的正数, loss 越大,代表模型的幻想与现实世界的鸿沟越深, 知道了错得有多离谱。接下来,要把责任精确落实到上百层网络万亿个参数里的每一个数字上。 数学家掏出了微积分的终极武器微元连成练式法则。假设最终的损失是 l 某一个底层前馈网络里的权重参数是 w。 我 们想知道 w 变动一点点对最终的 l 有 多大影响,即求偏导。根据多层复合函数求导法则,误差会从后向前一关一关倒退。 在代数计算上,这表现为一种宏大的逆转。在最后一层计算出的 loss 信号化作数据逆流,顺着残差网络的高速公路和矩阵连线,从最后一层疯狂向第一层倒灌。当这股逆流穿过每一个参数矩阵时,都会根据列式法则为该矩阵里的每一个数字计算出专属的梯度。 在几何世界中,大模型的训练是一场在高维域宅空间里的盲人下山奇旅。如果大模型只有两个参数,它们和 loft 之间可以化成一张三维的山谷地形图。山峰代表损失极高,模型的胡言乱语, 谷底代表损失最低,完美契合人类语言。但现代大模型有上千亿个参数,这是一张生活在千亿维空间里的超级几何地形图。山路错综复杂,充满了无数的马鞍面、悬崖和死胡同。 大模型优化器让参数化身为一个在千亿维大山里摸黑下山的盲人,因为维度太高,他看不到谷底在哪。 梯度在几何上指向的是当前位置山坡最陡峭的上升方向。我们要想最快下山,只要朝着它的反方向负梯度方向迈出一小步即可。 这就是权重更新的几何本质。 w 等于 w, 减去学习率乘以偏导。在高维矩阵网络中,数万亿个混乱的数字噪声在这一瞬间同时接收到了下山指令,他们齐刷刷的改变了自己的数值,向着更符合人类逻辑的几何谷底集体挪动了一丝丝。 大模型在训练时是以每秒数万亿个词的速度,在成千上万张显卡组成的算力集群里同步进行前向猜字、计算损失、反向倒灌、批斗下山的死循环。这个过程要重复几个月,消耗数百万度电,重复百亿次。 在这场疯狂的几何危机中,高维空间里发生了惊天动地的拓扑之变。原本随即乱晃、毫无章法的自助屹立光束,在无尽的下山路径中开始死死锁定人类语言的主谓宾关系,只带关系和情感基调, 原本无需折叠、只会制造噪声的乾坤网络空间开始自动沉淀、分层,固化出物理、历史、医学等人类世界的逻辑常识与因果法则。当损失终于收敛到平缓的谷底时,训练戛然而止。万亿个参数在这千亿维的数学山谷里找到了一个极其精妙的动态平衡位置, 它们不再是冰冷的数字,而是被人类文明的数据洪流雕刻出的具备了逻辑重组能力的硅基大脑。 至此,我们用四级的篇幅完整走完了大模型的全部梳理。美学构建第一级,文字,打破异维束缚,变成高维空间分布的几何粒子。第二级,粒子之间拉起自注意力的线,通过重心引力瘫梭,学会看懂语境。 第三级,线条汇聚成面,在前馈网络的非限性拓扑折叠中榨干特征。第四级,庞大的数据留在反向传播的微积分洪流中反复洗礼,在千亿维的地形图里寻找到那座完美的理性谷底。 大模型没有魔法,它只是将人类浩瀚的文字文明彻底翻译成了空间的几何,再由极致纯粹的几何催生出了震撼世界的数字智能 大模型没有魔法,只有几何。感谢观看。

卷积神经、网络反向传播损失函数,每个字我都认识,连在一起,就像天书网上那么多 ai 教程,从入门到放弃, 我只用了十分钟,还在跟那些术语死磕呢。我之前也这样,直到我发现不是我们笨,是方法不对。你有什么秘诀,快说!上抖音精选,你看,同样是看视频学习,你点这个 ai 标识按钮,它这里有个视频总结功能, 随便点开一个十几分钟的教学视频,点一下,它就会自动把核心要点提炼成几个小标题,甚至生成文字笔记,不用从头看到尾,哪里不懂点哪里。 还有这个视频章节直接跳转到你想看的部分,效率直接翻倍!天呐,这不就是给我这种小白量身定做的吗?不止这些,你遇到不懂的概念,直接语音问 ai 问问, 他会当场给你解释,不用跳出 a p p 到处搜。其实学习没那么难,只是以前没人帮你把路标立好,现在路标就在这了,这也太棒了,怎么不早说啊!