激活函数与神经元
我们使用 sigmod() 函数,去实现这样的一个激活函数,
激活函数:在一层一层的神经网络中,我们把输入层的值,各自乘以其权重,而后加上偏置, s = f(W,x) + b ; 这样的一个 s 被称为神经节点。
激活函数,就是要判断这个神经节点是否被激活,
sigmod() 函数: 1/(1 + e^-s), 当神经节点 s 的值,超过一定限度时,决定是否激活此函数。
每个圆就是一个神经元,我们来考率每个神经元是否要激活。
通过激活函数,可以把一个线性的分类器产生一个非线性的输出。
####### Relu 激活函数: max(0,x) 也称修正单元激活函数。
上图中,因为每一层之间的神经元都是全部连接的,所以我们称其为 : 全连接神经网络 FC 或则 多层感知机 MLP
一般我们都会加 偏置 项,我们不希望其能够过 原点,我们不要想对其由这样的约束。
为什么要使用非线性的激活函数呢?
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
Sigmoid 和 tanh 都存在当输入 过大 或 过小 时,其函数的梯度趋近于 0 的问题,二者都可以通过缩放和平移来相互转换
ReLU : max(0,x) 此函数,在 小于 0 时,没有梯度,为了解决这个问题,又有了几种变体:
Leaky ReLU : max(0.1x, x) , ELU 等
隐藏层就是既不包括输入,也不包括输出的层,而是在 输入和输出层之间的隐层
算神经网络的层数时,我们其实是计算的权重的层数,神经元的层与层之间,包含一层权重,所以:神经网络的层数 == 隐藏层 +1
正是因为神经网络的非线性,才使得当神经网络层数足够多时,就能够捕捉到足够多的特征,一些深层的特征,底层的信息,算出更好的结果。 当然了,当神经网络的层数过多的时候,也容易出现过拟合,但是当输入的数据集足够大时,过拟合就会得到一定的消弭。
more neurons(n.神经元) = more capacity(n.能力,容量)
也可以通过使用其他的方式去消弭过拟合,比如说正则化。
反向传播
反向传播计算神经网络的梯度。
所以,使用 sigmoid 函数的好处就是:
Sigmoid 函数的导数 就是 (1 - Sigmoid) * Sigmoid
Backprop(反向传播) implementation(n.实现,履行) : “Flat” code
以此图为例:
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(结论)
- 从梯度下降的角度,去调整权重
- 神经网络呢,就是把原来的线性分类器,加一个非线性激活函数,而后将每一个神经元一层一层排列,所得 : 全连接神经网络 FC 或者说 多层感知机 MLP . 正是因为有了非线性的激活函数,才能给神经网络带来非线性, 否则无论多少层的神经网络,与 单层的神经网络都是没有区别的。
- 不同激活函数的区别
- 神经网络的层数越多,深度越多,模型能够提取到的特征的表示能力也会越强,当然也会造成过拟合。
- 神经网络的宽度与深度,数学已经证明,只要我们的神经网络足够宽,神经元足够多,我们是可以拟合任何的一个数学函数,即:理论上只要神经元个数足够多,我们就能解决所有的问题,但是这样是不经济的,使网络变得更深,就意味着进行了更多的非线性运算,越深则网络的神经元越多,所以其承载力越强(提取特征的表示能力越强)。
- 但是神经网络越深也容易导致过拟合,然后就可以用正则化等一系列方式处理。
- 神经网络的训练方法就是反向传播,我们通过构建计算图,使用链式法则,用层层剥离的方法,求得神经网络多每一个权重的偏导数。
使用链式法则,反向传播的方式,可以直接求出神经网络对于每个权重的偏导,这样的话,我们就可以不在求出整个,经过了多个神经元,多层激活函数 的 最终 数学表达式,然后在进行复杂的求偏导
雅克比矩阵:是一种稀疏的,仅可能在对角线有非零值的矩阵。
他是,输出向量的每一维,对输入向量的每一维的偏导数。
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.乘法,增加).
看一个例子吧,输入是一个绿色的矩阵,