|
一、神经元
神经元是神经网络中的基本单元。
每一个神经元包括两个参数:权重系数\bar{w}=[w_{1},w_{2}……w_{n}] 和偏置系数b。神经网络的学习过程就是通过优化更新每一个神经元的权重和偏置系数,使得输出值Y更接近其真实值。
假设神经元的输入向量为 \bar{X}=[x1,x2] ,那么输出 Y=f(w1*x1+w2*x2+b) ,其中 f 是该神经元选定的激活函数。

图1:神经元图示
二、激活函数
1、为什么使用激活函数?
由图一可知,没有激活函数的神经元只是一个 wx+b 的线性回归模型,只能拟合线性平面
激活函数为其增加了非线性特征的学习能力。
2、常用的激活函数

激活函数
三、一个简单的单层神经网络
考虑一个简单的例子,输入x是一维数据,通过一个包含 [h_1,h_2,h_3] 三个神经元的单层神经网络,得到输出值y。

单层神经网络
激活函数a使用ReLU函数,令 [h_1,h_2,h_3]的权重系数分别为 [\theta_{11},\theta_{21},\theta_{31}] ,偏置系数分别为 [\theta_{10},\theta_{20},\theta_{30}] , [\phi_{1},\phi_{2},\phi_{3}] 表示三个神经元的权重, \phi_0 表示偏置。(下图中的引入了包含1的额外节点【橙色圆圈】,以表示偏置系数)。

因此,该神经网络的计算过程表示如下:

其中,a是激活函数,本例中采用ReLU函数。输出值y可表示为:


计算过程图示。j图代表了神经网络输出值y与输入值x的对应函数关系
本例中总共使用到了十个参数: \Phi=[\theta_{10},\theta_{20},\theta_{30}\theta_{11},\theta_{21},\theta_{31},\phi_0,\phi_{1},\phi_{2},\phi_{3}] ,假如我们知道这些参数,那就能通过给定的任意输入x来预测y。

因此,给定一个训练数据集 [x_i,y_i]_{i=1}^n ,我们可以定义一个最小二乘损失函数 L(\Phi) ,并使用它来衡量模型对任何给定参数值的该数据集描述的有效性。训练模型的过程就是搜索使损失函数L最小化的参数集合 \Phi_{min} .
简单例子的扩展
(1)扩展到多元输出网络
考虑一个标量输入 [x] 和两个输出 [y_1,y_2] 的具有四个隐藏单元的神经网络,分别计算 y_1 和 y_2 关于输入 x 的函数关系:


(2)扩展到多维输入
考虑二维输入变量 x=[x_1,x_2]^T

三个隐藏单元的公式如下:

输出y定义为:
y=\phi_0+\phi_1h_1+\phi_2h_2+\phi_3h_3
计算过程可视化:

在(a-c)图中,亮度表示θ_10+θ_11x_1+θ_12x_2。细线就是轮廓。(d–f)图表示每个平面被ReLU激活函数剪裁之后,负值都变为零。(g-i)图是对剪裁后的平面进行加权,(j)图将其与确定曲面总高度的偏移相加。其结果是由凸的分段线性多边形区域组成的连续曲面。
三、神经网络层及前向传播
神经网络中的网络层就是由多个神经元组合在一起的。通常我们将第0层称为输入层,最后一层称为输出层,其他称为隐藏层。

神经网络各层之间的数据是如何传递的呢?简单理解就是将上一层的每一个神经元的输出作为下一层的输入,传递给下一层的每一个神经元。不断传递直到输出层为止。这就是神经网络的前向传播。(下图中仅画出每层第一个神经元)

神经网络中的参数前向传播
前向传播的代码实现:
class HiddenLay:
def __init__(self, ):
self.w=w
self.b=b
def activate(self, s):#激活函数定义为sigmoid
return 1 / (1 + np.exp(-s))
def forward(self, X): #X是输入向量
z = X*self.w + self.b
a = self.activate(self.z)
return a
未完待续…… |
|