首頁>育兒>

小時候,我特別討厭自己的名字——Dale,大家聽到這個名字,腦海裡首先浮現的是哪些形象?我自己最先想到的,總是《山丘之王》電影中的Dale Gribble以及納斯卡車手Dale Earnhardt Jr.。

這些Dale都跟我所憧憬的自我形象完全不符。我更喜歡Sailor Moon“水冰月”這個名字。

另外,我最討厭的是Dale所表現出的中性感——男生裡叫Dale的特別多,但像我這樣的女性“Dale”就相當罕見了。這名字怎麼來的?每當我問起父母,他們的回答永遠是:

A. 名字比較中性的女生更有可能獲得成功。

B. 他們認識了一個特別時髦的朋友,人家的女兒也叫Dale,太可愛了!

好吧,在成年之後,我確實發現這個中性化的名字讓自己的簡歷、GitHub乃至郵件簽名裡得到了不少好處。

但拋開性別偏見,更值得討論的深層問題是,名字是否會在潛移默化中引導人們傾向於選擇與之相符的工作或者生活方式?如果答案是肯定的,那麼起名這事學問可就太大了,甚至會影響孩子的一生。我可不想把這麼重要的決定交給個人品味、運氣或者當時的潮流。於是乎,我希望機器學習能幫助我解決這個難題!

在本文中,我們將了解如何使用機器學習技術開發一款嬰兒起名器(更準確地講,其實是款預測器),能夠根據對於新生兒的描述返回合適的名字,例如:

我的孩子出生在紐澤西州,她未來會成為谷歌公司的軟體開發員,喜歡騎單車和喝咖啡。

以此為基礎,模型會返回一組姓名,並按概率進行排序:

Name: linda Score: 0.04895663261413574

Name: kathleen Score: 0.0423438735306263

Name: suzanne Score: 0.03537878766655922

Name: catherine Score: 0.030525485053658485

...

所以從理論上講,我本來應該叫Linda,但相比之下,現在我感覺Dale好像更好一點。

好了,別對結果太當真,這裡頭有明顯的偏見成分,更像是那種星座玄學。雖然如此,第一個由AI起名的嬰兒,聽起來是不是還蠻酷的?

資料集

雖然這裡說的是建立起名器,但它在本質上就是個姓名預測器。我的基本思路就是找到大量名人的傳記性表述,遮蔽掉他們的真實名字,然後建立模型來正確預測出這些被遮蔽的名字。

好訊息是,我在David Grangier的Github repo中找到了wikipedia-biography-dataset資料集,其中包含維基百科中728321條名人記錄的摘要段落與大量元資料。

相信大家都知道,直接從維基百科上提取的資料集有著嚴重的選擇性偏見——因為其中只有15%的條目為女性,而且非白人條目的比例也更低。再有,在維基百科上有記錄的人們往往年紀更大,畢竟都是些上歲數的名人嘛。

為了解決這個問題,特別是保證生成器能儘量提供符合當下審美的名字,我下載了人口普查報告中最受歡迎的新生兒名字,同時縮小了維基百科資料集的規模——即流行名字與維基百科內名人名字的交集。另外,我只保留了至少有50位名人取過的名字,最終得到了764個名字,其中大部分是男名。

在資料集裡,最受歡迎的是“John”,在維基百科上有10092條記錄。其次是William、David、James、George以及一大堆同樣來自聖經的男性名字。人氣最低的名字(我也保留了50個例子)則有Clark、Logan等等。為了解決這種嚴重偏見,我再次對資料集進行下采樣,為每個名字隨機選擇了100條對應的名人記錄。

模型訓練

在資料樣本整理完成之後,我決定訓練一套模型,根據維基百科中的摘要段落讓模型結合人物描述生成推薦名字。

下面來看維基百科中常見的名人介紹形式:

Dale Alvin Gribble,FOCUS動畫連續劇《山丘之王》中的虛構人物,由Johnny Hardwick配音、Stephen Root飾演,初次試鏡演員為Daniel Stern。Dale Gribble是革命性的“口袋揚沙”自衛術的發明者,賞金獵人,Daletech所有者,喜歡吸菸,痴迷槍支,同時也是各種陰謀論與都市傳奇的狂熱信徒。

為了防止模型作弊,我把例項中的名字與姓氏替換成了空白行“__”,所以上述簡介就變成了:

__ Alvin __ ,FOCUS動畫連續劇《山丘之王》中的虛構人物…

這就是模型的輸入資料,而其對應的輸出標籤為“Dale”。

在資料集準備就緒之後,我開始著手構建深度學習語言庫。我可以從多種方法中做出選擇(例如使用TensorFlow),但這裡我使用了AutoML Natural Language。這是一種無程式碼方法,可構建用於文字分析的深度神經網路。

