整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

外贸人必收的6大类邮箱工具!手把手教你高效给客户发邮

外贸人必收的6大类邮箱工具!手把手教你高效给客户发邮件

贸人常常有个困惑,发出去的邮件为啥没反应?

到底是客户没收到邮件?还是收到了没看?还是看了没回?


又或者,我们拿到的这个邮箱地址本来就有问题?


以后再也不用在网上疯狂搜索攻略和工具了,我这里一次性给你整理好,收藏就对了,全网最全!



01

黑名单查询


如果自己家邮箱进了黑名单,那真得就不能怪客户没反应了,所以定期自查非常有必要。



MXToolbox


https://mxtoolbox.com/SuperTool.aspx?action=blacklist


MX tool box 是一个功能强大的检测工具,很多人在用,它可以通过解析输入的域名/IP地址/主机名来识别是否在黑名单中。

当然,其功能的全面性不仅仅局限在域名的黑历史检测方面,不过我们最关注的就是精心撰写的邮件能不能顺利送达对方邮箱,所以,这里主要介绍它核查黑名单的功能。

打开页面,在blacklist check栏,输入我的IP地址,点击表格右侧的blacklist,在一众的绿色OK前面,有一个红色的listed。

被录入了!咋回事?

这个SORBS SPAM是由GFI等公司赞助及发起的RBL组织,他们提供了一个DUHL(SORBS Dynamic User and Host List)的DUL列表。

因为国内大多数都是宽带包月的情况,电信服务商并未提供固定IP地址,以及没有更改WHOIS信息,造成了不少IP地址段都被列入SORBS的黑名单中。

当使用这些IP地址进行邮件发送时,如果对方服务器使用了DUL,那么会得到类似于“452 XXX.XXX.XXX.XXX RBL filtered by dul.dnsbl.sorbs.net”的信息。

真是不看不知道,有点冤,要怎么移出这个黑名单呢?

官方网站提供了移除DUHL的条件。

“The MX record of a domain needs to contain a host name that maps to the IP address involved. The Time to Live of the MX record needs to be at least 43200 seconds.(域名的MX记录包含一个主机名并指向IP地址。MX记录的存在时间至少需要43200秒)

The A record for the host name needs to have a TTL of at least 43200 seconds.(该域名A记录的TTL至少需要43200秒)

The reverse DNS PTR record for the IP address involved needs to map back to the name given in the MX record, and to have a TTL of at least 43200 seconds.(IP地址的反向解析记录必须指向所给出的MX记录,且TTL至少需要43200秒)”

好的,根据以上的条件做好你的DNS记录更改(如何更改请自行搜索解决,不展开),然后尝试一下申诉。

以下为申诉流程:

打开网页:

http://www.au.sorbs.net/lookup.shtml


在输入栏内输入IP地址,方便起见我们选择Search all listing types,输入验证码之后,我们点击Check Entry进行查询。


因为SORBS一般将某个网段的地址都列入黑名单,申诉的成功机会不是很大,我们还可以访问http://dnsbl.sorbs.net/提交一份申诉邮件,内容尽量诚恳,但是可能要一个月的时间才可能等来回复。

而且,它是个出了名的钉子户,不太容易成功。不过有枣没枣,先打两杆子试试。



SPAMHAUS


https://check.spamhaus.org/

这也是国内邮箱非常容易踩到的坑,安全起见,我们需要通过它定期检验下邮箱地址或域名是否在黑名单中。

为什么这么说呢?

因为SPAMHAUS是目前世界上影响最大的反垃圾邮件组织。被业内尊为影响最大的RBL(实时黑名单列表)服务提供商。

影响力有多大呢?只要被它列入黑名单,那我们的邮件服务器就算是废了,因为全球80%以上的服务器都会拒收里面邮件服务器发出的邮件。

他们提供四种类型XBL,SBL,PBL,CBL。国内有很多IP被列为了SPAMHAUS这几类PBL当中。

如果不幸被列入,也是可以申诉的,而且申诉的成功率不低。

