這篇被選為 NeurIPS 2018 最佳論文,他將連續的概念帶入了神經網路架構中,並且善用以往解微分方程的方法來做逼近,可以做到跟原方法(倒傳遞)一樣好的程度,而參數使用複雜度卻是常數,更短的訓練時間。

核心觀念

概念上來說,就是將神經網路離散的層觀念打破,將他貫通成為連續的層的網路架構。

連續和離散的差別來自於倒傳遞的過程:

$$
\mathbb{y}_{t+1} = \mathbb{y}_t - \eta \nabla \mathcal{L}
$$

其中 $\nabla \mathcal{L}$ 就是梯度的部份,是向量的,然而我們把他簡化成純量來看的話,他不過就是

$$
\frac{d \mathcal{L}}{dt}
$$

廣義上來說,一個函數的微分,如果是離散的版本就會是

$$
\frac{dy}{dt} = \frac{y(t + \Delta) - y(t)}{\Delta}
$$

如此一來,所形成的方程式就會是差分方程,然而連續的版本就是

$$
\frac{dy}{dt} = \lim_{\Delta \rightarrow 0} \frac{y(t + \Delta) - y(t)}{\Delta}
$$

這個所形成的會是微分方程。

從離散到連續

我們可以從離散的版本

$$
\frac{dy}{dt} = \frac{y(t + \Delta) - y(t)}{\Delta}
$$

把他轉成以下的樣貌

$$
y(t + \Delta) = y(t) + \Delta \frac{dy}{dt}
$$

要將他貫通的話,我們就得由從神經網路的基礎開始,如果是一般的前回饋網路(feed-forward network)當中的隱藏層是像下列這個樣子:

$$
h_{t+1} = f(h_t, \theta)
$$

我們可以發現像是 ResNet 這類的網路有 skip connection 的設置,所以跟一般的前回饋網路不同

$$
h_{t+1} = h_t + f(h_t, \theta)
$$

而 RNN 等等有序列概念的模型也有類似的結構,就是會是前一層的結果加上通過 $f$ 運算後的結果,成為下一層的結果。

這樣的形式跟我們前面提到的形式不謀而合

$$
y(t + \Delta) = y(t) + \Delta \frac{dy}{dt}
$$

只要我們把 $\Delta = 1$ 代入,就成了

$$
y(t+1) = y(t) + \frac{dy}{dt}
$$

以下給大家比對一下

$$
h_{t+1} = h_t + f(h_t, \theta) \\
y(t+1) = y(t) + \frac{dy}{dt}
$$

也就是,我們可以讓

$$
\frac{dy}{dt} = f(h_t, \theta)
$$

神奇的事情就發生了!神經網路 $f$ 就可以被我們拿來計算微分 $\frac{dy}{dt}$!

比較精確的說法是,把神經網路的層 $f$ 拿來逼近微分項,或是說梯度。這樣我們後面就可以用數值方法來逼近解。

$$
y(t + \Delta) = y(t) + \Delta \frac{dy}{dt} \\
\downarrow \\
y(t + \Delta) = y(t) + \Delta f(t, h(t), \theta_t)
$$

要拉成連續的還有一個重要的手段,就是將不同的層 $t$ 從離散的變成連續的,所以作者將 $t$ 做了參數化,將他變成 $f$ 的參數之一,如此一來,就可以在任意的層中放入資料做運算。

最重要的概念導出了這樣的式子

$$
h(t) \rightarrow \frac{dy(t)}{dt} = f(h(t), t, \theta) \rightarrow y(t)
$$

神經網路作為一個系統的微分形式

在傳統科學或是工程領域,我們會以微分式來表達以及建構一個系統。

$$
\nu = \frac{dx}{dt} = t + 1
$$

其實在這邊是一樣的道理,整體來說,我們是換成用神經網路去描述一個微分式,其實本質上就是這樣。

原本的層的概念就是用數學函數來建立的,而層與層之間傳遞著計算的結果。

$$
\mathbb{h_1} = \sigma(W_1 \mathbb{x} + \mathbb{b_1}) \\
\mathbb{y} = \sigma(W_2 \mathbb{h_1} + \mathbb{b_2})
$$

然而變成連續之後,我們等於是用神經網路中的層去建立跟描繪微分形式。

$$
\frac{d h(t)}{dt} = \sigma(W(t) \mathbb{x}(t) + \mathbb{b(t)}) \\
\frac{d y(t)}{dt} = \sigma(W(t) \mathbb{h}(t) + \mathbb{b(t)})
$$

是不是跟如出一轍呢?

$$
\frac{dy(t)}{dt} = f(h(t), t, \theta)
$$

向前傳遞解微分式

我們可以來計算看看隱藏層是長什麼樣子的。在隱藏層的微分式中,也是利用隱藏層去計算出來的。

$$
\frac{dh(t)}{dt} = f(h(t), t, \theta)
$$

