版本对应:

本网页讨论的机器学习内容,为特定的机器学习内容(并未与CFD结合)。在《无痛苦NS方程笔记》中, 特定的将CFD与机器学习互相结合起来,无普适性机器学习内容。

ML: 循环神经网络、LSTM

在阅读本文之前,请阅读《无痛苦NS方程笔记》中的监督学习的数学算法一节。

循环神经网络以及变种主要用于跟序列有关的场景。比如输入一系列的文字,预测下一个文字是什么。说一段话,然后用机器判断接下来要说什么。循环神经网络在CFD领域也有一些应用,比如通过前述计算的流场数据,来推算后续的流场结果。在介绍长短期记忆网络(long short-term network)之前,首先介绍循环神经网络以及其缺点。

循环神经网络

循环神经网络非常好理解。在之前的各种神经网络中,输入的参数是固定的。比如对于卷积神经网络,输入一个图像,就是固定的1000个像素点。不能输入1001个像素点的图像以及999个像素点的图像。但是循环神经网络可以输入一个序列。这个序列内部的数据数量可以是任意的。因此循环神经网络有两个特点:

  1. 可以输入任意长度的数据;

  2. 前一个数据会对后一个预测产生影响;

考虑传统的神经网络,假定具有一个神经元,输入参数是\(x_1\),假定使用ReLU激活函数,其输出为:

(1)\[ w_{output}\max(0, w_1 x_1 + b_1)+b_{output} \]

其中的\(\max(0, w_1 x_1 + b_1)\)表示这一个神经元的输出,\(w_{output}\max(0, w_1 x_1 + b_1)+b_{output}\)整体表示最终的输出结果。传统的神经网络,如果需要处理\(x_2\)的数据,则有:

(2)\[ w_{output}\max(0, w_1 x_2 + b_1)+b_{output} \]

在循环神经网络中则不同,其增加一个新的权重\(w_2\)(一个神经元两个权重)。\(w_2\)权重用来计算\(\max(0, w_1 x_1 + b_1)\)对下一次预测的影响。因此输入下一次输入的是\(x_2\)的时候,循环神经网络的计算公式为:

(3)\[ w_{output}\max(0, w_1 x_2 + w_2(\max(0, w_1 x_1 + b_1)) + b_1)+b_{output} \]

以此类推,如果输入\(x_3\),其输出为

(4)\[ w_{output}\max(0, w_1 x_3 + w_2\max(0, w_1 x_2 + w_2(\max(0, w_1 x_1 + b_1)) + b_1) + b_1)+b_{output} \]

如果具有多个神经元,每个神经元都具有一个默认与常规神经元一样的权重\(w_1\),以及一个过去对现在影响的权重\(w_2\)

循环神经网络在输入很长的时间序列的时候会发生一些问题。这与多层全连接网络的问题是类似的。假定在所有的ReLU激活函数中,全部都是大于0的,那么对于上面的输入3个时间序列的情况下有:

(5)\[ w_{output}(w_1 x_3 + w_2(w_1 x_2 + w_2(w_1 x_1 + b_1) + b_1) + b_1)+b_{output} \]

里面最高阶的是\(w_2\)的平方项。如果输入50个时间序列的数据,则会出现\(w_2^{49}\)。这对于任何一个大于1的\(w_2\)或者小于1的\(w_2\)都是不合适的。其会产生梯度爆炸以及梯度消失的问题。其直接影响了原生的循环神经网络的适用性。

长短时记忆神经网络

长短时(期)记忆神经网络就是为了解决循环神经网络的梯度消失以及梯度爆炸问题而生的。