论文笔记 The lottery ticket hypothesis

一个随机初始化的密集的神经网络包含着一个初始化的子网络(中奖彩票),经过训练后,这个子网络和原始网络经过训练同样的迭代次数之后精度可能会相同甚至更高。

一、算法主要步骤:

1.随机初始化一个神经网络f(x;\Theta0 )

2.对这个网络训练j个iterations(iterations = batchs = N /batch_size 也等于一个epoch),使网络到达参数\Theta j

3.将\Theta j修剪p%,建立一个掩码矩阵m

4.将剩下的权重参数重置为\Theta 0,建立中奖彩票f(x;m\odot \Theta 0)

二、该文献的主要贡献有三点:

2.1.修剪揭示了可训练的子网络,达到了与原始网络相当的测试精度,从原始网络中得到了相当数量的迭代。

2.2.修剪发现中奖彩票的学习速率比原始网络更快,同时达到更高的测试准确性和更好的泛化。

2.3.提出彩票假设作为神经网络剪枝的新视角。

三、构建迭代修剪策略的两种不同方法

3.1带有重置的迭代修剪

        1.随机初始化一个神经网络f(x;m\cdot \Theta 0),其中\Theta =\Theta 0 m是一个掩码矩阵

        2.训练j次,使网络参数为m\cdot \Theta j

        3.修剪s%的参数,更新掩码矩阵m{}' 其中Pm{}'=(Pm-s)%

        4.将网络剩余部分的权重置为\Theta 0

        5.让m= m{}',并重复第2-4步

3.2持续训练的迭代修剪

        1.随机初始化一个神经网络f(x;m\cdot \Theta 0),其中\Theta =\Theta 0 m是一个掩码矩阵

        2.训练j次

        3.修剪s%的参数,更新掩码矩阵m{}' 其中Pm{}'=(Pm-s)%

        4.让m= m{}',并重复第2-3步

        5.让网络剩余部分的权重置为\Theta 0

四、原文附带剪枝函数代码

def prune_by_percent(percents, masks, final_weights):
  """percents 一个字典,用于指定每个层应该剪枝多少百分比
     masks 一个字典,用于存储每个层的当前剪枝掩码
     final_weights 最后一次训练后的权重。
  """

  def prune_by_percent_once(percent, mask, final_weight):
"""
    prune_by_percent_once 的内部函数,该函数用于按百分比剪枝每个层的权重,返回更新后的剪枝掩码
    percent 表示要剪枝多少百分比的权重
    mask 表示当前的掩码
    final_weight 表示最后一次训练后的权重
"""
    # 将未被掩码屏蔽的权重按照绝对值大小排序
    sorted_weights = np.sort(np.abs(final_weight[mask == 1]))

    # 计算应该被剪枝的权重阈值
    cutoff_index = np.round(percent * sorted_weights.size).astype(int)
    cutoff = sorted_weights[cutoff_index]

    # 将低于该阈值的权重所对应的掩码置为零.
    return np.where(np.abs(final_weight) <= cutoff, np.zeros(mask.shape), mask)

  new_masks = {}
  for k, percent in percents.items():
    new_masks[k] = prune_by_percent_once(percent, masks[k], final_weights[k])
    #返回更新后的剪枝掩码
  return new_masks

 

### 假设质量和检测器质量的关系 在机器学习和数据分析领域,假设的质量(Hypothesis Quality)通常指的是模型对数据分布的拟合程度以及其泛化能力。而检测器质量(Detector Quality),特别是在分类任务中,则涉及评估模型识别特定类别或异常的能力。 #### Hypothesis Quality 当提到假设质量时,主要关注的是训练过程中形成的函数 \( h(x) \),它能够很好地预测新样本的结果。然而,仅仅在一个训练集上表现良好并不意味着该假设是一个好的模型[^2]。如果模型过度拟合训练数据,那么它的测试误差可能会显著增加,从而降低整体性能。因此,在衡量假设质量时,需要考虑多种指标来综合评价模型的表现。 对于监督学习中的分类问题,常用的阈值基度量包括但不限于精确率(Precision)、召回率(Recall) 和 F1分数(F1-score)[^1]。这些指标可以帮助我们理解模型如何平衡正类别的正确性和覆盖率: - **Precision**: 表示被标记为正类别的实例中有多少实际上是正类别。 - **Recall (Sensitivity)**: 反映实际属于正类别的实例有多少比例被成功检出。 - **F1-Score**: 是 Precision 和 Recall 的调和平均数,提供了一个单一数值来权衡两者的重要性。 #### Detector Quality 检测器质量更多地侧重于具体应用场景下的效能分析,比如入侵检测系统或者医学诊断工具等领域内的错误容忍度设定。一个好的检测算法不仅要有高的准确性(Classification Accuracy)[^1],还需要具备鲁棒性以应对噪声干扰等因素的影响。 通过调整决策边界的位置可以改变检测系统的敏感程度——即提高recall可能牺牲precision;反之亦然。这种取舍关系构成了ROC曲线的基础概念之一,并进一步衍生出了AUC(Area Under Curve)作为无偏估计方法用于比较不同模型间相对优劣之处。 另外值得注意的一点是,虽然这里讨论的重点放在了有标签的数据处理方式之上[^3],但在某些特殊情况下也可能涉及到半监督甚至完全无监督的技术手段来进行特征提取或是模式发现等工作流程环节当中去提升最终输出结果的有效性和可靠性水平。 ```python from sklearn.metrics import precision_score, recall_score, f1_score def evaluate_detector(y_true, y_pred): """ Evaluate the quality of a detector using precision, recall, and F1 score. Parameters: y_true : array-like of shape (n_samples,) True binary labels. y_pred : array-like of shape (n_samples,) Predicted binary labels. Returns: dict: Dictionary containing 'precision', 'recall' and 'f1'. """ results = { "precision": precision_score(y_true, y_pred), "recall": recall_score(y_true, y_pred), "f1": f1_score(y_true, y_pred) } return results ``` 上述代码片段展示了如何利用Python库`sklearn`计算基本的分类性能指标,这对于定量描述一个给定条件下检测器的实际运作状况非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值