神经网络的组成
对感知机的回顾
神经网络由输入层、输出层和夹在中间的中间层(也称隐藏层)构成。隐藏层的神经元肉眼看不见。
针对之前的感知机,将其公式简化为:
f ( x ) = sign ( w ⋅ x + b ) f(x) = \text{sign}(\mathbf{w} \cdot \mathbf{x} + b) f(x)=sign(w⋅x+b)
其中:
- w \mathbf{w} w 是权重向量。
- x \mathbf{x} x 是输入特征向量。
- b b b 是偏置项,用于控制神经元被激活的容易程度,例如设置的特别高,即使神经信号微弱、权重低、也可以激活。
-
sign
(
⋅
)
\text{sign}(\cdot)
sign(⋅) 是符号函数,定义为:
sign ( z ) = { 1 , z ≥ 0 − 1 , z < 0 \text{sign}(z) = \begin{cases} 1, & z \geq 0 \\ -1, & z < 0 \end{cases} sign(z)={1,−1,z≥0z<0
感知机的目标是通过调整 w \mathbf{w} w 和 b b b,使得对输入 x \mathbf{x} x 的分类结果 f ( x ) f(x) f(x) 尽可能正确。
激活函数!
所谓激活函数,其核心作用是决定神经元如何根据输入信号的加权总和(即
a
=
w
⋅
x
+
b
a = \mathbf{w} \cdot \mathbf{x} + b
a=w⋅x+b)来产生输出。换句话说,激活函数定义了神经元的“激发”规则,决定了神经网络对输入信号的非线性响应方式。对于前文公式中的部分,进行拆分,其中先计算信号和偏置之和a,再进行转换得到y。
a和y称为节点,也就是神经元。激活函数是连接感知机和神经网络的桥梁。
以阈值为界来切换输出,这样的函数称为阶跃函数。感知机使用了阶跃函数,而对于神经网络,可以使用其他函数。
###sigmoid函数
在神经网络中,sigmoid函数是一种常用的激活函数。它的数学定义为:
σ
(
z
)
=
1
1
+
e
−
x
\sigma(z) = \frac{1}{1 + e^{-x}}
σ(z)=1+e−x1
其中
e
−
x
e^{-x}
e−x一般写为
e
x
p
(
−
x
)
exp(-x)
exp(−x)函数。
sigmoid函数的输出范围是 (0, 1),并且具有平滑的、S形的曲线特性。这使得它非常适合用于将加权输入信号
a
=
w
⋅
x
+
b
a = \mathbf{w} \cdot \mathbf{x} + b
a=w⋅x+b 转换为一个介于 0 和 1 之间的值。
用该函数进行信号转换,转换后的信号被传递给下一个神经元。
除此之外,还要和阶跃函数比较。阶跃函数的输出值呈阶梯变化,有“一步登天”的形状特点。sigmoid函数具有平滑性,而相比之下阶跃函数没有。
非线性函数
无论是阶跃函数还是sigmoid函数,它们都是非线性函数。神经网络的激活函数必须使用非线性函数,即不能使用线性函数。
线性函数的问题:不管如何加深层数,总存在与之等效的“无隐藏层的神经网络”
简而言之,一旦使用线性函数,不管套几层函数、或者再复杂。运算都可以等价于其他单一线性函数(即没有隐藏层的神经网络),这样就失去了多层网络的意义和优势。
ReLU函数
ReLU函数是一种常用的激活函数,其数学定义为:
f
(
x
)
=
max
(
0
,
x
)
f(x) = \max(0, x)
f(x)=max(0,x)
这意味着,在输入大于0时,直接输出该值;在输入小于或等于0时,输出0。
##多维数组的运算
这属于线性代数的知识点,即每行乘每列,并且要对应才能乘的运算规则。
###神经网络的内积
在实现前,确认维度对应很重要。特别是X和W。
3层神经网络的实现
神经网络的运算可以作为矩阵运算打包进行,因为神经网络各层的运算是通过矩阵的乘法运算打包进行的。
之前的公式,如果使用矩阵表示,则为
A
=
X
W
+
B
A = XW+B
A=XW+B。
从神经网络的计算过程不难看出,其中存在着明显的递进关系。这种递进关系主要体现在信息从输入层到输出层的逐层传递和转换过程中。
具体来说,当输入数据进入神经网络时,首先会经过输入层的处理,然后通过加权求和和激活函数的非线性变换,将信息传递到第一个隐藏层。在隐藏层中,神经元会对接收到的信息进行进一步的处理和特征提取,这个过程会重复进行,直到信息传递到最后一个隐藏层,直至输出层。
这个过程称为前向处理,即输入到输出的方向。