粉丝1.6万获赞16.5万

维策百倍猛如虎,实盘爆仓二百五。你是不是经常遇到这种情况?这不是你运气差,是机器学习量化的头号杀手。过你河,他和兄弟欠你河是所有新手绕不开的两道坎。你以为是模型不行, 其实很多时候是参数没调对。今天我们不聊概念,只聊能落地的高级参数调优,而且每个参数我都掰开揉碎,是什么?怎么调?看完你就能从凭感觉过渡到轻松驾驭。 先给你一张新地图。这集按共性主干加个性补丁来讲,第一段先讲三模型通用训练参数, 再补 lstm 和 transform 的 批次大小。第二段先讲 light gbm 结构,再讲 lsm 和 transform 的 通用结构,然后单独补 transform 注意力投述这个关键参数。 最后一段统一讲正则化浊泡,把过你河和欠你河的动作统一收口。先把三模型共有的训练参数放在一起, 训练轮数学习率、验证级比例早停、容忍轮数。训练轮数决定模型,把训练数据完整学习多少遍。学习率决定每次矫正的步子大小,步子太大容易抖,步子太小学得慢。 验证级比例零点二表示前百分之八十数据用于训练,后百分之二十数据用于验证。早停容忍轮数就是过你和刹车器。验证级连续 n 轮没改善 就停止训练,并保留最佳轮。当验证级比例不为零,系统会先用验证级找最佳轮数,再按最佳轮数做一次全量训练。 如果把验证级比例设为零,就会关闭这套自动叫验。这种方式更适合非常熟悉数据的人手动接管这四个参数是调餐的节奏层,先把这层调顺,训练才不容易跑偏。现在补一个只属于深度学习训练模型的参数,批次大小, 它在 l、 s、 m 和 transform 里都很关键, p 次变大,吞吐更高,梯度更稳,但显存压力会明显上升。 p 次太小,噪声会变大,训练更容易抖,速度也可能变慢。建议从六十四或一百二十八起步,先保证能稳定跑完一轮。 如果报内显存,优先降批次,不要先动模型结构批次大小本质是速度稳定性和硬件资源的平衡器。一般情况下,训练参数不必全手填,留空某个参数就表示交给模型自适应。 下面进入结构层,先讲 lgbm 的 三个结构参数最大深度决定树往下能长多深,建议先收窄在五到六,深了更容易过你核。叶子节点数决定树能切出多少细分区域建议二十到二十八,过多容易记住噪声 子节点最小样本书是分裂刹车片,建议六十到一百,调大后分裂更保守。结构参数可以理解为容量上限要适你的数据量而定。一句话,记忆深度管纵向叶子管横向最小样本管刹车。 从数模型切到十序模型,我们看一组通用结构参数。第一个序列长度决定一次回看多少时间步。第二个模型维度决定输入因子会被转换为多少维度。 第三个层数决定持续网络堆叠的数量。这三个参数都是越大你核能力越强,但计算成本和过你核风险也会同步上升。如果出现过你核,优先考虑减小序列长度、模型维度和层数。 这组三参数是 a, l, s, m 和 transform 共通的结构,股价 transform 在 共享结构之外多一个独有参数。 注意力头数可以把它理解成同时派出几位分析师,大家看同一份行情,但各自在不同特征子空间里分析,但头数不是越多越好, 头太多会把每个头分到的维度切的太薄,最后谁都看不深。最关键的应约束是模型维度必须能被注意力头数整除。 最后,把三模型通用的政策话放在一起讲,样本抓跑和特征抓跑,他们的目标都一样,别让模型死记硬背,逼他学会更稳定的规律握你何时优先上条猪炮,欠你何时适当下条抓炮。 调整时一次只改一个参数,避免归音混乱。经验起步值可以放在零点二,再根据验证结果微调一句话,记忆先定结构,再定训练,最后用正则话空过你核。 现在给你一套固定流程,把今天的参数体系落地。第一步,先跑姿势参数和回测结果。第二步, 判断问题,过你和还是欠你和。第三步,过你和就收结构加猪跑, 欠你和就反过来。第四步,单变量调整,每次只改一个参数。第五步,看回测结果的可能性,并所参数把结果沉淀成,下次可附用模板。 恭喜你完成了我们 ai 机器学习与量化交易的完整课程,金融炼丹长路漫漫,别担心,有我一路相伴,从策略认知到参数调优,你已经摸到量化机器学习的门道。关注我,带你继续拆解更多量化交易的核心机密!

今天和成都摩森理工九八五教授聊天,他说他说的现在很多学生啊,对于神经网络的看法就是我推底层的微积分啊,算数理公式他没有什么用,他是非常浪费时间的,那他是不是真的呢?其实他是真的, 就是如果说你做学科交叉的话,用 ai 解决某一个问题,那确实别推,你推完了把所有的模型微积分都算好,那还不如多加点数据呢,是吧?嗯, 那如果说是像奥特曼或者姚晨宇在腾讯那种底层算法的数理工程师,他肯定是要整好这些。但是我们在做实际交叉的时候,经常会出现一个问题,就是你现在收集好数据了,哎,上网一搜,或者问 ai, 我 用什么模型啊? ai 推荐了一个,发现 跑的效果不怎么样,然后再去问 ai, 他 告诉你是什么问题啊,可以加点正则话,激活函数用的不好,改一改神经网络的参数,然后 你调完以后发现效果其实差不太多,这时候就觉得神经网络它是一个黑盒,是计算机玄学与技术。其实在选择模型上,它有一个 非常简单的办法,就是能解决这个市面上百分之七十关于找模型的问题,怎么做呢?就是听我说啊, 我们先凭空捏造一个假的数据级喂给你的模型,假如说你的数据输入是一千个样本,每个样本是一千乘十,那么你现在就用高斯文布生成一个纯噪声输出的标签,全部 随机生成零或者一的二分类标签,你别管你的任务是回归还是多分类,我们现在就测它的模型可不可以,你现在就改成二分类,最后一层加个线圈层和 sigma 的 就可以了。 我们现在把噪声输入了,预期的结果是什么呢?因为输入全是无规律的噪声,理想的情况下,你的模型应该啥也学不到啊,最终的准确率到百分之五十左右,就像抛硬币似的, 如果跑完的结果不是百分之五十,那就说明模型有问题。如果准确率高于百分之五十,或者啊他百分之八十了,或者百分之百了,那你啥也别说了,要换模型,你的数据量对当前的模型来说它太少了,它的模型容量比较大,直接把所有的样本全都记住了, 等你换到真的数据的时候啊,大概率也会过你和,然后你就去问 ai, 就是 怎么换一个小一点的模型就可以了。现在呢? 第二种情况就是你的准确率远低于百分之五十,然后你看看他的损失函数,他一直都不降,这时候你看一看你的优化器是不是呃 item, 因为他默认的时候都会设置 item, 如果是的话,你就给他换成 s j d 啊,上网一搜就知道,很简单,一行代码的事, 你把它的学习率调低,调成很低,比如说零点零一,嗯,因为 item 在 结构里面一阶曲,它有一个动量的参数,它会对这种随机造成可能会有一点问题。 第二步呢,就是你把这一层和最后一层的权重梯度打印出来,就是 print 出来,如果它很接近于零梯度啊,那它就消失了,你把网络搞的浅一点就好了。 然后第三步,你看一看 ai, 呃,给你的这个模型的最后一层是不是 b c with logis loss? 如果是的话啊,那就把 sigma 的 去掉,如果不是,嗯,其实加个 sigma 的 也没有什么问题。 ok, 还有一种情况就是,你你,你看看你的准确率,本来是百分之五十,但是逐渐的它低到很低,远低于百分之五十了。这时候你去跟 ai 问怎么加 t 度裁剪, ai 可能会告诉你,就加一个一点零的域值啊,避免 t 度爆炸,把参数给炸没了。 具体原理其实你感兴趣可以自己搜一下,你问 ai 就 行。第二步呢,就是你查查你的输入是不是造成就,你要确保他始终都是随机造成啊,那就没什么问题。第三步, 嗯,就是你发现还不行,那你就用你的这个随机造成跑。一个简单的逻辑回归,如果他能跑得通,就说明你原来的这个模型太复杂了,就是不是太大,是太复杂,太不稳定了,你稍微得捡点东西。 就是,我现在试了所有的办法,哎,都不能把准确率稳定到百分之五十左右。那只有一条,可能就是你的随机数据搞错了,你确保他的输入里面没有标签,两个人完全独立就好了,没有别的可能。

来吧,兄弟们,很久没更新了,最近实在是太忙了,今天讲点有用的,之前那些视频呢,有十六万人看过,后来有兄弟跟我反馈说啊,这个方法确实很实用,但是吧,我没办法把市面上每一个模型都拿来试一遍 是吧?那个方法呢,只是让你先去判断一下当前的模型合不合适,如果说不合适,我们先快速的找五到十个模型。怎么做呢?啊,我尽可能通俗易懂的跟你讲啊,你听我说,把你所有的训练数据先保存为原始的二进制的格式, 比如说如果说图像的话,你就保存成二 a w 的 格式,然后如果说数值的话,就是 b n n 的 这种文件,那这不就是有文件了吗? ok, 看一下这个文件的字节数 d, 然后咱们先放这不动啊,然后现在去找模型了,看它训练好的权重的 p t h 文件到底有多少兆。如果说它没有这种开源的训练好的模型,你就去看一下大概它的参数量有多少,参数量的四倍 大概就是这个数值。之后呢,把它比一下,如果说这个值小于零点二,那他大概率会过你欠你和。如果说这个值大于一点五,那他大概率会过你和。或者计算总余,你选最接近零点六一八的五到十个模型。 ok, 这不是有几个模型了吗?现在我们第二步再删,把你的训练数据的输入的每一个样本都直接展平成一个一维的向量,直接展平,然后做 pc, 也就是我们通常说的主成分分析,我们要看它有多少个主成分。 这里听不懂,没关系啊,你就把下面这段代码在你的数据上跑一下,最后得出的 k 值越大,你的数据空间复杂度越高。那我们最终的目的是筛选模型,是不是应该找一个内部复杂度和我数据空间复杂度比较匹配的模型啊? 怎么算呢?这里给大家一个简化的公式,就是你模型总共可以训练的参数取 log, 注意啊,是参数的个数,然后再除以模型的层数的 log, 比如说,那么七 b 那 个模型就有三十二层,那么大概就是呃 log 啊,七倍的 e 的 九次方,然后比上 log 三十二, 这个值大概是,呃,约等于六点几啊,约等于六点几。 ok, 模型和数据的复杂度我们是不是都知道了?然后我们用这个模型的复杂度,假如说我们是 r 去减去之前算出来的 k 的 十分之一, 这个会算出来一个得分,那么这个得分数最小的两到三个模型,你你选它肯定没错, 这里听不懂,可以啊,评论区留言一下啊,然后我会看一下,然后你拿数据训练一下啊,把模型都保存下来,就这么两到三个模型,很快的,然后下一步有用。另外呢,如果说你的数据的复杂度已经很低了,假如说刚才的那个 k 值已经小于五了, 其实就可以选择这种复杂度而小于三的模型了。第三步呢,我们现在要在这两到三个模型当中,选一出一个最不受我数据里面造成影响的模型。 你得先分析一下你的数据噪声是什么类别,之前不是把啊数据直接展平了吗?把所有样本拼接起来, 然后用 excel 绘制成一个折线图,如果说你的折线图的波形像这样,就像心电图一样,它就是白噪声,你的贝塔大概是等于零。如果说波形像波浪一样,哎,波浪一样,我们叫它粉红噪声。比特值大概等于一。如果说 波形是慢慢漂移的,我们叫布朗噪声啊,比特值大概等于二。这个是简化版,如果精确计算,就是差分序列的方差比上原始数据序列的方差比值接近于一呢,就是白噪声接近于零就是布朗布朗噪声 啊。但是选模型你不用这样,不过你可以后期对这个有一点印象,可以和导师或者领导吹吹牛。 ok, 我们继续说啊。第二步呢,生成和你数据形状完全相同的一百条随机造生样本,和之前十六万人看过的那个视频输入一样,把这一百个 造生样本输入到你第二步,训练好的那两到三个模型里面,他不是会有一个输出吗?如果生成的结果内容差不多, 哎,这个模型就比较不错,如果每一次都不一样,模型就不是很行。为什么呢?因为输出的差不多,证明模型比较自信。其实我是为了好理解才让你肉眼看。真正梳理办法是计算这一百个输出的平均商有公式,公式呢啊,就是这个, 我们选择模型的时候一定要选商最小的那个模型,但是太理论了,其实没有必要,你能学会这个方法,然后选出合适的模型就可以了。像我这样讲的,这样的选呢,选出来的模型你和和鲁邦性的问题就能解决了。另外,其实每个任务有一点不太一样,最近找我答疑的有售博,也有初创企业的老板, 无论你是谁,如果说你已经看好了几个开源的模型,一定要注意一点,就是说太新的模型可能见过你的数据 啊。太旧的模型近期的知识储备又不是很足,所以说你应该去看一下这个开源模型什么时候训练完的,选一个时间上的中位数比较好。

别再死磕大模型了,百分之九十的深度学习创新根本不用啃 transformer 改,对特征提取模块性能暴涨,参数狂降,论文数据直接翻倍! 第一步,锚定基础框架。别一上来就模改网络结构,先找一篇领域内公认的基线论文,比如 resnet、 优酷系列,用它的代码跑通基线结果。这一步的关键是复制粘贴成功,确保你的实验环境能复现原论文性能,否则后续改进全是白搭。第二步,爆改特征提取层, 这里才是性价比最高的创新战场。给你三个闭眼改都能涨点的模块。一、多尺度注意力融合模块。举个例子,你拍照时是不是得聚焦重点? 模型也一样,传统方法对大目标、小目标一视同仁,小目标总被忽略咋办?在特征金字塔里加个注意力开关,就像给模型装个放大镜,先扫描每个特征图,算出哪些特征重要,再给重要的特征多加点关注。 这样一来,小目标也能被精准捕捉。在 coco 数据集上,实测准确率能涨百分之零点五到百分之一。二、结构化增强模块,遇到纹理重复或者目标被挡住的场景,模型是不是经常脸盲?别急,给他加点几何常识。比如提取特征时,把像素之间的位置关系也加进去,就像给特征贴上坐标标签。 举个简单的做法,用可学习的高斯和深层对位置敏感的特征图,再和原来的外观特征拼在一起,这样哪怕目标被挡了, 靠着位置结构信息也能准确定位。三、羽翼引导特征蒸馏模块,高精度大模型,参数太多,部署时卡到崩溃,教你一招瘦身术,把大模型的智慧浓缩到小模型里。训练时,让小模型不仅学标签,还学大模型中间层的特征,再结合羽翼分割的弱监督信号一起学, 这样小模型也能有大模型的大局眼光。参数砍一半,精度也就掉百分之零点三。第三步,循环迭代优化,改完模块别急着交论文,用迭代注意力再优化一下,第一轮融合后挑出好的特征,第二轮再融合,剩下的 就像揉丸子一样,把特征越揉越好,模型的泛化能力直接拉满。搞创新不是重新造轮子,而是把现有模块组装成高达。这三大模块的代码打包,全部都放在论文封和大法里。评论扣模块,七哥安排!

