为了进组开始机器学习

唉,不想练车

线性回归

线性模型

y^=wx+b\hat{y} = \mathbf{w}^\mathbf{\top}\mathbf{x} +b

损失函数

样本ii的预测值为y^(i)\hat{y}^{(i)},其相应的真实标签为y(i)y^{(i)}

l(i)(w,b)=12(y^(i)y(i))2l^{(i)}(\mathbf{w}, b) = \frac{1}{2} \left(\hat{y}^{(i)} - y^{(i)}\right)^2

总误差为

L(w,b)=1ni=1nl(i)(w,b)=1ni=1n12(wx(i)+by(i))2L(\mathbf{w}, b) =\frac{1}{n}\sum_{i=1}^n l^{(i)}(\mathbf{w}, b) =\frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2

训练参数使损失最小

小批量随机梯度下降

(w,b)(w,b)ηBiB(w,b)l(i)(w,b)(\mathbf{w},b) \leftarrow (\mathbf{w},b) - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w},b)} l^{(i)}(\mathbf{w},b)

梯度下降的方向进行

softmax回归

用于分类问题

softmax函数

softmax函数是一个nn维向量向一个nn维向量的映射。

y^=softmax(o) , 其中  yj^=exp(oj)kexp(ok)(0,1]\hat{\mathbf{y}} = \mathbf{softmax}\left(\mathbf{o}\right) \ , \ \text{其中} \; \hat{\mathcal{y}_j}=\frac{\exp(o_j)}{\sum_k\exp(o_k)} \in \left( 0, 1 \right]

函数值满足概率的条件,并且不会改变o\mathbf{o}之间的大小次序,故argmaxjy^j=argmaxjoj\operatorname*{argmax}_j \hat y_j = \operatorname*{argmax}_j o_j

尽管softmax是一个非线性函数,但softmax回归的输出仍然由输入特征的仿射变换决定。 因此,softmax回归是一个线性模型(linear model)。

实现:

1
2
3
4
def softmax(X):
X_exp = torch.exp(X)
partition = X_exp.sum(1, keepdim=True)
return X_exp / partition # 这里应用了广播机制

矢量化模型

O=XW+b,Y^=softmax(O)\mathbf{O} = \mathbf{X}\mathbf{W} + \mathbf{b} ,\\ \hat{\mathbf{Y}} = \mathbf{softmax}\left(\mathbf{O}\right)

数据集中单个样本的标签是一个整数表示类别编号,模型的输出单个样本的预测是一个向量。

最大似然估计

概率和似然

  • 概率(Probability)是在给定模型/分布曲线下,特定横坐标范围的面积
  • 似然(Likelihood)是在给定事件发生的条件下,某一概率分布中该事件发生的概率

给定概率分布DD,一支概率密度函数为fDf_D,分布参数θ\theta,从分布中抽出nn个值的采样X1,X2,,XnX_1, X_2, \dots, X_n,其似然函数为

L(θx1,,xn)=fθ(x1,,xn)\mathbf{L}\left(\theta \mid x_1, \dots, x_n \right) = f_\theta\left(x_1, \dots, x_n\right)

寻找分布参数θ\theta,使似然最大。

softmax模型中

采样为Y\mathbf{Y},分布参数为X\mathbf{X}

L(XY)=P(YX)=i=1nP(y(i)x(i)).L(\mathbf{X} \mid \mathbf{Y}) = P(\mathbf{Y} \mid \mathbf{X}) = \prod_{i=1}^n P(\mathbf{y}^{(i)} \mid \mathbf{x}^{(i)}).

最大化似然,即为最小化负对数似然(自然对数)

logP(YX)=i=1nlogP(y(i)x(i))=i=1nl(y(i),y^(i)),-\log P(\mathbf{Y} \mid \mathbf{X}) = \sum_{i=1}^n -\log P(\mathbf{y}^{(i)} \mid \mathbf{x}^{(i)}) = \sum_{i=1}^n l(\mathbf{y}^{(i)}, \hat{\mathbf{y}}^{(i)}),

单个样本损失函数为

l(y,y^)=j=1qyjlogy^j.l(\mathbf{y}, \hat{\mathbf{y}}) = - \sum_{j=1}^q y_j \log \hat{y}_j.

