跳转至

2025机器学习导论

课程简介

  • 不要把AI看作魔法,而是魔术

生成式AI基本原理

  • 语言模型是什么?
    • 文字接龙
    • 接龙的通常被称为Token
    • 输入被称为Prompt
  • 语言模型如何进行回应?
    • 输入Prompt预测下一个Token
    • 将生成的Token接到Prompt后再预测下一个
    • 直到生成结束符号
  • 如何生成Token?
    • 概率,给分数
    • 掷色子
    • 词表的概率分布
    • 冰淇凌接在最高的山后面的概率极低
  • 文字接龙并不简单
    • 语言知识:较容易学,学文法
    • 世界知识:无穷无尽,没有办法全部知道
  • 如何学会正确接龙?
    • 网络资料
    • 人类标注
    • 使用者回馈
  • 语言模型为什么会回答问题?
    • 即为什么会接出回答?而不是继续可能的接龙?
    • 其实还有额外的输入,chat template
  • 语言模型如何多轮对话?
    • 模型的记忆
    • 其实还是利用chat template拼接了之前的历史和现在的对话
  • 语言模型真正做的事情就是文字接龙……
    • 因此会有AI幻觉,幻觉就是在接龙中产生的
  • 想象场景
    • 大模型就是在一个小房间里做文字接龙
    • 能够回答几月几号的秘密?
    • 因此人类需要保证有足够的信息交给模型
    • 预设每次对话可能是用的内容,这些会被注入提示词中
  • 机器怎么画图或发出音乐?
    • 还是接龙,像素接龙,取样点接龙产生声音
    • 太耗费资源了,等于每生成一张图片相当于写一部红楼梦
    • 利用图像的Encoder,而后生成图片Token,再通过Decoder接龙,再转回图像
  • 生成式人工智能基本原理
    • 让机器学会产生复杂而有结构的物件
    • 复杂表示的是无穷可能
    • 有结构的物件指的是基本单位Token组成
    • 尽管y的组合是无穷无尽的,但是下一个y的选择不是
    • 只需要教会机器如何每次选一个合适\(y_i\)
      • 其实就是一个分类问题
      • 在此表中做选择题
    • Diffusion Model:另一种生成模型
  • 开源模型和非开源模型
    • 非开源模型:不知道f
    • 开源模型:知道f,知道参数
  • tokenizer
    • 对应的就是我们之前说的词表相关的内容
    • vocab_size可以看到有多少Token可以选择
    • decode(token_id)可以查看对应编号的Token实际是什么
    • 128个空格合在一起甚至也是一个Token,各式各样的Token,包罗万象
    • encode(text)可以得到text对应的词表编号
    • 单词前面有没有空白可能划分为不同的Token
  • model
    • 就是我们的模型参数
    • 模型会根据不同输入产生不同输出的概率分布
    • model每次输出其实就是一些logits,不断输出以及根据概率取下一个其实都是工程上做的事情,包括循环、拼接、softmax
    • 通过掷色子进行接龙可能会出现奇奇怪怪的东西,因此实际操作时只有概率足够大的才会进行掷色子
    • model.generate可以简化上述实现,不用自己写循环
  • 使用chat template
    • 上面做接龙可以看到模型并没有在好好回答问题,只是在接龙
    • 自己想个chat template也可以做接龙,但是可能不会在合适位置停止,因此需要使用模型对应的template
    • apply_chat_template函数,会帮助拼接聊天模板并转化为ids
  • 一般情况使用transformers库使用模型还是用pipeline直接得到输出比较常用
  • 多轮对话的秘密
    • 历史记录
    • 运用模板进行拼接

