2018年2月1日星期四

如何通过距离度量学习解决Street-to-Shop问题


数据集


首先,我们需要数据集。实际上,当我发现 Aliexpress 上有很多用户图像的时候我就有了这个想法。我心里想,「哇,我可以通过使用这种数据来搜索,当然是仅仅为了有趣」。为了简便,我决定重点关注女装。


下面是我所使用的类别:


  • 连衣裙

  • 衬衣&衬衫

  • 卫衣和运动衫

  • 夹克和外套


我使用 requests(https://pypi.python.org/pypi/requests)和 beautifualSoup(https://pypi.python.org/pypi/beautifulsoup4)来爬取图像。卖家的图像可从商品页面上获得,但是为了得到用户图像,我们需要浏览反馈页面。在商品页面上有一个叫做「colors」的属性,指的是另一种不同的颜色或者甚至是另一件商品,所以我们需要将不同颜色的衣服视为不同的商品。



商品页面上的「颜色」


你可以在 github 上找到我用来得到关于一件服饰的所有信息的代码(https://github.com/movchan74/street_to_shop_experiments/blob/master/get_item_info.py)(它爬取到的信息甚至比我们任务中需要的信息还要多)。


我们需要做的就是通过每一个类别取浏览对应的页面,拿到所有商品的 URL,然后使用上面提到的函数取得有关每个商品的信息。


最终,我们得到了每个商品的两个图片集合:来自于卖家的图片(商品页面上每个「colors」对应的元素)以及来自于用户的图片(商品页面上每个「feedbacks」对应的元素)。


对于每个 color,我们只有一张卖家图片,但是可能具有多于一个的用户图像 (然而有时候根本没有用户图像)。


很棒现在我们有数据了。然而得到的数据集有噪声:


  • 用户图像中含有噪声(包裹箱子的照片,商品中一些无关区域的照片,以及刚拆开包装的照片)。


用户数据中的噪声示例


为了减轻这个问题,我们给 5000 张图像打了两种不同类别的标签:好图片和噪声图片。起初,我计划训练一个分类器来清洗数据集。但是后来我决定将数据清洗分类器这项工作留在后面,仅仅将干净的数据用在测试集和验证集中。


  • 第二个问题是,一些商品有好几个卖家。这些卖家有时候甚至用的是相同图像(经过轻微编辑)。那么如何处理这个问题呢?最简单的方法就是对数据不做任何处理,使用一个鲁棒的距离度量学习算法。但是这会影响到验证,因为在这种情况下,我们在验证数据和训练数据中有相同的商品。因此这就造成了数据泄露。另一种方式就是使用某种方法来寻找相似的(甚至完全相同的)商品,并将其合并。我们可以使用感知哈希来寻找相同的图像(例如 phash 和 whash)。或者我们可以在噪声数据集上训练一个模型来寻找相似的图像。我选择了后者,因为这种方法可以合并经过轻微编辑的图像。


距离度量学习


最常用的距离度量算法之一就是 triplet loss:




其中,max(x, 0) 是 hinge 函数,d(x, y) 是 x 和 y 之间的距离函数。F(x) 是一个深度神经网络,M 是边际,a 是 anchor,p 是正例点,n 是反例点。


F(a), F(p), F(n) 都是由深度神经网络产生的高维空间中的向量。值得提及的是,为了让模型应对对照变化的时候更加鲁棒以及训练过程中具有更好的稳定性,这些向量需进行正则化处理,以拥有相同的长度,例如||x|| = 1。anchor 和正例样本属于同一类别,反例点属于其他类别。


所以 triplet loss 的主要思想就是使用一个距离边际 M 来区分正例对(anchor 和 positive)的向量。


但是如何选择元组 (a, p, n) 呢?我们可以随机选择一个 triplet,但是这样会导致以下问题。首先,存在 N³种可能的 triplet。这意味着我们需要花费很多时间来遍历所有可能的 triplet。但是实际上我们没必要这么做,因为经过少数几次的训练迭代之后,很多元 triplet 已经符合 triplet 限制(例如 0 损失)。这意味着这些 triplet 在训练中式没用的。


最常用的 triplet 选择的方式就是 hard negative mining:




实际上,选择最严格的负样本会在训练早期导致糟糕的局部最小值。尤其是,它能够导致一个收缩的模型(例如 F(x) = 0)),为了缓解这个问题,我们使用 semi-hard negative mining(半严格负样本最小化)。


 半严格负样本要比 anchor 离正样本更加远,但是它们仍然是严格的(违背了 triplet 限制),因为它们在边际 M 内部。


半严格负样本的 triplet 的限制条件


下面是生成半严格和严格负样本的两种方式:在线和离线。


  • 在线方式意味着我们从数据集中随机地选择样本作为一个 mini-batch,并从这个 Mini-batch 中选择 triplet。然而,在线方法需要一个较大的 mini-batch。在我的情况中是不可能的,因为我只有一块具有 8GB 显存的 GTX 1070。

  • 在离线方式中,我们需要在一段时间之后停止训练,为一定数量的样本预测向量,从中选择 triplet 并为这些 triplet 训练模型。这意味着我们要进行两次,然而这就是离线方法的代价。


好了,现在我们可以开始用 triplet loss 和离线半严格负样本最小化来训练模型了。但是,为了成功地解决 street-to-shop 问题,我们还需要一个技巧。我们面临的任务是找到与用户照片最相似的卖家图像。然而,通常卖家的图像具有更高的质量,所以我们有两个域:卖家图像和用户图像。为了得到更有效的模型,我们需要减小这两个域之间的差距。这个问题就叫做域适应。


左边是用户的图像;右边是卖家的图像


我想出了一个非常简单的方法来减少这种域差距:我们在卖家图像中选择 anchor,从用户图像中选择正例样本和负例样本。这个方法简单有效。


实现


为了实现我的想法并快速实验,我使用了基于 TensorFlow 的 Keras 库。


我选择 inception V3 作为模型的基本卷积网络。像往常一样我使用 ImageNet 权重初始化卷积神经网络。我在使用 L2 正则化的全局池化之后又加了两个全连接层,向量的维度是 128。


  
  1. def get_model():

  2.    no_top_model = InceptionV3(include_top=False, weights='imagenet', pooling='avg')

  3.    x = no_top_model.output

  4.    x = Dense(512, activation='elu', name='fc1')(x)

  5.    x = Dense(128, name='fc2')(x)

  6.    x = Lambda(lambda x: K.l2_normalize(x, axis=1), name='l2_norm')(x)

  7.    return Model(no_top_model.inputs, x)


我们还需要实现 triple 损失函数。我们传递一个 anchor,正样本和负样本作为一个 mini-batch,在损失函数中将其分为三个张量。距离函数就是欧氏距离的平方。

  
  1. def margin_triplet_loss(y_true, y_pred, margin, batch_size):

  2.    out_a = tf.gather(y_pred, tf.range(0, batch_size, 3))

  3.    out_p = tf.gather(y_pred, tf.range(1, batch_size, 3))

  4.    out_n = tf.gather(y_pred, tf.range(2, batch_size, 3))

  5.    loss = K.maximum(margin

  6.                 + K.sum(K.square(out_a-out_p), axis=1)

  7.                 - K.sum(K.square(out_a-out_n), axis=1),

  8.                 0.0)

  9.    return K.mean(loss)


并优化模型:

  
  1. #utility function to freeze some portion of a function's arguments

  2. from functools import partial, update_wrapper

  3. def wrapped_partial(func, *args, **kwargs):

  4.    partial_func = partial(func, *args, **kwargs)

  5.    update_wrapper(partial_func, func)

  6.    return partial_func

  7. opt = keras.optimizers.Adam(lr=0.0001)

  8. model.compile(loss=wrapped_partial(margin_triplet_loss, margin=margin, batch_size=batch_size), optimizer=opt)


实验结果


结果:第一列-查询(用户图像),后五列-最相似的卖家图像。


性能衡量指标是 R@K。


我们来看一下 R@K 是如何计算的。验证集里面的每张用户图像作为一次查询,我们需要找到对应的卖家图像。我们不仅使用了验证集中的卖家图像,还使用了训练集中的图像,因为这样可以使我们增加干扰数量,使得我们的任务更加具有挑战性。


所以我们就有一张查询图像,以及一些很相似的卖家图像。如果在 K 个最相似的图像中有对应的卖家数据,我们就返回 1,否则就返回 0。现在我们需要为验证集中的每一次查询返回这么一个结果,然后找到每次查询的平均得分。这就是 R@K。


正如我之前讲到的,我从噪声图像中清洗了一部分用户图像。所以我在两个验证集上衡量了一下模型的质量:完整的验证集只包含干净数据的子验证集。


验证数据中的 R@K


结果距离理想情况还很远,还有很多需要做:


  • 从噪声数据中清洗用户图像。我在第一步中已经做了一部分。

  • 更加准确地合并相似的图像(至少在验证集中)。

  • 降低域差距。假设可以通过特定域增强的方法(例如亮度增强)以及其他特定的方法完成(例如这篇论文中的方法 https://arxiv.org/abs/1409.7495)。

  • 应用其他的距离指标学习技术。我试了这篇论文中的方法(https://arxiv.org/abs/1703.07464),但是比我所用的方法性能要差一些。

  • 当然,要收集更多的数据。


DEMO,代码和训练好的模型


我做了一个 demo。你可以在这里看到 vps389544.ovh.net:5555。你可以上传你自己的图像或者随便使用验证集中的图像来搜索。


代码和训练好的模型在这里:https://github.com/movchan74/street_to_shop_experiments。


原文链接:http://ift.tt/2D8dlTg

]]> 原文: http://ift.tt/2nuksM9
RSS Feed

机器知心

IFTTT

综述论文:机器学习中的模型评价、模型选择与算法选择

1 简介:基本的模型评估项和技术


机器学习已经成为我们生活的中心,无论是作为消费者、客户、研究者还是从业人员。无论将预测建模技术应用到研究还是商业问题,我认为其共同点是:做出足够好的预测。用模型拟合训练数据是一回事,但我们如何了解模型的泛化能力?我们如何确定模型是否只是简单地记忆训练数据,无法对未见过的样本做出好的预测?还有,我们如何选择好的模型呢?也许还有更好的算法可以处理眼前的问题呢?


模型评估当然不是机器学习工作流程的终点。在处理数据之前,我们希望事先计划并使用合适的技术。本文将概述这类技术和选择方法,并介绍如何将其应用到更大的工程中,即典型的机器学习工作流。


1.1 性能评估:泛化性能 vs. 模型选择


让我们考虑这个问题:「如何评估机器学习模型的性能?」典型的回答可能是:「首先,将训练数据馈送给学习算法以学习一个模型。第二,预测测试集的标签。第三,计算模型对测试集的预测准确率。」然而,评估模型性能并非那么简单。也许我们应该从不同的角度解决之前的问题:「为什么我们要关心性能评估呢?」理论上,模型的性能评估能给出模型的泛化能力,在未见过的数据上执行预测是应用机器学习或开发新算法的主要问题。通常,机器学习包含大量实验,例如超参数调整。在训练数据集上用不同的超参数设置运行学习算法最终会得到不同的模型。由于我们感兴趣的是从该超参数设置中选择最优性能的模型,因此我们需要找到评估每个模型性能的方法,以将它们进行排序。


我们需要在微调算法之外更进一步,即不仅仅是在给定的环境下实验单个算法,而是对比不同的算法,通常从预测性能和计算性能方面进行比较。我们总结一下评估模型的预测性能的主要作用:


  • 评估模型的泛化性能,即模型泛化到未见过数据的能力;

  • 通过调整学习算法和在给定的假设空间中选择性能最优的模型,以提升预测性能;

  • 确定最适用于待解决问题的机器学习算法。因此,我们可以比较不同的算法,选择其中性能最优的模型;或者选择算法的假设空间中的性能最优模型。


虽然上面列出的三个子任务都是为了评估模型的性能,但是它们需要使用的方法是不同的。本文将概述解决这些子任务需要的不同方法。


我们当然希望尽可能精确地预测模型的泛化性能。然而,本文的一个要点就是,如果偏差对所有模型的影响是等价的,那么偏差性能评估基本可以完美地进行模型选择和算法选择。如果要用排序选择最优的模型或算法,我们只需要知道它们的相对性能就可以了。例如,如果所有的性能评估都是有偏差的,并且低估了它们的性能(10%),这不会影响最终的排序。更具体地说,如果我们得到如下三个模型,这些模型的预测准确率如下:


M2: 75% > M1: 70% > M3: 65%,


如果我们添加了 10% 的性能偏差(低估),则三种模型的排序没有发生改变:


M2: 65% > M1: 60% > M3: 55%. 


但是,注意如果最佳模型(M2)的泛化准确率是 65%,很明显这个精度是非常低的。评估模型的绝对性能可能是机器学习中最难的任务之一。



图 2:留出验证方法的图示。


2 Bootstrapping 和不确定性


本章介绍一些用于模型评估的高级技术。我们首先讨论用来评估模型性能不确定性和模型方差、稳定性的技术。之后我们将介绍交叉验证方法用于模型选择。如第一章所述,关于我们为什么要关心模型评估,存在三个相关但不同的任务或原因。


  • 我们想评估泛化准确度,即模型在未见数据上的预测性能。

  • 我们想通过调整学习算法、从给定假设空间中选择性能最好的模型,来改善预测性能。

  • 我们想确定手头最适合待解决问题的机器学习算法。因此,我们想对比不同的算法,选出性能最好的一个;或从算法的假设空间中选出性能最好的模型。



图 3:偏差和方差的不同组合的图示。



图 4:在 MNIST 数据集上 softmax 分类器的学习曲线。



图 5:二维高斯分布中的重复子采样。


3 交叉验证和超参数优化


几乎所有机器学习算法都需要我们机器学习研究者和从业者指定大量设置。这些超参数帮助我们控制机器学习算法在优化性能、找出偏差方差最佳平衡时的行为。用于性能优化的超参数调整本身就是一门艺术,没有固定规则可以保证在给定数据集上的性能最优。前面的章节提到了用于评估模型泛化性能的留出技术和 bootstrap 技术。偏差-方差权衡和计算性能估计的不稳定性方法都得到了介绍。本章主要介绍用于模型评估和选择的不同交叉验证方法,包括对不同超参数配置的模型进行排序和评估其泛化至独立数据集的性能。


本章生成图像的代码详见:https://github.com/rasbt/model-eval-article-supplementary/blob/master/code/resampling-and-kfold.ipynb。



图 11:logistic 回归的概念图示。


我们可以把超参数调整(又称超参数优化)和模型选择的过程看作元优化任务。当学习算法在训练集上优化目标函数时(懒惰学习器是例外),超参数优化是基于它的另一项任务。这里,我们通常想优化性能指标,如分类准确度或接受者操作特征曲线(ROC 曲线)下面积。超参数调整阶段之后,基于测试集性能选择模型似乎是一种合理的方法。但是,多次重复使用测试集可能会带来偏差和最终性能估计,且可能导致对泛化性能的预期过分乐观,可以说是「测试集泄露信息」。为了避免这个问题,我们可以使用三次分割(three-way split),将数据集分割成训练集、验证集和测试集。对超参数调整和模型选择进行训练-验证可以保证测试集「独立」于模型选择。这里,我们再回顾一下性能估计的「3 个目标」:


  • 我们想评估泛化准确度,即模型在未见数据上的预测性能。

  • 我们想通过调整学习算法、从给定假设空间中选择性能最好的模型,来改善预测性能。

  • 我们想确定最适合待解决问题的机器学习算法。因此,我们想对比不同的算法,选出性能最好的一个,从算法的假设空间中选出性能最好的模型。



图 12:超参数调整中三路留出方法(three-way holdout method)图示。



图 13:k 折交叉验证步骤图示。



图 16:模型选择中 k 折交叉验证的图示。


论文:Model Evaluation, Model Selection, and Algorithm Selection in Machine Learning




论文链接:http://ift.tt/2nrrOzP


摘要:模型评估、模型选择和算法选择技术的正确使用在学术性机器学习研究和诸多产业环境中异常关键。本文回顾了用于解决以上三项任务中任何一个的不同技术,并参考理论和实证研究讨论了每一项技术的主要优势和劣势。进而,给出建议以促进机器学习研究与应用方面的最佳实践。本文涵盖了用于模型评估和选择的常见方法,比如留出方法,但是不推荐用于小数据集。不同风格的 bootstrap 技术也被介绍,以评估性能的不确定性,以作为通过正态空间的置信区间的替代,如果 bootstrapping 在计算上是可行的。在讨论偏差-方差权衡时,把 leave-one-out 交叉验证和 k 折交叉验证进行对比,并基于实证证据给出 k 的最优选择的实际提示。论文展示了用于算法对比的不同统计测试,以及处理多种对比的策略(比如综合测试、多对比纠正)。最后,当数据集很小时,本文推荐替代方法(比如 5×2cv 交叉验证和嵌套交叉验证)以对比机器学习算法。

]]> 原文: http://ift.tt/2BNJnP1
RSS Feed