今天的内容非常适合大家刚刚要开始去学习深度学习零基础的同学,那么今天的内容呢,会是大家在具体的去学习某些算法,某些数据的处理的方式,这些具体任务,具体的知识之前要先能够 去了解的啊,一些基本的问题,那我就给他做深度学习第一课。所以如果呢,你现在也是刚刚要开始去学习深度学习,你现在可能也会面对很多的困扰啊,比如说有一下子特别多的概念将涌入出来,所以你可能会对于这些概念在学习的过程当中,因为新东西太多了嘛, 就有可能会有一些不太清楚,或者是不太好弄明白的地方。我们今天的内容啊,一次课咱们就把基础的时候啊,需要去做的那些基本的准备都跟大家去看一看啊,这是我们今天的内容, 所以我们今天的内容呢,对于大家要开始学习零基础的同学会非常友好。首先呢,我们先来认识到底深度学习是什么啊? 我们所说的深度学习经常会配合着机器学习一块,看到大家也经常会在这两个概念这里呢,可能会有一些迷惑,实际上机器学习呢,就是借助了机器的学习过程帮我们来解决问题, 深度学习就是机器学习若干个解决问题方式当中的一类,所以讲过这两句话之后,对于这两个概念你可能有了一个大概的认识,如果说他们的关系的话,那么就是机器学习 包含深度学习。我们现在讲到的这么多的深度学习,只是在机器学习若干方法里边,大家目前比较关注的比较主流的一类方法 啊,那么它是基于神经网络的比较深的神经网络的模型就叫做了深度学习,但他们都是机器学习, 所以要学深度学习,也首先先去看看机器到底如何学习,机器学习的目的是什么?他和深度学习的过程和目的都是一致的啊。深度学习就是机器学习若干方法里边的一个啊,主流的目前大家比较关注的一类方法。 深度学习呢,也依旧要通过机器的学习,所谓的机器的学习就是咱们之后在真正落地的时候训练的过程, 所以训练是来进行了机器的学习啊,他们就训练的本质就是去完成学习的过程啊,学习的过程就是由训练解决的,通过这个学习和训练,最后我们找到了一个模型,而这个模型呢,就是用来解决问题的那一个函数。 举几个例子来看,比如说我现在要解决的问题是文本翻译,那么我要通过训练这个过程,最终帮我找到了一个文本翻译的模型。 那比如说我现在想做的是图像分类,通过了相应的训练过程,最终找到了图像分类的模型。 所谓的模型,通过这样两个表示的方式,你会发现它其实就是个函数,你要给模型输入, 那么模型经过一系列的运算之后,得到模型的输出,就像函数一样,你要给一个函数输入,函数中间他包装了现在对应的固定的运算步骤,那么就得到了函数的输出,所以模型你就可以给他理解成是复杂的函数好了, 那么函数有输入经过,这个把输入放到对应的函数里边,经过一系列的运算得到输出,那么输入和输出之间,我们说这有一个函数的运算步骤,其实呢,这对应的就是我们当前的模型是怎样的一个结构 啊?所以模型就帮我们去解决了由输入到输出之间的映涉关系,这就是模型啊,所以呢,文本翻译这里我们要解决文本翻译这中间具体的映涉关系这件事,有它的模型的结构, 那么图像分类要解决啊,图像分类的输入到输出之间的这样的关系,有它的模型的结构,但总之我们要说的深度学习在干嘛呢? 就是通过训练的过程帮我们来找到当前你的任务相应的模型,那么到底模型我们已经知道它是什么了,就是解决问题的一个函数啊,那这些模型我们要怎么找到呢? 我们来看几个简单的问题啊,现在我们看到的这样的一些点啊,这个点有它的数值 x, 这算作我们当前的输入以及它的 y 输出,所以对于这样的一些坐标当中的点来说,它的模型就是一个 w, x 加 b, 我们可以把这个 x 啊,当前的所有这个横坐标和 y 这个点,他的 x 和 y 之间的关系,用这样的一个公式可以去给他表示出来,如果我把这里边的 w 和 b 也确定下来,那么这条线就能够确定下来了, 所以如果我们有现在的这样的一些关系,什么关系呢?横坐标 x 和 y 啊,和 y 的 之间的这些关系,我们用这些点来表示出来的话,我们就可以用这样一条线来表示他们的关系, x 和 y 的 关系。那么如果我已经确定这是一条线能够表示出来的,下一步就是来看看这里这条线现在能够确定下来的时候的这个 w 和 b 的 值是什么好了。第一是它的运算方式,我用了 w、 x 加 b, 第二是里边 w 和 b 具体的取值,这两件事都确定下来的话,那么我们当前的这个模型就能够确定下来了。 所以一个模型的确定包含两个方面,第一是你这个预算步骤,那怎么算?第二是在预算步骤当中所涉及到的所有的参数取值。对于简单的这个现象的模型,我们就能够这样去确定,再复杂的模型它的确定也都是包含这两个方面。第一模型的结构 x 进来要经过怎样的运算?第二,运算过程当中所涉及到所有的参数的取值,我们已经现在脑子里边清楚了啊。一个模型的确定要包含两个方面, 第一是它的结构,第二是这个结构里边所有的参数的取值。那咱现在就来看看这两件事都能怎么去确定。先来说结构怎么确定, 你所看到的你要关注的那些论文当中的这些模型结构图,它表示的都是咱们所说的。第一件事就是当数据丢进来以后,要经过怎样的运算步骤,先乘还是先加?还是要怎样 一步一步怎么去把数丢进来的数据一步一步计算得到的输出。每一个所谓的模型的结构图来表示的都是这件事, 比如说这是 transform, 大家可能见的比较多,我的数据丢进来了以后啊,一步一步怎么去进行计算?先经过先经过了注意力,又有了加,又有了 nom, 又有了全连接,是吧?这样的块又堆堆了若干层,一步一步最后呢,经过了全连接,又经过了 softmax 得到输出。你看这张图告诉你的就是数据进来怎么一步一步的运算,最后得到的输出。这个图是 unite 也一样,数据从这进来了以后,这是图像数据,图像数据进来以后,我们先经过了卷接,又经过了池化,又经过了跳跃连接,一步一步预算,怎么得到的输出?就是这张图给你呈现出来的信息。每一个所谓的模型的图结构都是来告诉你, 都是来告诉你数据进来了以后,怎么一步一步去进行预算的,一直得到最后的输出。 ok, 这就是模型的结构图,来告诉你什么的好 同学们,这个模型的结构图对应告诉你的数据进来要经过怎样一系列的运算步骤,它就是个搭积木的过程,第一个积木块是注意力好了,那你就进来做注意力那样的运算步骤,先去计算 k v, 由 q k v 得到注意力的计算的注意力分数,由注意力分数再加求和。 那全连接呢?就是全连接的运算步骤,那你反正这个图告诉你的就是数据进来第一步干什么,第二步干什么,一直到输出。每一个模型结构图给你呈现的都是这个信息。第一运算的步骤就是模型的结构所包含的信息,那么这个里边就有大量的参数, 如果你已经能够确定模型的结构,咱们就可以继续往下去找参数了。如果你现在的任务你不知道要用什么结构啊,那就说明你对于这些结构里边的模块不熟悉,因为每一个结构啊,比如说注意力也好, 全连接也好, add 也好, nom 也好,它在这个结构当中所出现的时候,都有它在这里想去解决的问题有它的意义。你对于每一个模块如果都有一定的认识,你自然知道你现在的任务要选择什么模块去构建模型了 啊,或者你可以用比较主流的几个哪些模型来解决你的问题,不熟悉你去学啊,还没有学的话,你可以参考一下当前你相关的一些论文,找一找方向啊,这个不是我们今天的重点,我们今天不是来讲某一个结构,而我们今天讲的是整个深度学习的过程里面这些基本的问题。 所以结构每一个结构都有他在设计过程当中的特点,了解他的特点,然后选择你的任务适配的结构就 ok 了。那么结构自己去确定啊,确定下来以后,我们来看参数如何找 找参数的过程就是咱们所谓的训练过程,所以模型的训练其本质就是在调参。 好了这句话,一会我会带你去看他中间的过程具体一二三步是怎样的。那总之呢,我们找到了参数,结构呢,也在之前确定下来了啊,结构里面的参数也都确定下来了,我们就可以完成当前的任务了啊。比如说我现在是想能够得到一个图像分类的模型 结构,我先去自己跟着,根据我的理解去确定,为什么?因为我现在是图像分类啊,所以我从我的认识上面我就知道,对于图像处理这里如果是图像分类,我可以选择一个比较经典的图像分类的卷积神经网络,比如在这儿我用了 alexite, 我 为什么用 alexite? 我不用,我不用 url, 我 不用 transformer 呢?因为我对于模型的结构有我的认识,我认为在我当前的任务选择它比较合适,还是刚才那句话是基于你对于深度学习这些底层模块的认识的。 好了,我现在呢选择了一个结构,这个结构就确定下来了,我就可以去训练模型。训练的目的是在当前确定下来的结构里边找到所有参数的最优值。 那么这个训练的时候有两个前提,第一就是你是一个什么结构啊?他对应有哪些参数?第二呢, 结构确定下来以后,咱们去训练找参数最优值的时候,一定要基于当前的经验数据,这就是为什么所有的机器学习也好,深度学习也好,一定要有数据的原因。我们是根据这些经验数据去找当前结构里边这些参数的值到底应该有什么样的一个 合理的取值的。 ok, 我 们下面要去看训练的步骤是怎样。首先你先清楚训练在干什么, 模型的训练其本质就是调参的过程,训练的过程就是在这里参数的调优过程,来看到底这个调优的过程是怎样完成的。所以现在我们来看模型的训练过程。 好训练的时候啊,在训练这件事具体开始之前有两个前提,刚才其实 ppt 里面有显示啊,第一,你得先确定这个模型的结构到底是怎样的,是卷积,是全连接,是注意力结构,先确定下来。 那么第二呢,就是你在调整参数的过程当中,一定要有当前用来进行模型参数调优的经验数据,这就是咱们所说的训练级 结构和你现在能够去调参数的这个训练级都准备好了,咱就可以来进入到了模型的参数调优过程了,也就是训练过程。这是两个前提,在参数的调整之前,也就是在训练之前,这两个前提是要先做好准备的。 好,做好准备了,我们就来看看这个参数的调整是一个怎样的过程。首先,我的模型结构已经有了啊,我的经验数据也已经有了,我会在经验数据里边来选择一个样本啊,或者是一组,这个不重要。总之呢,我先选择一个样本丢进我的模型, 我们说模型就是一个函数,现在你就给这个函数了,相应的输入模型呢,它对应了一个运算步骤,所以你把输入放进来,就会在我们已经确定的运算步骤里边开始进行运算。第一步,第二步,第三步,一直运算得到现在的输出, 那我现在给它丢进去的图像就是我模型的输入步骤,我现在采用的运算步骤就是 alex net 这个具体的模型结构来对应我现在的预算步骤。好了,经过现在模型里边第一步,第二步,一步一步的计算,得到了模型的输出,这是我现在模型的输出。如果我告诉你这样的一个具体的当前啊,确定的七百八十四个数字,就是这张图像所对应的二十八乘以二十八,二十八的这个二维的数字,这个七百八十 四个数字丢进来了,怎么能够最后就能够确定得到这个数据呢?即便结构已经确定下来了,但是每一个层里边还涉及到了大量的参数, 我们已经能够得到最后的输出了,这些参数一定有值,那么这些参数的值现在是什么呢?那么它们具体是什么呢?它一定有具体的值啊,不然的话,我现在没有办法完成运算啊。拿个简单的例子来看,这口水还没喝到嘴里,哈哈, 打个简单的例子来看,比如说这里就是 w x 加 b, 我 知道我现在的 x 是 一了,那我这一步就是有固具体的值,现在是,比如说啊,结果是五,不能加引号啊,结果是五就是数值五,那么 x 是 一,我能够得到五,这个 w 何必一定有当前具体的数值啊? 所以现在我的模型结构已经确定下来了,用 alexnet, 我 把我就这张图像丢进了模型。这张图像的七百八十四个数字是固定下来的,那么得到了模型的输出,中间所涉及到的所有的参数一定有值,对吗? 那么这些值是什么了?哎,太棒了,我看到有答案了,这些在最开始的时候,这些参数的值都是随机数,所以由随机数构成了这些参数当前的值。在随机数的这些值里边,我们就把当前一个数据丢进去,让它计算得到了输出, 所以当前的参数有值,他们的值是随机数,我们就用随机数作为的出使值,开始去进行了模型当前的输出,这是我给他的输入一张图像,这是他的输出,他认为这个数字是二, 当然预测的不好,因为现在是随机数作为的参数的值啊,我们现在因为这些参数是随机数作为他的值,所以他的输出不好,所以下一步我们就要调整参数的值了呀, 所以我们往下看啊。但是这是第一步,我们把数据丢给现在的模型,它的随机数作为它的参数的值的基础上得到了当前的输出,但这并没有结束,我们的目的是在随机数作为初始值的基础上去进行参数的调优,我们来往下看,看看怎么能够完成参数的调优。 好,这是第一步,得到现在模型的输出。这是第二步,由模型的输出和本身这张图像的标签去进行比对,看看我们的模型的输出和当前这个图像的标签,也就是正确答案,看看它们之间差多远。 把模型的输出和图像的 label 进行差值的计算,这个差值就是我们所说的损失值, 那么得到差值的过程也就是差值的运算的这个函数就是损失函数。好了,这里我们就说了到底什么是损失函数以及损失函数的第一个意义,好,那么这是损失函数啊,以及我们在这里第二步要计算损失,我们现在说的是训练过程里面包含什么, 不管说多么复杂的函数,多么复杂的模型,其训练过程都一致。我们现在就拿简单的问题来告诉你所谓的训练这个训练过程是怎样的? 第一步就是把你现在手里的训练级的一个样本拿进去丢给模型,得到模型现在的输出。第二步就是由当前的输出去计去计算得到损失。好了,第三步 可以去调整参数了,那此时这个参数调整的目的一定是要让模型变得更好, 那怎么就算是更好的模型,只要损失值变得更小了,就说明我的模型变得更好了。好了,所以我们已经知道咱们怎么是更好的模型参数能够让损失变得更小,模型就是更好的模型, 同时这些参数也是更好的参数。训练的本质就是参数的优化过程,所以现在我就知道我应当如何去优化我所有的参数值了,只要我的参数是让损失变得更小了,我的参数就是被优化了。 所以在这我要算一算损失,因为下一步我就要往损失下降的方向去调整,去更新所有的参数了。所以第三步就是往损失能够降低的方向去更新所有的参数。 好了,到这里我们由一二三三步就由最初由随机数所构成的损失完成了参数在这里的一次更新 好了,这就是训练过程当中的步骤,所谓的训练的目的是优化参数,而优化的过程就是这样的三步,我们现在要做的事情就是由 刚开始的随机数的 w, 比如说我给它叫做零啊,随机数的这个值经过这样的三步得到了优化了一次的 w, 我 再换个样本进来, 首先我要在我的模型结构这里刚才优化好的这些参数值拿过来作为我现在模型里面的这些参数值, 好换个样本丢进去,在这样已经进行过一次优化的参数基础之上,再来做刚才的事情。 第一步,在现在的啊这个参数以及现在的数据这里得到模型当前的输出。第二步,由当前模型的输出去计算当前的损失。第三步,在当前的损失这里去调当前的参数,也就是我把我的参数由 w 一 就可以变成 w 二了。 这件事还是这样的三步,初使的这个参数值是我们刚才优化过的那个参数值。好了,还是这样的三步,我就完成了参数的第二次更新。 那么第二次的参数更新完了以后,我们就可以继续这么去做,在第二次参数更新的基础之上的模型这里换一些样本进来,再来进行第三次参数的更新。所以这件事咱们可以给他打个包,放到放循环里边。 一步。第二步,第三步。而这里呢,我们每次要换样本,看清楚了吗?换不同的样本进来,来进行这里参数的更新啊,我们把样本这里就循环完了,参数经过了若干次的更新之后,模型的性能就进行了相应的提升, 所以呢,大家当然最后要用代码去进行落地啊,去做你的实验,但代码其实都是工具,都是我们在这里的想法,用工具去进行的实现,所以你看这个过程清楚了,这就是我们训练过程的代码。 那我在这总结了一下啊,第一步,前向传播,把数据丢进来,得到模型当前的输出。第二步,来计算当前的损失。第三步,根据当前的损失去调整参数啊,新的参数一二三三步, 所以呢,我们就经过这样的训练,一二三三步给它打包到一起,放到负循环里边,一直到你认为当前的参数已经达到你想要的 这个标准了啊,达到了你的标准,我们这个循环就可以结束了,参数就可以停止调整了。那么此时我们的模型呢,就完成了它的训练,完成了训练以后就可以进行了,拿它去使用了,所以当我在这里有一些未知的数据,我就可以把它丢给我的模型,我的模型就可以得到理想的输出了。 前面训练的目的就是来找可以拿来使用的模型啊,所以训练完了我们的模型就可以这样来使用了。训练过程咱们就说到这啊,下面我们来看第三个部分,损失函数。好, 那损失函数的作用刚才在训练过程里边大家已经看到了,简单来看,首先就是它,它的第一个作用啊,就是来找差距, 来体现一下当前你模型的输出和你期待的结果之间的差值大小,这就是损失函数的表层意义。找差距 他还有一个深层的意义,深层的意义也和训练有关,刚才在训练过程里边,我们要求损失的目的是能够去找更好的参数,要往损失下降的方向去找当前更好的参数, 所以损失在这里,损失函数的一个深层的意义就是来找方向,来给参数的优化表明方向,那这就是损失函数的作用。 所以呢,你可以的任务结合损失函数的作用去找。当前的损失函数可以写成什么样子,我们可以自己定义,但有几个常用的,我们来一起看一看。 在这里呢,我们从两个经典的监督学习的任务来看他们的损失函数啊,这都比较常用的,第一就是回归问题,第二是分类问题,大家对于什么是回归,什么是分类,应该这个任务都了解,对吗?好,来说一下啊, 首先回归和分类这都是我们的啊,有监督的任务,什么意思呢?我想能够通过机器的学习或深度学习的学习过程,帮我们来找到的函数是来找数据之间的映涉关系的。 比如说我们现在有一张图像,图像里面有个数字好,它的映涉关系就是这个图和这个五,这个五算是个类别,它们之间的映涉关系, 所以有监督都是来找硬涉关系的。再举个例子啊,比如说我现在知道一个小孩的年龄啊,比如说是七岁,我知道他父母的平均身高 h 吧,父母的平均身高,比如说是一七零。好,那我可以来估计小孩现在的身高,比如说这个小孩七岁,假如说是一百二十五厘米, 看到了吗?那么这都是来找应设关系的。图像和这个图像里边是什么数字?这是有应设关系的年龄和父母的平均身高到小孩现在的身高,这中间也是有应设关系的。 九、监督的学习是来找应设关系,他们本身是有答案的啊,所以我们来找中间那个应设关系。在这里, 如果我是要来识别图像当中是什么数字,我已经知道了,图像当中只有一个数字,而这个数字不过就是零到九里边的一个,所以呢,他要么是零,要么是一,一直到九,只是这十个选项里边的一个。 做这样的选择题的任务就是分类任务啊,那当前就是有十个类别,零一二三四五六七八九十个类别, 分类问题就是做选择题,而这个回归问题是怎么样的?我来预测小孩的身高,他可以是一米二五、一米二六、一米二五点五等等,他的直域是个连续空间。回归问题我说清楚了吗? 什么是分类?什么是回归?好,这是分类和回归,对,就是一个离散,一个连续。好了。那么对于这两个经典的任务,我们经常用到的损失函数是这样的,对于回归,在这里咱们最经常用到的就是均方误差。什么意思呢?我把模型现在对于这个样本的预测的值 和这个样本的真实的值之间求个差值,再去给他求个平方,每个样本都这么做,再求个每个样本在这里的均值,就是均方误差。对于回归问题,这里咱们用到的最多的损失函数就是均方误差。 好了,这是回归问题,我们可以用这样的函数来表示他的损失,而这个函数表示出来了以后,一会咱们要去求梯度的时候,他也可导,所以好算, 我们说清楚了吗?这是回归问题。为什么要用均方误差?现在我们来看分类问题,分类问题在这里用的是交叉商,所以呢,在这啊,我们用的是交叉商啊,交叉商。首先你在这里模型输出的是对于每某一个类别的类别概率, 假如说这个类别呢?是在这里,首先分类任务是什么咱们已经清楚了,嗯,假如呢,我们就是两二分类好了,那么正例为一,负例为零,我们现在模型的输出是零点八,什么意思呢?代表它是正例的概率, 所以我们会把这个零点八拿过来和一来进行比对,得到当前的损失值,这是它的损失函数呢,我们用两个类别也好,用多类别也好,本质上都是一致的啊,这就是我们说的交叉商损失函数, 为什么他就交叉商摆在这,就能够解决当前对于多分类问题的损失值来找差距这件事呢?比如说我们现在来看啊,假如说我们现在是标签是一啊,应该是正例,那我的模型的输出是不是越接近于一,就说明我们的模型当前的性能是越好的。 好,跟上我的思路,我们来告我来跟大家说一说,为什么他就能够表示当前的多分类的这件事情的损失值啊?我,我来说一下啊,假如说我现在这个样本是正例,那么他的输出就应当是一, 而我模型呢,输出是零点八,所以跟他有一点差距,好,再来找零点八,那么这就是当前的损失值了,在这里 看到了吗?也就是这就是我现在的损失函数,所以你看看我这个蓝色曲线,我当前的样本,正例啊,它是为一 模型的输出,是当前正例的概率越接近于一,就说明是越好的,所以你看这个函数是不是越接近于一,损失值就是越小的。当它的这个模型的输出为一的时候, 丢到我这个函数里边,它的损失值就为零,零啊,而这个这个模型的输出是零到一之间的值,越靠近于零,损失值就是越大的,看到了吗? 所以现在我们这个函数就能够表示当前类别为一的时候它的损失了,而且它是连续可导的来, 这是唯一的时候。如果我们现在的这个样本是负利,本身是零,你看这个橙色的线,就是当我们的样本为负利的时候,那我的模型输出它的损失值是如何计算的?这个函数看到了吗?你看啊,如果我现在本身它是个负利,那么我就希望我的模型输出应该为零, 对不对?要是越接近零就是越好的,所以你看成色这条线越接近于零,损失值就是越小的。 所以每一个损失函数都能够体现是模型现在的输出和期待结果之间的差值,而且损失函数通常要可导、连续可导,这是分类和回归经常用到的损失函数是怎样的?还有一些复杂问题我们可以看看,比如说优喽 yolo 是 一个用来进行目标检测的模型,而目标检测要找的就是图像当中每一个物体的位置和类别,所以模型的输出就得包含位置和类别。那么我要去表示的损失函数,就是把比如说模型在现在输出的时候,那个位置 啊, box 那 个矩形框的位置,以及它的类别都拿过来去进行个纠正。而位置不就是个回归问题吗?类别不就是个分类问题吗? 对不对?所以复杂的问题,他的损失函数可能有多项来构成,继续去拆,也基本上都是落到了回归和分类这些事上。 好,如果大家对于干网络本身不熟悉的话,我就不再说这里的损失函数了,因为你不知道干网络在干什么,咱们这个损失函数也就不好去理解了。但是我想跟大家说的是,我们已经清楚了损失函数它的意义,找差距和来找方向,那么我们是可以根据当前的任务自己去进行损失函数的定义的。 很多时候大家想找一些新的方向,能够有一些新的成果,损失函数的创新也是一个创新的方向。对,对抗训练是一个通过对抗的训练过程,最后来找到一个可以进行生成的模型 啊。所以干网络是一个生成模型,但它的过程是通过对抗。怎么叫对抗?在过程当中这个是生成器,是咱们最后要用来进行生成的模型,但是训练他的过程给他配了一个判别器, 所以他俩对抗,那判别器是来判断一下丢给判别器的当前的收入,是你生成器生成的假数据还是真实的数据? 判别器用来进行判断,生成器呢?功能就是用来进行生成,生成一个期待能够骗过判别器的结果啊。所以有生成器,有判别器,他俩一起对抗着去进行训练,判别器的能力也就能够越来越好,他俩一起 向上上升啊,一起去进行交替的训练,最终我们找到一个好的生成器,就能够拿来去进行使用了。 所以在这个过程当中,生成器和判别器都是模型,所以你理解了这个对抗的作用,对抗的过程。至于生成器和判别器里边这个模型的结构就可以自己去搭了,搭全连接也好,搭卷接也好,搭串词方面都行, 都可以。这个判别器的损失函数在这就是个分类问题,来判断一下当前你给他的输入是生成器生成的假数据还是真正的数据,所以他在这做的是一个二分类的分类任务,所以他的损失函数不就是个二分类的损失函数吗? 啊?而生成器在这,他的目的是要去骗过判别器,所以呢,他就希望生成器生成的结果再丢到判别器里边,让判别器在这里的输出是往正就往真的数据那去猜的,也就是他的输出又接近于一, 在这里就是越好的,所以根据理解,咱们就可以构成他各自的损失函数了。好,我们继续往下啊。那么我们对于损失函数大概都有什么?咱们简单看过之后就可以来看看梯度下降了, 为什么?因为在这咱们要看看我们有损失值去找具体更好的参数这件事到底是怎么办的,这就是梯度下降在这里去解决的问题了,所以梯度下降同学们要知道它是用来优化参数的具体的方法。 当我们有了损失值,我们怎么就能够找到更好的参数值了呢?我们说要要往损失下降的方向去找的参数就是更好的,怎么就是有损失下降的方向了呢?有了损失下降的方向,又怎么具体的算出当前的参数值呢? 这就是梯度下降所做的事情。所以咱们现在来看梯度下降到底是怎样的,这块对这块是最麻烦的,咱们学生都学习梯度下降就是你最耗精力的地方, 在我的课程里边,我是会让同学去手撕梯度值的,通过梯度下降的方式去手撕参数的更新的,由一个具体的参数值,由当前具体的数值和模型的结构手撕出来,参数更新过之后具体的数字的,这是我课程的定位啊, 从这这部分就要这么去做的。但我们在这里的时候呢,会整体让你知道梯度下降为什么是参数的优化方法。首先 我们的梯度下降是参数具体的优化算法,也就是当我们有了参数,我们要把这个参数去进行调整的时候 的计算的方法是我们所说的梯度下降。再说啊,梯度下降就是现在深度学习百分之九十九,百分之九十九的深度学习的模型,不管你说的是 n、 l、 p, 还是计算机视觉 c、 v 啊,不管是卷积还是 transform, 这里用到的都是梯度下降的参数的优化方法,我说清楚了吗? 深度学习百分之九十九甚至以上都是用梯度下降来进行的参数的更新的,所以梯度下降是来告诉你参数到底如何得到更新啊,那参数的更新在这里呢,我们还给得回到训练过程里面来看, 训练过程里边我们会把当前的参数取的值放到这来,把我们手里有的训练级丢给这个参数的值,比如 w 啊,就是一个具体的值,比如说就是零点五。好了,在这样的值的基础之上,我们来得到模型的输出, 再去计算损失,我们说往损失下降的方向去调整参数,所以这个时候我们就把这个参数得到了更新啊,比如说我们这里的参数啊,由零点五我们就更新得到了,比如说零点八, 这是个参数的更新过程,所以我们由这个 w 零变成更新过的 w 一。 这个方法在这里边用到的是梯度下降。我说清楚梯度下降在解决什么事情了吗? 就梯度下降来干什么的?梯度下降就是把你这个参数来得更新啊,具体怎么就由 w 零计算得到了 w 一, 这中间就是通过梯度下降完成的,这是梯度下降在干什么? 我们清楚了,它的目的是把 w 零变成 w 一 啊,让 w 由初识的随机数去调优啊,具体得到了优化了以后的 w 的 计算的步骤,计算的方法, 那我们现在呢?回过头来咱们看啊,当前假如我的 w 出使值在这里啊,这是 w 零, 是一个零点几的这么一个负数啊,这是我的 w 的 出使值,那我的 w 的 出使值在这的话,对应得到了一个损失,这个是由我们前向传播得到模型的输出,再去进一步得到的损失,损失值呢,大概就是五 好,所以呢,我就确定了这个点,在下一步不就是往损失下降的方向去调整当前的参数了吗?如果我把损失和参数之间的关系用这张图给你体现出来,你一定知道我们现在的 w 是 应该往大还是往小调,来,往大还是往小调。评论区告诉我, 我们一定把这 w 往右调,往大调,因为你通过这个图你会发现,我只有把它往右调,才有可能让损失去变得更小,让损失变得更小的 w 才是更好的 w, 对 不对?所以我们要往右调,这是因为这个图我给你摆在这了,但是我们没有这张图啊, 如果你有这个图,你直接找到这个点不就完了吗?对不对?没有,我们只有这一个点,我们只有当前知道这个 w 零是什么值, 只有知道当前这个对应的损失值是多少,我只有这个点,所以我没有这个图,那我到这个点上,我得知道我要让 w 往大还是往小,怎么办呢?这个时候梯度就出现了,其实在这标量来看是导数啊。 好,那如果有很多个维度就是梯度了,那那梯度是什么意思呢?或者这个导数啊,在这,它是上升最大的方向。好,这就是梯度的意义,我说清楚了吗?梯度是在这个点上升最大的方向, 对,就是这块的斜率。好,没有问题,那咱们现在呢,能够计算得到 t 度, t 度 w 零点 red 啊,这个是东西,咱们是可以通过炼制法则从损失一路给它求过来的。这个东西咱们今天不展开,但是是肯定能够 去算出来的啊,这个 python 也好,也都是可以帮咱们通过计算图能够去算出来的。好了,我们有它就好去调整参数了, 我们知道了它,现在它如果知道了啊,我们是不是知道它是向上升的方向,咱得让它下降,对不对?所以呢,下降我们就得前面给它加一个符号,这不就是能够下降了吗? 这不就是一个能能够让 w 变小的一个方法了吗?所以呢,我们的 w 零就可以是这样去更新,那我把它写到这 w 一, 这是更新了以后的 w, 它就可以呢,由 w 零 让他往梯度的反方向去走一步,走多大呢?走梯度值这么大,这样呢,也就是我们在这个点就可以向下去走一步了。好,负号确定了我们走的方向, 现在我就确定了,我可以按照梯度的反方向去走一步,就是能够让损失变小的一个更好的参数了。那么这就是咱们梯度下降的公式,但是还不完整。为什么?如果你的梯度值很大?同学们, 我知道我该往右走,那你这一步但是迈的特别大,你一下子迈到这来了,这损失值不就没有降,反而升了吗?所以刚才有同学问我说损失变大了,怎么回事?下降一下,调小一下,就是你这一步别迈太大。 所以呢,在这呢,一般情况下,咱们还得让他梯度值前面去乘以一个限制他这一步变动步骤的东西,就是学习率啊,好,乘以在这,这就是学习率啊。 lr 学习率, learning rate, 它通常是一个比较小的数字,所以你看到咱们学习率通常情况下可能定义的为零点零零零一或者更小,你都可以去试,但总之它会比较小,它的作用就是来限制一下你这一步别迈太大。所以我们基本的思想就很简单了, 来,我知道这里的梯度是这样的,我往梯度的反方向走,这找的是我走的方向,也就是负号,但我这一步往正确的方向迈一小步 就可以了,所以前面有个学习率,学习率代表的是我步子的大小,所以呢,我们在这往正确的方向,也就是负号去迈小小的一步,对于我参数的一次比较有效的更新了,这就是咱们梯度下降的公式,我给大家写到这啊, dt 加一时刻的参数值,它是由 dt 时刻的这个值去减去这里的学习率乘以损失过来的,当前的这个求过来导数的,这就是咱们的梯度,当然多个维度就是梯度啊,它就是梯度值, 这就是梯度下降。到这里呢,咱们就把梯度下降说完了,那这是最基本的梯度下降,我们现在深度学习里面超过百分之九十九的模型的训练都是这样的,都是梯度下降。 只不过呢,我这个是最基础的版本,它可能会稍加一些优化啊,比如说我这一步呢,让它先卖大再卖小,走的可能会快一些,或者有一些其他的方式,但本质都是它,本质都是它,它就是我们现在深度深度学习里面超过百分之九十九的优化方法。 好,我们今天继续啊,来看激活函数。激活函数啊,简单来跟大家说,就是我们的模型深度学习不管是有多深还是有多浅啊,只要是神经网络是深度学习,他一定是限性结合非限性的运算。 所以在这你得先清楚什么是限性,什么是非限性,咱们就能够知道激活函数在模型里面的作用了。首先大家看到左边这里, 这里呢,如果数据的结构分布是这样的,那么我在这里呢,当然就可以画一条线来表示数据的结构了,横轴是 x, y, 这个这个 y 轴是纵轴是 y 啊,那么 x 和 y 之间的关系,我们就可以通过一条线来表示出来, 这就是限行模型,但是不是所有的问题,用一条线就能够解决太多的问题,只要是咱们现在想解决的那些复杂问题,什么人脸识别了,文本翻译了,对吧?那些一定都是非限性的,他都比较复杂,所以这样的就是 就是,比如说这样,这种啊,你得画个曲线吧?你说你用一个 w x 加 b 解决不了,你得画个曲线的就叫就是非限行问题,这是, 这是腺性,这是非腺性。好腺性和非腺性是不是就没有问题了?很简单,是不是好腺性和非腺性咱们就说完了啊,我们解决复杂的问题都是非腺性的, 而咱们的模型里边都是腺性结合非腺,所以腺性就是我们给,比如说全连接 w x 加 b, 这不就是一个腺性的过程吗? 所以你用它不能够解决复杂的问题,咱们就得在这个限性计算之后,再给他加一个非限性的转换函数,这个非限性的转换函数在模型里面就叫激活函数,它的作用就是来完成非限性转换的。我说清楚了吗? 为啥限性一定要结合非限性?因为限性不能够解决所有的复杂问题啊。举个例子,比如说我们现在在坐标轴当中,这些红色的是一个类型, 而这些蓝色的是一个类型啊,好了,那你说我怎么画线,我找什么线?是不是都不能够将这两个类别去进行区分呀?在这里我可以画个,目前来看,我是可以画一个圆将它区分,这就是一个非限性的数据问题,说清楚了吗? 所以我们要解决的复杂问题都是非限性的转换的过程,我们就得在模型里面有非限性转换的能力,激活函数就是在你的模型里边帮你来完成非限性转换这件事的,我说清楚了吗?对对对,大部分的现实问题都是复杂的问题,都得是非限性的好,没有什么问题了,对吗?我们继续继续往下, 所以你现在明白了啊,我们在模型里边,不管这个模型有多深有多浅啊,他都要有激活函数,因为在这是通过激活函数在模型里边的构成来完成非限性转换这件事的, 所有的激活函数都是用来完成成非限性转换的,所以呢,其实再复杂的问题都是限性结合非限性两个转换一步一步给他堆起来的。比如在这, 在这里我们可以先做一个限性的转换,比如说这个 z 一 啊,这是一个全连接啊,这个 z 一 呢,我们就可以用这个 w 一 一去乘以 x 一, 加上这里的 w 一 二去乘以 x 二,再加上这里的 b 一 一,这是一个限性转换, 限性转换,这是等号限性转换,这是 z 一, 但是限性不能解决所有的问题,所以我们把这个 z 一 拿过来之后呢,我们再给它经过一个非限性转换 啊,所以就这里这是一个非限性的转换函数,把自己音拿过来,经过非限性的转换就得到 a 一。 就这样我们继续讲向后传递,这是一个全连接的运算过程,所以我们再复杂的模型都是这样限性结合非限性的。比如说大家都经常来讨论 attention, 注意力 attention, 对 吧?那你这注意力的运算本身就是限性的,然后注意力的运算之后,我们给他加上一个非限性转换的函数, 听说了吗?我们的模型结构所说的卷积也好,全连接也好,其实都是限性的,在他们之后都再加上一个非限性转换的函数,就是我们在模型里面的激活函数了。好,激活函数,你给他理解成构成模型非限性转换那个能力的函数, 所有的激活函数都是非限性转换的函数。好了,我们来看常用到的激活函数,这个同学知道吗?哈哈哈,它是可以将一条线转换到零到一之间的一个非限性转换函数,它就是咱们经常这个俗称的啊,我们经常直接就把 sigma 的 叫做它了, sigma 的 函数就是这个啊,但实际上在这里说的并不严谨, sigma 的 指的是所有 s 型,只要是能够转成 s 型的,这种函数都是 sigma 的 函数。 s 型是 sigma 的, 具体来看,这个函数转到零到一之间的这个叫 logistic, 这是我们经常用到的一个激活函数。对对对,赵子龙, 是这样啊,是由一步一步的叠加,最终呢我们完成复杂的问题,是这样的,特别棒啊, 那么右边呢,也是一个 s 型的函数,它们呢?将数值不是压缩到零到一之间,而是压缩到负一到一之间,这是 touch。 touch, 好 了,这是我们经常用到的两个 s 型的激活函数,你看它们是不是都是非限性的,将线给它转成了非线 好了。另外还有一类比较常用的就是 re 路了,我们来看啊,这个是 re 路,他是怎样的呢?他是可以从零这来去一刀切零,左边的数值给他转成这个全部都为零,而零右边的数值实际上他是转成保持不变啊,这是 re 路,我说清楚了吗? raylu, 它很简单,它就是一个 max 函数啊,零 x, 如果这个当前的 x 比零小就输出零,如果它比零大就输出 x, 这就是 raylu, 懂了吗? 好,我们来看我们在大模型里面最多用到的这个 raylu, raylu 呢就是比 raylu 稍微圆滑了一点,它并不是把这块这个角 在这硬硬硬去给它转换的,而是在这呢有了一个小小的弧线,这样的话呢就可以在这呢有了一些转换,让它并不是直接去切。所以 ray 路呢,一般出现在图像里面,卷积神经网络,这比较有效。而我们对于大语言模型这些靠概率去进行计算,去去进行推导的这些 问题来看, g 六会比较合适一些啊。好了,这就是常用到的激活函数 ray, 有 这些到底是用的 ray 呢?还是用这个 touch 呢?还是用 ray 呢?是根据不同的任务来选的,每一个都有它适用的场景。 大语言模型,语言模型,大家用 g 六效果会比较好,卷积这里用 ray 会比较好。好了,我们今天的内容就到这里了啊。