我將資料集上傳至AutoML,由其將資料集自動拆分為36497個訓練示例,4570個驗證示例,以及4570個測試示例:

那麼,我的這款起名器到底表現如何?

有過建模經驗的朋友們,肯定知道評估品質的常規指標就是準確率與召回率。我這套模型的準確率為65.7%,召回率為2%。

但對於一款起名器來說,這些指標並不能真正說明問題。由於資料非常複雜,因此無法根據一個人的生活經歷找到“正確答案”。另外,姓名還具有很大的隨機性,所以任何模型都不可能做出真正準確的預測。

我的目標也並不是建立一套能夠100%準確預測人名的模型,而只是想試著建立一種能夠理解人名及其意義的模型。

對模型學習到的知識進行深入探究的一種可行方法,在於檢視名為混淆矩陣的表。該表用於指示模型所犯錯誤的具體型別。我們可以藉此進行除錯,或者快速實現完整性檢查。

在Evaluate選項卡中,AutoML提供現成的混淆矩陣。如下圖所示,僅為其中的一角:

在此表中,行標題為**True labes**,列標題則為**Predicted labels**。這些行表示某人的真實名字,而列則代表模型為該人預測出的名字。

例如,在標有“ahmad”的行中,我們看到一個淡藍色的框,標有“13%”。這意味著我們的資料集中,所有名為Ahmad的條目中,有13%的比例被我們的模型正確標記為“ahmad”。這時向右側框看去,在真名為“ahmad”的所有條目中,有25%被錯誤標記成了“ahmed”。另外有13%的條目被錯誤標記為“alec”。

儘管這些標籤出現了技術意義上的錯誤,但由此推斷,模型可能確實掌握了關於起名的一點小訣竅,因為“ahmad”與“ahmed”已經非常相近。Alec也類似,該模型在25%的情況下把Alecs標記為“alexander”,在現實生活中,“alec”與“alexander”確實沒多大區別。

執行健全性檢查

接下來,我打算看看這套模型能不能理解關於起名的基本統計規則。例如,如果我把某人形容為“她”,那麼模型能不能成功給出一個女名?

例如,“她喜歡美食”,那麼模型給出的推薦名稱為“Frances”、“Dorothy”以及“Nina”,後面幾個都是女性專用名,看起來好像不錯。

對於“他喜歡美食”,模型給出的推薦名包括“Gilbert”、“Eugene”以及“Elmer”。看來,模型似乎確實有了性別區分的概念。

下面,我們再來看實際測試過的其他幾項測試輸入與對應結果。

“他出生在紐澤西州。” — Gilbert

“她出生在紐澤西州。” — Frances

“他出生在墨西哥。” — Armando

“她出生在墨西哥。” — Irene

“他出生在法國。” — Gilbert

“她出生在法國。” — Edith

“他出生在日本。” — Gilbert

“她出生在日本。” — Frances

看來模型已經摸清了世界各地的起名傾向,這一點給我留下了深刻印象。但是,模型似乎很難弄清亞洲國家更喜歡哪些英文名,因此總是返回少量特別安全的名字(Gilbert與Frances)。這說明使用的訓練資料集不具備充分的全域性多樣性。

模型偏見

最後,我們要對模型偏見進行測試。大家可能知道,我們往往會在不經意間創建出存在嚴重偏見、種族主義傾向、性別歧視或者野蠻暴力問題的模型,這主要是因為其中使用的訓練資料集無法正確反映結果所指向的人群。因為維基百科的資料也有同樣的問題,所以我知道資料集中的男名要比女名多。

我還意識到模型應該會反映出訓練資料中的某些性別偏見問題——例如傾向於認為計算機程式是男性,而護士是女性。下面看看我的推理是否正確:

“TA將成為計算機程式設計師。” — Joseph

“TA將成為護士。” — Frances

“TA將成為醫生。” — Albert

“TA將成為宇航員。” — Raymond

“TA將成為小說家。” — Robert

“TA將成為家長。” — Jose

“TA將成為模特。” — Betty

好吧,這套模型似乎確實掌握了職業崗位中的傳統性別傾向,更讓我驚訝的是,它為“家長”指定了一個男性名字(Jose)。

總結來看,我的模型似乎確實在起名這方面學到了不少,但又跟我的期望不太一樣。所以我的下一代該叫什麼名字好呢……要不,乾脆叫Dale Jr.?

  • 讓孩子早點睡的實用妙招,家長必看!
  • 不孝,是我做過最正確的事:控制慾太強的父母只愛他們自己