003_神经网络与反向传播

激活函数与神经元

我们使用 sigmod() 函数,去实现这样的一个激活函数,
003_神经网络与反向传播_第1张图片
激活函数:在一层一层的神经网络中,我们把输入层的值,各自乘以其权重,而后加上偏置, s = f(W,x) + b ; 这样的一个 s 被称为神经节点。
激活函数,就是要判断这个神经节点是否被激活,
sigmod() 函数: 1/(1 + e^-s), 当神经节点 s 的值,超过一定限度时,决定是否激活此函数。

每个圆就是一个神经元,我们来考率每个神经元是否要激活。
通过激活函数,可以把一个线性的分类器产生一个非线性的输出。
####### Relu 激活函数: max(0,x) 也称修正单元激活函数。

上图中,因为每一层之间的神经元都是全部连接的,所以我们称其为 : 全连接神经网络 FC 或则 多层感知机 MLP
一般我们都会加 偏置 项,我们不希望其能够过 原点,我们不要想对其由这样的约束。
003_神经网络与反向传播_第2张图片

为什么要使用非线性的激活函数呢?


Neural networks : without the brain stuff(n.东西,材料 v.塞满,填塞).
(Before) Linear score function : f = Wx
(Now) 2-lay Neural Network : f = W2 max(0,W1*x)
The function max(0,z) is called the activation(n.激活,活化作用) function.

Q : Waht if we try to build a neural network without one?
f = W2 * W1 * x ; W3 = W2W1 ; f = W3 * x ;
A : We end up with a linear classifier again!
非线性的激活函数,将为 神经网络带来非线性,否则,无论堆叠多少层的神经元,最终结果都可以化简为 单层的神经元,没有意义了。

激活函数 Activation functios

003_神经网络与反向传播_第3张图片

Sigmoid 和 tanh 都存在当输入 过大 或 过小 时,其函数的梯度趋近于 0 的问题,二者都可以通过缩放和平移来相互转换

ReLU : max(0,x) 此函数,在 小于 0 时,没有梯度,为了解决这个问题,又有了几种变体:
Leaky ReLU : max(0.1x, x) , ELU 等


隐藏层就是既不包括输入,也不包括输出的层,而是在 输入和输出层之间的隐层
算神经网络的层数时,我们其实是计算的权重的层数,神经元的层与层之间,包含一层权重,所以:神经网络的层数 == 隐藏层 +1

003_神经网络与反向传播_第4张图片
正是因为神经网络的非线性,才使得当神经网络层数足够多时,就能够捕捉到足够多的特征,一些深层的特征,底层的信息,算出更好的结果。 当然了,当神经网络的层数过多的时候,也容易出现过拟合,但是当输入的数据集足够大时,过拟合就会得到一定的消弭。
more neurons(n.神经元) = more capacity(n.能力,容量)
也可以通过使用其他的方式去消弭过拟合,比如说正则化。
003_神经网络与反向传播_第5张图片

反向传播

反向传播计算神经网络的梯度。
003_神经网络与反向传播_第6张图片
003_神经网络与反向传播_第7张图片

所以,使用 sigmoid 函数的好处就是:
kstwktxs.png
Sigmoid 函数的导数 就是 (1 - Sigmoid) * Sigmoid
003_神经网络与反向传播_第8张图片

Backprop(反向传播) implementation(n.实现,履行) : “Flat” code
003_神经网络与反向传播_第9张图片
以此图为例:
Forwaid pass : Compute(计算) output

def f(w0,x0,w1,x1,w2):
  s0 = w0 * x0
  s1 = w1 * x1
  s2 = s0 + s1
  s3 = s2 + w2
  L = Sigmoid(s3)

Backward pass : Compute grads

grad_L = 1.0   # 输出直接就是 Sigmoid 的值
grad_s3 = grad_L * (1-L)*L      # Sigmoid 函数的导数
grad_w2 = grad_s3       # 加法  \
grad_s2 = grad_s3       # 平分梯度
grad_s0 = grad_s2       # 加法  \
grad_s1 = grad_s2       # 平分梯度
grad_w1 = grad_s1 * x1  # 乘法  \
grad_x1 = grad_s1 * w1  # 交换梯度
grad_w0 = grad_s0 * x0  # 乘法  \
grad_x0 = hrad_s0 * w0  # 交换梯度

conclusion(结论)

  1. 从梯度下降的角度,去调整权重
  2. 神经网络呢,就是把原来的线性分类器,加一个非线性激活函数,而后将每一个神经元一层一层排列,所得 : 全连接神经网络 FC 或者说 多层感知机 MLP . 正是因为有了非线性的激活函数,才能给神经网络带来非线性, 否则无论多少层的神经网络,与 单层的神经网络都是没有区别的。
  3. 不同激活函数的区别
  4. 神经网络的层数越多,深度越多,模型能够提取到的特征的表示能力也会越强,当然也会造成过拟合。
  5. 神经网络的宽度与深度,数学已经证明,只要我们的神经网络足够宽,神经元足够多,我们是可以拟合任何的一个数学函数,即:理论上只要神经元个数足够多,我们就能解决所有的问题,但是这样是不经济的,使网络变得更深,就意味着进行了更多的非线性运算,越深则网络的神经元越多,所以其承载力越强(提取特征的表示能力越强)。
  6. 但是神经网络越深也容易导致过拟合,然后就可以用正则化等一系列方式处理。
  7. 神经网络的训练方法就是反向传播,我们通过构建计算图,使用链式法则,用层层剥离的方法,求得神经网络多每一个权重的偏导数。
    使用链式法则,反向传播的方式,可以直接求出神经网络对于每个权重的偏导,这样的话,我们就可以不在求出整个,经过了多个神经元,多层激活函数 的 最终 数学表达式,然后在进行复杂的求偏导
雅克比矩阵:是一种稀疏的,仅可能在对角线有非零值的矩阵。

他是,输出向量的每一维,对输入向量的每一维的偏导数。

003_神经网络与反向传播_第10张图片
Jacobian is sparse(adj.稀疏的稀少的) : off-diagonal(adj.斜的,对角线,n.对角线,斜线) entries(n.进入,条目,合起来就是对角线元素,off-diagonal entries 非对角线元素) always zero!
Never explicitly(adv.明确地,明白地) form Jacobian – instead(adv.代替,反而,相反) use implicit(adj.含蓄的,暗示的,盲从的) multiplication(n.乘法,增加).

003_神经网络与反向传播_第11张图片
看一个例子吧,输入是一个绿色的矩阵,

你可能感兴趣的:(深度学习,python,arduino,sklearn)