貿(mào)人常常有個(gè)困惑,發(fā)出去的郵件為啥沒反應(yīng)?
到底是客戶沒收到郵件?還是收到了沒看?還是看了沒回?
又或者,我們拿到的這個(gè)郵箱地址本來就有問題?
以后再也不用在網(wǎng)上瘋狂搜索攻略和工具了,我這里一次性給你整理好,收藏就對(duì)了,全網(wǎng)最全!
01
黑名單查詢
如果自己家郵箱進(jìn)了黑名單,那真得就不能怪客戶沒反應(yīng)了,所以定期自查非常有必要。
https://mxtoolbox.com/SuperTool.aspx?action=blacklist
MX tool box 是一個(gè)功能強(qiáng)大的檢測(cè)工具,很多人在用,它可以通過解析輸入的域名/IP地址/主機(jī)名來識(shí)別是否在黑名單中。
當(dāng)然,其功能的全面性不僅僅局限在域名的黑歷史檢測(cè)方面,不過我們最關(guān)注的就是精心撰寫的郵件能不能順利送達(dá)對(duì)方郵箱,所以,這里主要介紹它核查黑名單的功能。
打開頁面,在blacklist check欄,輸入我的IP地址,點(diǎn)擊表格右側(cè)的blacklist,在一眾的綠色OK前面,有一個(gè)紅色的listed。
被錄入了!咋回事?
這個(gè)SORBS SPAM是由GFI等公司贊助及發(fā)起的RBL組織,他們提供了一個(gè)DUHL(SORBS Dynamic User and Host List)的DUL列表。
因?yàn)閲鴥?nèi)大多數(shù)都是寬帶包月的情況,電信服務(wù)商并未提供固定IP地址,以及沒有更改WHOIS信息,造成了不少IP地址段都被列入SORBS的黑名單中。
當(dāng)使用這些IP地址進(jìn)行郵件發(fā)送時(shí),如果對(duì)方服務(wù)器使用了DUL,那么會(huì)得到類似于“452 XXX.XXX.XXX.XXX RBL filtered by dul.dnsbl.sorbs.net”的信息。
真是不看不知道,有點(diǎn)冤,要怎么移出這個(gè)黑名單呢?
官方網(wǎng)站提供了移除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記錄包含一個(gè)主機(jī)名并指向IP地址。MX記錄的存在時(shí)間至少需要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秒)”
好的,根據(jù)以上的條件做好你的DNS記錄更改(如何更改請(qǐng)自行搜索解決,不展開),然后嘗試一下申訴。
以下為申訴流程:
打開網(wǎng)頁:
http://www.au.sorbs.net/lookup.shtml
在輸入欄內(nèi)輸入IP地址,方便起見我們選擇Search all listing types,輸入驗(yàn)證碼之后,我們點(diǎn)擊Check Entry進(jìn)行查詢。
因?yàn)镾ORBS一般將某個(gè)網(wǎng)段的地址都列入黑名單,申訴的成功機(jī)會(huì)不是很大,我們還可以訪問http://dnsbl.sorbs.net/提交一份申訴郵件,內(nèi)容盡量誠懇,但是可能要一個(gè)月的時(shí)間才可能等來回復(fù)。
而且,它是個(gè)出了名的釘子戶,不太容易成功。不過有棗沒棗,先打兩桿子試試。
SPAMHAUS
https://check.spamhaus.org/
這也是國內(nèi)郵箱非常容易踩到的坑,安全起見,我們需要通過它定期檢驗(yàn)下郵箱地址或域名是否在黑名單中。
為什么這么說呢?
因?yàn)镾PAMHAUS是目前世界上影響最大的反垃圾郵件組織。被業(yè)內(nèi)尊為影響最大的RBL(實(shí)時(shí)黑名單列表)服務(wù)提供商。
影響力有多大呢?只要被它列入黑名單,那我們的郵件服務(wù)器就算是廢了,因?yàn)槿?0%以上的服務(wù)器都會(huì)拒收里面郵件服務(wù)器發(fā)出的郵件。
他們提供四種類型XBL,SBL,PBL,CBL。國內(nèi)有很多IP被列為了SPAMHAUS這幾類PBL當(dāng)中。
如果不幸被列入,也是可以申訴的,而且申訴的成功率不低。
點(diǎn)擊紅字下方的超鏈接,轉(zhuǎn)到申訴頁面,申請(qǐng)撤銷你的IP地址,單擊remove an IP from XXX(XXX為所在的黑名單類型),注意提示“turn on smtp authentication”,請(qǐng)復(fù)查你的郵件服務(wù)器中繼和權(quán)限是否設(shè)置好。
輸入請(qǐng)求釋放的郵件服務(wù)器IP地址,接收確認(rèn)信的電子郵件地址(一定要能正常收取郵件)及驗(yàn)證碼,國家信息以及驗(yàn)證碼。
注意查收上述填入的email郵箱,大約5分鐘內(nèi)會(huì)收到一封來自spamhaus的確認(rèn)信,找到其中的確認(rèn)碼,填入后,即可等待解禁。spamhaus提示大約30分鐘左右。一般情況下等待15分鐘左右即可。
從spamhaus黑名單中釋放后,并非一勞永逸,如果你的郵件服務(wù)器因保護(hù)不周,被用來大量發(fā)送垃圾郵件,或者你的郵件服務(wù)器公網(wǎng)地址段充斥著垃圾郵件服務(wù)器,那么還可能被再次列入spamhaus黑名單,所以,要定期檢查,并注意排除被收錄的因素。
但總體來說,這個(gè)黑名單比上面那個(gè)SORBS SPAM容易申訴多了。
其他可以檢查黑名單的網(wǎng)站大同小異,這里不再展開:
02
通訊錄管理工具
removebounce
https://removebounce.com/
這是一個(gè)垃圾郵箱、無效郵箱的自動(dòng)檢查、清除工具,如果你的通訊錄龐大到超過一定數(shù)量或剛剛獲取到一個(gè)幾百甚至上千數(shù)量級(jí)的買家名單,可以考慮使用這個(gè)管理工具。
注冊(cè)成功后有50個(gè)免費(fèi)驗(yàn)證額度,階梯付費(fèi)功能,5美金可以驗(yàn)證1500個(gè),驗(yàn)證結(jié)果顯示為unkown的不收費(fèi)。
03
郵箱有效性驗(yàn)證工具
emailable
https://emailable.com/
這個(gè)驗(yàn)證工具的原理是通過連接郵件服務(wù)器,檢查郵箱是否存在。注冊(cè)成功后有250個(gè)免費(fèi)額度,超過后需要付費(fèi)。
此外它還提供升級(jí)功能,包括防止郵件退回或被拉黑名單,自動(dòng)同步郵件狀態(tài)監(jiān)控?cái)?shù)據(jù),黑名單監(jiān)控和檢測(cè)等打包升級(jí)功能,當(dāng)然,價(jià)格也更貴。
不過還有其他很多驗(yàn)證郵箱的工具,功能大同小異,一個(gè)免費(fèi)額度用完以后可以換下一個(gè)注冊(cè)使用,看個(gè)人喜好挑選。
04
郵件內(nèi)容完善工具
郵件模板大全
https://goodemailcopy.com/
一個(gè)外貿(mào)新手必備的郵件模板工具,它能提供各大知名企業(yè)的各種類型的郵件模板供你參考。
提供按主題搜索功能,跟進(jìn),確認(rèn),通知,產(chǎn)品更新,價(jià)格調(diào)整,致歉等主題內(nèi)容一應(yīng)俱全。
在沒有形成自己的表達(dá)風(fēng)格以前,外貿(mào)人可以多看看這些大企業(yè)的現(xiàn)成郵件模板,模仿下地道又簡練的表達(dá),有的甚至可以拿過來簡單改改,輕松實(shí)現(xiàn)與客戶的高效溝通。
這里再提供一個(gè)免費(fèi)獲取郵件模板的思路,到國外英語母語國家的商業(yè)網(wǎng)站,或者服務(wù)提供商發(fā)意向詢盤,記得留下郵件地址。如果他們認(rèn)為你是質(zhì)量不錯(cuò)的潛在客戶,將不斷給你發(fā)跟進(jìn)郵件試圖轉(zhuǎn)化你。
此時(shí),他們發(fā)來的郵件的結(jié)構(gòu),話術(shù),表達(dá)思路甚至逼單技巧都是我們可以參考的,有時(shí)候把產(chǎn)品信息代入,其他不改,就是一封地道的開發(fā)信。
臨時(shí)郵箱
http://mail.bccto.me/
當(dāng)我們想要注冊(cè)網(wǎng)站獲取上述工具的免費(fèi)額度,又不想暴露自己真實(shí)郵箱的時(shí)候,這個(gè)就非常好用。
還有就是收到買家發(fā)的詢盤帶附件拿不準(zhǔn)的時(shí)候,也可以用臨時(shí)郵箱有效規(guī)避風(fēng)險(xiǎn)。
這種用來短暫接收郵件的臨時(shí)郵箱,也稱為一次性郵箱,按時(shí)效可以選10分鐘、24小時(shí)郵箱。
還有獲取一次性接收驗(yàn)證碼的手機(jī)號(hào)的工具,這里不展開,有需要的自己想辦法。
郵件簽名美化工具
https://www.hubspot.com/email-signature-generator
一個(gè)好的郵件簽名可以更全面地展示自己,讓客戶對(duì)你的專業(yè)和細(xì)致留下好感。銷售在與客戶接觸的初期,第一印象非常重要,所以不要忽略這些細(xì)枝末節(jié)的信息。
如果咱們公司沒有對(duì)郵件簽名有統(tǒng)一的設(shè)計(jì)或要求,這里可以找到你喜歡的郵件簽名,各種模板任君挑選。
05
郵件追蹤工具
didtheyreadit
http://www.didtheyreadit.com
當(dāng)我們排除了黑名單的限制,優(yōu)化了郵件內(nèi)容,接下來就是監(jiān)測(cè)和追蹤?quán)]件的狀態(tài)了。
這些工具不需要科學(xué)上網(wǎng)即可打開。根據(jù)流程下載注冊(cè)后,系統(tǒng)會(huì)自動(dòng)通知你的郵件何時(shí)被打開,其打開時(shí)間多久,在哪里打開的(地理位置)。
每個(gè)月可免費(fèi)追蹤10封以內(nèi)的郵件,超過了就需要付費(fèi)了,有需要的可以去看看網(wǎng)站的報(bào)價(jià),不想花錢也可以繼續(xù)往下看,換一個(gè)工具。
免費(fèi)額度用完后,不想花錢咱就再換一個(gè),市場(chǎng)上競(jìng)品很多,功能大同小異,輪流薅它們的羊毛吧:
06
郵件監(jiān)控工具
mailcharts
https://www.mailcharts.com.
Mailcharts 提供免費(fèi)版本,免費(fèi)版本可以同時(shí)跟蹤3個(gè)公司,可以查看免費(fèi)郵件模版。但無法查看郵件的具體效果報(bào)告,無法查看Email Journeys。收費(fèi)版本可以說還是比較貴的,初級(jí)版本是/月。
還提供各種主題的幾千個(gè)郵件模板,可免費(fèi)下載。
如果你的產(chǎn)品對(duì)C端也做營銷,這是一個(gè)不能錯(cuò)過的好工具。
雖然社媒軟件已經(jīng)非常普及了,但在獲取到客戶的各種聯(lián)系信息之后,開發(fā)信依然是外貿(mào)業(yè)務(wù)不可或缺的破冰工具,希望大家能充分利用上述這些工具,提高開發(fā)效率,周周開單!
rrayList 對(duì)象是包含單個(gè)數(shù)據(jù)值的項(xiàng)目的集合。
ArrayList DropDownList
ArrayList RadioButtonList
創(chuàng)建 ArrayList
ArrayList 對(duì)象是包含單個(gè)數(shù)據(jù)值的項(xiàng)目的集合。
通過 Add() 方法向 ArrayList 添加項(xiàng)目。
下面的代碼創(chuàng)建了一個(gè)名為 mycountries 的 ArrayList 對(duì)象,并添加了四個(gè)項(xiàng)目:
<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>
在默認(rèn)情況下,一個(gè) ArrayList 對(duì)象包含 16 個(gè)條目。可通過 TrimToSize() 方法把 ArrayList 調(diào)整為最終尺寸:
<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 也能夠按照字母順序或者數(shù)字順序進(jìn)行排序:
<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>
要實(shí)現(xiàn)反向排序,請(qǐng)?jiān)?Sort() 方法后應(yīng)用 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>
綁定數(shù)據(jù)到 ArrayList
ArrayList 對(duì)象可為下列的控件自動(dòng)生成文本和值:
asp:RadioButtonList
asp:CheckBoxList
asp:DropDownList
asp:Listbox
為了綁定數(shù)據(jù)到 RadioButtonList 控件,首先要在 .aspx 頁面中創(chuàng)建一個(gè) RadioButtonList 控件(不帶任何 asp:ListItem 元素):
<html>
<body>
<form runat="server">
<asp:RadioButtonList id="rb" runat="server" />
</form>
</body>
</html>
然后添加創(chuàng)建列表的腳本,并且綁定列表中的值到 RadioButtonList 控件:
實(shí)例
<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>
演示實(shí)例 ?
RadioButtonList 控件的 DataSource 屬性被設(shè)置為該 ArrayList,它定義了這個(gè) RadioButtonList 控件的數(shù)據(jù)源。RadioButtonList 控件的 DataBind() 方法把 RadioButtonList 控件與數(shù)據(jù)源綁定在一起。
注釋:數(shù)據(jù)值作為控件的 Text 和 Value 屬性來使用。如需添加不同于 Text 的 Value,請(qǐng)使用 Hashtable 對(duì)象或者 SortedList 對(duì)象。
器之心專欄
機(jī)器之心編輯部
一文梳理騰訊 QQ 瀏覽器 2021AI 算法大賽冠軍方案。
歷時(shí)兩個(gè)多月的騰訊 QQ 瀏覽器 2021AI 算法大賽 [9] 已經(jīng)告一段落,大賽自 2021 年 8 月 15 日啟動(dòng)以來,受到了全球 AI 算法愛好者及業(yè)界的廣泛關(guān)注。整個(gè)賽程歷時(shí) 68 天,覆蓋全球 279 個(gè)城市,共吸引來自 276 個(gè)不同高校、企業(yè)和社會(huì)的算法精英 1853 人,組成 852 支隊(duì)伍參賽,其中進(jìn)入決賽的 TOP 20 隊(duì)伍就涵蓋了北京大學(xué)、清華大學(xué)、復(fù)旦大學(xué)、香港科技大學(xué)、中科院大學(xué)、華南理工大學(xué)、浙江大學(xué)、西安交大、中山大學(xué)、西安電子科技大學(xué)等頂尖院校,也有來自德國、加拿大等國際高校的學(xué)生,期間共完成了近 7000 次提交。
騰訊 QQ 瀏覽器為優(yōu)秀參賽團(tuán)隊(duì)提供價(jià)值共計(jì) 41.7 萬人民幣的總獎(jiǎng)池,除此之外每個(gè)賽道前 15 名隊(duì)伍將會(huì)額外收獲校招直通復(fù)試卡,前 8 名隊(duì)伍可獲得 QQ 瀏覽器實(shí)習(xí)生直通終面卡。
首屆 AI 算法大賽議題設(shè)置 “多模態(tài)視頻相似度” 和“自動(dòng)超參數(shù)優(yōu)化”兩大賽道,以下為 “自動(dòng)超參數(shù)優(yōu)化” 賽道冠軍團(tuán)隊(duì),來自北京大學(xué)的隊(duì)伍 PKU-DAIR 的方案分享。(PKU-DAIR 隊(duì)成員:姜淮鈞、沈彧、黎洋)
團(tuán)隊(duì)介紹
PKU-DAIR 團(tuán)隊(duì)的三位成員來自北京大學(xué)崔斌教授 DAIR 實(shí)驗(yàn)室的 AutoML 自動(dòng)化機(jī)器學(xué)習(xí)項(xiàng)目組。團(tuán)隊(duì)研究方向包括超參數(shù)優(yōu)化(HPO)、神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)搜索(NAS)、自動(dòng)化機(jī)器學(xué)習(xí)系統(tǒng)(AutoML System)等。團(tuán)隊(duì)不僅在國際頂級(jí)會(huì)議上發(fā)表了多篇論文,為提高 AutoML 技術(shù)的易用性與可用性,團(tuán)隊(duì)還相繼在 GitHub 開源了黑盒優(yōu)化系統(tǒng) OpenBox[1][7]、自動(dòng)化機(jī)器學(xué)習(xí)系統(tǒng) MindWare[2][8]等。
在本次自動(dòng)化超參數(shù)優(yōu)化賽道中,團(tuán)隊(duì)基于實(shí)驗(yàn)室自研開源黑盒優(yōu)化系統(tǒng) OpenBox 進(jìn)行調(diào)參。初賽時(shí)使用 OpenBox 系統(tǒng)中的并行貝葉斯優(yōu)化(Bayesian optimization)算法,決賽在初賽基礎(chǔ)上加入早停機(jī)制。比賽代碼已在 Github 上開源[3]。下面將進(jìn)行詳細(xì)介紹。
初賽算法介紹
賽題理解
在信息流推薦業(yè)務(wù)場(chǎng)景中普遍存在模型或策略效果依賴于 “超參數(shù)” 的問題,而“超參數(shù) " 的設(shè)定往往依賴人工經(jīng)驗(yàn)調(diào)參,不僅效率低下維護(hù)成本高,而且難以實(shí)現(xiàn)更優(yōu)效果。因此,本次賽題以超參數(shù)優(yōu)化為主題,從真實(shí)業(yè)務(wù)場(chǎng)景問題出發(fā),并基于脫敏后的數(shù)據(jù)集來評(píng)測(cè)各個(gè)參賽隊(duì)伍的超參數(shù)優(yōu)化算法。
參賽者需要提交超參數(shù)生成的算法代碼,算法每一輪需要提供一組超參數(shù),裁判程序會(huì)返回超參數(shù)對(duì)應(yīng)的 reward。參賽者的算法要求在限定的迭代輪次和時(shí)間內(nèi),找到 reward 盡可能大的一組超參數(shù),最終按照找到的最大 reward 來計(jì)算排名。
針對(duì)該賽題,優(yōu)化器需要在每輪以同步并行方式推薦 5 個(gè)超參數(shù)配置,共執(zhí)行 20 輪推薦,即總共搜索 100 個(gè)超參數(shù)配置。對(duì)每個(gè)超參數(shù)配置均執(zhí)行完整資源的驗(yàn)證,并且在比賽的問題抽象中,不同超參數(shù)的驗(yàn)證時(shí)間相同。
根據(jù)現(xiàn)有研究,貝葉斯優(yōu)化是超參數(shù)優(yōu)化(黑盒優(yōu)化)問題上 SOTA 的方法,而且比賽場(chǎng)景中的超參數(shù)空間維度不超過 6 維,并非超高維問題,較適合貝葉斯優(yōu)化方法,因此我們選定貝葉斯優(yōu)化作為初賽的搜索算法。另外,問題中所有的超參數(shù)均為連續(xù)型(離散浮點(diǎn)型)超參數(shù),這決定了我們的超參數(shù)空間定義方法、貝葉斯優(yōu)化代理模型以及優(yōu)化器的選擇,接下來也將分別進(jìn)行介紹。
算法核心技術(shù)——貝葉斯優(yōu)化模塊介紹
貝葉斯優(yōu)化簡介
超參數(shù)優(yōu)化是典型的黑盒優(yōu)化問題,即對(duì)于目標(biāo)函數(shù)(超參數(shù) - 獎(jiǎng)勵(lì)函數(shù)),具體表達(dá)式或?qū)?shù)信息是不可知的,只能通過嘗試輸入獲取輸出來推測(cè)目標(biāo)函數(shù)的內(nèi)部情況。
貝葉斯優(yōu)化是解決黑盒優(yōu)化問題的一個(gè)迭代式框架,優(yōu)化流程包括如下步驟:
注:以下代碼分為文字版和圖示版,代碼以圖示版為準(zhǔn)。
貝葉斯優(yōu)化算法封裝在 OpenBox 系統(tǒng)中,代碼實(shí)現(xiàn)的主要流程如下:
# 使用貝葉斯優(yōu)化得到超參數(shù)配置推薦
def get_suggestions(self, history_container, batch_size):
# ...
# 基于觀測(cè)歷史數(shù)據(jù),訓(xùn)練貝葉斯優(yōu)化代理模型
self.surrogate_model.train(X, Y)
# ...
# 更新采集函數(shù)(使用EI函數(shù)時(shí),要更新當(dāng)前最優(yōu)觀測(cè)值)
self.acquisition_function.update(eta=incumbent_value, ...)
# 使用優(yōu)化器優(yōu)化采集函數(shù),得到使采集函數(shù)值最大的一個(gè)(一組)超參數(shù)
challengers=self.optimizer.maximize(...)
# ...
return batch_configs_list # 依據(jù)并行算法,得到下一輪需要驗(yàn)證的超參數(shù)
代碼以圖示為準(zhǔn)
超參數(shù)空間定義
首先,我們使用 ConfigSpace 庫 [4] 定義超參數(shù)空間。由于賽題中的超參數(shù)均為離散浮點(diǎn)型,并可近似為等間距分布,因此使用 Int 型定義超參數(shù)(本質(zhì)上和使用 Float 定義相同,但避免了賽題中超參數(shù)取值范圍邊緣可能出現(xiàn)不同間距的問題)。在 ConfigSpace 庫中,F(xiàn)loat 型和 Int 型超參數(shù)均被視作連續(xù)型,在執(zhí)行優(yōu)化時(shí)會(huì)自動(dòng)將參數(shù)范圍縮放至[0, 1]。
初始化方法
貝葉斯優(yōu)化需要一定數(shù)量的歷史數(shù)據(jù)才能啟動(dòng),我們使用了一種貪心法生成初始超參數(shù)配置。該方法從隨機(jī)候選配置中,逐步挑選距離已有配置最遠(yuǎn)的配置加入初始配置集合。使用該方法進(jìn)行初始化能更好地探索超參數(shù)空間,經(jīng)測(cè)試效果稍好于完全隨機(jī)初始化方法。初始化配置數(shù)設(shè)置為 10 個(gè)。該方法集成在 OpenBox 系統(tǒng)中,可通過 init_strategy="random_explore_first" 調(diào)用。
代理模型
貝葉斯優(yōu)化中的代理模型(surrogate model)有多種選擇,包括高斯過程(Gaussian process)、概率隨機(jī)森林(probabilistic random forest)、Tree Parzen Estimator(TPE)等,其中高斯過程在連續(xù)超參數(shù)空間上(如數(shù)學(xué)問題)優(yōu)化效果較好,概率隨機(jī)森林在含有分類超參數(shù)的空間上優(yōu)化效果較好。本次比賽只包含連續(xù)型超參數(shù),經(jīng)測(cè)試,高斯過程作為代理模型效果最好。高斯過程使用 OpenBox 系統(tǒng)默認(rèn)的 Matern5/2 核,核超參數(shù)通過最大似然 (maximize log likelihood) 得到。
采集函數(shù)與優(yōu)化
我們使用常用的 Expected Improvement(EI)函數(shù)作為貝葉斯優(yōu)化的采集函數(shù)(acquisition function)。在優(yōu)化采集函數(shù)時(shí),我們使用系統(tǒng)中的 "random_scipy" 優(yōu)化器。該優(yōu)化器在結(jié)合局部搜索與隨機(jī)采樣的基礎(chǔ)上,使用 L-BFGS-B 算法對(duì)采集函數(shù)執(zhí)行優(yōu)化。測(cè)試表明,相較于單純使用隨機(jī)采樣,該方法能對(duì)采集函數(shù)進(jìn)行更為充分的優(yōu)化,從而更大程度發(fā)揮 GP 模型和 EI 函數(shù)的潛能。
其他
傳統(tǒng)的貝葉斯優(yōu)化每輪只能推薦一個(gè)超參數(shù)配置,因此設(shè)計(jì)并行推薦方法是一個(gè)值得考慮的問題。我們嘗試了系統(tǒng)中實(shí)現(xiàn)的并行貝葉斯方法,包括 "median_imputation" 中位數(shù)插補(bǔ)法,即使用歷史觀察結(jié)果的中位數(shù),填補(bǔ)并行 batch 中推薦配置的性能,重新訓(xùn)練代理模型并得到下一個(gè)并行推薦配置,以及 "local_penalization" 局部懲罰法,對(duì)并行已推薦配置在采集函數(shù)上施加局部懲罰,這兩種方法的目的都是提高對(duì)超參數(shù)空間的探索性。不過經(jīng)過測(cè)試,在本次比賽問題上這些方法的效果不佳,最終我們采用多次優(yōu)化采集函數(shù)并去重的方式執(zhí)行并行推薦,達(dá)到了較好的性能。
此外,為增大貝葉斯優(yōu)化的探索性,保證算法收斂,我們?cè)O(shè)置每次推薦時(shí)使用隨機(jī)搜索的概率為 0.1。
代碼實(shí)現(xiàn)
初賽代碼僅需調(diào)用 OpenBox 系統(tǒng)中的并行貝葉斯優(yōu)化器 SyncBatchAdvisor,即可實(shí)現(xiàn)上述功能:
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,
)
代碼以圖示為準(zhǔn)
每輪執(zhí)行推薦時(shí),調(diào)用 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
代碼以圖示為準(zhǔn)
決賽算法介紹
賽題理解
決賽問題在初賽的基礎(chǔ)上,對(duì)每個(gè)超參數(shù)配置提供 14 輪的多精度驗(yàn)證結(jié)果,供算法提前對(duì)性能可能不佳的配置驗(yàn)證過程執(zhí)行早停。同時(shí),總體優(yōu)化預(yù)算時(shí)間減半,最多只能全量驗(yàn)證 50 個(gè)超參數(shù)配置,因此問題難度大大增加。如何設(shè)計(jì)好的早停算法,如何利用多精度驗(yàn)證數(shù)據(jù)是優(yōu)化器設(shè)計(jì)的關(guān)鍵。
我們對(duì)本地公開的兩個(gè)數(shù)據(jù)集進(jìn)行了探索,發(fā)現(xiàn)了一些有趣的性質(zhì):
我們也對(duì)兩兩超參數(shù)配置間的關(guān)系進(jìn)行了探索,比較了兩兩配置間前 13 輪的均值大小關(guān)系和第 14 輪的均值大小關(guān)系的一致性,發(fā)現(xiàn):
下圖為 data-30 空間中最終獎(jiǎng)勵(lì)排名前 2 的超參數(shù)和隨機(jī) 8 個(gè)超參數(shù)的獎(jiǎng)勵(lì) - 輪次關(guān)系:
圖:data-30 搜索空間中 2 個(gè)最好配置和 8 個(gè)隨機(jī)配置的獎(jiǎng)勵(lì) - 輪數(shù)曲線,包含置信上界(藍(lán)色)、均值(紅色)、置信下界(綠色)曲線。
我們?cè)诒荣愰_源代碼倉庫中提供了上述 “數(shù)據(jù)探索” 代碼。
上述數(shù)據(jù)探索結(jié)果表明,根據(jù)前 13 輪的置信區(qū)間,我們可以推測(cè)第 14 輪獎(jiǎng)勵(lì)均值的位置。利用前 13 輪的均值大小關(guān)系,我們可以估計(jì)第 14 輪最終均值的大小關(guān)系,但是由于數(shù)據(jù)噪音的存在,排名靠前的超參數(shù)配置大小關(guān)系無法通過部分驗(yàn)證結(jié)果預(yù)估。由此我們?cè)O(shè)計(jì)了兩種早停算法,分別是基于置信區(qū)間的早停和基于排名的早停,將在下一部分詳細(xì)描述。
過于激進(jìn)的早停策略在比賽中仍然存在問題。如果使用貝葉斯優(yōu)化只對(duì)全量驗(yàn)證數(shù)據(jù)建模,由于總體優(yōu)化預(yù)算時(shí)間很少,早停會(huì)減少可用于建模的數(shù)據(jù)量,使得模型不能得到充分訓(xùn)練。為解決這一問題,我們引入插值方法,增加模型可訓(xùn)練數(shù)據(jù)。
基于以上考量,最終我們的決賽算法在初賽貝葉斯優(yōu)化算法的基礎(chǔ)上,前期執(zhí)行完整貝葉斯優(yōu)化使模型得到較為充分的擬合,后期使用早停技術(shù)與插值法,加速超參數(shù)驗(yàn)證與搜索過程。下面將對(duì)早停模塊做詳細(xì)介紹。
算法核心技術(shù)——早停模塊介紹
早停方法
由于超參數(shù)配置之間的部分驗(yàn)證輪次均值大小關(guān)系與最終均值大小關(guān)系存在一定的相關(guān)性,我們受異步多階段早停算法 ASHA[5]的啟發(fā),設(shè)計(jì)了基于排名的早停算法:一個(gè)超參數(shù)如果到達(dá)需要判斷早停的輪次,就計(jì)算其性能均值處于歷史中同一輪次的超參數(shù)性能均值的排名,如果位于前 1/eta,則繼續(xù)驗(yàn)證,否則執(zhí)行早停。
依據(jù) 95% 置信區(qū)間的含義,我們還設(shè)計(jì)了另一種早停方法,即使用置信區(qū)間判斷當(dāng)前超參數(shù)配置是否仍有驗(yàn)證價(jià)值。如果某一時(shí)刻,當(dāng)前驗(yàn)證超參數(shù)的置信區(qū)間上界差于已完全驗(yàn)證的性能前 10 名配置的均值,則代表至少有 95% 的可能其最終均值差于前 10 名的配置,故進(jìn)行早停。使用本地?cái)?shù)據(jù)驗(yàn)證,以空間中前 50 名的配置對(duì)前 1000 名的配置使用該方法進(jìn)行早停,早停準(zhǔn)確率在 99% 以上。
經(jīng)過測(cè)試,結(jié)合貝葉斯優(yōu)化時(shí)兩種方法效果近似,我們最終選擇使用基于排名的早停方法。無論是哪種方法,都需要設(shè)計(jì)執(zhí)行早停的輪次。早停越早越激進(jìn),節(jié)省的驗(yàn)證時(shí)間越多,但是得到的數(shù)據(jù)置信度越低,后續(xù)執(zhí)行插值時(shí)訓(xùn)練的模型就越不準(zhǔn)確。為了權(quán)衡早停帶來的時(shí)間收益和高精度驗(yàn)證帶來的數(shù)據(jù)收益,我們選擇只在第 7 輪(總共 14 輪)時(shí)判斷每個(gè)配置是否應(yīng)當(dāng)早停。早停判斷準(zhǔn)則依據(jù) eta=2 的 ASHA 算法,即如果當(dāng)前配置均值性能處于已驗(yàn)證配置第 7 輪的后 50%,就進(jìn)行早停。
以下代碼展示了基于排名的早停方法。首先統(tǒng)計(jì)各個(gè)早停輪次下已驗(yàn)證配置的性能并進(jìn)行排序(比賽中我們使用早停輪次為第 7 輪),然后判斷當(dāng)前配置是否處于前 1/eta(比賽中為前 1/2),否則執(zhí)行早停:
# 基于排名的早停方法,prune_eta=2,prune_iters=[7]
def prune_mean_rank(self, iteration_number, running_suggestions, suggestion_history):
# 統(tǒng)計(jì)早停階段上已驗(yàn)證配置的性能并排序
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
# 依據(jù)當(dāng)前配置性能排名,決定是否早停
stop_list=[False] * len(running_suggestions)
for i, suggestion in enumerate(running_suggestions):
n_history=len(suggestion['reward'])
if n_history==CONFIDENCE_N_ITERATION:
# 當(dāng)前配置已完整驗(yàn)證,無需早停
print('full observation. pass', i)
continue
if n_history not in self.hps['prune_iters']:
# 當(dāng)前配置不處于需要早停的階段
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])
# 判斷當(dāng)前配置性能是否處于前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
代碼以圖示為準(zhǔn)
基于置信區(qū)間的早停方法可見我們的比賽開源代碼庫。
數(shù)據(jù)建模方法
對(duì)于貝葉斯優(yōu)化的數(shù)據(jù)建模,我們嘗試了多精度集成代理模型 MFES-HB[6]擬合多精度觀測(cè)數(shù)據(jù)。該方法雖然能應(yīng)對(duì)低精度噪聲場(chǎng)景,但在決賽極其有限的優(yōu)化時(shí)間限制內(nèi),可能無法快速排除噪聲的干擾,導(dǎo)致效果不如僅使用最高精度數(shù)據(jù)建模。
我們最終選擇只利用最高精度數(shù)據(jù)進(jìn)行建模。為了彌補(bǔ)早停造成的高精度數(shù)據(jù)損失,我們引入插值方法,增加用于模型訓(xùn)練的數(shù)據(jù)量,具體來說,就是對(duì)早停的配置,設(shè)置一個(gè)完整驗(yàn)證時(shí)的性能均值,插入優(yōu)化歷史執(zhí)行建模。對(duì)于插入值的選取,我們使用已完整驗(yàn)證配置的最終均值中位數(shù)進(jìn)行插值。
以下為插值代碼示例:
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()
代碼以圖示為準(zhǔn)
總結(jié)
本文介紹了自動(dòng)化超參數(shù)優(yōu)化賽道的冠軍方案,包括貝葉斯優(yōu)化算法和早停方法。很幸運(yùn)能夠拿到此次比賽的冠軍。感謝賽事主辦方為我們提供了富有現(xiàn)實(shí)意義的比賽場(chǎng)景,讓我們積累了寶貴的比賽經(jīng)驗(yàn)和超參數(shù)優(yōu)化實(shí)際經(jīng)驗(yàn)。希望我們的分享能夠?qū)Υ蠹矣兴鶐椭?/span>
引用
[1] 黑盒優(yōu)化系統(tǒng) OpenBox
https://github.com/PKU-DAIR/open-box
[2] 自動(dòng)化機(jī)器學(xué)習(xí)系統(tǒng) 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/
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。