速通机器学习3

参考资料:《速通机器学习》北大博士后AI卢菁

因为原文公式全部炸了,难以阅读,故在学习过程中编写了此笔记,精简了原文并添加了一定自己的理解(所以会有很多不严谨的地方),如有错误感谢指出。

第十一章 卷积神经网络

11.1 卷积层和池化层

在计算机中,图像是一种典型的二维信号,并且具有平移不变性、旋转不变性等特点。例如,对图像的平移或轻微旋转不会改变其类别。图像的诸多特点催生出了一种重要的神经网络——卷积神经网络,它是多层神经网络的一个特例 。同时,卷积神经网络独具特点,这些特点使它在图像处理速度和效果方面与多层神经网络相比有较大的提升。

以0~9手写数字识别为例,假设每一幅黑白图像被存储为一个 28 × 28 × 1 28\times 28 \times 1 28×28×1的矩阵(对应图像的长宽通道数)。根据以上分析,在黑白手写数字图像中,可以将一个 28×28×1=784 维的向量作为图像的特征,向量元素和图像位置一一对应,元素值对应于相应位置的灰度值。将特征向量输入逻辑回归、SVM、DNN等模型,就可以完成多分类任务。

上述方法貌似可行,但仔细想想,就会发现很多问题:手写数字的平移、轻微旋转、笔迹变化等因素,会导致图像中某些位置的像素值发生剧烈变化——虽然类别没有发生变化,但784维特征会发生剧烈变化。

综上所述,我们需要针对图像的特点专门设计模型,这个模型要对平移、轻微旋转、笔迹变化等扰动进行处理,使上述变化不敏感且参数较少。

在一幅图片中,形状(纹理)是一种局部特征,它往往是由几何位置相邻的一些像素一起决定的。卷积神经网络不是从像素上进行特征提取的,而是将图像划分成若干子区域,在这些子区域中进行特征提取的。这些子区域称为“感受野“(Receptive Field)如图11-3所示是一个 3×3 的感受野。

在这里插入图片描述

我们分析一下这个 3×3 的感受野。如果机器想知道该子区域是否为形状“|”,就可以针对形状“|”设计一个矩阵模板(这个模板称为卷积核),模板的大小和感受野一致,是一个 3×3 的矩阵,示例如下:

[ 1 − 2 1 1 − 2 1 1 − 2 1 ] \left[\begin{matrix}1 &-2 &1 \\ 1 &-2 &1\\ 1 &-2 &1 \end{matrix}\right] 111222111

注意这里只是举一个例子 ,实际上卷积核不需要我们自己设计,卷积核中的元素(在本例中,共计 3×3+1=10 个待学习参数,1为偏置项)均为待学习参数,可以通过模型训练自动得到。

将图片感受野(3×3)的像素值与卷积(3×3)按位相乘并求和后加上偏置,使用非线性函数(通常是ReLU函数)将计算结果激活。这种运算称为卷积运算。 具体计算如下图所示:

在这里插入图片描述

在一幅图像上滑动卷积核,以识别图像中各个位置的形状。卷积核滑动的长度称为步长(stride)。对一个 n × n n\times n n×n的图像,使用 k × k k \times k k×k的卷积核以 s t r i d e = 1 stride=1 stride=1进行卷积,会输出一个 ( n − k + 1 ) × ( n − k + 1 ) (n-k+1)\times(n-k+1) (nk+1)×(nk+1)的矩阵(我们称为特征图)。

在这里插入图片描述

如果希望输出大小保持不变:

  1. 当卷积核为奇数,即 k k k为奇数时,只需要在四周补 ( k − 1 ) / 2 (k-1)/2 (k1)/2的0即可。
  2. 当卷积核为偶数,解决方式参考:偶数卷积核大小(even-sized)与填充(padding)的副作用

多通道卷积核

在本节前面的例子中,我们对通道数为1的黑白图像进行了卷积操作。当通道数不为1(例如,彩色图像的通道数为3)时,卷积核的通道数就要扩充为3,如下图所示。

在这里插入图片描述

卷积操作就是立方体的按位相乘再相加,如下图所示。需要注意的是,使用一个卷积核对多通道图像进行卷积操作的 输出结果仍是单通道图像,这一点和黑白图像无异。

在这里插入图片描述

有些时候我们需要识别多个特征,那么可以使用 n n n个卷积核进行运算。在这种情况下,也可以把所有的输出图像看作一个 n n n通道”图像“。“图像”各通道的每个位置上的数值都表示局部感受野和特定形状的吻合程度。


池化

由于“图像”相邻感受野所对应形状的差异不会太大,所以存在一定的信息冗余现象 。消除信息冗余现象可以降低后续处理的复杂度,并且我们希望提取的特征对“图像”的轻微移动不敏感。此外缩减”图像“的尺寸,也能够提取更加宏观的特征,降低后续的运算量。

因此我们可以通过池化操作来实现上述操作,总而言之: 通过池化操作,我们对图像尺寸进行了缩减,克服了图像轻微变形带来的影响,并间接增大了后续卷积的感受野。

例如,最大池化 操作就是对每个感受野选取最大值作为输出;平均池化 就是将区域内所有数值的平均值作为输出(一般来说,最大池化的特征提取能力较强,但容易被噪声干扰,平均池化相对稳定、对噪声不敏感)。池化操作一般不进行边缘补0。步长 s t r i d e = 2 stride=2 stride=2,感受野为 2 × 2 2\times 2 2×2的最大池化操作例子如下:

在这里插入图片描述

11.2 卷积神经网络在图像处理中的应用

CNN使用不同的卷积核发现图像中的特定形状,配合池化操作可进一步缩减图像尺寸、稳定特征。对图像进行多次卷积—池化操作,提取出来的形状会变得复杂和宏观。

在进行图像分类时,最后一层的激活函数通常是Softmax,而Softmax函数的输入应该是一个向量,因此,可以对多通道2维特征进行Flatten操作,将其转换成向量。例如一个 7×7×10 的多通道2维特征对应于一个490维的向量。以 2×2 的特征为例,Flatten操作如图:

在这里插入图片描述

手写数字识别的网络如下图所示,神经网络构建完成后,可使用梯度下降法进行训练。在这里,待训练的参数是各个卷积核的参数。

在这里插入图片描述

最后,有一点需要特别说明。在真实的项目中,卷积层往往很深。为了防止数值溢出和激活函数饱和造成梯度消失和梯度爆炸等,一般会将输入图像各个像素的值归一化至 [0,1]。