点击红字下方的超链接,转到申诉页面,申请撤销你的IP地址,单击remove an IP from XXX(XXX为所在的黑名单类型),注意提示“turn on smtp authentication”,请复查你的邮件服务器中继和权限是否设置好。


输入请求释放的邮件服务器IP地址,接收确认信的电子邮件地址(一定要能正常收取邮件)及验证码,国家信息以及验证码。

注意查收上述填入的email邮箱,大约5分钟内会收到一封来自spamhaus的确认信,找到其中的确认码,填入后,即可等待解禁。spamhaus提示大约30分钟左右。一般情况下等待15分钟左右即可。

从spamhaus黑名单中释放后,并非一劳永逸,如果你的邮件服务器因保护不周,被用来大量发送垃圾邮件,或者你的邮件服务器公网地址段充斥着垃圾邮件服务器,那么还可能被再次列入spamhaus黑名单,所以,要定期检查,并注意排除被收录的因素。

但总体来说,这个黑名单比上面那个SORBS SPAM容易申诉多了。

其他可以检查黑名单的网站大同小异,这里不再展开:

  • http://cbl.abuseat.org/lookup.cgi
  • http://rbls.org/




02

通讯录管理工具



removebounce


https://removebounce.com/


这是一个垃圾邮箱、无效邮箱的自动检查、清除工具,如果你的通讯录庞大到超过一定数量或刚刚获取到一个几百甚至上千数量级的买家名单,可以考虑使用这个管理工具。


注册成功后有50个免费验证额度,阶梯付费功能,5美金可以验证1500个,验证结果显示为unkown的不收费。






03

邮箱有效性验证工具



emailable


https://emailable.com/


这个验证工具的原理是通过连接邮件服务器,检查邮箱是否存在。注册成功后有250个免费额度,超过后需要付费。


此外它还提供升级功能,包括防止邮件退回或被拉黑名单,自动同步邮件状态监控数据,黑名单监控和检测等打包升级功能,当然,价格也更贵。



不过还有其他很多验证邮箱的工具,功能大同小异,一个免费额度用完以后可以换下一个注册使用,看个人喜好挑选。


  • https://verify-email.org/
  • https://www.verifyemailaddress.org/
  • http://mailtester.com/
  • https://hunter.io/email-verifier


04

邮件内容完善工具


邮件模板大全


https://goodemailcopy.com/

一个外贸新手必备的邮件模板工具,它能提供各大知名企业的各种类型的邮件模板供你参考。

提供按主题搜索功能,跟进,确认,通知,产品更新,价格调整,致歉等主题内容一应俱全。

在没有形成自己的表达风格以前,外贸人可以多看看这些大企业的现成邮件模板,模仿下地道又简练的表达,有的甚至可以拿过来简单改改,轻松实现与客户的高效沟通。

这里再提供一个免费获取邮件模板的思路,到国外英语母语国家的商业网站,或者服务提供商发意向询盘,记得留下邮件地址。如果他们认为你是质量不错的潜在客户,将不断给你发跟进邮件试图转化你。

此时,他们发来的邮件的结构,话术,表达思路甚至逼单技巧都是我们可以参考的,有时候把产品信息代入,其他不改,就是一封地道的开发信。


临时邮箱


http://mail.bccto.me/

当我们想要注册网站获取上述工具的免费额度,又不想暴露自己真实邮箱的时候,这个就非常好用。

还有就是收到买家发的询盘带附件拿不准的时候,也可以用临时邮箱有效规避风险。

这种用来短暂接收邮件的临时邮箱,也称为一次性邮箱,按时效可以选10分钟、24小时邮箱。

还有获取一次性接收验证码的手机号的工具,这里不展开,有需要的自己想办法。


邮件签名美化工具


https://www.hubspot.com/email-signature-generator

一个好的邮件签名可以更全面地展示自己,让客户对你的专业和细致留下好感。销售在与客户接触的初期,第一印象非常重要,所以不要忽略这些细枝末节的信息。

如果咱们公司没有对邮件签名有统一的设计或要求,这里可以找到你喜欢的邮件签名,各种模板任君挑选。


05

邮件追踪工具


didtheyreadit


