《动手学深度学习》第一次打卡

线性回归

基本要素

模型定义

线性回归适用于回归问题,输出是一个连续值。以一个简单的房屋价格预测为例子,我们假设价格yy(元)只取决于房屋状况的两个因素,即面积x1x_1(平方米)和房龄x2x_2(年)。建立基于输入x1x_1x2x_2来计算输出yy的表达式,也就是模型(model),线性回归假设输出与各个输入之间是线性关系:
y^=x1w1+x2w2+b \hat{y}=x_1w_1+x_2w_2+b
其中w1w_1w2w_2是权重(weight),bb是偏差(bias),它们是线性回归模型的参数(parameter),模型输出y^\hat{y}是线性回归对真实价格yy的预测或估计。

模型训练

接下来需要进行模型训练(model training):通过数据来寻找特定的模型参数值,使模型在数据上的误差尽可能小。模型训练涉及3个要素:

训练数据

通常是真实收集的一系列数据,在机器学习术语中被称为训练数据集(training data set)或训练集(training set),如例子的一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature),特征用来表征样本的特点。假设采集的样本数为nn,索引为ii的样本的特征为x1(i)x_1^{(i)}x2(i)x_2^{(i)},标签为y(i)y^{(i)},其线性回归模型的房屋价格预测表达式为:
y^(i)=x1(i)w1+x2(i)w2+b \hat{y}^{(i)}=x_1^{(i)}w_1+x_2^{(i)}w_2+b

损失函数

将衡量误差的函数称为损失函数(loss function),这里使用平方误差函数(也称为平方损失square loss),对于索引为ii的样本,其误差表达式为:
(i)(w1,w2,b)=12(y^(i)y(i))2 \ell^{(i)}(w_1,w_2,b)=\frac{1}{2}(\hat{y}^{(i)}-y^{(i)})^2
通常用训练数据集中所有样本误差的平均来衡量模型预测的质量,即:
(w1,w2,b)=1ni=1n(i)(w1,w2,b)=1ni=1n12(x1(i)w1+x2(i)w2+by(i))2 \ell(w_1, w_2, b) =\frac{1}{n} \sum_{i=1}^n \ell^{(i)}(w_1, w_2, b) =\frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right)^2
在模型训练中,希望能找到一组模型参数,记为w1,w2,bw_1^*, w_2^*, b^*,使训练样本平均损失最小:
w1,w2,b=argminw1,w2,b(w1,w2,b) w_1^, w_2^, b^* = \underset{w_1, w_2, b}{\arg\min} \ell(w_1, w_2, b)

优化算法

若模型和损失函数形式较为简单,上面的误差最小问题可以有解析解(analytical solution),线性回归和平方误差就属于这类问题。而大多数深度学习模型只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值,称为数值解(numerical solution)。

小批量随机梯度下降(mini-batch stochastic gradient descent)是一种常用的求解数值解的优化算法。它在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)B\mathcal{B},然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。

在线性回归模型中,每个参数将作如下迭代:
w1w1ηBiB(i)(w1,w2,b)w1=w1ηBiBx1(i)(x1(i)w1+x2(i)w2+by(i))w2w2ηBiB(i)(w1,w2,b)w2=w2ηBiBx2(i)(x1(i)w1+x2(i)w2+by(i))bbηBiB(i)(w1,w2,b)b=bηBiB(x1(i)w1+x2(i)w2+by(i)). \begin{aligned} w_1 &\leftarrow w_1 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_1} = w_1 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_1^{(i)} \left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right) \\ w_2 &\leftarrow w_2 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_2} = w_2 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_2^{(i)} \left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right)\\b &\leftarrow b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial b} = b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}\left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right). \end{aligned}
式中:B|\mathcal{B}| 代表每个小批量中的样本个数(批量大小,batch size);

η\eta 称作学习率(learning rate)并取正数。

矢量计算表达式

如果我们对训练数据集里的3个房屋样本(索引分别为1、2和3)逐一预测价格,将得:
y^(1)=x1(1)w1+x2(1)w2+by^(2)=x1(2)w1+x2(2)w2+by^(3)=x1(3)w1+x2(3)w2+b. \begin{aligned} \hat{y}^{(1)} &= x_1^{(1)} w_1 + x_2^{(1)} w_2 + b\\ \hat{y}^{(2)} &= x_1^{(2)} w_1 + x_2^{(2)} w_2 + b\\ \hat{y}^{(3)} &= x_1^{(3)} w_1 + x_2^{(3)} w_2 + b. \end{aligned}
将上面3个等式转化成矢量计算,设

