lab
Neural Network
简体中文

什么是神经网络

概述

简而言之,神经网络就是函数:输入数据,输出结果。

函数

我们以MNIST 手写数字图像识别为例,来定义一下对应的函数形式:

  • 任务类型:图像分类
  • 输入:一张图像包含 28 x 28=784 个像素,每个像素用一个实数表示
  • 输出:0-9
  • 任务描述:从图像中识别出唯一的数字
  • 函数定义
y=f(x1,x2,...,x784)xiR,i=1,...,784y{0,1,...,9}\begin{aligned} y &= f(x_1, x_2, ..., x_{784}) \\ &x_i \in \mathbb R, i = 1, ..., 784 \\ &y \in \{0, 1, ..., 9\} \end{aligned}

这是神经网络的一个入门级应用,输入是一张低分辨率(28 x 28)的黑白图片,对应的是一个拥有 784 个输入变量的函数。如果是一张百万像素的彩色图片,对应的输入变量就会达到 300 万个。


由此可见,用神经网络解决的都是一些复杂的问题,对应的也是复杂的函数。实现算法就是要构造对应的函数。


如此复杂的函数如何构造呢?我们可以从简单的函数开始,最简单且最成功的的例子就是数字电路。

数字电路

数字电路是计算机的基石,构建了我们庞大的数字世界。但是其核心却是由与、或、非逻辑门所构成。


什么是逻辑门?其实就是函数。而且都是最简单的函数。

逻辑门表达式函数形式
与门 ANDxyx \land yz=(x,y)z = \land(x, y)
或门 ORxyx \lor yz=(x,y)z = \lor(x, y)
非门 NOT¬x\lnot xy=¬(x)y = \lnot(x)
  • 变量类型:都是布尔变量,只有 2 个值:{T,F}\{T, F\},远比自然数(N\mathbb N)、实数(R\mathbb R)简单。
  • 变量数:一元或二元函数,也是最简单的函数形式
  • 函数表示:使用真值表进行描述。为什么不用图像呢?因为是离散函数,在图像上是一些孤立的点,不太好看。

非门NOT

xx¬x\lnot x
TTFF
FFTT

非门图像(用 0 代表FF,用1代表TT

与门AND、或门OR

xxyyxyx \land yxyx \lor y
TTTTTTTT
TTFFFFTT
FFTTFFTT
FFFFFFFF
与门图像
或门图像

组合逻辑门

将简单的逻辑门进行组合,可以获得更强大的函数。


构造新的二元函数:

  • 异或: xy=(x¬y)(¬xy)x \oplus y = (x \land \lnot y) \lor (\lnot x \land y)
  • 同或: xy=(xy)(¬x¬y)x \odot y = (x \land y) \lor (\lnot x \land \lnot y)

构造多元函数:

  • 3 位与: f(x,y,z)=xyzf(x, y, z) = x \land y \land z
  • 8 位加法器: f(x1,...,x8,y1,...,y8)f(x_1, ..., x_8, y_1, ..., y_8)
    • 它是一个包含 16 个布尔变量的 16 元函数
  • 32 位加法器: f(x1,...,x32,y1,...,y32)f(x*1, ..., x*{32}, y*1, ..., y*{32})
    • 它是一个包含 64 个布尔变量的 64 元函数
    • 也可以看做是 32 位整形的 2 元函数: f(x,y)x,yInt32f(x, y) \quad x, y \in \text{Int32}

总结

通过对简单逻辑门函数的复合,可以构造新的逻辑函数。包括 32 位整数的加减乘除等操作,32 位单精度浮点型的操作等。

编程语言

再来看编程语言。以 Python 为例,看看 Python 中的元素。

操作符

名称符号函数
逻辑操作符and or not二元、一元逻辑函数
算术操作符+, -, *, /, %, **, //二元函数
比较操作符==, !=, >, <, >=, <=二元函数
...

以浮点数加法操作符(+)为例,其函数图像如下:

f(x,y)=x+yf(x, y) = x + y

函数

在 Python 可以自行定义函数:

def f(x, y): return max(0, 2*x + 3*y - 3)

这里定义了一个新的函数,它使用"+,-,*,max"等函数,构造出了新的函数,构造的方式也是通过函数的复合

总结

编程语言中到处都是函数。通过对基础函数的复合,可以构造出新的函数,得到新的算法。

神经网络

神经网络也是函数。像数字电路和编程语言中一样,它也是由简单的函数复合而成。数字电路的基本单位是与、或、非门等逻辑函数,编程语言中的基本单位是各种操作符等函数,而神经网络的基本单位则是神经元。

神经元

那什么是神经元呢?生物神经元是一个细胞,有输入的树突,有输出的轴突。而神经网络上的神经元是人工神经元,它也是一个函数,更准确地说,它是一类函数。


神经元的输入数量是可以变化的,也就是说它代表的是一个nn元函数f(x1,...,xn)f(x_1, ..., x_n),而不同神经元的nn是可以不同的。

神经网络

神经元之间相互组合,就构成了神经网络。如下图所示:

该神经网络包含三个神经元(不计算输入神经元):

  • f1(x1,...,xn)f_1(x_1, ..., x_n)
  • f2(x1,...,xn)f_2(x_1, ..., x_n)
  • f3(x1,x2)f_3(x_1, x_2)

神经网络所代表的函数为:

f(x1,...,xn)=f3(f1(x1,...,xn),f2(x1,...,xn))f(x_1, ..., x_n) = f_3(f_1(x_1, ..., x_n), f_2(x_1, ..., x_n))

总结

  1. 数字电路(硬件)的核心是函数,其基础函数是与或非逻辑门函数;
  2. 编程语言(软件)的核心是函数,其基础函数是各种操作符函数和编程语言中内置的函数(由硬件提供或复合而成);
  3. 神经网络的核心也是函数,其基础函数是神经元函数;
  4. 通过对简单函数的复合可以构造新的函数,神经网络就是由神经元函数通过函数的复合操作构造出来的函数。

问题

神经元所代表的函数到底是什么?

只知道是个nn元函数可不够,数字电路中的基本单元与、或、非门可都是列出了真值表,画出了图像的,而神经元呢?