無需基礎知識,使用JavaScript構建你的第一個神經網絡

隨著新技術和新工具的出現,構建神經網絡已不再是一件需要大量機器學習相關知識的工作了。本文將會教你以 JavaScript 庫 Brain.js 為基礎,構建並訓練自己的神經網絡。

設定目標

(如果你只想直接上手,請跳過這部分......)

首先,本文作者還不是神經網絡或機器學習方面的專家。坦率的說,我仍然對人工智能的大部分內容感到困惑。但希望這能夠鼓勵到正在讀這篇文章,並急切想嘗試機器學習的初學者們。

機器學習是近年來在人們眼前時不時會出現的新概念,這讓我不禁對自己說:「看起來這很酷,但是我不確定我是否想在接下來幾個月的時間裡學習線性代數和微積分……」

然而,和很多的開發人員一樣,我對 JavaScript 很感興趣,偶爾也會尋找在 JS 中實現機器學習的例子,結果卻發現大量的文章和 StackOverflow 的帖子都在告訴我們對於機器學習來說 JS 是一種多麼糟糕的語言。誠然,目前這種觀點還是事實。然後我就有所動搖了,認為他們是對的,我應該回頭去驗證格式輸入並等待 CSS 網格的啟動。

但是後來我發現了 Brain.js,這讓我大吃一驚。它在是如何被人們雪藏的?!這個庫的文檔寫得非常好且易於遵循,在上手大約 30 分鐘之內,我就建立並訓練了一個神經網絡。事實上,如果你想直接跳過整篇文章,僅僅在 Github 上閱讀該庫的教程,請便。它真的很棒:https://github.com/BrainJS/brain.js

也就是說,接下來的內容不是關於深入研究神經網絡的隱藏輸入層、激活函數或如何使用 TensorFlow 的教程。相反,這是一個簡單的、入門級別的關於如何實現 Brain.js 的解釋,這有點超出了文檔的範圍。

構建一個神經網絡

以下是我們將要做的事情的概述:

1. 創建你的起始文件

2. 決定你想要你的神經網絡做什麼

3. 設置 Brain.js 並搞清楚如何處理訓練數據和用戶輸入

4. 收集一些訓練數據

5. 運行神經網絡

6. 利潤?

如果你希望直接下載此項目的可用版本,而不是按照文章進行操作,那麼你可以在這裡克隆 Github 存儲庫:https://github.com/lordpoint/neural-network-author-classifier

1 - 起始文件

創建一個新目錄並在其中放置一個 index.html 樣板文件。然後創建三個 JS 文件:brain.js、 training-data.js 和 scripts.js(或用於默認 JS 文件的任何通用項),隨後將所有這些文件導入到 index.html 的底部文件中。

無需基礎知識,使用JavaScript構建你的第一個神經網絡

永遠不要害怕觀察文件結構

到目前為止都很容易。

現在,在這裡獲取 Brain.js 的源代碼:https://raw.githubusercontent.com/harthur-org/brain.js/master/browser.js

將全部內容複製並粘貼到空的 Brain.js 文件中,點擊 save 和 bam:完成 4 個文件中的 2 個。

2 -「我的目的是什麼?」

接下來是有趣的部分:決定你的機器能學到什麼。今天的機器學習模型可以解決無數的實際問題,例如,進行情感分析或圖像分類等。我碰巧認為將文本作為輸入的機器學習的應用程序非常有趣,因為你幾乎可以在任何地方找到訓練數據,而它們還有各種各樣的潛在用途,所以我們將在這裡使用的例子是一個處理文本分類的例子:

我們將訓練一個模型,讓它判定一條推特是由 Donald Trump(唐納德·特朗普)還是 Kim Kardashian(金·卡戴珊)寫的。

Ok,這可能不是最有用的應用程序。但是 Twitter 是機器學習素材的寶庫,儘管它可能是無用的,但我們的推特作者識別器仍然會說明一個強大的觀點。一旦它被訓練完成,我們的神經網絡將可以在看到它從未看過的推特後確定它是由 Donald Trump 還是 Kim Kardashian 所發出的,僅僅通過識別他們所寫東西中的模式。為了做到這一點,我們將需要提供儘可能多的訓練數據,以便將其複製/粘貼到我們的 training-data.js 文件中,然後我們可以看看我們是否能找到一些推特的作者。