http://www.didtheyreadit.com

当我们排除了黑名单的限制,优化了邮件内容,接下来就是监测和追踪邮件的状态了。

这些工具不需要科学上网即可打开。根据流程下载注册后,系统会自动通知你的邮件何时被打开,其打开时间多久,在哪里打开的(地理位置)。

每个月可免费追踪10封以内的邮件,超过了就需要付费了,有需要的可以去看看网站的报价,不想花钱也可以继续往下看,换一个工具。


免费额度用完后,不想花钱咱就再换一个,市场上竞品很多,功能大同小异,轮流薅它们的羊毛吧:


  • https://whoreadme.com/
  • https://readnotify.com/
  • https://www.getnotify.com/
  • http://www.ifread.com
  • http://www.wasmyemailread.com



06

邮件监控工具



mailcharts


https://www.mailcharts.com.


这是一款监控并扒光竞争对手的邮件营销策略工具,可以监控目标品牌的邮件内容,可以查看竞争对手邮件的发送时间、内容、源文件,并提供下载和转发功能。



Mailcharts 提供免费版本,免费版本可以同时跟踪3个公司,可以查看免费邮件模版。但无法查看邮件的具体效果报告,无法查看Email Journeys。收费版本可以说还是比较贵的,初级版本是/月。


还提供各种主题的几千个邮件模板,可免费下载。


如果你的产品对C端也做营销,这是一个不能错过的好工具。




虽然社媒软件已经非常普及了,但在获取到客户的各种联系信息之后,开发信依然是外贸业务不可或缺的破冰工具,希望大家能充分利用上述这些工具,提高开发效率,周周开单!

rrayList 对象是包含单个数据值的项目的集合。


ArrayList DropDownList

ArrayList RadioButtonList


创建 ArrayList

ArrayList 对象是包含单个数据值的项目的集合。

通过 Add() 方法向 ArrayList 添加项目。

下面的代码创建了一个名为 mycountries 的 ArrayList 对象,并添加了四个项目:

<script runat="server">

Sub Page_Load

if Not Page.IsPostBack then

dim mycountries=New ArrayList

mycountries.Add("Norway")

mycountries.Add("Sweden")

mycountries.Add("France")

mycountries.Add("Italy")

end if

end sub

</script>

在默认情况下,一个 ArrayList 对象包含 16 个条目。可通过 TrimToSize() 方法把 ArrayList 调整为最终尺寸:

<script runat="server">

Sub Page_Load

if Not Page.IsPostBack then

dim mycountries=New ArrayList

mycountries.Add("Norway")

mycountries.Add("Sweden")

mycountries.Add("France")

mycountries.Add("Italy")

mycountries.TrimToSize()

end if

end sub

</script>

通过 Sort() 方法,ArrayList 也能够按照字母顺序或者数字顺序进行排序:

<script runat="server">

Sub Page_Load

if Not Page.IsPostBack then

dim mycountries=New ArrayList

mycountries.Add("Norway")

mycountries.Add("Sweden")

mycountries.Add("France")

mycountries.Add("Italy")

mycountries.TrimToSize()

mycountries.Sort()

end if

end sub

</script>

要实现反向排序,请在 Sort() 方法后应用 Reverse() 方法:

<script runat="server">

Sub Page_Load

if Not Page.IsPostBack then

dim mycountries=New ArrayList

mycountries.Add("Norway")

mycountries.Add("Sweden")

mycountries.Add("France")

mycountries.Add("Italy")

mycountries.TrimToSize()

mycountries.Sort()

mycountries.Reverse()

end if

end sub

</script>


绑定数据到 ArrayList

ArrayList 对象可为下列的控件自动生成文本和值:

  • asp:RadioButtonList

  • asp:CheckBoxList

  • asp:DropDownList

  • asp:Listbox

为了绑定数据到 RadioButtonList 控件,首先要在 .aspx 页面中创建一个 RadioButtonList 控件(不带任何 asp:ListItem 元素):

<html>

<body>

<form runat="server">

<asp:RadioButtonList id="rb" runat="server" />

</form>

</body>

</html>