做 nlp 的 同学啊,今天还可能说,老师啊,我想转大模型和转整体的方向,那我该如何做准备呢?呃,为大家说几件事啊,就如果说你之前是做传统 nlp 开发的, 我相信现在你也知道,就是传统 nlp 现在基本上不用了,全是以清一色,什么清一色打磨胶,清一色制整体, 尤其是现在制整体特别火,基本上都在去做各种各样的 hni 框架,结合自己的数据啊,做一些项目,做些应用,那咱们怎么尽快的去熟悉这些东西呢? 我建议大家这样啊,就如果说之前对深度学习比较了解,咱们可以第一件事先看一个包,叫做 transformers 这个包,这个包呢,我觉着后续啊,咱无论做啥,你是跟大模型相关的,还是跟 r p 相关的,咱都能用上这个包,咱们好好学一学,包当中有哪些个模块,该怎么去使用,该怎么去调用。这第一个先熟悉一个工具包。 第二件事呢,咱们直奔啊,这个大模型的微调量化部署,我觉得这样咱们熟悉熟悉,就是后续可能你自己微调大模型机会啊,不一定很多的, 因为现在大部分情况下,这些底座都是现成的,更多我们去应用,但是逻辑还得了解了解啊,微调量化部署大概流程是什么?再往下咱们还要花时间去理解理解知识库,因为现在你看做智能体项目,知识库肯定是少不了的,这种长期一起记忆都是需要的,那还有什么?还有就是这些智能体框架, 整体框架我建议大家这么去学,就是不仅仅说你要去会用这个东西,你还要从框架的底层逻辑去理解人家的原码是怎么构建的,人家的底层思想是怎么设计的,我建议大家 delete 去啊,理解一个框架吧, 你看最新的就是像这种龙虾的框架,或者类似龙虾的框架特别特别多,你找一个比较轻量化的可能不一定,龙虾这么重型的,找一个稍微轻量化一点的,咱们把底层原码过一过,看人家底层原码做了什么东西,这些都可以当做自己知识储备,也可以当做你项目的经验,到时候拿去说的。 这里给大家整理了一份 ai 各方向精选资料包,包括 python 和数学基础、机器学习、基础、算法深度学习、神经网络基础、计算机视觉实战、 自然语言处理基础、大模型和智能体基础、 ai 算法岗面试秘籍、顶会顶刊、论文汇总 等 ai 领域十大模块、基础算法框架、实战练手、项目源码资料、前沿论文、面试题库、经典书籍全都有, 是一份非常全面的 ai 全领域学习资料。如果你也没有头绪,不知道如何开始学习 ai, 那 这份资料包你一定不能错过! nice!