上下文工程

  • 将模型看作利用f对于输入x操作
    • f(x)结果不对该如何处理?
    • 两条路,要么修改x要么修改f
    • 修改f中的参数叫做训练或者学习
    • 修改x就是我们的context engineering
  • 这堂课中被训练的只有人类
  • context engineering vs prompt engineering
    • 新瓶装旧酒
    • 早期版本prompt可以使用一些神奇咒语,早期能够发挥作用,上古时代
    • 神奇咒语越来越不神奇
    • context engineering:自动化管理
  • context里面需要什么?
    • user prompt
      • 任务说明
      • 详细指引
      • 额外说明
      • 输出风格
      • 提供前提会影响结果
      • 给范例,举例说明,GPT-3提出
    • system prompt
      • 身份信息
      • 使用说明与限制
      • 安全与禁止事项
      • 回应风格与格式
      • 自我定位与哲学风格
    • 短期记忆
      • 实际上没有训练模型,即接龙模型本身没有改变
      • 历史上下文
    • 长期记忆
    • 来自其他资料源的相关资讯
      • 网络或者资料库
      • RAG、Web Search
      • 就算是搭配搜索引擎也不能保证完全正确,因为还是进行接龙
    • Tool Use
      • Search、Gmail……
      • 先要教会模型如何使用所有工具
      • 还要告知模型特定工具的使用方式
      • 模型输出就是文字,无法真的呼叫工具,还是需要工程
      • eval(str)会执行str中的函数
      • 使用电脑?鼠标和键盘也是工具其实
    • 模型自己产生的思考过程
  • Context很长,所以Context Engineering核心目标就是避免塞爆上下文
  • 使用AI的方式
    • 一般使用的方式:一问一答
    • Agentic Workflow:按照固定SOP
    • AI Agent:自己决定解决问题步骤,灵活调整计划
  • AI Agent
    • 可以看成一个循环
    • Goal、Observation、Action、Environment
    • 回答是语言,因此可能性是无穷的
    • 从LLM角度看Agent,其实还是在做接龙
  • Context Windows Sizes
    • 能读入百万Token不代表能够读懂百万Token
    • 输入过长会有什么问题?RAG搜寻到的资料是越多越好吗?
    • Lost in the Middle
    • Lost in the Conversation?交互变长模型表现变差?
    • 腐烂的上下文
    • context不能过长
  • context engineering
    • 需要的东西放进来
    • 不需要的去掉
    • 三个方法:
      • 挑选需要的内容:RAG、websearch、reranking,不要把所有工具的使用说明放入context,挑选记忆
        • 对记忆进行RAG
      • 压缩内容
        • 互动100次压缩一次
        • 90%就压缩一次
        • 放到RAG
      • Multi-Agent
        • 近似于人类社会的分工