11.3 卷积神经网络中的批标准化

因为实验发现,层标准化破坏了通过卷积学到的特征,模型无法收敛。所以,在CNN中一般使用批标准化。

在CNN中,每一层都是多通道图像,每个通道代表的特征都是同一类型的(同一个卷积核计算出来的结果)。因此,在进行批标准化时,同一个通道的各个位置都会参与统计

例如下图所示,假设一个batch中有 N 个样本,图像的尺寸是 128×128×10(即通道数为10)。分别在10个通道上统计10组均值和方差,每个通道的批标准化需要计算的数据量为 128×128×N。(同一批样本中,同一通道的所有值一起计算均值和方差,然后标准化为 x − μ σ \cfrac{x-\mu}{\sigma} σxμ

在这里插入图片描述

11.4 TextCNN的原理及应用

暂略

第十二章 深入卷积层

12.1 1×1卷积

1 × 1 1×1 1×1 卷积和正常卷积的运算过程是相同的,它的主要作用是改变通道数。例如,输入为 28 × 28 × f 1 28×28×f_1 28×28×f1 的图像,经过 f 2 f_2 f2 1 × 1 × f 1 1×1×f_1 1×1×f1 的卷积核,得到 28 × 28 × f 2 28×28×f_2 28×28×f2 个输出,并且仅有 f 1 × f 2 f_1×f_2 f1×f2 个参数。

f 2 > f 1 f_2>f_1 f2>f1 时,卷积起升维的作用(增加了图像的通道数)。当 f 2 < f 1 f_2<f_1 f2<f1 时,卷积起降维的作用。

12.2 小尺寸卷积

卷积的尺寸决定了卷积的视野。卷积的尺寸越大,所提取的特征越宏观。但是,在进行大尺寸卷积时,参数的个数和运算量都比较大。因此,可以用多个小尺寸卷积来代替一个大尺寸卷积。例如,连做两个 3×3 卷积和做一个 5×5 卷积的视野是相同的,如下图所示:

在这里插入图片描述

两个 3×3 卷积对应的参数(忽略偏置)为 3×3+3×3=18 个。一个 5×5 卷积对应的参数(忽略偏置)为 5×5=25 个。正因如此,目前在设计深度卷积神经网络时,倾向于使用“小尺寸卷积 + 深层网络”的技术架构。

12.3 宽度卷积和Inception

在使用CNN进行物体识别时,经常会遇到待识别物体尺寸不一致的情况。例如,同样是识别狗,但是有些图片中的狗占了图片的绝大部分,有些只占了图片的一小部分。

传统的CNN一般通过把网络设计得非常深来解决此类问题,但这样做会导致以下问题。

  • 若训练集不够大,则较深的网络容易发生过拟合。

  • 网络越深,梯度越容易消失(模型难以优化)。

  • 简单堆叠较大的卷积层将耗费大量计算资源,因此难以应用。

为了使卷积层能适应不同的物体尺寸,神经网络会在同一层中并列使用多种尺寸的卷积 ,以定位图片中不同尺寸的物体。其基本思想是:在同一层上使用多种尺寸的卷积,网络会变得稍微宽一些,而不是深一些。

如下图所示:对输入分别使用三种尺寸的卷积核来提取特征,此外并列执行了一个最大池化层(它的作用是消除图像平移带来的影响)。在这里,最大池化层的步长为1,所以此池化操作不会改变输入的尺寸。滤波器拼接 是指各个分支的结果会被级联(作为该网络的输出)。级联是指多个尺寸相同的图像并列放在一起,组成新的图像(通道数增加),例如 28×28×3 的图像和 28×28×5 的图像级联,组成 28×28×8 的图像。Previous Layer的通道数往往特别多,这会导致卷积操作的运算量特别大。因此,可在 3×3 卷积 、5×5 卷积 、3×3 最大池化后分别进行 1×1 卷积操作,以降低特征图的“厚度”。此外,这些 1×1 卷积操作能提高网络的非线性程度。

在这里插入图片描述

这就是Google提出的Inception。Inception作为一个基础模块,并列使用多种尺寸的卷积核来提取图像的特征,以克服待识别目标的尺寸变化带来的影响。 注意,Inception的输入图像和输出图像的尺寸相同,通道数可以不同。

辅助分类器: 在特别深的网络中,很容易遇到梯度消失,因为网络中间层的特征已经具备一定的分类能力,所以,应在中间层添加辅助分类器(也就是在中间层的输出上进行分类)并配以辅助损失函数,总损失是辅助损失和真实损失的加权和。辅助分类器只用于训练,不用于推断。

12.4 Depthwise卷积和Pointwise卷积

在进行标准的卷积操作时,会把所有通道一并考虑。例如,输入为 f 个通道,使用 3 × 3 3×3 3×3 卷积,对应的卷积核尺寸为 3 × 3 × f 3×3×f 3×3×f。当输入的通道数过多时,且使用了我们前文提到的多个并列的卷积核时,这样做的问题是参数的个数过多、运算量过大。例如,输入 28 × 28 × 128 28×28×128 28×28×128 的图像,在正常情况下,经过256个 3 × 3 × 128 3×3×128 3×3×128 的卷积核,输出 28 × 28 × 256 28×28×256 28×28×256 的图像。

将以上方法改造一下,对 28 × 28 × 128 28×28×128 28×28×128 的输入图像,每个卷积核只负责一个输入通道,因此,共有128个 3 × 3 3×3 3×3 卷积,输出图像的尺寸仍为 28 × 28 × 128 28×28×128 28×28×128.。述卷积操作称为 Depthwise 卷积。它的特点是一个卷积核只负责一个通道,一个通道只被一个卷积核卷积 ,从而达到大幅降低运算量和减少参数个数的效果。

在这里插入图片描述

然而,这种对输入层的每个通道独立进行卷积运算的方法,没有有效利用同一位置上不同通道的特征信息,因此,还需要通过Pointwise卷积将这些通道组合起来 ,生成新的特征。

Pointwise 卷积使用多个 1 × 1 1×1 1×1 卷积进行标准的卷积运算。Pointwise卷积对上一步结果中的各个通道的特征进行加权组合,生成新的特征图。例如使用256个 1 × 1 1\times 1 1×1的卷积将前面Depthwise得到的 28 × 28 × 128 28\times 28\times 128 28×28×128变成 28 × 28 × 256 28\times 28\times 256 28×28×256

在上面的例子中,和使用256个 3 × 3 × 128 3×3×128 3×3×128 的卷积核相比,使用Depthwise+Pointwise(128个 3 × 3 × 1 3×3×1 3×3×1和256个 1 × 1 × 128 1×1×128 1×1×128的卷积核)可以减小所需的参数个数:

3 × 3 × 128 × 256 = 294912 > 3 × 3 × 128 + 1 × 1 × 128 × 256 = 33920 3×3×128×256=294912>3×3×128+1×1×128×256=33920 3×3×128×256=294912>3×3×128+1×1×128×256=33920

特征通道加权卷积

在传统的卷积操作中,各通道都被平等对待(各通道并列放在一起)。但是,由于每个通道都对应于一个独有的特征,而各类特征对最终任务的贡献是不同的,SENet网络 解决了这一问题:

假设输入为 32 × 32 × 128 32×32×128 32×32×128 的图像。先看下图上方的线路,对各通道中所有的数值进行全局平均(平均池化),结果对应于一个 128 × 1 128×1 128×1 的向量(这个操作称为Squeeze)。然后,将这个向量输入全连接神经网络 F e x ( x , W ) F_{ex} (x,W) Fex(x,W),最后一层的激活函数为Sigmoid,输出为128维。网络输出的每个维度的值域均为 ( 0 , 1 ) (0,1) (0,1),用于表示各个通道的权重。在下图下方的线路中,将 32 × 32 × 128 32×32×128 32×32×128 的输入图像中各通道的元素和相应的权重相乘,得到最终的结果。

在这里插入图片描述

显然,除了通道的重要性不同,位置的重要性也不同。CBAM 结合了通道域和空间域的注意力,给空间中给不同的位置也设置了权重。

CBAM首先给各个通道分配权重,然后给各个位置分配权重。

通道注意力模块 当中,CBAM使用每个通道的平均池化和最大池化这两个特征,都输入到如下图所示的共享神经网络中,然后将这两个特征的输出按位求和之后,经过sigmoid激活,生成各通道权重,即 M c ( F ) = σ ( M L P ( A v g P o o l _ S p a t i a l ( F ) ) + M L P ( M a x P o o l _ S p a t i a l ( F ) ) ) M_c (F)=σ(MLP(AvgPool\_Spatial (F))+MLP(MaxPool\_Spatial (F))) Mc(F)=σ(MLP(AvgPool_Spatial(F))+MLP(MaxPool_Spatial(F)))

空间注意力模块 当中,首先,对各位置上的所有通道进行最大池化和平均池化,即在同一位置上分别取通道的最大值和平均值。然后对这两个池化结果组合为为一个双通道图像,之后经过 7 × 7 7\times7 7×7的卷积将其降维成单通道。最后,由Sigmoid函数生成位置权重,即 M s ( F ) = σ ( f 7 × 7 ( [ A v g P o o l _ c h a n n e l ( F ) : M a x P o o l _ c h a n n e l ( F ) ] ) ) M_s (F)=σ(f^{7×7} ([AvgPool\_channel (F):MaxPool\_channel (F)])) Ms(F)=σ(f7×7([AvgPool_channel(F):MaxPool_channel(F)]))

在这里插入图片描述

第十三章 循环神经网络和LSTM模型

13.1 循环神经网络模型详解

13.1.1 循环神经网络的基本原理

在语音处理、自然语言处理等领域,样本之间的时序关系是非常重要的,而之前我们忽略掉了时序这一信息。

对于句子"我 住 在 朝阳区 苹果 社区",我们假设有一个分类器classifer来判断句子中的词语是“地址”还是“非地址”。

在上述式子中,每个词都对应于一个embedding,这一点和Word2vec无异。classifier(朝阳区)=“地址” 的可能性较大,即得分较高。同理,classifier(我)=“非地址” 的得分较高。但是,在本例中 “苹果” 应该是个地址,而在大多数语料中,“苹果”都不太可能对应于地点,所以分类器很容易分类出错。

大多数人工智能工具都会借鉴人类的思考方式。我们先想想看人类是如何解决这个问题的——对,就是上下文。在这里,我们给上一时刻的输出结果乘以一个待学习参数 k,作为下一时刻的输入 ,公式如下:

y ′ ( t ) = c l a s s f i e r ( x ( t ) , k y ′ ( t − 1 ) ) y'(t)=classfier(x(t),ky'(t-1)) y(t)=classfier(x(t),ky(t1))