大家好,欢迎来到 call 鼎茶水间,今天给大家继续带来的是一个基于优路算法的交通标识检测系统。首先呢我们这边注册一个新账号, 注册成功以后我们用刚才这个新注册的账户来登录一下, 登录进系统以后,我们可以看到左侧的一个功能菜单栏,分别给大家做一个一一介绍。 图像选择是选择一个单一的图片,对图片中的目标进行一个目标检测。视频选择是选择一个视频文件,对视频文件中的每一帧进行一个目标检测。 文件夹选择是选择文件夹下的所有图片进行上传,对每张图片依次进行一个目标检测。摄像头是通过连接电脑的 usb 摄像头对摄像头中的实时的视频帧进行一个目标检测。 模型选择,我们这边默认加载的是优喽十二的模型,我们也可以选择其他的模型,比如优喽 v 八,当提示模型加载成功以后,我们再进行图像选择和视频选择的时候,就采用的是新加载的模型来进行检测。识别历史是对识别历史记录的一个列表展示 好了,我们来选择一张图片, 点击开始识别。 由于第一次需要加载模型,所以检测耗时会稍微长一点,我们可以看到这边检测耗时是一个三千七百八十毫秒,可以准确的识别出来这个标志牌的一个目标。 我们这边呢还可以通过拖动滑动条来修改一下检测的信度,现在这个目标的信度是零点五九,我们拖动滑动条如果调整到零点六的话,那么信度低于零点六的目标就会被过滤掉, 点击开始识别,可以看到这个零点五九的知心度目标就被过滤掉了,我们一般的将知心度调整为零点五就可以了。这边我们还有一个语音播报的功能,当我们勾选上这个勾选框的时候,再点击开始识别,发现目标可以听到会有一个语音播报的一个提示音, 这个语音播报文件呢是在这个 static 下面这个 alarm, 如果我们要替换这个语音播报文件,为我们自己的一个语音播报提示音的话,只要替换这个文件就可以了, 我们现在取消这个勾选下方这个列表,当我们点中列列表中的元素的时候,可以对这个检测结果中的目标进行一个过滤,点击哪一个元素就会框选出来哪一个元素。因为我们现在图片中只有这么一个目标,所以呢 这边只过滤了这一个目标,点击这个目标选中以后呢,右侧还会显示它的一个检测记录,包括它的一个检测类别,知信度以及它的位置坐标信息。好了,我们现在在选择一个视频, 可以看到这个视频中的每一帧呢,都可以进行一个目标检测, 检测结束后会对这个检测记录进行一个保存,我们也可以手动点击这个结果保存,这样就可以把刚才的这个检测的视频文件进行一个导出, 我们这边还可以点击这个结果导出,会将刚才的检测结果通过 excel 的 形式来进行一个导出, 可以看到这个表格中呢包括了一个检测目标的类别,知心度和位置坐标信息,最后一个是在原视频时间轴上的一个坐标点的一个位置信息,比如说这个零点一二,就代表的是在零点一二秒检测到了这么一个目标,他的知心度是零点五二,他的位置坐标信息是这个。 下面我们选择一下文件夹,选择我们的所有的测试图片呢都会放在这个 test media 这个文件夹下面,所以我们点击上传,会将这个文件夹下的所有的照片进行一个上传,点击开始识别, 可以看到能够对这个文件夹下的每张图片依次进行一个目标检测。 好了, 我们这边点击一下摄像头,会打开我们连接电脑的一个 s b 摄像头,我们这边打开一张图片, 将我们这个摄像头呢对准这个图片,可以看到能够检测出来摄像头这个视频帧中的这么一个目标。好了我们点击停止识别, 下面我们看一下模型选择,我们这个系统默认加载的是优酷十二这个模型,我们现在可以选择一下这个优酷 v 八,选择里面的 best。 其实模型加载成功以后,我们再选择一张图片来进行一下验证, 可以看到这个检测结果会有细小的差距, 下面我们看一下识别历史,可以看到识别历史是我们刚才检测的一个历史记录的展示,包括了这样一个检测的时间和记录的 id, 我 们可以点击图片进行放大, 我们这边呢还可以进行一个个人信息的编辑和修改。刚才我们注册的时候没有上传头像,所以用的是一个默认的头像,我们这边可以给它修改一下头像,头像都是在这个 media 下面的 avengers 里面, 点击一下保存修改,可以看到右上角这边个人信息的这个头像已经修改成功了,现在我们退出一下登录 我们这个系统呢,刚才演示的是用户端的一个功能,我们这块还有一个管理员端的功能,现在我们登录一下管理员端,用户名和密码都是这个艾的命。 登录进来以后我们可以看到管理员呢支持对用户的一个编辑和删除,可以编辑一下用户的头像以及修改他的密码,也可以对用户信息进行一个删除。识别记录这一块保存的是不同用户进行检测的一个识别记录的结果, 包括了一个它的时间点,用户信息和它的检测 id, 我 们可以通过点击原图可以进行放大,这个结果图也可以进行放大,还支持一个单条记录的删除,以及多条记录的一个批量删除。 我们这个系统除了完整的这个网页端的功能以外,还预制了三个脚本文件对这个目标进行检测。 run single image 呢,是对单一图片进行的一个目标检测,其中这一块是一个权重文件的路径,加载的是优酷十二这个权重文件。这一块呢是带检测图片的一个相对路径,是在我们的 test media 下面,这个 我们可以换一个图片啊, 我们来修改一下它的一个图片路径,再点击一下这个运行, 可以看到左侧是一个原始图像,右侧是一个检测的结果图,能够识别出来图中的这个目标。 除此之外呢,我们还支持一个对视频文件的检测,同理这块也是权重文件的路径,这块是一个带检测的视频文件的路径, 这边还支持一个对摄像头的一个检测,由于原理是一样的,我们就不一一进行展示了。 我们这个系统还预制了一个对数据集进行训练的一个脚本,我们的数据集都保存在这个 trace data 下面,包括了一个训练集和一个验证集。这个训练的脚本呢,这一块是一个需要训练的一个模型列表,包括了 v 五、 v 八十一、十二。 下面这一块是我们的一个训练的一个参数,其中这个代表的是训练的轮次,我们一般设置成一百轮,这个代表的是一个每批次处理图像的数量,我们设置成八就可以了。如果电脑性能或者 gpu 性能比较好,也可以设置成三十二。我们点击一下运行, 可以看到我们这边的训练级的图片,一共是三千二百五十三张, 验证级一共是一千一百二十八张。由于我们要训练四个模型,每个模型训练一百轮,所以时间是非常长的,我们这边先暂停一下, 最后训练好的结果会保存在这个 rest 目录下面,我们打开这个,以优酷十二为例, 为此保存的就是它的一个训练结果, last 代表的是最后一次的结果。 关于训练结果中各个图表的含义,大家可以参考一下我们之前发布过的一个视频,叫做一条视频,讲清楚优路训练结果的含义,里面有非常详细的描述和介绍,今天我们的演示就到这里。