解剖大语言模型

  • 从输入prompt到输出下一个token
    • Tokenization:将句子切分为Token并变成对应ids
    • Token Embedding:输入id查Embedding Table表,查看对应的embedding向量,token embedding
      • 是一个矩阵,也就是参数
      • 相同token对应的embedding向量相同,语义相近token对应的embedding向量相似
    • layer by layer:一排向量到一排向量,长度保持不变
      • layer也是矩阵和参数
      • 考虑了上下文的embedding,contextualized embedding
      • 多个layer也就是deep learning
      • 考虑上下文后的embedding就会变得不一样
      • 不同层可能关注的不一样?embedding特定方向可能表示特定含义,例如表示中英翻译,将高维投影到低维空间进行研究?
      • 操控语言模型拒绝或同意?找到经过哪一个层的representation后包含拒绝成分?找出拒绝向量?抽离出来
      • logits lens:其实可以对每一层进行unembedding,看到每一层模型的心理变化
      • patchscopes:不同输入经过同一模型,其中一个不包含具体的事物,一个就是具体的事物或者人,替换每一层最后一个representation,从而看模型每一层融合了什么信息
    • unembedding:
      • 最后一个token向量拿出来,乘以一个映射到V维词表的矩阵,得到对应的分数logit
      • 再进行softmax,得到机率,也不一定用softmax,可以用你自己认为的可以表示概率的方式
      • 模型输出的只是logit
      • 首尾呼应,以始为终,最后的矩阵也可以使用一开始的embedding table
  • 看看每一层的输出是什么
    • 在上一章节介绍,尝试看模型每一层到底理解什么,思考什么
  • 看看每一层内部如何运作
    • Transformer架构
    • 一个layer中还有子layer
      • self-attention layer:融合上下文
      • feed-forward layer:得到输出
    • attention is all you need:
      • 不是发明了attention,而是拿掉了attention以外的东西,这是最大的贡献
      • 可以做很好的并行化
    • Attention Layer
      • 输入:两颗青苹果
      • 寻找输入中会影响[果]的意思的Token
      • 乘以矩阵得到query和key
      • 计算query和key的影响力分数
      • 没有考虑两个token的距离
      • 考虑距离:positional embedding
      • 算出attention weight,再进行softmax
      • 矩阵\(W_v\),加权得到新的向量,由于残差连接的存在,其实并不会忘掉自身含义
    • Multi-head Attention
      • “青”对于“果”很重要,找形容词
      • 但不能说“两”不重要,因此一般会有多个Attention,关注不同部分
      • 例如有一个Attention专门找数量关系
      • 多个不同特征的向量还需要糅合起来
      • 实际操作时只会考虑左侧的Token
    • feed-forward layer
      • 线性变换 + 激活函数
      • 一般两层,升维和降维
      • 神经元其实就都是矩阵运算而已,骗骗麻瓜
  • 可以剖析模型每一层的输入和输出
    • 虽然打印出来可能人类看不懂
    • 但借助上面每一层输出以及内部运作,其实我们就能知道一个模型到底在做什么

如何评估模型

  • 哪一个模型比较好?
  • 人工智能能力评价Evaluation
    • 模型输出与ground truth?
    • benchmark,评估模型在某个任务上的能力
  • 如何对答案?
    • 最简单就是exact match,直接比较答案是不是完全一致,但显然有很多问题,选择题这些场景可以使用这种方式
      • 但前提是模型可以看懂指令,能够只输出一个字母作为答案
    • 计算模型输出与标准答案之间的相近程度
      • BLEU、ROUGE
      • 比较有多少共同的词汇
      • 依旧有限
    • 通过Embedding看相似程度?representation相近
      • BERT Score
    • 不要过度相信evaluation的分数
      • 可能会得到一个在evaluation取得高分,但实际上表现不佳的模型
      • 聪明的鹦鹉、愚蠢的鹦鹉
      • 过度相信evaluation的分数也是幻觉的原因之一
        • 知道要说“我不知道”的模型在evaluation的时候并不获得青睐
        • 可能解法,加入倒扣,引导模型说我不知道而不是随便乱说
  • 如果没有标准答案?
    • 写小说,写诗
    • 直接找一堆人给分数,永远可以用的方法
    • 人类的评估就没有问题吗?
      • 有时候人类在意怎么说而忽略说了什么
      • 看一些格式是否漂亮,标点符号
      • 人类也有自己的偏见
      • 人类评估的setting不一样结果也不一样
      • 花时间、花钱、可复现性差
    • 用语言模型来评分
      • 先解释再给分数可能更好?
      • 把不同模型给出的分数的机率分数考虑在内?加权平均?
      • 专门评分的模型?专门训一个模型,也可以把加权平均考虑到训练过程中?
      • using verifier to impore models
        • 其实也就是reward模型,RL
        • 训练评估好坏的模型比生成容易,评价一本小说比写一本小说容易
      • 语言模型的偏见:
        • 对于自己的偏好,知道答案是修改后的也会增加分数
        • 加个网址引用而相信回答更好
      • 怎么做比较好?先小规模验证语言模型的评量结果
        • 看是否与人类评分接近,而后再用人类进行打分
      • 模型输出内容以外的考量?速度、价格、思考
  • 为什么考虑平均不一定是最合适的?
    • 平常都表现完美,但突然暴走
    • 有点小失真,但从不暴走
    • 上面两个模型哪一个更好?取决于你的需求
    • 木桶理论?考虑实际应用
  • 要考人工智能什么?
    • 问问你自己
    • 要考AI什么,取决于你在意什么
    • 单一任务、特定领域、通用模型
  • 各大语言模型在意哪些任务上的表现
    • 代码,工具,数学,知识,视觉,金融
    • 让语言模型下西洋棋
    • 模型能不能根据情景不同改变是否拒答?
  • prompt可能会对evaluation有影响
    • 处理长文的能力——大海捞针测试
    • 模型可能会拒绝回答,小心你使用的prompt
    • 使用多个prompt的结果进行平均
  • 模型会不会已经偷看过考题了?
    • 训练时是不是已经看过benchmark题目
  • 评量模型对于恶意使用的抵抗能力
    • jailbreak:回答什么和要不要回答是分开处理的
      • 击穿模型
      • 拒绝回答回路可能并没有启动
      • 暴力扰动尝试
    • prompt injection attack
      • 猫娘数字人?
      • 论文投稿的prompt injection attack
  • agent attack
    • agent跟环境互动时可能读取到
  • 语言模型的偏见
    • 性别、种族、年龄