以上模型如下图所示:

在这里插入图片描述

为了更具体地理解这个问题,我们假设分类模型是全连接神经网络,x(t)为t时刻地词所对应地embedding, U U U u 0 u_0 u0是待学习参数, f f f是sigmoid函数,该模型是逻辑回归, y ′ ( t − 1 ) y'(t-1) y(t1)为前一时刻的输出, k k k为待学习参数,则上述模型公式如下:

y ′ ( t ) = f ( U x ( t ) + k y ′ ( t − 1 ) + u 0 ) y'(t)=f(Ux(t)+ky'(t-1)+u_0) y(t)=f(Ux(t)+ky(t1)+u0)

然而大多数时候,直接将前一时刻的输出作为当前时刻的一个输入,并不是特别合适的。因此继续对分类模型进行改造:

首先将分类器由逻辑回归改造成单层神经网络,其中 g , f g,f gf为激活函数( g g g一般为tanh, f f f一般为sigmoid或softmax),公式如下:

h ( t ) = g ( U x ( t ) + u 0 ) y ′ ( t ) = f ( V h ( t ) + v 0 ) \begin{split}h(t)=g(Ux(t)+u_0)\\ y'(t)=f(Vh(t)+v_0)\end{split} h(t)=g(Ux(t)+u0)y(t)=f(Vh(t)+v0)

接着,将中间层 h ( t ) h(t) h(t) 作为下一时刻 t+1 的另一个输入 h ( t ) h(t) h(t) 称为状态向量 。因为状态向量存在于模型这个“黑盒”中,外界不知道它的存在,所以,状态向量是被隐藏的。改造后的模型通常称为循环神经网络(Recurrent Neural Networks,RNN) ,公式如下:

h ( t ) = g ( U x ( t ) + W h ( t − 1 ) + u 0 ) y ′ ( t ) = f ( V h ( t ) + v 0 ) \begin{split}&h(t)=g(Ux(t)+Wh(t-1)+u_0)\\ &y'(t)=f(Vh(t)+v_0)\end{split} h(t)=g(Ux(t)+Wh(t1)+u0)y(t)=f(Vh(t)+v0)

在这里插入图片描述

