神经网络是为了模拟人的大脑
神经网络起源于1943年,A Logical Calculus of Ideas Immanent in Nervous Activity , 使用一个间划过的计算模型来描述在动物的大脑中,神经元如何通过命题逻辑来实现复杂的计算
在80年代流行过一阵,但是到了90年代后期,由于各种原因,应用逐渐消失了
近几年,神经网络又火了起来
最初消失的原因是资金的转移,因为与真正智能的机器对话这一任务在很长一段时间内都不会实现,80年代流行的是因为新网络架构的发明和更好的培训技术。
但是到了90年代,更强大的机器学习技术,比如支持向量机出现,ANN又沉寂了
但是现在ANN又火的原因(1)海量数据(2)游戏产业提供的强大GPU(3)算法的提升 (4)超大ANN的构建
生物神经元:由包含细胞核和大部分细胞复合成分的细胞体组成。有许多分枝延伸的部分称为树突,一个非常长的延伸称为轴突。轴突的长度肯呢个比细胞体长几倍,或者长达几万倍,在其极端附近,轴突分裂成许多被称为终树突的分支,在这些分支的尖端是称为突触终端的微小结构,它会连接到其他神经元的树突(或者直接连接到细胞体)。生物神经元通过这些突触接受从其他细胞发来的很短的电脉冲,这种脉冲被称为信号。当一个神经元在一定的时间内收到足够多的信号,就会发出它自己的信号
一只猫大约有10亿个神经元,一只老鼠大约有7500万个神经元,一只蟑螂大约有100万个神经元。相比之下,许多人工神经网络包含的神经元要少得多,通常只有几百个,所以我们在不久的将来随时创建一个人工大脑是没有危险的
Relu:Rectified Linear Unit (修正线性单元)
在神经网络中,线性整流作为神经元的激活函数,定义了该神经元在线性变换WtX + b之后的非线性输出结果。换言之,对于进入神经元的来自上一层神经网络的输入向量 ,使用线性整流激活函数的神经元会输出 max(0,WtX + b) 至下一层神经元或作为整个神经网络的输出(取决现神经元在网络结构中所处位置)。
**
隐藏层的意义就是把输入数据的特征,抽象到另一个维度空间,来展现其更抽象化的特征,这些特征能更好的进行线性划分**
线性阈值单元LTU
逻辑回归:
线性阈值单元LTU(使用阶跃函数代替sigmod函数):
感知器就是单个LTU
常用的阶跃函数:Heaviside,sgn
用符号标识神经网络
分为输入层, 隐藏层, 输出层,在训练集中,这些中间节点的真正数值,是我们不知道的,同时在计算层数过程中,输入层是不计算在内的或者称为第0层。
符号标识:
a【0】表示第0层,a【1】表示第一层,a1[1]表示第一层中第一个神经元。
一个神经元的数字表示:
一层神经网络的数字表示:
整个神经网络都在做什么?
输入:(3, 1)
第一层:WT * X : (4,3)(3,1) = (4,1) sigmoid = (4,1)
第二层:WT * X:(1,4)(4,1) = (1,1) sigmoid = (1,1)
给定了输入值x,计算顺序如下:
W矩阵的形状(本层的神经元数量,上一层的输入值数量)
激活函数的作用: 1.非线性变化 2.梯度下降
在神经网络的发展中,把激活函数从阶跃函数改成逻辑函数是一大进步,目的就是为了实现梯度下降,但是,仍然有很多别的激活函数可供使用
为什么需要非线性激活函数?
如果你使用线性激活函数,或者没有激活函数,那么无论你的神经网络有多少层,
你一直在做的只是计算线性激活函数(两个线性组合的本身就是线性组合),
所以隐藏层就没有用了
Heaviside(Step)阶跃函数
tanh函数
RELU函数
注意:
tanh函数:
Relu函数和leaky relu函数:
如何训练神经网络呢?
这时,我们引出一个概念叫做反向传播,用这个方法来训练神经网络。
反向传播的理解: 对于每一个训练实例,算法将其发送到网络中并计算每个连续层中的每个神经元的输出(这是正向过程,与做预测的过程一样)。然后它会度量网络的输出误差(对比期望值和实际的网络输出)。
然后,它会计算最后一个隐藏层中的每个神经元对输出神经元的误差的贡献度。
之后,他继续训练这些误差贡献中有多少来自前一个隐藏层中的每一个神经元,这个过程一直持续到输入层(也就是第一层)。
这个反向传递过程通过在网络中向后传播误差梯度有效的测量网络中所有连接权重的误差梯度(这也是它名字的来源)
求导数的意义就在于:当我们发现J变化了一定值后,可以通过导数得知变化的值是从哪个变量里来的。
神经网络的梯度下降:
参数:(w[1],b[1],w[2],b[2])
损失函数:
梯度下降:重复执行
神经网络的传播过程:
正向传播:
反向传播:
神经网络的传播过程的公式推导:
逻辑回归的步骤:
神经网络的传播过程的公式推导:
神经网络:
正向传播:利用输入值算出预测值
对神经网络逐层进行计算
步骤:
(1)对神经网络第一层计算
1. 对第一层第一个神经元计算
1)应用线性函数计算
2)应用非线性函数计算(激活函数:Sigmod,Tanh,Relu,Leaky Relu)
2. 对第一层第二个神经元计算…
3…
(2) 对神经网络第二层计算…
反向传播:通过损失函数(真实值-预测值),应用梯度下降,来计算出当w[1],b[1],w[2],b[2]为何值时,损失函数值最小
导数的意义:通过导数,我们能知道损失函数的损失值的来源;
反向传播的核心:通过导数,得到损失函数的来源,然后减少/增大来源,来调式w,b
步骤:
(1)对最后一层求导
1.我们已知的,不用求的有损失函数;所以我能要拿损失函数进行求导
2.dL/da, a = sigmod(z)
3.dL/dz = dL/da * da/dz
4.dL/dw = dL/da * da/dz * dz/dw; dL/db = dL/da * da/dz * dz/db
(2)对倒数第二层求导
1. dL/w[1] = dL/dz[2] * dz[2]/da[1] * da[1]/dz[1] * dz[1]/dw[1]
2. dL/b[1] = dL/dz[2] * dz[2]/da[1] * da[1]/dz[1] * dz[1]/db[1]
(3)…直到第一层