从线性回归到循环神经网络

参考伯禹学习平台《动手学深度》课程内容内容撰写的学习笔记
原文链接:https://www.boyuai.com/elites/course/cZu18YmweLv10OeV
感谢伯禹平台给我们提供一次免费学习的机会!!

1、线性回归

模型
假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。线性回归假设输出与各个输入之间是线性关系:
从线性回归到循环神经网络
数据集
在机器学习术语里,数据集被称为训练数据集(training data set)或训练集(training set),一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。特征用来表征样本的特点。

损失函数
在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。 它在评估索引为 i 的样本误差的表达式为
从线性回归到循环神经网络
优化函数 - 随机梯度下降
先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)В,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
从线性回归到循环神经网络
学习率: η 代表在每次优化中,能够学习的步长的大小
批量大小: B 是小批量计算中的批量大小batch size

总结一下,优化函数的有以下两个步骤:

(i)初始化模型参数,一般来说使用随机初始化;
(ii)我们在数据上迭代多次,通过在负梯度方向移动参数来更新每个参数。

矢量计算
在模型训练或预测时,我们常常会同时处理多个数据样本并用到矢量计算。在介绍线性回归的矢量计算表达式之前,让我们先考虑对两个向量相加的两种方法。

1.向量相加的一种方法是,将这两个向量按元素逐一做标量加法。
2.向量相加的另一种方法是,将这两个向量直接做矢量加法。

2.Softmax与分类模型

输出问题
直接使用输出层的输出有两个问题:
1.一方面,由于输出层的输出值的范围不确定,难以直观上判断输出值的意义。
2.另一方面,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。
softmax运算符(softmax operator)解决了以上两个问题。
它通过下式将输出值变换成值为正且和为1的概率分布:
从线性回归到循环神经网络
其中
从线性回归到循环神经网络
小批量矢量计算表达式
广义上讲,给定一个小批量样本,其批量大小为 nn ,输入个数(特征数)为 d ,输出个数(类别数)为 q。设批量特征为 X∈Rn×dX∈Rn×d 。假设softmax回归的权重和偏差参数分别为 W∈Rd×q和 b∈R1×q 。softmax回归的矢量计算表达式为
从线性回归到循环神经网络
其中的加法运算使用了广播机制, O,Y∈Rn×q 且这两个矩阵的第 i行分别为样本 i的输出 o(i)和概率分布 y(i)。

交叉熵损失函数
对于样本 i ,我们构造向量 y(i)∈Rq ,使其第 y(i)(样本 i类别的离散数值)个元素为1,其余为0。这样我们的训练目标可以设为使预测概率分布 y^(i)尽可能接近真实的标签概率分布 y(i)。

平方损失估计
从线性回归到循环神经网络
交叉熵(cross entropy)是一个常用的衡量方法:
从线性回归到循环神经网络
假设训练数据集的样本数为 nn,交叉熵损失函数定义为
从线性回归到循环神经网络
其中 Θ代表模型参数。

3.多层感知机

隐藏层
下图展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐藏单元。
从线性回归到循环神经网络
从线性回归到循环神经网络
**函数
上述问题的根源在于全连接层只是对数据做仿射变换(affine transformation),而多个仿射变换的叠加仍然是一个仿射变换。解决问题的一个方法是引入非线性变换,例如对隐藏变量使用按元素运算的非线性函数进行变换,然后再作为下一个全连接层的输入。这个非线性函数被称为**函数(activation function)。

下面我们介绍几个常用的**函数:
ReLU函数
ReLU(rectified linear unit)函数提供了一个很简单的非线性变换。给定元素 x,该函数定义为
从线性回归到循环神经网络
从线性回归到循环神经网络
Sigmoid函数
sigmoid函数可以将元素的值变换到0和1之间:
从线性回归到循环神经网络
从线性回归到循环神经网络
tanh函数
tanh(双曲正切)函数可以将元素的值变换到-1和1之间:
从线性回归到循环神经网络
从线性回归到循环神经网络
关于**函数的选择
ReLu函数是一个通用的**函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。

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

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

在选择**函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他**函数。
多层感知机
多层感知机就是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过**函数进行变换。多层感知机的层数和各隐藏层中隐藏单元个数都是超参数。以单隐藏层为例并沿用本节之前定义的符号,多层感知机按以下方式计算输出:
从线性回归到循环神经网络
其中ϕ表示**函数。

文本预处理

文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤:

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

用现有工具进行分词
有一些现有的工具可以很好地进行分词,我们在这里简单介绍其中的两个:spaCy和NLTK。

语言模型

一段自然语言文本可以看作是一个离散时间序列,给定一个长度为 TT 的词的序列 w1,w2,…,wTw1,w2,…,wT ,语言模型的目标就是评估该序列是否合理,即计算该序列的概率:
从线性回归到循环神经网络

本节我们介绍基于统计的语言模型,主要是 nn 元语法( nn -gram)。
从线性回归到循环神经网络
从线性回归到循环神经网络
思考: nn 元语法可能有哪些缺陷?

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

时序数据的采样
现在我们考虑序列“想要有直升机,想要和你飞到宇宙去”,如果时间步数为5,有以下可能的样本和标签:

X :“想要有直升”, Y:“要有直升机”
X :“要有直升机”, Y :“有直升机,”
X :“有直升机,”, Y :“直升机,想”

X :“要和你飞到”, Y :“和你飞到宇”
X :“和你飞到宇”, Y :“你飞到宇宙”
X :“你飞到宇宙”, Y :“飞到宇宙去”
可以看到,如果序列的长度为 T ,时间步数为 n ,那么一共有T−n 个合法的样本,但是这些样本有大量的重合,我们通常采用更加高效的采样方式。我们有两种方式对时序数据进行采样,分别是
1.随机采样
2.相邻采样。

循环神经网络

我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量 H,用 Ht 表示 H在时间步 t 的值。 Ht的计算基于 Xt 和 Ht−1,可以认为 Ht 记录了到当前字符为止的序列信息,利用 Ht对序列的下一个字符进行预测。
从线性回归到循环神经网络
从线性回归到循环神经网络
裁剪梯度
循环神经网络中较容易出现梯度衰减或梯度爆炸,这会导致网络几乎无法训练。裁剪梯度(clip gradient)是一种应对梯度爆炸的方法。假设我们把所有模型参数的梯度拼接成一个向量 g,并设裁剪的阈值是 θ。裁剪后的梯度
从线性回归到循环神经网络
的 L2范数不超过 θ 。
困惑度
我们通常使用困惑度(perplexity)来评价语言模型的好坏。困惑度是对交叉熵损失函数做指数运算后得到的值。特别地,

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