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

2021-03-02 機器之心

選自ITNEXT

作者:Daniel Simmons

機器之心編譯

參與:程耀彤、李澤南

隨著新技術和新工具的出現,構建神經網絡已不再是一件需要大量機器學習相關知識的工作了。本文將會教你以 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 的底部文件中。

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

到目前為止都很容易。

現在,在這裡獲取 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,然後.

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

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

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

結果是.

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

6 - 受益

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

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

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

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權

✄---

加入機器之心(全職記者/實習生):hr@jiqizhixin.com

投稿或尋求報導:editor@jiqizhixin.com

廣告&商務合作:bd@jiqizhixin.com

相關焦點

  • 無需基礎知識,使用JavaScript構建你的第一個神經網絡
    隨著新技術和新工具的出現,構建神經網絡已不再是一件需要大量機器學習相關知識的工作了。本文將會教你以 JavaScript 庫 Brain.js 為基礎,構建並訓練自己的神經網絡。它真的很棒:https://github.com/BrainJS/brain.js也就是說,接下來的內容不是關於深入研究神經網絡的隱藏輸入層、激活函數或如何使用 TensorFlow 的教程。相反,這是一個簡單的、入門級別的關於如何實現 Brain.js 的解釋,這有點超出了文檔的範圍。
  • Keras入門系列教程:兩分鐘構建你的第一個神經網絡模型
    可以通過在代碼中設置save_format='h5'使用HDF5。構建一個簡單的模型順序模型在Keras中,您可以組裝網絡層來構建模型。模型通常是一個網絡層構成的圖。構建一個簡單的全連接的網絡(即多層感知器):model = keras.models.Sequential()# 添加一個含有64個神經網絡單元的全連接層到模型中,並且指定輸入數據的維度model.add(keras.layers.Dense(64, activation
  • 使用TensorFlow編寫您的第一個神經網絡
    介紹神經網絡是受生物神經網絡啟發而產生的一套特殊的機器學習算法,它們徹底改變了機器學習。簡單地說,它們是通用的函數近似,可以應用於幾乎任何關於學習從輸入到輸出空間的複雜映射的機器學習問題。神經網絡可能相當複雜,但在這篇文章中,我將解釋如何編寫您的第一個嘗試學習x和y之間的線性關係的神經網絡。y = 2 * x - 1上面的方程是一個簡單的線性方程,我們不一定需要神經網絡來學習這種關係。
  • 神經網絡原來這麼簡單 機器學習入門貼送給你
    你想學機器學習嗎?這裡有一個入門貼適合你。什麼神經網絡、隨機森林、計算機視覺通通一網打盡。這個Facebook軟體工程師做了一個入門貼。專為基礎為零的初學者打造。有基礎的同學,也可以來看看加深一下理解。
  • 入門| 關於神經網絡:你需要知道這些
    網絡(NN)幾乎可以在每個領域幫助我們用創造性的方式解決問題。本文將介紹神經網絡的相關知識。讀後你將對神經網絡有個大概了解,它是如何工作的?如何創建神經網絡?根據你希望建築物擁有的功能來安排磚塊的位置。水泥是權重。無論權重多大,如果沒有足夠的磚塊,建築物還是會倒塌。然而,你可以讓建築以最小的精度運行(使用最少的磚塊),然後逐步構建架構來解決問題。我將在後面的章節中更多地討論權重、偏置項和單元。
  • 神經網絡原來這麼簡單,機器學習入門貼送給你|乾貨
    白交 發自 凹非寺量子位 報導 | 公眾號 QbitAI你想學機器學習嗎?這裡有一個入門貼適合你。什麼神經網絡、隨機森林、計算機視覺通通一網打盡。這個Facebook軟體工程師做了一個入門貼。專為基礎為零的初學者打造。有基礎的同學,也可以來看看加深一下理解。我們就以神經網絡為例先來一睹為快吧!
  • 一文帶你入門圖神經網絡基礎、DeepWalk及GraphSage
    最近,圖神經網絡(GNN)在各種領域越來越流行,包括社交網絡,知識圖,推薦系統,甚至生命科學。
  • 圖神經網絡入門(五)不同類型的圖
    本文是清華大學劉知遠老師團隊出版的圖神經網絡書籍《Introduction to Graph Neural Networks》的部分內容翻譯和閱讀筆記。異構圖(HETEROGENEOUS GRAPHS)帶有邊信息的圖(GRAPHS WITH EDGE INFORMATION)動態圖(Dynamic Graphs)多重邊圖(Multi-dimensional Graphs)往期文章傳送門圖神經網絡入門
  • 如何使用Keras構建殘差神經網絡?
    什麼是殘差神經網絡?原則上,神經網絡的層數越多,應獲得越好的結果。一個更深層的網絡可以學到任何淺層的東西,甚至可能更多。如果對於給定的數據集,網絡無法通過添加更多的層來學習更多東西,那麼它就可以學習這些其他層的恆等映射(identity mappings)。這樣,它可以保留先前層中的信息,並且不會比較淺的層更糟糕。
  • 簡單圖神經網絡(GNN)的基礎知識
    本文將介紹簡單圖神經網絡(GNN)的基礎知識及其內在工作原理背後的直觀知識。不過,大家不用擔心,為了能夠更直觀地看懂究竟發生了什麼,作者在文中使用了大量彩圖給出圖解信息。 圖(Graph)是什麼? 圖是一種由連接在一起的節點(頂點)和邊構成的數據結構,可用於表示沒有明確起點或終點的信息。
  • 神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨
    白交 發自 凹非寺 量子位 報導 | 公眾號 QbitAI你想學機器學習嗎?這裡有一個入門貼適合你。
  • Python爬蟲基礎:常用HTML標籤和Javascript入門
    (由href屬性來指定)和在頁面上顯示的文本,用法為:<a href="http://www.baidu.com">點這裡</a>(4)img標籤在HTML代碼中,img標籤用來顯示一個圖像,並使用src屬性指定圖像文件地址,可以使用本地文件,也可以指定網絡上的圖片。
  • javascript入門推薦書籍-授人以魚不如授人以漁
    1、JavaScript Dom編程藝術推薦:《JavaScript Dom編程藝術》 理由:此書絕對是入門的好書,本人也是在接觸JS一段時間後才看的這本書。此書從JS的歷史 –JS基礎語法知識 – DOM介紹和簡單的使用。
  • 神經網絡中容易被忽視的基礎知識
    作為線性分類器的單個神經元比如基礎的邏輯回歸,結合上面的神經元知識,可以發現,邏輯回歸就是激活函數是sigmoid 的單層簡單神經網絡。這也說明我們一般用深層的神經網絡而不是淺層 「肥胖」 的網絡。注意:說神經網絡多少層數的時候一般不包括輸入層。 在神經網絡中的激活主要講的是梯度的更新的激活。為什麼在人工神經網絡中的神經元需要激活函數?
  • 無需深度學習框架,如何從零開始用Python構建神經網絡
    作者根據自己從零開始學習用 Python 構建神經網絡的經驗,編寫了一份攻略。內容涵蓋神經網絡定義、損失函數、前向傳播、反向傳播、梯度下降算法,對於想要了解深度學習運作原理的各位來說,內容精彩不可錯過。動機:為了深入了解深度學習,我決定從零開始構建神經網絡,並且不使用類似 Tensorflow 的深度學習庫。
  • 如何使用Elixir語言實現深度學習?剖析多層神經網絡的構建和訓練
    創建你的第一個神經網絡是比較簡單的,在過程中你可以看到如何用少量的代碼來自動完成一項給定的任務。在這篇文章中,我們將使用 Elixir 程式語言創建一個標準的 3x3 深度學習神經網絡。希望讀者能通過閱讀本文而對先進的遺傳編程(genetic programming)和 Elixir 中新的人工智慧技術有更深的理解。
  • 如何得出神經網絡需要多少隱藏層、每層需要多少神經元?
    來源 | 論智(ID:jqr_AI)該使用多少層隱藏層?使用隱藏層的目的是什麼?增加隱藏層/神經元的數目總能給出更好的結果嗎?人工神經網絡(ANN)初學者常常提出這些問題。如果需要解決的問題很複雜,這些問題的答案可能也會比較複雜。希望讀完這篇文章後,你至少可以知道如何回答這些問題。
  • 2020年新書《神經網絡新手入門必備數學基礎》免費pdf分享
    本書介紹 在本書中,試圖描述數學在塑造我們對神經網絡如何運作的理解中的作用,以及我們試圖在方程中捕捉神經網絡而產生的新奇的數學概念。我的目標讀者是非專家,我將呈現神經網絡任務、模型和計算的相對簡單的例子的有偏見的選擇,而不是試圖給出一個完整的百科全書式的回顧—關於這個領域的許多數學發展的描述。 本書最新版pdf免費下載地址:個人主頁「私信」,回復關鍵字「bg20」獲取下載地址。
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    對於許多開發者來說,TensorFlow是他們接觸的第一個機器學習框架。TensorFlow框架儘管意義非凡,引起極大關注和神經網絡學習風潮,但對一般開發者用戶太不友好。軟體開發者畢竟不是科學家,很多時候簡單易學易用是程式設計師選擇的第一要素。
  • 翻譯 | 《JavaScript Everywhere》第18章 帶Electron的桌面應用程式(^_^)
    值得慶幸的是,今天,我們能夠使用網絡技術來構建功能全面的桌面應用程式,而且學習曲線很小。我們正在構建什麼在接下來的幾章中,我們將為Notedly的社交筆記應用程式構建一個桌面客戶端。我們的目標是使用JavaScript和Web技術來開發桌面應用程式,用戶可以下載並安裝在計算機上。