机器学习与深度学习

  • 原理
    • 如何根据资料找出函数\(f\)
    • 可以找各种各样的函数
    • 输出数字的任务为regression
    • 可能有莫名其妙的的任务,比如我们来回答一个讲一堂课需要多久这个函数
  • 找函数步骤3+1
    • learning、training
      • 我要找什么
      • 我有哪些选择
      • 选一个最好的
    • 我要找什么?
      • 上节课的评估模型方法?
      • 计算预测时长和实际结果的差距
      • 越小越好,Loss
      • 越大越好,Objective
      • 这个过程几乎和Evaluation过程是一样的
      • 但其实两者有时候会不一样
      • 拿来定义Loss的数据资料就是训练集
    • 我们有哪些选择?
      • 可以把投影片表示成多个数字?比如页数、标题长度等等\(x_i\),其实就是feature
      • 可以看到目标输出可以表示成\(x_i\)的函数
      • 数值不知道的东西就是参数
      • 代表的其实是函数的集合,因为参数未知
      • 这些选择都是出自人类对于任务的理解,其实也就是模型,真实世界很复杂我们想办法去简单表示,这就是模型
    • 先把Loss完整式子写出来,选择不同参数则有不同的Loss
      • 我们需要选一个最好的函数,使得Loss最小
      • 我们真正要做的事情,要解决的问题就是一个Optimization问题
      • 假设对于optimization一无所知,最简单的方式就是暴力检索
      • 找到一组参数带入到Loss函数中,使得loss计算值最小
      • loss的等高线图?
      • 通用的做法进行最优化求解?梯度下降法。
        • 只考虑改变一个参数
        • 饿狼下坡?随便找一个起始点开始,看往左边和往右边踏一小步进行试探,往哪个方向可以使得loss下降
        • 往该方向踏一大步
        • 往左和右都不会使得L变小,停下,局部极值点
        • 实际并不会真的往左还是往右进行试探,会直接计算切线斜率,决定往哪里走
        • 如何计算斜率?偏微分
        • 深度学习套件可以自动计算
        • 一步要走多大?学习率和偏微分共同决定
        • 山坡越陡,跨的越大
        • 直到切线斜率接近于0
      • 实际过程
        • 随机给参数赋值开始
        • 分别求偏微分,也就是梯度
        • 更新参数
        • 反复上述操作
      • 更加通用的情况
        • 非常庞大数量的参数集合,看作参数集合向量
        • 分别计算在该集合参数时的梯度,也就是一个梯度向量
        • 更新参数集合向量,一次iteration或者update
        • 简化写法使用倒三角表示梯度计算
        • 反复上次过程
      • 概念很简单,做起来不容易
        • 首先很难调出一个非常理想的learning rate,过大过小都不好
        • 参数很多时,显然不能进行暴力搜索,我们发现loss几乎没有下降时,到底是停下来还是继续向前?
      • 参数更新太慢?
        • 计算Loss需要计算所有的平均
        • 如果训练资料很多,要等很久才能更新一次参数
        • 迫不及待地更新参数
        • 切分为多个batch,只在每个batch中计算Loss并更新参数
        • 1个epoch就是把所有的batch看一遍
        • 好处和坏处:update更多次数的参数,但是走得比较不稳定
        • 设置一个合适的batch size,不大不小的值,也是一个超参数
      • shuffle技术?每个epoch中的batch中组合不同,希望能够看到不一样的数据组合进行更新。
    • +1步骤?验证validation,模拟考
      • 验证集
      • 结果好可以进行测试
      • 结果不好就需要解释前三个步骤了
      • 验证第一步。错误的目标上进行optimization根本就是缘木求鱼?不可能得到好的结果,例如应该用导论数据来训练一个预测导论课程时长的模型
      • 验证第二步。是不是函数的选择太少了?不应该用线性模型?是否可以画一个有机会包含所有函数的范围,去拟合这些点?锯齿状的线去拟合曲线,都可以表示成一个常数加上一堆山坡状函数相加。参数太多了没法画loss的等高线图,只能画随着epoch增多的loss值的变化。结果这个更大范围的最小loss居然比线性函数还要大?什么情况?
      • 验证第三步。Optimization Fail?陷入局部最小值或者是卡平台,又或者就是loss下降梯度过小了认为已经足够了。每次要解决一个问题,可以从一个简单模型入手,因为我们知道不可能loss比一个线性模型低,如果低了就考虑是不是optimization出现了问题,而不是盲目去扩大神经元数量。怎么改?爆调超参数,学习率、epoch数量、batch size等等
      • 验证集和训练集上结果差距巨大时,就需要考虑是不是overfitting了,也就是过拟合了。函数表示范围越大越容易变得过拟合。
      • overfitting:选择越多,训练和经验的差距越大,学车和自己上路开车,训练场地的一些参考标记,换一个场地你也许就不会开了。这也就是为什么步骤二需要画一个范围,不能太大也不能太小
      • 一般需要在三个步骤和验证上反反复复,直到找到一个在训练集和测试集上都合适的函式。每一个Epoch结束都去量Validation Loss,进行early stopping。来来回回其实也是有代价的,可能在验证集上overfitting!可能得到一个在训练集和测试集上都loss低,但在测试集上一塌糊涂的函式。
    • 测试Testing,正式考试
      • 如果在测试集上表现不佳,还是需要重复上述循环,直到得到一个三个数据集上表现都好的函式。
      • 但是想象我们能够进行无限制的测试,会发生什么?overfit在测试资料上!也就是为什么benchmark上模型能够大幅打败人类。
      • 鬼灭之刃?人一次就会被杀死,鬼不会被杀死。
      • 所以一般都是将测试集划分为两个部分,public和private。private部分上只能测试一次,可能能够更加接近你模型的实际表现。
    • 两个特征相差比较大使用同一个学习率的时候比较难训练,很容易就训练飞了。
  • https://www.youtube.com/watch?v=Taj1eHmZyWw&list=PLJV_el3uVTsMMGi5kbnKP5DrDHZpTX0jT&index=6
    • 这堂课后面手动计算上述过程的实操可以多看两遍,其实就是一些矩阵,计算梯度,更新参数,相当于手写神经网络了。

