动手学深度学习笔记

动手学深度学习公益课程笔记

batch 和 epoch的区别:
  1. batch:batch_size是一个超参数,用于定义在更新内部模型参数之前要处理的样本数
    • 批量梯度下降:batch_size = 训练集的大小
    • 随机梯度下降:batch_size = 1
    • 小批量梯度下降: 1 < batch_size < 训练集大小,常用的有32,64,128
  2. epoch是一个超参数,定义了学习算法在整个训练数据集中的工作次数。一个epoch意味着训练数据集中的每个样本都有机会更新内部模型参数。
  3. 也就是说:batch是将simples在空间上进行划分,而epoch是将训练在时间上进行划分

多层感知机

全连接层和**函数

全连接层:只是对数据进行仿射变换,多个仿射变换的叠加任然是仿射变换

非线性变换:引入的非线性函数称为**函数

几个常见的**函数:
  1. ReLU函数:只保留整数元素,将负数元素清零

    定义:ReLU(x) = max(x,0)

    图像:
    动手学深度学习笔记

  2. sigmoid函数:将元素变换到0和1之间
    定义:动手学深度学习笔记
    图像:
    动手学深度学习笔记

  3. tanh函数:将元素变换到-1和1之间,关于原点对称

    定义:动手学深度学习笔记

    图像:
    动手学深度学习笔记

关于**函数的选择:
  1. ReLu函数是一个通用的**函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。
  2. 用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。
  3. 在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。
  4. 在选择**函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他**函数。
关于**函数梯度消失的问题:
  1. 因为模拟人脑的生物神经网络的方法。在2001年有研究表明生物脑的神经元工作具有稀疏性,这样可以节约尽可能多的能量,据研究,只有大约1%-4%的神经元被**参与,绝大多数情况下,神经元是处于抑制状态的,因此ReLu函数反而是更加优秀的近似生物**函数。抑制现象是必须发生的,这样能更好的拟合特征
  2. 关于sigmoid函数表现不好:sigmoid函数中间部分梯度值十分小(最大只有0.25),因此即使数值落在中间部分也没有办法明显**,反而会在中间层中失活
  3. 关于ReLU函数的问题:
    • 在负向部分完全失活,如果选择的超参数不好等情况,可能会出现过多神经元失活,从而整个网络死亡
    • ReLu函数不是zero-centered,即**函数输出的总是非负值,而gradient也是非负值,在back propagat情况下总会得到与输入x相同的结果,同正或者同负,因此收敛会显著受到影响,一些要减小的参数和要增加的参数会受到捆绑限制。
为什么添加激励函数后就能够拟合“几乎”任何一个函数?

将函数分成三类:逻辑函数,分类函数,连续函数(分类的原则是输入输出形式)

  1. 通过一个激励函数可以完成简单的或与非门逻辑,因此通过隐藏层中神经元复合就可以完成任何一个逻辑函数拟合。只需要通过神经网络的拟合将真值表完全表示

  2. 通过之前使用的线性分类器构成的线性边界进行复合便可以得到任意一个分类函数。

  3. 通过积分微元法的思想可以拟合任何一个普通的可积函数

文本预处理

预处理通常包括四个步骤:
  1. 读入文本
  2. 分词
  3. 建立字典,将每个词映射到唯一的索引
  4. 将文本从词的序列转换为索引的序列
常用于分词的几个包:
  1. spacy
  2. nltk

语言模型

时序数据的采样

时序数据的一个样本通常包含连续的字符,在时序数据的训练的时候需要每次读取小批量的样本和标签

时序数据采样的两种方法

注意在时序数据中是引入了时间步这一概念,

  1. 随机采样

    在随机采样中,每个样本是原始序列上任取的一段序列,相邻的两个随机小批量在原始序列上的位置不一定毗邻。重点是按照时间步进行划分,采样的过程是先把整个文本序列按照时间进行分割,每个分割好的部分可以认为是一个样本,然后从这些样本中随机抽取一个batch的数据进行训练
    动手学深度学习笔记

  2. 相邻采样

    在相邻采样中,相邻的两个随机小批量在原始序列上的位置相毗邻。特点是各个batch在训练数据上是连续的
    动手学深度学习笔记