基本上,我們只要對上式做積分就可以了。

$$
h(t) = \int f(h(t), t, \theta) dt
$$

這是一個怎樣的概念呢?我們可以來看看下圖。

我們做積分這件事其實是用 $h(t_0)$ 來推斷 $h(t_1)$ 的,這跟神經網路的向前傳遞是一樣的行為。

$$
h(t_1) = F(h(t), t, \theta) \bigg|_{t=t_0}
$$

這樣的積分動作,我們可以用 $t_0$ 時間點的資訊來解 $h(t_1)$。

這樣的解法在程式上就會交由 ODE Solver 去處理。

$$
h(t_1) = ODESolve(h(t_0), t_0, t_1, \theta, f)
$$

反向傳遞解函數

$$
\mathcal{L}(t_0, t, \theta) = \mathcal{L}(ODESolve(\cdot))
$$

$$
\frac{\partial \mathcal{L}}{\partial h(t)} = -a(t)
$$

adjoint state

$$
a(t) = \int -a(t)^T \frac{\partial f}{\partial h} dt = - \frac{\partial \mathcal{L}}{\partial h(t)}
$$

$$
a(t) = \int_{t_1}^{t_0} -a(t)^T \frac{\partial f(h(t), t, \theta)}{\partial h(t)} dt
$$

擴充狀態(augmented state)

$\frac{d \theta}{dt} = 0$

$\frac{dt}{dt} = 1$

let $\begin{bmatrix}
h \\
\theta \\
t
\end{bmatrix}$ be a augmented state

augmented state function:

$$
f_{aug}(\begin{bmatrix}
h \\
\theta \\
t
\end{bmatrix}) =
\begin{bmatrix}
f(h(t), t, \theta) \\
0 \\
1
\end{bmatrix}
$$

augmented state dynamics:

$$
\frac{d}{dt}
\begin{bmatrix}
h \\
\theta \\
t
\end{bmatrix}

f_{aug}(
\begin{bmatrix}
h \\
\theta \\
t
\end{bmatrix})
$$

augmented adjoint state:

$$
\begin{bmatrix}
a \\
a_{\theta} \\
a_t
\end{bmatrix}
$$

$a = \frac{\partial \mathcal{L}}{\partial h}$

$a_{\theta} = \frac{\partial \mathcal{L}}{\partial \theta}$

$a_t = \frac{\partial \mathcal{L}}{\partial t}$

$$
\frac{d a_{aug}}{dt} = -
\begin{bmatrix}
a \frac{\partial f}{\partial h} \\
a \frac{\partial f}{\partial \theta} \\
a \frac{\partial f}{\partial t}
\end{bmatrix}
$$

留言與分享

原本是算到今天就會發完 30 天的文章了,不過系統似乎把第一天跟第二天的文章判定是第一天的了。

我記得我最早參加鐵人賽的時候,一次接受兩個挑戰,分別寫了 Julia 語言以及基礎的機器學習。

這次的系列文章是在基礎之上,讓大家得以理解不同模型之間的來龍去脈以及變化性,這樣才有辦法更進一步進展到深度學習的領域。

完成這次鐵人賽的意義在於讓大家理解模型的來龍去脈,以及為什麼要用什麼樣的數學元件去兜一個模型。

當你遇到問題的時候,不可能會有一個 ready-to-use 的模型等在那邊給你用,對於人工智慧的技術應用,你必須要為自己所面對的問題和狀況自己去量身訂作自己的模型。

是的!你沒看錯,必須要由領域專家去理解自己要的是什麼,然後自己做出專門給這個情境的模型。

當你的情境非常特殊的時候,讓深度學習專家來深入其他知識領域是非常花時間的。如果以領域專家及深度學習專家之間以合作模式進行,那將會花費更高的成本在溝通上,因為人工智慧的技術應用需要對特定領域非常敏感。我個人認為只有領域專家繼續鑽研成為深度學習專家才有辦法徹底解決特定領域的問題。當然這條路非常的漫長,等於是需要一個特定領域的博士,以及深度學習的博士的等級。這些問題,只有當領域專家自己 理解 之後,不是只有 解決 問題,才能夠算是真正的 解決 了。

這系列文獻給擁有機器學習基礎,想繼續晉升到深度學習領域的朋友們。

感謝大家的支持!

留言與分享

繼 Attention model 之後,由於 recurrent 架構的特性一直無法善用 GPU 的資源做加速。

這時 Google Brain 團隊就看到別人在用 self-attention 機制,也是基於 recurrent 架構,解決了不少問題,用在閱讀理解、摘要、文字蘊涵(textual entailment)及語句表示的問題上。

Google Brain 團隊就提出了史上第一個不需要依賴任何 recurrent 架構的 self-attention 機制模型,Transformer。

(跟變形金剛一樣的名字耶!帥吧!)

繼續閱讀

