DataWhale 深度学习 第一次打卡

前言

由于受到疫情的影响,寒假期间只能一直呆在家,所幸有机会参加上交和伯禹组织的公益活动,在家学基于pytorch框架的深度学习。也十分感谢伯禹教育和上海交通大学提供的机会。

第一次打卡学习笔记

1.线性回归
2.softmax与分类模型
3.多层感知机
4.文本预处理
5.语言模型
6.循环神经网络基础

1.线性回归

1.1.1.通用公式:
f(x) = w1x1+ w2x2+…+ wn*xn
举个例子:为了简单起见,这里我们假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。
在这里插入图片描述
为了让模型预测值与真实值更加接近,所以我们需要定义损失函数。一个常用的选择是平方函数。
在这里插入图片描述
对于优化函数,我们采用SGD(随机梯度下降),而在深度学习中,小批量的随机梯度下降更加常见。

1.1.2.小批量随机梯度下降(mini-batch stochastic gradient descent): 先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。

1.1.3.参数更新公式:
在这里插入图片描述
其中Beta为batch_size的大小

1.2.采用pytorch的简单实现:

1.2.1.将数据放入数据加载器DataLoader中
在这里插入图片描述
1.2.2.定义模型,将各模块放入一个有序的容器Sequential中(这里有3种方法)

在这里插入图片描述
1.2.3.初始化模型参数
在这里插入图片描述
1.2.4.定义损失函数

loss = nn.MSELoss()

1.2.5.定义优化函数
在这里插入图片描述
1.2.6.训练
是多少

2.softmax与分类模型
2.1.简述下softmax:
大的越来越大,小的越来越小
在这里插入图片描述
相比较于sigmoid函数,sigmoid 函数可以将 input 压缩到 [0,1] 的范围,但是对于分类问题来说,我们不仅要求概率范围是[0,1],还要求所有的概率和为 1,即 ∑pi=1,Softmax 常与 crossentropy(交叉熵)搭配连用。

2.2.那损失函数为什么不用平方估计MSE呢?

因为想要预测分类结果正确,我们其实并不需要预测概率完全等于标签概率,只需要实际类别的那个输出值大于其他的就行了,所以我们应该使用更适合衡量两个概率分布差异的测量函数。其中,交叉熵(cross entropy)是一个常用的衡量方法:
在这里插入图片描述
假设训练数据集的样本数为,交叉熵损失函数定义为
在这里插入图片描述
即最后最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。

2.3.softmax回归:
在这里插入图片描述
在这里插入图片描述
如果我们不采用softmax,而直接使用输出层的输出有两个问题:
一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例子中的输出值10表示“很置信”图像类别为猫,因为该输出值是其他两类的输出值的100倍。但如果,那么输出值10却又表示图像类别为猫的概率很低。
另一方面,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。
所以softmax对于分类问题来讲很重要。
3.多层感知机
在这里插入图片描述
提到多层感知机,那激活函数就不得不说了。

3.1.没有激活函数的作用下的计算

在这里插入图片描述
联立起来为
在这里插入图片描述
可以从中看出问题,虽然神经网络引入了隐藏层,却依然等价于一个单层神经网络:其中输出层权重参数为,偏差参数为。不难发现,即便再添加更多的隐藏层,以上设计依然只能与仅含输出层的单层神经网络等价。
问题的根源在于全连接层只是对数据做仿射变换(affine transformation),而多个仿射变换的叠加仍然是一个仿射变换。解决问题的一个方法是引入非线性变换,这时候激活函数的作用就来了。

3.2.这里介绍几种激活函数:

3.2.1.Relu函数(在以后的卷积神经网络中时常用到)
在这里插入图片描述
相较于sigmoid和tanh,Relu的主要优势是计算效率高且不会出现梯度消失问题。在这里插入图片描述
3.2.2.sigmoid函数(常用于而分类中)
在这里插入图片描述
在这里插入图片描述
sigmoid函数的导数很有意思,如下:
在这里插入图片描述
3.2.3.tanh函数(常用于RNN中)
在这里插入图片描述
在这里插入图片描述
它的导数也很独特:
在这里插入图片描述
3.3.关于激活函数的选择:

