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

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)

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

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

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

损失函数

  1. nn.CrossEntropyLoss
nn.CrossEntroyLoss(weight=None,
					size_average=None,
					ignore_index=-1,
					reduce=None,
					reduction='mean')

功能: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')

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

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

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

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

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

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

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

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

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

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

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

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

功能:计算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')

功能:计算两个向量之间的相似度,用于排序任务
特别说明:该方法计算两组数据之间的差异,返回一个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')

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

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值