大家好,欢迎来到扣鼎茶水间,今天继续给大家带来一个基于优喽算法的水下垃圾检测系统。首先我们注册一个新账号, 注册的账户名为优子零零二, 登录进系统以后,我们可以看到左侧是一个功能选择的一个菜单栏,我们依次介绍一下。首先图像选择是选择单一的一张图片,对图片中的目标进行一个检测。 视频选择是选择一个视频文件,对视频文件中的每一帧进行一个目标检测。文件夹选择是选择文件夹下的所有图片,把所有图片上传之后,对每张图片依次进行一个目标检测。 摄像头功能是打开连接电脑的 usb 摄像头,对摄像头中的实时的视频帧进行一个目标检测。 模型选择是可以选择加载其他的模型,我们默认加载的是优漏十二模型,也可以选择优漏 v 八,当我们加载模型提示成功以后,我们再进行图像选择和视频选择的时候,就采用的是新加载的模型。 识别历史是对识别历史记录的一个列表展示,首先我们来选择一张图片, 点击开始识别,第一次需要加载模型,所以检测号时会稍微长一点,可以看到这边的检测号时是一个三千七百二十四毫秒,可以检测出来这么一个图像中的一个目标。 右侧这边有一个类别统计功能,可以统计出来不同的这个检测类别以及它对应的一个个数。下方这块还可以进行一个类别过滤,比如说我们现在选中面罩的话,就把这个手套过滤掉了, 如果选择手机的话,因为手机没有在这个检测结果中,所以什么也没有显示,我们还可以通过点击下方列表中的元素对这个检测结果进行一个过滤。选中了面罩以后呢,就会在右侧的检测记录中显示他的一个检测类别,知情度以及位以及他的一个位置坐标信息。 我们这边还可以通过拖动这个滑动条来修改一下这个知信度,比如现在这个知信度,我们将它调整为零点九, 那么低于零点九知信度的目标就不会被检测出来,比如说这个面罩,这两个面罩我们点击开始识别,可以看到这两个目标就没有被检测出来了,我们一般呢将这个知信度调整为默认的零点五就可以了。 这边还支持了一个语音播报的功能,当我们勾选上这个勾选框以后,我们再点击开始识别,发现目标可以听到一个语音提示的播报,这个语音文件呢,在我们这个 static 目录下面 的这个 alarm, 如果想替换自己的一个语音提示文件,把这个文件覆盖就可以了。 下面我们看一下视频,选择选择上传一个视频,我们勾选掉这个语音播报,要不然它会一直提示的点击开始识别,可以看到视频中的每一帧呢,它都会进行一个目标检测, 当这个视频检测结束后,会进行一个保存,我们也可以通过点击这个结果保存按钮,手动将这个视频进行一个保存和导出。可以看到这是刚才我们检测结果的一个视频, 这边还支持一个结果导出,点击结果导出呢,就会将我们刚才检测的一个记录以这个列表形式进行一个导出,可以看到这个列表中呢显示这个检测目标的一个类别,知性度和他的位置坐标信息。 最后一列这个时间呢代表的是在原视频中的一个时间轴上的位置,比如零点七五,就代表的是在原视频零点七五秒的时候检测到了这么一个目标。 下面我们选择一下文件夹,我们所有的测试图片呢,全部都在这个 test media 下面,点击上传以后,点击开始识别, 可以看到能够对这个文件夹下的每一张图片依次进行一个目标检测。 好了,检测结束后,我们再点一下这个摄像头,会打开我们连接电脑的一个 usb 的 摄像头,我们这边打开一张图片, 将摄像头呢对准这个图片 可以看到能够识别出来这个实时的摄像头中的视频真正的一个目标,由于我们这个摄像头的像素不是太高,所以它的识别精度是有一些差距的。 好了,点击一下停止识别, 点击一下模型选择,我们可以看到啊,我们预制了有四套模型,分别是 v 五, v 八,十一,十二,我们默认加载的是优路十二这个模型,我们也可以选择一下 v 八下面的 best, 当提示模型加载成功以后,我们再选择一个图片来进行一下验证, 可以看到这个不同的模型,不同模型它的这个检测结果会有些许的差异,这个知性度跟刚才我们用优酷十二的知性度它会不太一样。 好了,我们现在点击一下识别历史,可以看到这是刚才我们检测的一个历史记录,我们可以通过这个点击图片进行放大,这块也可以显示出来我们检测的一个时间点。 我们这个系统呢还支持一个个人信息的编辑和修改。刚才注册的时候我们没有注册这个头像,所以头像用的是一个默认头像, 我们这个头像都是在这个 media 下面的 avantas 里面,我们可以点击保存修改,给它修改一下头像,可以看到这个头像已经修改成功了,下面我们退出一下。 刚才我们演示的都是用户端的一个功能,我们这个系统除了用户端的功能以外,还有一个管理员端的功能,管理员的用户名和密码都是艾米, 登录进管理员这个账户以后呢,我们可以看到管理员有一个用户管理的功能,它可以对用户信息进行一个编辑和删除,可以修改这个用户的头像以及修改它的密码,也可以删除一个用户信息。 识别历史记录呢,这块是不同用户的一个检测结果的记录都可以在这块保存,我们可以对这个单条记录进行一个删除,也可以对多条记录进行一个批量的删除, 还可以通过点击原图进行放大,结果图呢也可以进行放大。我们这套系统除了完整的这个网页端的功能以外,还预制了三个脚本文件对目标进行检测。 one single image 是 对单一图片进行的一个目标检测,这一块是一个预加载的一个全正文件的路径,这块是带检测图片的一个路径,检测图片是在这个 test media 下面是这个图,我们可以点击一下运行, 可以看到左侧是一个原始图,右侧是一个结果图,能够框选出来这个图中的目标。 这块是一个对视频文件的一个检测,同样这块是全正文件的路径,这块是带检测视频的路径。 除此之外呢,还支持一个对摄像头的检测,由于原理是一样的,我们这边就不做展示了。这个系统还支持了一个对数据集进行训练的脚本,我们的数据集都在这个 trace data 下面,包括一个测试级、训练级和验证级。 这个训练的脚本,这一块是我们要训练的一个模型列表,有 v 五、 v 八十一、十二。 下边这一块是我们的一个训练的参数,其中这个代表的是训练的轮次,我们一般设置成一百轮,这个代表的是每批次处理图像的一个数量,这里我们设置成八,如果你的电脑性能或者 gpu 性能比较好的话,也可以设置成三十二。我们点击一下运行, 下面就开始进行训练了。可以看到这块我们的训练级一共是三千零七十六张图片, 这个验证级一共是一千五百三十八张图片。由于我们要训练四个模型,每个模型训练一百轮,这个时间是非常长的,我们这边暂停一下,最后训练好的结果都会保存在这个 rest 目录下面, 我们以 u 六十二这个结果为例,最后的权重文件都会保存在这个位次里面。其中 best 代表的是这一百轮里面最好一次的训练结果, last 代表的是最后一次的训练结果。 关于训练结果中各个图表的含义,大家可以参考一下我们之前发布过的一个视频,叫做一条视频,讲清楚 u 六训练结果的含义,里面有非常详细的描述和介绍,今天我们的演示就到这里。

这台机器让考古学家第一次看清了千年前的字迹。 九九五零叉三 d 三 d 微 touch 缓存,大到把整个数据集兜住。 l 四零 s 四十八 gb 显存,专为推理和渲染优化 部数字化复原,这是目前非常前沿的应用,比如我们听的很多的三星堆文明发掘、秦皇地宫的发掘等等,古代石碑风化严重,肉眼看不清自己。利用 l 四零 s 的 强大推理能力,用三维扫描仪采集几亿个点云数据,换以前显存不足,跑不动, 只能分块处理,拼接完就会有错位,复原极其困难。现在用九九五零叉三 d 的 三 d 缓存,把几亿个点 云数据全部锁在 cpu 缓存内,访问数据,不再卡顿。 l 四零 s 的 四十八 g b 显存,一次性加载整个模型, ai 文字识别同步进行, 这种程度的工作量,以前分块处理至少需要三天才能完成,效果还一般。现在整块加载一次性处理整个模型,三小时即可完成。我们终于可以完整清晰的看到千年前的文字了。九九五零叉三 d 加英伟达 l 四零 s 的 这套配置,在你的研究中,想让它看清什么?评论区告诉我。

