Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
貿人常常有個困惑,發出去的郵件為啥沒反應?
到底是客戶沒收到郵件?還是收到了沒看?還是看了沒回?
又或者,我們拿到的這個郵箱地址本來就有問題?
以后再也不用在網上瘋狂搜索攻略和工具了,我這里一次性給你整理好,收藏就對了,全網最全!
01
黑名單查詢
如果自己家郵箱進了黑名單,那真得就不能怪客戶沒反應了,所以定期自查非常有必要。
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容易申訴多了。
其他可以檢查黑名單的網站大同小異,這里不再展開:
02
通訊錄管理工具
removebounce
https://removebounce.com/
這是一個垃圾郵箱、無效郵箱的自動檢查、清除工具,如果你的通訊錄龐大到超過一定數量或剛剛獲取到一個幾百甚至上千數量級的買家名單,可以考慮使用這個管理工具。
注冊成功后有50個免費驗證額度,階梯付費功能,5美金可以驗證1500個,驗證結果顯示為unkown的不收費。
03
郵箱有效性驗證工具
emailable
https://emailable.com/
這個驗證工具的原理是通過連接郵件服務器,檢查郵箱是否存在。注冊成功后有250個免費額度,超過后需要付費。
此外它還提供升級功能,包括防止郵件退回或被拉黑名單,自動同步郵件狀態監控數據,黑名單監控和檢測等打包升級功能,當然,價格也更貴。
不過還有其他很多驗證郵箱的工具,功能大同小異,一個免費額度用完以后可以換下一個注冊使用,看個人喜好挑選。
04
郵件內容完善工具
郵件模板大全
https://goodemailcopy.com/
一個外貿新手必備的郵件模板工具,它能提供各大知名企業的各種類型的郵件模板供你參考。
提供按主題搜索功能,跟進,確認,通知,產品更新,價格調整,致歉等主題內容一應俱全。
在沒有形成自己的表達風格以前,外貿人可以多看看這些大企業的現成郵件模板,模仿下地道又簡練的表達,有的甚至可以拿過來簡單改改,輕松實現與客戶的高效溝通。
這里再提供一個免費獲取郵件模板的思路,到國外英語母語國家的商業網站,或者服務提供商發意向詢盤,記得留下郵件地址。如果他們認為你是質量不錯的潛在客戶,將不斷給你發跟進郵件試圖轉化你。
此時,他們發來的郵件的結構,話術,表達思路甚至逼單技巧都是我們可以參考的,有時候把產品信息代入,其他不改,就是一封地道的開發信。
臨時郵箱
http://mail.bccto.me/
當我們想要注冊網站獲取上述工具的免費額度,又不想暴露自己真實郵箱的時候,這個就非常好用。
還有就是收到買家發的詢盤帶附件拿不準的時候,也可以用臨時郵箱有效規避風險。
這種用來短暫接收郵件的臨時郵箱,也稱為一次性郵箱,按時效可以選10分鐘、24小時郵箱。
還有獲取一次性接收驗證碼的手機號的工具,這里不展開,有需要的自己想辦法。
郵件簽名美化工具
https://www.hubspot.com/email-signature-generator
一個好的郵件簽名可以更全面地展示自己,讓客戶對你的專業和細致留下好感。銷售在與客戶接觸的初期,第一印象非常重要,所以不要忽略這些細枝末節的信息。
如果咱們公司沒有對郵件簽名有統一的設計或要求,這里可以找到你喜歡的郵件簽名,各種模板任君挑選。
05
郵件追蹤工具
didtheyreadit
http://www.didtheyreadit.com
當我們排除了黑名單的限制,優化了郵件內容,接下來就是監測和追蹤郵件的狀態了。
這些工具不需要科學上網即可打開。根據流程下載注冊后,系統會自動通知你的郵件何時被打開,其打開時間多久,在哪里打開的(地理位置)。
每個月可免費追蹤10封以內的郵件,超過了就需要付費了,有需要的可以去看看網站的報價,不想花錢也可以繼續往下看,換一個工具。
免費額度用完后,不想花錢咱就再換一個,市場上競品很多,功能大同小異,輪流薅它們的羊毛吧:
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]。下面將進行詳細介紹。
初賽算法介紹
賽題理解
在信息流推薦業務場景中普遍存在模型或策略效果依賴于 “超參數” 的問題,而“超參數 " 的設定往往依賴人工經驗調參,不僅效率低下維護成本高,而且難以實現更優效果。因此,本次賽題以超參數優化為主題,從真實業務場景問題出發,并基于脫敏后的數據集來評測各個參賽隊伍的超參數優化算法。
參賽者需要提交超參數生成的算法代碼,算法每一輪需要提供一組超參數,裁判程序會返回超參數對應的 reward。參賽者的算法要求在限定的迭代輪次和時間內,找到 reward 盡可能大的一組超參數,最終按照找到的最大 reward 來計算排名。
針對該賽題,優化器需要在每輪以同步并行方式推薦 5 個超參數配置,共執行 20 輪推薦,即總共搜索 100 個超參數配置。對每個超參數配置均執行完整資源的驗證,并且在比賽的問題抽象中,不同超參數的驗證時間相同。
根據現有研究,貝葉斯優化是超參數優化(黑盒優化)問題上 SOTA 的方法,而且比賽場景中的超參數空間維度不超過 6 維,并非超高維問題,較適合貝葉斯優化方法,因此我們選定貝葉斯優化作為初賽的搜索算法。另外,問題中所有的超參數均為連續型(離散浮點型)超參數,這決定了我們的超參數空間定義方法、貝葉斯優化代理模型以及優化器的選擇,接下來也將分別進行介紹。
算法核心技術——貝葉斯優化模塊介紹
貝葉斯優化簡介
超參數優化是典型的黑盒優化問題,即對于目標函數(超參數 - 獎勵函數),具體表達式或導數信息是不可知的,只能通過嘗試輸入獲取輸出來推測目標函數的內部情況。
貝葉斯優化是解決黑盒優化問題的一個迭代式框架,優化流程包括如下步驟:
注:以下代碼分為文字版和圖示版,代碼以圖示版為準。
貝葉斯優化算法封裝在 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 個超參數配置,因此問題難度大大增加。如何設計好的早停算法,如何利用多精度驗證數據是優化器設計的關鍵。
我們對本地公開的兩個數據集進行了探索,發現了一些有趣的性質:
我們也對兩兩超參數配置間的關系進行了探索,比較了兩兩配置間前 13 輪的均值大小關系和第 14 輪的均值大小關系的一致性,發現:
下圖為 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/
*請認真填寫需求信息,我們會在24小時內與您取得聯系。