y^=[y^(1)y^(2)y^(3)],X=[x1(1)x2(1)x1(2)x2(2)x1(3)x2(3)],w=[w1w2] \boldsymbol{\hat{y}} = \begin{bmatrix} \hat{y}^{(1)} \\ \hat{y}^{(2)} \\ \hat{y}^{(3)} \end{bmatrix},\quad \boldsymbol{X} = \begin{bmatrix} x_1^{(1)} & x_2^{(1)} \\ x_1^{(2)} & x_2^{(2)} \\ x_1^{(3)} & x_2^{(3)} \end{bmatrix},\quad \boldsymbol{w} = \begin{bmatrix} w_1 \\ w_2 \end{bmatrix}
那么对3个房屋样本预测价格的矢量计算表达式为y^=Xw+b\boldsymbol{\hat{y}} = \boldsymbol{X} \boldsymbol{w} + b

一般地,当数据样本数为 nn,特征数为 dd 时,线性回归的矢量计算表达式为:
y^=Xw+b \boldsymbol{\hat{y}} = \boldsymbol{X} \boldsymbol{w} + b
其中模型输出 y^Rn×1\boldsymbol{\hat{y}} \in \mathbb{R}^{n \times 1} 批量数据样本特征 XRn×d\boldsymbol{X} \in \mathbb{R}^{n \times d},权重 wRd×1\boldsymbol{w} \in \mathbb{R}^{d \times 1}, 偏差 bRb \in \mathbb{R}

相应地,批量数据样本标签 yRn×1\boldsymbol{y} \in \mathbb{R}^{n \times 1},设模型参数 θ=[w1,w2,b]\boldsymbol{\theta} = [w_1, w_2, b]^\top,损失函数可以表示为:
(θ)=12n(y^y)(y^y) \ell(\boldsymbol{\theta})=\frac{1}{2n}(\boldsymbol{\hat{y}}-\boldsymbol{y})^\top(\boldsymbol{\hat{y}}-\boldsymbol{y})
小批量随机梯度下降的迭代步骤为:
θθηBiBθ(i)(θ) \boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \nabla_{\boldsymbol{\theta}} \ell^{(i)}(\boldsymbol{\theta})
其中梯度是损失有关3个为标量的模型参数的偏导数组成的向量:
θ(i)(θ)=[(i)(w1,w2,b)w1(i)(w1,w2,b)w2(i)(w1,w2,b)b]=[x1(i)(x1(i)w1+x2(i)w2+by(i))x2(i)(x1(i)w1+x2(i)w2+by(i))x1(i)w1+x2(i)w2+by(i)]=[x1(i)x2(i)1](y^(i)y(i)) \nabla_{\boldsymbol{\theta}} \ell^{(i)}(\boldsymbol{\theta})= \begin{bmatrix} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_1} \\ \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_2} \\ \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial b} \end{bmatrix} = \begin{bmatrix} x_1^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) \\ x_2^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) \\ x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)} \end{bmatrix}= \begin{bmatrix} x_1^{(i)} \\ x_2^{(i)} \\ 1 \end{bmatrix} (\hat{y}^{(i)} - y^{(i)})

softmax回归

对于离散值预测问题,可以采用如softmax回归在内的分类模型,softmax回归的输出单元从一个变成多个,且引入softmax运算使输出更适合离散值的预测和训练。

分类问题

考虑一个简单的图像分类问题,其输入图像的高和宽均为2像素,且色彩为灰度。这样每个像素值都可以用一个标量表示。我们将图像中的4像素分别记为x1,x2,x3,x4x_1, x_2, x_3, x_4。假设训练数据集中图像的真实标签为狗、猫或鸡(假设可以用4像素表示出这3种动物),这些标签分别对应离散值y1,y2,y3y_1, y_2, y_3。通常使用离散的数值来表示类别,例如y1=1,y2=2,y3=3y_1=1, y_2=2, y_3=3。如此,一张图像的标签为1、2和3这3个数值中的一个。

softmax回归模型