机器知心

IFTTT

理解深度学习中的学习率及多种选择策略

这篇文章记录了我对以下问题的理解:


  • 学习速率是什么?学习速率有什么意义?

  • 如何系统地获得良好的学习速率?

  • 我们为什么要在训练过程中改变学习速率?

  • 当使用预训练模型时,我们该如何解决学习速率的问题?


本文的大部分内容都是以 fast.ai 研究员写的内容 [1], [2], [5] 和 [3] 为基础的。本文是一个更为简洁的版本,通过本文可以快速获取这些文章的主要内容。如果您想了解更多详情,请参阅参考资料。


首先,什么是学习速率?


学习速率是指导我们该如何通过损失函数的梯度调整网络权重的超参数。学习率越低,损失函数的变化速度就越慢。虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着我们将花费更长的时间来进行收敛,特别是在被困在高原区域的情况下。


下述公式表示了上面所说的这种关系。


  1. new_weight = existing_weight — learning_rate * gradient



采用小学习速率(顶部)和大学习速率(底部)的梯度下降。来源:Coursera 上吴恩达(Andrew Ng)的机器学习课程。


一般而言,用户可以利用过去的经验(或其他类型的学习资料)直观地设定学习率的最佳值。


因此,想得到最佳学习速率是很难做到的。下图演示了配置学习速率时可能遇到的不同情况。