理解参数集合更新过程

  • 理解参数集合更新过程

更新参数过程

  • 多次进行更新

多个batch进行参数更新

  • 比较full batch和多个batch更新参数的过程

如何表示山坡状函数

  • 蓝色函数可以用两个绿色函数表示

所有函数的拟合

  • 都可以表示为常数加上一堆绿色函数的相加集合,绿色函数其实就是ReLu函数

图形化表示上述过程

  • 将上述式子进行图像化

扩展到有多个特征

  • 扩展到多个feature,一切都是矩阵的相加相乘而已,有点惊人,居然就是一般深度学习的表示形式

扩展到多层

  • 我们可以将上一步操作的输出作为输入继续上述过程,也就形成了更多的layer,也就是deep learning。如果一层有非常多的ReLU就可以表示非常多的转折点,就可以表示出更加复杂的函数。

Optimization Fail

  • 更大的函数表示空间为什么没有得到更小的Loss?

极端情况可以学习出的函式

  • 上述这个函式没有违反我们选择的任何原则,但是显然不是一个好的函式,会导致验证集上loss的爆炸。

在验证集上overfitting

  • 在验证集上overfitting,仍然是一个没有用的函式。

训练神经网络常用技巧

听到一个跟训练神经网络有关的方法时,你要这样问自己: - 方法名 - 改了哪一个步骤?三个中的哪一个 - 新的Loss function? - 改了网络架构?也就是改变了函数表示空间? - 是一个更好的,更有效的,搜寻loss最低的方式 - 带来什么好处? - better optimization:更低的Training loss - better generalization:更低的Validation loss,避免over fitting的发生