softmax回归将输入特征与权重做线性叠加,输出值个数等于标签里的类别数。因为一共有4种特征和3种输出动物类别,所以权重包含12个标量(带下标的ww)、偏差包含3个标量(带下标的bb),且对每个输入计算o1,o2,o3o_1, o_2, o_3这3个输出:
o1=x1w11+x2w21+x3w31+x4w41+b1,o2=x1w12+x2w22+x3w32+x4w42+b2,o3=x1w13+x2w23+x3w33+x4w43+b3. \begin{aligned} o_1 &= x_1 w_{11} + x_2 w_{21} + x_3 w_{31} + x_4 w_{41} + b_1,\\ o_2 &= x_1 w_{12} + x_2 w_{22} + x_3 w_{32} + x_4 w_{42} + b_2,\\o_3 &= x_1 w_{13} + x_2 w_{23} + x_3 w_{33} + x_4 w_{43} + b_3. \end{aligned}
softmax运算符(softmax operator)通过下式将输出值变换成值为正且和为1的概率分布:

y^1,y^2,y^3=softmax(o1,o2,o3) \hat{y}_1, \hat{y}_2, \hat{y}_3 = \text{softmax}(o_1, o_2, o_3)
其中:
y^1=exp(o1)i=13exp(oi),y^2=exp(o2)i=13exp(oi),y^3=exp(o3)i=13exp(oi) \hat{y}1 = \frac{ \exp(o_1)}{\sum{i=1}^3 \exp(o_i)},\quad \hat{y}2 = \frac{ \exp(o_2)}{\sum{i=1}^3 \exp(o_i)},\quad \hat{y}3 = \frac{ \exp(o_3)}{\sum{i=1}^3 \exp(o_i)}
则有:y^1+y^2+y^3=1\hat{y}_1 + \hat{y}_2 + \hat{y}_3 = 10y^1,y^2,y^310 \leq \hat{y}_1, \hat{y}_2, \hat{y}_3 \leq 1

因为argmaxioi=argmaxiy^i \underset{i}{\arg\max} o_i = \underset{i}{\arg\max} \hat{y}_i ,所以softmax运算不改变预测类别输出。

单样本分类的矢量计算表达式

为了提高计算效率可以将单样本分类通过矢量计算来表达。在上面的图像分类问题中,假设softmax回归的权重和偏差参数分别为:
W=[w11w12w13w21w22w23w31w32w33w41w42w43],b=[b1b2b3] \boldsymbol{W} = \begin{bmatrix} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \\ w_{31} & w_{32} & w_{33} \\ w_{41} & w_{42} & w_{43} \end{bmatrix},\quad \boldsymbol{b} = \begin{bmatrix} b_1 & b_2 & b_3 \end{bmatrix}
设高和宽分别为2个像素的图像样本ii的特征为:
x(i)=[x1(i)x2(i)x3(i)x4(i)] \boldsymbol{x}^{(i)} = \begin{bmatrix}x_1^{(i)} & x_2^{(i)} & x_3^{(i)} & x_4^{(i)}\end{bmatrix}
输出层的输出为:
o(i)=[o1(i)o2(i)o3(i)] \boldsymbol{o}^{(i)} = \begin{bmatrix}o_1^{(i)} & o_2^{(i)} & o_3^{(i)}\end{bmatrix}
预测为狗、猫或鸡的概率分布为:
y^(i)=[y^1(i)y^2(i)y^3(i)] \boldsymbol{\hat{y}}^{(i)} = \begin{bmatrix}\hat{y}_1^{(i)} & \hat{y}_2^{(i)} & \hat{y}_3^{(i)}\end{bmatrix}
softmax回归对样本ii分类的矢量计算表达式为:
o(i)=x(i)W+b, y^(i)=softmax(o(i)) \begin{aligned} \boldsymbol{o}^{(i)} &= \boldsymbol{x}^{(i)} \boldsymbol{W} + \boldsymbol{b},\ \boldsymbol{\hat{y}}^{(i)} &= \text{softmax}(\boldsymbol{o}^{(i)})\end{aligned}

小批量样本分类的矢量计算表达式