不同学习速率对收敛的影响(图片来源:cs231n)


此外,学习速率对模型收敛到局部极小值(也就是达到最好的精度)的速度也是有影响的。因此,从正确的方向做出正确的选择意味着我们可以用更短的时间来训练模型。


  1. Less training time, lesser money spent on GPU cloud compute. :)


有更好的方法选择学习速率吗?


在「训练神经网络的周期性学习速率」[4] 的 3.3 节中,Leslie N. Smith 认为,用户可以以非常低的学习率开始训练模型,在每一次迭代过程中逐渐提高学习率(线性提高或是指数提高都可以),用户可以用这种方法估计出最佳学习率。



在每一个 mini-batch 后提升学习率


如果我们对每次迭代的学习进行记录,并绘制学习率(对数尺度)与损失,我们会看到,随着学习率的提高,从某个点开始损失会停止下降并开始提高。在实践中,学习速率的理想情况应该是从图的左边到最低点(如下图所示)。在本例中,是从 0.001 到 0.01。




上述方法看似有用,但该如何应用呢?


目前,上述方法在 fast.ai 包中作为一个函数进行使用。fast.ai 包是由 Jeremy Howard 开发的一种高级 pytorch 包(就像 Keras 之于 Tensorflow)。


在训练神经网络之前,只需输入以下命令即可开始找到最佳学习速率。


  1. # learn is an instance of Learner class or one of derived classes like ConvLearner

  2. learn.lr_find()

  3. learn.sched.plot_lr()