3 - 建立和數據處理

現在剩下要做的就是在我們的 scripts.js 文件中建立 Brain.js,並提供一些在 training-data.js 文件中的訓練數據。但是在此之前,讓我們先從整個項目的高度上來看一下這些組件是如何工作的。

建立 Brain.js 非常簡單,所以我們不會花費太多時間,但是有一些關於如何預測其輸入數據被格式化的細節,我們應該先來看一下。我們先看一下文檔匯中包含的建立示例(我在此略微做過修改),這些示例很好地說明了這一點:

let net = new brain.NeuralNetwork();net.train([ { Input: { r: 0.03, g: 0.7, b: 0.5 }, Output: { black: 1 } },{ Input: { r: 0.16, g: 0.09, b: 0.2 }, Output: { black: 1 } },{ Input: { r: 0.5, b: 0.5 }, Output: { black: 1 } }]);let output = net.run({ r: 1, g: 0.4, b: 0 });

首先,上面的例子實際上是一個可用的 AI(它看著給定的顏色,然後告訴你黑色文本還是白色文本在上面更清晰)。它可以說明 Brain.js 是多麼容易使用。只是實例化、訓練、然後運行而已。我的意思是,如果你將訓練數據內聯,將會是 3 行代碼。非常簡潔。

現在讓我們來談一下訓練數據。在上面的例子中,除了訓練數據整體 input: {}, output: {} 的格式,還有兩個重要的事情需要注意。

首先,數據不需要長度相同。正如你在上面第 11 行看到的,只有一個 R 和 B 值通過,而另外兩個輸入通過了 R、G 和 B 的值。另外,值得一提的是,即使上面的例子將輸入看作對象,你也可以使用數組。我提到這點很大程度上是因為我們將在項目中傳遞不同長度的數組。

第二,這些不是有效的 RGB 值。如果你想真的使用它們,每個都會變成黑色。這是因為輸入值必須介於 0 和 1 之間才能使 Brain.js 和它們一起工作。因此,在上面的例子中,每種顏色都必須經過處理(可能只是經過一個將其除以 255 的函數進行處理——RGB 的最大值)以使其工作。之後我們也會做同樣的事情。

3.1—encode()

所以如果我們想讓神經網絡接受推特(即字符串)為輸入,我們需要通過一個類似的函數(下面稱為 encode())來處理它們,這將使字符串中的每一個字符變成一個介於 0 和 1 之間的值,並將其儲存在一個數組中。幸運的是,Javascript 有一個將字符轉化成 ASCII 的簡單方法,叫做 charCodeAt()。所以我們將使用它並將輸出除以 擴展的 ASCII 碼的最大值:255(我們用擴展的 ASCII 碼,以防遇到像é 或 ½ 這樣的邊緣情況),這將確保我們得到的值 <1。

3.2—processTrainingData()

另外,我們會將訓練數據存儲為純文本,而不是我們最終將輸入到人工智能的編碼數據——稍後你將會看到這樣做的好處。所以我們需要另一個函數(下面稱為 processTrainingData())將前面提到的編碼函數應用到訓練數據中,有選擇地將文本轉換為編碼字符,並返回一組訓練數據,這些數據將與 Brain.js 很好的工作。

下面是所有的代碼(這會進入你的 『scripts.js』 文件中):

let trainedNet;function encode(arg) { return arg.split('').map(x => (x.charCodeAt(0) / 255));}function processTrainingData(data) { return data.map(d => { return { input: encode(d.input), output: d.output } })}function train(data) { let net = new brain.NeuralNetwork(); net.train(processTrainingData(data)); trainedNet = net.toFunction(); console.log('Finished training...');};function execute(input) { let results = trainedNet(encode(input)); let output; results.trump > results.kardashian ? output = 'Trump' : output = 'Kardashian'; return output;}train(trainingData);

31 行,工作開始變多了。