为了进一步提升计算效率通常对小批量数据做矢量计算。给定一个小批量样本,其批量大小为nn,输入个数(特征数)为dd,输出个数(类别数)为qq。设批量特征为XRn×d\boldsymbol{X} \in \mathbb{R}^{n \times d}。假设softmax回归的权重和偏差参数分别为WRd×q\boldsymbol{W} \in \mathbb{R}^{d \times q}bR1×q\boldsymbol{b} \in \mathbb{R}^{1 \times q}。softmax回归的矢量计算表达式为:
O=XW+b,Y^=softmax(O), \begin{aligned} \boldsymbol{O} &= \boldsymbol{X} \boldsymbol{W} + \boldsymbol{b},\\ \boldsymbol{\hat{Y}} &= \text{softmax}(\boldsymbol{O}), \end{aligned}

交叉熵损失函数

想要预测分类结果正确,我们其实并不需要预测概率完全等于标签概率,此时平方损失就显得过于严格。交叉熵损失函数则是一种更适合衡量两个概率分布差异的测量函数。交叉熵只关心对正确类别的预测概率,因为只要其值足够大,就可以确保分类结果正确。
H(y(i),y^(i))=j=1qyj(i)logy^j(i)=logy^y(i)(i) H\left(\boldsymbol y^{(i)}, \boldsymbol {\hat y}^{(i)}\right ) = -\sum_{j=1}^q y_j^{(i)} \log \hat y_j^{(i)}=-\log \hat y_{y^{(i)}}^{(i)}
假设训练数据集的样本数为nn,交叉熵损失函数定义为:
(Θ)=1ni=1nH(y(i),y^(i))=(1/n)i=1nlogy^y(i)(i) \ell(\boldsymbol{\Theta}) = \frac{1}{n} \sum_{i=1}^n H\left(\boldsymbol y^{(i)}, \boldsymbol {\hat y}^{(i)}\right )= -(1/n) \sum_{i=1}^n \log \hat y_{y^{(i)}}^{(i)}
因此最小化(Θ)\ell(\boldsymbol{\Theta})等价于最大化exp(n(Θ))=i=1ny^y(i)(i)\exp(-n\ell(\boldsymbol{\Theta}))=\prod_{i=1}^n \hat y_{y^{(i)}}^{(i)},即最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。

多层感知机

前两节介绍的线性回归和softmax回归属于单层神经网络,本节以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络。

隐藏层

多层感知机在单层神经网络基础上引入了一到多个隐藏层(hidden layer),隐藏层有若干个隐藏单元(hidden unit),隐藏层位于输入层和输出层之间,多层感知机中的隐藏层和输出层都是全连接层

《动手学深度学习》第一次打卡

全连接层只是对数据做仿射变换(affine transformation),而多个仿射变换的叠加仍然是一个仿射变换,因此即使添加再多的隐藏层,以上设计只能与仅含输出层的单层神经网络等价。解决问题的一个方法是引入非线性变换,例如对隐藏变量使用按元素运算的非线性函数进行变换,然后再作为下一个全连接层的输入。这个非线性函数被称为**函数(activation function)。

**函数

ReLU函数

ReLU(rectified linear unit)函数只保留正数元素,并将负数元素清零。给定元素xx,该函数定义为:
ReLU(x)=max(x,0) \text{ReLU}(x) = \max(x, 0)

sigmoid函数

sigmoid函数可以将元素的值变换到0和1之间,当输入接近0时,sigmoid函数接近线性变换。
sigmoid(x)=11+exp(x) \text{sigmoid}(x) = \frac{1}{1 + \exp(-x)}

tanh函数

tanh(双曲正切)函数可以将元素的值变换到-1和1之间,当输入接近0时,tanh函数接近线性变换;形状和sigmoid函数的形状很像,但tanh函数在坐标系的原点上对称。
tanh(x)=1exp(2x)1+exp(2x) \text{tanh}(x) = \frac{1 - \exp(-2x)}{1 + \exp(-2x)}
多层感知机就是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过**函数进行变换。多层感知机的层数和各隐藏层中隐藏单元个数都是超参数。以单隐藏层为例并沿用本节之前定义的符号,多层感知机按以下方式计算输出:

H=ϕ(XWh+bh),O=HWo+bo, \begin{aligned} \boldsymbol{H} &= \phi(\boldsymbol{X} \boldsymbol{W}_h + \boldsymbol{b}_h),\\\boldsymbol{O} &= \boldsymbol{H} \boldsymbol{W}_o + \boldsymbol{b}_o, \end{aligned}
其中ϕ\phi表示**函数。

—————————————————————————————————————————————————
参考:《动手学深度学习》(Pytorch版)