在瀏覽器中進行深度學習:TensorFlow.js (一)基本概念

作為deeplearn.js的繼任者,tensoflow.js 支持在瀏覽器或者nodejs中利用JavaScript來運行深度學習。並且能夠支持GPU和現有的Tensorflow的模型。該項目的首頁上有幾個很酷炫的演示。作為熱愛機器學習和前端數據可視化的我怎能不心動呢。快來和我一起來看看如何利用tensorflow.js來進行深度學習之旅吧。

線性代數(Linear algebra)是深度學習的數學基礎。張量(Tensor)是線性代數的基本數學概念和運算單元。我們來了解一下tensorflow.js中有關張量的基本概念和運算。

張量的概念

標量 Scalar

標量就是一個簡單的數字,概念就是只有大小,沒有方向。

const scalar = tf.scalar(5);print_tensor([scalar]);

注意:print_tensor()是我實現的一個JS方法,在瀏覽器中以表格的形式顯示張量的內容,最高兩個維度。輸入是一個張量的數組。如果不想在瀏覽器中看到結果,也可以調用tensor.print()方法,在console中查看張量的內容。

以上的代碼,創建了一個數值為5,維度(Rank)0 的標量。

向量/矢量 Vector

向量就是一個一維數組,概念就是有大小和方向。

const vector = tf.tensor1d([0, 1, 2, 3, 4]);print_tensor([vector]);

以上的代碼,創建了一個數值為[0,1,2,3,4],維度 1 的向量。形狀(Shape)描述了各個維度的容量或者說大小,這裡是5.

張量 Tensor

矩陣(Matrix)擁有兩個維度,在更高的維度,就是張量。其實所有的標量,矢量,矩陣都可以用張量表示,只是維度不同。

在Tensoflow中Rank表示了維度的等級,對應如下

  • 標量 0 tf.scalar
  • 矢量 1 tf.tensor1d
  • 矩陣 2 tf.tensor2d
  • 張量 2+ tf.tensor3d, tf.tensor4d

const matrix = tf.tensor2d([[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]]);print_tensor([matrix]);

以上的代碼,創建了一個數值為[[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]],維度 2 的矩陣。形狀是2X3,兩行,三列。

一張圖來直觀說明:

tensorflow.js提供了對張量的創建和生成,變形,切片和合併等方法,用於對數據的準備。

張量的運算

張量-標量運算

張量和標量之間的數學運算(加減乘除冪)比較簡單,只要直接把張量的每一個元素和標量進行對應的數學運算就好了。

const t = tf.tensor([[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]]);const s = tf.scalar(3);print_tensor([t,s,t.add(s),t.mul(s)])

張量和標量的數學運算不會改變張量的形狀,並且滿足算術運算的基本定律,例如加法交換律,乘法結合律等等。

張量-張量加減乘

具有相同形狀的張量可以進行加減操作。只要把對應的元素做加減就好了。

const a = tf.tensor1d([1, 2, 3, 4]);const b = tf.tensor1d([10, 20, 30, 40]);print_tensor([a,b,a.add(b),a.sub(b),a.mul(b)])

張量-張量 點積

張量的積 tensor.matMul() 在深度學習中被大量的應用,下圖給出了一個矩陣點積的例子:

簡單說一個m*n的矩陣和一個n*k的矩陣的點積得到一個m*k的矩陣。

const a = tf.tensor2d([[1, 2], [3, 4]]);const b = tf.tensor2d([[5, 6, 7], [7, 8, 9]]);print_tensor([a, b, a.matMul(b)]);

注意,矩陣的點積不滿足乘法交換律,AB != BA

const a = tf.tensor2d([[1, 2], [3, 4]]);const b = tf.tensor2d([[5, 6], [7, 8]]);print_tensor([a, b, a.matMul(b), b.matMul(a)]);

矩陣轉置 (Transpose)

矩陣的轉置就是將矩陣的所有元素繞著一條從第1行第1列元素出發的右下方45度的射線作鏡面反轉,即得到矩陣的轉置。

const a = tf.tensor2d([[1, 2], [3, 4],[5,6]]);print_tensor([a, a.transpose()]);

單位矩陣(Identity Matrix)

就像數學中的1,任何數字和1相乘都是這個數本身。單位矩陣的特性就是任何矩陣和單位矩陣的點積的結果都是原矩陣本身。單位矩陣就是一個n*n的矩陣對角線上的元素都是1,其它為0。

利用tf.oneHot() 可以生成一個單位矩陣。

const identity = tf.oneHot(tf.tensor1d([0, 1, 2]), 3);print_tensor([identity]);

我們以後再去研究利用tf.initializers.identity來初始化單位矩陣。

矩陣的逆 (Inverse)

如果一個矩陣和另一矩陣相乘得到單位矩陣,那麼這個矩陣就是該矩陣的逆。

tensorflow 提供了矩陣的逆操作,tf.matrix_inverse

然而tensorflow.js中並沒有對應的操作。(考慮到當前的版本是0.6.1,我們就忍了。另外據說深度學習並沒有用到任何矩陣的逆操作。)

注意,並不是所有的矩陣都是可逆的,有些矩陣找不到逆矩陣。

進一步了解矩陣的逆可以參考這篇文章

兩個矩陣的除法可以理解為一個矩陣和另一個矩陣的逆的點積。

Reduction

深度學習中常常需要對張量各個維度進行統計。例如求均值,總和等等。tensorflow.js提供了相應的操作。

const x = tf.tensor2d([[1, 2, 3],[4,5,6]]);print_tensor([x, x.mean(),x.max(),x.min(), x.sum()]);

這裡給出了一個矩陣的所有元素的均值,最大值,最小值和總和,也可以針對行和列做相應的操作。

下面的代碼對於每一列做相應的統計。

const x = tf.tensor2d([[1, 2, 3],[4,5,6]]);print_tensor([x, x.mean(0),x.max(0),x.min(0), x.sum(0)]);

除了上面提到的操作,tensorflow.js還提供了:

  • 基本的數學運算諸如三角函數,對數,開方等
  • 邏輯操作
  • ... ...

總結

本文描述了張量的基本概念和操作,並給出了tensorflow.js中的代碼例子。線性代數作為機器學習,尤其是深度學習的數學基礎,值得大家去了解和掌握。

本文中所有的代碼示例大家都可以在我的codepen中運行。

參考

  • Tensor PlayGround
  • 可汗學院線性代數
  • Beginner Tensorflowjs Examples in Javascript
  • Tensorflow.js官網
  • Tensorflow.js代碼

推薦閱讀:

TAG:機器學習 | 深度學習DeepLearning | TensorFlow |