第九讲,权值初始化方法,损失函数

一,权值初始化

1.方差一致性原则:将每一层的方差都尽量控制在1左右

2.torch中提供了10种权值初始化方法:

第九讲,权值初始化方法,损失函数_第1张图片

  • 均匀分布
  • 正态分布
  • 常数分布
  • 单位矩阵初始化
  • Xavier均匀分布–》Xavier针对的是饱和激活函数
  • Xavier正态分布
  • 凯明均匀分布–》凯明针对的是非饱和激活函数
  • 凯明正态分布
  • 正交矩阵初始化
  • 系数矩阵初始化

3. nn.init.calculate_gain:计算激活函数的方差变化尺度

  • nonlinearity:激活函数名
  • param:激活函数的参数,比如Leaky Relu的negative_stop
  • 尺度计算方式:输入数据的方差/经过激活函数后的数据的方法
class MLP(nn.Module):
    def __init__(self, neural_num, layers):
        super(MLP, self).__init__()
        self.linears = nn.ModuleList([nn.Linear(neural_num, neural_num, bias=False) for i in range(layers)])
        self.neural_num = neural_num

    def forward(self, x):
        for (i, linear) in enumerate(self.linears):
            x = linear(x)
            # x = torch.relu(x) #添加非线性
            x = torch.tanh(x) #添加非线性

            print("layer:{}, std:{}".format(i, x.std()))
            if torch.isnan(x.std()):#如果模型标准差为nan了就停止前向传播
                print("output is nan in {} layers".format(i))
                break

        return x

    def initialize(self):
        for m in self.modules():
            if isinstance(m, nn.Linear):
                # nn.init.normal_(m.weight.data)    # normal: mean=0, std=1
                # nn.init.normal_(m.weight.data, std=np.sqrt(1/self.neural_num))    # normal: mean=0, std=1

                # a = np.sqrt(6 / (self.neural_num + self.neural_num))
                # tanh_gain = nn.init.calculate_gain('tanh')#计算增益
                # a *= tanh_gain #增益乘以尺度,
                # nn.init.uniform_(m.weight.data, -a, a)

                tanh_gain = nn.init.calculate_gain('tanh')  # 计算增益
                nn.init.xavier_uniform_(m.weight.data, gain=tanh_gain)

                # nn.init.normal_(m.weight.data, std=np.sqrt(2 / self.neural_num))
                # nn.init.kaiming_normal_(m.weight.data)


# flag = 0
flag = 1

if flag:
    layer_nums = 100
    neural_nums = 256
    batch_size = 16

    net = MLP(neural_nums, layer_nums)
    net.initialize()

    inputs = torch.randn((batch_size, neural_nums))  # normal: mean=0, std=1

    output = net(inputs)
    print(output)

二,损失函数:衡量模型输出与真实标签的差异

第九讲,权值初始化方法,损失函数_第2张图片

nn.CrossEntropyLoss:将NN.Logsoftmax()和nn.NLLLoss()结合,进行交叉熵计算

  • weight:各类别的loss设置权限
  • ignore_index:忽略某个类别
  • reduction:计算模式,默认是mean
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量
  • 交叉熵=信息熵+相对熵

nn.NLLLoss:实现负对数似然函数中负号的功能

  • weight:各类别的loss设置权限
  • ignore_index:忽略某个类别
  • reduction:计算模式,默认是mean
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量

nn.BCELoss:二分类交叉熵

  • weight:各类别的loss设置权限
  • ignore_index:忽略某个类别
  • reduction:计算模式,默认是mean
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量
  • 注意:输入为【0—1】

nn.BCEWithLogitLoss:集合sigmoid的二分类交叉熵

  • weight:各类别的loss设置权限
  • ignore_index:忽略某个类别
  • reduction:计算模式,默认是mean
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量
  • pos_weight:整样本权值—》正负样本均衡的作用

nn.L1Loss:计算inputs与target之差的绝对值

nn.MSELoss:计算intput与target之差的平方

  • reduction:计算模式
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量

nn.SmoothL1Loss:平滑的L1Loss

  • reduction:计算模式
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量

nn.PoissonNLLLoss:泊松分布的负对数似然损失函数

  • log_input:输入是否以对数形式决定计算公式
  • full:计算所有的loss,默认为False
  • eps:修正项,避免log(input)为nan

nn.KLDivLoss:计算KLD,kl散度,相对熵—》计算两个分布的相似性(距离)

  • reuuction:
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量
    • batchmean:维度求平均值
  • 需提前输入计算log-probabilities,通过nn.logsoftmax()可以实现

nn.MarginRankingLoss:计算两个向量之间的相似度,用于排序任务

  • margin:边界值,x1与x2之间的差异值。
  • reduction:
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量

nn.multiLabelMarginLoss:多标签边界损失函数

  • 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.TripleMarginLoss:计算三元组损失,人脸验证中常用

  • p:范数的阶,默认为2
  • margin:边界值
  • reduction:
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量

nn.HingeEmbeddingLoss:计算两个输入的相似性,常用于非线性embedding和边监督学习

  • margin:边界值
  • reduction:
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量

nn.CosineEmbeddingLoss:采用 余弦相似度计算两个输入的相似性—》主要考虑方向上的差异

  • margin:可取值【-1,1】,推荐为【0, 0.5】
  • zero_infinity:无穷大的值或梯度置为0
  • reduction:
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量

nn.CTCLoss:计算CTC损失,解决时序类数据的分类

  • blank:blank label
  • zero_infinity:无穷大的值或梯度置为0
  • reduction:
    • none:逐个元素计算
    • sum:所有元素求和返回标量
    • mean:加权平均,返回标量

你可能感兴趣的:(Pytorch学习)