然后添加创建列表的脚本,并且绑定列表中的值到 RadioButtonList 控件:

实例

<script runat="server">

Sub Page_Load

if Not Page.IsPostBack then

dim mycountries=New ArrayList

mycountries.Add("Norway")

mycountries.Add("Sweden")

mycountries.Add("France")

mycountries.Add("Italy")

mycountries.TrimToSize()

mycountries.Sort()

rb.DataSource=mycountries

rb.DataBind()

end if

end sub

</script>

<html>

<body>

<form runat="server">

<asp:RadioButtonList id="rb" runat="server" />

</form>

</body>

</html>

演示实例 ?

RadioButtonList 控件的 DataSource 属性被设置为该 ArrayList,它定义了这个 RadioButtonList 控件的数据源。RadioButtonList 控件的 DataBind() 方法把 RadioButtonList 控件与数据源绑定在一起。

注释:数据值作为控件的 Text 和 Value 属性来使用。如需添加不同于 Text 的 Value,请使用 Hashtable 对象或者 SortedList 对象。

器之心专栏

机器之心编辑部

一文梳理腾讯 QQ 浏览器 2021AI 算法大赛冠军方案。

历时两个多月的腾讯 QQ 浏览器 2021AI 算法大赛 [9] 已经告一段落,大赛自 2021 年 8 月 15 日启动以来,受到了全球 AI 算法爱好者及业界的广泛关注。整个赛程历时 68 天,覆盖全球 279 个城市,共吸引来自 276 个不同高校、企业和社会的算法精英 1853 人,组成 852 支队伍参赛,其中进入决赛的 TOP 20 队伍就涵盖了北京大学、清华大学、复旦大学、香港科技大学、中科院大学、华南理工大学、浙江大学、西安交大、中山大学、西安电子科技大学等顶尖院校,也有来自德国、加拿大等国际高校的学生,期间共完成了近 7000 次提交。

腾讯 QQ 浏览器为优秀参赛团队提供价值共计 41.7 万人民币的总奖池,除此之外每个赛道前 15 名队伍将会额外收获校招直通复试卡,前 8 名队伍可获得 QQ 浏览器实习生直通终面卡。