注意:在每个时刻,待学习参数 U、W、V、u_0、v_0 为同一套参数,即在所有时刻参数是共享的。

最后,由于RNN是一个变长序列,无法保证训练样本长度一致,所以不能进行批标准化,只能进行层标准化。

13.1.2 循环神经网络存在的一些问题

模型搭建完成,下一步就是参数学习了。待学习参数包括 U 、 W 、 V 、 u 0 、 v 0 U、W、V、u_0、v_0 UWVu0v0

假设任务为 t 分类,那么样本 i 的损失函数为: L o s s ( i ) = ∑ t = 0 T − y ( i ) ( t ) log ⁡ y ( i ) ′ ( t ) − ( 1 − y ( i ) ( t ) ) log ⁡ ( 1 − y ( i ) ′ ( t ) ) Loss_{(i)}=\sum_{t=0}^T -y_{(i)}(t)\log{y'_{(i)}(t)}-(1-y_{(i)}(t))\log{(1-y'_{(i)}(t))} Loss(i)=t=0Ty(i)(t)logy(i)(t)(1y(i)(t))log(1y(i)(t))

使用梯度下降法学习各个参数: ∂ L o s s ( i ) ∂ W = ∑ t = 0 T ∂ L o s s ( i ) ∂ y ( i ) ′ ( t ) ∂ y ( i ) ′ ( t ) ∂ W \cfrac{\partial Loss_{(i)}}{\partial W}=\sum_{t=0}^T \cfrac{\partial Loss_{(i)}}{\partial y'_{(i)}(t)}\cfrac{\partial y'_{(i)}(t)}{\partial W} WLoss(i)=t=0Ty(i)(t)Loss(i)Wy(i)(t).

因为 y ( i ) ′ y'_{(i)} y(i) h ( i ) ( t ) h_{(i)}(t) h(i)(t)直接相关,前面时刻的 h ( i ) ( t − 1 ) , h ( i ) ( t − 2 ) h_{(i)}(t-1),h_{(i)}(t-2) h(i)(t1)h(i)(t2)等都会通过 W W W U U U h ( i ) ( t ) h_{(i)}(t) h(i)(t)造成影响。所以 y ( i ) ′ y'_{(i)} y(i)和前面时刻的 W W W U U U都有关(虽然各时刻的 W 和U 都共享参数)

原文这里写的不清楚加上公式都炸了,所以参考另外一篇的推导:RNN梯度消失与梯度爆炸的原因

先回顾一下RNN的公式:

h ( t ) = g ( U x ( t ) + W h ( t − 1 ) + u 0 ) y ′ ( t ) = f ( V h ( t ) + v 0 ) \begin{split}&h(t)=g(Ux(t)+Wh(t-1)+u_0)\\ &y'(t)=f(Vh(t)+v_0)\end{split} h(t)=g(Ux(t)+Wh(t1)+u0)y(t)=f(Vh(t)+v0)

然后我们先分析 ∂ L o s s ( i ) ( t ) ∂ W \cfrac{\partial Loss_{(i)}(t)}{\partial W} WLoss(i)(t),为了更直观,我们先模拟一下 t = 3 t=3 t=3时的反向传播运算:

∂ L o s s ( i ) ( 3 ) ∂ W 简写为 ∂ L 3 ∂ W = ∂ L 3 ∂ y 3 ′ ∂ y 3 ′ ∂ h 3 ∂ h 3 ∂ W + ∂ L 3 ∂ y 3 ′ ∂ y 3 ′ ∂ h 3 ∂ h 3 ∂ h 2 ∂ h 2 ∂ W + ∂ L 3 ∂ y 3 ′ ∂ y 3 ′ ∂ h 3 ∂ h 3 ∂ h 2 ∂ h 2 ∂ h 1 ∂ h 1 ∂ W \cfrac{\partial Loss_{(i)}(3)}{\partial W}\text{简写为}\cfrac{\partial L_3}{\partial W}=\cfrac{\partial L_3}{\partial y'_3}\cfrac{\partial y'_3}{\partial h_3}\cfrac{\partial h_3}{\partial W} + \cfrac{\partial L_3}{\partial y'_3}\cfrac{\partial y'_3}{\partial h_3}\cfrac{\partial h_3}{\partial h_2}\cfrac{\partial h_2}{\partial W} + \cfrac{\partial L_3}{\partial y'_3}\cfrac{\partial y'_3}{\partial h_3}\cfrac{\partial h_3}{\partial h_2}\cfrac{\partial h_2}{\partial h_1}\cfrac{\partial h_1}{\partial W} WLoss(i)(3)简写为WL3=y3L3h3y3Wh3+y3L3h3y3h2h3Wh2+y3L3h3y3h2h3h1h2Wh1

同理:KaTeX parse error: Undefined control sequence: \part at position 8: \cfrac{\̲p̲a̲r̲t̲ ̲L_3}{\part V}=\…

∂ L o s s ( i ) ( 3 ) ∂ U 简写为 ∂ L 3 ∂ U = ∂ L 3 ∂ y 3 ′ ∂ y 3 ′ ∂ h 3 ∂ h 3 ∂ U + ∂ L 3 ∂ y 3 ′ ∂ y 3 ′ ∂ h 3 ∂ h 3 ∂ h 2 ∂ h 2 ∂ U + ∂ L 3 ∂ y 3 ′ ∂ y 3 ′ ∂ h 3 ∂ h 3 ∂ h 2 ∂ h 2 ∂ h 1 ∂ h 1 ∂ U \cfrac{\partial Loss_{(i)}(3)}{\partial U}\text{简写为}\cfrac{\partial L_3}{\partial U}=\cfrac{\partial L_3}{\partial y'_3}\cfrac{\partial y'_3}{\partial h_3}\cfrac{\partial h_3}{\partial U} + \cfrac{\partial L_3}{\partial y'_3}\cfrac{\partial y'_3}{\partial h_3}\cfrac{\partial h_3}{\partial h_2}\cfrac{\partial h_2}{\partial U} + \cfrac{\partial L_3}{\partial y'_3}\cfrac{\partial y'_3}{\partial h_3}\cfrac{\partial h_3}{\partial h_2}\cfrac{\partial h_2}{\partial h_1}\cfrac{\partial h_1}{\partial U} ULoss(i)(3)简写为UL3=y3L3h3y3Uh3+y3L3h3y3h2h3Uh2+y3L3h3y3h2h3h1h2Uh1

因此可以推导出:

