Categories
程式開發

Stack Overflow自研AI系統標記不友好評論


不友好的評論對於系統而言是一個大問題,因為他們的語氣會影響被評論者和未來讀者對 Stack Overflow 的貢獻意願。討論前因後果或意圖不是解決這些問題的辦法,唯一的選擇是處理評論本身。

本文最初發佈於 Stack Overflow 官方博客,經原作者授權由 InfoQ 中文站翻譯並分享。

作為廣受開發者歡迎的社區網站,我們所有人都希望 Stack Overflow 成為一個熱情友好的地方。有時候,Stack Overflow 上的評論明顯不受歡迎,比如散播仇恨和偏見這樣的事情並不少見,如果出現不友好的評論,我們的社區會進行標記,版主也會處理。但有些評論很容易躲過標記系統,我們就需要不斷優化技術,本文介紹了 Stack Overflow 過去兩年為此做過的事情。

作為開發人員,我們傾向於從系統角度考慮問題。 Stack Overflow 是一個很大的系統,由很多子系統組成,旨在幫助人們解決他們遇到的編程問題。這些子系統包括投票、信譽、問題流、評論、Meta、關閉、徽章、標記、培養新貢獻者等。系統的任何一部分都不是為了好玩。所有這些子系統一起幫助整個系統實現其目的。當這些子系統出現問題時,它們需要也值得修復。

對於不受歡迎的評論,問題很少在評論者或他們的評論意圖, 而是讀者體驗到的語氣上。大多數情況下,評論者並不是有意讓他們的評論顯得居高臨下、不屑一顧,或者我們看到的其他不受歡迎的微妙變種。這些人是真得想幫助別人,即使他們的語氣很差。

我們不相信這裡有需要驅逐的壞人,所以暫停或禁止用戶發言並不是解決辦法,剩下的唯一選擇是處理評論本身。

調查

我們先自己去看問題。Stack Overflow 的員工將從 Stack Overflow 上隨機挑選的評論分為三類:友好的、不友好的和辱罵性的。各人的經驗不同,但我們的中位數員工將 6.5% 的評論歸為不友好。我們還另外邀請了三組人來對評論進行分類:版主、一組註冊用戶(來自我們的一般研究列表)、一組對我們最初的博文做出回复的人(他們說自己對使Stack Overflow更受歡迎感興趣)。這些人中,中位人員認為 3.5% 的評論是不友好的。

標記功能的發展歷程Stack Overflow 在 2009 年 4 月 16 日引入了評論標記。一旦用戶聲望到 15,他們就可以標記評論,以引起版主的注意。一旦一條評論被標記,版主要么接受標記並將其從網站上刪除,要么拒絕標記並允許該評論保留。直到 2018 年中,我們一直都用一個相關類型的評論標識來處理任何不友好的東西:offensive 標識。

從 2010 年 3 月開始,我們有了關於 offensive 標識使用情況的可靠數據。我們會計算每天被標記 offensive 標識的評論的百分比(每天被標記的評論數 / 當天發布的評論數),並將它們放在每月的統計圖中。

Stack Overflow自研AI系統標記不友好評論 1

在剛開始的數據中,有兩個評論標識百分比升高的時期,這是 Stack Overflow 的開發人員使用評論標識系統進行一些批量清理。月度分佈在 2011 年中趨於穩定,在 2017 年中之前一直在緩慢下降,之後才開始上升。月度分佈大部分在 0.1% 到 0.2% 之間。在此期間,有 8360 萬條評論被發布,其中有 114577 條被標記,整體 offensive 評論百分比為 0.137%。如果我們只計算版主接受的標識,我們估計,在 Stack Overflow 上有 0.105% 的評論是不友好的。

大相徑庭的估計

我們對不友好評論的兩個估計大相徑庭。標記系統估計 Stack Overflow 的不友好評論百分比為 0.105%。非員工中位人員卻發現 3.5% 的 Stack Overflow 評論不友好。這兩項估計差別很大,但公平地說,它們測量的上下文差別也很大。一個上下文是 Stack Overflow,一個完整的網站,有問題、答案、聲望等所有一切內容。另一個上下文只是從隨機挑選的評論中提取的文本項。每個上下文中用戶的心理狀態是不同的:Stack Overflow 上的用戶忙於解決自己的問題或幫助別人,評論分類者是按照要求去尋找不友好的評論。

既然測量方法不同,我們應該預料到結果會有一些不同,但是 33 倍的差距太大了,沒法忽略。我們進一步假設,Stack Overflow 的評論標記系統存在假陰性或欠標記問題。