使之更好


现在我们已经知道了什么是学习速率,那么当我们开始训练模型时,怎样才能系统地得到最理想的值呢。接下来,我们将介绍如何利用学习率来改善模型的性能。


传统的方法


一般而言,当已经设定好学习速率并训练模型时,只有等学习速率随着时间的推移而下降,模型才能最终收敛。


然而,随着梯度达到高原,训练损失会更难得到改善。在 [3] 中,Dauphin 等人认为,减少损失的难度来自鞍点,而不是局部最低点。



误差曲面中的鞍点。鞍点是函数上的导数为零但不是轴上局部极值的点。(图片来源:safaribooksonline)


所以我们该如何解决这个问题?


我们可以采取几种办法。[1] 中是这么说的:


…无需使用固定的学习速率,并随着时间的推移而令它下降。如果训练不会改善损失,我们可根据一些周期函数 f 来改变每次迭代的学习速率。每个 Epoch 的迭代次数都是固定的。这种方法让学习速率在合理的边界值之间周期变化。这是有益的,因为如果我们卡在鞍点上,提高学习速率可以更快地穿越鞍点。


在 [2] 中,Leslie 提出了一种「三角」方法,这种方法可以在每次迭代之后重新开始调整学习速率。



Leslie N. Smith 提出的「Triangular」和「Triangular2」学习率周期变化的方法。左图中,LR 的最小值和最大值保持不变。右图中,每个周期之后 LR 最小值和最大值之间的差减半。


