输出的模型为:
可以看到最后的输出层是没有激活函数的,因此我们需要队fc层进行修改:
网络模型的fc层就变成了
一个基本的神经网络结构如图1和图2所示。图1是只有一个神经元的示意图,图2是一个含有隐藏层的简单神经网络。
如图1所示,当我们有一系列特征(input signals)为x1, x2, …xm,我们为其赋予对应的权重wk1,wk2,…xkm,对应相乘再相加,得到了x1wk1 + x2wk2 + x3wk3 + ... + xmwkm。我们再加上一个偏置(bias),得到一个总和sum。然后将这个值代入一个激活函数(比如sigmoid/relu等),得到最终值,输出。
图2是在图1的基础上,加入了隐藏层。我们对于LayerL1中的输入,赋予多组权重,计算可以得到Layer L2中的值,再对其中的值赋予权重a1, a2, a3,求出sum值,经过激活函数激活,输出。
以下用pytorch实现一个简单网络:
我们看看loss的分布:
统计参数总数量num_params = sum(param.numel() for param in model.parameters())
PyTorch 中参数的默认初始化在各个层的 reset_parameters() 方法中。例如:nn.Linear 和 nn.Conv2D,都是在 [-limit, limit] 之间的均匀分布(Uniform distribution),其中 limit 是 1. / sqrt(fan_in) ,fan_in 是指参数张量(tensor)的输入单元的数量
下面是几种常见的初始化方式。
Xavier初始化的基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0。这是通用的方法,适用于任何激活函数。
也可以使用 gain 参数来自定义初始化的标准差来匹配特定的激活函数:
参考资料:
He initialization的思想是:在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0。推荐在ReLU网络中使用。
主要用以解决深度网络下的梯度消失、梯度爆炸问题,在RNN中经常使用的参数初始化方法
在非线性激活函数之前,我们想让输出值有比较好的分布(例如高斯分布),以便于计算梯度和更新参数。Batch Normalization 将输出值强行做一次 Gaussian Normalization 和线性变换:
机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,称作L1正则化和L2正则化,或者L1范数和L2范数。
L1 正则化和 L2 正则化可以看做是损失函数的惩罚项。所谓 “惩罚” 是指对损失函数中的某些参数做一些限制。
L1 正则化是指权值向量 w 中各个元素的绝对值之和,通常表示为 ||w||1
L2 正则化是指权值向量 w 中各个元素的平方和然后再求平方根,通常表示为 ||w||2
下面是L1正则化和L2正则化的作用,这些表述可以在很多文章中找到。
L1 正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
L2 正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)