Deep Learning 基础

命运的齿轮开始转动   :)


Anaconda 控制台常用命令

conda create -n pytorch python=3.6 //通过conda创建一个名为:pytorch的虚拟环境,python版本是3.6

conda info --envs  //查看创建的虚拟环境

conda activate pytorch //激活pytorch房间

conda list //查看虚拟环境下的已经有的包

jupyter notebook //进入jupyter

线性代数相关

单位矩阵:E一般是指单位矩阵,就是对角线都为1,其它元素都是0的方阵。 它的性质就是左乘右乘任何别的矩阵都是原来那个矩阵,挺像实数中的1。

梯度

在深度学习中,梯度是一个非常重要的概念,它表示了一个函数相对于其输入参数的变化率。在神经网络中,这通常指的是损失函数相对于模型参数的变化率

具体来说,梯度是一个向量,包含了损失函数关于每个模型参数的偏导数。梯度的方向指示了在参数空间中使损失函数增加最快的方向,而梯度的大小表示了增加率的大小。通过梯度下降等优化算法,可以使用梯度信息来更新模型参数,从而最小化损失函数,使模型能够更好地拟合数据。

在深度学习中,通常使用反向传播(Backpropagation)算法来计算梯度。反向传播通过链式法则逐层计算损失函数相对于每个参数的偏导数,然后将这些偏导数组合成梯度。一旦获得了梯度,就可以使用各种优化算法,如梯度下降、随机梯度下降(SGD)、Adam 等来更新模型的权重和偏置,以最小化损失函数。

梯度是深度学习中的核心概念,它允许模型自动学习从数据中提取有用特征并进行参数调整,以便在任务上获得更好的性能。通过梯度下降等优化过程,模型能够逐渐优化自身,使其在训练数据上表现得更好

梯度下降可以分为随机梯度下降,批量梯度下降和小批量梯度下降

其中采用小批量梯度下降有助于跳出局部最优解

深度学习需要使用反向传播计算不同节点的梯度信息,然后需要选择合适的优化器。优化器的作用相当于对使用反向传播得到的梯度信息进行更新

深度学习当中Epoch,Batch以及Batch size的区别

深度学习中Epoch、Batch以及Batch size的设定 - 知乎

正向传播与反向传播的关系

4.7. 前向传播、反向传播和计算图 — 动手学深度学习 2.0.0 documentation

文本预处理

词元化

词元(token)是文本的基本单位

词表

  词元的类型是字符串,而模型需要的输入是数字,因此这种类型不方便模型使用。需要构建一个字典,通常叫做词表,用来将字符串类型的词元映射到从0开始的数字索引当中。

  我们先将训练集中的所有文档合并在一起,对它们的唯一词元进行统计, 得到的统计结果称之为语料(corpus)。然后根据每个唯一词元的出现频率,为其分配一个数字索引。 很少出现的词元通常被移除,这可以降低复杂性。

  另外,语料库中不存在或已删除的任何词元都将映射到一个特定的未知词元“<unk>”。 我们可以选择增加一个列表,用于保存那些被保留的词元, 例如:填充词元(“<pad>”); 序列开始词元(“<bos>”); 序列结束词元(“<eos>”)。

语言模型

语言模型(language model)的目标是估计序列的联合概率

马尔可夫模型与N元语法

8.3. 语言模型和数据集 — 动手学深度学习 2.0.0 documentation

一元语法相当于只和前面一个词的出现有关

二元语法相当于和前面的两个词的出现有关

三元语法相当于和前面三个词的出现有关

词向量

CBOW算法

参考

Continuous Bag of Words (CBOW) | 莫烦Python

Skip-Gram

Encorder-Decorder 结构

可以理解为Encorder负责理解上文,Decorder负责将思考怎样在理解的句子的基础上进行做任务

参考:Seq2Seq 语言生成模型 | 莫烦Python

在Transformer当中:

主要目的都一样,为了完成语言的理解和任务的输出,使用Encoder对语言信息进行压缩和提炼,然后用Decoder产生相对的内容。 详细说明的话,Encoder 负责仔细阅读,一遍一遍地阅读,每一遍阅读都是重新使用注意力关注到上次的理解,对上次的理解进行再一次转义。 Decoder 任务同Seq2Seq 的 decoder 任务一样,同时接收Encoder的理解和之前预测的结果信息,生成下一步的预测结果

Gradient Descent and Backpropagation

To compute the gradients effciently, we can use backpropagation(反向传播)