另一种常用的方法是由 Loshchilov&Hutter [6] 提出的预热重启(Warm Restarts)随机梯度下降。这种方法使用余弦函数作为周期函数,并在每个周期最大值时重新开始学习速率。「预热」是因为学习率重新开始时并不是从头开始的,而是由模型在最后一步收敛的参数决定的 [7]。


下图展示了伴随这种变化的过程,该过程将每个周期设置为相同的时间段。



SGDR 图,学习率 vs 迭代次数。


因此,我们现在可以通过周期性跳过「山脉」的办法缩短训练时间(下图)。



比较固定 LR 和周期 LR(图片来自 ruder.io)


研究表明,使用这些方法除了可以节省时间外,还可以在不调整的情况下提高分类准确性,而且可以减少迭代次数。


迁移学习中的学习速率


在 fast.ai 课程中,非常重视利用预训练模型解决 AI 问题。例如,在解决图像分类问题时,会教授学生如何使用 VGG 或 Resnet50 等预训练模型,并将其连接到想要预测的图像数据集。


我们采取下面的几个步骤,总结了 fast.ai 是如何完成模型构建(该程序不要与 fast.ai 包混淆)的:


1. 启用数据增强,precompute = True

2. 使用 lr_find() 找到损失仍在降低的最高学习速率