首届 AI 算法大赛议题设置 “多模态视频相似度” 和“自动超参数优化”两大赛道,以下为 “自动超参数优化” 赛道冠军团队,来自北京大学的队伍 PKU-DAIR 的方案分享。(PKU-DAIR 队成员:姜淮钧、沈彧、黎洋

团队介绍

PKU-DAIR 团队的三位成员来自北京大学崔斌教授 DAIR 实验室的 AutoML 自动化机器学习项目组。团队研究方向包括超参数优化(HPO)、神经网络结构搜索(NAS)、自动化机器学习系统(AutoML System)等。团队不仅在国际顶级会议上发表了多篇论文,为提高 AutoML 技术的易用性与可用性,团队还相继在 GitHub 开源了黑盒优化系统 OpenBox[1][7]、自动化机器学习系统 MindWare[2][8]等。

在本次自动化超参数优化赛道中,团队基于实验室自研开源黑盒优化系统 OpenBox 进行调参。初赛时使用 OpenBox 系统中的并行贝叶斯优化(Bayesian optimization)算法,决赛在初赛基础上加入早停机制。比赛代码已在 Github 上开源[3]。下面将进行详细介绍。

  • Rank 1st 比赛代码开源地址:https://github.com/PKU-DAIR/2021_AIAC_Task2_1st
  • 黑盒优化系统 OpenBox 地址:https://github.com/PKU-DAIR/open-box

初赛算法介绍

赛题理解

在信息流推荐业务场景中普遍存在模型或策略效果依赖于 “超参数” 的问题,而“超参数 " 的设定往往依赖人工经验调参,不仅效率低下维护成本高,而且难以实现更优效果。因此,本次赛题以超参数优化为主题,从真实业务场景问题出发,并基于脱敏后的数据集来评测各个参赛队伍的超参数优化算法。

参赛者需要提交超参数生成的算法代码,算法每一轮需要提供一组超参数,裁判程序会返回超参数对应的 reward。参赛者的算法要求在限定的迭代轮次和时间内,找到 reward 尽可能大的一组超参数,最终按照找到的最大 reward 来计算排名。

针对该赛题,优化器需要在每轮以同步并行方式推荐 5 个超参数配置,共执行 20 轮推荐,即总共搜索 100 个超参数配置。对每个超参数配置均执行完整资源的验证,并且在比赛的问题抽象中,不同超参数的验证时间相同。

根据现有研究,贝叶斯优化是超参数优化(黑盒优化)问题上 SOTA 的方法,而且比赛场景中的超参数空间维度不超过 6 维,并非超高维问题,较适合贝叶斯优化方法,因此我们选定贝叶斯优化作为初赛的搜索算法。另外,问题中所有的超参数均为连续型(离散浮点型)超参数,这决定了我们的超参数空间定义方法、贝叶斯优化代理模型以及优化器的选择,接下来也将分别进行介绍。

算法核心技术——贝叶斯优化模块介绍

贝叶斯优化简介

超参数优化是典型的黑盒优化问题,即对于目标函数(超参数 - 奖励函数),具体表达式或导数信息是不可知的,只能通过尝试输入获取输出来推测目标函数的内部情况。

贝叶斯优化是解决黑盒优化问题的一个迭代式框架,优化流程包括如下步骤:

  1. 使用代理模型(surrogate model)对已有观测历史数据(尝试过的超参数和对应的奖励)进行建模拟合;
  2. 使用采集函数(acquisition function)评估搜索空间内的超参数,平衡探索与利用。对采集函数执行优化,找到验证价值最大(使采集函数值最大)的下一组超参数;
  3. 在目标函数上评估超参数,得到奖励;
  4. 将新评估的超参数和结果加入观测历史数据,重复以上步骤。

注:以下代码分为文字版和图示版,代码以图示版为准。

贝叶斯优化算法封装在 OpenBox 系统中,代码实现的主要流程如下:

# 使用贝叶斯优化得到超参数配置推荐
def get_suggestions(self, history_container, batch_size):
    # ...
    # 基于观测历史数据,训练贝叶斯优化代理模型
    self.surrogate_model.train(X, Y)
    # ...
    # 更新采集函数(使用EI函数时,要更新当前最优观测值)
    self.acquisition_function.update(eta=incumbent_value, ...)
    # 使用优化器优化采集函数,得到使采集函数值最大的一个(一组)超参数
    challengers=self.optimizer.maximize(...)
    # ...
    return batch_configs_list  # 依据并行算法,得到下一轮需要验证的超参数

代码以图示为准

超参数空间定义

首先,我们使用 ConfigSpace 库 [4] 定义超参数空间。由于赛题中的超参数均为离散浮点型,并可近似为等间距分布,因此使用 Int 型定义超参数(本质上和使用 Float 定义相同,但避免了赛题中超参数取值范围边缘可能出现不同间距的问题)。在 ConfigSpace 库中,Float 型和 Int 型超参数均被视作连续型,在执行优化时会自动将参数范围缩放至[0, 1]。

初始化方法

贝叶斯优化需要一定数量的历史数据才能启动,我们使用了一种贪心法生成初始超参数配置。该方法从随机候选配置中,逐步挑选距离已有配置最远的配置加入初始配置集合。使用该方法进行初始化能更好地探索超参数空间,经测试效果稍好于完全随机初始化方法。初始化配置数设置为 10 个。该方法集成在 OpenBox 系统中,可通过 init_strategy="random_explore_first" 调用。

代理模型

贝叶斯优化中的代理模型(surrogate model)有多种选择,包括高斯过程(Gaussian process)、概率随机森林(probabilistic random forest)、Tree Parzen Estimator(TPE)等,其中高斯过程在连续超参数空间上(如数学问题)优化效果较好,概率随机森林在含有分类超参数的空间上优化效果较好。本次比赛只包含连续型超参数,经测试,高斯过程作为代理模型效果最好。高斯过程使用 OpenBox 系统默认的 Matern5/2 核,核超参数通过最大似然 (maximize log likelihood) 得到。

采集函数与优化

我们使用常用的 Expected Improvement(EI)函数作为贝叶斯优化的采集函数(acquisition function)。在优化采集函数时,我们使用系统中的 "random_scipy" 优化器。该优化器在结合局部搜索与随机采样的基础上,使用 L-BFGS-B 算法对采集函数执行优化。测试表明,相较于单纯使用随机采样,该方法能对采集函数进行更为充分的优化,从而更大程度发挥 GP 模型和 EI 函数的潜能。

其他

传统的贝叶斯优化每轮只能推荐一个超参数配置,因此设计并行推荐方法是一个值得考虑的问题。我们尝试了系统中实现的并行贝叶斯方法,包括 "median_imputation" 中位数插补法,即使用历史观察结果的中位数,填补并行 batch 中推荐配置的性能,重新训练代理模型并得到下一个并行推荐配置,以及 "local_penalization" 局部惩罚法,对并行已推荐配置在采集函数上施加局部惩罚,这两种方法的目的都是提高对超参数空间的探索性。不过经过测试,在本次比赛问题上这些方法的效果不佳,最终我们采用多次优化采集函数并去重的方式执行并行推荐,达到了较好的性能。

此外,为增大贝叶斯优化的探索性,保证算法收敛,我们设置每次推荐时使用随机搜索的概率为 0.1。

代码实现

初赛代码仅需调用 OpenBox 系统中的并行贝叶斯优化器 SyncBatchAdvisor,即可实现上述功能:

from openbox import SyncBatchAdvisor
self.advisor=SyncBatchAdvisor(
    config_space=self.config_space,
    batch_size=5,
    batch_strategy='reoptimization',
    initial_trials=10,
    init_strategy='random_explore_first',
    rand_prob=0.1,
    surrogate_type='gp',
    acq_type='ei',
    acq_optimizer_type='random_scipy',
    task_id='thpo',
    random_state=47,
)

代码以图示为准

每轮执行推荐时,调用 advisor 的 get_suggestions 接口:

def suggest(self, suggestion_history, n_suggestions):
    history_container=self.parse_suggestion_history(suggestion_history)
    next_configs=self.advisor.get_suggestions(n_suggestions, history_container)
    next_suggestions=[self.convert_config_to_parameter(conf) for conf in next_configs]
    return next_suggestions

代码以图示为准

决赛算法介绍

赛题理解

决赛问题在初赛的基础上,对每个超参数配置提供 14 轮的多精度验证结果,供算法提前对性能可能不佳的配置验证过程执行早停。同时,总体优化预算时间减半,最多只能全量验证 50 个超参数配置,因此问题难度大大增加。如何设计好的早停算法,如何利用多精度验证数据是优化器设计的关键。

我们对本地公开的两个数据集进行了探索,发现了一些有趣的性质:

  • 对于任意超参数配置,其第 14 轮的奖励均值位于前 13 轮置信区间内的概率为 95%。
  • 对于任意超参数配置,其前 13 轮中任意一轮的均值比第 14 轮均值大的概率为 50%。
  • 对于任意超参数配置,其 14 轮的置信区间是不断减小的,但均值曲线是任意波动的。

我们也对两两超参数配置间的关系进行了探索,比较了两两配置间前 13 轮的均值大小关系和第 14 轮的均值大小关系的一致性,发现:

  • 在所有超参数配置之间,部分验证(1-13 轮)和全量验证(14 轮)均值大小关系一致的概率大于 95%。
  • 在空间中最终性能前 1% 的超参数配置之间,这种一致性大约在 50% 到 70% 之间。

下图为 data-30 空间中最终奖励排名前 2 的超参数和随机 8 个超参数的奖励 - 轮次关系:

图:data-30 搜索空间中 2 个最好配置和 8 个随机配置的奖励 - 轮数曲线,包含置信上界(蓝色)、均值(红色)、置信下界(绿色)曲线。

我们在比赛开源代码仓库中提供了上述 “数据探索” 代码。

上述数据探索结果表明,根据前 13 轮的置信区间,我们可以推测第 14 轮奖励均值的位置。利用前 13 轮的均值大小关系,我们可以估计第 14 轮最终均值的大小关系,但是由于数据噪音的存在,排名靠前的超参数配置大小关系无法通过部分验证结果预估。由此我们设计了两种早停算法,分别是基于置信区间的早停和基于排名的早停,将在下一部分详细描述。

过于激进的早停策略在比赛中仍然存在问题。如果使用贝叶斯优化只对全量验证数据建模,由于总体优化预算时间很少,早停会减少可用于建模的数据量,使得模型不能得到充分训练。为解决这一问题,我们引入插值方法,增加模型可训练数据。

基于以上考量,最终我们的决赛算法在初赛贝叶斯优化算法的基础上,前期执行完整贝叶斯优化使模型得到较为充分的拟合,后期使用早停技术与插值法,加速超参数验证与搜索过程。下面将对早停模块做详细介绍。

算法核心技术——早停模块介绍

早停方法

由于超参数配置之间的部分验证轮次均值大小关系与最终均值大小关系存在一定的相关性,我们受异步多阶段早停算法 ASHA[5]的启发,设计了基于排名的早停算法:一个超参数如果到达需要判断早停的轮次,就计算其性能均值处于历史中同一轮次的超参数性能均值的排名,如果位于前 1/eta,则继续验证,否则执行早停。

依据 95% 置信区间的含义,我们还设计了另一种早停方法,即使用置信区间判断当前超参数配置是否仍有验证价值。如果某一时刻,当前验证超参数的置信区间上界差于已完全验证的性能前 10 名配置的均值,则代表至少有 95% 的可能其最终均值差于前 10 名的配置,故进行早停。使用本地数据验证,以空间中前 50 名的配置对前 1000 名的配置使用该方法进行早停,早停准确率在 99% 以上。

经过测试,结合贝叶斯优化时两种方法效果近似,我们最终选择使用基于排名的早停方法。无论是哪种方法,都需要设计执行早停的轮次。早停越早越激进,节省的验证时间越多,但是得到的数据置信度越低,后续执行插值时训练的模型就越不准确。为了权衡早停带来的时间收益和高精度验证带来的数据收益,我们选择只在第 7 轮(总共 14 轮)时判断每个配置是否应当早停。早停判断准则依据 eta=2 的 ASHA 算法,即如果当前配置均值性能处于已验证配置第 7 轮的后 50%,就进行早停。

以下代码展示了基于排名的早停方法。首先统计各个早停轮次下已验证配置的性能并进行排序(比赛中我们使用早停轮次为第 7 轮),然后判断当前配置是否处于前 1/eta(比赛中为前 1/2),否则执行早停:

# 基于排名的早停方法,prune_eta=2,prune_iters=[7]
def prune_mean_rank(self, iteration_number, running_suggestions, suggestion_history):
    # 统计早停阶段上已验证配置的性能并排序
    bracket=dict()
    for n_iteration in self.hps['prune_iters']:
        bracket[n_iteration]=list()
    for suggestion in running_suggestions + suggestion_history:
        n_history=len(suggestion['reward'])
        for n_iteration in self.hps['prune_iters']:
            if n_history >=n_iteration:
                bracket[n_iteration].append(suggestion['reward'][n_iteration - 1]['value'])
    for n_iteration in self.hps['prune_iters']:
        bracket[n_iteration].sort(reverse=True)  # maximize
 
    # 依据当前配置性能排名,决定是否早停
    stop_list=[False] * len(running_suggestions)
    for i, suggestion in enumerate(running_suggestions):
        n_history=len(suggestion['reward'])
        if n_history==CONFIDENCE_N_ITERATION:
            # 当前配置已完整验证,无需早停
            print('full observation. pass', i)
            continue
        if n_history not in self.hps['prune_iters']:
            # 当前配置不处于需要早停的阶段
            print('n_history: %d not in prune_iters: %s. pass %d.'
                  % (n_history, self.hps['prune_iters'], i))
            continue
 
        rank=bracket[n_history].index(suggestion['reward'][-1]['value'])
        total_cnt=len(bracket[n_history])
        # 判断当前配置性能是否处于前1/eta,否则早停
        if rank / total_cnt >=1 / self.hps['prune_eta']:
            print('n_history: %d, rank: %d/%d, eta: 1/%s. PRUNE %d!'
                  % (n_history, rank, total_cnt, self.hps['prune_eta'], i))
            stop_list[i]=True
        else:
            print('n_history: %d, rank: %d/%d, eta: 1/%s. continue %d.'
                  % (n_history, rank, total_cnt, self.hps['prune_eta'], i))
    return stop_list

代码以图示为准

基于置信区间的早停方法可见我们的比赛开源代码库。

数据建模方法

对于贝叶斯优化的数据建模,我们尝试了多精度集成代理模型 MFES-HB[6]拟合多精度观测数据。该方法虽然能应对低精度噪声场景,但在决赛极其有限的优化时间限制内,可能无法快速排除噪声的干扰,导致效果不如仅使用最高精度数据建模。

我们最终选择只利用最高精度数据进行建模。为了弥补早停造成的高精度数据损失,我们引入插值方法,增加用于模型训练的数据量,具体来说,就是对早停的配置,设置一个完整验证时的性能均值,插入优化历史执行建模。对于插入值的选取,我们使用已完整验证配置的最终均值中位数进行插值。

以下为插值代码示例:

def set_impute_value(self, running_suggestions, suggestion_history):
    value_list=[]
    for suggestion in running_suggestions + suggestion_history:
        n_history=len(suggestion['reward'])
        if n_history !=CONFIDENCE_N_ITERATION:
            continue
        value_list.append(suggestion['reward'][-1]['value'])
    self.impute_value=np.median(value_list).item()


代码以图示为准

总结

本文介绍了自动化超参数优化赛道的冠军方案,包括贝叶斯优化算法和早停方法。很幸运能够拿到此次比赛的冠军。感谢赛事主办方为我们提供了富有现实意义的比赛场景,让我们积累了宝贵的比赛经验和超参数优化实际经验。希望我们的分享能够对大家有所帮助。

引用

[1] 黑盒优化系统 OpenBox

https://github.com/PKU-DAIR/open-box

[2] 自动化机器学习系统 MindWare

https://github.com/PKU-DAIR/mindware

[3] 比赛冠军源码

https://github.com/PKU-DAIR/2021_AIAC_Task2_1st

[4] https://github.com/automl/ConfigSpace

[5] Liam Li, Kevin Jamieson, Afshin Rostamizadeh, Ekaterina Gonina, Jonathan Bentzur, Moritz Hardt, Benjamin Recht, and Ameet Talwalkar. 2020. A System for Massively Parallel Hyperparameter Tuning. Proceedings of Machine Learning and Systems 2 (2020), 230–246.

[6] Yang Li, Yu Shen, Jiawei Jiang, Jinyang Gao, Ce Zhang, and Bin Cui. 2021. MFES-HB: Efficient Hyperband with Multi-Fidelity Quality Measurements. In Proceedings of the AAAI Conference on Artificial Intelligence, Vol. 35. 8491–8500.

[7] Yang Li, Yu Shen, Wentao Zhang, Yuanwei Chen, Huaijun Jiang, Mingchao Liu, Jiawei Jiang, Jinyang Gao, Wentao Wu, Zhi Yang, Ce Zhang, and Bin Cui. 2021. OpenBox: A Generalized Black-box Optimization Service. Proceedings of the 27th ACM SIGKDD Conference on Knowledge Discovery & Data Mining (2021).

[8] Yang Li, Yu Shen, Wentao Zhang, Jiawei Jiang, Bolin Ding, Yaliang Li, Jingren Zhou, Zhi Yang, Wentao Wu, Ce Zhang, and Bin Cui. 2021. VolcanoML: Speeding up End-to-End AutoML via Scalable Search Space Decomposition. Proceedings of VLDB Endowment 14 (2021), 2167–2176.

[9]QQ 浏览器 2021AI 算法大赛

https://algo.browser.qq.com/