李宏毅 Deep Learning

发布于:2025-09-14 ⋅ 阅读:(18) ⋅ 点赞:(0)

感谢李宏毅老师qwq

1. 基础概念

1.1 Machine Learning

  • 问题引出:预测后面几天的观看人数;

  • 初步构建模型:拟合效果不好,就是在原数据上平移了一段距离;

  • 此处构建模型的本质:利用特征工程,将“多维特征模型”解决“时间序列问题”,根据原数据每隔 5 天就会下跌 2 天的特性,将一周的观看人数作为多维特征输入;

1.2 Deep Learning

Step1.Model

  • 通过引入 S 函数使得模型对非线性数据预测更准确:

  • 设置不同参数对 S 函数图像的变化:

  • 利用多个 S 函数组合一个完整模型,弥补线性模型无法拟合缺陷:

  • 再利用上一节学的多维特征输入(输入 j 个特征,用到了 i 个 function),得到最终模型:

  • 模型参数的集合:

Step2.Loss

  • 计算损失函数:

Step3.Optimization

  • 最优化:

  • 利用 batch 训练:

Neural Network

  • 不同的激活函数:

  • 两个 relu 合成一个 hard sigmoid:

  • 构建神经网络:

2. 模型调优

2.1 机器学习任务攻略

  • 根据训练集损失和测试集损失调节模型:

  • 选择模型:

Model bias

  • 训练集损失大 - 原因1:高偏差,通常是模型过于简单,弹性不足;

Optimization

  • 训练集损失大 - 原因2:优化没做好,只能到达局部最优点;

  • 如何判别属于哪个原因:假设初始为一个小模型,当将模型变复杂后,损失没有更小甚至更大,说明与模型弹性无关,而问题在于优化不好;

Overfitting

  • 解决过拟合:数据增强,反转、截取图片等等,但不能随意(比如倒过来当成只蝙蝠 qwq);

  • 法二:增加条件限制模型,例如固定模型为二次函数,但不能过多限制(会欠拟合);

Cross Validation

  • 为什么需要交叉验证集:我们可能会根据训练集,包括公开测试集损失去调试模型,但是可能会导致在私人测试集上的损失很大,因为这里相当于把公开测试集并入了训练集(过拟合)

  • 将训练集分为训练集+交叉验证集,根据交叉验证集上的损失来调试模型;

  • 怎么分割训练集和交叉验证集:

Mismatch

  • 问题来源:预测 2.26 观看 lhy 老师机器学习的人数,所以有很多同学特地去刷播放量,想让模型预测不准确(qwq);

  • 问题本质:训练集与测试集分布不同;

2.2 神经网络无法训练

Local minima & Saddle point

  • 停止优化情况:Critical Point,局部最低点、鞍点(不同方向上为局部最大、最小值);

  • 泰勒展开,利用二阶导数下的凹凸性(一阶导为 0);

  • 数学方法:利用计算得到的 Hessian 矩阵判断局部最低点还是鞍点;

  • 黑塞判别式(多元函数二阶偏导数构成的矩阵):求多元函数极值点;

  • 从高维度观察低维度,验证 local minima 和 saddle point 哪个更常见;

  • 纵轴是训练时卡住的 loss,横轴是最小比率 = 正数特征值 / 特征值总数;
  • 如果所有特征值都是正数,则此处为 local minima,但是这种情况很少见;

Batch & Momentum

  • 小 batch 的作用:由于数据的 shuffle,每个 batch 的数据会有差异,导致得到的损失函数也不同,梯度不会保持为0,就有机会跳出鞍点;

  • 由于计算机的并行计算,batch 在没有很大的时候,更新时间是仍然比较小的;

  • batch 大小对不同训练时间的影响:

  • 利用 Momentum 本质:根据 惯性(上一次更新方向,可以冲出鞍点)和梯度的组合方向进行更新;

  • 图示更新方向:

Learning Rate

  • 问题引出:loss 不再下降,但是梯度在震荡,原因为学习率过大导致卡在了山谷中间;

  • 解决方法:给不同的参数配置不同的学习率,以此来调节更新跨度;

  • AdaGrad(自适应学习率):AdaGrad 的本质是给更新频繁(历史梯度大)的参数一个越来越小的学习率,给更新稀疏(历史梯度小)的参数一个相对较大的学习率。

  • 法一:采用均方差进行计算;

  • 采用法一的严重问题:学习率爆炸
  • 原理:随着模型逐渐收敛,它会越来越接近损失函数谷底,梯度在不断下降,均方差不断减小,也就是分母不断减小,导致学习率爆炸;
  • 但是学习率爆炸后由梯度的增大,学习率也会自调节减小;

  • 法二:RMSProp,采用加权平均进行计算
  • 通过调节 \alpha 来决定刚算出来的梯度有多重要;

  • 梯度较大时,为了增加 \sigma 从而放慢更新速度,选择减小 \alpha,反之同理; 

  • Adam = RMSProp + Momentum;

  • Learning Rate Scheduling:随着训练时间增大不断减小学习率 \eta,这一操作解决了学习率爆炸的问题;

  • 法二:随着训练时间增大,学习率先增后减;

  • 参数最优化中学习率更新的最终版本:
  • 除以一个参数:确定学习的“速率”乘以一个参数:确定学习的“方向”

Batch Normalization

  • 目的:把非常崎岖的 error sufface(误差曲面)直接铲平;神罗天征!!!!QAQ!!!!!

  • 在做最优化时,由于不同方向的输入值大小不同,所以有的方向梯度很大,也有的方向梯度很小,因此需要对输入数据做归一化;

  • 特征归一化:对不同向量相同维度上的数值做归一化;

  • 深度学习中:我们方向对输入值做归一化后,经过变换或激活后,得到的新输入应该还要继续做归一化;

  • 归一化计算公式(正态分布):

  • 没有归一化时:z^{1} 变化只会导致它对应的向量变化;
  • 在做归一化时:z^{1} 变化则 \mu 和 \sigma 会变化,那么其它 z^{i} (z^{2}z^{3})也会变化;
  • 由于整个训练集太大了,于是引出了 batch,每次只对 batch 个变量进行归一化;

  • 在归一化之后,这里又做了一次线性变换,通常 \gamma 和 \beta 初始化为 1;
  • 原因: z^{i} 归一化后的输出被限制在均值为 0 且方差为 1 的分布中,对模型有一定限制,所以此操作可以增加模型自由度;

  • 测试过程中:
  • 我们发现测试过程没有 batch,那么怎么计算 \mu 和 \sigma 呢:这个在 pytorch 里面已经帮我们处理好了;在训练过程中,会将计算出来的 \mu 和 \sigma 都保存下来,进行迭代更新,p 为权重也是超参数;

3. 神经网络

3.1 CNN

  • 卷积神经网络图像识别:将图片像素特征连接成 tensor 进行输入;

Receptive field (感受野)

  • 观察 1:分类问题中,往往只需要通过几个重要的模式(pattern)去识别图像,神经元不需要输入整张图片;

  • 简化:每个神经元的输入大小只有一个 kernel size 的感受野;

  • stride 为步频,padding 为填充,感受野之间需要重叠防止遗漏重叠处的 pattern;

Parameter Sharing

  • 观察 2:一些相同的模式会出现在图片的不同位置,但是肯定会有对应的神经元在该感受野处提取特征;
  • 但这些检测鸟嘴的神经元做的事情是一样的,只是它们守备的范围不一样。既然如此,其实没必要每个守备范围都去放一个检测鸟嘴的神经元。

  • 参数共享就是两个神经元的权重完全是一样的;

  • 假设每个感受野都有 64 个神经元在守备,那么令每个感受野对应神经元参数相同(这些参数称为滤波器);

Convolutional Layer

  • 全连接层可以自己设定参数(如果它只想看一个范围,可以把很多权重设成 0),感受野只能看一个范围,参数共享继续增加对神经元的限制;
  • 感受野 + 参数共享就是卷积层(convolutional layer),用卷积层的网络就叫卷积神经网络;
  • 卷积神经网络的偏差比较大,但模型偏差大不一定是坏事,因为当模型偏差大,模型的灵活性较低时,比较不容易过拟合;

  • 卷积神经网络第二种说法:利用卷积计算,对位相乘累加;
  • 网络越深,可以检测的模式越大:

Pooling

  • 观察 3:下采样不影响模式检测;
  • 把一张比较大的图像做下采样(down sampling),把图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的 1/4,但是不会影响里面是什么东西;

  • 最大池化:在每一组里面选一个代表,选的代表就是最大的一个;(还有平均池化)

  • 经典的图像识别的网络:
  • 一般架构就是卷积加汇聚,池化是可有可无的。如果做完几次卷积和汇聚以后,把汇聚的输出做扁平化(flatten),再把这个向量丢进全连接层里面,最终还要过个 softmax 来得到图像识别的结果;
  • 扁平化就是把图像里面本来排成矩阵的东西“拉直”,即把所有的数值“拉直”变成一个向量;

3.2 RNN

One-hot(独热编码)

  • Slot Filling(槽填充):将句子里的词汇进行筛选,并填入对应槽中;(如这里的目的地,到达时间)

  • 利用独热编码输入语句,每个词汇对应类别为 1,其余为 0;

  • 因为很多单词可能都没有见过,所以需要在独热编码里面多加维度,用一个维度代表 other;
  • 还可以用词汇的字母来表示对应向量;

Memory

  • 这里相同的单词“台北”表示的意义是不一样的,需要根据前面的单词来判断;
  • 如果让神经网络是有记忆力,其就可以解决输入不同的单词,输出不同的问题;
  • 这种有记忆的神经网络就叫做循环神经网络(Recurrent Neural Network);

  • 每一次隐藏层的神经元产生输出的时候,该输出会被存到记忆元(memory cell);
  • 下一次有输入时,这些神经元不仅会考虑输入 x1, x2,还会考虑存到记忆元里的值;
  • 记忆元可简称为单元(cell),记忆元的值也可称为隐状态(hidden state)。

  • 运算示例:为了便于计算,假设所有的激活函数都是线性的;

RNN 架构

  • RNN 处理槽填充:分别输入每一个词汇,输出得到该词汇属于每个槽的概率向量;
  • 注意:这个不是三个网络,这是同一个网络在三个不同的时间点被使用了三次,同样的权重用同样的颜色表示了;

  • 有了记忆元以后,输入同一个单词,希望输出不同的问题就有可能被解决;
  • 比如这里输入地点都是台北,但是记忆元内的值不同(离开,到达),输出也就不相同;

  • RNN 也可以是深层的,拥有多个隐藏层:

其它 RNN

  • Jordan 网络存的是整个网络输出的值,它有目标,比较清楚记忆元里面存储的是什么东西:

  • 双向循环神经网络:产生 y^{t+1} 的时候,网络不只是看过 x_{1} 到 x^{t+1} 的输入,它也看了句尾到 x^{t+1} 的输入;
  • 假设考虑的是槽填充,网络就等于看了整个句子后,才决定每一个单词的槽;

  • 长短期记忆网络(Long Short-Term Memory network,LSTM):

  • 运算公式:
  • 输入门和输出门使用 sigmoid 函数计算,计算得到正数则 f 的输出是 1,表示为被打开的状态,反之代表这个门是关起来的;
  • 遗忘门输出为 1,则进行初始值与新输入值的加法计算;遗忘门为 0 则相当于保持新输入值并替换初始值;

  • 计算举例:

LSTM 原理

  • 把 LSTM 想成是一个神经元:

  • 每个 LSTM 都需要 4 个输入,且 4 个输入均不相同:

  • 单个 LSTM 的计算流程图:

  • 真正的 LSTM 会把上一个时间的输出接进来,当做下一个时间的输入,即下一个时间点操控这些门的值不是只看那个时间点的输入 x^{t} ,还看前一个时间点的输出 h^{t} ;
  • 其实还不止这样,还会添加 peephole 连接。peephole 就是把存在记忆元里面的值也拉过来。操控 LSTM 四个门的时候,同时考虑了 x^{t+1}, h^{t}, c^{t} ,把这三个向量并在一起乘上不同的变换得到四个不同的向量再去操控 LSTM;

  • 多层 LSTM:

RNN 学习方式

  • 计算损失函数:输出 y 和参考向量([0……1……0])的交叉熵的和;

  • 随时间反向传播(BackPropagation Through Time,BPTT):

  • RNN 的训练是很困难的,经常遇到 loss 突然上升再下降的情况:

  • RNN 的误差表面是总损失的变化是非常陡峭的或崎岖的,如果梯度下降过程中 loss 刚好落到了悬崖壁上,那么下一次的梯度下降就有可能导致整个参数飞出去了;
  • 所以这里采用“裁剪”方法,限制了梯度的最大阈值,超过阈值则该处梯度设为阈值;

  • RNN 训练的问题不是来自激活函数,而是因为时间序列同样的权重在不同的时间点被反复的使用
  • 这里的 RNN 只有一个神经元,可以看出 w 只要一有变化,它完全由可能没有造成任何影响,一旦造成影响,影响很大,梯度会很大或很小

  • 梯度消失(gradient vanishing,把那些平坦的地方拿掉)解决方法:利用 LSTM;
  • 补充:做 LSTM 时,大部分地方变化的很剧烈,所以可以把学习率设置的小一点,保证在学习率很小的情况下进行训练;

  • GRU 只有两个门,所需参数更少,训练得到的模型更健壮,相比 LSTM 不易过拟合;
  • GRU 特性:旧的不去,新的不来。它把输入门跟遗忘门联动起来,也就是说当输入门打开的时候,遗忘门会自动的关闭 (格式化存在记忆元里面的值),当遗忘门没有要格式化里面的值,输入门就会被关起来;

3.3 RNN 其它应用

多对一序列

  • 1. 情感分析:
  • 序列是指一组按特定顺序排列、前后存在关联的元素组合;

  • 2. 关键术语抽取:

多对多序列

  • 1. 语音识别:输入是声音序列,一句话就是一段声音信号,处理时用向量表示;每一个输入对应的时间间隔是很小的(0.01 秒),所以通常是好多个向量对应到同一个字符;
  • 修剪(trimming):把重复的东西拿掉,但是无法识别叠字;

  • CTC 方法:在输出时候,不只是输出所有中文的字符,还可以输出一个符号”null”,其代表没有任何东西;

  • CTC 训练:不知道字对应哪个字符,这时候要穷举所有可能的对齐,也有算法可以处理;

  • 2. 英文识别:

序列到序列

  • 1. 机器翻译(machine translation):输入英文单词序列把它翻译成中文的字符序列;
  • 和之前 CTC 不同的是,这里英文和中文(输入输出)序列的长短是未知的;
  • 使用 RNN 读入序列,在最后一个时间点,这个记忆元里面就存了所有输入序列的信息;

  • 运行机制:这里开始输出,输出一个字符后,把之前输出的字符当做输入,再把记忆元里面的值读进来;

  • 怎么停下来:多加一个符号“断”;

  • 2. 句法解析:让机器看一个句子,得到句子结构树,只要把树状图描述成一个序列;

4.  自注意力机制

4.1 self-attention 原理

输入输出

  • 输入是一组向量序列,且向量的数目会发生改变:

  • 将输入词汇转换为向量的方法:独热编码、词嵌入;

  • 将输入语音转换为向量:取声音信号的一个范围(窗口),将其包含信息转换为一个向量(帧),两段信号之间通常取 10ms(前人调好的);

  • 输出有三种形式:
  • 类型 1:输入与输出数量相同;如:词性标注;
  • 类型 2:输入是一个序列,输出是一个标签;如:情感分析;
  • 类型 3:序列到序列;如:翻译;

运作原理

  • 问题引出:在词性标注中,一个词的词性往往需要对整个句子进行分析,虽然可以使用全连接提供前后向量的信息,但是意味着全连接网络需要非常多的参数,不只运算量很大,还容易过拟合;

  • 自注意力机制:输入几个向量,它就输出几个向量,且这些向量都是考虑整个序列后得到的

  • 自注意力模型可以叠加很多次:

  • 运作方式:考虑向量之间的相关度,设为 \alpha

  • 相关度的计算:输入向量乘以不同矩阵得到两个向量 q(查询),k(键),再进行点积(逐元素相乘累加)得到标量 \alpha

  • 套用在自注意力模型中:计算 a_{1} 和每一个向量的相关度(也会跟自己算关联性),再对所有的关联性做一个 softmax 操作;
  • 注意:不一定要用 Softmax,还可以用别的激活函数,如 ReLU;

  • 最后根据计算得到的关联性去抽取序列的重要信息,a^{1} 到 a^{4} 分别乘上一个 W^{v},再分别乘上对应的关联性,求和得到 b^{1};同理,可以计算出 b^{2}b^{4}
  • 由于是做求和运算,所以谁的注意力分数最大,谁的 v 就主导(dominant)抽出来的结果;

矩阵乘法

  • 第一步:计算向量 q、k、v 组成的矩阵 Q、K、V;

  • 第二步:将 K^{T} 与 Q 相乘,计算每组计算出来的关联性组成的矩阵 A';

  • 第三步:将 A' 与 V 相乘,得到由 b 组成的向量组 O;

  • 综上所述:自注意力层里面唯一需要学的参数就只有 W^{q}W^{k}W^{v}

4.2 自注意力进阶

Multi-head self-attention

  • 多头自注意力:q、k、v 分别乘上两个矩阵分裂为两个头,然后对应 q、k 进行自注意力操作,得到两个 b;

  • b^{i,1}b^{i,2} 接起来,再通过一个变换,即再乘上一个矩阵然后得到 b^{i},再送到下一层去;

Positional encoding

  • 为什么需要位置信息:

  • 位置编码:每一个位置设定一个向量,即位置向量(positional vector);
  • 位置向量用 e^{i} 来表示,上标 i 代表位置。把 e^{i} 加到 a^{i}上面就结束了,这相当于告诉自注意力位置的信息;下图的每一列都代表一个 e^{i}

 Tuncated self-attention

  • 截断自注意力机制:在语音识别中,一段声音序号对应的向量是非常长的,需要很大内存,所以截断自注意力计算时,只需要看一个范围内的内容即可;

4.3 自注意力与神经网络

对比 CNN

  • 每一个位置的像素可看作是一个三维的向量,整张图像是5 × 10 个向量;

  • 自注意力:假设圈内 1 是要考虑的像素(pixel),那么它会发出查询,其它像素产生键,计算时考虑的是整张图片的内容;
  • CNN:只考虑感受野中的信息;

  • 简单来说:CNN 就是自注意力的一个特殊情况,自注意力只要通过某些设计、某些限制就会变成卷积神经网络。;

  • CNN 与自注意力训练得到准确率对比:
  • 自注意力的弹性比较大,所以需要比较多的训练数据,训练数据少的时候就会过拟合。而卷积神经网络的弹性比较小,在训练数据少的时候结果比较好。

对比 RNN

  • 差异一:RNN 通常只考虑该位置前面的输入(除了双向 RNN),而自注意力前后均考虑到;
  • 差异二:RNN 对最开始的输入是很难考虑到的,必须存在 memory 里面;而自注意力输出一个查询,输出一个键,只要它们匹配(match)得起来,“天涯若比邻”,可以轻易地从整个序列上非常远的向量抽取信息。
  • 差异三:RNN 的计算是顺序执行下去的,而自注意力可以并行计算,速度更快;

4.4 GNN

  • 前面说过自注意力还可以用在图上,图上面的边已经暗示了节点跟节点之间的关联性,所以只需要只计算有边相连的节点间的关联性即可;

5. Transformer

5.1 Transformer 原理

应用场景

  • Transformer 是一个基于自注意力的序列到序列模型,与基于循环神经网络的序列到序列模型不同,其可以能够并行计算;
  • 常见应用:语音识别、机器翻译与语音翻译;
  • 既然语言识别 + 机器翻译  = 语言翻译,为什么还要语言翻译:有些语言是没有文字的;

  • 其它应用:语音合成(文字生成语音),聊天机器人,问答任务(翻译,情感分析),句法分析,多标签分类(multi-label classification);

Transformer 结构

  • 序列到序列模型:编码器负责处理输入的序列,再把处理好的结果“丢”给解码器,由解码器决定要输出的序列;

  • 序列到序列典型的模型就是 Transformer,其有一个编码器架构和一个解码器架构;

5.2 编码器和解码器

编码器

  • 编码器功能:输入向量序列,输出相同数目的向量序列,内部就是由 n 个处理块组成的;

  • 块内结构:
  • 残差连接(residual connection):假设某向量原始映射为 H(x),将原始输入 x 加到输出上,最终输出变为 H(x) + x;H(x) 被称为“残差函数”
  • 注意:这里的归一化为 Layer Norm(层归一化),是在同特征不同维度进行归一化;

  • 最终得到的编码器结构如下:

自回归解码器(AT)

  • 要让解码器产生输出,首先要先给它一个代表开始的特殊符号 <BOS>,即 Begin Of Sequence,这是一个特殊的词元(token);
  • 解码器的输入是它在前一个时间点的输出,其会把自己的输出当做接下来的输入(注意:只是在测试集这样做

  • 误差传播:

  • 解码器结构:相比编码器不一样的是第一层的掩蔽自注意力(masked self-attention);

  • 掩蔽自注意力对比自注意力:通过一个掩码(mask)来阻止每个位置选择其后面的输入信息,例如产生 b1 的时候,只能考虑 a1 的信息,不能再考虑 a2、a3、a4;

  • 由于输出长度未知,所以应该如何让解码器停止运作:添加 EOS 字符;

非自回归解码器(NAT)

  • 特点:解码器吃的是一排的 BOS,输出也是一次产生产生一排词元
  • 输出长度如何确定:1.用分类器接收输入产生应该输出的长度;2.假设输出不会超过 300,则输入 300 个 BOS,舍弃 EOS 之后的输出;
  • 优点:1.一次性输出,速度快;2.可以控制输出长度;

Cross Attention

  • 编码器和解码器直接怎么进行连接呢:

  • 译码器输出变换为 q,而编码器输出变换为 k,v,将两者进行自注意力运算;

  • 后续计算同理:

5.3 Transformer 训练

  • 其实解码器每输出一次,就是做一次分类,计算标准答案的独热向量与输出的交叉熵;

  • 训练的输入是标准答案,测试的输入是自己的输出(Mismatch),要做的是最小化交叉熵(包括 EOS);

5.4 训练 Tips

Copy Mechanism

  • 复制机制:让模型在面对一些人名或生词时可以直接进行复制,还有做摘要等情况下;

Guided Attention

  • 引导注意力:有时候机器无法处理非常短的句子,所以要求机器在做注意力的时候有固定的方式,比如语音识别需要从左往右;

Beam Search

  • 这种每次找分数最高的词元来当做输出的方法称为贪心搜索(greedy search),红色路径就是通过贪心解码得到的路径。
  • 但贪心搜索不一定是最好的方法,第一步可以先稍微舍弃一点东西;
  • 束搜索:用比较有效的方法找一个近似解,在某些情况下效果不好;

加入噪声

  • 李宏毅老师:不完美也许才是真正的完美 QAQ

使用强化学习训练

  • 评估用的是 BLEU(BiLingual Evaluation Under-study)分数,是两个句子之间做比较算出的。但训练的时候每一个词汇是分开考虑的。最小化交叉熵不一定可以最大化 BLEU 分数
  • BLEU 分数很复杂,如果要计算两个句子之间的 BLEU 分数,损失根本无法做微分;
  • 遇到优化无法解决的问题,可以用强化学习训练。具体来讲,遇到无法优化的损失函数,把损失函数当成强化学习的奖励,把解码器当成智能体;

Scheduled Sampling

  • 测试的时候,解码器看到的是自己的输出,因此它会看到一些错误的东西。但是在训练的时候,解码器看到的是完全正确的,这种不一致的现象叫做曝光偏差(exposure bias)
  • 计划采样偶尔给解码器的输入加一些错误的东西,它反而会学得更好;

6. 自监督学习

6.1 Self-Supervised Learning

  • 自监督学习(Self-Supervised Learning,SSL)是一种无标注的学习方式
  • 原理:假设我们有未标注的文章数据,则可将一篇文章 x 分为两部分:模型的输入 x′ 和模型的标签 x′′,将 x′ 输入模型并让它输出 \hat{y},想让 \hat{y} 尽可能地接近它的标签 x′′(学习目标);
  • 自监督学习可以看作是一种无监督学习方法

  • 自监督学习的模型大多都是以芝麻街的角色命名;

  • Bert:进击的巨人 QAQ

  • 模型参数量的变化:

6.2 初识 Bert

架构

  • BERT 的架构与 Transformer 的编码器完全相同,里面有很多自注意力和残差连接、归一化;
  • 假设这里输入是文字,需要随机掩码(masking)一些词元(token);
  • 掩码的方式:1. 替换为特殊词元 MASK;2. 替换为随机字;

训练(掩码)

  • 1. 掩码:我们知道掩码字符是什么,但是 Bert 不知道,所以需要它去预测该字符(填空),本质就是分类问题,计算输出与答案独热向量间的交叉熵并进行最优化;

  • 2. 下一句预测:判断第二句是不是第一句的后一句(二分类);
  • 特殊词元分类符号 [CLS],分隔符 [SEP];训练时只取 CLS 的输出
  • 后面研究方向下一句预测对模型没有什么用,所以引出了句序预测(Sentence Order Prediction,SOP),输出两个句子是什么样的顺序的可能性;

微调与预训练

  • 如何使用 Bert:在训练时,让 Bert 完成两个任务(掩码下的词元预测,下一句预测(没啥用)),使得它具有填空的能力;接着利用它去实现一些下游任务(downstream task);
  • 当 Bert 完成这些下游任务时,还是需要给它提供一些标注的数据;
  • 微调(fine-tuning):对 Bert 进行微调,使得可以完成某些任务;
  • 预训练(pre-train):产生 Bert 的过程就是预训练;

GLUE

  • Bert 就像一个胚胎干细胞,可以进行分化成很多能力不同的子细胞;
  • 在对 Bert 微调前,需要对它的能力进行评估:GLUE 就是测试它在 9 个不同任务上的准确率取平均值来评估的
  • 通用语言理解评估(General Language UnderstandingEvaluation,GLUE);

  • 随着越来越多的技术被提出,越来越多的其他任务可以比人类做得更好;

6.3 Bert 使用场景

情感分析

  • BERT 没有办法从头开始解决情感分析问题,其仍然需要一些标注数据,需要提供很多句子以及它们的正面或负面标签来训练 BERT 模型;
  • Bert 内的参数不是随机初始化的,是预训练好的,随机初始化的参数只有线性变换里的
  • 半监督学习:Semi-supervised learning;

  • 输入句子及 CLS,只取 CLS 输出做变换得到分类;

词性标注

  • 输入句子及 CLS,取除了 CLS 之外的词对应输出做变换,得到每个词的词性分类;

自然语言推理(NLI)

  • 任务目标:分析两个句子(前提和假设)间的关系(矛盾和不矛盾);

  • 输入两个句子及 CLS,SEP,输出只取 CLS 输出做变换得到分类;

问答系统

  • 任务目标:输入文章,提供问题给机器回答(这里的输出只从原文中截取),输出为两个数字,代表答案的起始和结束词下标

  • 输入问题和文章,CLS 和 SEP,唯一需要从头开始训练的只有两个向量(“从头开始训练”是指随机初始化),我们使用橙色向量和蓝色向量来表示它们;
  • 将文章输出与两个向量分别计算内积(类似自注意力,橙色部分视为查询,黄色部分视为键),再经过 Softmax 得到每个词的概率,取最大概率的词作为答案的起始,结束;

Seq2Seq

  • BERT 只有预训练编码器,有没有办法预训练 Seq2Seq 模型的解码器
  • 对编码器的输入做一些扰动,训练模型可以去修复扰动,输出和原文一样的内容;

  • 其实有多种方法可以损坏句子:例如删除一些单词,打乱词汇顺序(语序),把单词的顺序做个旋转,或既插入 MASK,又删除某些单词;
  • 总之,有各种方法把输入句子损坏,再通过 Seq2Seq 模型把它还原;

6.4 Bert 有用的原因

Word Embedding

  • 当输入一串文字时,每个文字都有一个对应的向量,这个向量称为嵌入(embedding);
  • 嵌入可以代表对应的 token 的意思,而且考虑了上下文;
  • 相同的字,上下文不同,嵌入也不同;意思相近的字,嵌入更接近;

  • 计算这些向量之间的余弦相似度,即计算它们的相似度;

  • 每一格代表两个“果”的嵌入之间的相似度,相似度的值越大,颜色越浅;前五句中的“果”接近黄色,自己跟自己算相似度,一定是最大的
  • BERT 知道前五个“果”指的是可以吃的苹果,所以它们比较像;后五个“果”指的是苹果公司的“果”,所以它们比较像;
  • 结论:BERT 在训练填空的过程中,学会了每个字的意思;

  • 为什么 BERT 这种完型填空的形式可以学习到字的意思呢?因为有研究者说过,要了解一个字或者词的意思,需要通过他的上下文来体现;
  • BERT 架构是 transformer 的 encoder,而 transformer 主要用了 self-attention 的构架,self-attention 就考虑了整个序列,也就是所遮住部分的上下文;
  • 其实这种完形填空的思路很早就有,比如 CBOW,但是 CBOW 考虑到模型的复杂性,用的简单的线性模型;
  • BERT 也被称为上下文的词嵌入;

6.5 Bert 变种

Multi-lingual BERT

  • 多语言 Bert:通过使用不同的语言作为输入,发现对用 English 作为输入训练得到的模型进行微调,居然可以回答中文问题;

  • 为什么会这样:不同语言但是相同意思的词汇,他们的 Embedding 距离很近

6.6 GPT

  • BERT 做的是填空题,而 GPT 要做的任务是预测接下来会出现的词元
  • GPT 模型建立在 Transformer 的解码器的基础上,不过其会做 mask 的注意力,给定 <BOS> 预测“深”的时候,不会看到接下来出现的词汇;

  • 自监督学习不仅可以用在文字上,还可以用在语音和计算机视觉(CV)上;