3. 从预计算激活值到最后一层训练 1~2 个 Epoch

4. 在 cycle_len = 1 的情况下使用数据增强(precompute=False)训练最后一层 2~3 次

5. 修改所有层为可训练状态

6. 将前面层的学习率设置得比下一个较高层低 3~10 倍

7. 再次使用 lr_find()

8. 在 cycle_mult=2 的情况下训练整个网络,直到过度拟合


从上面的步骤中,我们注意到步骤 2、5 和 7 提到了学习速率。这篇文章的前半部分已经基本涵盖了上述步骤中的第 2 项——如何在训练模型之前得出最佳学习率。


在下文中,我们会通过 SGDR 来了解如何通过重启学习速率来减少训练时间和提高准确性,以避免梯度接近零。


在最后一节中,我们将重点介绍差异学习(differential learning),以及如何在训练带有预训练模型中应用差异学习确定学习速率。


什么是差异学习


差异学习(different learning)在训练期间为网络中的不同层设置不同的学习速率。这种方法与人们常用的学习速率配置方法相反,常用的方法是训练时在整个网络中使用相同的学习速率。




在写这篇文章的时候,Jeremy 和 Sebastian Ruder 发表的一篇论文深入探讨了这个问题。所以我估计差异学习速率现在有一个新的名字——差别性的精调。:)


为了更清楚地说明这个概念,我们可以参考下面的图。在下图中将一个预训练模型分成 3 组,每个组的学习速率都是逐渐增加的。



具有差异学习速率的简单 CNN 模型。图片来自 [3]


这种方法的意义在于,前几个层通常会包含非常细微的数据细节,比如线和边,我们一般不希望改变这些细节并想保留它的信息。因此,无需大量改变权重。


相比之下,在后面的层,以绿色以上的层为例,我们可以从中获得眼球、嘴巴或鼻子等数据的细节特征,但我们可能不需要保留它们。


这种方法与其他微调方法相比如何?


在 [9] 中提出,微调整个模型太过昂贵,因为有些模型可能超过了 100 层。因此人们通常一次一层地对模型进行微调。


然而,这样的调整对顺序有要求,不具并行性,且因为需要通过数据集进行微调,导致模型会在小数据集上过拟合。


下表证明 [9] 中引入的方法能够在各种 NLP 分类任务中提高准确度且降低错误率。 




参考文献:


[1] Improving the way we work with learning rate.

[2] The Cyclical Learning Rate technique.

[3] Transfer Learning using differential learning rates.

[4] Leslie N. Smith. Cyclical Learning Rates for Training Neural Networks.

[5] Estimating an Optimal Learning Rate for a Deep Neural Network

[6] Stochastic Gradient Descent with Warm Restarts

[7] Optimization for Deep Learning Highlights in 2017

[8] Lesson 1 Notebook, fast.ai Part 1 V2

[9] Fine-tuned Language Models for Text Classification


原文链接:http://ift.tt/2Bokr08

]]> 原文: http://ift.tt/2nukuUh
RSS Feed

机器知心

IFTTT

LangChain 彻底重写:从开源副业到独角兽,一次“核心迁移”干到 12.5 亿估值 -InfoQ 每周精要No.899期

「每周精要」 NO. 899 2025/10/25 头条 HEADLINE LangChain 彻底重写:从开源副业到独角兽,一次"核心迁移"干到 12.5 亿估值 精选 SELECTED 1000 行代码手搓 OpenAI gpt-oss 推理引...