∂ L 3 ∂ W = ∑ k = 0 3 ∂ L 3 ∂ y 3 ′ ∂ y 3 ′ ∂ h 3 ( Π j = k + 1 3 ∂ h j ∂ h j − 1 ) ∂ h k ∂ W \cfrac{\partial L_3}{\partial W}=\overset{3}{\underset{k=0}{\sum}} \cfrac{\partial L_3}{\partial y'_3}\cfrac{\partial y'_3}{\partial h_3}(\overset{3}{\underset{j=k+1}{\Pi}}\cfrac{\partial h_j}{\partial h_{j-1}})\cfrac{\partial h_k}{\partial W} WL3=k=03y3L3h3y3(j=k+1Π3hj1hj)Whk

从而推广得到:

∂ L t ∂ W = ∑ k = 0 t ∂ L t ∂ y t ′ ∂ y t ′ ∂ h t ( Π j = k + 1 t ∂ h j ∂ h j − 1 ) ∂ h k ∂ W \cfrac{\partial L_t}{\partial W}=\overset{t}{\underset{k=0}{\sum}} \cfrac{\partial L_t}{\partial y'_t}\cfrac{\partial y'_t}{\partial h_t}(\overset{t}{\underset{j=k+1}{\Pi}}\cfrac{\partial h_j}{\partial h_{j-1}})\cfrac{\partial h_k}{\partial W} WLt=k=0tytLthtyt(j=k+1Πthj1hj)Whk

从上面的式子我们发现,于 V V V 求偏导不存在依赖问题;但是对于 W 、 U W、U WU 求偏导的时候,由于时间序列长度,存在长期依赖的情况。

假设激活函数 g g g为tanh,那么: Π j = k + 1 t ∂ h j ∂ h j − 1 = Π j = k + 1 t t a n h ′   W (备注:tanh的导数乘以W) \overset{t}{\underset{j=k+1}{\Pi}}\cfrac{\partial h_j}{\partial h_{j-1}} = \overset{t}{\underset{j=k+1}{\Pi}}tanh'\ W\text{(备注:tanh的导数乘以W)} j=k+1Πthj1hj=j=k+1Πttanh W(备注:tanh的导数乘以W

因为tanh函数的导数最大值为1,也就是说,大部分都是小于1的数在做累乘,所以会出现梯度消失 的情况。而如果参数 W 中的值太大,那么则会出现梯度爆炸 的情况。在平时运用中,RNN比较深,使得梯度爆炸或者梯度消失问题会比较明显。

解决方法:使用 R e L U ReLU ReLU激活函数,或者改进内部结构为 L S T M LSTM LSTM

13.2 LSTM模型详解

CNN的缺点除了上文提到的梯度消失和爆炸,还有长距离依赖问题( h h h会一直被稀释)。为了解决上述问题,我们引入一个新的状态 c(t) 来专门存储历史信息,h(t) 则用于当前时刻的输出。公式如下**(@代表将两个矩阵拼接在一起):**

c ( t ) = c ( t − 1 ) + t a n h ( W C [ x ( t ) @ h ( t − 1 ) ] + b C ) h ( t ) = t a n h ( c ( t ) ) y ′ ( t ) = g ( V h ( t ) + v 0 ) \begin{split}c(t)=&c(t-1)+tanh(W_C[x(t)@h(t-1)]+b_C) \\ h(t)=&tanh(c(t)) \\ y'(t)=&g(Vh(t)+v_0)\end{split} c(t)=h(t)=y(t)=c(t1)+tanh(WC[x(t)@h(t1)]+bC)tanh(c(t))g(Vh(t)+v0)

c ( t ) c(t) c(t) 用于保存序列的历史信息。又因为 ∂ c ( t ) ∂ c ( t − 1 ) = 1 \cfrac{\partial c(t)}{\partial c(t-1)}=1 c(t1)c(t)=1,所以不会出现之前的梯度消失和梯度爆炸问题。

但是上述改进又引入了新问题,即 c ( t ) c(t) c(t)不会遗忘, c ( t ) c(t) c(t) 的值会非常大,导致 h ( t ) = T a n h ( c ( t ) ) h(t)=Tanh(c(t)) h(t)=Tanh(c(t)) 所对应的Tanh函数达到饱和,其后果是后面的输入 x(t) 几乎不会对 h(t) 产生影响。

因此我们需要添加一个遗忘门 g a t e f o r g e t gate_{forget} gateforget g a t e f o r g e t gate_{forget} gateforget是一个向量,元素取值范围为 ( 0 , 1 ) (0,1) (0,1) c ( t − 1 ) c(t-1) c(t1)通过与 g a t e f o r g e t gate_{forget} gateforget按元素乘法,来实现遗忘;

同时人类在面对新事物的时候,一般也无法全部记住,而是有选择地记住一部分。这样的好处是能够克服噪声,所以我们再添加一个 过滤输入门 g a t e i n gate_{in} gatein 选择记住哪些新信息,即:

c ( t ) = g a t e f o r g e t ⋅ c ( t − 1 ) + g a t e i n ⋅ t a n h ( W C [ x ( t ) @ h ( t − 1 ) ] + b C ) c(t)=gate_{forget}\cdot c(t-1)+gate_{in}\cdot tanh(W_C[x(t)@h(t-1)]+b_C) c(t)=gateforgetc(t1)+gateintanh(WC[x(t)@h(t1)]+bC)

最后,尽管当前模型的输出 h ( t ) = T a n h ( c ( t ) ) h(t)=Tanh(c(t)) h(t)=Tanh(c(t)) 完全由 c ( t ) c(t) c(t) 决定,但当前时刻的分类任务并不需要所有的 c ( t ) c(t) c(t),所以我们再添加一个过滤输出门 g a t e o u t gate_{out} gateout,即:

h ( t ) = g a t e o u t ⋅ t a n h ( c ( t ) ) h(t)=gate_{out}\cdot tanh(c(t)) h(t)=gateouttanh(c(t))

至此我们引入了三个过滤门 g a t e f o r g e t 、 g a t e i n 、 g a t e o u t gate_{forget}、gate_{in}、gate_{out} gateforgetgateingateout 且其向量元素的取值范围都是 (0,1),其取值由以下公式得到:

