小時候,我特別討厭自己的名字——Dale,大家聽到這個名字,腦海里首先浮現(xiàn)的是哪些形象?我自己最先想到的,總是《山丘之王》電影中的Dale Gribble以及納斯卡車手Dale Earnhardt Jr.。
這些Dale都跟我所憧憬的自我形象完全不符。我更喜歡Sailor Moon“水冰月”這個名字。
另外,我最討厭的是Dale所表現(xiàn)出的中性感——男生里叫Dale的特別多,但像我這樣的女性“Dale”就相當罕見了。這名字怎么來的?每當我問起父母,他們的回答永遠是:
A. 名字比較中性的女生更有可能獲得成功。
B. 他們認識了一個特別時髦的朋友,人家的女兒也叫Dale,太可愛了!
好吧,在成年之后,我確實發(fā)現(xiàn)這個中性化的名字讓自己的簡歷、GitHub乃至郵件簽名里得到了不少好處。
但拋開性別偏見,更值得討論的深層問題是,名字是否會在潛移默化中引導(dǎo)人們傾向于選擇與之相符的工作或者生活方式?如果答案是肯定的,那么起名這事學(xué)問可就太大了,甚至?xí)绊懞⒆拥囊簧N铱刹幌氚堰@么重要的決定交給個人品味、運氣或者當時的潮流。于是乎,我希望機器學(xué)習(xí)能幫助我解決這個難題!
在本文中,我們將了解如何使用機器學(xué)習(xí)技術(shù)開發(fā)一款嬰兒起名器(更準確地講,其實是款預(yù)測器),能夠根據(jù)對于新生兒的描述返回合適的名字,例如:
我的孩子出生在新澤西州,她未來會成為谷歌公司的軟件開發(fā)員,喜歡騎自行車和喝咖啡。
以此為基礎(chǔ),模型會返回一組姓名,并按概率進行排序:
Name: linda Score: 0.04895663261413574
Name: kathleen Score: 0.0423438735306263
Name: suzanne Score: 0.03537878766655922
Name: catherine Score: 0.030525485053658485
...
所以從理論上講,我本來應(yīng)該叫Linda,但相比之下,現(xiàn)在我感覺Dale好像更好一點。
好了,別對結(jié)果太當真,這里頭有明顯的偏見成分,更像是那種星座玄學(xué)。雖然如此,第一個由AI起名的嬰兒,聽起來是不是還蠻酷的?
數(shù)據(jù)集
雖然這里說的是創(chuàng)建起名器,但它在本質(zhì)上就是個姓名預(yù)測器。我的基本思路就是找到大量名人的傳記性表述,屏蔽掉他們的真實名字,然后創(chuàng)建模型來正確預(yù)測出這些被屏蔽的名字。
好消息是,我在David Grangier的Github repo中找到了wikipedia-biography-dataset數(shù)據(jù)集,其中包含維基百科中728321條名人記錄的摘要段落與大量元數(shù)據(jù)。
相信大家都知道,直接從維基百科上提取的數(shù)據(jù)集有著嚴重的選擇性偏見——因為其中只有15%的條目為女性,而且非白人條目的比例也更低。再有,在維基百科上有記錄的人們往往年紀更大,畢竟都是些上歲數(shù)的名人嘛。
為了解決這個問題,特別是保證生成器能盡量提供符合當下審美的名字,我下載了人口普查報告中最受歡迎的新生兒名字,同時縮小了維基百科數(shù)據(jù)集的規(guī)模——即流行名字與維基百科內(nèi)名人名字的交集。另外,我只保留了至少有50位名人取過的名字,最終得到了764個名字,其中大部分是男名。
在數(shù)據(jù)集里,最受歡迎的是“John”,在維基百科上有10092條記錄。其次是William、David、James、George以及一大堆同樣來自圣經(jīng)的男性名字。人氣最低的名字(我也保留了50個例子)則有Clark、Logan等等。為了解決這種嚴重偏見,我再次對數(shù)據(jù)集進行下采樣,為每個名字隨機選擇了100條對應(yīng)的名人記錄。
模型訓(xùn)練
在數(shù)據(jù)樣本整理完成之后,我決定訓(xùn)練一套模型,根據(jù)維基百科中的摘要段落讓模型結(jié)合人物描述生成推薦名字。
下面來看維基百科中常見的名人介紹形式:那么,我的這款起名器到底表現(xiàn)如何?
有過建模經(jīng)驗的朋友們,肯定知道評估質(zhì)量的常規(guī)指標就是準確率與召回率。我這套模型的準確率為65.7%,召回率為2%。
但對于一款起名器來說,這些指標并不能真正說明問題。由于數(shù)據(jù)非常復(fù)雜,因此無法根據(jù)一個人的生活經(jīng)歷找到“正確答案”。另外,姓名還具有很大的隨機性,所以任何模型都不可能做出真正準確的預(yù)測。
我的目標也并不是創(chuàng)建一套能夠100%準確預(yù)測人名的模型,而只是想試著創(chuàng)建一種能夠理解人名及其意義的模型。
對模型學(xué)習(xí)到的知識進行深入探究的一種可行方法,在于查看名為混淆矩陣的表。該表用于指示模型所犯錯誤的具體類型。我們可以借此進行調(diào)試,或者快速實現(xiàn)完整性檢查。
在Evaluate選項卡中,AutoML提供現(xiàn)成的混淆矩陣。如下圖所示,僅為其中的一角:
Dale Alvin Gribble,??怂箘赢嬤B續(xù)劇《山丘之王》中的虛構(gòu)人物,由Johnny Hardwick配音、Stephen Root飾演,初次試鏡演員為Daniel Stern。Dale Gribble是革命性的“口袋揚沙”自衛(wèi)術(shù)的發(fā)明者,賞金獵人,Daletech所有者,喜歡吸煙,癡迷槍支,同時也是各種陰謀論與都市傳奇的狂熱信徒。
為了防止模型作弊,我把實例中的名字與姓氏替換成了空白行“__”,所以上述簡介就變成了:
__ Alvin __ ,??怂箘赢嬤B續(xù)劇《山丘之王》中的虛構(gòu)人物…
這就是模型的輸入數(shù)據(jù),而其對應(yīng)的輸出標簽為“Dale”。
在數(shù)據(jù)集準備就緒之后,我開始著手構(gòu)建深度學(xué)習(xí)語言庫。我可以從多種方法中做出選擇(例如使用TensorFlow),但這里我使用了AutoML Natural Language。這是一種無代碼方法,可構(gòu)建用于文本分析的深度神經(jīng)網(wǎng)絡(luò)。
我將數(shù)據(jù)集上傳至AutoML,由其將數(shù)據(jù)集自動拆分為36497個訓(xùn)練示例,4570個驗證示例,以及4570個測試示例:
雖然我只打算刪除名字和姓氏,但也有不少中間名神秘失蹤了。
為了訓(xùn)練模型,我訪問Train選項卡,并點擊Start Training。在四個小時之后,訓(xùn)練宣告完成。
那么,我的這款起名器到底表現(xiàn)如何?
有過建模經(jīng)驗的朋友們,肯定知道評估質(zhì)量的常規(guī)指標就是準確率與召回率。我這套模型的準確率為65.7%,召回率為2%。
但對于一款起名器來說,這些指標并不能真正說明問題。由于數(shù)據(jù)非常復(fù)雜,因此無法根據(jù)一個人的生活經(jīng)歷找到“正確答案”。另外,姓名還具有很大的隨機性,所以任何模型都不可能做出真正準確的預(yù)測。
我的目標也并不是創(chuàng)建一套能夠100%準確預(yù)測人名的模型,而只是想試著創(chuàng)建一種能夠理解人名及其意義的模型。
對模型學(xué)習(xí)到的知識進行深入探究的一種可行方法,在于查看名為混淆矩陣的表。該表用于指示模型所犯錯誤的具體類型。我們可以借此進行調(diào)試,或者快速實現(xiàn)完整性檢查。
在Evaluate選項卡中,AutoML提供現(xiàn)成的混淆矩陣。如下圖所示,僅為其中的一角:
在此表中,行標題為**True labes**,列標題則為**Predicted labels**。這些行表示某人的真實名字,而列則代表模型為該人預(yù)測出的名字。
例如,在標有“ahmad”的行中,我們看到一個淡藍色的框,標有“13%”。這意味著我們的數(shù)據(jù)集中,所有名為Ahmad的條目中,有13%的比例被我們的模型正確標記為“ahmad”。這時向右側(cè)框看去,在真名為“ahmad”的所有條目中,有25%被錯誤標記成了“ahmed”。另外有13%的條目被錯誤標記為“alec”。
盡管這些標簽出現(xiàn)了技術(shù)意義上的錯誤,但由此推斷,模型可能確實掌握了關(guān)于起名的一點小訣竅,因為“ahmad”與“ahmed”已經(jīng)非常相近。Alec也類似,該模型在25%的情況下把Alecs標記為“alexander”,在現(xiàn)實生活中,“alec”與“alexander”確實沒多大區(qū)別。
運行健全性檢查
接下來,我打算看看這套模型能不能理解關(guān)于起名的基本統(tǒng)計規(guī)則。例如,如果我把某人形容為“她”,那么模型能不能成功給出一個女性名字?
例如,“她喜歡美食”,那么模型給出的推薦名稱為“Frances”、“Dorothy”以及“Nina”,后面幾個都是女性專用名,看起來好像不錯。
對于“他喜歡美食”,模型給出的推薦名包括“Gilbert”、“Eugene”以及“Elmer”??磥?,模型似乎確實有了性別區(qū)分的概念。
下面,我們再來看實際測試過的其他幾項測試輸入與對應(yīng)結(jié)果。
“他出生在新澤西州。” — Gilbert
“她出生在新澤西州。” — Frances
“他出生在墨西哥。” — Armando
“她出生在墨西哥。” — Irene
“他出生在法國。” — Gilbert
“她出生在法國。” — Edith
“他出生在日本。” — Gilbert
“她出生在日本。” — Frances
看來模型已經(jīng)摸清了世界各地的起名傾向,這一點給我留下了深刻印象。但是,模型似乎很難弄清亞洲國家更喜歡哪些英文名,因此總是返回少量特別安全的名字(Gilbert與Frances)。這說明使用的訓(xùn)練數(shù)據(jù)集不具備充分的全局多樣性。
模型偏見
最后,我們要對模型偏見進行測試。大家可能知道,我們往往會在不經(jīng)意間創(chuàng)建出存在嚴重偏見、種族主義傾向、性別歧視或者野蠻暴力問題的模型,這主要是因為其中使用的訓(xùn)練數(shù)據(jù)集無法正確反映結(jié)果所指向的人群。因為維基百科的數(shù)據(jù)也有同樣的問題,所以我知道數(shù)據(jù)集中的男名要比女名多。
我還意識到模型應(yīng)該會反映出訓(xùn)練數(shù)據(jù)中的某些性別偏見問題——例如傾向于認為計算機程序是男性,而護士是女性。下面看看我的推理是否正確:
“TA將成為計算機程序員。” — Joseph
“TA將成為護士。” — Frances
“TA將成為醫(yī)生。” — Albert
“TA將成為宇航員。” — Raymond
“TA將成為小說家。” — Robert
“TA將成為家長。” — Jose
“TA將成為模特。” — Betty
好吧,這套模型似乎確實掌握了職業(yè)崗位中的傳統(tǒng)性別傾向,更讓我驚訝的是,它為“家長”指定了一個男性名字(Jose)。
總結(jié)來看,我的模型似乎確實在起名這方面學(xué)到了不少,但又跟我的期望不太一樣。所以我的下一代該叫什么名字好呢……要不,干脆叫Dale Jr.?