流水账开始介绍

改进步骤三: - 改进optimization - 选择optimizer - Vanilla Gradient Descent:最简单最基本的梯度下降,根据当下梯度算出来的,如果当下gradient为0,就不知道该怎么走 - Gradient Descent + Optimizer:根据一堆历史梯度一起来决定方向 - 为什么需要optimizer:LR实在是难调…… - 太大很容易训飞,太小容易走很多步也没更新多少 - 不同参数应该要有不同的learning rate:因材施教 - 我们没有上帝视角,但是可以使用过去的Gradient来决定LR,梯度大我们就给他较小的learning rate - Adagrad:引入一个控制量,不停计算平方和并开根号,手搓也很简单,代码需要更新的地方就是使用Adagrad更新参数。可以将lr调的很大,因为很快也能够调控回来,也应该这么做。 - RMSProp:上述改良版,给予最近的梯度更大或者更小的权重,通常需要更小的lr,否则容易训飞 - Optimization会在Gradient很小时停止 - 不一定停在local minimum,而是在gradient为0的平地Saddle Point或者极小的点Small Gradient,坑太多了,如何处理? - 想象动量Momentum?移动中的物体不会轻易停下来。具有足够的动量也许就能继续向前。 - Momentum:不再按照gradient方向来更新参数,而是按照momentum方向来更新参数。 - Adam:RMSProp + Momentum - 十分常见,使用较为广泛。 - 还可以进行哪些方面的改进? - 改进learning rate:learning rate scheduling - 每次更新时都有不同的learning rate - 如何设定?训练大模型时常用的是先增加后减小。 - 先增大:warm up,探索地图,大概知道地图是什么样子的。

Adagrad

每一个dimension分开操作,每一个参数维度做的都是一摸一样的事情。学习率除以我们算的数值,数值越大,计算出的实际lr越小。不停的计算平方和并开根号。是否需要取平均?不取平均保证学习过程中lr越来越小,符合我们的预期。

RMSProp

就是上面的加上一个权重系数罢了。但是有点区别是不是把之前步骤的gradient拿过来平方求和,而是把上一步算出来的\(\sigma\)平方进行加权,反正看式子也能够理解。lr过大的话会很不稳定。alpha设置为0.9,新梯度权重为0.1也是比较合理的?

momentum

上面的最简单的动量也就是把梯度进行一个累加而已。

结合权重思想的动量

将RMSProp思想移植过来,给予最近的动量更多的权重,可能与经典论文的不太一样。beta为0.995,给予新梯度权重0.005已经是非常多了,因为过去那么多动量也只是分到0.995而已?依照动量可以翻过一个又一个山丘。

Adam

同时使用Momentum(用动量取代梯度决定更新方向和主体)和RMSProp(给予最新梯度更大权重控制lr更新幅度),也就得到了Adam的主要部分。