自建 or 購買?

我們探索了驗證這一假設的方法。有幾家公司似乎有這樣的工具,我們可以購買,我們研究了這些工具能提供什麼。由於這樣或那樣的原因,它們都法解決我們的問題。即使買了,數據共享或 NDA(保密協議)也存在法律問題。我們做了深入研究,發現他們關注的是相近的問題,即從評論歷史中識別有問題的用戶,而不是僅對文本本身進行分類。

既然都無法滿足我們的需求,我們就開始探索自己構建的可能。2018 年是自然語言處理激動人心的一年。 2018 年 5 月,Jeremy Howard 和 Sebastian Ruder 發表了《文本分類的通用語言模型調優》。 ULMFiT 使得用很少的標記數據訓練非常好的文本分類器成為可能。 fast.ai 在 fastai 庫中發布了訓練 ULMFiT 模型的代碼。他們還提供了一個免費的在線課程,教你使用神經網絡和這個庫。

在 2018 年 7 月,我們第一次嘗試運行它,但是我們沒有一個大小適當的 GPU 可以使用(我們內部所有的卡都太小了,我們也無法讓任何云提供商給我們一個)。 10 個月過去了,fastai 庫變成了v1。巧合的是,我們最後的購買選項也被否決了,感覺是時候再試一次了。

ULMFiT

在 2018 年 11 月,我們獲得了一個可用的 Azure GPU,並幾乎立即取得了成功。 ULMFiT 使用兩個 Stack Overflow 評論數據集來生成一個分類器。一個無標籤的 Stack Overflow 評論數據集,用於將 ULMFiT 的預訓練 Wikipedia 語言模型調整到 Stack Overflow 的評論語言。然後使用一個有標籤的 Stack Overflow 評論數據集來訓練一個 Unfriendly/NotUnfriendly 二元分類器。

對於無標籤數據集,我們使用了幾十萬個隨機選擇的 Stack Overflow 評論。對於有標籤數據集,我們將標記為 offensive 的評論加上 Unfriendly 的標籤,並隨機選出相同數量的 Stack Overflow 評論,為它們加上 NotUnfriendly 的標籤。用了 20 多行 Python 代碼(自己去上課看看)和幾個小時的訓練,我們就得到了一個驗證集 AUC 為.93 的模型。我們使用與最高 F1 分數相關聯的閾值,並在均勻分割的驗證集上測得了 85% 的準確性。

Stack Overflow自研AI系統標記不友好評論 2

驗證預測

我們的感覺是,準確率數值低是由於我們的標籤很髒。在 Unfriendly 預測結果部分,我們發現,來自驗證集的評論確實不友好,但從未被標記過。這些“假”陽性結果根本不是真的假,它們只是被現有的標記系統遺漏了。在 NotUnfriendly 預測結果部分,我們發現,來自驗證集被標記為 offensive 的評論,實際上並不是。比如人們說“謝謝”(厚顏無恥!),真的無傷大雅。這些“假”陰性也不是真的假。 ULMFiT 發現並改正了一些臟標籤,​​這表明,欠標記假設是真的,那麼 ULMFiT 也能找到一些缺失的標識。

人機共生

我們著手構建系統的其餘部分,以便 ULMFiT 能夠監視所有的新評論,並向我們的版主提供標記建議,讓他們處理。我們需要在這裡強調一下。我們過去沒有,現在也沒有興趣在我們的系統中構建任何東西,讓機器在沒有人在場的情況下做出最終決定。我們的願望不是訓練、訓練、再訓練,然後在未來的某個光輝日子裡,把標記處理的職責從我們的版主轉給 GPU。我們想要建立一個工具來增強我們系統中人類的能力,而不是取代人類。

這個系統的建立還需要幾個月的時間。我們必須把在公司裡發現的東西社會化。我們必須將模型封裝在 Web API 中。我們與 SRE 合作,使我們的雲環境達到最佳狀態。當新的評論進來時,我們必須讓 Stack Overflow 調用模型,並將標記放到版主的儀表板中。我們的社區團隊觀察了幾個星期,參考標記結果調整了標記閾值。我們看著它們工作,讓他們在處理標識時記錄過程。在得到一個好的驗證分數後,有很多東西需要被刪除。到目前為止,訓練模型是最簡單的部分。當所有這些完成後,我們讓 Unfriendly Robot V1 投入工作。

Robot 的效果(截至目前)

