当前位置:   article > 正文

PyTorch 8.权值初始化与损失函数_coneo w1ih

coneo w1ih

PyTorch 8.权值初始化与损失函数

权值初始化

  1. 举个例子,若随机变XY相互独立,且其均值为0,方差为1则有:
    D ( X Y ) = D ( X ) D ( Y ) + D ( X ) E ( Y ) 2 + D ( Y ) E ( X ) 2 = D ( X ) D ( Y ) D(XY)=D(X)D(Y)+D(X)E(Y)^2+D(Y)E(X)^2=D(X)D(Y) D(XY)=D(X)D(Y)+D(X)E(Y)2+D(Y)E(X)2=D(X)D(Y)
    那么有:
    H 11 = ∑ i = 0 n X i ∗ W 1 i H_{11}=\sum^n_{i=0}X_i*W_{1i} H11=i=0nXiW1i
    D ( H 11 ) = ∑ i = 0 n D ( X i ) ∗ D ( W 1 i ) = n ∗ ( 1 ∗ 1 ) = n D(H_{11})=\sum^n_{i=0}D(X_i)*D(W_{1i}) =n*(1*1)=n D(H11)=i=0nD(Xi)D(W1i)=n(11)=n
    s t d ( H 11 ) = D ( H 11 ) = n std(H_{11})=\sqrt{D(H_{11})}=\sqrt{n} std(H11)=D(H11) =n
    这时我们发现 H 11 H_{11} H11的标准差变成了上一层的 n \sqrt{n} n
    所以,为了解决这个问题,权值的标准差必须为 1 / n 1/n 1/n
  2. 但是加入激活函数后,会带来梯度消失的问题
    为了解决这一问题,引入方差一致性:
    方差一致性:保持数据尺度维持在恰当范围,通常方差为1