你们不要嫌我重复讲啊,我直播的时候有七八个重复讲,这个是很正常的,但我的我的系统课里边每一讲都不重复,但是我们直播的时候会是这个样子,这个很正常 对不对?我们今天的内容啊,如果是大家现在要学深度学习,那么今天的内容呢?应该会给大家带来比较大的收获,关键是非常重要, 因为今天的内容你弄清楚再去学你具体的模型,再去搞你具体的实验,才能够弄清楚到底都在做什么啊,依旧是不分专业不分具体的模型,而都是大家只要用深度学习就应该先搞懂的那些非常重要的内容啊, 希望能给大家在入门这块带来一点帮助。今天就是入门应该学的第一课,好吧,那我们来看啊,我们今天首先我们先来认识一下咱们所说的深度学习是一个什么样的工具, 我们用深度学习解决什么样的问题,最终用深度学习要得到一个怎样的目的? 好,然后呢,我们再来看一看我们经常所说的模型是什么?模型的得到要包含哪些方面啊?在这个过程当中有训练,这个训练过程又具体是怎样的? 在训练过程里边我们会说到损失的计算,那么损失函数它的目的和作用又分别是什么呢? 啊?以及大家在入门的时候要学到的梯度下降激活函数,这都是我们今天要学到的内容,所以非常重要,它就是大家在学深度学习,首先先要搞清楚的这些问题。首先我们先来去认识一下咱们要用的这个深度学习这个工具, 它的目的就是找模型,那它的目的就是来找到一个模型, 我们从深度学习的开始到深度学习这个事情的结束,就是从最初去找一个模型,到我们找到一个模型,所以他的目的就是来得到那个模型。 所以这个时候大家一定对于模型到底是什么就会有一些疑惑了。我们来举两个具体的例子。首先就是啊文本翻译,我们知道我们现在这个任务就是来完成翻译这个事情,那么比如说我现在要完成的是由中文到英文的翻译, 那么我要借助深度学习的目的就是最终来帮我找到一个可以完成由中文到这个英文的一个模型。怎么叫完成这个任务的模型呢? 当我把我现在要翻译的这个中文丢给这个模型,这个模型就可以帮我经过一系列的运算得到翻译的结果。 我们借助深度学习这个工具,帮我们来找到这样的一个可以完成翻译任务的模型。模型找到深度学习的目的,就接触了找这个模型的过程,就是我们现在可以用到的深度学习它具体的一个方面的技术。 好,这是一个例子。我们再来看这刚才举了一个自然语言处理的,大家现在比较关注啊。另外呢大家比较关注的一个主流就是图像计算机视觉问题。 好,那假如说我现在的目的是希望借助深度学习来帮我找到一个这样的模型,我之后丢给这个模型一张图像,这个图像当中有数字 啊,我们知道一个图像它里边是包含非常多的本身它的特征的维度的啊,有很多的数字来表示, 但是它整体来看,对应的这个图像里边就一个数,比如现在这张图像里面是二,我们人眼能一眼看出来。但是对于模型来说,这个问题可不也不简单,它可能要处理几万个数字,最后再对应现在这个里边是二这个结果, 所以有几万个数字对应到二这个过程是我们可以借助深度学习来帮我们找的,能完成这个事情背后对应的那个模型 啊,就是现在图像分类的这样的一个模型,而找到这个模型的过程,我们是可以借助深度学习来完成的,找到这个模型我们深度学习的目的就达到了,深度学习就可以结束了。 所以刚才我们举了两个例子来看看模型到底是什么,你会发现在不同的例子里边都会对应到了解决这个问题而解决的问题呢?其实本质过程就是我们丢给模型一个输入,希望模型给我们得到一个理想的输出出来, 所以都是由输入到输出,由输入能够得到输出的这个东西其实就是模型了。那这么一说,模型不就是一个函数吗? 这个函数我们给他一个输入,他经过函数里边一个系列的运算,最后给我们得到了函数的输出,在这里就是我们模型对应的输出,也就是我们现在要解决的问题了。所以模型呢就是一个输入到输出的这样的一个映设关系, 那么模型是由输入到输出的一个映涉关系啊,这个我们有了一定的认识之后,我们再来举个简单的例子啊,到复杂的例子,我们来看看模型可以长成什么样子。 我们先来看个简单的例子,这个简单的例子呢,它是这个样子的啊,我们有现在的一些数据啊,这些数据有一个个的数值构成,也就每一个数据,每个样本都是一个标量啊,都是一个数字, 而它的结果就是另外一个数字啊,所以它把 x 这个数据和它的结果 y 之间这些一点,我们给它划到当前的坐标轴当中,你会发现就是这样的一些离散的点, 所以对于这样的 x 和 y 之间的应用关系,我们可以用一条线来表示出来,那这条线 如果我们已经能够知道啊,它是一条线的话,那这个线我们再具体看看它如何表示。不把 x 进来,这条线它有一个斜率啊,记作现在的 w, 我 们再给它加上一个数字 b, 就 可以来表示这条线了, 所以现在的数据进来,我们可以让他去乘以一个数,再加上一个数就能够表示这样的一个点的映涉关系。所以现在你就发现啊,这就是一个模型了,这个模型呢是这样来完成我的数据的运算的, 我的数据进来,首先呢让他去乘以一个数字,这个数字,这个数字我记作 b, 经过一个乘啊,第二步的加两步运算,就可以得到我们现在模型的输出了,那么这两步运算就对应了我的模型的运算过程, 而这里边的 w 和 b 就是 我们所说的模型里边决定模型输出的参数了, 所以当我们的模型确定下来,也就是我的 x 丢进来,能够得到我理想的输出,其实包含有两个方面,第一个方面就是这个里边要经过怎样一个运算的步骤,当前两步,第一步乘,第二步加。 第二,能够决定模型输出的就是现在这运算步骤里边的参数的具体取值了,这个 w 和 b 到底应该取什么值?当我们这两点都确定下来,其实你就能够得到一个固定的输出了, x 进来就会有一个对应的输出了。 所以通过刚才一个非常简单的例子,其实对于什么是模型,你脑子里面可能就有一定的概念了。 所以什么是模型呢?首先啊,我们可以把它看做一个函数啊,那这个函数它其实确定下来会包含两个方面, 第一,我叫做这个函数,也就是模型的结构,在刚才我们的例子里面,它的结构就是数据进来第一步先乘第二步再加,也就对应了现在数据进来了以后的运算步骤, 这就是我们模型的结构结构啊,对应的是运算步骤,而在这个步骤里边,刚才涉及到了有两个参数复杂的模型,咱们就会涉及到这个步骤更多,参数自然对应的也会更多。 所以啊,第一,能够我们的模型要确定是取决于他是一个怎样的运算步骤,也就是他的结构。第二,咱还得找到在这个结构里边所有参数都应该取什么值。 当我们的结构确定下来,当我们这个结构里边所有的参数值咱们也都确定下来,咱们这个模型就算是找到了,就可以拿来去使用,去解决一些位置问题了。哦, 这是我们的模型结构啊,模型的确定,所以在这里总结,模型的确定要包含两个方面,第一是它的结构,也就是数据的运算步骤,第二是这个结构里边所有涉及到的参数的具体取值。这两件事都确定下来,我们的模型就确定了。那么 我们要找的这个模型,咱就奔着这两个方面去找,第一我们来找它里边的结构应该是怎样的,第二,我们来找这个结构里边的参数都具体是什么值,这就是我们深度学习在学习和解决过程当中要找的东西了。好, 那么这个结构刚才说了就是运算步骤,这就对应了我们所说的那一个个的模型结构图了。比如说大家有可能之前有见过,这个是 transformer 啊,非常重要的一个现在基础的深度学习模型结构,它告诉你的信息就是数据进来要经过一个怎样的运算步骤, 从这里输入进来,先全连接也好啊,先注意力也好,先爱着也好,先闹也好,经过一步一步的运算,如何得到输出的一个运算步骤, 这个呢,是我们这一波啊,现在这一波人工智能兴起最初的那个模型,由它推动了咱们这一波深度学习人工智能的热潮啊,二零一二年的 alex night, 这个图给咱们包含的是 alex night 这个模型的结构,这个结构告诉你的也是数据从这儿进来,第一步做什么运算,第二步做什么运算,一直到输出都经过了一个怎样的运算步骤, 这个呢,是我之前和学生做实验所参考的一个模型结构,这个结构告诉你的也是数据从这进来如何一步一步运算得到输出。所以你在这要知道了,咱们所学的所讨论的一个个的模型结构,包括什么 gpt 啊,包括啊,其他的啊,各个只要说的是模型结构,告诉咱们的都是数据进来要经过一个怎样的运算步骤,你所看那一个个的模型结构图给你体现的信息都是数据进来要经过一个怎样的运算步骤,这就是结构的意义。 而在这个结构里边还会是要的大量的参数,参数要怎么找,这也是非常重要的啊,所以结构 参数都怎么定呢?结构就是根据我们人,我们现在做实验的人对于你的数据,你的任务的理解,对于深度学习这块知识的理解,去自己选择的 啊,这是我们设计者自己人为去选择的东西啊,不知道怎么选,自己就去做大量的对比实验,哪个效果好就在哪个上面再去做变化,再去做深入的讨论 啊。但如果你有一定的知识,比如说深度学习,我对于各种模型非常的熟悉,现在我手里有一个具体的任务,我根据我之前的知识基础,我就知道哪种模型,哪种设计对于我的任务更擅长,这是最好的啊。所以这个结构是根据设计者的经验去选择的, 而选择了结构之后,我们就要找里边的参数了,找参数的过程就对应了咱们所说的训练过程,也就是我们经常所说的我们模型的训练,其本质就是在一步一步的优化参数好的, 所以深度学习的本质就是通过训练啊,去确定你模型的参数,从而来解决你的问题。 好了,那么我们就继续往下,我们现在通过一个例子,咱们来体会一下这个例子所对应的任务,使用深度学习的时候 经过了怎样的步骤,最终我们找到要找要用的这个模型的。好,我们现在举一个具体具体的例子啊, 我们通过这个例子咱们来体会一下,使用深度学习完成一个问题要有哪几步啊?我们用的这个例子比较简单,但是再复杂的问题,其步骤都一致。 首先我们现在的问题是希望能够去识别图像当中的手写的数字, 这是我们现在的需求,也是我们的任务。那么我们就希望借助深度学习这个工具,帮我们来找到一个能够以图像作为他的输入, 他的输出呢,是能够以识别出来的图像中的数字为他的输出的。这样的一个模型好 输入是一张图像输出,是他所识别出来的这个数字。那我再明确一下啊,我们这个图像当中只有一个数字,所以他的输出呢,也就是零、一、二、三一直到九这十个选择里边的其中一个, 也就是十分类问题啊,所以这是我们现在的目的,来找到这样的一个模型之后呢,我再给他任何一个手写数字的图像,这些都是我自己手写的,我丢给这个模型他都能够帮我来识别出来 啊,这里边的数字是什么?也都,也就是说都会对应的在零到九里边选择一个作为当前的输出,这是我现在的任务。 好了,那么我要完成这个任务,我们来看我们的步骤啊。完成这个问题我们有哪几步?首先第一步来选定我的模型结构。刚才说了,这个模型结构的选定取决于两个方面, 第一,你现在的任务你有多了解,比如说我现在了解我的任务不过就是一个图像分类吗?好,我对于这个任务有一定的了解。 第二就是你在深度学习这块的知识储备。好,我知道我现在要做的其实就是一个图像分类的这件事情,而我的知识储备,我知道啊,对于这样不太复杂的图像分类,我用卷积作为我模型的结构会比较适适合。这是取决于我对于深度学习的知识储备 两个方面能让你确定下来你现在的模型结构是什么样子的,这是我们现在解决问题的第一步,选定模型结构。 好,我,我这个问题我就选择 alex net 了。啊,根据我现在问题我的理解和我的深度学习的知识储备,我选择 alex net 作为我现在的模型结构。这是第一步选定你的模型结构。第二步准备数据。 我,我,我们刚才说了,我的目的就是来找到一个当前的模型,模型的确定包含第一结构,第二是参数,我刚才已经根据经验去选定了这个结构,下面不就找参数吗?你找参数就可以了,干嘛要准备数据呢? 同学们啊,我们的深度学习有学习两个字,只要有学习就需要基于经验。现在的数据就是让我们模型学习的时候所参照的那个经验, 就像我们小时候我们去学,我们上学这么多年,我们要学某一个科目的知识,我们要学好了,要最后能够解决问题,那我们要通过大量的练习一样,你现在所准备的这些数据都是我们模型在学习过程当中的那些经验, 都是让他练习所用的那些练习题,这就是我们的经验数据啊,这是第二步, 那也就是说我要去找当前模型结构里边的参数,要用这些数据去找,也就是我之后找的参数对标的是你现在给他准备的这些经验数据, 这是第一步和第二步,第一步我们去选定模型结构,第二步准备好现在咱们要解决的那个任务啊,所相应的经验数据, 这是数据干什么用?所以我现在是希望得到之后能够识别图像中数字的这样的一个模型, 所以我给他准备的经验数据,你会发现全部都是这样的一张张图像,每一张图像里面都是我之后要处理的那个手写数字,那就每张图像里面其实都是一个手写的数字,我之后这个模型不就是要识别图像当中是什么手写数字吗?现在我们的经验数据就是这样的一些图像, 和我们之后要让模型去处理的任务非常的对齐啊,而且呢我这些图像不光这里面都是一个个手写的数字,而且我这些图像呢,我也都去给他打好了标签,你说你这个图像里面是什么数字,我已经人为的做好标注了 啊,我拿这样的数据作为我们之后调整模型参数所对标的经验数据。好第二步, 所以在这里呢,你要知道,第二步我们要准备经验数据,且我们应当清楚这些数据的作用是作为模型参数调整的标杆的啊,我们模型的参数要对照着它们的情况去调整参数。 第二,他该有多少啊?既然作为我们的经验数据,那自然是越多越好的啊,但是有很多问题,我们可能实际上面找不到那么多的数据,也有一些对于小样本解决的方法,但是本质上啊,他一定是越多越好的。好了, 那么我们就到了第三步,第三步我们就可以开始训练模型了,而训练的本质就是去调整参数,所以第三步呢,我们就可以根据我们现在的模型结构,根据我们给他准备的经验数据,去 一点一点的找咱们这个模型结构里边的这些参数的具体取值了啊,所以找参数的过程就是对应了模型的训练。所以第三步是模型的训练,其本质就是去优化结构当中所有的参数值。 当我们找到了所有的参数的合理取值之后,还有一步,这一步叫做验证,什么意思呢?我认为我现在的参数都已经是调整到最好的状态了,但到底好不好呢?咱们得实际上去验证一下, 所以在此时我再找一些数据,这些数据也标注好了他们正确的答案。而我让我的模型啊,已经用我认为调整好参数的模型, 把他呢拿过来,把我现在的一些他训练的时候没有见过的有标签的样本丢进去,看看他的输出和我们现在打的标签到底一致不一致,从而来对于我们现在的模型性能进行验证, 一二三四四步啊,第四步是验证,他的目的就是看看我们现在的模型在一些未知数据上面他情况如何。 所以现在我们借助刚才这样的一个比较简单的例子,但是我们看到了深度学习解决问题的步骤 四步,这四步就是我们深度学习最终落到工程上面所对应的四个代码段了,也就是我们深度学习完成的四步。好了,这四步脑子里边清楚了,现在咱们把训练也就是第三步再展开来看啊,这里边还会涉及到一些知识啊, 那这这个训练过程依旧啊,咱们不分具体的任务不限于某一个模型啊,只要是深度学习在这里百分之九十五以上训练过程都是我们现在马上看到的这个过程。 刚才我们已经弄清楚深度学习解决问题的步骤了,模型的训练是在这个步骤里面的第三步,现在我们就把训练过程展开来看啊,那这些呢,会让大家再去学具体深度学习模模型啊、算法呀这些知识的时候,咱们脑子里面会更清晰一些啊, 好,还是用我们刚才的例子,是希望借助深度学习得到这样的一个模型,这个模型之后我们丢给他一张图像,这个图像里面有一个手写的数字模型,能够帮我们识别数字是什么,也就模型的输出 是这里面的数字是几,从零到九里边啊,来看模型的这个图像的数字是几,作为模型的输出 是我们现在的例子,这个任务的完成过程,我们刚才说有四步,第一步根据任务和你的深度学习的知识来选定一个模型的结构。第二步根据你现在的任务,也就是我要识别图像当中的数字,所以我来准备相应的经验数据。第三步就是训练,也就是来 调整现在你结构里边所有的参数,给他们优化到合理的值。第四步是对于模型的参数进行验正好啦,我们现在要将训练第三步展开来看好, 此时大家知道我们已经选定了模型的结构,也就是我我的模型结构我已经先搭出来了,将这个结构所对应的模型设立出来了相应的对象, 且我们已经将我们现在要去对标的经验数据,也就是我们的训练数据准备好了。这两步我们都已经准备好了,我们就来看看咱们的训练,也就是我们的参数调优是怎样的过程好, 怎样的过程呢?来从我们准备好的经验数据当中选择一张图像啊,选择训练机当中的一个训练样本丢给我此时的模型, 我此时的模型可不可以从前到后完成完整的计算呢?来同学们告诉我,根据刚才咱们所讨论的东西啊, 我现在从我的经验数据当中,我的训练机当中选择一个样本丢给了模型,我此时的模型我是不是已经确确定它的模型结构了,也就是我已经定义出来它的运算步骤了,对不对?那我现在把数据丢给他,可不可以 从头到尾顺利地进行运算,得到模型的输出呢?首先我们来考虑一下怎么叫做顺利得到输出呢?顺利的得到输出,也就是丢给这个模型啊,它一步一步运算,可以顺利地传递下去, 就说明,第一,我模型的结构咱们要先有,咱有啊,我不是说了咱们选择 ilex net 吗?第二,这个结构里边所涉及到了很多的参数,这个参数的值它也得有, 这样的话,咱们这一步才能够进行明确的运算得到结果啊。那么参数的值有吗?这就是刚才有位同学说的认为不可以的原因啊。 我告诉大家啊,虽然我们还没有进行训练,我们还没有给这些参数完全的调优,但我可以让他有值,也就是说,我此时可以通过随机数作为他的初试值,是没有问题的。 那如果他有了值,在这里就可以顺利的计算得到结果,咱不管他好不好,可以得到,对不对? 所以能,所以在这里我们呢,选择一个样本丢给模型结构,有里边的参数都用随机数给他填充了,那么他就可以一步一步运算得到输出了,这是他的输出没有问题吧? 对,只不过不一定对。是的,我说的是能不能啊,没有问他好不好是吧?他不好,刚开始一定不好,但在此时我用随机数给参数了出市值,他就能得到输出了, 对不对?所以现在我模型里边的参数就用的是随机数来给他作为的填充啊,作为他的出使值,我找了训练数据里面的一个样本, 就作为他死时的输入了,他就给我得到了输出了,这是他的输出啊,不管好不好,输出了好了, 那么我们继续往下走,因为为什么呢?咱们现在说的是训练过程,训练的目的是不是完成参数的调优啊?一步他可一轮一轮的调啊,但是每一轮的中指都是到他参数完成更新啊,参数进行过过更新才是完成我们的目标,对不对? 所以现在这没完成目标,这只是找了个样本,得到了模型的输出。我们继续往下,我们由模型现在的输出和这张图像本身的标签,这个标签咱们之前人为的打过啊, 和它的标签一起来对比一下,看看我模型的输出和它的正确答案之间差多远。这个差值我们就叫做损失了,所以第二步 我们由模型的输出去计算得到损失。第三步我们已经有损失值了,损失值刚才大家已经知道它的意思就是来体现模型的输出和我们的 label 之间的差, 那么我们就可以有参数调整的方向了。什么是我们参数调整的方向呢?我只要现在新的参数是比之前的参数能让损失变得更小,我们的参数就是更好的, 所以此时我就往能让损失降低的方向去。找到了所有的参数的新的值,也就是给参数由随机数进行了一次优化。 如果我把我随机数的参数记作 w 零,那么现在更新了一次啊,进行了一次优化,我就给他记作 w 一。 b 也是一样啊,如果最初 b 的 值随机数这里我记作 b 零,那么此时我就得到了 b 一, 那么现在我们模型里边的参数就由随机数完成了一次更新, 那么这里边刚才一共发生了有三步。第一步是我把我的一个训练样本丢给模型,就让他以随机数作为当前的参数值,得到了模型的输出,这是第一步。 第二步,由模型的输出,我去计算了一下跟他的 label 啊,去计算了一下差值,也就是计算得到损失,这是第二步。第三步,往能让损失减小的方向找到了新的参数值,也就完成了参数的更新,这是第三步,一二三 三步,那我们就继续往下,同学们,我们的参数模型的参数由随机数此时完成了一次更新,但一次更新一定不会让我们的参数就就找到最好的这个结果了,所以就这样我们一步一步让它往好的方向走, 我们参数就这样一步一步啊,每次优化一点,每次优化一点,让这个过程循环起来,经过若干次循环之后,我们找到了最终我们又留下来使用的参数,所以这个过程我们再来, 此时我模型里边的参数都是刚才优化过的,我记作 w 一 和 b 一, 我再找一个样本,从我的训练级当中把它丢给我刚才经过一次优化过之后的这个参数的模型, 我说清楚了吗?我再找一个样本丢给我刚才已经完成过优化,就是我刚才优化过的那个参数的模型,去让它继续 得到它的输出啊,在 w 一 和 b 一 的基础之上得到这个样本,现在模型的输出它依旧不太好,没关系,但我们啊,把它作为此时的一步, 第一步得到模型现在的输出。第二步由这个样本和现在模型的输出去计算此时它的损失。第三步,往此时的损失能够降低的方向再次更新参数, 还是这样的一二三三步,但我们的参数就完成了第二次的更新。好,这个过程呢,我们就这样循环起来这个循环的过程,刚才的三步,第一步,把样本丢给此时参数的模型,得到模型的输出。 第一步我们给他记做啊,就叫做前向传播,得到模型现在的输出。第二步,计算损失,由模型的输出和现在的数据本身的标签去计算差值, 叫做损失第三步,就去往损失降低的方向更新参数,这三步我们给他打包起来,放到代码里面啊,就是放到放循环里边一二三这三步,好了,这就是我们训练过程,就是这样的三步,我们循环起来 啊,每次都让参数能比之前好一点,一点一点一点,逐步的去优化我们所有的参数,这就是我们模型的训练过程。 那我们现在就来说一说刚才同学们问到的几个问题,第一,损失如何计算得到,第二,梯度下降是怎么回事?第三,激活函数是怎样?我们先来看损失函数, 首先我们知道损失函数就是去计算得到损失的运算过程,那个函数就叫损失函数。不同的问题,我们在这里的损失函数不一样啊,因为咱们的任务有差别, 比如说如果我们现在呢是一个回归问题啊,什么叫回归问题?比如说我们现在模型预测的的值是取决于一个连续空间,比如说我们预测小孩的身高,这就叫回归问题,是一个连续空间。那么我们的损失函数呢? 就可以是,比如说就用军方误差,我把我现在预测的小孩的身高和小孩真正的身高去计算得到一个差值,为了避免方向,为了避免符号,我们再去求一个平方, 这是非常常用到的回归问题的损失函数。如果是分类问题呢,我们可以用交叉商,这个我们在这里不去展开,所以你要知道的是不同的问题,我们会选用不同的计算方式 啊,但是哪一种方式在这里呢?都可以体现当前模型的输出和期待结果之间的差值,就可以记为损失函数了。 那复杂的问题在这里的函数呢,也就是损失函数呢,就会相对复杂一些,但你拆开来看,会发现本质上还是可能用到的,像军方误差和交叉上损失函数这样回归和分类的问题啊,融合到一块啊,就作为一些复杂的损失函数。所以首先损失函数大家就知道 它的意义,就是去找到现在你的输出和你期待结果之间的差值,并且能给我们的参数更新指明方向,就根据你现在的具体问题,可以去构建你的损失函数了啊,意义和目的清楚了,可以根据不同的任务去构建不同的损失函数。 好了,损失函数我们就说到这啊,我们继续往下来看,梯度下降,我们要知道啊,梯度下降在我们现在整个任务解决过程当中的哪个位置,咱们再来具体说一说梯度下降是怎么算的 好,什么位置呢?我们回到训练过程里面来看,我们说我们的训练目的最终就是来更新参数,所以怎么来完成参数的一次更新呢?首先选择一个我的经验数据,丢给现在参数 所构成的模型,得到模型的输出,让我们由模型的输出去计算啊,他的标签啊,去和他的 label 去找模型的输出和正确答案之间的差值,也就是损失。我们往损失能够下降的方向去更新所有的参数,所以此时啊更新参数 用到的具体计算方法就是我们所说的梯度下降了,梯度下降在这儿,也就是说我们所谓的向损失降低的方向更新参数,就是梯度下降这个算法的过程。 好,这是梯度下降在问题的哪儿?所以咱们来看看啊,假如我现在的这一个横坐标呢,对应的是我某一个参数 w, 纵坐标呢,是对应的相应的损失值,也就是说我的 w 取不同的值会带来不同的损失, 这点大家应该通过这个图能够看出来啊,好理解,好,那么如果是这样有这样的一个图的话,那么我这个最好的参数值我们一眼就能够找到,一定就是它了,因为它能让我的损失值最小, 这里没有问题,同学们,如果真有这张图,咱们所有事情都不用再做了,你直接找这个点就可以了。问题就在于我并没有这个图是什么,我们有的是现在我参数的值,比如说我这个参数取值为零点五,这是我现在有的, 且我能够知道,我如果此时这个参数取值为零点五,我把一个样本丢进来啊,得到了模型现在的损失,比如说这个损失是二点五, 这是我现在有的参数现在的值,以及现在的损失,也就是说我们只有这个点,那咱们怎么办这个事呢? 如果我们有这个图,如果我现在是图上的这个点,那么我们一定知道咱们要把参数往大调,能让损失更小,也就是我知道我要把参数往右,是能够让损失更小的,是能够找到更好的参数的。 这时我们如果有这个图,但我没有,我只有这个点,所以此时有一个数学的概念叫做梯度,它的意义是此时它上升最大的方向,在这啊,这是梯度的意义是此时这个点上升最大的方向。 好啦,那如果我能够找到这个点的梯度值,我能够找到它上升最大的方向,负的它的梯度,负的 grad 不 就是它下降最大的方向了吗?损失函数一定要可导,因为我们现在 不管多复杂的模型,他的参数优化的方法都是基于梯度下降的,所以就说明我们在整个模型计算的过程当中,每一步都得可导啊,包括导损函数不可导这件事情就没有办法基于梯度下来办了, 所以我们现在的模型都要可导在这一步中间的运算步骤里边,所以大家这个都能理解的话,梯度下降的这个运算的公式就能出来了。来看是这样的, 这是我们当前的参数值,这是我们当前这个参数的梯度值,所以我们让我们原本的参数,比如说我们记为最初那个 w 零啊,咱们刚才那个例子,我让 w 零去啊,往,这是 w 零梯度值, 我让我的当前的参数往梯度下降的方向走一步,是不是在理论上来说就是找到了更好的参数值了,就是找到能让损失变得更小的参数值了?而此时还有一个问题啊,好,首先先来说这个, 大家能不能理解来不看下面的这个啊,只看我这里写的,我本身参数的出使值为 w 零,我更新,我让他能够变得更好。更新的运算方法,计算公式是用 w 零去往他现在梯度下降的方向, 也就是减他的梯度值,这样去算一步,就说明我让我的参数往能让损失下降的方向走 走了一步,且这一步的大小是梯度值这么大,如果刚才这里大家都能够跟上,能够理解的话,其实此时就应该能够想到另另外一个问题,什么问题? 就算我这个点在这,我往右走是正确的方向,但我这一步如果走的特别大,比如说我现在格 right 的, 就是我求得到他的梯度值啊,我知道我要向右走,但是我这个梯度值是五, 所以呢,我这一步就会走到这儿,也就是说我的参数呢,就会到 w 的 值,就会到这儿五点儿多,那么对应的损失值就会变得更大。所以刚才我想说的是, 这是我参数第一次的值 w 零,我取到这儿得到了这样的一个损失。好,我按照当前的这个更新的方法, w 零减去 w 零点儿 right, 那 但他的梯度值呢?我求的是五,非常大,所以我是找到了正确的方向向右走,但我这一步迈的太大了,反而得到了更大的损失。 所以这就说明咱们这一步你要有方向,且不要迈太大,负是代表了他的方向,而且在前面呢,咱们要有一个数字给他去做个约束,比如说我让他乘以零点零零零一,他不就确定这一步不会迈太大了吗?我把零点 零点零零零一跟它相乘,乘一下,不就让它又有正确的方向,又不会卖太大,而得到了一个小的啊,比较比之前更小的损失,也就是说明我们现在的参数变得更好了,我说清楚了吗? 所以我们的梯度下降写的过程当中啊,这个公式里边,在这里是我们之前的参数值,这是求得的当前这个参数的梯度,而让它在前面有一个学习率, learning rate, learning rate, 它通常非常小,来限制一下这一步不要迈太大,这就是我们梯度下降的公式了,这样的话我们就找到了更好的一个新的参数了,在原来的参数的基础之上,让它往梯度下降的方向这个符号去小小的迈一步, 这就是我们的梯度下降算法。我们现在不管模型多大多复杂,它的优化过程本质上都是刚才那个过程,只不过在那个过程上面再加点花,我说清楚了吗?但是它啊都是梯度下降好看最后一个部分激活函数。 我们大家如果对于深度学习有过一些模块的学习的话,比如说你学过全连接,学过卷积,学过注意力,你会发现我刚才所说的这三个模块,其本质 都是一个哈加权求和的过程啊,所以他们都是成家这样的运算堆到一块的。但如果一直我们的模型都是在做乘法和加法运算,这就是一个限性转换的过程,限性变化是不能够解决所有的复杂问题的, 这个我们在这里不去立正了啊,大家可以去看相关有很多的资料来证明,所以我们的运算过程,你这个模型的一步一步运算的过程当中,不能只有加和乘,还要有一些非限性的转换。 激活函数在这的功能就是给他添加模型里边的非限性转换的,这是激活函数的作用,所以你去看所有的激活函数,全部都是非限性转换的函数,我们来举几个例子啊, 什么叫限性啊?转成非限性,你看左边这个就是一条线的模型,这样就是非限性,不是一个平面,能够就它它,它的对应的不是一个平面啊,不是一条线,这叫非限性了。 好,这是非限性的一个转换的函数,我们来看几个常见到的激活函数。第一个就是 logistic, 大家有知道它的吗?哈, 我说这个名字可能很多同学不知道,但我把常用的名字给大家说它叫 sigma 的, 大家肯定很多同学就会来见过 sigma 的 同学回复一举个手啊。我们非常常见到的一个激活函数,一个非限性转换的函数, 它将所有的数值都压缩到零到一之间,是一个这样的 s 型,输入越大越接近于零的。这样的一个 s 型,就是大家经常收到的 sigma 的, 很多同学一定见过 它更严谨的叫法叫做 logistic 啊,也就是说这个 sigma 它并不是对应的它,它对应的是以所有的 s 型,比如说你看右边这个,它也是 s 型,但它将数值压缩到了一和负一之间,这也是 s 型,严格意义上来讲它也是 sigma 啊, 所以呢, logistic 是 零到一之间啊,这个压缩到一到负一之间的 s 型函数,我们就是常见的 touch, 这是两个非限性转换的函数,它们都做了非限性的转换,都对于数值进行了压缩。一个词是压缩到零到一之间,一个是压缩到负一到一之间,它们都是 s 型啊, 来继续。另外一类呢,就是这种啊,不是 s 型,咱们看看它是怎么压的,怎么进行的非限性转换。我们先来看左边这个, 他可以将数值啊,如果你的输入是一个负数的话,就给他转为零,全部都切为零,如果是正数的话,就保持不变。这个就是我们经常说的 relev 了,他也是一个非限量转化的函数,输入的是负值的时候,全部输出都为零,输入如果是正数 就保持不变啊,这就是 ray lou。 那 另外一个呢?这个是在我们的大语言模型里边经常会用到的,它是 ray lou 这个家族的,长得跟 ray lou 非常像,叫做 j lou。 它是怎样的呢?你看啊, 它在这个角这块呢,做了一个弧度啊,不像 ray, 是 直角硬切的,而在这有了一个弧度,这是 ray。 这些都是比较常见到的激活函数,它们的功能全部都一样,是完成非限性转换的。在我们的模型运行过程当中, 当然有的时候同学会说它还是有了压缩的功能。对,比如说像刚才的 s 型,压缩到零到一之间,压缩到负一到一之间有,但更核心的功能是完成非限行转换,比如说我们经常用的 j 路,它就不是压缩到某个范围啊,那算是 是吧,一个小的负数到往大多少都可能出现啊,所以压缩不算是所有激活函数的本质功能啊,但是非限性转换是所有激活函数都要包含的功能,也就是说所有的激活函数都是一个非限性的函数。 好选择什么样的激活函数由什么决定?不同的任务里边适合用的不一样,比如说这个就更适合用在图像里边,这个就更适合用在语言模型里边,不同的任务不同的问题啊,适合的不一样, 根据问题来,那如果不知道就去做对比实验,根据实验结果选择一个好的。好啦, 总结一下我们今天说到的哪些内容。首先在今天的内容里边,我跟大家先去梳理了深度学习解决问题的四个步骤,他不针对于某个具体的模型,也不针对于某个具体的任务,也就是只要你要用深度学习,他的步骤都是这四步。 第一步,根据你的知识经验先选定模型结构。第二步,准备好,你现在让模型能够对标的经验数据,也就是训练级。第三步,就可以通过训练 调整当前模型结构里面所有的参数值了,对参数进行优化,这是第三步,训练最后呢,我们对于训练好的模型进行一个性能的验证啊,也就是验证部分。而训练这里也就是参数优化的过程,我们又给他展开来看, 他参数是一步一步一点一点去进行优化的,每一次都比之前要好一点,而每一次完成参数的更新,其步骤又都是一致的。 第一步,先把你的数据丢给现在这个参数所对应的模型里边,去得到模型现在的输出,由输入到输出的这个过程就是模型的前向传播过程。 第二步,由模型现在的输出和本身数据的标签去进行一个差值的运算,这个差值就是我们所说的损失值,差值计算得到损失。第三步 呢,网能让这个差值减小,能让损失变得更小的方向去进行参数的寻找啊,去更新参数,而这个具体的计算就是我们讲到的梯度下降,这就是我们今天的内容。

