为了进组开始机器学习
唉,不想练车
线性回归
线性模型
y^=w⊤x+b
损失函数
样本i的预测值为y^(i),其相应的真实标签为y(i)
l(i)(w,b)=21(y^(i)−y(i))2
总误差为
L(w,b)=n1i=1∑nl(i)(w,b)=n1i=1∑n21(w⊤x(i)+b−y(i))2
训练参数使损失最小
小批量随机梯度下降
(w,b)←(w,b)−∣B∣ηi∈B∑∂(w,b)l(i)(w,b)
梯度下降的方向进行
softmax回归
用于分类问题
softmax
函数
softmax
函数是一个n维向量向一个n维向量的映射。
y^=softmax(o) , 其中yj^=∑kexp(ok)exp(oj)∈(0,1]
函数值满足概率的条件,并且不会改变o之间的大小次序,故argmaxjy^j=argmaxjoj
尽管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)
数据集中单个样本的标签是一个整数表示类别编号,模型的输出单个样本的预测是一个向量。
最大似然估计
概率和似然
- 概率(Probability)是在给定模型/分布曲线下,特定横坐标范围的面积
- 似然(Likelihood)是在给定事件发生的条件下,某一概率分布中该事件发生的概率
给定概率分布D,一支概率密度函数为fD,分布参数θ,从分布中抽出n个值的采样X1,X2,…,Xn,其似然函数为
L(θ∣x1,…,xn)=fθ(x1,…,xn)
寻找分布参数θ,使似然最大。
softmax
模型中
采样为Y,分布参数为X
L(X∣Y)=P(Y∣X)=i=1∏nP(y(i)∣x(i)).
最大化似然,即为最小化负对数似然(自然对数)
−logP(Y∣X)=i=1∑n−logP(y(i)∣x(i))=i=1∑nl(y(i),y^(i)),
单个样本损失函数为
l(y,y^)=−j=1∑qyjlogy^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=1∑qyjlog∑k=1qexp(ok)exp(oj)=j=1∑qyjlogk=1∑qexp(ok)−j=1∑qyjoj=logk=1∑qexp(ok)−j=1∑qyjoj.
∂ojl(y,y^)=∑k=1qexp(ok)exp(oj)−yj=softmax(o)j−yj.
换句话说,导数是我们softmax
模型分配的概率与实际发生的情况(由独热标签向量表示)之间的差异。 从这个意义上讲,这与我们在回归中看到的非常相似, 其中梯度是观测值y和估计值y^之间的差异。 这不是巧合,在任何指数族分布模型中, 对数似然的梯度正是由此得出的。 这使梯度计算在实践中变得容易很多。
熵与交叉熵损失
熵的方程:
H[P]=j∑−P(j)logP(j).
用信息量logP(j)1=−logP(j)来量化“惊异”程度,熵是当分配的概率真正匹配数据生成过程时的信息量的期望。非常抽象难以理解
可以把交叉熵想象为“主观概率为Q的观察者在看到根据概率P生成的数据时的预期惊异”
可以从两方面来考虑交叉熵分类目标: (i)最大化观测数据的似然;(ii)最小化传达标签所需的惊异。
分类精度
采用每个预测中预测概率最高的类作为硬预测,硬预测与标签分类一致的样本个数与总数之比作为分类精度。
1 2 3 4 5 6 7 8
| def accuracy(y_hat, y): """计算预测正确的数量""" if len(y_hat.shape) > 1 and y_hat.shape[1] > 1: y_hat = y_hat.argmax(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=∑kexp(ok−max(ok))exp(max(ok))exp(oj−max(ok))exp(max(ok))=∑kexp(ok−max(ok))exp(oj−max(ok)).
log(y^j)=log(∑kexp(ok−max(ok))exp(oj−max(ok)))=log(exp(oj−max(ok)))−log(k∑exp(ok−max(ok)))=oj−max(ok)−log(k∑exp(ok−max(ok))).