总结Optimizer

总结optimization这一步,改进的是第三部,我们要找到一个更好的训练函式,使得training loss可以被压得更低。但并不意味着这就会带来在验证集或真实情景下更好的表现(not for Generalization)。所以这时候换optimization可能就没有帮助了。

有可能对generation带来好处的改进第三步的方法? - Dropout: - 训练时随机丢掉一些神经元 - 验证和测试时火力全开 - 练习轻功?训练时增加难度 - Better Generation,但是worse optimization。 - 注意使用的时机?所有方法都不是随便使用的。在Optimization上已经很好了但是generation还是表现不佳,我们才可能考虑使用dropout。

Initialization: - 不同的起始位置,可能会导致非常不同的训练结果。 - Optimizer可以克服初始位置带来的差异吗? - 好上加好? - 当有多个Training Loss最低点的时候,起始位置决定我们走到哪一个最低点。如何带领我们走到最好的一个?

initialization

可以看到有些地方还是会有严重的overfitting问题。因此,依赖一个好的initialization,可能能够帮我们找到一个好的global minimum。

  • 目前可能还有待研究?
  • 比较好的大绝招?Pre-train
    • 想让模型做一些Pretext Task(借口任务?)作为想要关心的Downstream Task的Initialization
    • Pretext Task?怎么是好的?可以轻易收集大量资料进行训练
  • pre-train对于Optimization和Generalization都有帮助

优化第二个步骤:我有哪些选择 - Better Network Architecture - 划定一个刚刚好的函式范围 - 函式集合太小,可能会没有包含好的函式,那怎么找也找不到。 - 函式集合大一点,比较可能包到好的函式,但是也容易overfitting - 选一个小范围但刚好包含好的范式,需要你根据domain knowledge进行划定。 - Convolutional Layer举例 - 图片处理 - 1000*1000图片,其实是3*1000*1000,也就是这么多维度的feature。 - 全连接?只考虑w,每个neurons就有3000000个参数,很恐怖。 - 真的需要这么多的参数吗?这时候就需要人进行决策了。 - 判断一只鸟也许只需要几个特征而不是整张图片就够了,所以可以帮助某些神经元只观察一部分。

简化神经元

人去决定神经元看到的范围Receptive field,是否需要重叠,是否多个neurons负责盯着同一片区域?不同的neurons是不是可以有不同的大小呢?neurons是不是看的可以不是正方形呢?都可以。

目前图像处理其实已经有一套比较标准的处理方法: - Typical Setting:Observation 1 - 不一定需要每个神经元盯着整张图片看。 - kernel size:33 e.g.,stride:2,一般会有一些重叠,这表示移动2,一般是把所有channel整合到一起。padding:不足一个3*3的图片,补0。 - 这种Receptive Field是比Fully Connected Layer更小的函式表示范围,前者被后者涵盖。 - CNN的第一个发明,Receptive field。 - Observation 2 - 同一个特征出现在不同的地方,不同的neurons负责的地方,实则是可以用同一组参数去处理的。 - 不同的receptive field被设置为共享同一组参数。 - 强制设定为一样,选择范围变得更小。 - CNN其实是一个更简单的东西,是Fully Connected Layer的简化。 - 是一个Convolution Layer - CNN?Convolution? - 改了函式搜索范围 - 好处是Better Generalization*,更加不容易overfitting。 - 根据人类的domain划定一个小的范围,又包括一个好的函式。

进一步简化范围

总结CNN

上述是对于第二层优化神经网络针对Better Generalization的情景,下面还有些针对Optimization的情况。

Skip Connection场景

似乎也就是残差连接

Skip Connection

loss surface