def initialize(self):
	for m in self.modules():
		if isinstance(m, nn.Linear):
			a = nn.sqrt(6/(self.weight.data, std=np.sqrt(1/self.neural_num)))
			tanh_gain = nn.init.calculate_gain('tanh')
			a *= tanh_gain
			nn.init.uniform_(m.weight.data, -a, a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

也可以直接使用PyTorch提供的:

nn.init.xavier_uniform_(m.weight.data, gain=tanh_gain)
  • 1
  1. 但是使用了ReLU激活函数后,传统的Xavier初始化方法就失效了
nn.init.normal_(m.weight.data,std=np.sqrt(2/self.neural_num))
nn.init.kaiming_normal_(m.weight.data)
  • 1
  • 2
nn.init.calculate_gain(nonlinearity, param=None)
  • 1

主要功能:计算激活函数的方差变化尺度
主要参数:
nonlinearity:激活函数名称
param:激活函数的参数,如Linear ReLU 的 negative_slop

损失函数

  1. nn.CrossEntropyLoss
nn.CrossEntroyLoss(weight=None,
					size_average=None,
					ignore_index=-1,
					reduce=None,
					reduction='mean')
  • 1
  • 2
  • 3
  • 4
  • 5

功能:nn.LogSoftmax()与nn.NLLLoss()结合,进行交叉熵计算
主要参数:
weight:各类别的loss设置权值
ignore_index:忽略某个类别
reduction: 计算模式,可为none/sum/mean
none- 逐个元素计算
sum- 所有元素求和,返回标量
mean- 加权平均,返回标量
交叉熵 = 信息熵+相对熵
交叉熵: H ( P , Q ) = − ∑ i = 1 N P ( x i ) l o g ( Q ( x i ) ) H(P,Q)=-\sum^N_{i=1}P(x_i)log(Q(x_i)) H(P,Q)=i=1NP(xi)log(Q(xi))
自信息: l ( x ) = − l o g [ p ( x ) ] l(x) = -log[p(x)] l(x)=log[p(x)]
熵: H ( P ) = E x   p [ I ( x ) ] = − ∑ i N P ( x i ) l o g ( x i ) H(P)=E_{x~p}[I(x)]=-\sum^N_{i}P(x_i)log(x_i) H(P)=Ex p[I(x)]=iNP(xi)log(xi)
相对熵: D K L ( P , Q ) = E x   p [ l o g P ( x ) Q ( x ) ] = E x   p [ l o g P ( x ) − l o g Q ( x ) ] = ∑ i = 1 N P ( x i ) [ l o g P ( x i ) − l o g Q ( x i ) ] = ∑ i = 1 N P ( x i ) l o g P ( x i ) − ∑ i = 1 N P ( x i ) l o g Q ( x i ) = H ( P , Q ) − H ( P ) D_{KL}(P,Q)=E_{x~p}[log{\frac{P(x)}{Q(x)}}]=E_{x~p}[logP(x)-logQ(x)]=\sum^N_{i=1}P(x_i)[logP(x_i)-logQ(x_i)]=\sum^N_{i=1}P(x_i)logP(x_i)-\sum^N_{i=1}P(x_i)logQ(x_i)=H(P,Q)-H(P) DKL(P,Q)=Ex p[logQ(x)P(x)]=Ex p[logP(x)logQ(x)]=i=1NP(xi)[logP(xi)logQ(xi)]=i=1NP(xi)logP(xi)i=1NP(xi)logQ(xi)=H(P,Q)H(P)
2. nn.NLLLoss

nn.NLLLoss(weight=None,
			size_average=None,
			ignore_index=-1,
			reduce=None,
			reduction='mean')
  • 1
  • 2
  • 3
  • 4
  • 5

功能:实现负对数似然函数中的负号功能
主要参数
weight: 各类别的loss设置权值
ignore_index: 忽略某个类别
reduction: 计算模式,可为none/sum/mean
3. nn.BCELoss

nn.BCELoss(weight=None,
			size_average=None,
			reduce = None,
			reduction='mean')
  • 1
  • 2
  • 3
  • 4

功能:二分类交叉熵
主要参数
weight: 各类别的loss设置权值
ignore_index: 忽略某个类别
reduction: 计算模式,可为none/sum/mean
4. nn.L1Loss

nn.L1Loss(size_average=None, reduce=None,
reduction='mean')

  • 1
  • 2
  • 3

功能:计算inputs与target之差的绝对值
5. nn.MSELoss

nn.MSELoss(size_average=None, reduce=None,reduction='mean')
  • 1

功能:计算inputs与target之差的平方
6. nn.SmoothL1Loss

nn.SmoothL1Loss(size_average=None, reduce=None, reduction='mean')
  • 1

功能:平滑的L1loss,在两者差异大时能够比较平滑,在差异小时,能够快速收敛

  1. nn.PoissonNLLLoss
nn.PoissonNLLLoss(log_input=True, full=False, size_average=None, eps=1e-08, reduce=None, reduction='mean')
  • 1

功能:泊松分布的负对数似然损失函数
主要参数
log_input: 输入是否为对数形式,决定计算公式
full: 计算所有loss,默认为False
eps: 修正项,避免log为nan

  1. nn.KLDivLoss
nn.KLDivLoss(size_average=None,reduce=None,reduction='mean')
  • 1

功能:计算KLD(divergence),KL散度,相对熵
注意事项:需提前将输入计算log-probabilities,如通过nn.logsoftmax()
主要参数
reduction: none/sum/mean/batchmean
9. nn.MarginRankingLoss

nn.MarginRankingLoss(margin=0.0, size_average=None, reduce=None,reduction='mean')
  • 1

功能:计算两个向量之间的相似度,用于排序任务
特别说明:该方法计算两组数据之间的差异,返回一个n*n的loss矩阵
主要参数:
margin: 边界值,x1与x2之间的差异值

  1. nn.TripleMarginLoss
nn.TripletMarginLoss(margin=1.0, p=2.0, eps=1e-06, swap=False, size_average=None, reduce=None, reduction='mean')
  • 1

功能:计算三元组损失,人脸验证,reid常用
主要参数
p: 范数的阶,默认为2
margin: 边界值

该损失函数目的是让当前特征与最难的正样本之间的距离小于最难的负样本之间的距离,只有距离小于margin时,才不会产生损失

  1. nn.CosingEmbeddingLoss
nn.CosineEmbeddingLoss(margin=0.0,size_average=None,reduce=None,reduction='mean')
  • 1

功能:采用余弦相似度计算两个输入的相似性
主要参数
margin:可取值[-1,1],推荐为[0,0.5]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/488313
推荐阅读
相关标签
  

闽ICP备14008679号