神经网络的传播原理
本文介绍的是指深度神经网络 DNN 和 BP算法。
读 N 遍,推导一遍,用代码实现一遍 。还不懂,再来打我。
前不久换了一份工作,使得我能够真正的在工作中使用到机器学习中的神经网络。在此之前自学机器学习其他算法时也曾经去看过有关神经网络的文章,当时看完是一脸懵逼,不知所云,后来不了了之。幸运的去年参加了考研(虽然没有考上),复习了数学三的知识点,对我理解机器学习算法有很大的帮助。之所以写这篇文章主要是为了记下自己对于神经网络理解的思路,并分享给有需要的人。
首先说一下,要看懂神经网络必备的数学知识,那就是高等数学中多元微分(偏导数的求解),里面涉及到链式求导法则,这是我在复习数三的时候学到的,以前并不知道,还有就是比较简单的线性代数(矩阵的乘积)。
我会尽量将表达的详细些,但可能依然有人不会一遍就能看明白,反正我在学习的过程中是看了好多篇才看明白的,正所谓“书读百遍,其意自现。”所以大家如果一遍没看懂,不要灰心,或许只是这个笔者的表达方式不符合你的理解逻辑,多搜索几篇就好。
下面进入正题……篇幅有点长,但一定要逐句看完并理解。
名词解释
很多博客对于表达神经网络时,都会有些专业词语,比如:神经元,节点,xx层等等,我第一次看的时候是没有看明白的,WTF!什么鬼?
神经网络必须包含输入层、输出层,隐藏层可以没有,也可以包含多层隐藏层。每层都有一些节点,也叫神经元,但是你最好理解为特征向量,一个节点(神经元)就是一个特征向量。下面我将通俗的解释几个主要词汇。
-
神经元(节点,维度)
有时候在搜索博客时,你可能常常会看到‘某层有多少个神经元’,或者‘某层有多少个节点’,又或者‘某层有多少个维度’等等等等。但你只要知道,它们指的都是一个特征向量。在输入层的,就是你的原始数据的输入的特征向量,在其他层的,则是通过一系列线性或非线性变换得到的特征向量。直观上不正式的讲,就是数据中的‘一列’。
-
输入层
有了神经元的理解,下面理解网络层的概念就不难。由于一个神经元是一个特征向量,那么一个层由多个神经元组成,则它是一个矩阵,最常见的就是二维矩阵(表格数据)了。
那么输入层,顾名思义,就是输入数据的那一层。这一层的节点个数就是你数据的特征(变量)个数,每个节点(神经元)就是一个特征列向量(我假设了你的数据是一个csv文件,每一列是一个特征,每一个行是一个样本。)
-
隐藏层
其实就是输入层中的二维数据,经过各种矩阵点积、公式变换后的特征向量,也是每个节点(神经元)就是一个特征向量。
-
输出层
这个理解稍微难一点,先说定义,如果是分类任务,则输出节点(神经元)就是类别的个数,每个节点(神经元)同样是一个列向量,但对于二分类,输出节点可以是1个,也可以是2个,而回归任务,输出的节点(神经元)就是一个。
看完上门的三个定义,我猜你肯定一脸懵逼,WTF!你这写的还没其他博客详细,下面我来举个例子来解释下输入层的节点(神经元)(输出层和隐藏层是一个意思,后面会详细表述)。假设你的数据如下:
V1 | V2 | Y |
---|---|---|
0.2 | 0.1 | 1 |
0.5 | 0.8 | 0 |
0.1 | 0.2 | 1 |
这个数据应该很容易懂,V1,V2是变量,Y是标签,每一行对应的一个样本,做机器学习的不可能看不懂这个,对吧?
好,接下来,你打算设计一个神经网络模型,于是你在草稿纸上设计了一下,像下面这个这样:
这是一个没有隐藏层、也没有偏置的神经网络结构,或许叫它神经网络不够严谨,但对于理解神经网络有非常重要的作用。
对应数据,图中的节点的意思是这样的:
V1 = [0.2, 0.5, 0.1];
V2 = [0.1, 0.8, 0.2];
写成向量的形式的话,应该是这样:
V 1 = [ 0.2 0.5 0.1 ] , V 2 = [ 0.1 0.8 0.2 ] V1 = \begin{bmatrix} 0.2 \\ 0.5 \\ 0.1\end{bmatrix}, V2 = \begin{bmatrix} 0.1 \\ 0.8 \\ 0.2\end{bmatrix} V1=⎣⎡0.20.50.1⎦⎤,V2=⎣⎡0.10.80.2⎦⎤
**重点声明,重点声明,重点声明:**一个节点表示一个向量,一层是多个节点组成的矩阵,一条黑线表示一个数字,每两层之间的黑线组成一个矩阵。
下面会同个一个比较详细的例子解释各个节点以及各条黑线之间的关系。
神经网络的原理
神经网络的原理其实很简单,就是反复进行这两个操作 前向传播→反向传播 ,下面详细说一下,如何前向传播和反向传播。
神经网络的前向传播
所谓神经网络的前向传播,其实是一系列计算公式而已,这里面有矩阵计算,也有数学计算。举个简单的栗子,你有三个这个的公式:
{ x = 1 x 1 = 2 x + 3 y = 2 x 1 2 \begin{cases} x = 1 \\ x_1 = 2x + 3 \\ y = 2x_1^2 \end{cases} ⎩⎪⎨⎪⎧x=1x1=2x+3y=2x12
如果我们输入 x = 1 x = 1 x=1 ,依次向前经过三个公式的运算,我们可以得到 y = 50 y=50 y=50 ;
如果我们输入 x = 2 x = 2 x=2 ,依次向前经过三个公式的运算,我们可以得到 y = 98 y=98 y=98 。
这个 y y y 就是 x x x 前向传播的结果,也就相当于神经网络的一次预测。我们根据 x x x 预测出了与 x x x 对应的 y y y 值。
下面进入正题,假设你的数据还是像上面那样,为了方便查看,我把它复制了下来:
1 | 2 | Y |
---|---|---|
0.2 | 0.1 | 1 |
0.5 | 0.8 | 0 |
0.1 | 0.2 | 1 |
为了方便,我把 V1,V2 改成了 1,2。
下面这张神经网络结构图,是一个最简单的结构图。它包含一个输入层,一个隐藏层(是的,一个,你没看错),一个输出层。
先解释图中字母的含义:
a,c 分别是输入层的两个节点,含义已经写在旁边。
d,e,f,g 是隐藏层的节点。注意都属于隐藏层,但是数据不一样,一个表示 z,一个表示 y,下面有提到他们之间的关系。
w ∗ w_{*} w∗ , b ∗ b_* b∗ 系列是指权重和偏置,他们分别代表一个数字,组合起来代表一个矩阵。比如: W 1 = [ w 13 w 23 w 14 w 24 ] = [ 1 2 4 2 ] W1 = \begin{bmatrix} w_{13} & w_{23} \\ w_{14} & w_{24} \end{bmatrix} = \begin{bmatrix} 1 & 2 \\ 4 & 2 \end{bmatrix} W1=[w13w14w23w24]=[1422] , W 2 = [ w 35 w 45 ] = [ 3 5 ] W2 = \begin{bmatrix} w_{35} \\ w_{45}\end{bmatrix} = \begin{bmatrix} 3 \\ 5\end{bmatrix} W2=[w35w45]=[35]
根据开始提的那个小栗子,那么在神经网络中的前向传播公式则是这样的:
{ X = [ a c ] z = W 1 ⋅ X T + b = [ w 13 w 23 w 14 w 24 ] ⋅ [ a c ] T + [ b 1 b 2 ] y = s i g m o i d ( z ) = 1 1 + e − z y ′ = W 2 ⋅ y + b = [ w 35 w 45 ] ⋅ [ y 1