针对Optimization的类神经网络设计: - 并不是只有第三步才能影响Optimization - L和较为浅层的w的变化 - 往往影响很小gradient vanishing - 有时候又会突然变很大gradient exploding,蝴蝶效应 - 加上Skip Connection就是加上高速公路 - a的变化可以直接传导到深层 - 带来了Better Optimization,更好的进行训练 - 各种Normalization操作也能优化 - Norm进行输入输出的限制范围落在某些范围内 - 正则化等操作 - Batch Normalization - Layer Normalization - 改变了函式搜寻范围,Better Optimization,Sometimes Better Generalization

分类问题输出什么

如何定义Loss

交叉熵效果

针对第一步的优化:我要找什么?有关Loss的定义 - Classification - 大模型生成问题也是分类问题 - 分类的Loss长什么样子? - 想要类神经网络输出什么东西?其实有几个类别就输出几个数值就好。大小更大就是分类越可能的。 - Loss = Evalution Metrics? - 正确率accuracy,正确得1分,否则0分,计算平均 - 能不能像regression问题一样直接把evaluation metrics当作loss来看呢? - 可以看到,改变一点b2,如果实际结果没有影响,在正确率下计算的Loss也就没有变化,梯度自然为0……除非是在临界点一瞬间的变化,无法进行下坡。没办法好好地算微分! - 最常用的是和accuracy有点像但是能很好做微分的东西,Cross-entropy是最为常用的。 - Cross-entropy - 预测结果进行softmax - ground truth也变成机率分布,其实是个one-hot的分布 - 计算两者的交叉熵 - 两个分布越接近,loss越小 - 更加容易计算微分 - 由于计算softmax,其实一个参数小小变化会影响所有其他类别的结果,也就会影响Loss,也就可以进行优化。 - 验证、测试时还是会用accuracy!因为大家只在意这个。造成了一个误差和Gap。 - 改变了我要找什么这一个步骤,带来的好处是Better Optimization,Not for Generalization - Need More Training Data…… - 克服overfitting的一个方式就是收集更多的能够反映真实世界的资料。 - 改变了我要找什么,带来的好处是Better Generalization,Not for Optimization。加了更多东西,其实是让Optimization更加困难了。 - 要记得每一个技巧的适用时机,overfitting时使用。 - Data Augmentation - 确实没法收集更多的资料,可以对现有数据进行一些变换,由此扩大了数据量。 - 必须augment必须是合理的,比如任务是分辨鸟的朝向,做flip其实答案就错误了。 - 还是Overfitting时候使用 - 还是改变了要找什么,带来的好处是Better Optimization,Not for Generalization。 - Mixup - 改变label,例如直接将图片融合,label变为50%的猫和50%的狗

Mixup

Semi-supervised Learning - Loss由两部分组成,确定的标准数据以及海量未进行标注数据。用了两部分资料! - 如何定unlabel的loss function? - 非黑即白的世界 - 基于这个假设,l'为一个entropy - 神经网络输出的几率分布越平均,larger entropy,否则越small - 也就是倾向于能够比较好能够分开数据的函式 - 物以类聚的世界 - 建立详尽的点的graph - 两部分,是否连接以及距离,距离可能得自己进行定义,如何进行连接也需要自己进行定义 - 改了哪一个步骤?我要找什么 - Better Generalization,Not for Optimization

非黑即白的世界

物以类聚的世界

Parameter Regularization - 也可以定义一些Loss是和训练资料没有关系,而只跟我们人类对于Parameter偏好有关的Loss - 简单的参数?希望参数越接近0越好,例如就可以使用参数的平方和。 - 将原来参数弄得小一点点再进行更新的操作,叫做weight decay。所以和parameter regularization不同定义,但做的事情差不多。

选择一个函式

我们可能更加倾向于左边的更加简单,更加平缓的。

如何更新参数

其实还是差不多,只是多了一部分而已。整理以后可以想象成\(\theta\)成了个系数例如0.99罢了。

parameter regularization

AdanW

将weight decay思想用到Adam中,AdamW。相较于Adam,考虑了Generalization这件事。

下次听到一个方法时,想想改了三个步骤中的哪一个步骤以及带来了什么好处,是为了Optimization还是为了Generalization设计。

总结