NNDL作业五--前馈神经网络作业题

1、习题4-1对于一个神经元\sigma (\omega ^{T}*x+b),并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢.

回答:如图1,右边那个图为sigmoid的导数曲线,可以看到,导数均为正值。当使用梯度下降优化参数w时,会对w进行求导,其结果是损失函数L关于输出y的梯度*x*sigmoid的导数x与sigmoid的导数都恒大于0,每个w共用同一个损失函数L关于输出y的梯度故对每个w进行求导的结果对应梯度同正或同负,所以更新的方向如图2,不是右上方向就是左下方向,如果最优解在右下方向,需要迭代更多次,收敛速度更慢一些。

另一版本:零均值化的输入,使得神经元在0附近,sigmoid函数在零点处的导数最大,所有收敛速度最快。

总之记住:为了权重参数收敛更快一点,数据记得零均值化一下~

       图1 Sigmoid函数曲线和导数曲线

                                                      图2 全负或全正时的收敛情况


2、习题4-5如果限制一个神经网络的总神经元数量(不考虑输入层)为N+1,输入层大小为M,输出层大小为1,隐藏层的层数为L,每个隐藏层的神经元数量为\frac{N}{L},试分析参数数量和隐藏层层数L的关系.

回答:(未考虑偏置)

3、习题4-7为什么在神经网络模型的结构化风险函数中不对偏置b进行正则化?

回答:

L2正则化可以防止过拟合的原因在于它对模型中的权重进行约束,使权重趋向于较小的值,避免它得到的权重值过大,对训练数据的过度学习。另外一方面,省的输入细微的变化会导致输出值的突变

对权重正则化,是因为权重与输入有一个相乘的步骤,权重的大小,严重影响着输入与输出的联系,而偏置不会和输入x有运算,影响不大。

浅插一句:偏置为啥存在?偏置的存在是为了更好的拟合数据。比如说输入是个非零的数,你想让她输出是0,无论怎么改权重,结果都得不到零,加个偏置就可以啦!

4、习题4-8为什么在用反向传播算法进行参数学习时要采用随机参数初始化的方式而不是直接令W=0,b=0?

回答:当W=0,b=0,在输入层之后的所有隐藏层神经元接收到的输入都是一样的,这样每一层的输出都一样,反向传播时,每一个梯度也都一样,当直接令w=0,b=0时,会让下一层神经网络中所有神经元进行着相同的计算,具有同样的梯度,同样权重更新。权重更新方向一致,可能会出现第1小问中图2的现象

而且在作业4中提到当使用Relu激活函数时:相关参数均为0,参数不更新。Sigmoid函数:​​​​​​​收敛速度可能慢些,但最后能够达到很好的值。作业4


5、习题4-9梯度消失问题是否可以通过增加学习率来缓解?

回答:

梯度消失:在链式法则中,是多个导数值相乘,有那么几个导数趋于0就可能导致整体趋于0,也就是梯度消失

学习率:更新权重的步长

两者没有很大的关系,通过增加学习率可能会缓解梯度消失问题,但是也可能加重,也可能导致梯度爆炸,都有可能。适当地增加学习率可以加快收敛速度,但是增的太多也不好,会导致跳过全局最优,去找局部最优。

(摘自同学的博客)梯度消失问题的原因在于对参数求偏导时,根据链式法则得到的连乘式中多个几乎为0的导数值连乘导致。导数小会导致每次更新时的值过小,从而使训练变得困难。比如激活函数为类似于sigmoid与tanh,其值太大或太小时导数都趋于0(左右趋近于饱和)。

参考:

1、什么是零均值?什么是零均值化?

2、机器学习中,L2正则化的原理,及其可以防止过拟合的原因_l2正则化为什么能够减小过拟合-CSDN博客

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Python中,可以使用不同的库来构建前馈神经网络,其中最常用的是TensorFlow和PyTorch。下面我将为您展示如何使用PyTorch来构建前馈神经网络。 首先,确保您已经安装了PyTorch库。可以使用以下命令来安装: ``` pip install torch ``` 接下来,我们将使用PyTorch构建一个简单的前馈神经网络来进行二分类任务。假设我们有一个包含两个特征的数据集,我们的目标是根据这些特征将数据分为两个类别。 以下是一个使用PyTorch构建前馈神经网络的示例代码: ```python import torch import torch.nn as nn # 定义前馈神经网络模型 class FeedforwardNN(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super(FeedforwardNN, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, num_classes) self.sigmoid = nn.Sigmoid() def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) out = self.sigmoid(out) return out # 定义模型参数 input_size = 2 hidden_size = 5 num_classes = 2 # 实例化模型 model = FeedforwardNN(input_size, hidden_size, num_classes) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.1) # 训练模型 num_epochs = 10 for epoch in range(num_epochs): # 正向传播 outputs = model(inputs) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 打印训练进度 if (epoch+1) % 100 == 0: print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}') # 使用模型进行预测 with torch.no_grad(): outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) ``` 在上述代码中,我们首先定义了一个名为`FeedforwardNN`的类,它继承自`nn.Module`。在该类中,我们定义了两个全连接层(`nn.Linear`),使用ReLU作为激活函数,在输出层使用Sigmoid函数进行二分类。 然后,我们实例化了该类,并定义了损失函数(交叉熵损失)和优化器(随机梯度下降)。 接下来,我们迭代训练模型,通过正向传播计算输出并计算损失,然后进行反向传播和参数优化。 最后,我们使用训练好的模型进行预测。 这只是一个简单的示例,您可以根据自己的需求和数据集来调整模型结构、损失函数和优化器等。 希望这个示例能帮助您理解如何在Python中使用PyTorch构建前馈神经网络。如果您有更多问题,请随时提问!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值