称为交叉熵损失。显然这个求和符号的作用是取标签正确分类的那一维出来运算。实现:

1
2
3
4
def cross_entropy(y_hat, y):
return - torch.log(y_hat[range(len(y_hat)), y]) ## 用到了一个极其抽象的切片,切片结果是一个一维张量

cross_entropy(y_hat, y)

softmax函数代入得

l(y,y^)=j=1qyjlogexp(oj)k=1qexp(ok)=j=1qyjlogk=1qexp(ok)j=1qyjoj=logk=1qexp(ok)j=1qyjoj.\begin{split}\begin{aligned} l(\mathbf{y}, \hat{\mathbf{y}}) &= - \sum_{j=1}^q y_j \log \frac{\exp(o_j)}{\sum_{k=1}^q \exp(o_k)} \\ &= \sum_{j=1}^q y_j \log \sum_{k=1}^q \exp(o_k) - \sum_{j=1}^q y_j o_j\\ &= \log \sum_{k=1}^q \exp(o_k) - \sum_{j=1}^q y_j o_j. \end{aligned}\end{split}

ojl(y,y^)=exp(oj)k=1qexp(ok)yj=softmax(o)jyj.\partial_{o_j} l(\mathbf{y}, \hat{\mathbf{y}}) = \frac{\exp(o_j)}{\sum_{k=1}^q \exp(o_k)} - y_j = \mathrm{softmax}(\mathbf{o})_j - y_j.

换句话说,导数是我们softmax模型分配的概率与实际发生的情况(由独热标签向量表示)之间的差异。 从这个意义上讲,这与我们在回归中看到的非常相似, 其中梯度是观测值yy和估计值y^\hat{y}之间的差异。 这不是巧合,在任何指数族分布模型中, 对数似然的梯度正是由此得出的。 这使梯度计算在实践中变得容易很多。

熵与交叉熵损失

熵的方程:

H[P]=jP(j)logP(j).H[P] = \sum_j - P(j) \log P(j).

用信息量log1P(j)=logP(j)\log \frac{1}{P(j)} = -\log P(j)来量化“惊异”程度,熵是当分配的概率真正匹配数据生成过程时的信息量的期望非常抽象难以理解

可以把交叉熵想象为“主观概率为QQ的观察者在看到根据概率PP生成的数据时的预期惊异”

可以从两方面来考虑交叉熵分类目标: (i)最大化观测数据的似然;(ii)最小化传达标签所需的惊异。

分类精度

采用每个预测中预测概率最高的类作为硬预测,硬预测与标签分类一致的样本个数与总数之比作为分类精度。

1
2
3
4
5
6
7
8
def accuracy(y_hat, y):  #@save
"""计算预测正确的数量"""
if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
y_hat = y_hat.argmax(axis=1) # axis = 1 是在行中比较,选出最大的列索引,将输出转换为标签一样的格式
cmp = y_hat.type(y.dtype) == y
return float(cmp.type(y.dtype).sum())

accuracy(y_hat, y) / len(y)

softmax与交叉熵实现为精度进行的变化

y^j=exp(ojmax(ok))exp(max(ok))kexp(okmax(ok))exp(max(ok))=exp(ojmax(ok))kexp(okmax(ok)).\begin{split}\begin{aligned} \hat y_j & = \frac{\exp(o_j - \max(o_k))\exp(\max(o_k))}{\sum_k \exp(o_k - \max(o_k))\exp(\max(o_k))} \\ & = \frac{\exp(o_j - \max(o_k))}{\sum_k \exp(o_k - \max(o_k))}. \end{aligned}\end{split}

log(y^j)=log(exp(ojmax(ok))kexp(okmax(ok)))=log(exp(ojmax(ok)))log(kexp(okmax(ok)))=ojmax(ok)log(kexp(okmax(ok))).\begin{split}\begin{aligned} \log{(\hat y_j)} & = \log\left( \frac{\exp(o_j - \max(o_k))}{\sum_k \exp(o_k - \max(o_k))}\right) \\ & = \log{(\exp(o_j - \max(o_k)))}-\log{\left( \sum_k \exp(o_k - \max(o_k)) \right)} \\ & = o_j - \max(o_k) -\log{\left( \sum_k \exp(o_k - \max(o_k)) \right)}. \end{aligned}\end{split}