3.3.1.ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。

3.3.2.用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。

3.3.3.在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。

3.3.4.在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。

4.文本预处理

什么是文本呢?简单来讲文本就是一类序列数据,一篇文章可以看作是字符或单词的序列。

4.1.文本预处理通常包括四个步骤:

4.1.1.读入文本
4.1.2.分词
4.1.3.建立字典,将每个词映射到一个唯一的索引(index)
4.1.4.将文本从词的序列转换为索引的序列,方便输入模型

4.2. 文本预处理详细流程图如下

在这里插入图片描述
4.2.1.文本获取
获取第三方提供的语料库,但有时开放的语料库无法满足我们的需求,这是需要我们自己在网上爬取。

4.2.2.分词
对于英文来讲,分词比较容易,可以直接使用空格,而对于语法复杂的汉语,我们一般采用第三方库实现,比如jieba。
如果我们需要处理某些垂直领域的文本,例如医疗等领域,我们可能需要更垂直的词库。这时候,我们可以考虑第三方词库。

4.2.3.文本清洗

大多数情况下,我们准备好的文本里都有很多无用的部分或者含有许多不需要用的标点符号、停用词等,我们需要分步骤去清洗。
例如:去除标点符号,大小写的转换,数字归一化,删除文本中的停用词和低频词,去除不必要的标签。

4.2.4.标准化

最常见的是词形还原(Lemmatization)和词干提取(Stemming)

区别:
1.在原理上,词干提取主要是采用“缩减”的方法,将词转换为词干,如将“dogs”处理为“dog,将“effective”处理为“effect”。而词形还原主要采用“转变”的方法,将词转变为其原形,如将“drove”处理为“drive”,将“giving”处理为“give”。
2.在难易程度上,词干提取方法相对简单,词形还原则需要返回词的原形,需要对词形进行分析,不仅要进行词缀的转化,还要进行词性识别,区分相同词形但原形不同的词的差别。
3.词干提取的结果可能并不是完整的、具有意义的词,而只是词的一部分,而经词形还原处理后获得的结果是完整的词。

4.2.5.特征提取

TF-IDF算法
以特征词在文档d中出现的次数与包含该特征词的文档数之比作为该词的权重。

TF(term frequency)词频统计
在这里插入图片描述
IDF(inverse document frequency)逆文本频度:一个单词出现的文本频数越小,它区别不同类别文本的能力就越大
在这里插入图片描述
TF和IDF的乘积作为特征空间坐标系的取值测度。使用IDF作为权重乘以TF,实现对单词权重的调整,调整权值的目的在于突出重要单词,抑制次要单词 。在这里插入图片描述

当然还可以将文本本身的属性作为特征。比如每一行text中每个单词长度的平均值,每一行的停用词有多少…。

5.语言模型

5.1.语言模型:本质上是在回答一个问题:出现的语句是否合理。

给定一个长度为T的词的序列w1,w2…wT,语言模型的目标就是评估该序列是否合理,即计算该序列的概率:
在这里插入图片描述
假设序列w1,w2…wT中的每个词是依次生成的,我们有
在这里插入图片描述

5.2.语言模型的参数

参数就是词的概率以及给定前几个词情况下的条件概率。设训练数据集为一个大型文本语料库,如维基百科的所有条目,词的概率可以通过该词在训练数据集中的相对词频来计算,例如,w1的概率可以计算为:
在这里插入图片描述
其中n(w1)为语料库中以作为第一个词的文本的数量,n为语料库中文本的总数量。

5.3.n元语法

