动手学深度学习pytorch版练习解答-3.4softmax回归

这一节习题数学能力要求比较高,我的有限,如果有不同意见或者我哪里写错了欢迎讨论

练习

1.我们可以更深入地探讨指数族与softmax之间的联系。

(1)计算softmax交叉熵损失 l ( y , y ^ ) l(\mathbf{y},\hat{\mathbf{y}}) l(y,y^)的二阶导数

(2)计算softmax(o)给出的分布⽅差,并与上面计算的⼆阶导数匹配。

解:(1)由公式3.4.9和3.4.10:
在这里插入图片描述

(2)由方差的计算公式,假设o一共有q个,第i个观察对象的softmax计算结果为 s i s_i si,他们的softmax计算值的平均结果为 s ˉ \bar s sˉ

在这里插入图片描述

2.假设我们有三个类发⽣的概率相等,即概率向量是( 1 3 \frac{1}{3} 31, 1 3 \frac{1}{3} 31, 1 3 \frac{1}{3} 31)

(1)如果我们尝试为它设计⼆进制代码,有什么问题?

(2)你能设计⼀个更好的代码吗?提示:如果我们尝试编码两个独⽴的观察结果会发⽣什么?如果我们联合编码n个观测值怎么办?

解:(1)有三个类,如果要设置二进制代码至少需要2位。如果采用2位编码,有00、01、10、11四种组合,会出现某一个组合被浪费,而且想构造出题述概率向量非常困难,要根据组合,找新的表达形式,而且需要更改对应的损失函数参数,过程会非常繁琐困难

(2)采用one-hot独热编码。比如分别设置为001、010、100,三位数字中如果某一位是1则说明这个数据样例属于对应的类

3.softmax是对上⾯介绍的映射的误称(虽然深度学习领域中很多⼈都使⽤这个名字)。真正的softmax被定义为RealSoftMax(a, b) = log(exp(a) + exp(b))。

(1)证明:RealSoftMax(a, b) > max(a, b)

假设 a > b: l o g ( e a + e b ) > l o g e a = a log(e^a + e^b) > loge^a = a log(ea+eb)>logea=a,反之同理,得证

(2)证明:如果 λ > 0 \lambda > 0 λ>0,则 λ − 1 RealSoftMax ( λ a , λ b ) > m a x ( a , b ) \lambda^{-1}\text{RealSoftMax}(\lambda a, \lambda b) > max(a, b) λ1RealSoftMax(λa,λb)>max(a,b)

假设 a > b: λ − 1 l o g ( e λ a + e λ b ) > λ − 1 l o g e λ a = a \lambda ^{-1}log(e^{\lambda a} + e^{\lambda b}) > \lambda ^{-1}loge^{\lambda a} = a λ1log(eλa+eλb)>λ1logeλa=a,反之同理,得证

(3)证明对于λ → ∞,有 λ − 1 \lambda^{-1} λ1RealSoftMax(λa, λb) → max(a, b)。

直观理解:假设 a > b, λ \lambda λ→∞则有 λ a \lambda a λa >> λ b \lambda b λb,那么 l o g ( e λ a + e λ b ) log(e^{\lambda a} + e^{\lambda b}) log(eλa+eλb) e λ b e^{\lambda b} eλb可以忽略不计。

正常做法:使用夹逼定理

在这里插入图片描述

λ − 1 l o g 2 \lambda ^{-1}log2 λ1log2 λ \lambda λ趋于无穷时为0,根据夹逼定理得到原式极限为a,反之同理

4.soft-min会是什么样子

解:假设有q个观察结果,那么 softmin ( o ) i = e − i ∑ k = 1 q   e − k \text{softmin}(o)_i = \frac{e^{-i}}{\sum^{q}_{k=1} \ e^{-k}} softmin(o)i=k=1q ekei

5.将其扩展到两个以上的数字。

解:Realsoftmax(a,b,c,…)=log( e a + e b + e c + . . . e^a + e^b + e^c + ... ea+eb+ec+...)

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中实现softmax回归可以分为以下几个步骤: 1. 导入所需的库: ```python import torch import torch.nn as nn import torch.optim as optim ``` 2. 准备数据: 假设我们有一个大小为(N,D)的训练集,其中N是样本数量,D是特征数量,以及一个大小为(N,)的标签集。可以使用`torch.tensor`将数据转换为PyTorch张量。 ```python X_train = torch.tensor(X_train, dtype=torch.float32) y_train = torch.tensor(y_train, dtype=torch.long) ``` 3. 定义模型: 在PyTorch中,可以通过继承`nn.Module`类来定义模型。在softmax回归中,我们使用线性变换和softmax函数。 ```python class SoftmaxRegression(nn.Module): def __init__(self, input_dim, num_classes): super(SoftmaxRegression, self).__init__() self.linear = nn.Linear(input_dim, num_classes) def forward(self, x): return self.linear(x) ``` 4. 实例化模型和损失函数: ```python input_dim = X_train.shape[1] # 输入特征数 num_classes = len(torch.unique(y_train)) # 类别数 model = SoftmaxRegression(input_dim, num_classes) criterion = nn.CrossEntropyLoss() ``` 5. 定义优化器: ```python optimizer = optim.SGD(model.parameters(), lr=learning_rate) ``` 6. 训练模型: ```python num_epochs = 100 for epoch in range(num_epochs): # 前向传播 outputs = model(X_train) # 计算损失 loss = criterion(outputs, y_train) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 打印训练信息 if (epoch+1) % 10 == 0: print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}') ``` 这样就完成了使用PyTorch实现softmax回归的过程。你可以根据自己的数据和需求进行适当的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值