今天呢,我想带大家去走进这个模型的内部,看一看这个模型拿到 token 以后,他是怎么去处理的,到底经历了什么才会去做下一个词的这个预测之前呢有给大家去讲过 token 这个概念,中文名呢已经定义了,叫做词源, 这个呢你可以把它理解为是 l m 的, 就大圆模型的货币啊, ok, 那 文字啊,就是比如说一个中文啊,你好,那进入大模型之前,它会去转成这个 token, 然后呢给到这个模型,让这个模型去理解,但是把这个文字转成这个 token, 只是我们去开展我们跟大模型的交互的故事的开头。好,那我首先呢先给大家再去强调大约模型,它的这个方式就是你每次给这个 l m 发一段文字,比如说 你给他发一个词,比如说就预测出来,你后面我要跟着的是。好, 那再举个比较详细的比方,假设你给定这个输入是中国的首都,是未给大元模型,那模型呢,它其实不是去理解这个中国的首都啊,它是干嘛呢?它是基于中国的首都这个前面的这个输入啊, 去给出我后面这些词汇表里面每一个词的概率,比如说有个北京,他可能给的概率呢是百分之九十二,那还有呢,比如说北平,他的概率呢是百分之四,可能还有上海概率是百分之二。 通过这一系列的概率的词汇表,最后呢找出概率最高的这个词,再加到输入里,那就是北京,对吧?好,拿着北京输入以后,输入给大模型的前面,那中国的首都是北京,那后面再去接什么呢?那可能要接的是一个逗号,对吧? 通过这样一个标点符号再去循环的一次的预测,这个呢就叫做自回归生成,是不是这个听起来很简单, ok, 我 前面拿到这句话,然后呢我去预测下一个词,预测完下一个词呢,我再去预测下一个词,一直循环的往下去预测, ok, 虽然简单,但是现代的这些 ai 的 各种的一切啊,就你看到的,比如说去做口令,对吧?去写代码,去做翻译啊,圈式的选,去做推理,都是只通过涌现出来的,就可能前面比较平啊,突然一下他能力往上飙升了。 ok, 那 理解这一点呢,我们就能够去理解 lm 的 基础,接下来呢,我们就沿着一个头肯到底是怎么一步啊,一步从这个模型里面啊,给他预测出来的, 来给大家呢,去偷袭一下,把这个模型的内部给大家拆解出来看一看。那首先呢,第一步就是去把这个编号 变成一个坐标,比如说一个词,你啊进入这个模型的时候呢,他会转成一个数字编号,比如说他就是一五七三八这样的数字编号,比如说还有一个你好呢,可能是,比如说一八七二五啊, ok, 但是呢这个数字啊,他本身就不携带任何的意义,你不能通过这两个编号的这样的一个加减法来判断你和好之间到底距离有多远, 这个概念呢叫做语义距离。那模型做的第一件事就是去把这个编号查表这个事情转成一个高维的向量,这个呢叫做 embellin 的 过程,所以呢项链呢,可以去理解成一个多维空间里面的一个坐标啊,在这里呢,因为这个空间关系,我可能就画个三维的,那在这个坐标里面羽翼相近的词呢,坐标也就更接近。我举个例子,比如说这个国王可能就和王后这两个点的距离 可能更接近一点,然后呢和这个苹果的距离呢,反而就会更远一点,而且呢这个空间是有方向的,比如说国王啊,减去男性的这个项链, 然后呢,再加上女性的这个项链,得到一个非常接近王后的这个点啊,这个其实就很简单的,我们以前学的这样的一个项链预算了,但是这个不是人为设计的,规则是什么呢?是通过模型的训练构建的这样的一个几何结构或者空间坐标系, 光有啊这样的一个语义的理解还不够,为什么呢?因为我举个有意思的例子,比如说我咬了狗和狗咬了我,它们的概念是不是完全不一样啊?因为顺序不一样,虽然它的词啊,都是四个字都是一样的字啊,但是它们之间的这个表达意思就是不一样的。 所以呢,大家能想到什么?既然这个编码的东西叫做 position encoding, 缩写呢叫做 pe 啊, 告诉模型,那这个词到底是属于句子里面的第几个? ok, 那 经过这一步呢,那每一个 token 就 会携带两类信息,第一类信息是什么,就是它是什么。第二个呢,就是这个位置在哪里?当你的每一个词有了语义信息和位置信息以后啊, 下一个问题呢,就是那模型到底怎么去理解上下文的?它毕竟不能只光靠这个词的向量啊。 ok, 我 举个英文的例子啊,就是 the animal didn't close street 啊,这街道 because it was too tired。 ok, 好, 那我们来看这个 it 到底指的是 animal 呢,还是指的 street 呢?那我们人呢,其实一眼就能看出来,对吧?哎, it 嘛,指的就是这个 animal, 但模型怎么去做呢?模型应用的机制叫做 self attention, 所以 self attention 要做的方法呢,就是让每一个词去询问其他的所有词, 找到跟自己关系最密切的那个,所以它的工作原理怎么样?就是这个每一个 token 啊,那进入了这个注意力层的时候呢,它会生成 q, k, v 啊三个向量, q 呢,代表 query, 它的意思呢,就是我在找什么,那 key 呢?就键啊,我能提供什么 value 呢?就是如果我被选中,那我能贡献什么内容。 ok, 那 计算过程就是把 it 的 这个 q 向量啊,分别和句子里面的每一个词 k 向量啊,做一个这样的一个点集,那得到了一组的注意力分数,注意力分数越高呢,就说明两个词的这个相关性就越强。然后呢,再经过啊 softmax 的 一个归一化, 当成一个权重之后呢?哎,用这些权重啊,再乘以一个啊这个 v 向量,然后去做这样的一个加权的求和。那结果呢,就是 it 的 这个向量被更新了,它不再只是代表 it 的 这个本身啊, 而是呢,他混入了阿里某的信息,这个就是代词和他所指代关系被关联起来的方式。 ok, 更多的这个 java 通讯的这个工作原理和这个公式呢,大家也可以去网上去看,很多的文章都基本都写的特别的清楚。 ok, 那 再讲一下呢,实际上模型它会运行的是很多组的这个 qkv, 我 们呢叫做多头注意力, 叫做 multi head attention, 那 它有很多的这个 attention 的 这个头啊,每组头呢,它是独立计算的,那为什么需要这么多的这个头呢?就是因为,哎,我有不同的这个注意力头,我是不是能够去关注不同的信息?比如说有的注意力头呢,它捕捉的是语法的依赖, 有的呢可能捕捉的是语义的关联,那有的呢,他可能捕捉的是一个纸带关系,最后呢把这各组的结果拼接起来,得到的就是一个更加丰富的上下文表示。另外还有个关键约束,就是在生成文本的时候,每一个词 只能看到他前面的词,不能提前看到未来。这个通过什么呢?这个通过叫做 code masking, 叫做因果掩码。那具体实现呢,就是因为你这句话,你不可能只去 mask 掉这个词啊,就是你在写代码时候很难实现,那他在写代码的时候呢,就是把,比如说当前预测这个词的时候呢,把后面这个词 的这个这个注意力分数啊,直接给设成负无穷。 ok, 那 他经过 self max 层以后呢,就直接变成了零, 那就达到了信息只会从前往后流动的这样的一个目的。那这个设计呢,是为了保证模型在训练和推理的时候行为一致的。 除了自回归以外,还有个叫做自编码的一个方式,那他呢就可能是在这个前面可以拿到信息,后面也可以拿到信息。好,那讲完 self attention 解决了词和词之间交流的问题,但每个词自身的信息还需要进一步加工。那紧跟在注意力层后面的 就是一个什么呢?就是一个 f f n, 一个前馈的神经网络,它不处理词和词之间的关系,而是对每个 token 的 向量做独立的非现金变换,那相当于让模型在这一步去消化刚才吸收的上下文,提炼出更加有用的表示。 所以呢,你可以这么去区分这 f fn 和 self attention。 注意力层呢,负责是在这个词之间去找到它们的路由信息。那前馈层呢,也就是 f fn 呢,负责的是对每一个词的表示做一个深度加工,这两个层合在一起就叫做 transform 的 一个 block。 那现在大模型呢,它会有很多的这样的一个全是 form, 然后呢,把它给堆叠在一起,可能呢会堆个几十个或者上百层,那每一层呢,都在上一层的基础上去做一个继续提炼。这有研究发现,每一层啊,对最终预测的准确性的贡献 是均等的啊,从第一层到最后一层,每一层呢,都按照相同的层级因子改善这个预测质量。那这规律呢,是比较跨架构跨规模的啊,是普遍成立的。 那最后啊,当所有的 block 走完以后,最后一个 token 呢,向量会经过什么?再会经过一个线形层,经过线形层以后,会被投射成一个巨大的一个列表啊,它那里有很多的维度,比如说假设有六三三七六啊维度, 那这个维度呢,就等于词汇表的大小啊,然后列表里呢,每个位置对应的是一个 token, 那 对应的数值呢,叫做 lodest, 就是 这个概率啊,反应呢,模型认为这个词出现在这里的一个原始得分,那经过 softmax 以后呢,那就把这个六三三七六个这样的 lodest 给转换成 加起来等于一的一个概率分布了。然后概率分布以后,也并不是直接去选最高的几个就完事了。这还有几种常见的一个策略啊, 第一种呢叫做贪心的搜索,每次呢就去选这个概率最高的,这个呢速度快,但是很容易会有很单调重复的。然后第二个呢,叫做温度啊,这个大家也很熟了, temperature, 这个温度呢,参数呢?去控制概率分布的一个平坦程度, 那如果你的温度越高啊,他的整个概率分布呢,会越平稳,那你的温度越低呢,他的这个概率分布呢,就会越 抖肩平躺,代表它的概率越分散,那输出呢,就会越随机,越有创意性,那概率越低呢,那输出就越确定于保守。所以呢,大家自己去用这个模型,可能会去调这温度,那大家就可以知道写诗的话呢,哎,我是不是就可以把这个温度调高啊?它能让我发上创意, 那如果只是去写代码了,我就可能去把这温度调低,让它呢更加准确, ok, 还有什么呢?还有就是 topk 或者 topp 材料, topk 呢,就是从概率最高的几个的地方啊,比如说北京,北平还有等等等等去做一个随机的采样。这个例子 有点问题,有些人呢,可能是百分之五十,百分之四十等等等等,这样的一个可能概率很相近的情况下呢,来去做一个整体的一个材料,那两者呢,都是保留多样性,同时呢也过滤到那些概率极低或者语意奇怪的这个词。 所以整个流程串起来呢,就是从用户输入文字,然后给到 tokenizer 去切分成 token 的 编号,然后呢再给到 embedding, 把这个编号转成一个高维的向量, 再给到 n 个 transformer block, 再给到宪宪城得到高维的 logic, 然后再给到 self max, 转成一个概率的一个分布,再给到采用策略选出下一个 token, 最后呢,把这个 token 解码成回文字,追压到输入来循环完复。所以呢,这基本上就是这一整套的机制啊,那这一整套机制看下来呢,本质上就是统计规律的一个机制压缩。那 l m 呢,不是一个知识的数据库,比如说当它生成北京的时候,不是因为它知道中国的首都是北京, 模式呢,在数万亿的 token 里面,发现中国的首都后面跟北京的频率概率是很高的,那模型学到的是语言的统计模式, 而不是事实本身。那这个呢,其实也能够去让我们去 get 到幻觉的一个根源。当训练数据里面的统计模式和真实世界产生偏差的时候,模型并没有去内置的一个纠错机制,它只是在输出听起来最合理的下一个词。 所以理解这一点呢,你就能够更清楚的知道什么时候该去信任这个模型的输出,什么时候应该对它保持警惕。这个比你记住任何的一些参数细节啊,要有用的多啊。