g a t e f o r g e t = σ ( W f o r g e t [ x ( t ) @ h ( t − 1 ) ] + b f o r g e t ) g a t e i n = σ ( W i n [ x ( t ) @ h ( t − 1 ) ] + b i n ) g a t e o u t = σ ( W o u t [ x ( t ) @ h ( t − 1 ) ] + b o u t ) \begin{split}gate_{forget}&=\sigma(W_{forget}[x(t)@h(t-1)]+b_{forget}) \\gate_{in}&=\sigma(W_{in}[x(t)@h(t-1)]+b_{in}) \\gate_{out}&=\sigma(W_{out}[x(t)@h(t-1)]+b_{out}) \end{split} gateforgetgateingateout=σ(Wforget[x(t)@h(t1)]+bforget)=σ(Win[x(t)@h(t1)]+bin)=σ(Wout[x(t)@h(t1)]+bout)

在这里, σ σ σ 为Sigmoid函数。总结以下前面的内容**(并且结合下图)** ,就得到了LSTM(Long Short-Term Memory):

C t ~ = t a n h ( W C [ x ( t ) @ h ( t − 1 ) ] + b C ) C t = c ( t ) = g a t e f o r g e t ⋅ c ( t − 1 ) + g a t e i n ⋅ C t ~ H t = h ( t ) = g a t e o u t ⋅ t a n h ( c ( t ) ) y ′ ( t ) = g ( V h ( t ) + v 0 ) \begin{split}\tilde{C_t}=&tanh(W_C[x(t)@h(t-1)]+b_C) \\ C_t=c(t)=&gate_{forget}\cdot c(t-1)+gate_{in}\cdot \tilde{C_t} \\ H_t=h(t)=&gate_{out}\cdot tanh(c(t)) \\ y'(t)=&g(Vh(t)+v_0) \end{split} Ct~=Ct=c(t)=Ht=h(t)=y(t)=tanh(WC[x(t)@h(t1)]+bC)gateforgetc(t1)+gateinCt~gateouttanh(c(t))g(Vh(t)+v0)

F t = g a t e f o r g e t = σ ( W f o r g e t [ x ( t ) @ h ( t − 1 ) ] + b f o r g e t ) I t = g a t e i n = σ ( W i n [ x ( t ) @ h ( t − 1 ) ] + b i n ) O t = g a t e o u t = σ ( W o u t [ x ( t ) @ h ( t − 1 ) ] + b o u t ) \begin{split}F_t=gate_{forget}&=\sigma(W_{forget}[x(t)@h(t-1)]+b_{forget}) \\I_t=gate_{in}&=\sigma(W_{in}[x(t)@h(t-1)]+b_{in}) \\O_t=gate_{out}&=\sigma(W_{out}[x(t)@h(t-1)]+b_{out}) \end{split} Ft=gateforgetIt=gateinOt=gateout=σ(Wforget[x(t)@h(t1)]+bforget)=σ(Win[x(t)@h(t1)]+bin)=σ(Wout[x(t)@h(t1)]+bout)

在这里插入图片描述

单向LSTM只能获得前向的信息,双向LSTM能够获得前后文的信息,其实就是:采用两个方向不同的LSTM(LSTM1和LSTM2),在输出时将二者的输出向量串联起来。

13.3 LSTM模型的改进和应用

CNN和LSTM都可用于文本分类任务,那么,它们之间有什么区别呢?

  • LSTM:强调全局信息,对局部信息的提取能力较弱。

  • CNN:能有效地提取局部特征,但“大局观”不足。

鉴于二者各自的特点,目前工业界常常将二者组合使用,其模型称为LSTM-CNN,结构如图所示。

在这里插入图片描述

该模型先将字符输入LSTM模型,使字符获得一个全局特征,再使用CNN提取局部特征,最后进行分类。

13.4 CTC算法

除了在语音、文字这类天然具有时序特点的场景中可以使用LSTM模型,在图像分类任务中也可以使用LSTM模型。将图像的宽作为时间,将图像的高作为向量,将图像作为时序特征 ,输入LSTM模型,然后将LSTM最后一个节点的输出作为图像特征输入Softmax函数或Sigmoid函数并进行分类。

第十四章 Attention模型和Transformer模型

14.1 Attention模型详解

14.1.1 注意力机制的基本原理

在第13章中我们学习了时序模型LSTM,例如,可以使用两个具有不同参数的LSTM模型进行机器翻译。

在这里插入图片描述

在以上模型中,将待翻译的中文“我爱你”分成了三个词,顺序输入LSTM1,最后一个时刻的上下文信息 C 包含中文“我爱你”的完整信息,LSTM1就是编码器Encoder。

在翻译阶段,将 C 作为LSTM2的起始状态。LSTM2的第一个输入为“”,表示该位置是起始位置。输出状态 q_1 经过一个Softmax函数,预测出第一个(t=1)英文单词“I”。依此类推,使用LSTM2预测各个英文单词。预测出“”字符,就表明英文句子结束LSTM2就是解码器Decoder。

整个模型称为Encoder-Decoder模型或Seq2Seq (从序列到序列)模型。

由于存在长距离衰减问题,所以,当编码句子很长时,句子靠前的部分对 C 的影响将会降低。此外在解码时,每一时刻都会添加新的信息,导致编码信息 C 对翻译的影响越来越弱,因此,越靠后的内容,翻译结果越差。


在翻译领域,解码阶段的词和编码阶段的词有很强的映射关系,例如“爱”和“love”。但是,Seq2seq模型无法在翻译“love”时直接使用“爱”这个词提供的信息,因为在解码阶段只能使用编码阶段的全局信息。

我们可以将预测结果改进为:获得LSTM2的第 t t t个输出 q t q_t qt之后,分别计算其与LSTM1的输出的相似度,如下图所示,分别计算 q 1 q_1 q1 v 1 、 v 2 、 v 3 v_1、v_2、v_3 v1v2v3的内积,通过Softmax函数对 s 1 、 s 2 、 s 3 s_1、s_2、s_3 s1s2s3 进行归一化 得到相似度得分 a 1 , a 2 , a 3 a_1,a_2,a_3 a1,a2,a3,满足 a 1 + a 2 + a 3 = 1 a_1+a_2+a_3=1 a1+a2+a3=1

接下来,根据相似度得分对 v 1 、 v 2 、 v 3 v_1、v_2、v_3 v1v2v3 进行加权求和,即 h 1 = a 1 v 1 + a 2 v 2 + a 3 v 3 h_1=a_1 v_1+a_2 v_2+a_3 v_3 h1=a1v1+a2v2+a3v3。最后,使用向量 h_1 通过Softmax函数来预测单词。上述模型称为注意力(Attention)模型。

在这里插入图片描述

14.1.2 Attention模型概述