在這裡你會注意到在 train() 函數中的第 20 行有前面文檔的示例中沒有提到的(除了我們已經討論過的兩個輔助函數外),它將訓練過的神經網絡保存到一個叫 trainedNet 的全局變量中。這可以防止我們每次使用神經網絡時不得不重新訓練它們。一旦網絡被訓練並保存到變量中,我們可以將它稱為函數,並傳入編碼輸入(如 execute() 函數中的第 25 行)以使用機器學習模型。

好的,所以現在你的 index.html、brain.js、和 scripts.js 文件都完成了。現在我們需要的是將一些東西放入 training-data.js 中,準備好開始吧。

4 - 訓練

下一個重要任務是進行訓練。像我之前提到的,我們將所有推特存儲為文本,並將它們編碼為數值,這將使你在實際需要複製/粘貼訓練數據時變得更加容易。沒有必要的格式。只需要在文本中粘貼並添加一個新行。

const trainingData = [ { input: "Inside Chi's nursery", output: { kardashian: 1 } },{ input: "Why I dyed my hair pink", output: { kardashian: 1 } },{ input: "Feeling Blue (wearing @kkwbeauty powder contour in medium & dark contour kit as eye shadow, & a new lip coming soon)", output: { kardashian: 1 } },{ input: "I will be interviewed by @JudgeJeanine on @FoxNews at 9:00 P.M. Enjoy!", output: { trump: 1 } },{ input: "Dem Memo: FBI did not disclose who the clients were - the Clinton Campaign and the DNC. Wow!", output: { trump: 1 } },{ input: "Thank you to the great men and women of the United States @SecretService for a job well done!", output: { trump: 1 } }]

把它添加到你的 『training-data.js』 文件中,我們就大功告成了!

注意:雖然上面的例子只顯示了每個人的 3 個樣本,但我用了 10 個;我只是不希望這個樣本佔用太多空間。當然,你的神經網絡的準確性會隨著你提供的訓練數據量的增加而成比例的增加,所以你可以隨意使用比我更多或更少的數據,看看數據集體量是如何影響模型性能的。

5 - 執行

現在,運行新訓練的神經網絡只需要在 『script.js』 文件的底部額外添加一行調用 execute() 函數的指令,並傳入一個 Trump 或 Kardashian 的推特。確保要有記錄(console.log),因為我們還沒有建立 UI。下面是一個來自 Kim Kardashian 的推特,它不在我的訓練數據中(即神經網絡之前沒有見過這篇推特):

console.log(execute("These aren't real. Kanye would never write Yeezy on the side"));

然後在本地主機上拉起 index.html 頁面,檢查 console,然後......

無需基礎知識,使用JavaScript構建你的第一個神經網絡

在這裡!該網絡正確識別了它之前從未見過的來自 Kim Kardashian 的推特,確定性為 86%。

現在讓我們用 Trump 的推特再嘗試一下:

console.log(execute("Whether we are Republican or Democrat, we must now focus on strengthening Background Checks!"));

結果是......

無需基礎知識,使用JavaScript構建你的第一個神經網絡

再一次,一個從未見過的推特。再一次,正確識別!這次有 97% 的確定性。

6 - 受益

現在你有一個神經網絡可以訓練你想要的任何文本!你可以輕鬆地調整它來識別電子郵件或公司在線評論中的情緒,識別垃圾郵件,分類博客文章,確定信息是否緊急,或任何上千種不同的應用程序。儘管我們的推特識別器是無用的,但是它仍然說明了一個非常有趣的觀點:像這樣的神經網絡可以執行類似根據寫作方式識別作者這樣的細緻入微的任務。

所以,即使你並沒有試圖創建一個以機器學習為基礎的應用或可用工具,這仍然是你開發工具中很好的經驗。你永遠不知道這些知識什麼時候就能派上用場,甚至可能在未來開闢新的機會。

無需基礎知識,使用JavaScript構建你的第一個神經網絡

原文鏈接:https://itnext.io/you-can-build-a-neural-network-in-javascript-even-if-you-dont-really-understand-neural-networks-e63e12713a3


分享到:


相關文章: