权值初始化
梯度消失与爆炸
从公式可看到,标准差由三个因素所决定,网络层的神经元个数,输入值的方差和网络层权值的方差。当我们的权值的标准差设置为1/n的开根号,我们每一个网络层输出的标准差都是1。
Xavier初始化
方差一致性:保持数据尺度维持在恰当范围,通常方差为1
激活函数:饱和函数,如Sigmoid,Tanh
Kaiming初始化
方差一致性:保持数据尺度维持在恰当范围,通常方差为1。
激活函数:ReLU及其变种。
通过上面几个例子,对权值的初始化有了清晰的认识,不良的权值初始化会引起输出层输出值过大或者过小,从而引发梯度消失或者爆炸,最终导致我们的模型无法正常训练。为了避免这样的事情发生,我们要控制网络层输出值的尺度范围,使每一个网络层的输出的方差尽量是一,遵循方差一致性原则,保持网络层输出值方差在一附近,不让方差和输出值过大或者过小。
十种初始化方法
- Xavier均匀分布
- Xavier正态分布
- Kaiming均匀分布
- Kaiming正态分布
- 均匀分布
- 正态分布
- 常数分布
- 正交矩阵初始化
- 单位矩阵初始化
- 稀疏矩阵初始化
nn.init.calculate_gain(nonlinearity, param=None)
功能:计算激活函数的方差变化尺度
参数:
- nonlinearity:激活函数名称。
- param:激活函数的参数,如Leaky ReLU的negative_slop
损失函数
损失函数是什么
衡量模型输出与真实标签的差异。
损失函数(Loss Function):
代价函数(CostFunction):
目标函数(Objective Function):
熵
熵表示一个事件的不确定性,越大就越不确定。
nn.CrossEntropyLoss
功能:nn.LogSoftmax()与nn.NLLLoss()结合,进行交叉熵计算
主要参数:
- weight:各类别的loss设置权值。
- ingore_index:忽略某个类别。
- reduction:计算模式,可为none/sum/mean。
- none:逐个元素计算。
- sum:所有元素求和,返回标量。
- mean:加权平均,返回标量。
nn.NLLLoss
功能:实现负对数似然函数中的负号功能。
主要参数:
- weight:各类别的loss设置权值。
- ingore_index:忽略某个类别。
- reduction:计算模式,可为none/sum/mean。
- none:逐个元素计算。
- sum:所有元素求和,返回标量。
- mean:加权平均,返回标量。
nn.BCELoss
功能:二分类交叉熵。
注意:输入值取值在[0,1]
主要参数:
- weight:各类别的loss设置权值。
- ingore_index:忽略某个类别。
- reduction:计算模式,可为none/sum/mean。
- none:逐个元素计算。
- sum:所有元素求和,返回标量。
- mean:加权平均,返回标量。
nn.BCEWithLogitsLoss
功能:结合Sigmoid与二分类交叉熵。
注意:网络最后不加sigmoid函数。
主要参数:
- pos_weight:正样本的权值。
- weight:各类别的loss设置权值。
- ingore_index:忽略某个类别。
- reduction:计算模式,可为none/sum/mean。
- none:逐个元素计算。
- sum:所有元素求和,返回标量。
- mean:加权平均,返回标量。
nn.L1Loss
功能:计算inputs与target之差的绝对值。
nn.MSELoss
功能:计算inputs与target之差的平方。
主要参数:
- reduction:计算模式,可为none/sum/mean。
- none:逐个元素计算。
- sum:所有元素求和,返回标量。
- mean:加权平均,返回标量。
nn.SmoothL1Loss
功能:平滑的L1Loss
主要参数:
- reduction:计算模式,可为none/sum/mean。
- none:逐个元素计算。
- sum:所有元素求和,返回标量。
- mean:加权平均,返回标量。
nn.PoissonLoss
功能:泊松分布的负对数似然损失函数。
主要参数:
- log_input:输入是否为对数形式,决定计算公式。
- full:计算所有loss,默认为False
- eps:修正项,避免log(input)为nan
nn.KLDivLoss
功能:计算KLD(divergence),KL散度,相对熵。
注意事项:需提前将输入计算log-probabilities,如通过nn.logsoftmax()
主要参数:
- reduction:计算模式,可为none/sum/mean/batchmean。
- batchmean:batchsize维度求平均值。
- none:逐个元素计算。
- sum:所有元素求和,返回标量。
- mean:加权平均,返回标量。
nn.MarginRankingLoss
功能:计算两个向量之间的相似度,用于排序任务。
特别说明:该方法计算两组数据之间的差异,返回一个n*n的loss矩阵。
主要参数:
- margin:边界值,x1与x2之间的差异值。
- reduction:计算模式,可为none/sum/mean。
y=1时,希望x1比x2大,当x1>x2时,不产生loss;
y=-1时,希望x2比x1大,当x2>x1时,不产生loss。
nn.MultiLabelMarginLoss
功能:多标签边界损失函数。
举例:四分类任务,样本x属于0类和3类。
标签:[0,3,-1,-1],不是[1,0,0,1]
主要参数:
- reduction:计算模式,可为none/sum/mean。
标签所在的神经元减去不是标签所在的神经元。
nn.SoftMarginLoss
功能:计算二分类的logistic损失
主要参数:
- reduction:计算模式,可为none/sum/mean。
nn.MultiLabelSoftMarginLoss
功能:SoftMarginLoss多标签版本
主要参数:
- weight:各类别的loss设置权值。
- reduction:计算模式,可为none/sum/mean。
nn.MultiMarginLoss
功能:计算多分类的折页损失。
主要参数:
- p:可选1或2。
- weight:各类别的loss设置权值。
- margin:边界值。
- reduction:计算模式,可为none/sum/mean。
nn.TripletMarginLoss
功能:计算三元组损失,人脸验证中常用。
主要参数:
- p:范数的阶,默认为2。
- margin:边界值。
- reduction:计算模式,可为none/sum/mean。
nn.HingeEmbeddingLoss
功能:计算两个输入的相似性,常用于非线性embedding和半监督学习。
特别注意:输入x应为两个输入之差的绝对值。
主要参数:
- margin:边界值。
- reduction:计算模式,可为none/sum/mean。
nn.CosineEmbeddingLoss
功能:采用余弦相似度计算两个输入的相似性。
主要参数:
- margin:可取值[-1,1],推荐为[0,0.5]。(由于cos的值域)
- reduction:计算模式,可为none/sum/mean。
nn.CTCLoss
功能:计算CTC损失,解决时序类数据的分类(Connectionist Temporal Classification)。
主要参数:
- blank:blank label。
- zero_infinity:无穷大的值或梯度置0。
- reduction:计算模式,可为none/sum/mean。
最近才添加进来的