繼 Seq2seq model 之後,真正可以做到 end-to-end 翻譯的,很多都是用了 attention model。

Attention model,正確來說,不是指特定的一個模型,他是模型的一個部份或是一種設計,所以有人叫他 attention mechanism。

Attention model 被用在機器翻譯、語句的摘要、語音辨識、影像理解(image caption),算是用途非常廣泛。

繼續閱讀

當大家正在開心的用著 RNN 跟 LSTM 等等模型之時,就有人跳出來了。

不要再用 RNN 為基礎的模型了!!

就是這篇 The fall of RNN / LSTM

為什麼呢?

基本上裏面提到 vanishing gradient 的問題一直沒有解決以外,還有沒有辦法善用硬體的侷限在。

像這種循序型的模型,模型天生無法平行化運算,所以 GPU 就無用武之地,只能靠 CPU 慢慢跑。

那有什麼解決辦法呢?

Self-attention model

Attention Is All You Need 這篇文章提出了 Transformer 這個模型,基本上這個模型使用了 self-attention 的機制。

要講這個之前我們要先聊聊 attention model。在 attention model 之前,sequence-to-sequence model 做出了重大的突破。一個具有彈性,可以任意組合的模型誕生了,管你是要生成句子還是怎麼樣。原本是只有 RNN 一個單元一個單元慢慢去對映 X 到 Y,sequence-to-sequence model 將這樣的對應關係解耦,由一個 encoder 負責將 X 的資訊萃取出來,再經由 decoder 將資訊轉換成 Y 輸出。

但是 LSTM 還是沒辦法記憶夠長的,後來 attention model 就誕生了。乾脆就將 encoder 所萃取到的資訊紀錄下來,變成一個,然後再丟到 decoder 去將資訊還原成目標語言,就可以完成機器翻譯了。

但是這種方式還是不脫 recurrent model,那就乾脆做成 self-attention 的機制,也就是這邊的 Transformer,完全摒棄了 recurrent 的限制。

Autoregressive generative model

接著是今年6月的文章 When Recurrent Models Don’t Need to be Recurrent,當你的 recurrent model 不必再 recurrent!

也就是將 RNN 的問題又重述了一遍,並且提出大家都漸漸以 autoregressive generative model 來解決這樣的問題。

這篇算這引言,我接下來會開始一一解釋模型。

留言與分享

接續上一篇。

Recurrent neural network

那大家所熟知的 RNN 是怎麼回事呢?我們把假設改了一下:

  • 狀態都是 連續 的。
  • 時間是離散的。
  • 內在狀態是不能被觀察的,外在狀態是可被觀察的。
  • 以一個 隨機向量 作為一個狀態。
  • 允許在每個時間點給輸入
  • 引入非線性

首先,在這邊的狀態會以一個向量做表示,大家應該也知道 RNN 的 input 是一個向量,當中的狀態也是一個向量,最後的 output 也是一個向量。而這些向量當中的的值都是連續的 $\mathbb{R}^n$(假設向量大小為 n),不像上面的模型都是離散的 $k$(假設有 k 個狀態),所以在空間上的大小可以說是擴大非常多。

接下來我們來看看時間的狀態轉換:




在 RNN 中一樣含有內在狀態,但不同的是 RNN 可以在每個時間點上給輸入向量($\mathbf{x^{(t)}}$),所以可以根據前一個時間點的內在狀態($\mathbf{h^{(t)}}$)跟輸入向量去計算輸出,或是外在狀態($\mathbf{y^{(t)}}$)。

所以大家會在一些論文上看到模型的狀態關係式長下面這個樣子:

$$
\mathbf{h^{(t)}} = f(\mathbf{x^{(t)}}, \mathbf{h^{(t-1)}}) = \mathbf{x^{(t)}} W_x + \mathbf{h^{(t-1)}} W_h + \mathbf{b}
$$

$$
\mathbf{y^{(t)}} = g(\mathbf{h^{(t)}}) = sigm(\mathbf{h^{(t)}} W_y)
$$

這邊特別引入了非線性的轉換($sigm$)來讓模型更強大。

隨著從一開始的馬可夫模型到這邊應該對這幾個模型有點感覺,其實 RNN 可以說是很大的突破,在假設上放了很多元素讓模型變得更強大。

Long short-term memory

人們為了改進 RNN這個模型的記憶性,希望他可以記住更遠以前的東西,所以設計了 LSTM 來替換他的 hidden layer 的運作模式,後期更有 GRU,還有人說只需要 forget gate 就有很強大的效能的 MGU。這些都是對於記憶性做的改進,個人覺得這些在工程上的貢獻比較大,真正學術上的突破其實還好。

今天的整理就先到這邊啦!

留言與分享

Yueh-Hua Tu

目標是計算生物學家!
Systems Biology, Computational Biology, Machine Learning
Julia Taiwan 發起人


研發替代役研究助理


Taiwan