n元语法是基于n-1阶马尔可夫链的概率语言模型,通过马尔可夫假设简化模型,马尔科夫假设是指一个词的出现只与前面n个词相关,即n阶马尔可夫链。

基于n-1阶马尔可夫链,我们可以将语言模型改写为
在这里插入图片描述
当分别为1、2和3时,我们将其分别称作一元语法(unigram)、二元语法(bigram)和三元语法(trigram)。例如,长度为4的序列在一元语法、二元语法和三元语法中的概率分别为
在这里插入图片描述
但它有很大的局限性,当n较小时,n元语法往往并不准确。例如,在一元语法中,由三个词组成的句子“你走先”和“你先走”的概率是一样的。然而,当n较大时,n元语法需要计算并存储大量的词频和多词相邻频率。

1.参数空间过大
2.数据稀疏

5.4.时序数据的采样

时序文本数据的一个样本通常包含连续的字符。假设时间步数为5,样本序列为5个字符,即“想”“要”“有”“直”“升”。该样本的标签序列为这些字符分别在训练集中的下一个字符,即“要”“有”“直”“升”“机”,即X=“想要有直升”,Y=“要有直升机”。

现在我们考虑序列“想要有直升机,想要和你飞到宇宙去”,如果时间步数为5,有以下可能的样本和标签:
在这里插入图片描述
可以看到,如果序列的长度为T,时间步数为n,那么一共有T-n个合法的样本,但是这些样本有大量的重合,我们需要采用更加高效的采样方式。

5.4.1.随机采样
在随机采样中,每个样本是原始序列上任意截取的一段序列,相邻的两个随机小批量在原始序列上的位置不一定相毗邻。
比如我们将从0到29的连续整数作为一个人工序列,设批量大小和时间步数分别为2和6,那采样的结果如下
在这里插入图片描述

5.4.2.相邻采样
在相邻采样中,相邻的两个随机小批量在原始序列上的位置相毗邻。
如上个例子中,采样的结果如下:
在这里插入图片描述

6.循环神经网络基础

下面介绍下循环神经网络(RNN):
它并非刚性地记忆所有固定长度的序列,而是通过隐藏状态来存储之前时间步的信息。

6.1. 不含隐藏状态的神经网络
让我们考虑一个含单隐藏层的多层感知机。给定样本数为 n 、输入个数(特征数或特征向量维度)为 d 的小批量数据样本 X∈Rn×d 。设隐藏层的激活函数为 ϕ ,那么隐藏层的输出 H∈Rn×h 计算为

H=ϕ(XWxh+bh),

其中隐藏层权重参数 Wxh∈Rd×h ,隐藏层偏差参数 bh∈R1×h , h 为隐藏单元个数。上式相加的两项形状不同,因此将按照广播机制相加,输出层的输出为

O=HWhq+bq,

其中输出变量 O∈Rn×q , 输出层权重参数 Whq∈Rh×q , 输出层偏差参数 bq∈R1×q 。如果是分类问题,我们可以使用 softmax(O) 来计算输出类别的概率分布。

6.2. 含隐藏状态的循环神经网络

现在我们考虑输入数据存在时间相关性的情况。假设 Xt∈Rn×d 是序列中时间步 t 的小批量输入, Ht∈Rn×h 是该时间步的隐藏变量。与多层感知机不同的是,这里我们保存上一时间步的隐藏变量 Ht−1 ,并引入一个新的权重参数 Whh∈Rh×h ,该参数用来描述在当前时间步如何使用上一时间步的隐藏变量。具体来说,时间步 t 的隐藏变量的计算由当前时间步的输入和上一时间步的隐藏变量共同决定:

Ht=ϕ(XtWxh+Ht−1Whh+bh).

与多层感知机相比,我们在这里添加了 Ht−1Whh 一项。由上式中相邻时间步的隐藏变量 Ht 和 Ht−1 之间的关系可知,这里的隐藏变量能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。因此,该隐藏变量也称为隐藏状态。由于隐藏状态在当前时间步的定义使用了上一时间步的隐藏状态,上式的计算是循环的。使用循环计算的网络即循环神经网络(recurrent neural network)。