14.1.1节讲解了Attention模型在Seq2Seq机器翻译中的应用,本节将介绍Attention模型的通用形式。大致思想依然为:用q去计算和每个k的相似度,结果softmax之后获得每个v的加权,然后对v加权求和。

Attention模型的三要素是 q 、 K 、 V q、K、V qKV。其中, K K K V V V 分别对应于向量序列 KaTeX parse error: {split} can be used only in display mode.

它们不仅序列长度一致 ,而且元素都是对应的,即 k j k_j kj v j v_j vj 对应。 k j k_j kj v j v_j vj 均为行向量 ,分别表示两类特征,因此向量长度可以不一致

Attention模型的操作步骤,如下图所示。其中, f ( q , k ) f(q,k) f(q,k) 用于计算相似得分(除了前面提到的内积运算,在14.1.3节还将介绍其他方法)。为了运算方便,把Attention操作记为 h = A t t e n t i o n ( q , K , V ) h=Attention(q,K,V) h=Attention(q,K,V)

q q q 为行向量时,输出为向量,当 q q q 为向量序列时,此时的输出也是一个向量序列,即分别对该序列的每个向量做 attention 操作。

在这里插入图片描述

因为Attention模型的所有向量都是行向量,所以,可以方便地将 H 写成矩阵相乘的形式,公式如下:

H = s o f t m a x ( Q K T ) V H=softmax(QK^T)V H=softmax(QKT)V

14.1.3 Attention模型的改进形式

Attention模型求相似度,除了通过 〈q,k〉 直接求内积,还有很多方法,在通过 〈q,k〉 求相似度时,如果特征维度过高,就会导致计算出来的相似度 s 的值过大,而 s 的值过大会进一步导致归一化函数Softmax饱和,使计算出来的 a 要么接近1,要么接近0,即加权求和退化成“胜者全拿”。

因此可以使用 s = < q , k > / d s=<q,k>/\sqrt{d} s=<q,k>/d 来优化,其中 d d d 是 q或k的维度,用于避免 s 受到过高的维度的影响。

为了解决 q 和 v 的向量长度必须一致的问题,也可以使用 s = q W k T d s=\cfrac{qWk^T}{\sqrt{d}} s=d qWkT

最后介绍第四种方法: s = < q W , k U > / d s=<qW,kU>/\sqrt{d} s=<qW,kU>/d

14.1.4 Self-Attention模型

H = A t t e n t i o n ( Q , K , V ) H=Attention(Q,K,V) H=Attention(Q,K,V) 有一种特殊情况,即 Q = K = V Q=K=V Q=K=V,这就是自注意力(Self-Attention)模型。有以下公式:

α i j = s o f t m a x ( ( q i ) ( k j ) T d ) = s o f t m a x ( ( x i W Q ) ( x j W K ) T d ) h i = ∑ j = 1 n α i j v j = ∑ j = 1 n α i j ( x j W V ) \begin{split}\alpha_{ij}&=softmax(\cfrac{(q_i)(k_j)^T}{\sqrt{d}})=softmax(\cfrac{(x_iW^Q)(x_jW^K)^T}{\sqrt{d}}) \\ h_i&=\sum_{j=1}^n\alpha_{ij}v_j=\sum_{j=1}^n\alpha_{ij}(x_jW^V) \end{split} αijhi=softmax(d (qi)(kj)T)=softmax(d (xiWQ)(xjWK)T)=j=1nαijvj=j=1nαij(xjWV)

在这里插入图片描述

在这里插入图片描述

Self-Attention模型的输入只有一个序列,序列长度为 m,序列中的每个元素均为向量,对应的输出 H 是长度为 m 的向量序列。Self-Attention模型的输入和输出均为等长序列,因此,从效果的角度看,Self-Attention可以取代LSTM。

在LSTM中,有长距离依赖问题,而self-attention模型中可以和其他所有时刻的信息直接关联,解决了LSTM的长距离依赖问题。

另外,LSTM在计算 t 时刻的输出时,必须把 t-1 时刻的状态计算完成,每个时刻的输出和状态都依赖前一时刻,因此,LSTM无法在各个时刻并行计算(这会导致在处理大规模数据时速度受限)。而Self-Attention在所有时刻完全独立,可以并行计算 h 1 ∼ h n h_1\sim h_n h1hn(这是Self-Attention的一个重要优势)。

不过当前我们的设计还是一个词袋模型,在一个句子里,各个词的前后关系对这个句子的意义是有影响的,这种影响不仅体现在语法方面,而且还体现在语义方面。所以我们使每个位置对应于一个位置编码,将输入和位置编码按位相加 后输入模型。

在transformer中,我们使用的位置编码公式如下所示:

{ p k , 2 i = sin ⁡ k 1000 0 2 i / d p k , 2 i + 1 = cos ⁡ k 1000 0 2 i / d \begin{cases}p_{k,2i}=\sin{\cfrac{k}{10000^{2i/d}}} \\ p_{k,2i+1}=\cos{\cfrac{k}{10000^{2i/d}}}\end{cases} pk,2i=sin100002i/dkpk,2i+1=cos100002i/dk

其中 p k , 2 i 、 p k , 2 i + 1 p_{k,2i}、p_{k,2i+1} pk,2ipk,2i+1 分别是位置k的编码向量的第2i和2i+1个分量,d是位置向量的维度。

14.1.5 Multi-Head Attention模型

在标准的Attention模型 Attention(Q,K,V) 中对 Q 和 K 进行相似度匹配,相当于在特定的角度上计算相似度,Q 和 K 所在的向量空间即为观察角度,并且有且仅有一个观察角度。

例如:“小明养了一只猫,它特别调皮可爱,他非常喜欢它”,每个词都和其他词有一个对应的相似度得分,猫”从指代的角度看,与“它”的匹配度最高,但从属性的角度看,与“调皮”“可爱”的匹配度最高。标准的Attention模型无法处理这种多语义的情况,所以multi-head attention模型被提出了:

Q 1 = Q W 1 Q , K 1 = K W 1 K , V 1 = V W 1 V Q_1=QW_1^Q,K_1=KW_1^K,V_1=VW_1^V Q1=QW1Q,K1=KW1K,V1=VW1V

其中 Q 、 K 、 V Q、K、V QKV 都是向量序列,因此特征变换就是在各时序上的向量变换。 W 1 Q 、 W 1 K 、 W 1 V W_1^Q 、W_1^K 、W_1^V W1QW1KW1V 均为矩阵,矩阵中的元素均为待学习参数。

在转换后的空间中进行Attention运算,即 h e a d 1 = A t t e n t i o n ( Q 1 , K 1 , V 1 ) = s o f t m a x ( Q 1 K 1 T d ) V 1 head_1=Attention(Q_1,K_1,V_1 )=softmax(\cfrac{Q_1K_1^T}{\sqrt{d}})V_1 head1=Attention(Q1,K1,V1)=softmax(d Q1K1T)V1

需要注意的是, h e a d 1 head_1 head1也是向量序列,其向量长度和 Q Q Q一致(令为 m m m),其每个元素都是行向量 h 1 , i h_{1,i} h1,i,行向量的长度和 V V V的行向量长度一致。

同理我们可以定义 h e a d 2 , h e a d 3 , ⋯   , h e a d c head_2,head_3,\cdots,head_c head2,head3,,headc。我们将这些结果串联起来:

c o n c a t ( h e a d 1 , h e a d 2 , ⋯   , h e a d c ) = [ h 1 , 1 h 2 , 1 ⋯ h c , 1 h 1 , 2 h 2 , 2 ⋯ h c , 2 ⋮ h 1 , m h 2 , m ⋯ h c , m ] concat(head_1,head_2,\cdots,head_c)=\left[\begin{matrix}h_{1,1} &h_{2,1} &\cdots &h_{c,1}\\ h_{1,2} &h_{2,2} &\cdots &h_{c,2} \\ & &\vdots \\ h_{1,m} &h_{2,m} &\cdots &h_{c,m} \end{matrix}\right] concat(head1,head2,,headc)= h1,1h1,2h1,mh2,1h2,2h2,mhc,1hc,2hc,m

因为各抽头串联在一起后的维度可能比较高,所以,通过 W O W^O WO 对串联结果进行一次线性变换,可以实现降维和使各抽头的信息融合的目的,得到最终结果。

M u l t i H e a d ( Q , K , V ) = c o n c a t ( h e a d 1 , h e a d 2 , ⋯   , h e a d n ) W O MultiHead(Q,K,V)=concat(head_1,head_2,\cdots,head_n)W^O MultiHead(Q,K,V)=concat(head1,head2,,headn)WO

在这里插入图片描述

14.2 Transformer模型原理

参考资料

14.2.1 编码块和解码块

编码和解码模块均采用多层Encoder和Decoder。具体的,编码器和解码器都由6(论文中用的6,但是其它数字也行)个小块组成,最后一级编码块(Encoder Block)的输出是各级解码块(Decoder Block)的输入 。如下图所示:

在这里插入图片描述

所有的编码器在结构上都是相同的 ,但它们没有共享参数 。每个编码器 都可以分解成两个子层:前馈神经网络自注意力

解码器 中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层,除此之外,这两个层之间还有一个编码-解码注意力层

这个“编码-解码注意力层”工作方式基本就像多头自注意力层一样,只不过它是通过在它下面的层来创造查询矩阵,并且从编码器的输出中取得键/值矩阵。 即以上一层解码器的输出经过自注意力机制之后的输出作为 Q Q Q,最后一层编码器的输出作为 K K K V V V

在这里插入图片描述

上图是编码器和解码器的简要核心结构 ,接下来我们再探讨一下其细节:

如下图所示,除了前文提到的结构,看上去很复杂,但其实就是之前提到的每个 简要核心结构 后面都添加一个求和与归一化 ,这里的求和指的是利用残差连接 让上一个 核心结构的输入和输出 相加,这里的归一化指的是 层归一化。

在这里插入图片描述

最后将最后一层解码器的输出经过线性变化和softmax之后,就能获得词表中每个词作为下一个输出的概率。

14.2.2 transformer工作流程

  • 输入处理:编码器接受输入序列并将其转换为隐藏状态表示(上下文向量)。

  • 解码器初始输入:解码器最初的输入通常是一个特殊的起始符(比如<start>)(最底层解码器的输入一开始只有<start>,但是生成的输出token会不断添加到最底层解码器的输入,直到生成<end>)。

  • 生成输出:解码器根据初始输入(比如<start>)和编码器的输出(上下文向量)生成第一个输出标记(token),例如"Hello"

  • 输出反馈为输入:解码器在生成第一个标记(如"Hello")后,将该标记的嵌入表示作为下一次解码的输入,同时继续参考编码器的上下文向量来生成下一个标记。(即生成的token会添加到最底层解码器 的输入)

  • 重复过程:这个过程会重复,直到生成终止标记(如<end>)或达到设定的序列长度。

14.2.3 transformer训练流程

为了训练一个transformer模型,我们既可以使用人工标注的数据集,也可以使用随机mask掉语料中的一部分来预测。

总之我们可以使用transformer的预测与真实的输出作比较来获得 L o s s Loss Loss

真实的输出是一个 one-hot 编码,即一个长度为词表大小的向量,只有一个位置为1,其余都为0。而transformer的输出同样为一个长度为词表大小的向量,但是每个位置为一个 [ 0 , 1 ] [0,1] [0,1]的数,表示为该词的概率。

显然我们可以使用交叉熵或KL散度来作为损失函数。

14.3 BERT模型及应用

BERT 只使用了 Transformer 的 Encoder 模块 ,与之相反的是 GPT 只是用了 Transformer的 Decoder模块。

在这里插入图片描述

bert的训练有两种方式:

  • Masked LM 的任务描述为:给定一句话,随机抹去这句话中的一个或几个词,要求根据剩余词汇预测被抹去的几个词分别是什么。具体来说,文章作者在一句话中随机选择 15% 的词汇用于预测。对于在原句中被抹去的词汇, 80% 情况下采用一个特殊符号 [MASK] 替换, 10% 情况下采用一个任意词替换,剩余 10% 情况下保持原词汇不变。

  • Next Sentence Prediction 的任务描述为:给定一篇文章中的两句话,判断第二句话在文本中是否紧跟在第一句话之后,如下图所示。

bert的应用:

使用训练好的BERT模型,我们可以方便地抽取句子的词向量和相应的句子向量,将其作为语义特征,提供给后续环节。

有时,当业务语料专业性过强或任务特殊(例如金融等垂直领域),直接使用BERT模型效果不佳时,我们有两种方式:

  1. 可以通过fine-tune的方式来微调训练bert,具体地:冻结前层,仅训练靠近输出的后层
  2. 通过transfer learning迁移学习的方式,将BERT模型的输出作为另一个多层网络的输入的特征,该多层网络的输出和业务的任务相关(使用垂直领域的语料,只训练这个多层网络)。
  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值