Chain Rule 链式法则

神经网络中的反向传播算法就是已链式法则为基础演变的;接下来先说说链式法则的概念然后通过链式法则的两种形式学习链式法则

 导数和微分的关系 微分和导数的关系是什么?两者的几何意义有什么不同?为什么要定义微分 ? - 知乎 (zhihu.com)

 Forward pass

Backward pass

最终:

case 1 : 如果后面直接就是output layer

 case 2 :如果后面不是output layer

Error,Bias,Variance 的区别

 Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。

举一个例子,一次打靶实验,目标是为了打到10环,但是实际上只打到了7环,那么这里面的Error就是3。具体分析打到7环的原因,可能有两方面:一是瞄准出了问题,比如实际上射击瞄准的是9环而不是10环;二是枪本身的稳定性有问题,虽然瞄准的是9环,但是只打到了7环。那么在上面一次射击实验中,Bias就是1,反应的是模型期望与真实目标的差距,而在这次试验中,由于Variance所带来的误差就是2,即虽然瞄准的是9环,但由于本身模型缺乏稳定性,造成了实际结果与模型期望之间的差距。

举一个例子,一次打靶实验,目标是为了打到10环,但是实际上只打到了7环,那么这里面的Error就是3。具体分析打到7环的原因,可能有两方面:一是瞄准出了问题,比如实际上射击瞄准的是9环而不是10环;二是枪本身的稳定性有问题,虽然瞄准的是9环,但是只打到了7环。那么在上面一次射击实验中,Bias就是1,反应的是模型期望与真实目标的差距,而在这次试验中,由于Variance所带来的误差就是2,即虽然瞄准的是9环,但由于本身模型缺乏稳定性,造成了实际结果与模型期望之间的差距。


机器学习中的 Bias(偏差)、Error(误差)、Variance(方差)有什么区别和联系? - 知乎 (zhihu.com)

  N-fold Cross Validation

Convolutional Neural Network (CNN) 卷积神经网络

使用卷积层来代替全连接层的好处是可以使得模型更简洁,所需要的参数更少。

卷积层的两个被训练的参数是卷积核权重和标量偏置

二维卷积层的核心计算是二维互相关计算,最简单的形式是,对二维输入数据和卷积核执行互相关操作,然后添加一个偏置。

填充和步幅:

填充可以增加输出的高度和宽度,这常用来使得输入和输出具有相同的高和宽。

步幅可以减少输出的高和宽

多输入通道:

当输入当中具有多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。

多输出通道:

随着·神经网络层数的增加,我们通常会增加输出通道的维数,通过减少空间分辨率来获得更大的通道深度。

池化层(汇聚层)

返回窗口当中的最大值或者平均值,用来环节卷积层对位置的敏感性

池化层与卷积层类似,都具有填充和步幅。

但是池化层没有可以学习的参数。

在每一个输入通道数应用池化层来获得相应的输出通道数。

对于池化层来说,其输入通道的数量等于输出通道的数量。 

池化层可以分为平均池化层或者最大池化层。

深度卷积神经网络 AlexNet

其改进在于:采用了丢弃法,使用ReLu作为激活函数,使用MaxPooling

更大的核窗口和步长,更大的池化窗口,使用最大池化层。

在全连接网络当中参数很多,模型的弹性较大。容易overfitting

Observation 1:Identifying some critical patterns

 

  有此产生的简化为每一个Neural只需要负责一部分范围,例如上图当中的第一个Neural只需要看红色区域。

  即该区域作为一个27维的向量,并将其作为该Neural的输入。

Receptive Field (感受野)

  即每一个Neural只需要负责自己的Receptive Field

  每个神经元只与输入数据的一个局部区域连接。该连接的空间大小叫做神经元的感受野(receptive field)   

  不同的Neural对应的Receptive Field之间是可以重叠的。如下图:

  一个Receptive field的kenal size 一般是3*3,并且一个Receptive field由一组Neural来负责。 

Stride

将一个Receptive field向某方向移动一定距离,得到一个新的Receptive field,这个距离叫做Stride,(该参数可以自由确定)如下图:

Padding

如果Receptive field的一部分超出了影响,需要做padding处理。例如用0来填补

Observation 2:The same patterns appear in different regions

  如果相同的Patterns出现在不同的地方,不需要每一个Receptive field都有一个用于识别该pattern的Neural。 

Parameter sharing (共享参数/权值共享) 

  在卷积层中权值共享是用来控制参数的数量。假如在一个卷积核中,每一个感受野采用的都是不同的权重值(卷积核的值不同),那么这样的网络中参数数量将是十分巨大的。

  令不同Receptive field  的Neural来共享参数,即令两个Neural 的权重完全相同。

  由于卷积具有“权值共享”这样的特性,可以降低参数数量,达到降低计算开销,防止由于参数过多而造成过拟合。

下图当中两个Neural虽然负责的Receptive field 不同,但是他们具有相同的权重。

常见的共享参数的设定方式:

Each receptive field has the neruals with the same set of parameters.

 Convolutional Layer (卷积层)

   具有了Receptive Field和Parameter Sharing后,就有了Convolutional Layer (卷积层)

Observation 3: 关于CNN的另外一种解释 based on filter

tensor就是一个3*3*channel的区域

Filter 

Each filter detects a small pattern.

  The valuse in the filters are unknown parameters ,但是这些未知的参数可以通过Gradient Descent得到。

  将该Filter 和不同的区域进行Inner Prodeuct。并进行移动,移动距离为stride

  

  然后对每一个Filter都进行同样的处理

 Feature Map

  每个Filter都会产生一群数字,假如有64个Filter,就会产生64群数字。将一张图片通过一个Convolution Layer ,经过多个Filter的处理,会产生一个Feature Map

  然后可以将产生的看做一个新的图片,其具有64个channels。

   然后可以继续被下一个Convolutional Layer进行处理

 

 

   Neural 共享的参数即是具有相同的Filter,也可以理解为同一个Filter扫过不同的区域。即不同的Receptive Field的Neural可以共享参数,这组不同的参数就称为一个Filter。

Pooling (池化)

  通常在连续的卷积层之间会周期性地插入一个池化层。它的作用是逐渐降低数据体的空间尺寸,这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。

  Subsampling the pixel will not change the object

Pooling的常见方法 Max Pooling

  每一个filter都产生一组数字,要进行Pooling的时候,可以将这一组数字几个几个分为多组,然后在每一组当中选择一个代表。Max Pooling是在每组当中选择最大的一个。

Convolutional Layers + Pooling

The whole CNN

Flatten

Flatten是将矩阵形式拉直成一个向量。

Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。

需要注意的是: CNN is invariant to scaling and rotation. CNN无法处理影像被放大或缩小的问题。

Self-attentation (自注意力机制)

  注意力模型 Attention 的本质思想为:从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略不重要的信息。

  虽然 LSTM 解决了序列长距离依赖问题,但是单词超过 200 的时候就会失效。而 Attention 机制可以更加好的解决序列长距离依赖问题,并且具有并行计算能力

 矩阵转置 矩阵的转置_转置矩阵_caimouse的博客-CSDN博客

   第四节 2021 - 自注意力机制(Self-attention)(上)_哔哩哔哩_bilibili

Sequence Labeling

 对应上图当中的第一种情况,即:Each vector has a label.

运行原理

   原始的序列每一个都经过考虑整个句子的过程,再把每个新生成的考虑了整个句子的序列放入Full connected network。

  同时可以将FC与Self-attention交替使用

   b1到b4都是考虑了整个sequence后才被产生。

  然后需要:Find the relevant vectore in a sequence, 使用数值α表示关联程度

   常见计算α的方法是使用Dot-product:即首先将输入的两个向量分别乘上两个不同的矩阵,然后将得到的向量进行Dot-Product。

矩阵乘法——线性代数基础(3) - 知乎 (zhihu.com)

机器学习常见的乘法(product) - CrescentTing - 博客园 (cnblogs.com)

关联性 attention score α

   通常情况下也会自己和自己计算一个关联性。

  

  逐个计算完成后。还需要进行Soft-max

一文详解Softmax函数 - 知乎 (zhihu.com)

    然后需要:Extract information based on attention scores.

     即计算一个b1

Muti-head Self-attention

 

Positional Encoding

  在进行Self-attentation处理时,如果位置信息较为重要,可以使用Positional Encoding

  Each position has a unique positional vector,如下图,上标i表示不同的位置。

 

   hand-crafted:表明positional vector 是人为设定的。

   A image can also be considered as a vector set

    

Recurrent Neural Network (RNN) 循环神经网络

序列模型

自回归模型

对于见过的数据进行建模,称为自回归模型。自回归模型的核心思想是:过去的观测值包含了对未来观测值的有用信息,因此可以使用已观测的历史数据来进行预测。

马尔可夫模型:

参考

Pytorch循环神经网络(RNN)快速入门与实战_pytorch 循环神经网络_Hello3q3q的博客-CSDN博客

 3.结合例子理解LSTM_哔哩哔哩_bilibili

有隐状态的循环神经网络

参考:8.4. 循环神经网络 — 动手学深度学习 2.0.0 documentation

困惑度

困惑度可以用来衡量语言模型的准确度

梯度裁剪

梯度裁剪可以有效的预防梯度爆炸。

8.5. 循环神经网络的从零开始实现 — 动手学深度学习 2.0.0 documentation

Transformer

  Transformer can input a sequence, and output a sequence, the output lenth is determined by model.

Token

在自然语言处理(NLP)中,“token” 是指文本中的一个基本单位,通常可以是一个单词、一个词组、一个标点符号、一个字符等,取决于文本处理的需求和方法。

将文本划分为若干个 token 是文本处理的第一步,这个过程被称为 “tokenization”。

在机器学习和深度学习中,文本通常需要转换成数字表示才能作为输入传递给算法进行处理。“token” 在这里通常指的是将文本中的每个单词或其他单位转换为对应的数字或向量表示的过程。

在一些文本处理任务中,例如文本分类、情感分析、命名实体识别等,将文本划分为 token 并进行数字表示是必要的预处理步骤。这样可以将文本数据转换为模型能够处理的数值形式,从而进行后续的特征提取、模型训练和预测等操作。

例如,下面的句子 “I love C++!” 可以被划分为以下三个 tokens: “I”, “love”, 和 “C++”。然后,这些 tokens 可以被转换为对应的数字或向量表示,例如使用词嵌入(word embedding)或 one-hot 编码等方法,以便在机器学习或深度学习模型中进行处理。

“Token” 在文本处理中起着重要的作用,它是将文本转换为可处理的数值形式的基本单位,对于构建高效和准确的文本处理模型具有关键性的作用。
参考:【自然语言处理 | NLP】“token“, “embedding“,“encoding“各自的区别分别是什么?_token 机器学习_旅途中的宽~的博客-CSDN博客

词嵌入

One-hot表示

One-hot简称读热向量编码,也是特征工程中最常用的方法。其步骤如下:

构造文本分词后的字典,每个分词是一个比特值,比特值为0或者1。
每个分词的文本表示为该分词的比特位为1,其余位为0的矩阵表示。
例如:John likes to watch movies. Mary likes too

John also likes to watch football games.

以上两句可以构造一个词典,**{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10} **

每个词典索引对应着比特位。那么利用One-hot表示为:

**John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] **

likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] .......等等,以此类推。

One-hot表示文本信息的缺点:

随着语料库的增加,数据特征的维度会越来越大,产生一个维度很高,又很稀疏的矩阵。
这种表示方法的分词顺序和在句子中的顺序是无关的,不能保留词与词之间的关系信息。

Bag of words 

词袋模型(Bag-of-words model),像是句子或是文件这样的文字可以用一个袋子装着这些词的方式表现,这种表现方式不考虑文法以及词的顺序。

文档的向量表示可以直接将各词的词向量表示加和。例如:

John likes to watch movies. Mary likes too

John also likes to watch football games.

以上两句可以构造一个词典,**{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10} **

那么第一句的向量表示为:[1,2,1,1,1,0,0,0,1,1],其中的2表示likes在该句中出现了2次,依次类推。

词袋模型同样有一下缺点:

词向量化后,词与词之间是有大小关系的,不一定词出现的越多,权重越大。
词与词之间是没有顺序关系的

还有TF-IDF

N-gram

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。

每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。
 

参考:关于词嵌入(Word Embedding)的一些总结_寒塘ya的博客-CSDN博客

Word2Vec

Word2Vec 的网络结构其实和神经网络语言模型(NNLM)是基本类似的,只是这个图长得清晰度差了点,看上去不像,其实它们是亲兄弟。不过这里需要指出:尽管网络结构相近,而且都是做语言模型任务,但是他们训练方法不太一样。

Word2Vec 有两种训练方法:

  1. 第一种叫 CBOW,核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词;
  2. 第二种叫做 Skip-gram,和 CBOW 正好反过来,输入某个单词,要求网络预测它的上下文单词。

为什么 Word2Vec 这么处理?原因很简单,因为 Word2Vec 和 NNLM 不一样,NNLM 的主要任务是要学习一个解决语言模型任务的网络结构,语言模型就是要看到上文预测下文,而 Word Embedding只是 NNLM 无心插柳的一个副产品;但是 Word2Vec 目标不一样,它单纯就是要 Word Embedding 的,即为了得到词向量,这是主产品,所以它完全可以随性地这么去训练网络

参考:06 Word2Vec模型(第一个专门做词向量的模型,CBOW和Skip-gram)_哔哩哔哩_bilibili

Word Embedding可以看作一个预训练的过程:

它的使用方法其实和前面讲的 NNLM 是一样的,句子中每个单词以 Onehot 形式作为输入,然后乘上学好的 Word Embedding 矩阵 Q,就直接取出单词对应的 Word Embedding 了。

这乍看上去好像是个查表操作,不像是预训练的做法是吧?其实不然,那个Word Embedding矩阵Q其实就是网络 Onehot 层到 embedding 层映射的网络参数矩阵。

所以你看到了,使用 Word Embedding 等价于什么?等价于把 Onehot 层到 embedding 层的网络用预训练好的参数矩阵 Q 初始化了。这跟前面讲的图像领域的低层预训练过程其实是一样的,区别无非 Word Embedding 只能初始化第一层网络参数,再高层的参数就无能为力了

Position Embedding

为了解决 Attention 丢失的序列顺序信息,Transformer 的提出者提出了 Position Embedding,也就是对于输入 X进行 Attention 计算之前,在 X的词向量中加上位置信息

 

 参考:1401 位置编码公式详细理解补充_哔哩哔哩_bilibili

Encoder_Padding Mask 

  在encoder和decoder两个模块里都有padding mask,位置是在softmax之前,为什么要使用padding mask,是因为由于encoder和decoder两个模块都会有各自相应的输入,但是输入的句子长度是不一样的,计算attention score会出现偏差,为了保证句子的长度一样所以需要进行填充,但是用0填充的位置的信息是完全没有意义的(多余的),经过softmax操作也会有对应的输出,会影响全局概率值,因此我们希望这个位置不参与后期的反向传播过程。以此避免最后影响模型自身的效果,既在训练时将补全的位置给Mask掉,也就是在这些位置上补一些无穷小(负无穷)的值,经过softmax操作,这些值就成了0,就不在影响全局的预测。

参考:简单聊聊transformer里的mask - 知乎

对于Transformer的Mask机制的再思考——Encoder部分_胡小白的数据科学之路的博客-CSDN博客

史上最小白之Transformer详解_Stink1995的博客-CSDN博客

点积型注意力机制

 参考:additive attention与dot-product attention

GPT (Generative Pre-Training)

GPT 是 “Generative Pre-Training” 的简称,从名字看其含义是指的生成式的预训练

GPT也采用两阶段过程:

  1. 第一个阶段:利用语言模型进行预训练;
  2. 第二个阶段:通过 Fine-tuning 的模式解决下游任务。

BERT

  • BERT 的意义在于:从大量无标记数据集中训练得到的深度模型,可以显著提高各项自然语言处理任务的准确率。
  • 近年来优秀预训练语言模型的集大成者:参考了 ELMO 模型的双向编码思想、借鉴了 GPT 用 Transformer 作为特征提取器的思路、采用了 word2vec 所使用的 CBOW 方法
  • BERT 和 GPT 之间的区别:
    • GPT:GPT 使用 Transformer Decoder 作为特征提取器、具有良好的文本生成能力,然而当前词的语义只能由其前序词决定,并且在语义理解上不足
    • BERT:使用了 Transformer Encoder 作为特征提取器,并使用了与其配套的掩码训练方法。虽然使用双向编码让 BERT 不再具有文本生成能力,但是 BERT 的语义信息提取能力更
  • 单向编码和双向编码的差异,以该句话举例 “今天天气很{},我们不得不取消户外运动”,分别从单向编码和双向编码的角度去考虑 {} 中应该填什么词:
    • 单向编码:单向编码只会考虑 “今天天气很”,以人类的经验,大概率会从 “好”、“不错”、“差”、“糟糕” 这几个词中选择,这些词可以被划为截然不同的两类
    • 双向编码:双向编码会同时考虑上下文的信息,即除了会考虑 “今天天气很” 这五个字,还会考虑 “我们不得不取消户外运动” 来帮助模型判断,则大概率会从 “差”、“糟糕” 这一类词中选择

BERT 当中的语言掩码模型(MLM)

 

BERT当中的下句预测(NSP)

其他参考资料: 

吴恩达深度学习课程

卷积神经网络(CNN)详解 (zhihu.com)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值