循环神经网络有很多种不同的构造方法。含上式所定义的隐藏状态的循环神经网络是极为常见的一种。若无特别说明,本章中的循环神经网络均基于上式中隐藏状态的循环计算。在时间步 t ,输出层的输出和多层感知机中的计算类似:

Ot=HtWhq+bq.

循环神经网络的参数包括隐藏层的权重 Wxh∈Rd×h 、 Whh∈Rh×h 和偏差 bh∈R1×h ,以及输出层的权重 Whq∈Rh×q 和偏差 bq∈R1×q 。值得一提的是,即便在不同时间步,循环神经网络也始终使用这些模型参数。因此,循环神经网络模型参数的数量不随时间步的增加而增长。

在这里插入图片描述

上图展示了循环神经网络在3个相邻时间步的计算逻辑。在时间步 t ,隐藏状态的计算可以看成是将输入 Xt 和前一时间步隐藏状态 Ht−1 连结后输入一个激活函数为 ϕ 的全连接层。该全连接层的输出就是当前时间步的隐藏状态 Ht ,且模型参数为 Wxh 与 Whh 的连结,偏差为 bh 。当前时间步 t 的隐藏状态 Ht 将参与下一个时间步 t+1 的隐藏状态 Ht+1 的计算,并输入到当前时间步的全连接输出层。

6.3.基于RNN的语言模型
在这里插入图片描述
设小批量中样本数为1,文本序列为“想”“要”“有”“直”“升”“机”。上图演示了如何使用循环神经网络基于当前和过去的字符来预测下一个字符。在训练时,我们对每个时间步的输出层输出使用softmax运算,然后使用交叉熵损失函数来计算它与标签的误差。由于隐藏层中隐藏状态的循环计算,时间步3的输出 O3 取决于文本序列“想”“要”“有”。 由于训练数据中该序列的下一个词为“直”,时间步3的损失将取决于该时间步基于序列“想”“要”“有”生成下一个词的概率分布与该时间步的标签“直”。因为每个输入词是一个字符,因此这个模型被称为字符级循环神经网络(character-level recurrent neural network)。因为不同字符的个数远小于不同词的个数(对于英文尤其如此),所以字符级循环神经网络的计算通常更加简单。

6.4.裁剪梯度
裁剪梯度(clip gradient)是一种应对梯度爆炸的方法。
那什么是梯度爆炸呢?
简单点来讲,在神经网络训练中,都是采用反向传播,在采用链式法则求梯度时,如果网络过深,其中大多数乘积因子大于1,这会导致最后所求梯度趋于无穷的情况。
显而易见,当大多数乘积因子小于1,接近0,最后会导致所求梯度趋于0,这就是梯度消失。

我们把所有模型参数的梯度拼接成一个向量 g,并设裁剪的阈值是theta。裁剪后的梯度
在这里插入图片描述
的L2范数不超过theta。

6.5.困惑度
我们通常使用困惑度(perplexity)来评价语言模型的好坏。困惑度是对交叉熵损失函数做指数运算后得到的值。特别地,

最佳情况下,模型总是把标签类别的概率预测为1,此时困惑度为1;
最坏情况下,模型总是把标签类别的概率预测为0,此时困惑度为正无穷;
基线情况下,模型总是预测所有类别的概率都相同,此时困惑度为类别个数。
显然,任何一个有效模型的困惑度必须小于类别个数。

总结

后面有时间会更加详细系统的介绍上面的内容。

希望自己在寒假的这段期间,能够更加系统的学习深度学习的知识,并且能够掌握基于pytorh的简洁实现,当然在此期间认识大佬就更加好了。希望大家一起加油!

如有不对的地方,还请多多指教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值