Unfriendly Robot V1(UR-V1) 於 2019 年 7 月 11 日至 2019 年 9 月 13 日期間一直在運行。在此期間,Stack Overflow 上有 1,715,693 條評論。 UR-V1 標記了 15564 條評論(0.9%),其中 6833 條被我們的版主接受,即 UR-V1 的標記有 43.9% 被接受。在同一時期,人類標記了 4870 條(0.2%)不友好的評論,其中 2942 條被我們的版主接受,即 60.4% 的人類標記被接受。

這個結果好嗎?為了估計這一點,可以將人和機器人的性能指標合併為兩個新指標:機器人評級(Robot Rating)和檢測因子(Detection Factor)。

Stack Overflow自研AI系統標記不友好評論 3

機器人評級高於 1 表明,機器人標記比人類標記更容易被接受。檢測因子高於 2 意味著機器人在 Stack Overflow 上發現的令人反感的評論比人類標記者要多。 UR-V1 的機器人評級是 0.72,所以其標記不像人類標記那樣經常被接受,有很多假陽性。 UR-V1 的檢測因子為 3.3。 UR-V1 幫助版主刪除的評論是人類的 3.3 倍。

8 月底,我們又對機器人進行了訓練。我們希望得到一個更好的假陽性率(更高的機器人評級),而不損害被接受標記吞吐量(檢測因子)。經過大量的訓練,最終,UR-V2 通過了測試。 UR-V2 於 2019 年 9 月 13 日投入使用。從那時起,Stack Overflow 上已經有 4251,723 條評論。 UR-V2 已經標記了 35341 條評論,其中 25695 條被我們的版主接受。人類已經標記了 11810 條不友好的評論,7523 條被我們的版主接受。 UR-V2 的機器人等級為 1.14,檢測因子為 4.4。在此期間,UR-V2 標記被接受的頻率比人類標記高出 14%,而且它幫助版主刪除的評論數量是人類標記者的 4.4 倍。

需要明確的是,儘管當前版本的機器人表現非常好,但我們的人類標記者和以前一樣重要。這個機器人之所以能做得這麼好,唯一的原因是在人類做的事情的基礎上進行的。機器人可以尋找與人類以前標記過的東西相類似的東西,但我們不認為它能識別出真正新穎的不友好模式。只有人類才能做到這一點。所以如果你在評論中看到不友好的地方,請標記出來,你正在幫助 Stack Overflow 變得更好。

更新估計

由最初的人類標記系統發現並由版主刪除的不友好評論為 0.105%。非員工中位人員發現有 3.5% 的評論是不友好的。這兩個估計值相差 33 倍。由新的 Humans+UR-V2 標記系統發現並由版主確認的不友好的 Stack Overflow 評論為 0.78%。 Humans+UR-V2 發現的不友好評論是人類以前發現的不友好評論的 7.4 倍。非 Stack Overflow 員工對不友好評論的估計中值是人類標記系統的 33 倍,而現在是 4.4 倍。

我們希望稍微弱化一下這個發現。人們很容易說:“我們發現 Stack Overflow 上的不友好率是多少了,只要看看機器人評級和檢測因子就知道了!比我們想像的要高得多!”事實總是有點模糊。根據這裡展示的證據,我們未必就有了一個無懈可擊的不友好探測器,我們只是有一個在人類標記的不友好評論數據集上訓練過的模型,我們的版主會從它那裡接受標記。我們知道,並不是所有機器人標記的評論都是不友好的,版主也確實會接受其中一些標記,因為評論有其他需要刪除的原因。我們也相信,機器人無法捕捉所有的東西(仍然會有假陰性需要發現)。

未來展望

我們的目標是在 Stack Overflow 上繼續加強大家對不友好評論的共識。我們在這裡討論的工作,其重點是更好地估計目前問題的規模,並解決我們先前的兩次估計之間的巨大差距,但這絕不是結束。我們想看看,在我們有機器人之前,我們能對系統中的 1 億條評論做些什麼。我們還在考慮如何使用機器人為評論作者提供即時指導。

我們使用這些模型來幫助評估我們對 Stack Overflow 所做的更改。將 A/B 測試與不友好機器人結合起來,讓我們可以在做出更改時對不友好評論進行評估。 Julia Silge 博士在她對問答嚮導的最新研究中指出,使用該嚮導總體上減少了 5% 的評論,但減少了 20% 的不友好評論。幫助提問者提出更好的問題對此有很大的影響,我們會看看是否可以做進一步的系統性改進。

原文地址:

https://stackoverflow.blog/2020/04/09/the-unfriendly-robot-automatically-flagging-unwelcoming-comments